<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="sv">
	<id>http://wiki.sikvall.se/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Anders</id>
	<title>Täpp-Anders - Användarbidrag [sv]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.sikvall.se/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Anders"/>
	<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php/Special:Bidrag/Anders"/>
	<updated>2026-05-15T08:36:21Z</updated>
	<subtitle>Användarbidrag</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Svensk_stilmall&amp;diff=1894</id>
		<title>Svensk stilmall</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Svensk_stilmall&amp;diff=1894"/>
		<updated>2026-05-12T09:01:36Z</updated>

		<summary type="html">&lt;p&gt;Anders: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% ichiswedish.sty    version 1.2   date 09-JUL-2000                    %&lt;br /&gt;
%                                                                      %&lt;br /&gt;
% This style is to typeset Swedish documents in LaTeX. It is designed  %&lt;br /&gt;
% with and works well in the MikTeX environment, however it should not %&lt;br /&gt;
% be difficult to get it working well in other environments either.    %&lt;br /&gt;
%                                                                      %&lt;br /&gt;
% Any suggestions you might have on this are welcome, plese send them  %&lt;br /&gt;
% to the following email address &amp;lt;anders@sikvall.se&amp;gt; and I will        %&lt;br /&gt;
% consider incorporating them to the next release                      %&lt;br /&gt;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% Packages that we want to be loaded ALL THE TIME %&lt;br /&gt;
% when typesetting swedish text.                  %&lt;br /&gt;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
&lt;br /&gt;
% Swedish typography&lt;br /&gt;
\usepackage[swedish]{babel}&lt;br /&gt;
&lt;br /&gt;
% Input encodings, make it easier to encode special latin &lt;br /&gt;
% characters like  å ä ö Å Ä Ö by typing them instead of&lt;br /&gt;
% using {\&amp;quot;a} for ä &amp;amp;c.&lt;br /&gt;
\usepackage[ansinew]{inputenc}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% Settings specially for swedish %&lt;br /&gt;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
&lt;br /&gt;
% Decimal comma&lt;br /&gt;
\mathchardef\CommaOrdinary=&amp;quot;013B&lt;br /&gt;
\mathchardef\CommaPunct   =&amp;quot;613B&lt;br /&gt;
\mathcode`,=&amp;quot;8000&lt;br /&gt;
{\catcode`\,=\active&lt;br /&gt;
\gdef ,{\obeyspaces\futurelet\next\CommaCheck}}&lt;br /&gt;
\def\CommaCheck{\if\space\next\CommaPunct\else\CommaOrdinary\fi}&lt;br /&gt;
&lt;br /&gt;
% Get rid of the spacing used in english typesetting&lt;br /&gt;
\frenchspacing&lt;br /&gt;
&lt;br /&gt;
% Paragraph indentation style&lt;br /&gt;
\setlength{\parindent}{1em}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
% Common abbreviations in Swedish %&lt;br /&gt;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
&lt;br /&gt;
\usepackage{xspace}&lt;br /&gt;
\newcommand{\bla}{bl.\hspace{0.1em}a.\xspace}&lt;br /&gt;
\newcommand{\ca}{ca\xspace}&lt;br /&gt;
\newcommand{\dvs}{dvs.\xspace}&lt;br /&gt;
\newcommand{\etc}{etc.\xspace}&lt;br /&gt;
\newcommand{\kl}{kl.\xspace}&lt;br /&gt;
\newcommand{\mfl}{m.\hspace{0.1em}fl.\xspace}&lt;br /&gt;
\newcommand{\mm}{m.\hspace{0.1em}m.\xspace}&lt;br /&gt;
\newcommand{\obs}{obs.\xspace}&lt;br /&gt;
\newcommand{\osv}{osv.\xspace}&lt;br /&gt;
\newcommand{\pga}{p.\hspace{0.1em}g.\hspace{0.1em}a.\xspace}&lt;br /&gt;
\newcommand{\sk}{s.\hspace{0.1em}k.\xspace}&lt;br /&gt;
\newcommand{\tillex}{t.\hspace{0.1em}ex.\xspace}&lt;br /&gt;
&lt;br /&gt;
% END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[category:LaTeX]]&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Brevmall&amp;diff=1893</id>
		<title>Brevmall</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Brevmall&amp;diff=1893"/>
		<updated>2026-05-12T08:59:48Z</updated>

		<summary type="html">&lt;p&gt;Anders: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:LaTeX]]&lt;br /&gt;
Detta är min standard brevmall som jag använder tillsammans med [[Svensk stilmall]] när jag skriver brev i LaTeX.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
%% Letter Template for LaTeX&lt;br /&gt;
%%&lt;br /&gt;
%% Anders Sikvall&lt;br /&gt;
%% (C)2003 - Free for Personal use&lt;br /&gt;
%%&lt;br /&gt;
%% Improvmenets welcome, email to anders@sikvall.se please.&lt;br /&gt;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&lt;br /&gt;
&lt;br /&gt;
\documentclass[a4paper, 12pt, oneside]{letter}&lt;br /&gt;
\usepackage{a4}&lt;br /&gt;
\usepackage[ansinew]{inputenc}&lt;br /&gt;
\usepackage[T1]{fontenc}&lt;br /&gt;
\usepackage[swedish]{babel}&lt;br /&gt;
%\usepackage{palatino}&lt;br /&gt;
%\usepackage{bookman}&lt;br /&gt;
%\usepackage{utopia}&lt;br /&gt;
\usepackage{times}&lt;br /&gt;
%\usepackage{newcent}&lt;br /&gt;
%\usepackage{charter}&lt;br /&gt;
%\usepackage{avant}&lt;br /&gt;
%\usepackage{chancery}&lt;br /&gt;
%\usepackage{euler}&lt;br /&gt;
\name{YOUR NAME}&lt;br /&gt;
\signature{YOUR NAME/SIGNATURE}&lt;br /&gt;
\address{YOUR NAME AND ADDRESS}&lt;br /&gt;
&lt;br /&gt;
\begin{document}&lt;br /&gt;
&lt;br /&gt;
\begin{letter}{TO WHOM}&lt;br /&gt;
%% \begin{raggedright}&lt;br /&gt;
\opening{\underline{\textbf{START OF LETTER}}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
\closing{YOUR NAME}&lt;br /&gt;
&lt;br /&gt;
% If you want to enclose other documents, specify them here.&lt;br /&gt;
%% \encl{Bilaga 1}&lt;br /&gt;
&lt;br /&gt;
\end{letter}&lt;br /&gt;
\end{document}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=IP3&amp;diff=1892</id>
		<title>IP3</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=IP3&amp;diff=1892"/>
		<updated>2026-05-12T08:20:52Z</updated>

		<summary type="html">&lt;p&gt;Anders: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Tredje ordningens skärningspunkt =&lt;br /&gt;
&lt;br /&gt;
Kan definieras antingen som en harmonisk produkt till en enkel ton, eller som de två IM3-produkter som uppträder vid två stycken signaler genom en icke-linjär krets. När man ökar nyttosignalens storlek växer IM3 med 3 dB per dB nyttosignalerna ökas. Därför uppstår en skärningspunkt så småningom och det är denna som definieras som IP3 (intercept point 3rd order).&lt;br /&gt;
&lt;br /&gt;
Med alla enheter i dB får vi följande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \text{OIP}_3 = P + \Delta \text{IM}_3 / 2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Där &amp;lt;math&amp;gt;\Delta \text{IM}_3&amp;lt;/math&amp;gt; är hyr mycket högre nyttosignalen är från den högsta intermodulationsprodukten. Dvs om du har en nyttosignal på 30 dBm vilket ger en IM3 produkt på -36 dBm blir formeln&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;   \text{OIP}_3 = 30 \text{ dBm} + 66 \text{ dBc} / 2 = 63 \text{ dBm}   &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Tredje ordningens IM-produkter =&lt;br /&gt;
&lt;br /&gt;
Formlerna ger de frekvenser som IM3 uppstår vid om man sänder 2 st signaler med frekvenserna f1 och f2 genom en ickelinjär krets:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\text{IP}_{3:1} = 2f_1-f_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\text{IP}_{3:2}=2f_2-f_1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category:Radio]]&lt;br /&gt;
[[category:Fysik]]&lt;br /&gt;
[[Category:Formelsamling]]&lt;br /&gt;
[[category:IM3]]&lt;br /&gt;
[[category:IP3]]&lt;br /&gt;
[[category:Intermodulation]]&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=IP3&amp;diff=1891</id>
		<title>IP3</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=IP3&amp;diff=1891"/>
		<updated>2026-05-12T08:14:38Z</updated>

		<summary type="html">&lt;p&gt;Anders: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Tredje ordningens skärningspunkt =&lt;br /&gt;
&lt;br /&gt;
Kan definieras antingen som en harmonisk produkt till en enkel ton, eller som de två IM3-produkter som uppträder vid två stycken signaler genom en icke-linjär krets. När man ökar nyttosignalens storlek växer IM3 med 3 dB per dB nyttosignalerna ökas. Därför uppstår en skärningspunkt så småningom och det är denna som definieras som IP3 (intercept point 3rd order).&lt;br /&gt;
&lt;br /&gt;
Denna kan beräknas enligt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; OIP3 = P + IM_{3} / 2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Tredje ordningens IM-produkter =&lt;br /&gt;
&lt;br /&gt;
Formlerna ger de frekvenser som IM3 uppstår vid om man sänder 2 st signaler med frekvenserna f1 och f2 genom en ickelinjär krets:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\text{IP}_{3:1} = 2f_1-f_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\text{IP}_{3:2}=2f_2-f_1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category:Radio]]&lt;br /&gt;
[[category:Fysik]]&lt;br /&gt;
[[Category:Formelsamling]]&lt;br /&gt;
[[category:IM3]]&lt;br /&gt;
[[category:IP3]]&lt;br /&gt;
[[category:Intermodulation]]&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Okamura-Hata_formel_f%C3%B6r_urban_radioutbredning&amp;diff=1890</id>
		<title>Okamura-Hata formel för urban radioutbredning</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Okamura-Hata_formel_f%C3%B6r_urban_radioutbredning&amp;diff=1890"/>
		<updated>2026-05-12T08:08:38Z</updated>

		<summary type="html">&lt;p&gt;Anders: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bakgrund ==&lt;br /&gt;
&lt;br /&gt;
Utbredningsformeln för [[Friis formel för frirumsutbredning|frirumsutbredning]] fungerar inte särskilt bra i urbana miljöer och därför sökte herrarna Okamura och Hata efter en förbättrad variant. Efter många praktiska prov kom man fram till att man approximera utbredningen på större avstånd enligt följande formel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathrm{FSPL}=20\log_{10}{(f)} + (20+K)\log_{10}{(d)} + 32,45&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Där:&lt;br /&gt;
:&#039;&#039;f&#039;&#039; är frekvensen [MHz]&lt;br /&gt;
:&#039;&#039;d&#039;&#039; är avståndet mellan sändare och mottagare [km]&lt;br /&gt;
:&#039;&#039;K&#039;&#039; är den så kallade Okamura-Hata-konstanten&lt;br /&gt;
&lt;br /&gt;
Konstanten 32,45 kan härledas ur den klassiska formeln för [[Friis formel för frirumsutbredning|Free space path loss]] med enheterna i MHz och km i stället för exempelvis Hz och meter.&lt;br /&gt;
&lt;br /&gt;
Konstanten K antar olika värden beroende på terrängens beskaffenhet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;Värde för K&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;Terrängtyp&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;th&amp;gt;Anm.&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;10&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Lätt urban&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Villaområden, svagt kuperad terräng, inga större hinder&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;15&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Urban&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Stadskärnor med lite andel höghus, ibland större hinder&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;20&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Metropolis&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Tung urban miljö, företrädelsevis höghus, Manhattan, stora hinder&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;30&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Öken&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Mycket torra områden, stenöken&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category:Radio]]&lt;br /&gt;
[[category:Formelsamling]]&lt;br /&gt;
[[category:Trådlös kommunikation]]&lt;br /&gt;
[[category:Telekommunikation]]&lt;br /&gt;
[[category:Vågutbredning]]&lt;br /&gt;
[[category:Okamura-Hata]]&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=F%C3%A4ltstyrka&amp;diff=1889</id>
		<title>Fältstyrka</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=F%C3%A4ltstyrka&amp;diff=1889"/>
		<updated>2026-05-12T07:48:37Z</updated>

		<summary type="html">&lt;p&gt;Anders: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:formelsamling]]&lt;br /&gt;
[[category:fältstyrka]]&lt;br /&gt;
[[category:ellära]]&lt;br /&gt;
[[category:radio]]&lt;br /&gt;
[[category:radiolära]]&lt;br /&gt;
[[category:magnetism]]&lt;br /&gt;
[[category:elektricitet]]&lt;br /&gt;
[[category:Närfält]]&lt;br /&gt;
[[category:Fjärrfält]]&lt;br /&gt;
&lt;br /&gt;
= Bakgrund =&lt;br /&gt;
&lt;br /&gt;
Fältstyrkan av en radiosignal avtar linjärt med avståndet från en sändare. Denna kan räknas ut med en enkel formel som stämmer utmärkt i fjärrfältet från antennen. I närfältet är det mer komplicerat.&lt;br /&gt;
&lt;br /&gt;
== Fjärrfältsdefinition ==&lt;br /&gt;
&lt;br /&gt;
För fjärrfältet används vanligen följande approximation vid vilket avstånd från en antenn som vi kan säga iss vara i fjärrfältet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; r &amp;gt; \frac{2D^2}{\lambda}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Där D är antennens största utbredning i rummet i meter, för den dipol den totala längden, för en Yagi-Uda dess längsta axel, för en parabol omkretsen och &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; är våglängden i meter. &amp;lt;math&amp;gt;D^2&amp;lt;/math&amp;gt; är ett mått på antennens &amp;quot;antennarea&amp;quot; och säger något om fältbildning och utbredning i rummet.&lt;br /&gt;
&lt;br /&gt;
= Effekttäthet = &lt;br /&gt;
&lt;br /&gt;
Effekttätheten &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; i enenheten W/m² kan beräknas ur sambandet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S = \frac{P \cdot G}{2 \pi r^2}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Elektrisk fältstyrka =&lt;br /&gt;
&lt;br /&gt;
Den elektriska fältstyrkan uttrycks i regel som V/m eller i varianter därav. Vanliga varianter är t.ex. dBµV/m. Detta gäller i fjärrfältet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
E= \frac{ \sqrt{30 \cdot P \cdot G} } { r }&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Magnetisk fältstyrka = &lt;br /&gt;
&lt;br /&gt;
== Från elektriska fältet ==&lt;br /&gt;
&lt;br /&gt;
Om du redan beräknat den elektriska fältstyrkan kan den magnetiska beräknas så som:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H = \frac{E}{377} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Direkt från sändaren ==&lt;br /&gt;
&lt;br /&gt;
Annars från sändarens effekt P och antennens antennvinst G fås:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H = \frac{\sqrt{30 \cdot P \cdot G}}{377 \cdot r}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nära en elektrisk ledare ==&lt;br /&gt;
&lt;br /&gt;
Nära en elektrisk ledare, till exempel drivet element hos en antenn så beräknas först strömmen i ledaren och därefter fås magnetfältet med relationen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
H = \frac{I}{2 \pi r}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Storhetssamling = &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Storheter och enheter på denna sida&lt;br /&gt;
|-&lt;br /&gt;
! Storhet!! Beteckning!! Enhet&lt;br /&gt;
|-&lt;br /&gt;
| S || Effektdensitet|| W/m²&lt;br /&gt;
|-&lt;br /&gt;
| E || Elektrisk fältstyrka || V/m&lt;br /&gt;
|-&lt;br /&gt;
| H || Magnetisk fältstyrka || A/m&lt;br /&gt;
|-&lt;br /&gt;
| I || Elektrisk ström || A&lt;br /&gt;
|-&lt;br /&gt;
| P || Sändarens effekt || W&lt;br /&gt;
|-&lt;br /&gt;
| G || Antennens förstärkningsfaktor || (dimensionslös)&lt;br /&gt;
|-&lt;br /&gt;
| D || Antennarea || m²&lt;br /&gt;
|-&lt;br /&gt;
| r || Avstånd || m&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=F%C3%A4ltstyrka&amp;diff=1888</id>
		<title>Fältstyrka</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=F%C3%A4ltstyrka&amp;diff=1888"/>
		<updated>2026-05-12T07:47:51Z</updated>

		<summary type="html">&lt;p&gt;Anders: /* Storhetssamling */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:formelsamling]]&lt;br /&gt;
[[category:fältstyrka]]&lt;br /&gt;
[[category:ellära]]&lt;br /&gt;
[[category:radio]]&lt;br /&gt;
[[category:radiolära]]&lt;br /&gt;
[[category:magnetism]]&lt;br /&gt;
[[category:elektricitet]]&lt;br /&gt;
&lt;br /&gt;
= Bakgrund =&lt;br /&gt;
&lt;br /&gt;
Fältstyrkan av en radiosignal avtar linjärt med avståndet från en sändare. Denna kan räknas ut med en enkel formel som stämmer utmärkt i fjärrfältet från antennen. I närfältet är det mer komplicerat.&lt;br /&gt;
&lt;br /&gt;
== Fjärrfältsdefinition ==&lt;br /&gt;
&lt;br /&gt;
För fjärrfältet används vanligen följande approximation vid vilket avstånd från en antenn som vi kan säga iss vara i fjärrfältet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; r &amp;gt; \frac{2D^2}{\lambda}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Där D är antennens största utbredning i rummet i meter, för den dipol den totala längden, för en Yagi-Uda dess längsta axel, för en parabol omkretsen och &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; är våglängden i meter. &amp;lt;math&amp;gt;D^2&amp;lt;/math&amp;gt; är ett mått på antennens &amp;quot;antennarea&amp;quot; och säger något om fältbildning och utbredning i rummet.&lt;br /&gt;
&lt;br /&gt;
= Effekttäthet = &lt;br /&gt;
&lt;br /&gt;
Effekttätheten &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; i enenheten W/m² kan beräknas ur sambandet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S = \frac{P \cdot G}{2 \pi r^2}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Elektrisk fältstyrka =&lt;br /&gt;
&lt;br /&gt;
Den elektriska fältstyrkan uttrycks i regel som V/m eller i varianter därav. Vanliga varianter är t.ex. dBµV/m. Detta gäller i fjärrfältet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
E= \frac{ \sqrt{30 \cdot P \cdot G} } { r }&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Magnetisk fältstyrka = &lt;br /&gt;
&lt;br /&gt;
== Från elektriska fältet ==&lt;br /&gt;
&lt;br /&gt;
Om du redan beräknat den elektriska fältstyrkan kan den magnetiska beräknas så som:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H = \frac{E}{377} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Direkt från sändaren ==&lt;br /&gt;
&lt;br /&gt;
Annars från sändarens effekt P och antennens antennvinst G fås:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H = \frac{\sqrt{30 \cdot P \cdot G}}{377 \cdot r}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nära en elektrisk ledare ==&lt;br /&gt;
&lt;br /&gt;
Nära en elektrisk ledare, till exempel drivet element hos en antenn så beräknas först strömmen i ledaren och därefter fås magnetfältet med relationen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
H = \frac{I}{2 \pi r}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Storhetssamling = &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Storheter och enheter på denna sida&lt;br /&gt;
|-&lt;br /&gt;
! Storhet!! Beteckning!! Enhet&lt;br /&gt;
|-&lt;br /&gt;
| S || Effektdensitet|| W/m²&lt;br /&gt;
|-&lt;br /&gt;
| E || Elektrisk fältstyrka || V/m&lt;br /&gt;
|-&lt;br /&gt;
| H || Magnetisk fältstyrka || A/m&lt;br /&gt;
|-&lt;br /&gt;
| I || Elektrisk ström || A&lt;br /&gt;
|-&lt;br /&gt;
| P || Sändarens effekt || W&lt;br /&gt;
|-&lt;br /&gt;
| G || Antennens förstärkningsfaktor || (dimensionslös)&lt;br /&gt;
|-&lt;br /&gt;
| D || Antennarea || m²&lt;br /&gt;
|-&lt;br /&gt;
| r || Avstånd || m&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=F%C3%A4ltstyrka&amp;diff=1887</id>
		<title>Fältstyrka</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=F%C3%A4ltstyrka&amp;diff=1887"/>
		<updated>2026-05-12T07:47:23Z</updated>

		<summary type="html">&lt;p&gt;Anders: /* Direkt från sändaren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:formelsamling]]&lt;br /&gt;
[[category:fältstyrka]]&lt;br /&gt;
[[category:ellära]]&lt;br /&gt;
[[category:radio]]&lt;br /&gt;
[[category:radiolära]]&lt;br /&gt;
[[category:magnetism]]&lt;br /&gt;
[[category:elektricitet]]&lt;br /&gt;
&lt;br /&gt;
= Bakgrund =&lt;br /&gt;
&lt;br /&gt;
Fältstyrkan av en radiosignal avtar linjärt med avståndet från en sändare. Denna kan räknas ut med en enkel formel som stämmer utmärkt i fjärrfältet från antennen. I närfältet är det mer komplicerat.&lt;br /&gt;
&lt;br /&gt;
== Fjärrfältsdefinition ==&lt;br /&gt;
&lt;br /&gt;
För fjärrfältet används vanligen följande approximation vid vilket avstånd från en antenn som vi kan säga iss vara i fjärrfältet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; r &amp;gt; \frac{2D^2}{\lambda}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Där D är antennens största utbredning i rummet i meter, för den dipol den totala längden, för en Yagi-Uda dess längsta axel, för en parabol omkretsen och &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; är våglängden i meter. &amp;lt;math&amp;gt;D^2&amp;lt;/math&amp;gt; är ett mått på antennens &amp;quot;antennarea&amp;quot; och säger något om fältbildning och utbredning i rummet.&lt;br /&gt;
&lt;br /&gt;
= Effekttäthet = &lt;br /&gt;
&lt;br /&gt;
Effekttätheten &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; i enenheten W/m² kan beräknas ur sambandet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S = \frac{P \cdot G}{2 \pi r^2}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Elektrisk fältstyrka =&lt;br /&gt;
&lt;br /&gt;
Den elektriska fältstyrkan uttrycks i regel som V/m eller i varianter därav. Vanliga varianter är t.ex. dBµV/m. Detta gäller i fjärrfältet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
E= \frac{ \sqrt{30 \cdot P \cdot G} } { r }&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Magnetisk fältstyrka = &lt;br /&gt;
&lt;br /&gt;
== Från elektriska fältet ==&lt;br /&gt;
&lt;br /&gt;
Om du redan beräknat den elektriska fältstyrkan kan den magnetiska beräknas så som:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H = \frac{E}{377} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Direkt från sändaren ==&lt;br /&gt;
&lt;br /&gt;
Annars från sändarens effekt P och antennens antennvinst G fås:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H = \frac{\sqrt{30 \cdot P \cdot G}}{377 \cdot r}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nära en elektrisk ledare ==&lt;br /&gt;
&lt;br /&gt;
Nära en elektrisk ledare, till exempel drivet element hos en antenn så beräknas först strömmen i ledaren och därefter fås magnetfältet med relationen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
H = \frac{I}{2 \pi r}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Storhetssamling = &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Storheter och enheter på denna sida&lt;br /&gt;
|-&lt;br /&gt;
! Storhet!! Beteckning!! Enhet&lt;br /&gt;
|-&lt;br /&gt;
| S || Effektdensitet|| W/m²&lt;br /&gt;
|-&lt;br /&gt;
| E || Elektrisk fältstyrka || V/m&lt;br /&gt;
|-&lt;br /&gt;
| H || Magnetisk fältstyrka || A/m&lt;br /&gt;
|-&lt;br /&gt;
| I || Elektrisk ström || A&lt;br /&gt;
|-&lt;br /&gt;
| P || Sändarens effekt || W&lt;br /&gt;
|-&lt;br /&gt;
| G || Antennens förstärkningsfaktor || (dimensionslös)&lt;br /&gt;
|-&lt;br /&gt;
| D || Antennarea || m²&lt;br /&gt;
|-&lt;br /&gt;
| r || Sträcka || m&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=F%C3%A4ltstyrka&amp;diff=1886</id>
		<title>Fältstyrka</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=F%C3%A4ltstyrka&amp;diff=1886"/>
		<updated>2026-05-12T07:47:09Z</updated>

		<summary type="html">&lt;p&gt;Anders: /* Storhetssamling */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:formelsamling]]&lt;br /&gt;
[[category:fältstyrka]]&lt;br /&gt;
[[category:ellära]]&lt;br /&gt;
[[category:radio]]&lt;br /&gt;
[[category:radiolära]]&lt;br /&gt;
[[category:magnetism]]&lt;br /&gt;
[[category:elektricitet]]&lt;br /&gt;
&lt;br /&gt;
= Bakgrund =&lt;br /&gt;
&lt;br /&gt;
Fältstyrkan av en radiosignal avtar linjärt med avståndet från en sändare. Denna kan räknas ut med en enkel formel som stämmer utmärkt i fjärrfältet från antennen. I närfältet är det mer komplicerat.&lt;br /&gt;
&lt;br /&gt;
== Fjärrfältsdefinition ==&lt;br /&gt;
&lt;br /&gt;
För fjärrfältet används vanligen följande approximation vid vilket avstånd från en antenn som vi kan säga iss vara i fjärrfältet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; r &amp;gt; \frac{2D^2}{\lambda}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Där D är antennens största utbredning i rummet i meter, för den dipol den totala längden, för en Yagi-Uda dess längsta axel, för en parabol omkretsen och &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; är våglängden i meter. &amp;lt;math&amp;gt;D^2&amp;lt;/math&amp;gt; är ett mått på antennens &amp;quot;antennarea&amp;quot; och säger något om fältbildning och utbredning i rummet.&lt;br /&gt;
&lt;br /&gt;
= Effekttäthet = &lt;br /&gt;
&lt;br /&gt;
Effekttätheten &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; i enenheten W/m² kan beräknas ur sambandet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S = \frac{P \cdot G}{2 \pi r^2}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Elektrisk fältstyrka =&lt;br /&gt;
&lt;br /&gt;
Den elektriska fältstyrkan uttrycks i regel som V/m eller i varianter därav. Vanliga varianter är t.ex. dBµV/m. Detta gäller i fjärrfältet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
E= \frac{ \sqrt{30 \cdot P \cdot G} } { r }&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Magnetisk fältstyrka = &lt;br /&gt;
&lt;br /&gt;
== Från elektriska fältet ==&lt;br /&gt;
&lt;br /&gt;
Om du redan beräknat den elektriska fältstyrkan kan den magnetiska beräknas så som:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H = \frac{E}{377} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Direkt från sändaren ==&lt;br /&gt;
&lt;br /&gt;
Annars från sändarens effekt P och antennens antennvinst G fås:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{\sqrt{30 \cdot P \cdot G}}{377 \cdot r}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nära en elektrisk ledare ==&lt;br /&gt;
&lt;br /&gt;
Nära en elektrisk ledare, till exempel drivet element hos en antenn så beräknas först strömmen i ledaren och därefter fås magnetfältet med relationen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
H = \frac{I}{2 \pi r}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Storhetssamling = &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Storheter och enheter på denna sida&lt;br /&gt;
|-&lt;br /&gt;
! Storhet!! Beteckning!! Enhet&lt;br /&gt;
|-&lt;br /&gt;
| S || Effektdensitet|| W/m²&lt;br /&gt;
|-&lt;br /&gt;
| E || Elektrisk fältstyrka || V/m&lt;br /&gt;
|-&lt;br /&gt;
| H || Magnetisk fältstyrka || A/m&lt;br /&gt;
|-&lt;br /&gt;
| I || Elektrisk ström || A&lt;br /&gt;
|-&lt;br /&gt;
| P || Sändarens effekt || W&lt;br /&gt;
|-&lt;br /&gt;
| G || Antennens förstärkningsfaktor || (dimensionslös)&lt;br /&gt;
|-&lt;br /&gt;
| D || Antennarea || m²&lt;br /&gt;
|-&lt;br /&gt;
| r || Sträcka || m&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=F%C3%A4ltstyrka&amp;diff=1885</id>
		<title>Fältstyrka</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=F%C3%A4ltstyrka&amp;diff=1885"/>
		<updated>2026-05-12T07:46:40Z</updated>

		<summary type="html">&lt;p&gt;Anders: /* Storhetssamling */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:formelsamling]]&lt;br /&gt;
[[category:fältstyrka]]&lt;br /&gt;
[[category:ellära]]&lt;br /&gt;
[[category:radio]]&lt;br /&gt;
[[category:radiolära]]&lt;br /&gt;
[[category:magnetism]]&lt;br /&gt;
[[category:elektricitet]]&lt;br /&gt;
&lt;br /&gt;
= Bakgrund =&lt;br /&gt;
&lt;br /&gt;
Fältstyrkan av en radiosignal avtar linjärt med avståndet från en sändare. Denna kan räknas ut med en enkel formel som stämmer utmärkt i fjärrfältet från antennen. I närfältet är det mer komplicerat.&lt;br /&gt;
&lt;br /&gt;
== Fjärrfältsdefinition ==&lt;br /&gt;
&lt;br /&gt;
För fjärrfältet används vanligen följande approximation vid vilket avstånd från en antenn som vi kan säga iss vara i fjärrfältet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; r &amp;gt; \frac{2D^2}{\lambda}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Där D är antennens största utbredning i rummet i meter, för den dipol den totala längden, för en Yagi-Uda dess längsta axel, för en parabol omkretsen och &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; är våglängden i meter. &amp;lt;math&amp;gt;D^2&amp;lt;/math&amp;gt; är ett mått på antennens &amp;quot;antennarea&amp;quot; och säger något om fältbildning och utbredning i rummet.&lt;br /&gt;
&lt;br /&gt;
= Effekttäthet = &lt;br /&gt;
&lt;br /&gt;
Effekttätheten &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; i enenheten W/m² kan beräknas ur sambandet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S = \frac{P \cdot G}{2 \pi r^2}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Elektrisk fältstyrka =&lt;br /&gt;
&lt;br /&gt;
Den elektriska fältstyrkan uttrycks i regel som V/m eller i varianter därav. Vanliga varianter är t.ex. dBµV/m. Detta gäller i fjärrfältet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
E= \frac{ \sqrt{30 \cdot P \cdot G} } { r }&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Magnetisk fältstyrka = &lt;br /&gt;
&lt;br /&gt;
== Från elektriska fältet ==&lt;br /&gt;
&lt;br /&gt;
Om du redan beräknat den elektriska fältstyrkan kan den magnetiska beräknas så som:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H = \frac{E}{377} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Direkt från sändaren ==&lt;br /&gt;
&lt;br /&gt;
Annars från sändarens effekt P och antennens antennvinst G fås:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{\sqrt{30 \cdot P \cdot G}}{377 \cdot r}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nära en elektrisk ledare ==&lt;br /&gt;
&lt;br /&gt;
Nära en elektrisk ledare, till exempel drivet element hos en antenn så beräknas först strömmen i ledaren och därefter fås magnetfältet med relationen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
H = \frac{I}{2 \pi r}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Storhetssamling = &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Storheter och enheter på denna sida&lt;br /&gt;
|-&lt;br /&gt;
! Storhet!! Beteckning!! Enhet&lt;br /&gt;
|-&lt;br /&gt;
| S || Effektdensitet|| W/m²&lt;br /&gt;
|-&lt;br /&gt;
| E || Elektrisk fältstyrka || V/m&lt;br /&gt;
|-&lt;br /&gt;
| H || Magnetisk fältstyrka || A/m&lt;br /&gt;
|-&lt;br /&gt;
| P || Sändarens effekt || W&lt;br /&gt;
|-&lt;br /&gt;
| G || Antennens förstärkningsfaktor || (dimensionslös)&lt;br /&gt;
|-&lt;br /&gt;
| D || Antennarea || m²&lt;br /&gt;
|-&lt;br /&gt;
| r || Sträcka || m&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=F%C3%A4ltstyrka&amp;diff=1884</id>
		<title>Fältstyrka</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=F%C3%A4ltstyrka&amp;diff=1884"/>
		<updated>2026-05-12T07:45:59Z</updated>

		<summary type="html">&lt;p&gt;Anders: /* Bakgrund */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:formelsamling]]&lt;br /&gt;
[[category:fältstyrka]]&lt;br /&gt;
[[category:ellära]]&lt;br /&gt;
[[category:radio]]&lt;br /&gt;
[[category:radiolära]]&lt;br /&gt;
[[category:magnetism]]&lt;br /&gt;
[[category:elektricitet]]&lt;br /&gt;
&lt;br /&gt;
= Bakgrund =&lt;br /&gt;
&lt;br /&gt;
Fältstyrkan av en radiosignal avtar linjärt med avståndet från en sändare. Denna kan räknas ut med en enkel formel som stämmer utmärkt i fjärrfältet från antennen. I närfältet är det mer komplicerat.&lt;br /&gt;
&lt;br /&gt;
== Fjärrfältsdefinition ==&lt;br /&gt;
&lt;br /&gt;
För fjärrfältet används vanligen följande approximation vid vilket avstånd från en antenn som vi kan säga iss vara i fjärrfältet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; r &amp;gt; \frac{2D^2}{\lambda}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Där D är antennens största utbredning i rummet i meter, för den dipol den totala längden, för en Yagi-Uda dess längsta axel, för en parabol omkretsen och &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; är våglängden i meter. &amp;lt;math&amp;gt;D^2&amp;lt;/math&amp;gt; är ett mått på antennens &amp;quot;antennarea&amp;quot; och säger något om fältbildning och utbredning i rummet.&lt;br /&gt;
&lt;br /&gt;
= Effekttäthet = &lt;br /&gt;
&lt;br /&gt;
Effekttätheten &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; i enenheten W/m² kan beräknas ur sambandet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S = \frac{P \cdot G}{2 \pi r^2}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Elektrisk fältstyrka =&lt;br /&gt;
&lt;br /&gt;
Den elektriska fältstyrkan uttrycks i regel som V/m eller i varianter därav. Vanliga varianter är t.ex. dBµV/m. Detta gäller i fjärrfältet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
E= \frac{ \sqrt{30 \cdot P \cdot G} } { r }&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Magnetisk fältstyrka = &lt;br /&gt;
&lt;br /&gt;
== Från elektriska fältet ==&lt;br /&gt;
&lt;br /&gt;
Om du redan beräknat den elektriska fältstyrkan kan den magnetiska beräknas så som:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H = \frac{E}{377} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Direkt från sändaren ==&lt;br /&gt;
&lt;br /&gt;
Annars från sändarens effekt P och antennens antennvinst G fås:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{\sqrt{30 \cdot P \cdot G}}{377 \cdot r}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nära en elektrisk ledare ==&lt;br /&gt;
&lt;br /&gt;
Nära en elektrisk ledare, till exempel drivet element hos en antenn så beräknas först strömmen i ledaren och därefter fås magnetfältet med relationen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
H = \frac{I}{2 \pi r}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Storhetssamling = &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Storheter och enheter på denna sida&lt;br /&gt;
|-&lt;br /&gt;
! Storhet!! Beteckning!! Enhet&lt;br /&gt;
|-&lt;br /&gt;
| S || Effektdensitet|| W/m²&lt;br /&gt;
|-&lt;br /&gt;
| E || Elektrisk fältstyrka || V/m&lt;br /&gt;
|-&lt;br /&gt;
| H || Magnetisk fältstyrka || A/m&lt;br /&gt;
|-&lt;br /&gt;
| P || Sändarens effekt || W&lt;br /&gt;
|-&lt;br /&gt;
| G || Antennens förstärkningsfaktor || (dimensionslös)&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=F%C3%A4ltstyrka&amp;diff=1883</id>
		<title>Fältstyrka</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=F%C3%A4ltstyrka&amp;diff=1883"/>
		<updated>2026-05-12T07:42:49Z</updated>

		<summary type="html">&lt;p&gt;Anders: /* Elektrisk fältstyrka */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:formelsamling]]&lt;br /&gt;
[[category:fältstyrka]]&lt;br /&gt;
[[category:ellära]]&lt;br /&gt;
[[category:radio]]&lt;br /&gt;
[[category:radiolära]]&lt;br /&gt;
[[category:magnetism]]&lt;br /&gt;
[[category:elektricitet]]&lt;br /&gt;
&lt;br /&gt;
= Bakgrund =&lt;br /&gt;
&lt;br /&gt;
Fältstyrkan av en radiosignal avtar linjärt med avståndet från en sändare. Denna kan räknas ut med en enkel formel som stämmer utmärkt i fjärrfältet från antennen. I närfältet är det mer komplicerat.&lt;br /&gt;
&lt;br /&gt;
= Effekttäthet = &lt;br /&gt;
&lt;br /&gt;
Effekttätheten &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; i enenheten W/m² kan beräknas ur sambandet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S = \frac{P \cdot G}{2 \pi r^2}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Elektrisk fältstyrka =&lt;br /&gt;
&lt;br /&gt;
Den elektriska fältstyrkan uttrycks i regel som V/m eller i varianter därav. Vanliga varianter är t.ex. dBµV/m. Detta gäller i fjärrfältet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
E= \frac{ \sqrt{30 \cdot P \cdot G} } { r }&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Magnetisk fältstyrka = &lt;br /&gt;
&lt;br /&gt;
== Från elektriska fältet ==&lt;br /&gt;
&lt;br /&gt;
Om du redan beräknat den elektriska fältstyrkan kan den magnetiska beräknas så som:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H = \frac{E}{377} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Direkt från sändaren ==&lt;br /&gt;
&lt;br /&gt;
Annars från sändarens effekt P och antennens antennvinst G fås:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{\sqrt{30 \cdot P \cdot G}}{377 \cdot r}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nära en elektrisk ledare ==&lt;br /&gt;
&lt;br /&gt;
Nära en elektrisk ledare, till exempel drivet element hos en antenn så beräknas först strömmen i ledaren och därefter fås magnetfältet med relationen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
H = \frac{I}{2 \pi r}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Storhetssamling = &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Storheter och enheter på denna sida&lt;br /&gt;
|-&lt;br /&gt;
! Storhet!! Beteckning!! Enhet&lt;br /&gt;
|-&lt;br /&gt;
| S || Effektdensitet|| W/m²&lt;br /&gt;
|-&lt;br /&gt;
| E || Elektrisk fältstyrka || V/m&lt;br /&gt;
|-&lt;br /&gt;
| H || Magnetisk fältstyrka || A/m&lt;br /&gt;
|-&lt;br /&gt;
| P || Sändarens effekt || W&lt;br /&gt;
|-&lt;br /&gt;
| G || Antennens förstärkningsfaktor || (dimensionslös)&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=F%C3%A4ltstyrka&amp;diff=1882</id>
		<title>Fältstyrka</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=F%C3%A4ltstyrka&amp;diff=1882"/>
		<updated>2026-05-12T07:38:13Z</updated>

		<summary type="html">&lt;p&gt;Anders: /* Magnetisk fältstyrka */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:formelsamling]]&lt;br /&gt;
[[category:fältstyrka]]&lt;br /&gt;
[[category:ellära]]&lt;br /&gt;
[[category:radio]]&lt;br /&gt;
[[category:radiolära]]&lt;br /&gt;
[[category:magnetism]]&lt;br /&gt;
[[category:elektricitet]]&lt;br /&gt;
&lt;br /&gt;
= Bakgrund =&lt;br /&gt;
&lt;br /&gt;
Fältstyrkan av en radiosignal avtar linjärt med avståndet från en sändare. Denna kan räknas ut med en enkel formel som stämmer utmärkt i fjärrfältet från antennen. I närfältet är det mer komplicerat.&lt;br /&gt;
&lt;br /&gt;
= Effekttäthet = &lt;br /&gt;
&lt;br /&gt;
Effekttätheten &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; i enenheten W/m² kan beräknas ur sambandet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S = \frac{P \cdot G}{2 \pi r^2}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Elektrisk fältstyrka =&lt;br /&gt;
&lt;br /&gt;
Den elektriska fältstyrkan uttrycks i regel som V/m eller i varianter därav. Vanliga varianter är t.ex. dBµV/m.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
E= \frac{ \sqrt{30 \cdot P \cdot G} } { r }&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Magnetisk fältstyrka = &lt;br /&gt;
&lt;br /&gt;
== Från elektriska fältet ==&lt;br /&gt;
&lt;br /&gt;
Om du redan beräknat den elektriska fältstyrkan kan den magnetiska beräknas så som:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H = \frac{E}{377} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Direkt från sändaren ==&lt;br /&gt;
&lt;br /&gt;
Annars från sändarens effekt P och antennens antennvinst G fås:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{\sqrt{30 \cdot P \cdot G}}{377 \cdot r}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nära en elektrisk ledare ==&lt;br /&gt;
&lt;br /&gt;
Nära en elektrisk ledare, till exempel drivet element hos en antenn så beräknas först strömmen i ledaren och därefter fås magnetfältet med relationen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
H = \frac{I}{2 \pi r}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Storhetssamling = &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Storheter och enheter på denna sida&lt;br /&gt;
|-&lt;br /&gt;
! Storhet!! Beteckning!! Enhet&lt;br /&gt;
|-&lt;br /&gt;
| S || Effektdensitet|| W/m²&lt;br /&gt;
|-&lt;br /&gt;
| E || Elektrisk fältstyrka || V/m&lt;br /&gt;
|-&lt;br /&gt;
| H || Magnetisk fältstyrka || A/m&lt;br /&gt;
|-&lt;br /&gt;
| P || Sändarens effekt || W&lt;br /&gt;
|-&lt;br /&gt;
| G || Antennens förstärkningsfaktor || (dimensionslös)&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=F%C3%A4ltstyrka&amp;diff=1881</id>
		<title>Fältstyrka</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=F%C3%A4ltstyrka&amp;diff=1881"/>
		<updated>2026-05-12T07:37:24Z</updated>

		<summary type="html">&lt;p&gt;Anders: /* Storhetssamling */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:formelsamling]]&lt;br /&gt;
[[category:fältstyrka]]&lt;br /&gt;
[[category:ellära]]&lt;br /&gt;
[[category:radio]]&lt;br /&gt;
[[category:radiolära]]&lt;br /&gt;
[[category:magnetism]]&lt;br /&gt;
[[category:elektricitet]]&lt;br /&gt;
&lt;br /&gt;
= Bakgrund =&lt;br /&gt;
&lt;br /&gt;
Fältstyrkan av en radiosignal avtar linjärt med avståndet från en sändare. Denna kan räknas ut med en enkel formel som stämmer utmärkt i fjärrfältet från antennen. I närfältet är det mer komplicerat.&lt;br /&gt;
&lt;br /&gt;
= Effekttäthet = &lt;br /&gt;
&lt;br /&gt;
Effekttätheten &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; i enenheten W/m² kan beräknas ur sambandet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S = \frac{P \cdot G}{2 \pi r^2}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Elektrisk fältstyrka =&lt;br /&gt;
&lt;br /&gt;
Den elektriska fältstyrkan uttrycks i regel som V/m eller i varianter därav. Vanliga varianter är t.ex. dBµV/m.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
E= \frac{ \sqrt{30 \cdot P \cdot G} } { r }&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Magnetisk fältstyrka = &lt;br /&gt;
&lt;br /&gt;
Om du redan beräknat den elektriska fältstyrkan kan den magnetiska beräknas så som:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H = \frac{E}{377} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Annars från sändarens effekt P och antennens antennvinst G fås:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{\sqrt{30 \cdot P \cdot G}}{377 \cdot r}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nära en elektrisk ledare, till exempel drivet element hos en antenn så beräknas först strömmen i ledaren och därefter fås magnetfältet med relationen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
H = \frac{I}{2 \pi r}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Storhetssamling = &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Storheter och enheter på denna sida&lt;br /&gt;
|-&lt;br /&gt;
! Storhet!! Beteckning!! Enhet&lt;br /&gt;
|-&lt;br /&gt;
| S || Effektdensitet|| W/m²&lt;br /&gt;
|-&lt;br /&gt;
| E || Elektrisk fältstyrka || V/m&lt;br /&gt;
|-&lt;br /&gt;
| H || Magnetisk fältstyrka || A/m&lt;br /&gt;
|-&lt;br /&gt;
| P || Sändarens effekt || W&lt;br /&gt;
|-&lt;br /&gt;
| G || Antennens förstärkningsfaktor || (dimensionslös)&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=F%C3%A4ltstyrka&amp;diff=1880</id>
		<title>Fältstyrka</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=F%C3%A4ltstyrka&amp;diff=1880"/>
		<updated>2026-05-12T07:37:06Z</updated>

		<summary type="html">&lt;p&gt;Anders: /* Storhetssamling */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:formelsamling]]&lt;br /&gt;
[[category:fältstyrka]]&lt;br /&gt;
[[category:ellära]]&lt;br /&gt;
[[category:radio]]&lt;br /&gt;
[[category:radiolära]]&lt;br /&gt;
[[category:magnetism]]&lt;br /&gt;
[[category:elektricitet]]&lt;br /&gt;
&lt;br /&gt;
= Bakgrund =&lt;br /&gt;
&lt;br /&gt;
Fältstyrkan av en radiosignal avtar linjärt med avståndet från en sändare. Denna kan räknas ut med en enkel formel som stämmer utmärkt i fjärrfältet från antennen. I närfältet är det mer komplicerat.&lt;br /&gt;
&lt;br /&gt;
= Effekttäthet = &lt;br /&gt;
&lt;br /&gt;
Effekttätheten &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; i enenheten W/m² kan beräknas ur sambandet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S = \frac{P \cdot G}{2 \pi r^2}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Elektrisk fältstyrka =&lt;br /&gt;
&lt;br /&gt;
Den elektriska fältstyrkan uttrycks i regel som V/m eller i varianter därav. Vanliga varianter är t.ex. dBµV/m.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
E= \frac{ \sqrt{30 \cdot P \cdot G} } { r }&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Magnetisk fältstyrka = &lt;br /&gt;
&lt;br /&gt;
Om du redan beräknat den elektriska fältstyrkan kan den magnetiska beräknas så som:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H = \frac{E}{377} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Annars från sändarens effekt P och antennens antennvinst G fås:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{\sqrt{30 \cdot P \cdot G}}{377 \cdot r}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nära en elektrisk ledare, till exempel drivet element hos en antenn så beräknas först strömmen i ledaren och därefter fås magnetfältet med relationen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
H = \frac{I}{2 \pi r}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Storhetssamling = &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Storheter och enheter&lt;br /&gt;
|-&lt;br /&gt;
! Storhet!! Beteckning!! Enhet&lt;br /&gt;
|-&lt;br /&gt;
| S || Effektdensitet|| W/m²&lt;br /&gt;
|-&lt;br /&gt;
| E || Elektrisk fältstyrka || V/m&lt;br /&gt;
|-&lt;br /&gt;
| H || Magnetisk fältstyrka || A/m&lt;br /&gt;
|-&lt;br /&gt;
| P || Sändarens effekt || W&lt;br /&gt;
|-&lt;br /&gt;
| G || Antennens förstärkningsfaktor || (dimensionslös)&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=F%C3%A4ltstyrka&amp;diff=1879</id>
		<title>Fältstyrka</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=F%C3%A4ltstyrka&amp;diff=1879"/>
		<updated>2026-05-12T07:25:19Z</updated>

		<summary type="html">&lt;p&gt;Anders: /* Magnetisk fältstyrka */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:formelsamling]]&lt;br /&gt;
[[category:fältstyrka]]&lt;br /&gt;
[[category:ellära]]&lt;br /&gt;
[[category:radio]]&lt;br /&gt;
[[category:radiolära]]&lt;br /&gt;
[[category:magnetism]]&lt;br /&gt;
[[category:elektricitet]]&lt;br /&gt;
&lt;br /&gt;
= Bakgrund =&lt;br /&gt;
&lt;br /&gt;
Fältstyrkan av en radiosignal avtar linjärt med avståndet från en sändare. Denna kan räknas ut med en enkel formel som stämmer utmärkt i fjärrfältet från antennen. I närfältet är det mer komplicerat.&lt;br /&gt;
&lt;br /&gt;
= Effekttäthet = &lt;br /&gt;
&lt;br /&gt;
Effekttätheten &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; i enenheten W/m² kan beräknas ur sambandet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S = \frac{P \cdot G}{2 \pi r^2}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Elektrisk fältstyrka =&lt;br /&gt;
&lt;br /&gt;
Den elektriska fältstyrkan uttrycks i regel som V/m eller i varianter därav. Vanliga varianter är t.ex. dBµV/m.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
E= \frac{ \sqrt{30 \cdot P \cdot G} } { r }&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Magnetisk fältstyrka = &lt;br /&gt;
&lt;br /&gt;
Om du redan beräknat den elektriska fältstyrkan kan den magnetiska beräknas så som:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H = \frac{E}{377} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Annars från sändarens effekt P och antennens antennvinst G fås:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{\sqrt{30 \cdot P \cdot G}}{377 \cdot r}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nära en elektrisk ledare, till exempel drivet element hos en antenn så beräknas först strömmen i ledaren och därefter fås magnetfältet med relationen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
H = \frac{I}{2 \pi r}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Storhetssamling = &lt;br /&gt;
&lt;br /&gt;
TODO: Samla storheterna här&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=F%C3%A4ltstyrka&amp;diff=1878</id>
		<title>Fältstyrka</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=F%C3%A4ltstyrka&amp;diff=1878"/>
		<updated>2026-05-12T07:25:02Z</updated>

		<summary type="html">&lt;p&gt;Anders: /* Magnetiska fältstyrkan */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:formelsamling]]&lt;br /&gt;
[[category:fältstyrka]]&lt;br /&gt;
[[category:ellära]]&lt;br /&gt;
[[category:radio]]&lt;br /&gt;
[[category:radiolära]]&lt;br /&gt;
[[category:magnetism]]&lt;br /&gt;
[[category:elektricitet]]&lt;br /&gt;
&lt;br /&gt;
= Bakgrund =&lt;br /&gt;
&lt;br /&gt;
Fältstyrkan av en radiosignal avtar linjärt med avståndet från en sändare. Denna kan räknas ut med en enkel formel som stämmer utmärkt i fjärrfältet från antennen. I närfältet är det mer komplicerat.&lt;br /&gt;
&lt;br /&gt;
= Effekttäthet = &lt;br /&gt;
&lt;br /&gt;
Effekttätheten &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; i enenheten W/m² kan beräknas ur sambandet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S = \frac{P \cdot G}{2 \pi r^2}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Elektrisk fältstyrka =&lt;br /&gt;
&lt;br /&gt;
Den elektriska fältstyrkan uttrycks i regel som V/m eller i varianter därav. Vanliga varianter är t.ex. dBµV/m.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
E= \frac{ \sqrt{30 \cdot P \cdot G} } { r }&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Magnetisk fältstyrka = &lt;br /&gt;
&lt;br /&gt;
Om du redan beräknat den elektriska fältstyrkan kan den magnetiska beräknas så som:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H = \frac{E}{377} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Annars från sändarens effekt P och antennens antennvinst G fås:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H = \frac{E}{377} \approx \frac{\sqrt{30 \cdot P \cdot G}}{377 \cdot r}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nära en elektrisk ledare, till exempel drivet element hos en antenn så beräknas först strömmen i ledaren och därefter fås magnetfältet med relationen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
H = \frac{I}{2 \pi r}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Storhetssamling = &lt;br /&gt;
&lt;br /&gt;
TODO: Samla storheterna här&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=F%C3%A4ltstyrka&amp;diff=1877</id>
		<title>Fältstyrka</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=F%C3%A4ltstyrka&amp;diff=1877"/>
		<updated>2026-05-12T07:24:01Z</updated>

		<summary type="html">&lt;p&gt;Anders: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:formelsamling]]&lt;br /&gt;
[[category:fältstyrka]]&lt;br /&gt;
[[category:ellära]]&lt;br /&gt;
[[category:radio]]&lt;br /&gt;
[[category:radiolära]]&lt;br /&gt;
[[category:magnetism]]&lt;br /&gt;
[[category:elektricitet]]&lt;br /&gt;
&lt;br /&gt;
= Bakgrund =&lt;br /&gt;
&lt;br /&gt;
Fältstyrkan av en radiosignal avtar linjärt med avståndet från en sändare. Denna kan räknas ut med en enkel formel som stämmer utmärkt i fjärrfältet från antennen. I närfältet är det mer komplicerat.&lt;br /&gt;
&lt;br /&gt;
= Effekttäthet = &lt;br /&gt;
&lt;br /&gt;
Effekttätheten &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; i enenheten W/m² kan beräknas ur sambandet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
S = \frac{P \cdot G}{2 \pi r^2}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Elektrisk fältstyrka =&lt;br /&gt;
&lt;br /&gt;
Den elektriska fältstyrkan uttrycks i regel som V/m eller i varianter därav. Vanliga varianter är t.ex. dBµV/m.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
E= \frac{ \sqrt{30 \cdot P \cdot G} } { r }&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Magnetiska fältstyrkan = &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
H = \frac{E}{377} \approx \frac{\sqrt{30 \cdot P \cdot G}}{377 \cdot r}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nära en elektrisk ledare, till exempel drivet element hos en antenn så beräknas först strömmen i ledaren och därefter fås magnetfältet med relationen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
H = \frac{I}{2 \pi r}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Storhetssamling = &lt;br /&gt;
&lt;br /&gt;
TODO: Samla storheterna här&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=F%C3%A4ltstyrka&amp;diff=1876</id>
		<title>Fältstyrka</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=F%C3%A4ltstyrka&amp;diff=1876"/>
		<updated>2026-05-11T17:11:59Z</updated>

		<summary type="html">&lt;p&gt;Anders: Skapade sidan med &amp;#039;= Bakgrund =  Fältstyrkan av en radiosignal avtar linjärt med avståndet från en sändare. Denna kan räknas ut med en enkel formel som stämmer utmärkt i fjärrfältet från antennen. I närfältet är det mer komplicerat.  = Formel =   &amp;lt;math&amp;gt; E= \frac{ \sqrt{30 \cdot P \cdot G} } { r } &amp;lt;/math&amp;gt;  Där &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; är fältstyrkan i V/m&amp;lt;br&amp;gt; och &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; är effekten hos sändaren i W&amp;lt;br&amp;gt; samt &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; är antennens antennvinst i bästa riktningen (linj...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Bakgrund =&lt;br /&gt;
&lt;br /&gt;
Fältstyrkan av en radiosignal avtar linjärt med avståndet från en sändare. Denna kan räknas ut med en enkel formel som stämmer utmärkt i fjärrfältet från antennen. I närfältet är det mer komplicerat.&lt;br /&gt;
&lt;br /&gt;
= Formel = &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
E= \frac{ \sqrt{30 \cdot P \cdot G} } { r }&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Där &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; är fältstyrkan i V/m&amp;lt;br&amp;gt;&lt;br /&gt;
och &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; är effekten hos sändaren i W&amp;lt;br&amp;gt;&lt;br /&gt;
samt &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; är antennens antennvinst i bästa riktningen (linjärt, ej i dB).&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Racket/Erastothenes&amp;diff=1875</id>
		<title>Racket/Erastothenes</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Racket/Erastothenes&amp;diff=1875"/>
		<updated>2026-05-07T07:05:13Z</updated>

		<summary type="html">&lt;p&gt;Anders: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Algoritmer]]&lt;br /&gt;
[[category:Programmering]]&lt;br /&gt;
[[category:Racket]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#lang racket&lt;br /&gt;
&lt;br /&gt;
;;;;;&lt;br /&gt;
;; Erastothenes såll implementerad i Racket&lt;br /&gt;
;; Täpp-Anders Sikvall 2026-04-03 anders@sikvall.se&lt;br /&gt;
;;;;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;; Skapar en vektor där indexet motsvarar talet.&lt;br /&gt;
;; Om (vector-ref v n) är #t, så är n ett primtal.&lt;br /&gt;
&lt;br /&gt;
(define (make-sieve limit)&lt;br /&gt;
  (define sieve (make-vector (add1 limit) #t))&lt;br /&gt;
  &lt;br /&gt;
  ;; 0 och 1 är aldrig primtal&lt;br /&gt;
  (when (&amp;gt;= limit 0) (vector-set! sieve 0 #f))&lt;br /&gt;
  (when (&amp;gt;= limit 1) (vector-set! sieve 1 #f))&lt;br /&gt;
  &lt;br /&gt;
  ;; Vi behöver bara gå upp till kvadratroten av limit&lt;br /&gt;
  (for ([p (in-range 2 (add1 (integer-sqrt limit)))])&lt;br /&gt;
    (when (vector-ref sieve p)&lt;br /&gt;
      ;; Markera alla multiplar av p som falska (starta vid p*p)&lt;br /&gt;
      (for ([multiple (in-range (* p p) (add1 limit) p)])&lt;br /&gt;
        (vector-set! sieve multiple #f))))&lt;br /&gt;
  ;; returnera sållet till anroparen&lt;br /&gt;
  sieve)&lt;br /&gt;
&lt;br /&gt;
;; Returnerar en lista med alla primtal mellan start och stop&lt;br /&gt;
(define (primes-between start stop)&lt;br /&gt;
  (if (&amp;gt; start stop)&lt;br /&gt;
      &#039;() ;Returnerar tomt om start &amp;gt; stop&lt;br /&gt;
      (let ([is-prime? (make-sieve stop)])&lt;br /&gt;
        (for/list ([n (in-range (max start 2) (add1 stop))]&lt;br /&gt;
                   #:when (vector-ref is-prime? n))&lt;br /&gt;
          n))))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;; Testkörning&lt;br /&gt;
(primes-between 10 50)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=MSMTP_f%C3%B6r_Protonmail&amp;diff=1874</id>
		<title>MSMTP för Protonmail</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=MSMTP_f%C3%B6r_Protonmail&amp;diff=1874"/>
		<updated>2026-04-25T10:44:17Z</updated>

		<summary type="html">&lt;p&gt;Anders: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Protonmail]]&lt;br /&gt;
[[category:Proton]]&lt;br /&gt;
[[category:Linux]]&lt;br /&gt;
[[category:Hack]]&lt;br /&gt;
[[category:MSMTP]]&lt;br /&gt;
[[category:MTA]]&lt;br /&gt;
[[category:Mail]]&lt;br /&gt;
&lt;br /&gt;
= SMTP token = &lt;br /&gt;
&lt;br /&gt;
Först behöver du logga in i tjänsten och generera ett &amp;lt;i&amp;gt;SMTP Token&amp;lt;/i&amp;gt; för att använda med Protonmail annars kommer inte detta fungera utan att installera [[Proton Mail Bridge]] eller liknande. &lt;br /&gt;
&lt;br /&gt;
Vi kommer använda special@domain.com i denna text.&lt;br /&gt;
&lt;br /&gt;
= Installation = &lt;br /&gt;
&lt;br /&gt;
Installera följande komponenter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo apt install msdmtp smstp-mta mailutils bsd-mailx -y&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= MSMTP Konfigurationsfil = &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/etc/msmtprc&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
defaults&lt;br /&gt;
tls on&lt;br /&gt;
&lt;br /&gt;
account default&lt;br /&gt;
  host smtp.protonmail.ch&lt;br /&gt;
  port 587&lt;br /&gt;
  from special@domain.org&lt;br /&gt;
  set_from_header on&lt;br /&gt;
  auth on&lt;br /&gt;
  user special@domain.org&lt;br /&gt;
  password SMTP_TOKEN_GOES_HERE&lt;br /&gt;
  auth plain&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Filrättigheter 0660 och inget annat.&lt;br /&gt;
Ägare till filen root:msmtp.&lt;br /&gt;
&lt;br /&gt;
= Konfigurera MTA =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/etc/mail.rc&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lägg till raden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;set mta /usr/bin/msmtp&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Du kan även sätta upp alias om du behöver det.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root: master@domain.org&lt;br /&gt;
caroline: caroline@example.com&lt;br /&gt;
default: admin@domain.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=MSMTP_f%C3%B6r_Protonmail&amp;diff=1873</id>
		<title>MSMTP för Protonmail</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=MSMTP_f%C3%B6r_Protonmail&amp;diff=1873"/>
		<updated>2026-04-25T10:43:38Z</updated>

		<summary type="html">&lt;p&gt;Anders: Skapade sidan med &amp;#039;category:Protonmail category:Proton category:Linux category:Hack  = SMTP token =   Först behöver du logga in i tjänsten och generera ett &amp;lt;i&amp;gt;SMTP Token&amp;lt;/i&amp;gt; för att använda med Protonmail annars kommer inte detta fungera utan att installera Proton Mail Bridge eller liknande.   Vi kommer använda special@domain.com i denna text.  = Installation =   Installera följande komponenter:  &amp;lt;pre&amp;gt;sudo apt install msdmtp smstp-mta mailutils bsd-mailx -y&amp;lt;/pre&amp;gt;...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Protonmail]]&lt;br /&gt;
[[category:Proton]]&lt;br /&gt;
[[category:Linux]]&lt;br /&gt;
[[category:Hack]]&lt;br /&gt;
&lt;br /&gt;
= SMTP token = &lt;br /&gt;
&lt;br /&gt;
Först behöver du logga in i tjänsten och generera ett &amp;lt;i&amp;gt;SMTP Token&amp;lt;/i&amp;gt; för att använda med Protonmail annars kommer inte detta fungera utan att installera [[Proton Mail Bridge]] eller liknande. &lt;br /&gt;
&lt;br /&gt;
Vi kommer använda special@domain.com i denna text.&lt;br /&gt;
&lt;br /&gt;
= Installation = &lt;br /&gt;
&lt;br /&gt;
Installera följande komponenter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo apt install msdmtp smstp-mta mailutils bsd-mailx -y&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= MSMTP Konfigurationsfil = &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/etc/msmtprc&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
defaults&lt;br /&gt;
tls on&lt;br /&gt;
&lt;br /&gt;
account default&lt;br /&gt;
  host smtp.protonmail.ch&lt;br /&gt;
  port 587&lt;br /&gt;
  from special@domain.org&lt;br /&gt;
  set_from_header on&lt;br /&gt;
  auth on&lt;br /&gt;
  user special@domain.org&lt;br /&gt;
  password SMTP_TOKEN_GOES_HERE&lt;br /&gt;
  auth plain&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Filrättigheter 0660 och inget annat.&lt;br /&gt;
Ägare till filen root:msmtp.&lt;br /&gt;
&lt;br /&gt;
= Konfigurera MTA =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/etc/mail.rc&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lägg till raden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;set mta /usr/bin/msmtp&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Du kan även sätta upp alias om du behöver det.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root: master@domain.org&lt;br /&gt;
caroline: caroline@example.com&lt;br /&gt;
default: admin@domain.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Automatiskt_t%C3%B6mma_soptunnan&amp;diff=1872</id>
		<title>Automatiskt tömma soptunnan</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Automatiskt_t%C3%B6mma_soptunnan&amp;diff=1872"/>
		<updated>2026-04-25T10:37:05Z</updated>

		<summary type="html">&lt;p&gt;Anders: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Linux]]&lt;br /&gt;
[[category:Tips och tricks]]&lt;br /&gt;
[[category:Hack]]&lt;br /&gt;
&lt;br /&gt;
Börja med att installera följande paket:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo apt install trash-cli&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Därefter lägger du till följande rad i crontab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;crontab -e&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;00 * * * * /usr/bin/trash-empty 7&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Spara filen och avsluta editorn. Du kan eventuellt behöva modifiera sökvägen till trash-empty, &lt;br /&gt;
på vissa system är det /bin/trash-empty.&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Automatiskt_t%C3%B6mma_soptunnan&amp;diff=1871</id>
		<title>Automatiskt tömma soptunnan</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Automatiskt_t%C3%B6mma_soptunnan&amp;diff=1871"/>
		<updated>2026-04-25T10:36:25Z</updated>

		<summary type="html">&lt;p&gt;Anders: Skapade sidan med &amp;#039;category:Linux category:Tips och tricks  Börja med att installera följande paket:  &amp;lt;pre&amp;gt;sudo apt install trash-cli&amp;lt;/pre&amp;gt;  Därefter lägger du till följande rad i crontab:  &amp;lt;pre&amp;gt;crontab -e&amp;lt;/pre&amp;gt;  &amp;lt;pre&amp;gt;00 * * * * /usr/bin/trash-empty 7&amp;lt;/pre&amp;gt;  Spara filen och avsluta editorn. Du kan eventuellt behöva modifiera sökvägen till trash-empty,  på vissa system är det /bin/trash-empty.&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Linux]]&lt;br /&gt;
[[category:Tips och tricks]]&lt;br /&gt;
&lt;br /&gt;
Börja med att installera följande paket:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo apt install trash-cli&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Därefter lägger du till följande rad i crontab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;crontab -e&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;00 * * * * /usr/bin/trash-empty 7&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Spara filen och avsluta editorn. Du kan eventuellt behöva modifiera sökvägen till trash-empty, &lt;br /&gt;
på vissa system är det /bin/trash-empty.&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Huvudsida&amp;diff=1870</id>
		<title>Huvudsida</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Huvudsida&amp;diff=1870"/>
		<updated>2026-04-25T10:33:37Z</updated>

		<summary type="html">&lt;p&gt;Anders: /* Linux */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Om mig = &lt;br /&gt;
&lt;br /&gt;
Ansvarig för denna Wiki är Anders Sikvall&lt;br /&gt;
[mailto:anders@sikvall.se anders@sikvall.se] (Proton mail krypterad)&lt;br /&gt;
&lt;br /&gt;
Du kan hitta min PGP/GPG-nyckel på denna URL:&lt;br /&gt;
[https://sikvall.se/pgp/anders@sikvall.se https://sikvall.se/pgp/anders@sikvall.se]&lt;br /&gt;
&lt;br /&gt;
Min hemsida finns på: &lt;br /&gt;
[https://sikvall.se/ https://sikvall.se/]&lt;br /&gt;
&lt;br /&gt;
= Specialsidor =&lt;br /&gt;
&lt;br /&gt;
Specialsidor är länkar till sidor som omfattar meta-information.&lt;br /&gt;
&lt;br /&gt;
* [[:Special:Categories|Alla kategorier]]&lt;br /&gt;
* [[:Special:AllPages|Alla sidor]]&lt;br /&gt;
* [[dBµV/m]]&lt;br /&gt;
&lt;br /&gt;
= Särskilt utvalda sidor =&lt;br /&gt;
* [[GPG]]&lt;br /&gt;
== Programmering ==&lt;br /&gt;
&lt;br /&gt;
* [[Fisher-Yates Shuffle]]&lt;br /&gt;
* [[Base64]] [[Base32]] [[Base24]]&lt;br /&gt;
* [[Racket]]&lt;br /&gt;
&lt;br /&gt;
== Elektronik ==&lt;br /&gt;
&lt;br /&gt;
* [[Peukerts lag]] - [[Blyackumulator laddningstabell]]&lt;br /&gt;
* [[Pi-dämpare]]&lt;br /&gt;
&lt;br /&gt;
== Radiorelaterat ==&lt;br /&gt;
&lt;br /&gt;
* [[Amatörradio]]&lt;br /&gt;
* [[Jaktradio 155 MHz]] - [[PMR446]] - [[KDR 444]]&lt;br /&gt;
* [[Q-koden]] - [[Morsealfabetet]] - [[Svenska bokstaveringsalfabetet]]&lt;br /&gt;
* [[AM]] - [[FM]] - [[SSB]] - [[CW]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Linux ==&lt;br /&gt;
&lt;br /&gt;
* [[Diskimage i Linux]]&lt;br /&gt;
* [[Git]]&lt;br /&gt;
* [[Temporär download]]&lt;br /&gt;
* [[Swapfil i BTRFS]]&lt;br /&gt;
* [[Automatiskt tömma soptunnan]]&lt;br /&gt;
&lt;br /&gt;
== LaTeX Dokumentation ==&lt;br /&gt;
&lt;br /&gt;
* [[Brevmall]]&lt;br /&gt;
* [[Svensk stilmall]]&lt;br /&gt;
* [[Tips och Tricks i LaTeX]]&lt;br /&gt;
&lt;br /&gt;
== Friluftsliv ==&lt;br /&gt;
* [[:category:Pannlampor|Pannlampor]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;L_f&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Racket/3D-boll&amp;diff=1869</id>
		<title>Racket/3D-boll</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Racket/3D-boll&amp;diff=1869"/>
		<updated>2026-04-24T15:25:27Z</updated>

		<summary type="html">&lt;p&gt;Anders: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Algoritmer]]&lt;br /&gt;
[[category:Programmering]]&lt;br /&gt;
[[category:Racket]]&lt;br /&gt;
&lt;br /&gt;
= Version &amp;quot;snurra själv&amp;quot; = &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#lang racket&lt;br /&gt;
(require plot)&lt;br /&gt;
(require racket/pretty)&lt;br /&gt;
;; En pixelboll iracket&lt;br /&gt;
;; Från Buzzern skrivet under påskhelgen&lt;br /&gt;
&lt;br /&gt;
(define π (acos -1))&lt;br /&gt;
(define VERTICAL-SPLIT 16)&lt;br /&gt;
(define HORIZONTAL-SPLIT 16)&lt;br /&gt;
(define PARTICLE-SIZE (* VERTICAL-SPLIT HORIZONTAL-SPLIT))&lt;br /&gt;
(define particles (for/vector ([i (in-range PARTICLE-SIZE)])&lt;br /&gt;
                    (make-vector 3)))&lt;br /&gt;
&lt;br /&gt;
;; from scheme.com since normal scheme lacks for/vector&lt;br /&gt;
(define make-matrix&lt;br /&gt;
  (lambda (rows columns)&lt;br /&gt;
    (do ((m (make-vector rows))&lt;br /&gt;
         (i 0 (+ i 1)))&lt;br /&gt;
        ((= i rows) m)&lt;br /&gt;
        (vector-set! m i (make-vector columns)))))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(define (to-&amp;gt;deg rad)&lt;br /&gt;
  (* rad (/ 180 π)))&lt;br /&gt;
&lt;br /&gt;
(define (print-dots amount)&lt;br /&gt;
  (let myloop ((count 0))&lt;br /&gt;
    (if (&amp;gt;= count amount)&lt;br /&gt;
        &#039;()&lt;br /&gt;
        (begin&lt;br /&gt;
        (println count)&lt;br /&gt;
        (myloop (+ count 1))))))&lt;br /&gt;
&lt;br /&gt;
(define (generate-xyz radius θ ϕ)&lt;br /&gt;
  (let* ([x (* radius (sin θ) (cos ϕ))]&lt;br /&gt;
         [y (* radius (sin θ) (sin ϕ))]&lt;br /&gt;
         [z (* radius (cos θ))]&lt;br /&gt;
         )&lt;br /&gt;
  (vector x y z)))&lt;br /&gt;
&lt;br /&gt;
(define (test-loop amount)&lt;br /&gt;
  (let loop ((count 0))&lt;br /&gt;
    (if (&amp;gt;= count amount)&lt;br /&gt;
        &#039;()&lt;br /&gt;
        (begin&lt;br /&gt;
        (println count)&lt;br /&gt;
        (loop (+ count 1))))))&lt;br /&gt;
&lt;br /&gt;
(define (get-angle index split)&lt;br /&gt;
  (* 2 π index (/ split)))&lt;br /&gt;
&lt;br /&gt;
(define (generate-dots particles)&lt;br /&gt;
  (let* ([index-y -1])&lt;br /&gt;
  (for ([row (in-vector particles)]&lt;br /&gt;
        [index (in-naturals)])&lt;br /&gt;
    (set! index-y (if (= 0 (modulo index HORIZONTAL-SPLIT))&lt;br /&gt;
        (+ index-y 1)&lt;br /&gt;
        index-y))&lt;br /&gt;
    ;(printf &amp;quot; ~a ~a\n&amp;quot; (modulo index HORIZONTAL-SPLIT) index-y)&lt;br /&gt;
    (define new-θ (get-angle (modulo index HORIZONTAL-SPLIT) HORIZONTAL-SPLIT))&lt;br /&gt;
    (define new-ϕ (get-angle (modulo index-y VERTICAL-SPLIT) VERTICAL-SPLIT))&lt;br /&gt;
    (printf &amp;quot; ~a ~a \n&amp;quot; (to-&amp;gt;deg new-θ) (to-&amp;gt;deg new-ϕ))&lt;br /&gt;
    ;;(vector-set! row 0 )&lt;br /&gt;
    (vector-set! particles index (generate-xyz 1.0 new-θ new-ϕ)))))&lt;br /&gt;
&lt;br /&gt;
;;(test-loop HORIZONTAL-SPLIT)&lt;br /&gt;
;;(generate-xyz 1 π (* 2.0 π))&lt;br /&gt;
(generate-dots particles)&lt;br /&gt;
(plot3d (points3d particles))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Version &amp;quot;snurrar själv&amp;quot; =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#lang racket&lt;br /&gt;
(require plot)&lt;br /&gt;
(require racket/gui/base)&lt;br /&gt;
(require racket/pretty)&lt;br /&gt;
;; En pixelboll i racket&lt;br /&gt;
;; Från Buzzern skrivet under påskhelgen&lt;br /&gt;
&lt;br /&gt;
(define π (acos -1))&lt;br /&gt;
(define HEIGHT 600)&lt;br /&gt;
(define WIDTH 800)&lt;br /&gt;
(define VERTICAL-SPLIT 16)&lt;br /&gt;
(define HORIZONTAL-SPLIT 16)&lt;br /&gt;
(define RADIUS 100.0)&lt;br /&gt;
(define PARTICLE-SIZE (* VERTICAL-SPLIT HORIZONTAL-SPLIT))&lt;br /&gt;
(define particles (for/vector ([i (in-range PARTICLE-SIZE)])&lt;br /&gt;
                    (make-vector 3)))&lt;br /&gt;
&lt;br /&gt;
;; from scheme.com since normal scheme lacks for/vector&lt;br /&gt;
(define make-matrix&lt;br /&gt;
  (lambda (rows columns)&lt;br /&gt;
    (do ((m (make-vector rows))&lt;br /&gt;
         (i 0 (+ i 1)))&lt;br /&gt;
      ((= i rows) m)&lt;br /&gt;
      (vector-set! m i (make-vector columns)))))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(define (to-&amp;gt;deg rad)&lt;br /&gt;
  (* rad (/ 180 π)))&lt;br /&gt;
&lt;br /&gt;
(define (to-&amp;gt;rad deg)&lt;br /&gt;
  (/ (* deg π) 180 ))&lt;br /&gt;
&lt;br /&gt;
(define (print-dots amount)&lt;br /&gt;
  (let myloop ((count 0))&lt;br /&gt;
    (if (&amp;gt;= count amount)&lt;br /&gt;
        &#039;()&lt;br /&gt;
        (begin&lt;br /&gt;
          (println count)&lt;br /&gt;
          (myloop (+ count 1))))))&lt;br /&gt;
&lt;br /&gt;
(define (generate-xyz radius θ ϕ)&lt;br /&gt;
  (let* ([x (* radius (sin θ) (cos ϕ))]&lt;br /&gt;
         [y (* radius (sin θ) (sin ϕ))]&lt;br /&gt;
         [z (* radius (cos θ))]&lt;br /&gt;
         )&lt;br /&gt;
    (vector x y z)))&lt;br /&gt;
&lt;br /&gt;
(define (projection x y z width height)&lt;br /&gt;
  (let* ([camera-distance 300.0]  ; Push the object away from the camera&lt;br /&gt;
         [scale-factor 250.0]     ; Keep the object visible after pushing it back         &lt;br /&gt;
         ; Translate Z away from the viewer&lt;br /&gt;
         [z-translated (+ z camera-distance)]         &lt;br /&gt;
         ; Prevent divide-by-zero (just in case a point hits exactly 0)&lt;br /&gt;
         [z-safe (if (= z-translated 0.0) 0.001 z-translated)]&lt;br /&gt;
         &lt;br /&gt;
         ; Perspective projection with scaling&lt;br /&gt;
         [xp (* x (/ scale-factor z-safe))]&lt;br /&gt;
         [yp (* y (/ scale-factor z-safe))])&lt;br /&gt;
    ;over to screen coords&lt;br /&gt;
    (vector (+ xp (/ width 2.0)) (+ (/ height 2.0) yp))&lt;br /&gt;
    ))&lt;br /&gt;
    &lt;br /&gt;
(define (get-angle index split)&lt;br /&gt;
  (* 2 π index (/ split)))&lt;br /&gt;
&lt;br /&gt;
(define (generate-dots particles)&lt;br /&gt;
  (let* ([index-y -1])&lt;br /&gt;
    (for ([row (in-vector particles)]&lt;br /&gt;
          [index (in-naturals)])&lt;br /&gt;
      (set! index-y (if (= 0 (modulo index HORIZONTAL-SPLIT))&lt;br /&gt;
                        (+ index-y 1)&lt;br /&gt;
                        index-y))&lt;br /&gt;
      (define new-θ (get-angle (modulo index HORIZONTAL-SPLIT) HORIZONTAL-SPLIT))&lt;br /&gt;
      (define new-ϕ (get-angle (modulo index-y VERTICAL-SPLIT) VERTICAL-SPLIT))&lt;br /&gt;
      (vector-set! particles index (generate-xyz RADIUS new-θ new-ϕ)))))&lt;br /&gt;
&lt;br /&gt;
(define (rotateX x y z angle)&lt;br /&gt;
  (let ([y-new (-(* y (cos angle)) (* z (sin angle)))]&lt;br /&gt;
        [z-new (+ (* y (sin angle)) (* z (cos angle)))])&lt;br /&gt;
    (vector x y-new z-new)))&lt;br /&gt;
&lt;br /&gt;
(define (rotateY x y z angle)&lt;br /&gt;
  (let ([x-new (+(* x (cos angle)) (* z (sin angle)))]&lt;br /&gt;
        [z-new (+ (* (- x) (sin angle)) (* z (cos angle)))])&lt;br /&gt;
    (vector x-new y z-new)))&lt;br /&gt;
&lt;br /&gt;
(define angleX 0.1)&lt;br /&gt;
(define angleXspeed 0)&lt;br /&gt;
(define angleY 0.1)&lt;br /&gt;
(define angleYspeed 0)&lt;br /&gt;
&lt;br /&gt;
(define deltaTime (current-milliseconds))&lt;br /&gt;
(define my-pen (new pen% [color &amp;quot;blue&amp;quot;] [width 2]))&lt;br /&gt;
&lt;br /&gt;
(define (paint canvas dc)&lt;br /&gt;
  (send dc clear)&lt;br /&gt;
  (send dc set-pen&lt;br /&gt;
          my-pen)&lt;br /&gt;
  (for ([row (in-vector particles)])&lt;br /&gt;
    (let* ([rotX (rotateX (vector-ref row 0) (vector-ref row 1) (vector-ref row 2) (to-&amp;gt;rad angleXspeed))]&lt;br /&gt;
           [rotY (rotateY (vector-ref rotX 0) (vector-ref rotX 1) (vector-ref rotX 2) (to-&amp;gt;rad angleYspeed))]&lt;br /&gt;
           [xy (projection (vector-ref rotY 0) (vector-ref rotY 1) (vector-ref rotY 2) WIDTH HEIGHT)])&lt;br /&gt;
      (send dc draw-point (vector-ref xy 0) (vector-ref xy 1)))))&lt;br /&gt;
&lt;br /&gt;
(define frame (new frame% [label &amp;quot;Animation&amp;quot;] [width WIDTH] [height HEIGHT]))&lt;br /&gt;
(define canvas (new canvas% [parent frame] [paint-callback paint]))&lt;br /&gt;
&lt;br /&gt;
(generate-dots particles)&lt;br /&gt;
&lt;br /&gt;
(define timer (new timer% [notify-callback&lt;br /&gt;
                           (lambda ()&lt;br /&gt;
                             ;(set! x (add1 x))&lt;br /&gt;
                             (set! deltaTime (- (current-milliseconds) deltaTime))&lt;br /&gt;
                             (set! angleXspeed (* angleX deltaTime))&lt;br /&gt;
                             (set! angleYspeed (* angleY deltaTime))&lt;br /&gt;
                             ;(printf &amp;quot;~a\n&amp;quot; (current-milliseconds))&lt;br /&gt;
                             (send canvas refresh)&lt;br /&gt;
                             ;(send timer start 16)&lt;br /&gt;
                             )]&lt;br /&gt;
                   [interval #f]&lt;br /&gt;
                   [just-once? #f]&lt;br /&gt;
                   ))&lt;br /&gt;
(send frame show #t)&lt;br /&gt;
(send timer start 16) ; ~60 FPS in best case i guess...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Racket/Posits&amp;diff=1868</id>
		<title>Racket/Posits</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Racket/Posits&amp;diff=1868"/>
		<updated>2026-04-24T15:25:19Z</updated>

		<summary type="html">&lt;p&gt;Anders: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Algoritmer]]&lt;br /&gt;
[[category:Programmering]]&lt;br /&gt;
[[category:Racket]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#lang racket&lt;br /&gt;
&lt;br /&gt;
;;;;;&lt;br /&gt;
;; En enkel implementation av Posists eller Unum typ III&lt;br /&gt;
;; i Racket för skojs skull och för att lära sig mer&lt;br /&gt;
;;&lt;br /&gt;
;; Täpp-Anders Sikvall anders@sikvall.se 2026-04-04&lt;br /&gt;
;;&lt;br /&gt;
;; Posit representeras som ett heltal (bitmönster, 0 till 2^n-1).&lt;br /&gt;
;; Parametrar: n = totalt antal bits, es = antal exponent-bits (t.ex. n=16, es=1 för posit16).&lt;br /&gt;
;; Innehåller:&lt;br /&gt;
;;  * Konvertering till/från generiska tal (number-&amp;gt;posit och posit-&amp;gt;number)&lt;br /&gt;
;;  * Addition, subtraktion, multiplikation och division av posits&lt;br /&gt;
;;&lt;br /&gt;
;; Aritmetiken är implementerad via konvertering till reellt tal + operation + tillbaka till posit&lt;br /&gt;
;; (enkel approach som bevarar tapered precision via rounding vid varje steg).&lt;br /&gt;
;; Full bit-exakt aritmetik (alignera regime/exponent etc.) är mer komplex och lämnas som utökning.&lt;br /&gt;
;; Algoritmen för number-&amp;gt;posit är översatt direkt från Gustafsons x2p i &amp;quot;Posits4.pdf&amp;quot;.&lt;br /&gt;
;; posit-&amp;gt;number använder full fält-extraktion (regime, exponent, fraction).&lt;br /&gt;
&lt;br /&gt;
(define (number-&amp;gt;posit x n es)&lt;br /&gt;
  ;; x2p-algoritmen från Gustafson (översatt till Racket)&lt;br /&gt;
  ;; Returnerar posit-bitmönster som heltal.&lt;br /&gt;
  (cond&lt;br /&gt;
    [(= x 0) 0]&lt;br /&gt;
    [(infinite? x) (arithmetic-shift 1 (- n 1))]&lt;br /&gt;
    [else&lt;br /&gt;
     (let* ([nbits n]&lt;br /&gt;
            [npat (expt 2 nbits)]&lt;br /&gt;
            [useed (expt 2 (expt 2 es))]&lt;br /&gt;
            [y (abs x)]&lt;br /&gt;
            [p 0]&lt;br /&gt;
            [i 0]&lt;br /&gt;
            [e-val (- (expt 2 es) 1)])&lt;br /&gt;
       ;; Northeast/southeast quadrant (regime-byggnad)&lt;br /&gt;
       (if (&amp;gt;= y 1)&lt;br /&gt;
           (begin&lt;br /&gt;
             (set! p 1)&lt;br /&gt;
             (set! i 2)&lt;br /&gt;
             (let loop-regime ()&lt;br /&gt;
               (when (and (&amp;gt;= y useed) (&amp;lt; i nbits))&lt;br /&gt;
                 (set! p (+ (* 2 p) 1))&lt;br /&gt;
                 (set! y (/ y useed))&lt;br /&gt;
                 (set! i (add1 i))&lt;br /&gt;
                 (loop-regime)))&lt;br /&gt;
             (set! p (* 2 p))&lt;br /&gt;
             (set! i (add1 i)))&lt;br /&gt;
           (begin&lt;br /&gt;
             (set! p 0)&lt;br /&gt;
             (set! i 1)&lt;br /&gt;
             (let loop-regime ()&lt;br /&gt;
               (when (and (&amp;lt; y 1) (&amp;lt;= i nbits))&lt;br /&gt;
                 (set! y (* y useed))&lt;br /&gt;
                 (set! i (add1 i))&lt;br /&gt;
                 (loop-regime)))&lt;br /&gt;
             (if (&amp;gt;= i nbits)&lt;br /&gt;
                 (begin&lt;br /&gt;
                   (set! p 2)&lt;br /&gt;
                   (set! i (add1 nbits)))&lt;br /&gt;
                 (begin&lt;br /&gt;
                   (set! p 1)&lt;br /&gt;
                   (set! i (add1 i))))))&lt;br /&gt;
       ;; Exponent-extraktion&lt;br /&gt;
       (let loop-exp ()&lt;br /&gt;
         (when (and (&amp;gt; e-val 0.5) (&amp;lt;= i nbits))&lt;br /&gt;
           (set! p (* 2 p))&lt;br /&gt;
           (when (&amp;gt;= y (expt 2 e-val))&lt;br /&gt;
             (set! y (/ y (expt 2 e-val)))&lt;br /&gt;
             (set! p (add1 p)))&lt;br /&gt;
           (set! e-val (/ e-val 2))&lt;br /&gt;
           (set! i (add1 i))&lt;br /&gt;
           (loop-exp)))&lt;br /&gt;
       (set! y (- y 1))&lt;br /&gt;
       ;; Fraction-bits&lt;br /&gt;
       (let loop-frac ()&lt;br /&gt;
         (when (and (&amp;gt; y 0) (&amp;lt;= i nbits))&lt;br /&gt;
           (set! y (* 2 y))&lt;br /&gt;
           (set! p (+ (* 2 p) (floor y)))&lt;br /&gt;
           (set! y (- y (floor y)))&lt;br /&gt;
           (set! i (add1 i))&lt;br /&gt;
           (loop-frac)))&lt;br /&gt;
       ;; Skift och rounding (nearest, tie to even)&lt;br /&gt;
       (set! p (* p (expt 2 (- (+ nbits 1) i))))&lt;br /&gt;
       (set! i (add1 i))&lt;br /&gt;
       (let* ([round-bit (bitwise-and p 1)])&lt;br /&gt;
         (set! p (floor (/ p 2)))&lt;br /&gt;
         (set! p (cond&lt;br /&gt;
                   [(= round-bit 0) p]&lt;br /&gt;
                   [(= y 0) (+ p (bitwise-and p 1))]  ;; tie to even&lt;br /&gt;
                   [else (add1 p)])))&lt;br /&gt;
       ;; Negativt tal: 2&#039;s complement (npat - p)&lt;br /&gt;
       (set! p (modulo (if (&amp;lt; x 0) (- npat p) p) npat))&lt;br /&gt;
       p)]))&lt;br /&gt;
&lt;br /&gt;
(define (posit-&amp;gt;number p n es)&lt;br /&gt;
  ;; Full decode enligt Gustafson/Unum Type III&lt;br /&gt;
  ;; Returnerar exakt reellt tal (flonum för enkelhet, men kan utökas till rational).&lt;br /&gt;
  (cond&lt;br /&gt;
    [(= p 0) 0]&lt;br /&gt;
    [(= p (arithmetic-shift 1 (- n 1))) +inf.0]  ;; NaR / ∞&lt;br /&gt;
    [else&lt;br /&gt;
     (let* ([sign (if (zero? (bitwise-and p (arithmetic-shift 1 (- n 1)))) 1 -1)]&lt;br /&gt;
            [abs-p (if (= sign 1)&lt;br /&gt;
                       p&lt;br /&gt;
                       (bitwise-and (+ (bitwise-not p) 1) (- (expt 2 n) 1)))]&lt;br /&gt;
            [useed (expt 2 (expt 2 es))])&lt;br /&gt;
       ;; Extrahera regime (runlength m av identiska bits)&lt;br /&gt;
       (let*-values ([(r m) (let ([first-r (bitwise-and (arithmetic-shift abs-p (- (- n 2))) 1)])&lt;br /&gt;
                              (let loop ([pos (- n 2)]&lt;br /&gt;
                                         [m 0])&lt;br /&gt;
                                (if (or (&amp;lt; pos -1) (&amp;gt; m n))&lt;br /&gt;
                                    (values first-r m)&lt;br /&gt;
                                    (let ([bit (bitwise-and (arithmetic-shift abs-p (- pos)) 1)])&lt;br /&gt;
                                      (if (= bit first-r)&lt;br /&gt;
                                          (loop (sub1 pos) (add1 m))&lt;br /&gt;
                                          (values first-r m))))))])&lt;br /&gt;
         (let* ([k (if (= r 0) (- m) (- m 1))]&lt;br /&gt;
                ;; Regime-field tar m + 1 bits (run + terminator)&lt;br /&gt;
                [regime-bits-used (+ m 1)]&lt;br /&gt;
                [exp-start-pos (- (- n 2) regime-bits-used)]  ;; första exp-bit (MSB)&lt;br /&gt;
                ;; Ta upp till es exp-bits (pad low bits med 0 om färre)&lt;br /&gt;
                [exp-bits (if (&amp;lt; exp-start-pos 0)&lt;br /&gt;
                              0&lt;br /&gt;
                              (let loop ([pos exp-start-pos]&lt;br /&gt;
                                         [bits-left es]&lt;br /&gt;
                                         [e-acc 0])&lt;br /&gt;
                                (if (or (&amp;lt;= bits-left 0) (&amp;lt; pos -1))&lt;br /&gt;
                                    e-acc&lt;br /&gt;
                                    (let ([bit (bitwise-and (arithmetic-shift abs-p (- pos)) 1)])&lt;br /&gt;
                                      (loop (sub1 pos)&lt;br /&gt;
                                            (sub1 bits-left)&lt;br /&gt;
                                            (+ (* e-acc 2) bit))))))]&lt;br /&gt;
                [exp-used (min es (max 0 (+ (- n 1) exp-start-pos)))]  ;; tillgängliga bits&lt;br /&gt;
                [f-start-pos (- exp-start-pos exp-used)]&lt;br /&gt;
                ;; Fraction (remaining bits, hidden 1.)&lt;br /&gt;
                [f (if (&amp;lt; f-start-pos 0)&lt;br /&gt;
                       0&lt;br /&gt;
                       (let loop ([pos f-start-pos]&lt;br /&gt;
                                  [f-acc 0]&lt;br /&gt;
                                  [fsize 0])&lt;br /&gt;
                         (if (&amp;lt; pos -1)&lt;br /&gt;
                             f-acc&lt;br /&gt;
                             (let ([bit (bitwise-and (arithmetic-shift abs-p (- pos)) 1)])&lt;br /&gt;
                               (loop (sub1 pos)&lt;br /&gt;
                                     (+ (* f-acc 2) bit)&lt;br /&gt;
                                     (add1 fsize))))))]&lt;br /&gt;
                [fsize (max 0 (- n 1 regime-bits-used exp-used))]  ;; antal fraction-bits&lt;br /&gt;
                [significand (+ 1 (/ f (expt 2 fsize)))])&lt;br /&gt;
           (* sign (expt useed k) (expt 2 exp-bits) significand))))]))&lt;br /&gt;
&lt;br /&gt;
;; Aritmetik (enkel via realtal + rounding till posit)&lt;br /&gt;
(define (posit+ p1 p2 n es)&lt;br /&gt;
  (number-&amp;gt;posit (+ (posit-&amp;gt;number p1 n es) (posit-&amp;gt;number p2 n es)) n es))&lt;br /&gt;
&lt;br /&gt;
(define (posit- p1 p2 n es)&lt;br /&gt;
  (number-&amp;gt;posit (- (posit-&amp;gt;number p1 n es) (posit-&amp;gt;number p2 n es)) n es))&lt;br /&gt;
&lt;br /&gt;
(define (posit* p1 p2 n es)&lt;br /&gt;
  (number-&amp;gt;posit (* (posit-&amp;gt;number p1 n es) (posit-&amp;gt;number p2 n es)) n es))&lt;br /&gt;
&lt;br /&gt;
(define (posit/ p1 p2 n es)&lt;br /&gt;
  (number-&amp;gt;posit (/ (posit-&amp;gt;number p1 n es) (posit-&amp;gt;number p2 n es)) n es))&lt;br /&gt;
&lt;br /&gt;
;; Exempel på användning (kommentera bort eller kör i REPL):&lt;br /&gt;
;; (define n 16)&lt;br /&gt;
;; (define es 1)&lt;br /&gt;
;; (define a (number-&amp;gt;posit 3.14 n es))   ;; -&amp;gt; posit för 3.14&lt;br /&gt;
;; (define b (number-&amp;gt;posit 2.0 n es))&lt;br /&gt;
;; (posit+ a b n es)                      ;; addition&lt;br /&gt;
;; (posit-&amp;gt;number a n es)                 ;; tillbaka till tal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Racket/Neural&amp;diff=1867</id>
		<title>Racket/Neural</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Racket/Neural&amp;diff=1867"/>
		<updated>2026-04-24T15:25:12Z</updated>

		<summary type="html">&lt;p&gt;Anders: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Algoritmer]]&lt;br /&gt;
[[category:Programmering]]&lt;br /&gt;
[[category:Racket]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#lang racket&lt;br /&gt;
&lt;br /&gt;
;;;;;&lt;br /&gt;
;; Neuralt nät implementerad i Racket&lt;br /&gt;
;; Täpp-Anders Sikvall 2026-04-03 anders@sikvall.se&lt;br /&gt;
;;;;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;;;;; NEURALT NÄT&lt;br /&gt;
;;;&lt;br /&gt;
;; Detta program implementerar ett litet neuralt nät och tränar det på sannings-&lt;br /&gt;
;; tabellen för XOR. Efter några tusen epoker ska prediktionerna ligga extremt nära&lt;br /&gt;
;; följande:&lt;br /&gt;
;;&lt;br /&gt;
;; a,b → a XOR b&lt;br /&gt;
;; 0,0 →    0&lt;br /&gt;
;; 0,1 →    1&lt;br /&gt;
;; 1,0 →    1&lt;br /&gt;
;; 1,1 →    0&lt;br /&gt;
;;&lt;br /&gt;
;; Implementationen har två input-neuroner för a och b&lt;br /&gt;
;; det finns 5 interna (dolda neuroner) som tränas av indatat&lt;br /&gt;
;; det finns 1 output-neuron som ger svaret&lt;br /&gt;
;;&lt;br /&gt;
;;;;; Kodens uppbyggnad och de olika funktionernas användning&lt;br /&gt;
;;&lt;br /&gt;
;; sigmoid, sigmoid-deriv      Sigmoid-kurva och derivata för backpropagation&lt;br /&gt;
;;&lt;br /&gt;
;; random-matrix, met-vec-mul  Grundläggande linalg&lt;br /&gt;
;; outer-product; vec-add&lt;br /&gt;
;;&lt;br /&gt;
;; struct nn                   Nätverksstruktur, lagrar vikter och bias&lt;br /&gt;
;;&lt;br /&gt;
;; forward                     Beräknar prediktion&lt;br /&gt;
;;&lt;br /&gt;
;; train-step                  En iteration av backpropagation&lt;br /&gt;
;;&lt;br /&gt;
;; train                       Kör många epoker av in och förväntat utdata för&lt;br /&gt;
;;                             att träna modellen&lt;br /&gt;
;;&lt;br /&gt;
;; predict                     Använder nätverket på ny data!&lt;br /&gt;
;;&lt;br /&gt;
;;&lt;br /&gt;
;;;;; Viktiga delar&lt;br /&gt;
;;&lt;br /&gt;
;; * sigmoid mappar alla värden steglöst till intervallet (0,1)&lt;br /&gt;
;; * derivatan används i backpropagation för att räkna ut gradienten&lt;br /&gt;
;;&lt;br /&gt;
;; w1: vikter mellan input och hidden layer (5x2 matris)&lt;br /&gt;
;; b1: bias för hidden layer (5-vektor)&lt;br /&gt;
;; w2: viktar mellan hidden och output (1x5 matris)&lt;br /&gt;
;; b2: bias för output (1-vektor)&lt;br /&gt;
;;&lt;br /&gt;
;; Forward pass&lt;br /&gt;
;;&lt;br /&gt;
;; 1. Beräkna aktivering i hidden layer&lt;br /&gt;
;;    z1 = W1 * input + b1&lt;br /&gt;
;;    h = rho z1&lt;br /&gt;
;; 2. Beräkna output&lt;br /&gt;
;;    z2 = W2 * h +b2&lt;br /&gt;
;;    output = rho(z2)&lt;br /&gt;
;;&lt;br /&gt;
;; Backpropagation (uppdatering av viktningen)&lt;br /&gt;
;;&lt;br /&gt;
;; Hjärtat i träningen av ett neuralt nät. Algorimen är &amp;quot;gradient descent&amp;quot; med batch-&lt;br /&gt;
;; storlek 1.&lt;br /&gt;
;;&lt;br /&gt;
;; 1. Forward pass hidden → output&lt;br /&gt;
;; 2. Output-felet&lt;br /&gt;
;;    delta = (output - target) X rho&#039; (output)&lt;br /&gt;
;; 3. Hidden-felet&lt;br /&gt;
;;    delta hidden = (W2/T * delta out) X rho&#039; (hidden)&lt;br /&gt;
;; 4. Uppdatera vikternas gradienter&lt;br /&gt;
;;    W2 ← W2 - nabla * delta out * h^T&lt;br /&gt;
;;    W1 ← W1 - nabla * delta hidden * input^T&lt;br /&gt;
;; 5. Bias uppdateras på samma sätt (jo det är en genväg)&lt;br /&gt;
;;&lt;br /&gt;
&lt;br /&gt;
(require math/base)&lt;br /&gt;
&lt;br /&gt;
;; ========================================&lt;br /&gt;
;; Aktiveringsfunktioner&lt;br /&gt;
;; ========================================&lt;br /&gt;
(define (sigmoid x)&lt;br /&gt;
  (/ 1.0 (+ 1.0 (exp (- x)))))&lt;br /&gt;
&lt;br /&gt;
(define (sigmoid-deriv y)   ; y måste redan vara sigmoid(x)&lt;br /&gt;
  (* y (- 1.0 y)))&lt;br /&gt;
&lt;br /&gt;
;; ========================================&lt;br /&gt;
;; Matris-/vektorhjälp (enkel version)&lt;br /&gt;
;; ========================================&lt;br /&gt;
(define (random-matrix rows cols)&lt;br /&gt;
  (build-vector rows&lt;br /&gt;
                (λ (_) (build-vector cols (λ (_) (- (* 2.0 (random)) 1.0))))))&lt;br /&gt;
&lt;br /&gt;
(define (vec-add v1 v2)     ; elementvis addition av två vektorer&lt;br /&gt;
  (build-vector (vector-length v1)&lt;br /&gt;
                (λ (i) (+ (vector-ref v1 i) (vector-ref v2 i)))))&lt;br /&gt;
&lt;br /&gt;
(define (scalar-mul s v)&lt;br /&gt;
  (build-vector (vector-length v) (λ (i) (* s (vector-ref v i)))))&lt;br /&gt;
&lt;br /&gt;
(define (outer-product v1 v2)   ; v1 kolumn × v2 rad → matris&lt;br /&gt;
  (build-vector (vector-length v1)&lt;br /&gt;
                (λ (i)&lt;br /&gt;
                  (build-vector (vector-length v2)&lt;br /&gt;
                                (λ (j) (* (vector-ref v1 i) (vector-ref v2 j)))))))&lt;br /&gt;
&lt;br /&gt;
(define (mat-vec-mul M v)       ; M (rows×cols) × v (cols)&lt;br /&gt;
  (build-vector (vector-length M)&lt;br /&gt;
                (λ (i)&lt;br /&gt;
                  (for/sum ([j (in-range (vector-length v))])&lt;br /&gt;
                    (* (vector-ref (vector-ref M i) j)&lt;br /&gt;
                       (vector-ref v j))))))&lt;br /&gt;
&lt;br /&gt;
(define (transpose M)&lt;br /&gt;
  (build-vector (vector-length (vector-ref M 0))&lt;br /&gt;
                (λ (j)&lt;br /&gt;
                  (build-vector (vector-length M)&lt;br /&gt;
                                (λ (i) (vector-ref (vector-ref M i) j))))))&lt;br /&gt;
&lt;br /&gt;
;; ========================================&lt;br /&gt;
;; Neuralt nätverk&lt;br /&gt;
;; ========================================&lt;br /&gt;
(struct nn (w1 b1 w2 b2) #:transparent)&lt;br /&gt;
&lt;br /&gt;
(define (make-nn in-size hidden-size out-size)&lt;br /&gt;
  (nn (random-matrix hidden-size in-size)&lt;br /&gt;
      (make-vector hidden-size 0.0)&lt;br /&gt;
      (random-matrix out-size hidden-size)&lt;br /&gt;
      (make-vector out-size 0.0)))&lt;br /&gt;
&lt;br /&gt;
(define (forward net input)          ; input är en vektor t.ex. #(0 0)&lt;br /&gt;
  (let* ([z1 (vec-add (mat-vec-mul (nn-w1 net) input)&lt;br /&gt;
                      (nn-b1 net))]&lt;br /&gt;
         [h  (build-vector (vector-length z1) (λ (i) (sigmoid (vector-ref z1 i))))]&lt;br /&gt;
         [z2 (vec-add (mat-vec-mul (nn-w2 net) h)&lt;br /&gt;
                      (nn-b2 net))]&lt;br /&gt;
         [o  (build-vector (vector-length z2) (λ (i) (sigmoid (vector-ref z2 i))))])&lt;br /&gt;
    (values o h)))&lt;br /&gt;
&lt;br /&gt;
(define (train-step net input target lr)&lt;br /&gt;
  (let-values ([(output hidden) (forward net input)])&lt;br /&gt;
    (let* ([out-err (build-vector (vector-length output)&lt;br /&gt;
                                  (λ (i) (- (vector-ref output i)&lt;br /&gt;
                                            (vector-ref target i))))]&lt;br /&gt;
           [out-delta (build-vector (vector-length output)&lt;br /&gt;
                                    (λ (i) (* (vector-ref out-err i)&lt;br /&gt;
                                              (sigmoid-deriv (vector-ref output i)))))]&lt;br /&gt;
&lt;br /&gt;
           [hidden-err (mat-vec-mul (transpose (nn-w2 net)) out-delta)]&lt;br /&gt;
           [hidden-delta (build-vector (vector-length hidden)&lt;br /&gt;
                                       (λ (i) (* (vector-ref hidden-err i)&lt;br /&gt;
                                                 (sigmoid-deriv (vector-ref hidden i)))))]&lt;br /&gt;
&lt;br /&gt;
           ;; Uppdateringar&lt;br /&gt;
           [dw2 (outer-product out-delta hidden)]&lt;br /&gt;
           [new-w2 (build-vector (vector-length (nn-w2 net))&lt;br /&gt;
                                 (λ (i)&lt;br /&gt;
                                   (build-vector (vector-length (vector-ref (nn-w2 net) i))&lt;br /&gt;
                                                 (λ (j) (- (vector-ref (vector-ref (nn-w2 net) i) j)&lt;br /&gt;
                                                           (* lr (vector-ref (vector-ref dw2 i) j)))))))]&lt;br /&gt;
           [new-b2 (build-vector (vector-length (nn-b2 net))&lt;br /&gt;
                                 (λ (i) (- (vector-ref (nn-b2 net) i)&lt;br /&gt;
                                           (* lr (vector-ref out-delta i)))))]&lt;br /&gt;
&lt;br /&gt;
           [dw1 (outer-product hidden-delta input)]&lt;br /&gt;
           [new-w1 (build-vector (vector-length (nn-w1 net))&lt;br /&gt;
                                 (λ (i)&lt;br /&gt;
                                   (build-vector (vector-length (vector-ref (nn-w1 net) i))&lt;br /&gt;
                                                 (λ (j) (- (vector-ref (vector-ref (nn-w1 net) i) j)&lt;br /&gt;
                                                           (* lr (vector-ref (vector-ref dw1 i) j)))))))]&lt;br /&gt;
           [new-b1 (build-vector (vector-length (nn-b1 net))&lt;br /&gt;
                                 (λ (i) (- (vector-ref (nn-b1 net) i)&lt;br /&gt;
                                           (* lr (vector-ref hidden-delta i)))))])&lt;br /&gt;
&lt;br /&gt;
      (nn new-w1 new-b1 new-w2 new-b2))))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;; ========================================&lt;br /&gt;
;; Skriv ut vikter och bias – snygg tabell (fixad version)&lt;br /&gt;
;; ========================================&lt;br /&gt;
(define (print-nn net)&lt;br /&gt;
  (printf &amp;quot;\n=== NEURALT NÄTVERK - VIKTER OCH BIAS ===\n\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
  ;; Hjälpfunktion för att formatera tal snyggt (med minustecken på rätt plats)&lt;br /&gt;
  (define (fmt x)&lt;br /&gt;
    (~r x &lt;br /&gt;
        #:min-width 10 &lt;br /&gt;
        #:precision &#039;(= 4)&lt;br /&gt;
        #:sign #f))          ; #f = visa minus för negativa, inget tecken för positiva&lt;br /&gt;
&lt;br /&gt;
  ;; W1: Vikter från input till hidden (5×2)&lt;br /&gt;
  (printf &amp;quot;W1 (Hidden × Input):\n&amp;quot;)&lt;br /&gt;
  (printf &amp;quot;          Input0      Input1\n&amp;quot;)&lt;br /&gt;
  (for ([i (in-range (vector-length (nn-w1 net)))])&lt;br /&gt;
    (printf &amp;quot;Hidden~a  &amp;quot; i)&lt;br /&gt;
    (for ([j (in-range 2)])&lt;br /&gt;
      (printf &amp;quot;~a  &amp;quot; (fmt (vector-ref (vector-ref (nn-w1 net) i) j))))&lt;br /&gt;
    (printf &amp;quot;\n&amp;quot;))&lt;br /&gt;
  (printf &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
  ;; b1: Bias för hidden layer&lt;br /&gt;
  (printf &amp;quot;b1 (Bias hidden layer):\n&amp;quot;)&lt;br /&gt;
  (for ([i (in-range (vector-length (nn-b1 net)))])&lt;br /&gt;
    (printf &amp;quot;~a  &amp;quot; (fmt (vector-ref (nn-b1 net) i))))&lt;br /&gt;
  (printf &amp;quot;\n\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
  ;; W2: Vikter från hidden till output (1×5)&lt;br /&gt;
  (printf &amp;quot;W2 (Output × Hidden):\n&amp;quot;)&lt;br /&gt;
  (printf &amp;quot;         Hidden0     Hidden1     Hidden2     Hidden3     Hidden4\n&amp;quot;)&lt;br /&gt;
  (printf &amp;quot;Output   &amp;quot;)&lt;br /&gt;
  (for ([j (in-range 5)])&lt;br /&gt;
    (printf &amp;quot;~a  &amp;quot; (fmt (vector-ref (vector-ref (nn-w2 net) 0) j))))&lt;br /&gt;
  (printf &amp;quot;\n\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
  ;; b2: Bias för output&lt;br /&gt;
  (printf &amp;quot;b2 (Bias output):\n&amp;quot;)&lt;br /&gt;
  (printf &amp;quot;~a\n&amp;quot; (fmt (vector-ref (nn-b2 net) 0)))&lt;br /&gt;
&lt;br /&gt;
  (printf &amp;quot;\n========================================\n&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;; Träna nätverket&lt;br /&gt;
(define (train net data epochs lr)&lt;br /&gt;
  (for ([ep (in-range epochs)])&lt;br /&gt;
    (for ([sample data])&lt;br /&gt;
      (set! net (train-step net (car sample) (cadr sample) lr)))&lt;br /&gt;
    &lt;br /&gt;
    (when (zero? (modulo ep 500))      ; oftare än var 1000:e&lt;br /&gt;
      (let ([loss (for/sum ([sample data])&lt;br /&gt;
                    (let-values ([(output _) (forward net (car sample))])&lt;br /&gt;
                      (let ([target (vector-ref (cadr sample) 0)]&lt;br /&gt;
                            [pred   (vector-ref output 0)])&lt;br /&gt;
                        (sqr (- target pred)))))])&lt;br /&gt;
        (printf &amp;quot;Epoch ~a  Loss: ~a\n&amp;quot; ep (/ loss (length data))))))&lt;br /&gt;
  (print-nn net)&lt;br /&gt;
  net)&lt;br /&gt;
&lt;br /&gt;
;; Prediktera&lt;br /&gt;
(define (predict net input)&lt;br /&gt;
  (let-values ([(output _) (forward net input)])&lt;br /&gt;
    output))&lt;br /&gt;
&lt;br /&gt;
;; ========================================&lt;br /&gt;
;; XOR-exempel&lt;br /&gt;
;; ========================================&lt;br /&gt;
(define xor-data&lt;br /&gt;
  (list (list #(0 0) #(0))&lt;br /&gt;
        (list #(0 1) #(1))&lt;br /&gt;
        (list #(1 0) #(1))&lt;br /&gt;
        (list #(1 1) #(0))))&lt;br /&gt;
&lt;br /&gt;
(define net (make-nn 2 5 1))   ; 2 input, 5 dolda neuroner, 1 output&lt;br /&gt;
(define rounds 8000) ; 2000 är i minsta laget, 5000 eller hellre 8000 är bättre&lt;br /&gt;
(define backpr 0.7)&lt;br /&gt;
(printf &amp;quot;Tränar XOR-problemet i ~a rundor med backprop styrka ~a\n&amp;quot; rounds backpr)&lt;br /&gt;
(set! net (train net xor-data rounds backpr))&lt;br /&gt;
&lt;br /&gt;
(printf &amp;quot;\n=== Testresultat ===\n&amp;quot;)&lt;br /&gt;
(for ([sample xor-data])&lt;br /&gt;
  (let ([pred (vector-ref (predict net (car sample)) 0)])&lt;br /&gt;
    (printf &amp;quot;Input ~a  →  Förväntat: ~a  Predikterat: ~a\n&amp;quot;&lt;br /&gt;
            (car sample)&lt;br /&gt;
            (vector-ref (cadr sample) 0)&lt;br /&gt;
            (if (&amp;gt; pred 0.5) 1.0 0.0))))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Racket/Markov&amp;diff=1866</id>
		<title>Racket/Markov</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Racket/Markov&amp;diff=1866"/>
		<updated>2026-04-24T15:25:02Z</updated>

		<summary type="html">&lt;p&gt;Anders: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Algoritmer]]&lt;br /&gt;
[[category:Programmering]]&lt;br /&gt;
[[category:Racket]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Markovkedja av 1:a ordningen = &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#lang racket&lt;br /&gt;
&lt;br /&gt;
;;;;;&lt;br /&gt;
;; Markovkedja av förstaordningen&lt;br /&gt;
;;&lt;br /&gt;
;; Tar en textfil eller stdin och bygger statistik över orden i tre gram&lt;br /&gt;
;; därefter producerar den en 150 ord lång text baserad på den statistiken&lt;br /&gt;
;;&lt;br /&gt;
;; Täpp-Anders Sikvall, anders@sikvall.se, 2026-04-07&lt;br /&gt;
;;;;;&lt;br /&gt;
&lt;br /&gt;
(require racket/string&lt;br /&gt;
         racket/port)&lt;br /&gt;
&lt;br /&gt;
;; ================================================&lt;br /&gt;
;; MARKOVKEDJA I RACKET – textinläsning → träning → textgenerering&lt;br /&gt;
;; ================================================&lt;br /&gt;
&lt;br /&gt;
;; Bygger en första-ordnings Markovkedja (ord → nästa-ord med vikter)&lt;br /&gt;
;; Texten splittas på whitespace. Punktuation behålls som del av orden&lt;br /&gt;
;; (vill du ha renare hantering kan du utöka med regexp senare).&lt;br /&gt;
(define (bygg-markov text)&lt;br /&gt;
  (let ([ord-lista (string-split text)])&lt;br /&gt;
    (define transitions (make-hash))&lt;br /&gt;
    (for ([i (in-range 0 (sub1 (length ord-lista)))])&lt;br /&gt;
      (let* ([nuvarande (list-ref ord-lista i)]&lt;br /&gt;
             [nästa     (list-ref ord-lista (add1 i))])&lt;br /&gt;
        ;; Skapa eller hämta inner-hash för nästa ord&lt;br /&gt;
        (let ([nästa-hash (hash-ref! transitions nuvarande (λ () (make-hash)))])&lt;br /&gt;
          (hash-update! nästa-hash nästa add1 0))))&lt;br /&gt;
    transitions))&lt;br /&gt;
&lt;br /&gt;
;; Väljer nästa ord med korrekt viktning (roulette wheel / weighted random)&lt;br /&gt;
(define (viktad-slump nästa-hash)&lt;br /&gt;
  (let* ([par   (hash-&amp;gt;list nästa-hash)]&lt;br /&gt;
         [total (apply + (map cdr par))])&lt;br /&gt;
    (if (zero? total)&lt;br /&gt;
        #f                                      ; ingen fortsättning finns&lt;br /&gt;
        (let ([rand-val (random total)])&lt;br /&gt;
          (let loop ([lst par]&lt;br /&gt;
                     [acc 0])&lt;br /&gt;
            (let* ([pair (car lst)]&lt;br /&gt;
                   [key  (car pair)]&lt;br /&gt;
                   [cnt  (cdr pair)])&lt;br /&gt;
              (if (&amp;lt; rand-val (+ acc cnt))&lt;br /&gt;
                  key&lt;br /&gt;
                  (loop (cdr lst) (+ acc cnt)))))))))&lt;br /&gt;
&lt;br /&gt;
;; Genererar ny text med angivet antal ord&lt;br /&gt;
(define (generera-text transitions start-ord antal-ord)&lt;br /&gt;
  (let loop ([nuvarande start-ord]&lt;br /&gt;
             [resultat  (list start-ord)]&lt;br /&gt;
             [kvar      (sub1 antal-ord)])&lt;br /&gt;
    (if (&amp;lt;= kvar 0)&lt;br /&gt;
        (string-join (reverse resultat) &amp;quot; &amp;quot;)&lt;br /&gt;
        (let* ([nästa-hash (hash-ref transitions nuvarande (make-hash))]&lt;br /&gt;
               [nästa      (viktad-slump nästa-hash)])&lt;br /&gt;
          (if (not nästa)&lt;br /&gt;
              (string-join (reverse resultat) &amp;quot; &amp;quot;)   ; kedjan tog slut&lt;br /&gt;
              (loop nästa&lt;br /&gt;
                    (cons nästa resultat)&lt;br /&gt;
                    (sub1 kvar)))))))&lt;br /&gt;
&lt;br /&gt;
;; ================================================&lt;br /&gt;
;; HUVUDPROGRAM – läser från stdin och skriver ut genererad text&lt;br /&gt;
;; ================================================&lt;br /&gt;
&lt;br /&gt;
(define (main)&lt;br /&gt;
  (let* ([input-text (port-&amp;gt;string (current-input-port))]&lt;br /&gt;
         [model      (bygg-markov input-text)])&lt;br /&gt;
    (cond&lt;br /&gt;
      [(hash-empty? model)&lt;br /&gt;
       (displayln &amp;quot;Fel: Ingen text inläst! Mata in text via stdin eller fil.&amp;quot;)]&lt;br /&gt;
      [else&lt;br /&gt;
       ;; Välj ett slumpmässigt startord bland alla ord som förekommer&lt;br /&gt;
       (let* ([alla-start-ord (hash-keys model)]&lt;br /&gt;
              [start-ord      (list-ref alla-start-ord (random (length alla-start-ord)))])&lt;br /&gt;
         (displayln &amp;quot;=== Genererad text (100 ord) ===&amp;quot;)&lt;br /&gt;
         (displayln (generera-text model start-ord 150)))])))&lt;br /&gt;
&lt;br /&gt;
;; Kör programmet direkt när filen exekveras med racket&lt;br /&gt;
(main)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Markovkedja av 3:e ordningen =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#lang racket&lt;br /&gt;
&lt;br /&gt;
;;;;;&lt;br /&gt;
;; Markovkedja av tredje ordningen&lt;br /&gt;
;;&lt;br /&gt;
;; Tar en textfil eller stdin och bygger statistik över orden i tre gram&lt;br /&gt;
;; därefter producerar den en 150 ord lång text baserad på den statistiken&lt;br /&gt;
;;&lt;br /&gt;
;; Täpp-Anders Sikvall, anders@sikvall.se, 2026-04-07&lt;br /&gt;
;;;;;&lt;br /&gt;
&lt;br /&gt;
(require racket/string&lt;br /&gt;
         racket/port)&lt;br /&gt;
&lt;br /&gt;
;; ================================================&lt;br /&gt;
;; MARKOVKEDJA – TREDJE ORDNINGEN (3-gram) &lt;br /&gt;
;; ================================================&lt;br /&gt;
&lt;br /&gt;
;; Skapar alla n-gram&lt;br /&gt;
(define (make-ngrams words n)&lt;br /&gt;
  (for/list ([i (in-range 0 (- (length words) (sub1 n)))])&lt;br /&gt;
    (take (drop words i) n)))&lt;br /&gt;
&lt;br /&gt;
;; Bygger 3:e ordningens Markovmodell – korrekt indexering&lt;br /&gt;
(define (build-markov-3 text)&lt;br /&gt;
  (define words (filter non-empty-string? (string-split text)))&lt;br /&gt;
  (when (&amp;lt; (length words) 4)&lt;br /&gt;
    (error &#039;build-markov-3 &amp;quot;Texten är för kort för 3-gram (minst 4 ord behövs).&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
  (define transitions (make-hash))&lt;br /&gt;
&lt;br /&gt;
  (for ([i (in-range 0 (- (length words) 3))])&lt;br /&gt;
    (let* ([prefix (list (list-ref words i)&lt;br /&gt;
                         (list-ref words (+ i 1))&lt;br /&gt;
                         (list-ref words (+ i 2)))]&lt;br /&gt;
           [next-word (list-ref words (+ i 3))]&lt;br /&gt;
           [freq-hash (hash-ref! transitions prefix (λ () (make-hash)))])&lt;br /&gt;
      (hash-update! freq-hash next-word add1 0)))&lt;br /&gt;
&lt;br /&gt;
  transitions)&lt;br /&gt;
&lt;br /&gt;
;; Viktad slumpmässig val&lt;br /&gt;
(define (weighted-random freq-hash)&lt;br /&gt;
  (define options (hash-&amp;gt;list freq-hash))&lt;br /&gt;
  (define total (apply + (map cdr options)))&lt;br /&gt;
  (if (zero? total)&lt;br /&gt;
      #f&lt;br /&gt;
      (let ([r (random total)])&lt;br /&gt;
        (let loop ([lst options] [acc 0])&lt;br /&gt;
          (match lst&lt;br /&gt;
            [&#039;() #f]&lt;br /&gt;
            [(cons (cons word count) rest)&lt;br /&gt;
             (if (&amp;lt; r (+ acc count))&lt;br /&gt;
                 word&lt;br /&gt;
                 (loop rest (+ acc count)))])))))&lt;br /&gt;
&lt;br /&gt;
;; Genererar text&lt;br /&gt;
(define (generate-text-3 transitions start-prefix num-words)&lt;br /&gt;
  (let loop ([current-prefix start-prefix]&lt;br /&gt;
             [result        (vector-&amp;gt;list (list-&amp;gt;vector start-prefix))]  ; enklare append&lt;br /&gt;
             [remaining     (- num-words 3)])&lt;br /&gt;
    (if (&amp;lt;= remaining 0)&lt;br /&gt;
        (string-join result &amp;quot; &amp;quot;)&lt;br /&gt;
        (let* ([freq-hash (hash-ref transitions current-prefix (make-hash))]&lt;br /&gt;
               [next-word (weighted-random freq-hash)])&lt;br /&gt;
          (if (not next-word)&lt;br /&gt;
              (string-join result &amp;quot; &amp;quot;)&lt;br /&gt;
              (let ([new-prefix (append (cdr current-prefix) (list next-word))])&lt;br /&gt;
                (loop new-prefix&lt;br /&gt;
                      (append result (list next-word))&lt;br /&gt;
                      (sub1 remaining))))))))&lt;br /&gt;
&lt;br /&gt;
;; ================================================&lt;br /&gt;
;; HUVUDPROGRAM&lt;br /&gt;
;; ================================================&lt;br /&gt;
&lt;br /&gt;
(define (main)&lt;br /&gt;
  (let* ([input-text (port-&amp;gt;string (current-input-port))]&lt;br /&gt;
         [words      (filter non-empty-string? (string-split input-text))])&lt;br /&gt;
    (cond&lt;br /&gt;
      [(&amp;lt; (length words) 4)&lt;br /&gt;
       (displayln &amp;quot;Fel: Texten är för kort för 3:e ordningens Markovkedja (minst 4 ord behövs).&amp;quot;)]&lt;br /&gt;
      [else&lt;br /&gt;
       (let* ([model        (build-markov-3 input-text)]&lt;br /&gt;
              [all-prefixes (hash-keys model)]&lt;br /&gt;
              [start-prefix (list-ref all-prefixes (random (length all-prefixes)))])&lt;br /&gt;
         (displayln &amp;quot;=== Genererad text med 3:e ordningens Markovkedja (200 ord) ===&amp;quot;)&lt;br /&gt;
         (displayln (generate-text-3 model start-prefix 150)))])))&lt;br /&gt;
&lt;br /&gt;
(main)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Racket/Genetic&amp;diff=1865</id>
		<title>Racket/Genetic</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Racket/Genetic&amp;diff=1865"/>
		<updated>2026-04-24T15:24:51Z</updated>

		<summary type="html">&lt;p&gt;Anders: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Algoritmer]]&lt;br /&gt;
[[category:Programmering]]&lt;br /&gt;
[[category:Racket]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#lang racket&lt;br /&gt;
&lt;br /&gt;
;;;;;&lt;br /&gt;
;; Genetisk algoritm implementerad i Racket&lt;br /&gt;
;; Täpp-Anders Sikvall 2026-04-03 anders@sikvall.se&lt;br /&gt;
;;;;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;; ================================================================&lt;br /&gt;
;; Genetisk algoritm – Hitta kromosom med:&lt;br /&gt;
;;   1. De första 10 bitarna = 1&lt;br /&gt;
;;   2. Totalt antal 1:or så nära 50 som möjligt&lt;br /&gt;
;; ================================================================&lt;br /&gt;
&lt;br /&gt;
;; --------------------- Parametrar ---------------------&lt;br /&gt;
(define population-size 100)&lt;br /&gt;
(define chromosome-length 200)&lt;br /&gt;
(define generations 5000)&lt;br /&gt;
(define mutation-rate 0.01)&lt;br /&gt;
&lt;br /&gt;
;; --------------------- Hjälpfunktioner ---------------------&lt;br /&gt;
&lt;br /&gt;
;; Skapar en slumpmässig kromosom (lista med 0 och 1)&lt;br /&gt;
(define (random-chromosome)&lt;br /&gt;
  (for/list ([_ (in-range chromosome-length)])&lt;br /&gt;
    (random 2)))&lt;br /&gt;
&lt;br /&gt;
;; Fitness-funktion&lt;br /&gt;
;;   - 1000 poäng om de första 6 bitarna är alla 1:or&lt;br /&gt;
;;   - upp till 1000 poäng om antalet 1:or är exakt 50&lt;br /&gt;
(define (fitness chrom)&lt;br /&gt;
  (define prefix-5 (take chrom 5))&lt;br /&gt;
  (define num-ones  (apply + chrom))&lt;br /&gt;
&lt;br /&gt;
  (define prefix-bonus (if (andmap (λ (x) (= x 1)) prefix-5) 1000 0))&lt;br /&gt;
  (define distance     (abs (- num-ones 50)))&lt;br /&gt;
&lt;br /&gt;
  (+ prefix-bonus (- 1000 distance)))&lt;br /&gt;
&lt;br /&gt;
;; Tournament selection (storlek 5)&lt;br /&gt;
(define (select-parent population)&lt;br /&gt;
  (define tournament-size 5)&lt;br /&gt;
  (argmax fitness&lt;br /&gt;
          (for/list ([_ (in-range tournament-size)])&lt;br /&gt;
            (list-ref population (random (length population))))))&lt;br /&gt;
&lt;br /&gt;
;; Single-point crossover&lt;br /&gt;
(define (crossover parent1 parent2)&lt;br /&gt;
  (define point (add1 (random (sub1 chromosome-length))))&lt;br /&gt;
  (append (take parent1 point)&lt;br /&gt;
          (drop parent2 point)))&lt;br /&gt;
&lt;br /&gt;
;; Mutation&lt;br /&gt;
(define (mutate chrom)&lt;br /&gt;
  (for/list ([gene chrom])&lt;br /&gt;
    (if (&amp;lt; (random) mutation-rate)&lt;br /&gt;
        (- 1 gene)&lt;br /&gt;
        gene)))&lt;br /&gt;
&lt;br /&gt;
;; Skapar nästa generation (utan elitism ännu)&lt;br /&gt;
(define (next-generation population)&lt;br /&gt;
  (for/list ([_ (in-range population-size)])&lt;br /&gt;
    (define p1 (select-parent population))&lt;br /&gt;
    (define p2 (select-parent population))&lt;br /&gt;
    (mutate (crossover p1 p2))))&lt;br /&gt;
&lt;br /&gt;
;; --------------------- Huvudalgoritm ---------------------&lt;br /&gt;
&lt;br /&gt;
(define (genetic-algorithm)&lt;br /&gt;
  (printf &amp;quot;Startar genetisk algoritm...\n&amp;quot;)&lt;br /&gt;
  (printf &amp;quot;Mål: Första 5 bitar = 1 och totalt ~a ettor\n\n&amp;quot; 50)&lt;br /&gt;
&lt;br /&gt;
  (define initial-population&lt;br /&gt;
    (for/list ([_ (in-range population-size)])&lt;br /&gt;
      (random-chromosome)))&lt;br /&gt;
&lt;br /&gt;
  (define (evolve population generation)&lt;br /&gt;
    (define best (argmax fitness population))&lt;br /&gt;
    (define best-fitness (fitness best))&lt;br /&gt;
    (define num-ones     (apply + best))&lt;br /&gt;
    (define prefix-ok?   (andmap (λ (x) (= x 1)) (take best 5)))&lt;br /&gt;
&lt;br /&gt;
    (printf &amp;quot;Gen ~a | Fitness: ~a | Ettor: ~a | Prefix OK: ~a\n&amp;quot;&lt;br /&gt;
            (~a generation #:width 4 #:align &#039;right)&lt;br /&gt;
            best-fitness&lt;br /&gt;
            num-ones&lt;br /&gt;
            (if prefix-ok? &amp;quot;Ja&amp;quot; &amp;quot;Nej&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
    (cond&lt;br /&gt;
      [(= best-fitness 2000)&lt;br /&gt;
       (printf &amp;quot;\n=== PERFEKT LÖSNING HITTAD! ===\n&amp;quot;)&lt;br /&gt;
       (printf &amp;quot;Generation: ~a\n&amp;quot; generation)&lt;br /&gt;
       (printf &amp;quot;Kromosom:   ~a\n&amp;quot; best)&lt;br /&gt;
       (printf &amp;quot;Antal ettor: ~a\n&amp;quot; num-ones)]&lt;br /&gt;
&lt;br /&gt;
      [(&amp;gt;= generation generations)&lt;br /&gt;
       (printf &amp;quot;\n=== Max generationer nådda ===\n&amp;quot;)&lt;br /&gt;
       (printf &amp;quot;Bästa lösning:\n&amp;quot;)&lt;br /&gt;
       (printf &amp;quot;  Fitness:     ~a\n&amp;quot; best-fitness)&lt;br /&gt;
       (printf &amp;quot;  Antal ettor: ~a\n&amp;quot; num-ones)&lt;br /&gt;
       (printf &amp;quot;  Första 10:   ~a\n&amp;quot; (take best 10))]&lt;br /&gt;
&lt;br /&gt;
      [else&lt;br /&gt;
       (evolve (next-generation population) (add1 generation))]))&lt;br /&gt;
&lt;br /&gt;
  (evolve initial-population 0))&lt;br /&gt;
&lt;br /&gt;
;; --------------------- Kör programmet ---------------------&lt;br /&gt;
(genetic-algorithm)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Racket/6502-emu&amp;diff=1864</id>
		<title>Racket/6502-emu</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Racket/6502-emu&amp;diff=1864"/>
		<updated>2026-04-24T15:24:25Z</updated>

		<summary type="html">&lt;p&gt;Anders: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Algoritmer]]&lt;br /&gt;
[[category:Programmering]]&lt;br /&gt;
[[category:Racket]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#lang racket&lt;br /&gt;
&lt;br /&gt;
;; ================================================&lt;br /&gt;
;; Enkel 6502-emulator skriven i Racket&lt;br /&gt;
;; ================================================&lt;br /&gt;
;; Detta är en grundläggande men fullt fungerande emulator för 6502-processorn.&lt;br /&gt;
;; Den hanterar minne (64 KB), register, stack, flaggor och ett grundläggande&lt;br /&gt;
;; set av instruktioner. Du kan lätt utöka den med fler opkoder.&lt;br /&gt;
;;&lt;br /&gt;
;; Instruktioner som stöds i denna version (kan utökas i cpu-step):&lt;br /&gt;
;;   - $00 BRK          (stoppar exekveringen)&lt;br /&gt;
;;   - $A9 LDA #imm&lt;br /&gt;
;;   - $8D STA abs&lt;br /&gt;
;;   - $A2 LDX #imm&lt;br /&gt;
;;   - $E8 INX&lt;br /&gt;
;;   - $4C JMP abs&lt;br /&gt;
;;   - $D0 BNE rel      (enkel branch)&lt;br /&gt;
;;&lt;br /&gt;
;; NYTT: Funktioner för att skriva ut minne och flaggor har lagts till!&lt;br /&gt;
&lt;br /&gt;
(struct cpu (a x y pc sp p mem) #:mutable #:transparent)&lt;br /&gt;
&lt;br /&gt;
;; Flaggor (statusregister P)&lt;br /&gt;
(define CARRY      #b00000001)&lt;br /&gt;
(define ZERO       #b00000010)&lt;br /&gt;
(define INTERRUPT  #b00000100)&lt;br /&gt;
(define DECIMAL    #b00001000)&lt;br /&gt;
(define BREAK      #b00010000)&lt;br /&gt;
(define OVERFLOW   #b01000000)&lt;br /&gt;
(define NEGATIVE   #b10000000)&lt;br /&gt;
&lt;br /&gt;
;; Skapa en ny CPU (PC startar godtyckligt, SP pekar mot stack-sidan)&lt;br /&gt;
(define (make-cpu)&lt;br /&gt;
  (cpu 0 0 0 #x8000 #xFF #b00100100 (make-vector 65536 0)))&lt;br /&gt;
&lt;br /&gt;
;; Minnesåtkomst&lt;br /&gt;
(define (mem-read cpu addr)&lt;br /&gt;
  (vector-ref (cpu-mem cpu) (bitwise-and addr #xFFFF)))&lt;br /&gt;
&lt;br /&gt;
(define (mem-write cpu addr val)&lt;br /&gt;
  (vector-set! (cpu-mem cpu) (bitwise-and addr #xFFFF) (bitwise-and val #xFF)))&lt;br /&gt;
&lt;br /&gt;
;; Stack (6502-stack ligger på sidan 0x01)&lt;br /&gt;
(define (stack-push cpu val)&lt;br /&gt;
  (mem-write cpu (cpu-sp cpu) val)&lt;br /&gt;
  (set-cpu-sp! cpu (bitwise-and #xFF (- (cpu-sp cpu) 1))))&lt;br /&gt;
&lt;br /&gt;
(define (stack-pop cpu)&lt;br /&gt;
  (set-cpu-sp! cpu (bitwise-and #xFF (+ (cpu-sp cpu) 1)))&lt;br /&gt;
  (mem-read cpu (cpu-sp cpu)))&lt;br /&gt;
&lt;br /&gt;
;; Uppdatera N- och Z-flaggor (används av de flesta instruktioner)&lt;br /&gt;
(define (update-nz cpu val)&lt;br /&gt;
  (set-flag cpu NEGATIVE (not (zero? (bitwise-and val #x80))))&lt;br /&gt;
  (set-flag cpu ZERO      (zero? (bitwise-and val #xFF))))&lt;br /&gt;
&lt;br /&gt;
(define (set-flag cpu mask val)&lt;br /&gt;
  (if val&lt;br /&gt;
      (set-cpu-p! cpu (bitwise-ior (cpu-p cpu) mask))&lt;br /&gt;
      (set-cpu-p! cpu (bitwise-and (cpu-p cpu) (bitwise-not mask)))))&lt;br /&gt;
&lt;br /&gt;
(define (get-flag cpu mask)&lt;br /&gt;
  (not (zero? (bitwise-and (cpu-p cpu) mask))))&lt;br /&gt;
&lt;br /&gt;
;; Hjälpfunktioner för att hämta data och öka PC&lt;br /&gt;
(define (fetch-byte cpu)&lt;br /&gt;
  (define addr (cpu-pc cpu))&lt;br /&gt;
  (set-cpu-pc! cpu (add1 addr))&lt;br /&gt;
  (mem-read cpu addr))&lt;br /&gt;
&lt;br /&gt;
(define (fetch-word cpu)&lt;br /&gt;
  (define lo (fetch-byte cpu))&lt;br /&gt;
  (define hi (fetch-byte cpu))&lt;br /&gt;
  (bitwise-ior lo (arithmetic-shift hi 8)))&lt;br /&gt;
&lt;br /&gt;
;; Huvudfunktion: exekvera en instruktion&lt;br /&gt;
(define (cpu-step cpu)&lt;br /&gt;
  (define opcode (fetch-byte cpu))&lt;br /&gt;
  (case opcode&lt;br /&gt;
    ;; BRK – stoppar emulatorn&lt;br /&gt;
    [(#x00)&lt;br /&gt;
     (set-flag cpu BREAK #t)&lt;br /&gt;
     &#039;brk]&lt;br /&gt;
&lt;br /&gt;
    ;; LDA #imm&lt;br /&gt;
    [(#xA9)&lt;br /&gt;
     (define val (fetch-byte cpu))&lt;br /&gt;
     (set-cpu-a! cpu val)&lt;br /&gt;
     (update-nz cpu val)]&lt;br /&gt;
&lt;br /&gt;
    ;; STA abs&lt;br /&gt;
    [(#x8D)&lt;br /&gt;
     (define addr (fetch-word cpu))&lt;br /&gt;
     (mem-write cpu addr (cpu-a cpu))]&lt;br /&gt;
&lt;br /&gt;
    ;; LDX #imm&lt;br /&gt;
    [(#xA2)&lt;br /&gt;
     (define val (fetch-byte cpu))&lt;br /&gt;
     (set-cpu-x! cpu val)&lt;br /&gt;
     (update-nz cpu val)]&lt;br /&gt;
&lt;br /&gt;
    ;; INX&lt;br /&gt;
    [(#xE8)&lt;br /&gt;
     (define new-x (bitwise-and #xFF (add1 (cpu-x cpu))))&lt;br /&gt;
     (set-cpu-x! cpu new-x)&lt;br /&gt;
     (update-nz cpu new-x)]&lt;br /&gt;
&lt;br /&gt;
    ;; JMP abs&lt;br /&gt;
    [(#x4C)&lt;br /&gt;
     (define addr (fetch-word cpu))&lt;br /&gt;
     (set-cpu-pc! cpu addr)]&lt;br /&gt;
&lt;br /&gt;
    ;; BNE rel (branch if not equal / Z=0)&lt;br /&gt;
    [(#xD0)&lt;br /&gt;
     (define offset (fetch-byte cpu))&lt;br /&gt;
     (when (not (get-flag cpu ZERO))&lt;br /&gt;
       (set-cpu-pc! cpu (+ (cpu-pc cpu)&lt;br /&gt;
                           (if (&amp;gt; offset #x7F) (- offset #x100) offset))))]&lt;br /&gt;
&lt;br /&gt;
    [else&lt;br /&gt;
     (error &amp;quot;Okänt opcode:&amp;quot; (format &amp;quot;~x&amp;quot; opcode))]))&lt;br /&gt;
&lt;br /&gt;
;; Ladda ett program (lista av bytes) till minnet&lt;br /&gt;
(define (load-program cpu start-addr program-bytes)&lt;br /&gt;
  (for ([b program-bytes]&lt;br /&gt;
        [i (in-naturals)])&lt;br /&gt;
    (mem-write cpu (+ start-addr i) b)))&lt;br /&gt;
&lt;br /&gt;
;; Kör emulatorn tills BRK eller max-steg nås&lt;br /&gt;
(define (run-cpu cpu [max-steps 100000])&lt;br /&gt;
  (let loop ([steps 0])&lt;br /&gt;
    (cond&lt;br /&gt;
      [(&amp;gt;= steps max-steps) &#039;timeout]&lt;br /&gt;
      [else&lt;br /&gt;
       (define result (cpu-step cpu))&lt;br /&gt;
       (if (eq? result &#039;brk)&lt;br /&gt;
           &#039;halted-by-brk&lt;br /&gt;
           (loop (add1 steps)))])))&lt;br /&gt;
&lt;br /&gt;
;; ================================================&lt;br /&gt;
;; NYA HJÄLPFUNKTIONER: Skriv ut minne och flaggor&lt;br /&gt;
;; ================================================&lt;br /&gt;
&lt;br /&gt;
;; Skriver ut aktuellt CPU-tillstånd (alla register + flaggor i läsbart format)&lt;br /&gt;
(define (print-cpu-state cpu)&lt;br /&gt;
  (printf &amp;quot;=== CPU STATUS ===~n&amp;quot;)&lt;br /&gt;
  (printf &amp;quot;PC: $~x   A: $~x   X: $~x   Y: $~x   SP: $~x~n&amp;quot;&lt;br /&gt;
          (cpu-pc cpu)&lt;br /&gt;
          (cpu-a cpu)&lt;br /&gt;
          (cpu-x cpu)&lt;br /&gt;
          (cpu-y cpu)&lt;br /&gt;
          (cpu-sp cpu))&lt;br /&gt;
  (printf &amp;quot;P:  $~x   &amp;quot; (cpu-p cpu))&lt;br /&gt;
  (printf &amp;quot;Flags: [N:~a V:~a - B:~a D:~a I:~a Z:~a C:~a]~n&amp;quot;&lt;br /&gt;
          (if (get-flag cpu NEGATIVE) &amp;quot;1&amp;quot; &amp;quot;0&amp;quot;)&lt;br /&gt;
          (if (get-flag cpu OVERFLOW) &amp;quot;1&amp;quot; &amp;quot;0&amp;quot;)&lt;br /&gt;
          (if (get-flag cpu BREAK)    &amp;quot;1&amp;quot; &amp;quot;0&amp;quot;)&lt;br /&gt;
          (if (get-flag cpu DECIMAL)  &amp;quot;1&amp;quot; &amp;quot;0&amp;quot;)&lt;br /&gt;
          (if (get-flag cpu INTERRUPT)&amp;quot;1&amp;quot; &amp;quot;0&amp;quot;)&lt;br /&gt;
          (if (get-flag cpu ZERO)     &amp;quot;1&amp;quot; &amp;quot;0&amp;quot;)&lt;br /&gt;
          (if (get-flag cpu CARRY)    &amp;quot;1&amp;quot; &amp;quot;0&amp;quot;))&lt;br /&gt;
  (newline))&lt;br /&gt;
&lt;br /&gt;
;; Hex-dump av ett minnesområde (16 bytes per rad + ASCII-del)&lt;br /&gt;
;; Användning: (print-memory my-cpu #x0000 #x00FF) eller bara (print-memory my-cpu #x0600)&lt;br /&gt;
(define (print-memory cpu start [end #f])&lt;br /&gt;
  (when (not end)&lt;br /&gt;
    (set! end (+ start 255)))                 ; default: 256 bytes om inget slut anges&lt;br /&gt;
  (set! start (bitwise-and start #xFFFF))&lt;br /&gt;
  (set! end   (bitwise-and end   #xFFFF))&lt;br /&gt;
  (printf &amp;quot;=== MEMORY DUMP $~4x – $~4x ===~n&amp;quot; start end)&lt;br /&gt;
  (for ([addr (in-range start (add1 end) 16)])&lt;br /&gt;
    (when (&amp;lt;= addr end)&lt;br /&gt;
      (printf &amp;quot;$~4x: &amp;quot; addr)&lt;br /&gt;
      ;; Hex-delen&lt;br /&gt;
      (for ([i (in-range 16)])&lt;br /&gt;
        (define a (+ addr i))&lt;br /&gt;
        (if (&amp;lt;= a end)&lt;br /&gt;
            (printf &amp;quot;~2x &amp;quot; (mem-read cpu a))&lt;br /&gt;
            (printf &amp;quot;   &amp;quot;)))&lt;br /&gt;
      ;; ASCII-del&lt;br /&gt;
      (printf &amp;quot; | &amp;quot;)&lt;br /&gt;
      (for ([i (in-range 16)])&lt;br /&gt;
        (define a (+ addr i))&lt;br /&gt;
        (if (&amp;lt;= a end)&lt;br /&gt;
            (let ([b (mem-read cpu a)])&lt;br /&gt;
              (printf &amp;quot;~a&amp;quot; (if (and (&amp;gt;= b #x20) (&amp;lt;= b #x7E))&lt;br /&gt;
                               (integer-&amp;gt;char b)&lt;br /&gt;
                               &amp;quot;.&amp;quot;)))&lt;br /&gt;
            (printf &amp;quot; &amp;quot;)))&lt;br /&gt;
      (newline)))&lt;br /&gt;
  (newline))&lt;br /&gt;
&lt;br /&gt;
;; ================================================&lt;br /&gt;
;; EXEMPEL: Ett litet program som demonstrerar emulatorn&lt;br /&gt;
;; ================================================&lt;br /&gt;
;; Programmet gör följande:&lt;br /&gt;
;;   LDA #$05      ; A = 5&lt;br /&gt;
;;   STA $0010     ; minne[0x0010] = 5&lt;br /&gt;
;;   LDX #$0A      ; X = 10&lt;br /&gt;
;;   INX           ; X = 11&lt;br /&gt;
;;   JMP $0610     ; hoppa till en BRK&lt;br /&gt;
;;   BRK&lt;br /&gt;
&lt;br /&gt;
(define example-program&lt;br /&gt;
  (list #xA9 #x05          ; LDA #5&lt;br /&gt;
        #x8D #x10 #x00     ; STA $0010&lt;br /&gt;
        #xA2 #x0A          ; LDX #10&lt;br /&gt;
        #xE8               ; INX&lt;br /&gt;
        #x4C #x10 #x06     ; JMP $0610&lt;br /&gt;
        #x00))             ; BRK (vid 0x0610)&lt;br /&gt;
&lt;br /&gt;
;; Hur du kör exemplet (med de nya utskriftsfunktionerna):&lt;br /&gt;
&lt;br /&gt;
(define my-cpu (make-cpu))&lt;br /&gt;
(load-program my-cpu #x0600 example-program)&lt;br /&gt;
(print-cpu-state my-cpu)&lt;br /&gt;
(set-cpu-pc! my-cpu #x0600)&lt;br /&gt;
(print-cpu-state my-cpu)&lt;br /&gt;
(run-cpu my-cpu)&lt;br /&gt;
(print-cpu-state my-cpu)&lt;br /&gt;
&lt;br /&gt;
;; Flera opkoder kan läggas till för bättre emulering!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Racket/Multitr%C3%A5d&amp;diff=1863</id>
		<title>Racket/Multitråd</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Racket/Multitr%C3%A5d&amp;diff=1863"/>
		<updated>2026-04-24T15:24:06Z</updated>

		<summary type="html">&lt;p&gt;Anders: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Algoritmer]]&lt;br /&gt;
[[category:Programmering]]&lt;br /&gt;
[[category:Racket]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#lang racket&lt;br /&gt;
&lt;br /&gt;
;;;;;&lt;br /&gt;
;; Multitrådad demo&lt;br /&gt;
;; Täpp-Anders Sikvall, anders@sikvall.se, 2006-04-04&lt;br /&gt;
;; Racketkurs.&lt;br /&gt;
&lt;br /&gt;
;; Simulerar tidsödande arbete genom att pausa tråden en slumpmässig tid&lt;br /&gt;
(define (random-sleep min-sec max-sec)&lt;br /&gt;
  (sleep (+ min-sec (* (random) (- max-sec min-sec)))))&lt;br /&gt;
&lt;br /&gt;
;; En arbetare körs i en egen tråd och lyssnar på work-channel&lt;br /&gt;
(define (start-worker id work-channel result-channel)&lt;br /&gt;
  (thread&lt;br /&gt;
   (λ ()&lt;br /&gt;
     (let loop ()&lt;br /&gt;
       ;; Vänta på att få ett meddelande från arbetskön&lt;br /&gt;
       (match (channel-get work-channel)&lt;br /&gt;
         ;; Om meddelandet är &#039;done&#039;, avsluta loopen och därmed tråden&lt;br /&gt;
         [&#039;done&lt;br /&gt;
          (printf &amp;quot;Arbetare ~a: Avslutar.\n&amp;quot; id)]&lt;br /&gt;
         &lt;br /&gt;
         ;; Om meddelandet är ett tal, utför beräkningen&lt;br /&gt;
         [n&lt;br /&gt;
          (printf &amp;quot;Arbetare ~a: Bearbetar värde ~a...\n&amp;quot; id n)&lt;br /&gt;
          (random-sleep 0.1 0.4)&lt;br /&gt;
          &lt;br /&gt;
          ;; Skicka tillbaka resultatet. &lt;br /&gt;
          ;; OBS: Detta blockerar arbetaren tills huvudtråden läser från result-channel.&lt;br /&gt;
          (channel-put result-channel (list id (* n n)))&lt;br /&gt;
          (loop)])))))&lt;br /&gt;
&lt;br /&gt;
;; --- Huvudprogram ---&lt;br /&gt;
&lt;br /&gt;
(define (main)&lt;br /&gt;
  (define num-workers 4)&lt;br /&gt;
  (define num-tasks   10)&lt;br /&gt;
&lt;br /&gt;
  ;; Skapa kanaler för kommunikation&lt;br /&gt;
  ;; Dessa är synkrona (blockerande) i Racket&lt;br /&gt;
  (define work-channel   (make-channel))&lt;br /&gt;
  (define result-channel (make-channel))&lt;br /&gt;
&lt;br /&gt;
  (printf &amp;quot;System: Startar ~a arbetstrådar.\n&amp;quot; num-workers)&lt;br /&gt;
  &lt;br /&gt;
  ;; Starta arbetartrådarna och spara deras referenser i en lista&lt;br /&gt;
  (define workers&lt;br /&gt;
    (for/list ([i (in-range num-workers)])&lt;br /&gt;
      (start-worker i work-channel result-channel)))&lt;br /&gt;
&lt;br /&gt;
  ;; 1. Skicka uppgifter till arbetskön.&lt;br /&gt;
  ;; Vi gör detta i en separat tråd för att säkerställa att huvudtråden &lt;br /&gt;
  ;; kan börja tömma resultat-kanalen omedelbart.&lt;br /&gt;
  (thread&lt;br /&gt;
   (λ ()&lt;br /&gt;
     (for ([task (in-range 1 (add1 num-tasks))])&lt;br /&gt;
       (channel-put work-channel task))&lt;br /&gt;
     &lt;br /&gt;
     ;; Skicka en &#039;done&#039;-signal per arbetare för att stänga ner dem snyggt&lt;br /&gt;
     (for ([_ (in-range num-workers)])&lt;br /&gt;
       (channel-put work-channel &#039;done))))&lt;br /&gt;
&lt;br /&gt;
  ;; Samla in resultaten.&lt;br /&gt;
  (printf &amp;quot;System: Samlar in resultat.\n&amp;quot;)&lt;br /&gt;
  (for ([_ (in-range num-tasks)])&lt;br /&gt;
    (match (channel-get result-channel)&lt;br /&gt;
      [(list id result)&lt;br /&gt;
       (printf &amp;quot;Resultat: Arbetare ~a levererade ~a\n&amp;quot; id result)]))&lt;br /&gt;
&lt;br /&gt;
  ;; Vänta på att trådarna faktiskt har stängt ner.&lt;br /&gt;
  (printf &amp;quot;System: Väntar på att trådar stängs ner...\n&amp;quot;)&lt;br /&gt;
  (for-each thread-wait workers)&lt;br /&gt;
&lt;br /&gt;
  (printf &amp;quot;System: Programmet är klart.\n&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
;; Kör programmet&lt;br /&gt;
(main)&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Racket/Lille-GUI&amp;diff=1862</id>
		<title>Racket/Lille-GUI</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Racket/Lille-GUI&amp;diff=1862"/>
		<updated>2026-04-24T15:23:47Z</updated>

		<summary type="html">&lt;p&gt;Anders: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Algoritmer]]&lt;br /&gt;
[[category:Programmering]]&lt;br /&gt;
[[category:Racket]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#lang racket/gui&lt;br /&gt;
&lt;br /&gt;
;;;;;&lt;br /&gt;
;; Riktigt Enkelt GUI-Demo implementerad i Racket&lt;br /&gt;
;; Täpp-Anders Sikvall 2026-04-03 anders@sikvall.se&lt;br /&gt;
;;;;;&lt;br /&gt;
&lt;br /&gt;
;; Skapa huvudfönstret&lt;br /&gt;
(define frame&lt;br /&gt;
  (new frame%&lt;br /&gt;
       [label &amp;quot;Racket GUI Demo&amp;quot;]&lt;br /&gt;
       [width 520]&lt;br /&gt;
       [height 420]))&lt;br /&gt;
&lt;br /&gt;
;; Meny&lt;br /&gt;
(define menu-bar (new menu-bar% [parent frame]))&lt;br /&gt;
&lt;br /&gt;
(define menu-file (new menu% [label &amp;quot;Arkiv&amp;quot;] [parent menu-bar]))&lt;br /&gt;
(new menu-item% [label &amp;quot;Öppna...&amp;quot;] [parent menu-file]&lt;br /&gt;
     [callback (λ (i e) (message-box &amp;quot;Öppna&amp;quot; &amp;quot;Filöppning simulerad&amp;quot;))])&lt;br /&gt;
(new menu-item% [label &amp;quot;Spara&amp;quot;] [parent menu-file]&lt;br /&gt;
     [callback (λ (i e) (message-box &amp;quot;Spara&amp;quot; &amp;quot;Filen sparad!&amp;quot;))])&lt;br /&gt;
(new separator-menu-item% [parent menu-file])&lt;br /&gt;
(new menu-item% [label &amp;quot;Avsluta&amp;quot;] [parent menu-file]&lt;br /&gt;
     [callback (λ (i e) (send frame show #f))])&lt;br /&gt;
&lt;br /&gt;
(define menu-help (new menu% [label &amp;quot;Hjälp&amp;quot;] [parent menu-bar]))&lt;br /&gt;
(new menu-item% [label &amp;quot;Om programmet&amp;quot;] [parent menu-help]&lt;br /&gt;
     [callback (λ (i e) (message-box &amp;quot;Om&amp;quot; &amp;quot;Racket GUI Demo\nPedagogisk exempel&amp;quot;))])&lt;br /&gt;
&lt;br /&gt;
;; Lite layouting av dialogen&lt;br /&gt;
(define main-panel&lt;br /&gt;
  (new vertical-panel% [parent frame] [spacing 12] [border 15]))&lt;br /&gt;
&lt;br /&gt;
;; Rubrik&lt;br /&gt;
(new message%&lt;br /&gt;
     [parent main-panel]&lt;br /&gt;
     [label &amp;quot;Välkommen till Racket GUI-demo!&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
;; Input-fält, 2 st, namn och epost&lt;br /&gt;
(define name-field&lt;br /&gt;
  (new text-field% [parent main-panel] [label &amp;quot;Namn:&amp;quot;] [init-value &amp;quot;Anna Andersson&amp;quot;]))&lt;br /&gt;
&lt;br /&gt;
(define email-field&lt;br /&gt;
  (new text-field% [parent main-panel] [label &amp;quot;E-post:&amp;quot;] [init-value &amp;quot;anna@example.com&amp;quot;]))&lt;br /&gt;
&lt;br /&gt;
;; Radio buttons för att välja färg&lt;br /&gt;
(define color-group&lt;br /&gt;
  (new group-box-panel% [parent main-panel] [label &amp;quot;Favoritfärg&amp;quot;]))&lt;br /&gt;
&lt;br /&gt;
(define color-radio&lt;br /&gt;
  (new radio-box% [parent color-group] [label #f]&lt;br /&gt;
       [choices &#039;(&amp;quot;Röd&amp;quot; &amp;quot;Grön&amp;quot; &amp;quot;Blå&amp;quot; &amp;quot;Gul&amp;quot;)]&lt;br /&gt;
       [style &#039;(vertical)]))&lt;br /&gt;
&lt;br /&gt;
;; Knappar för rensa och skicka&lt;br /&gt;
(define btn-panel&lt;br /&gt;
  (new horizontal-panel% [parent main-panel] [alignment &#039;(center center)] [spacing 20]))&lt;br /&gt;
&lt;br /&gt;
(new button% [parent btn-panel] [label &amp;quot;Rensa&amp;quot;]&lt;br /&gt;
     [callback (λ (b e)&lt;br /&gt;
                 (send name-field set-value &amp;quot;&amp;quot;)&lt;br /&gt;
                 (send email-field set-value &amp;quot;&amp;quot;)&lt;br /&gt;
                 (send color-radio set-selection 0))])&lt;br /&gt;
&lt;br /&gt;
(new button% [parent btn-panel] [label &amp;quot;Skicka&amp;quot;] [style &#039;(border)]&lt;br /&gt;
     [callback (λ (b e)&lt;br /&gt;
                 (define name (send name-field get-value))&lt;br /&gt;
                 (define email (send email-field get-value))&lt;br /&gt;
                 (define color (list-ref &#039;(&amp;quot;Röd&amp;quot; &amp;quot;Grön&amp;quot; &amp;quot;Blå&amp;quot; &amp;quot;Gul&amp;quot;)&lt;br /&gt;
                                         (send color-radio get-selection)))&lt;br /&gt;
                 (message-box &amp;quot;Tack!&amp;quot; &lt;br /&gt;
                              (format &amp;quot;Hej ~a!\n\nE-post: ~a\nFavoritfärg: ~a&amp;quot; &lt;br /&gt;
                                      name email color)))])&lt;br /&gt;
&lt;br /&gt;
;; Centrera fönstret och starta GUI&lt;br /&gt;
(send frame center)&lt;br /&gt;
(send frame show #t)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Racket/RLE&amp;diff=1861</id>
		<title>Racket/RLE</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Racket/RLE&amp;diff=1861"/>
		<updated>2026-04-24T15:23:35Z</updated>

		<summary type="html">&lt;p&gt;Anders: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Algoritmer]]&lt;br /&gt;
[[category:Programmering]]&lt;br /&gt;
[[category:Racket]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#lang racket&lt;br /&gt;
&lt;br /&gt;
;;;;;&lt;br /&gt;
;; RLE – Run Length Encoder&lt;br /&gt;
;;&lt;br /&gt;
;; I/O via stdio &amp;lt;infil &amp;gt;utfil&lt;br /&gt;
;;&lt;br /&gt;
;; Kodar data genom att räkna antal förekomster av samma tecken/byte i rad och&lt;br /&gt;
;; ersätter den med ett cons-par (antal . tecken) tills nästa förekomst finns.&lt;br /&gt;
;; Kan operera binärt men med begränsningen av max 255 bytes konsekutivt sedan&lt;br /&gt;
;; startas en ny ram.&lt;br /&gt;
;;&lt;br /&gt;
;; racket rle.rkt [ --encode | --decode | --help ] [ --binary ] &amp;lt; infil &amp;gt; utfil&lt;br /&gt;
;;&lt;br /&gt;
;; --encode kodar stdin till stdout lisp style om inte --binary används&lt;br /&gt;
;; --decode avkodar stdin till stdout lisp style om inte --binary används&lt;br /&gt;
;; --binary skriver kodad data binärt, läser binär data för avkodning&lt;br /&gt;
;; --help visar en enkel hjälptext&lt;br /&gt;
;; --test kör en enkel sån därn JOONIT TÄST di kallart&lt;br /&gt;
;;&lt;br /&gt;
;; Saker som kan göras bättre:&lt;br /&gt;
;;&lt;br /&gt;
;; Det finns ganska lite felkontroll och vad du kastar på dekodern kommer den försöka&lt;br /&gt;
;; tills det skiter sig.&lt;br /&gt;
;;&lt;br /&gt;
;; Man kan också tänka sig att använda mer än en byte för antal i binärt mode&lt;br /&gt;
;; men också en grej är ju att man aldrig kommer koda för 0 tecken så man kunde&lt;br /&gt;
;; ju lika gärna koda för 1-256 i stället för 0-255. Jag har struntat i det.&lt;br /&gt;
;;&lt;br /&gt;
;;;;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;; --- Kärnlogik ---&lt;br /&gt;
&lt;br /&gt;
;; Grupperar element&lt;br /&gt;
(define (pack-limited lst)&lt;br /&gt;
  (cond [(empty? lst) &#039;()]&lt;br /&gt;
        [else &lt;br /&gt;
         (let-values ([(prefix suffix) (splitf-at lst (lambda (x) (equal? x (first lst))))])&lt;br /&gt;
           (if (&amp;gt; (length prefix) 255)&lt;br /&gt;
               ;; Om gruppen är för lång, hugg av vid 255 och fortsätt med resten&lt;br /&gt;
               (cons (take prefix 255) (pack-limited (append (drop prefix 255) suffix)))&lt;br /&gt;
               ;; Annars, fortsätt som vanligt&lt;br /&gt;
               (cons prefix (pack-limited suffix))))]))&lt;br /&gt;
&lt;br /&gt;
(define (encode lst)&lt;br /&gt;
  (map (lambda (group) (list (length group) (first group))) &lt;br /&gt;
       (pack-limited lst)))&lt;br /&gt;
&lt;br /&gt;
(define (decode lst)&lt;br /&gt;
  (append-map (lambda (entry) (make-list (first entry) (second entry))) &lt;br /&gt;
              lst))&lt;br /&gt;
&lt;br /&gt;
;; --- Binär I/O ---&lt;br /&gt;
&lt;br /&gt;
(define (write-binary encoded-data)&lt;br /&gt;
  (for ([pair encoded-data])&lt;br /&gt;
    (write-byte (first pair))&lt;br /&gt;
    (write-byte (second pair))))&lt;br /&gt;
&lt;br /&gt;
(define (read-binary)&lt;br /&gt;
  (let ([count (read-byte)])&lt;br /&gt;
    (if (eof-object? count)&lt;br /&gt;
        &#039;()&lt;br /&gt;
        (let ([val (read-byte)])&lt;br /&gt;
          (cons (list count val) (read-binary))))))&lt;br /&gt;
&lt;br /&gt;
;; --- Körlägen ---&lt;br /&gt;
&lt;br /&gt;
(define (run-encode binary?)&lt;br /&gt;
  (let* ([input (port-&amp;gt;bytes (current-input-port))]&lt;br /&gt;
         [encoded (encode (bytes-&amp;gt;list input))])&lt;br /&gt;
    (if binary?&lt;br /&gt;
        (write-binary encoded)&lt;br /&gt;
        (write encoded)))) ; Använd write för att få korrekt läsbar listformat&lt;br /&gt;
&lt;br /&gt;
(define (run-decode binary?)&lt;br /&gt;
  (let* ([data (if binary? (read-binary) (read))]&lt;br /&gt;
         [decoded (decode data)])&lt;br /&gt;
    (display (list-&amp;gt;bytes decoded))))&lt;br /&gt;
&lt;br /&gt;
(define (run-test)&lt;br /&gt;
  (let* ([input (port-&amp;gt;bytes (current-input-port))]&lt;br /&gt;
         [encoded (encode (bytes-&amp;gt;list input))]&lt;br /&gt;
         [decoded (list-&amp;gt;bytes (decode encoded))])&lt;br /&gt;
    (if (equal? input decoded)&lt;br /&gt;
        (printf &amp;quot;Test lyckades! (~a bytes in, ~a noder skapade)\n&amp;quot; &lt;br /&gt;
                (bytes-length input) (length encoded))&lt;br /&gt;
        (error &amp;quot;Test misslyckades: Datat korrupt!&amp;quot;))))&lt;br /&gt;
&lt;br /&gt;
;; --- CLI ---&lt;br /&gt;
&lt;br /&gt;
(define (show-help)&lt;br /&gt;
  (displayln &amp;quot;Användning: racket rle.rkt [FLAGGA] &amp;lt; infil &amp;gt; utfil&amp;quot;)&lt;br /&gt;
  (displayln &amp;quot;  -e, --encode  Koda (standard: text-listor)&amp;quot;)&lt;br /&gt;
  (displayln &amp;quot;  -d, --decode  Dekoda (standard: text-listor)&amp;quot;)&lt;br /&gt;
  (displayln &amp;quot;  -b, --binary  Kör i binärläge (1 byte antal, 1 byte värde)&amp;quot;)&lt;br /&gt;
  (displayln &amp;quot;  -t, --test    Verifiera att koda+dekoda bevarar data&amp;quot;)&lt;br /&gt;
  (displayln &amp;quot;  -h, --help    Visa denna hjälp&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
(define (main)&lt;br /&gt;
  (let ([args (vector-&amp;gt;list (current-command-line-arguments))])&lt;br /&gt;
    (cond&lt;br /&gt;
      [(member &amp;quot;-t&amp;quot; args) (run-test)]&lt;br /&gt;
      [(and (member &amp;quot;-e&amp;quot; args) (or (member &amp;quot;-b&amp;quot; args) (member &amp;quot;--binary&amp;quot; args))) (run-encode #t)]&lt;br /&gt;
      [(member &amp;quot;-e&amp;quot; args) (run-encode #f)]&lt;br /&gt;
      [(and (member &amp;quot;-d&amp;quot; args) (or (member &amp;quot;-b&amp;quot; args) (member &amp;quot;--binary&amp;quot; args))) (run-decode #t)]&lt;br /&gt;
      [(member &amp;quot;-d&amp;quot; args) (run-decode #f)]&lt;br /&gt;
      [else (show-help)])))&lt;br /&gt;
&lt;br /&gt;
(main)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Racket/Personreg&amp;diff=1860</id>
		<title>Racket/Personreg</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Racket/Personreg&amp;diff=1860"/>
		<updated>2026-04-24T15:23:17Z</updated>

		<summary type="html">&lt;p&gt;Anders: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Algoritmer]]&lt;br /&gt;
[[category:Programmering]]&lt;br /&gt;
[[category:Racket]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#lang racket&lt;br /&gt;
&lt;br /&gt;
;;;;;&lt;br /&gt;
;; Enkel personinfodatabas implementerad i Racket&lt;br /&gt;
;; Täpp-Anders Sikvall 2026-04-03 anders@sikvall.se&lt;br /&gt;
;;;;;&lt;br /&gt;
&lt;br /&gt;
;; Global lista som håller alla personer, just nu tom&lt;br /&gt;
(define personer &#039;())&lt;br /&gt;
&lt;br /&gt;
;; Skapa en person med namngivna parametrar&lt;br /&gt;
(define (skapa-person&lt;br /&gt;
         #:förnamn förnamn&lt;br /&gt;
         #:efternamn efternamn&lt;br /&gt;
         #:ålder ålder&lt;br /&gt;
         #:stad [stad &amp;quot;&amp;quot;]           ;Valfria parametrar med defaultvärden&lt;br /&gt;
         #:telefon [telefon &amp;quot;&amp;quot;])&lt;br /&gt;
  (define person (list (cons &#039;förnamn förnamn)         ;när man consar par såhär&lt;br /&gt;
                       (cons &#039;efternamn efternamn)     ;måste man använda car/cdr!&lt;br /&gt;
                       (cons &#039;ålder ålder)&lt;br /&gt;
                       (cons &#039;stad stad)&lt;br /&gt;
                       (cons &#039;telefon telefon)))&lt;br /&gt;
&lt;br /&gt;
  (set! personer (cons person personer)) ; lägger till en person i listan personer och returnerar&lt;br /&gt;
  person)                                ; sedan samma person&lt;br /&gt;
&lt;br /&gt;
;; Sökfunktion (oförändrad)&lt;br /&gt;
(define hitta-person&lt;br /&gt;
  (make-keyword-procedure&lt;br /&gt;
   (lambda (keywords keyword-values . rest)&lt;br /&gt;
     (if (empty? keywords)&lt;br /&gt;
         personer&lt;br /&gt;
         (filter (λ (person)&lt;br /&gt;
                   (for/and ([kw keywords]&lt;br /&gt;
                             [val keyword-values])&lt;br /&gt;
                     (let ([field-key (string-&amp;gt;symbol (keyword-&amp;gt;string kw))])&lt;br /&gt;
                       (let ([found (assoc field-key person)])&lt;br /&gt;
                         (and found&lt;br /&gt;
                              (equal? (string-downcase (format &amp;quot;~a&amp;quot; val))&lt;br /&gt;
                                      (string-downcase (format &amp;quot;~a&amp;quot; (cdr found)))))))))&lt;br /&gt;
                 personer)))))&lt;br /&gt;
&lt;br /&gt;
;; Pretty-print funktioner&lt;br /&gt;
(define (pretty-print-person person)&lt;br /&gt;
  (printf &amp;quot;  Förnamn:   ~a\n&amp;quot; (cdr (assoc &#039;förnamn person)))    ;här går det inte använda rest&lt;br /&gt;
  (printf &amp;quot;  Efternamn: ~a\n&amp;quot; (cdr (assoc &#039;efternamn person)))  ;för det är inte en lista, det&lt;br /&gt;
  (printf &amp;quot;  Ålder:     ~a\n&amp;quot; (cdr (assoc &#039;ålder person)))      ;är ett consat par (ålder . 34)&lt;br /&gt;
  &lt;br /&gt;
  (let ([stad (cdr (assoc &#039;stad person))])&lt;br /&gt;
    (when (and stad (not (equal? stad &amp;quot;&amp;quot;)))&lt;br /&gt;
      (printf &amp;quot;  Stad:      ~a\n&amp;quot; stad)))&lt;br /&gt;
  &lt;br /&gt;
  (let ([telefon (cdr (assoc &#039;telefon person))])&lt;br /&gt;
    (when (and telefon (not (equal? telefon &amp;quot;&amp;quot;)))&lt;br /&gt;
      (printf &amp;quot;  Telefon:   ~a\n&amp;quot; telefon)))&lt;br /&gt;
  &lt;br /&gt;
  (newline))&lt;br /&gt;
&lt;br /&gt;
(define (pretty-print-persons lst)&lt;br /&gt;
  (if (empty? lst)&lt;br /&gt;
      (displayln &amp;quot;  Inga personer hittades.&amp;quot;)&lt;br /&gt;
      (for ([p (reverse lst)])&lt;br /&gt;
        (pretty-print-person p))))&lt;br /&gt;
&lt;br /&gt;
;; Spara och ladda – Lispformat (.dat)&lt;br /&gt;
(define data-fil &amp;quot;personer.dat&amp;quot;) ;default filnamn&lt;br /&gt;
&lt;br /&gt;
(define (spara-personer [filnamn data-fil]) ;men i anrop kan du ge eget namn&lt;br /&gt;
  (with-output-to-file filnamn&lt;br /&gt;
    (λ () (write personer))&lt;br /&gt;
    #:exists &#039;replace) ;om filen finns, skriv över den&lt;br /&gt;
  (printf &amp;quot;* Sparat ~a personer till \&amp;quot;~a\&amp;quot;\n&amp;quot;&lt;br /&gt;
          (length personer) filnamn))&lt;br /&gt;
&lt;br /&gt;
(define (ladda-personer [filnamn data-fil])&lt;br /&gt;
  (if (file-exists? filnamn)&lt;br /&gt;
      (begin&lt;br /&gt;
        (set! personer (with-input-from-file filnamn read))&lt;br /&gt;
        (printf &amp;quot;* Laddat ~a personer från \&amp;quot;~a\&amp;quot;\n&amp;quot; (length personer) filnamn))&lt;br /&gt;
      (printf &amp;quot;! Filen \&amp;quot;~a\&amp;quot; finns inte.\n&amp;quot; filnamn)))&lt;br /&gt;
&lt;br /&gt;
;; Spara och ladda – CSV-format (för enkel redigering)&lt;br /&gt;
(require csv-writing csv-reading)&lt;br /&gt;
(define csv-fil &amp;quot;personer.csv&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
;; Hjälpfunktion: person → CSV-rad&lt;br /&gt;
(define (person-&amp;gt;csv-row person)&lt;br /&gt;
  (list (format &amp;quot;~a&amp;quot; (cdr (assoc &#039;förnamn person)))&lt;br /&gt;
        (format &amp;quot;~a&amp;quot; (cdr (assoc &#039;efternamn person)))&lt;br /&gt;
        (format &amp;quot;~a&amp;quot; (cdr (assoc &#039;ålder person)))&lt;br /&gt;
        (format &amp;quot;~a&amp;quot; (cdr (assoc &#039;stad person)))&lt;br /&gt;
        (format &amp;quot;~a&amp;quot; (cdr (assoc &#039;telefon person)))))&lt;br /&gt;
&lt;br /&gt;
;; SPARA till CSV&lt;br /&gt;
(define (spara-personer-csv [filnamn csv-fil])&lt;br /&gt;
  (define rubriker (list (list &amp;quot;Förnamn&amp;quot; &amp;quot;Efternamn&amp;quot; &amp;quot;Ålder&amp;quot; &amp;quot;Stad&amp;quot; &amp;quot;Telefon&amp;quot;)))&lt;br /&gt;
  (define rader (map person-&amp;gt;csv-row (reverse personer)))   ; reverse så ordningen blir &amp;quot;naturlig&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  (with-output-to-file filnamn #:exists &#039;replace&lt;br /&gt;
    (λ ()&lt;br /&gt;
      (display-table rubriker)&lt;br /&gt;
      (display-table rader)))&lt;br /&gt;
  &lt;br /&gt;
  (printf &amp;quot;* Sparat ~a personer till CSV-filen \&amp;quot;~a\&amp;quot;\n&amp;quot; (length personer) filnamn))&lt;br /&gt;
&lt;br /&gt;
;; LADDA från CSV&lt;br /&gt;
(define (ladda-personer-csv [filnamn csv-fil])&lt;br /&gt;
  (if (file-exists? filnamn)&lt;br /&gt;
      (let* ([reader (make-csv-reader (open-input-file filnamn))]&lt;br /&gt;
             [all-rows (csv-&amp;gt;list reader)] ;konvertera från csv till Lisp lista&lt;br /&gt;
             [data-rows (if (empty? all-rows) &#039;() (rest all-rows))]) ; hoppa över rubrik-rad&lt;br /&gt;
&lt;br /&gt;
        (define nya-personer&lt;br /&gt;
          (for/list ([row data-rows])&lt;br /&gt;
            (list (cons &#039;förnamn (list-ref row 0))&lt;br /&gt;
                  (cons &#039;efternamn (list-ref row 1))&lt;br /&gt;
                  (cons &#039;ålder (list-ref row 2))        ; behåll som sträng eller konvertera &lt;br /&gt;
                  (cons &#039;stad (list-ref row 3))         ; med string-&amp;gt;number om du vill&lt;br /&gt;
                  (cons &#039;telefon (list-ref row 4)))))&lt;br /&gt;
&lt;br /&gt;
        (set! personer (append nya-personer personer))  ; eller (set! personer nya-personer) om du vill ersätta&lt;br /&gt;
        (printf &amp;quot;* Laddat ~a personer från CSV-filen \&amp;quot;~a\&amp;quot;\n&amp;quot; (length nya-personer) filnamn))&lt;br /&gt;
      (printf &amp;quot;! CSV-filen \&amp;quot;~a\&amp;quot; finns inte.\n&amp;quot; filnamn)))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;; SORTERA PERSONER&lt;br /&gt;
;; Sorterar först på efternamn över hela listan&lt;br /&gt;
;; därefter på efternamn. Då blir det som det ska&lt;br /&gt;
(define (sortera-personer)&lt;br /&gt;
  ;; Steg 1: Sortera på förnamn&lt;br /&gt;
  (set! personer&lt;br /&gt;
        (sort personer&lt;br /&gt;
              (λ (p1 p2)&lt;br /&gt;
                (string-ci&amp;lt;? (cdr (assoc &#039;förnamn p1))        ;string-ci är &amp;quot;string case insensitive&amp;quot;&lt;br /&gt;
                             (cdr (assoc &#039;förnamn p2))))))    &lt;br /&gt;
&lt;br /&gt;
  ;; Steg 2: Sortera på efternamn (detta blir den slutgiltiga ordningen)&lt;br /&gt;
  (set! personer&lt;br /&gt;
        (sort personer&lt;br /&gt;
              (λ (p1 p2)&lt;br /&gt;
                (string-ci&amp;lt;? (cdr (assoc &#039;efternamn p1))&lt;br /&gt;
                             (cdr (assoc &#039;efternamn p2))))))&lt;br /&gt;
&lt;br /&gt;
  personer)   ; returnerar den sorterade listan (bra för kedjad användning)&lt;br /&gt;
&lt;br /&gt;
;; ================================================================&lt;br /&gt;
;; Exempel på användning&lt;br /&gt;
;; ================================================================&lt;br /&gt;
&lt;br /&gt;
;; Skapa testpersoner, detta behöver vi bara göra en gång för sedan skrivs den till disk och&lt;br /&gt;
;; vi behöver därefter bara hämta den vid behov!&lt;br /&gt;
&lt;br /&gt;
(skapa-person #:förnamn &amp;quot;Anna&amp;quot;      #:efternamn &amp;quot;Andersson&amp;quot; #:ålder 34  #:stad &amp;quot;Stockholm&amp;quot; #:telefon &amp;quot;070-123 45 67&amp;quot;)&lt;br /&gt;
(skapa-person #:förnamn &amp;quot;Rickard&amp;quot;   #:efternamn &amp;quot;Nilsson&amp;quot;   #:ålder 28  #:stad &amp;quot;Kista&amp;quot;)&lt;br /&gt;
(skapa-person #:förnamn &amp;quot;Enar&amp;quot;      #:efternamn &amp;quot;Nilsson&amp;quot;   #:ålder &amp;quot;74&amp;quot; #:stad &amp;quot;Färjestaden&amp;quot;)&lt;br /&gt;
(skapa-person #:förnamn &amp;quot;Anna&amp;quot;      #:efternamn &amp;quot;Svensson&amp;quot;  #:ålder 45  #:stad &amp;quot;Malmö&amp;quot;)&lt;br /&gt;
(skapa-person #:förnamn &amp;quot;Johan&amp;quot;     #:efternamn &amp;quot;Larsson&amp;quot;   #:ålder 31  #:stad &amp;quot;Stockholm&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
(sortera-personer)&lt;br /&gt;
&lt;br /&gt;
(spara-personer-csv &amp;quot;personlista.csv&amp;quot;) &lt;br /&gt;
&lt;br /&gt;
(displayln &amp;quot;=== Personer efter skapande ===&amp;quot;)&lt;br /&gt;
(pretty-print-persons (hitta-person))&lt;br /&gt;
&lt;br /&gt;
;; Spara både binärt och CSV&lt;br /&gt;
(displayln &amp;quot;\n=== Sparar till disk (både .dat och .csv) ===&amp;quot;)&lt;br /&gt;
(spara-personer &amp;quot;personlista.dat&amp;quot;)&lt;br /&gt;
(spara-personer-csv &amp;quot;personlista.csv&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
;; Rensa minnet (simulerar omstart)&lt;br /&gt;
(set! personer &#039;())&lt;br /&gt;
(displayln &amp;quot;\n=== Listan rensad ===&amp;quot;)&lt;br /&gt;
(pretty-print-persons (hitta-person))&lt;br /&gt;
&lt;br /&gt;
;; Ladda tillbaka&lt;br /&gt;
(displayln &amp;quot;\n=== Laddar från Lispdata ===&amp;quot;)&lt;br /&gt;
(ladda-personer &amp;quot;personlista.dat&amp;quot;)&lt;br /&gt;
(pretty-print-persons (hitta-person))&lt;br /&gt;
&lt;br /&gt;
(set! personer &#039;()) ; Nolla listan igen&lt;br /&gt;
&lt;br /&gt;
(ladda-personer-csv &amp;quot;personlista.csv&amp;quot;)&lt;br /&gt;
(displayln &amp;quot;\n=== Personer efter laddning från CSV ===&amp;quot;)&lt;br /&gt;
(pretty-print-persons (hitta-person))&lt;br /&gt;
&lt;br /&gt;
;; Exempel på sökning efter laddning&lt;br /&gt;
(displayln &amp;quot;\n=== Sök efter laddning (förnamn anna) ===&amp;quot;)&lt;br /&gt;
(pretty-print-persons (hitta-person #:förnamn &amp;quot;anna&amp;quot;))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Racket/base24&amp;diff=1859</id>
		<title>Racket/base24</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Racket/base24&amp;diff=1859"/>
		<updated>2026-04-24T15:23:05Z</updated>

		<summary type="html">&lt;p&gt;Anders: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Algoritmer]]&lt;br /&gt;
[[category:Programmering]]&lt;br /&gt;
[[category:Racket]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#lang racket&lt;br /&gt;
&lt;br /&gt;
;;;;;&lt;br /&gt;
;; BASE24 encoder/decoder&lt;br /&gt;
;; Täpp-Anders Sikvall, anders@sikvall.se, 2026-04-07&lt;br /&gt;
;;&lt;br /&gt;
;; USAGE&lt;br /&gt;
;;          racket base24.rkt --encode &amp;lt; INPUT_FILE &amp;gt; OUTPUT_FILE&lt;br /&gt;
;;          racket base24.rkt --decode &amp;lt; INPUT_FILE &amp;gt; OUTPUT_FILE&lt;br /&gt;
;;&lt;br /&gt;
;; COMMENT&lt;br /&gt;
;;          This does not precede the coded data with any kind of header&lt;br /&gt;
;;          and the error control and handling is abysmally minimal but&lt;br /&gt;
;;          it shows the ease of implementing something like this compared&lt;br /&gt;
;;          to languages like C.&lt;br /&gt;
;;&lt;br /&gt;
;; EXPLANATION&lt;br /&gt;
;;          The program treats the entire input as a bignum and then basically&lt;br /&gt;
;;          converts it to the output by repeated division and looking up the&lt;br /&gt;
;;          quotient in the BASE24 alphabet. Since the bignum implementation&lt;br /&gt;
;;          is so efficient in Racket/Scheme this means it will be effective&lt;br /&gt;
;;          even for moderately large files.&lt;br /&gt;
;;&lt;br /&gt;
;;&lt;br /&gt;
&lt;br /&gt;
;; BASE24 Alfabet (exkluderar förväxlingsbara tecken)&lt;br /&gt;
(define alphabet &amp;quot;BCDFGHJKMPQRTVWXY2346789&amp;quot;)&lt;br /&gt;
(define base 24)&lt;br /&gt;
(define max-col 68)&lt;br /&gt;
&lt;br /&gt;
;; Skapar en map för snabb uppslagning vid avkodning&lt;br /&gt;
(define char-to-val&lt;br /&gt;
  (for/hash ([c (in-string alphabet)]&lt;br /&gt;
             [i (in-naturals)])&lt;br /&gt;
    (values c i)))&lt;br /&gt;
&lt;br /&gt;
;; Hjälpfunktion för att skriva ut med radbrytningar&lt;br /&gt;
(define (display-with-breaks str)&lt;br /&gt;
  (let loop ([remaining str])&lt;br /&gt;
    (cond&lt;br /&gt;
      [(&amp;lt;= (string-length remaining) max-col)&lt;br /&gt;
       (displayln remaining)]&lt;br /&gt;
      [else&lt;br /&gt;
       (displayln (substring remaining 0 max-col))&lt;br /&gt;
       (loop (substring remaining max-col))])))&lt;br /&gt;
&lt;br /&gt;
;; --- ENCODER ---&lt;br /&gt;
(define (encode)&lt;br /&gt;
  (let* ([input-bytes (port-&amp;gt;bytes (current-input-port))]&lt;br /&gt;
         [num (bytes-&amp;gt;integer input-bytes)])&lt;br /&gt;
    (if (zero? num)&lt;br /&gt;
        (displayln (string-ref alphabet 0))&lt;br /&gt;
        (let loop ([n num] [res &#039;()])&lt;br /&gt;
          (if (zero? n)&lt;br /&gt;
              (display-with-breaks (list-&amp;gt;string res))&lt;br /&gt;
              (loop (quotient n base)&lt;br /&gt;
                    (cons (string-ref alphabet (remainder n base)) res)))))))&lt;br /&gt;
&lt;br /&gt;
;; --- DECODER ---&lt;br /&gt;
(define (decode)&lt;br /&gt;
  ;; Vi rensar bort eventuella radbrytningar/whitespaces innan vi avkodar&lt;br /&gt;
  (let* ([raw-input (port-&amp;gt;string (current-input-port))]&lt;br /&gt;
         [input-str (regexp-replace* #px&amp;quot;\\s+&amp;quot; raw-input &amp;quot;&amp;quot;)]&lt;br /&gt;
         [num (for/fold ([n 0])&lt;br /&gt;
                        ([char (in-string input-str)])&lt;br /&gt;
                (+ (* n base) (hash-ref char-to-val char)))])&lt;br /&gt;
    (display (integer-&amp;gt;bytes num))))&lt;br /&gt;
&lt;br /&gt;
;; --- KONVERTERINGSFUNKTIONER ---&lt;br /&gt;
(define (bytes-&amp;gt;integer b)&lt;br /&gt;
  (for/fold ([n 0])&lt;br /&gt;
            ([byte (in-bytes b)])&lt;br /&gt;
    (+ (arithmetic-shift n 8) byte)))&lt;br /&gt;
&lt;br /&gt;
(define (integer-&amp;gt;bytes n)&lt;br /&gt;
  (if (zero? n)&lt;br /&gt;
      (bytes 0)&lt;br /&gt;
      (let loop ([i n] [res &#039;()])&lt;br /&gt;
        (if (zero? i)&lt;br /&gt;
            (list-&amp;gt;bytes res)&lt;br /&gt;
            (loop (arithmetic-shift i -8)&lt;br /&gt;
                  (cons (bitwise-and i #xFF) res))))))&lt;br /&gt;
&lt;br /&gt;
;; --- CLI HANTERING ---&lt;br /&gt;
(define (main)&lt;br /&gt;
  (match (current-command-line-arguments)&lt;br /&gt;
    [(vector (or &amp;quot;--encode&amp;quot; &amp;quot;-e&amp;quot;)) (encode)]&lt;br /&gt;
    [(vector (or &amp;quot;--decode&amp;quot; &amp;quot;-d&amp;quot;)) (decode)]&lt;br /&gt;
    [_ (displayln &amp;quot;Användning: racket base24.rkt [--encode | --decode]&amp;quot;)]))&lt;br /&gt;
&lt;br /&gt;
(main)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Racket/Hexdump&amp;diff=1858</id>
		<title>Racket/Hexdump</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Racket/Hexdump&amp;diff=1858"/>
		<updated>2026-04-24T15:22:55Z</updated>

		<summary type="html">&lt;p&gt;Anders: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Algoritmer]]&lt;br /&gt;
[[category:Programmering]]&lt;br /&gt;
[[category:Racket]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#lang racket&lt;br /&gt;
&lt;br /&gt;
;;;;;&lt;br /&gt;
;; Hexdump implementerad i Racket&lt;br /&gt;
;; Täpp-Anders Sikvall 2026-04-03 anders@sikvall.se&lt;br /&gt;
;;;;;&lt;br /&gt;
&lt;br /&gt;
;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;br /&gt;
;; SYNOPSIS&lt;br /&gt;
;;         racket hexdump.rkt [ OPTIONS ] filename&lt;br /&gt;
;;&lt;br /&gt;
;; OPTIONS&lt;br /&gt;
;;         -h                     Gives a short help text to the utility&lt;br /&gt;
;;         --bytes-per-line, -n   Determines how many bytes are decoded per line (default 16)&lt;br /&gt;
;;         --hex, -x              Show only hex dump&lt;br /&gt;
;;         --ascii, -a            Show only ASCII dump&lt;br /&gt;
&lt;br /&gt;
(require racket/cmdline)&lt;br /&gt;
&lt;br /&gt;
(define (hexdump-file filename &lt;br /&gt;
                      #:only-hex? [only-hex? #f]&lt;br /&gt;
                      #:only-ascii? [only-ascii? #f]&lt;br /&gt;
                      #:bytes-per-line [n 16])&lt;br /&gt;
  (printf &amp;quot;Läser fil: ~a (~a bytes)\n\n&amp;quot; filename (file-size filename))&lt;br /&gt;
  (call-with-input-file filename&lt;br /&gt;
    (λ (in)&lt;br /&gt;
      (let loop ([offset 0])&lt;br /&gt;
        (define chunk (read-bytes n in))&lt;br /&gt;
        (cond&lt;br /&gt;
          [(eof-object? chunk) (void)]&lt;br /&gt;
          [(bytes? chunk)&lt;br /&gt;
           (define len (bytes-length chunk))&lt;br /&gt;
           (printf &amp;quot;~a  &amp;quot; (~r offset #:base 16 #:min-width 8 #:pad-string &amp;quot;0&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
           (define show-both? (not (xor only-hex? only-ascii?)))&lt;br /&gt;
&lt;br /&gt;
           (cond&lt;br /&gt;
             [(and only-hex? (not show-both?))&lt;br /&gt;
              (for ([i (in-range n)])&lt;br /&gt;
                (printf &amp;quot;~a &amp;quot; (if (&amp;lt; i len)&lt;br /&gt;
                                  (~r (bytes-ref chunk i) #:base 16 #:min-width 2 #:pad-string &amp;quot;0&amp;quot;)&lt;br /&gt;
                                  &amp;quot;  &amp;quot;))&lt;br /&gt;
                (when (and (= (modulo (add1 i) 8) 0) (&amp;lt; i (sub1 n)))&lt;br /&gt;
                  (display &amp;quot; &amp;quot;)))&lt;br /&gt;
              (newline)]&lt;br /&gt;
&lt;br /&gt;
             [(and only-ascii? (not show-both?))&lt;br /&gt;
              (display &amp;quot;   |&amp;quot;)&lt;br /&gt;
              (for ([b (in-bytes chunk)]) (display (if (and (&amp;gt;= b 32) (&amp;lt;= b 126)) (integer-&amp;gt;char b) &amp;quot;.&amp;quot;)))&lt;br /&gt;
              (for ([_ (in-range (- n len))]) (display &amp;quot; &amp;quot;))&lt;br /&gt;
              (display &amp;quot;|\n&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
             [else  ; båda eller ingen flagga&lt;br /&gt;
              (for ([i (in-range n)])&lt;br /&gt;
                (printf &amp;quot;~a &amp;quot; (if (&amp;lt; i len)&lt;br /&gt;
                                  (~r (bytes-ref chunk i) #:base 16 #:min-width 2 #:pad-string &amp;quot;0&amp;quot;)&lt;br /&gt;
                                  &amp;quot;  &amp;quot;))&lt;br /&gt;
                (when (and (= (modulo (add1 i) 8) 0) (&amp;lt; i (sub1 n)))&lt;br /&gt;
                  (display &amp;quot; &amp;quot;)))&lt;br /&gt;
              (display &amp;quot;|&amp;quot;)&lt;br /&gt;
              (for ([b (in-bytes chunk)]) (display (if (and (&amp;gt;= b 32) (&amp;lt;= b 126)) (integer-&amp;gt;char b) &amp;quot;.&amp;quot;)))&lt;br /&gt;
              (for ([_ (in-range (- n len))]) (display &amp;quot; &amp;quot;))&lt;br /&gt;
              (display &amp;quot;|\n&amp;quot;)])&lt;br /&gt;
&lt;br /&gt;
           (loop (+ offset n))])))))&lt;br /&gt;
&lt;br /&gt;
(define-values (filename only-hex? only-ascii? bytes-per-line)&lt;br /&gt;
  (let ([only-hex? #f] [only-ascii? #f] [bytes-per-line 16])&lt;br /&gt;
    (command-line&lt;br /&gt;
     #:program &amp;quot;hexdump&amp;quot;&lt;br /&gt;
     #:usage-help &amp;quot;Användning: racket hexdump.rkt [alternativ] &amp;lt;fil&amp;gt;&amp;quot;&lt;br /&gt;
     #:once-each&lt;br /&gt;
     [(&amp;quot;-x&amp;quot; &amp;quot;--hex&amp;quot;)   &amp;quot;Visa endast hex-delen&amp;quot;  (set! only-hex? #t)]&lt;br /&gt;
     [(&amp;quot;-a&amp;quot; &amp;quot;--ascii&amp;quot;) &amp;quot;Visa endast ASCII-delen&amp;quot; (set! only-ascii? #t)]&lt;br /&gt;
     [(&amp;quot;-n&amp;quot; &amp;quot;--bytes-per-line&amp;quot;) n&lt;br /&gt;
      &amp;quot;Antal bytes per rad (standard: 16)&amp;quot; (let ([num (string-&amp;gt;number n)]) (when num (set! bytes-per-line num)))]&lt;br /&gt;
     #:args (filename)&lt;br /&gt;
     (values filename only-hex? only-ascii? bytes-per-line))))&lt;br /&gt;
&lt;br /&gt;
(if (not (file-exists? filename))&lt;br /&gt;
    (printf &amp;quot;Fel: Filen \&amp;quot;~a\&amp;quot; finns inte.\n&amp;quot; filename)&lt;br /&gt;
    (hexdump-file filename &lt;br /&gt;
                  #:only-hex? only-hex?&lt;br /&gt;
                  #:only-ascii? only-ascii?&lt;br /&gt;
                  #:bytes-per-line bytes-per-line))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Racket/Erastothenes&amp;diff=1857</id>
		<title>Racket/Erastothenes</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Racket/Erastothenes&amp;diff=1857"/>
		<updated>2026-04-24T15:22:44Z</updated>

		<summary type="html">&lt;p&gt;Anders: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Algoritmer]]&lt;br /&gt;
[[category:Programmering]]&lt;br /&gt;
[[category:Racket]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#lang racket&lt;br /&gt;
&lt;br /&gt;
;;;;;&lt;br /&gt;
;; Erastothenes såll implementerad i Racket&lt;br /&gt;
;; Täpp-Anders Sikvall 2026-04-03 anders@sikvall.se&lt;br /&gt;
;;;;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;; Skapar en vektor där indexet motsvarar talet.&lt;br /&gt;
;; Om (vector-ref v n) är #t, så är n ett primtal.&lt;br /&gt;
&lt;br /&gt;
(define (make-sieve limit)&lt;br /&gt;
  (define sieve (make-vector (add1 limit) #t))&lt;br /&gt;
  &lt;br /&gt;
  ;; 0 och 1 är aldrig primtal&lt;br /&gt;
  (when (&amp;gt;= limit 0) (vector-set! sieve 0 #f))&lt;br /&gt;
  (when (&amp;gt;= limit 1) (vector-set! sieve 1 #f))&lt;br /&gt;
  &lt;br /&gt;
  ;; Vi behöver bara gå upp till kvadratroten av limit&lt;br /&gt;
  (for ([p (in-range 2 (add1 (integer-sqrt limit)))])&lt;br /&gt;
    (when (vector-ref sieve p)&lt;br /&gt;
      ;; Markera alla multiplar av p som falska (starta vid p*p)&lt;br /&gt;
      (for ([multiple (in-range (* p p) (add1 limit) p)])&lt;br /&gt;
        (vector-set! sieve multiple #f))))&lt;br /&gt;
  sieve)&lt;br /&gt;
&lt;br /&gt;
;; Returnerar en lista med alla primtal mellan start och stop&lt;br /&gt;
(define (primes-between start stop)&lt;br /&gt;
  (if (&amp;gt; start stop)&lt;br /&gt;
      &#039;() ;Returnerar tomt om start &amp;gt; stop&lt;br /&gt;
      (let ([is-prime? (make-sieve stop)])&lt;br /&gt;
        (for/list ([n (in-range (max start 2) (add1 stop))]&lt;br /&gt;
                   #:when (vector-ref is-prime? n))&lt;br /&gt;
          n))))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;; Testkörning&lt;br /&gt;
(primes-between 10 50)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Racket&amp;diff=1856</id>
		<title>Racket</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Racket&amp;diff=1856"/>
		<updated>2026-04-24T15:21:24Z</updated>

		<summary type="html">&lt;p&gt;Anders: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Racket är ett programmeringsspråk i Lispfamiljen och underfamilj till Scheme. Det är kompatibelt med Scheme R5RS och andra varianter men har också ett eget väl utbyggt bibliotek av funktioner och rutiner och kanske en av de enklaste språken att komma igång och skapa GUI-applikationer i.&lt;br /&gt;
&lt;br /&gt;
= Installation Ubuntu = &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo add-apt-repository ppa:plt/racket -y&lt;br /&gt;
sudo apt update &lt;br /&gt;
sudo apt install racket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kör igång det inbyggda IDE:t med &amp;quot;drracket&amp;quot; antingen från applikationsmenyn eller terminalen.&lt;br /&gt;
&lt;br /&gt;
= Kodexempel (Sommarhack 2026) =&lt;br /&gt;
&lt;br /&gt;
# [[Racket/Erastothenes]]&lt;br /&gt;
# [[Racket/Hexdump]]&lt;br /&gt;
# [[Racket/base24]]&lt;br /&gt;
# [[Racket/Personreg]]&lt;br /&gt;
# [[Racket/RLE]]&lt;br /&gt;
# [[Racket/Lille-GUI]]&lt;br /&gt;
# [[Racket/Multitråd]]&lt;br /&gt;
# [[Racket/6502-emu]]&lt;br /&gt;
# [[Racket/Genetic]]&lt;br /&gt;
# [[Racket/Markov]]&lt;br /&gt;
# [[Racket/Neural]]&lt;br /&gt;
# [[Racket/Posits]]&lt;br /&gt;
# [[Racket/3D-boll]] -- från Olme&lt;br /&gt;
&lt;br /&gt;
[[category:Racket]]&lt;br /&gt;
[[category:Programmering]]&lt;br /&gt;
[[category:Algoritmer]]&lt;br /&gt;
[[category:Förgreningssida]]&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Fisher-Yates_Shuffle&amp;diff=1855</id>
		<title>Fisher-Yates Shuffle</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Fisher-Yates_Shuffle&amp;diff=1855"/>
		<updated>2026-04-24T15:19:35Z</updated>

		<summary type="html">&lt;p&gt;Anders: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bakgrund ==&lt;br /&gt;
&lt;br /&gt;
Fisher-Yates är en algoritm som används för att slumpmässigt omfördela innehållet i en grupp på ett sätt som fungerar ungefär som när man blandar en kortlek. Det ger minsta möjliga bias även om pseudoslumptalskällan inte är välfiltrerad och ren.&lt;br /&gt;
&lt;br /&gt;
Sättet som algoritmen arbetar på fungerar ungefär som när man plockar lotter ur en tombola eller blandar en kortlek där man drar en efter en tills det inte längre finns några att dra. Rätt använd är biasen väldigt låg.&lt;br /&gt;
&lt;br /&gt;
Andra namn är också &#039;&#039;the Knuth Shuffle&#039;&#039; efter matematikern Donald E. Knuth som använder denna.&lt;br /&gt;
&lt;br /&gt;
== Funktion ==&lt;br /&gt;
&lt;br /&gt;
Som ett exempel skall vi permutera numren 1 till 8 genom att använda Fisher-Yates metod. Vi skriver talen på en bit papper:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range !! Roll !! Scratch !! Result&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; || &amp;amp;nbsp; || 1 2 3 4 5 6 7 8 || &amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nu slumpar vi ett tal &#039;&#039;k&#039;&#039; mellan 1-8, vi kan säga att det blev 3 så vi stryker det 3:e numret från papperet och flyttar det till resultatrutan.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range !! Roll !! Scratch !! Result&lt;br /&gt;
|-&lt;br /&gt;
| 1–8 || 3 || 1 2 &amp;lt;s&amp;gt;3&amp;lt;/s&amp;gt; 4 5 6 7 8 || 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Vi tar ett nytt slumpmässigt tal, denna gång från 1-7 som matchar de siffror vi ej har strukit. Låt oss säga att det blev 4, så vi stryker det fjärde ej redan strukna numret och flyttar det till resultatrutan.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range !! Roll !! Scratch !! Result&lt;br /&gt;
|-&lt;br /&gt;
| 1–7 || 4 || 1 2 &amp;lt;s&amp;gt;3&amp;lt;&amp;lt;/s&amp;gt; 4 &amp;lt;s&amp;gt;5&amp;lt;/s&amp;gt; 6 7 8 || 3 5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Vi fortsätter på samma vis med ett nytt slumptal, denna gång från 1-6 och sedan 1-5 osv ända tills alla tal är strukna.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range !! Roll !! Scratch !! Result&lt;br /&gt;
|-&lt;br /&gt;
| 1-6 || 5 || 1 2 &amp;lt;s&amp;gt;3&amp;lt;/s&amp;gt; 4 &amp;lt;s&amp;gt;5&amp;lt;/s&amp;gt; 6 &amp;lt;s&amp;gt;7&amp;lt;/s&amp;gt; 8 || 3 5 7&lt;br /&gt;
|-&lt;br /&gt;
| 1-5 || 3 || 1 2 &amp;lt;s&amp;gt;3&amp;lt;/s&amp;gt; &amp;lt;s&amp;gt;4&amp;lt;/s&amp;gt; &amp;lt;s&amp;gt;5&amp;lt;/s&amp;gt; 6 &amp;lt;s&amp;gt;7&amp;lt;/s&amp;gt; 8 || 3 5 7 4&lt;br /&gt;
|-&lt;br /&gt;
| 1-4 || 4 || 1 2 &amp;lt;s&amp;gt;3&amp;lt;/s&amp;gt; &amp;lt;s&amp;gt;4&amp;lt;/s&amp;gt; &amp;lt;s&amp;gt;5&amp;lt;/s&amp;gt; 6 &amp;lt;s&amp;gt;7&amp;lt;/s&amp;gt; &amp;lt;s&amp;gt;8&amp;lt;/s&amp;gt; || 3 5 7 4 8&lt;br /&gt;
|-&lt;br /&gt;
| 1-3 || 1 || &amp;lt;s&amp;gt;1&amp;lt;/s&amp;gt; 2 &amp;lt;s&amp;gt;3&amp;lt;/s&amp;gt; &amp;lt;s&amp;gt;4&amp;lt;/s&amp;gt; &amp;lt;s&amp;gt;5&amp;lt;/s&amp;gt; 6 &amp;lt;s&amp;gt;7&amp;lt;/s&amp;gt; &amp;lt;s&amp;gt;8&amp;lt;/s&amp;gt; || 3 5 7 4 8 1&lt;br /&gt;
|-&lt;br /&gt;
| 1-2 || 2 || &amp;lt;s&amp;gt;1&amp;lt;/s&amp;gt; 2 &amp;lt;s&amp;gt;3&amp;lt;/s&amp;gt; &amp;lt;s&amp;gt;4&amp;lt;/s&amp;gt; &amp;lt;s&amp;gt;5&amp;lt;/s&amp;gt; &amp;lt;s&amp;gt;6&amp;lt;/s&amp;gt; &amp;lt;s&amp;gt;7&amp;lt;/s&amp;gt; &amp;lt;s&amp;gt;8&amp;lt;/s&amp;gt; || 3 5 7 4 8 1 6&lt;br /&gt;
|-&lt;br /&gt;
| &amp;amp;nbsp; || &amp;amp;nbsp; || &amp;lt;s&amp;gt;1&amp;lt;/s&amp;gt; &amp;lt;s&amp;gt;2&amp;lt;/s&amp;gt; &amp;lt;s&amp;gt;3&amp;lt;/s&amp;gt; &amp;lt;s&amp;gt;4&amp;lt;/s&amp;gt; &amp;lt;s&amp;gt;5&amp;lt;/s&amp;gt; &amp;lt;s&amp;gt;6&amp;lt;/s&amp;gt; &amp;lt;s&amp;gt;7&amp;lt;/s&amp;gt; &amp;lt;s&amp;gt;8&amp;lt;/s&amp;gt; || 3 5 7 4 8 1 6 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
För att spara tid kan man byta plats med alla strukna tal och det sista talet i serien och därmed hela tiden ha en sammanhängande ordning med ostrukna tal. Se pseudokoden nedan som gör på det sättet.&lt;br /&gt;
&lt;br /&gt;
= Implementation = &lt;br /&gt;
&lt;br /&gt;
== Pseudokod ==&lt;br /&gt;
&lt;br /&gt;
Randomisera n element på plats i en array&lt;br /&gt;
&lt;br /&gt;
 for i from n-1 down to 1 do&lt;br /&gt;
     j = random(0..i)&lt;br /&gt;
     swap a[j], a[i]&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
Initialisera en array a med n elements från en slumpmässigt ordnad kopia av source&lt;br /&gt;
&lt;br /&gt;
 a[0] = source[0]&lt;br /&gt;
 for i from 1 to n-1 do&lt;br /&gt;
     j = random(0..i)&lt;br /&gt;
     a[i] = a[j]&lt;br /&gt;
     a[j] = source[i]&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
== C ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;time.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void fyshuffle(int *array, size_t n)&lt;br /&gt;
{&lt;br /&gt;
  size_t i, j;  // Elements in array to swap&lt;br /&gt;
  int temp;     // Temp store&lt;br /&gt;
  &lt;br /&gt;
  // Set the random generator using current time&lt;br /&gt;
  srand((unsigned int)time(NULL));&lt;br /&gt;
  for (i = n - 1; i &amp;gt; 0; i--) {&lt;br /&gt;
    j = rand() % (i + 1);&lt;br /&gt;
    int temp = array[j];&lt;br /&gt;
    array[j] = array[i];&lt;br /&gt;
    array[i] = temp;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]) {&lt;br /&gt;
  int array[15] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14};&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  fyshuffle(array, 15);&lt;br /&gt;
&lt;br /&gt;
  for (i = 0; i &amp;lt; 15; i++) {&lt;br /&gt;
    printf(&amp;quot;%d &amp;quot;, array[i]);&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[category:Programmering]]&lt;br /&gt;
[[category:Algoritmer]]&lt;br /&gt;
[[category:c]]&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Base64&amp;diff=1854</id>
		<title>Base64</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Base64&amp;diff=1854"/>
		<updated>2026-04-24T15:18:44Z</updated>

		<summary type="html">&lt;p&gt;Anders: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ofärdig}}&lt;br /&gt;
&lt;br /&gt;
[[category:c]]&lt;br /&gt;
[[category:programmering]]&lt;br /&gt;
[[category:algoritmer]]&lt;br /&gt;
&lt;br /&gt;
== Bakgrund ==&lt;br /&gt;
&lt;br /&gt;
Tidigare system använde Unix-to-Unix Encoding (UUE) för att koda information på ett sätt att det gick att skicka genom en 7 bitars överföringskanal. Detta system är sedan länge övergivet i moderna datorsystem och i stället använder man Base64 som är en mer effektiv metod.&lt;br /&gt;
&lt;br /&gt;
I korthet går det ut på att man tar in den data som skall kodas, delar upp det i symboler om 6 bitar och därefter kodar dem enligt &#039;&#039;Standardtabellen&#039;&#039; eller någon annan variant. Standardtabellen skall användas för all extern kommunikation eftersom det annars blir inkompatibelt mellan sändare och mottagare.&lt;br /&gt;
&lt;br /&gt;
Se även [[Base32]].&lt;br /&gt;
&lt;br /&gt;
== Procedur ==&lt;br /&gt;
&lt;br /&gt;
Indatat ses som en ström oktetter. Dessa grupperas om 3, dvs i 24 bitar och delas sedan i 6-bitarstal så att det blir 4 stycken 6-bitarsgrupper. Varje sexbitarsgrupp har då ett värde som svarar mot en kod i tabellen och denna kod skickas i stället för 6-bitsgruppen. Om den sista gruppen inte är 3 bytes utan 2 eller 1 motsvarar det bara 2-3 siffror i Base64.&lt;br /&gt;
&lt;br /&gt;
Base64 har fått sitt namn från att 2&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt;=64, nämligen antalet symboler i listan som kan skickas.&lt;br /&gt;
&lt;br /&gt;
Kodningen är baserad på följande:&lt;br /&gt;
* A-Z motsvarar 0-25&lt;br /&gt;
* a-z motsvarar 26-51&lt;br /&gt;
* 0-9 motsvarar 52-61&lt;br /&gt;
* &#039;+&#039; eller &#039;-&#039; motsvarar 62&lt;br /&gt;
* &#039;/&#039; eller &#039;_&#039; motsvarar 63&lt;br /&gt;
&lt;br /&gt;
Anledningen till de två sista är ekvivalenta är för att det ibland kan vara så att vissa system använder endera som signaleringstecken eller liknande och då är det bättre att koda med det andra tecknet i stället. Man måste dock acceptera alla varianter som mottagare men kan välja hur man kodar som sändare. Observera att man EJ bör byta tecken inom samma block.&lt;br /&gt;
&lt;br /&gt;
== Effektiviteten ==&lt;br /&gt;
Effektiviteten av kodningen är 3/4. Det betyder att för 24 bitar in produceras 32 bitar ut och det innebär att man därmed får en effektivitetssiffra på 0,75 vilket är ganska bra. Det är precis samma som för UUENCODE.&lt;br /&gt;
&lt;br /&gt;
== Standardtabellen ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Värde&lt;br /&gt;
! Siffra&lt;br /&gt;
|rowspan=17|&amp;amp;nbsp;&lt;br /&gt;
! Värde&lt;br /&gt;
! Siffra&lt;br /&gt;
|rowspan=17|&amp;amp;nbsp;&lt;br /&gt;
! Värde&lt;br /&gt;
! Siffra&lt;br /&gt;
|rowspan=17|&amp;amp;nbsp;&lt;br /&gt;
! Värde&lt;br /&gt;
! Siffra&lt;br /&gt;
|-&lt;br /&gt;
| 0 || A || 16 || Q || 32 || g || 48 || w&lt;br /&gt;
|-&lt;br /&gt;
| 1 || B || 17 || R || 33 || h || 49 || x&lt;br /&gt;
|-&lt;br /&gt;
| 2 || C || 18 || S || 34 || i || 50 || y&lt;br /&gt;
|-&lt;br /&gt;
| 3 || D || 19 || T || 35 || j || 51 || z&lt;br /&gt;
|-&lt;br /&gt;
| 4 || E || 20 || U || 36 || k || 52 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 5 || F || 21 || V || 37 || l || 53 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 6 || G || 22 || W || 38 || m || 54 || 2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || H || 23 || X || 39 || n || 55 || 3&lt;br /&gt;
|-&lt;br /&gt;
| 8 || I || 24 || Y || 40 || o || 56 || 4&lt;br /&gt;
|-&lt;br /&gt;
| 9 || J || 25 || Z || 41 || p || 57 || 5&lt;br /&gt;
|-&lt;br /&gt;
|10 || K || 26 || a || 42 || q || 58 || 6&lt;br /&gt;
|-&lt;br /&gt;
|11 || L || 27 || b || 43 || r || 59 || 7&lt;br /&gt;
|-&lt;br /&gt;
|12 || M || 28 || c || 44 || s || 60 || 8&lt;br /&gt;
|-&lt;br /&gt;
|13 || N || 29 || d || 45 || t || 61 || 9&lt;br /&gt;
|-&lt;br /&gt;
|14 || O || 30 || e || 46 || u || 62 || + -&lt;br /&gt;
|-&lt;br /&gt;
|15 || P || 31 || f || 47 || v || 63 || / _&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exempel:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;row&amp;quot;| Text&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot; align=&amp;quot;center&amp;quot;| &#039;&#039;&#039;M&#039;&#039;&#039;&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot; align=&amp;quot;center&amp;quot;| &#039;&#039;&#039;a&#039;&#039;&#039;&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot; align=&amp;quot;center&amp;quot;| &#039;&#039;&#039;n&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;row&amp;quot;| ASCII-värden&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot; align=&amp;quot;center&amp;quot;| 77&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot; align=&amp;quot;center&amp;quot;| 97&lt;br /&gt;
|colspan=&amp;quot;8&amp;quot; align=&amp;quot;center&amp;quot;| 110&lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;row&amp;quot;| Bitmönster&lt;br /&gt;
|0||1||0||0||1||1||0||1||0||1||1||0||0||0||0||1||0||1||1||0||1||1||1||0&lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;row&amp;quot;| Värde per 6 bitar&lt;br /&gt;
|colspan=&amp;quot;6&amp;quot; align=&amp;quot;center&amp;quot;| 19&lt;br /&gt;
|colspan=&amp;quot;6&amp;quot; align=&amp;quot;center&amp;quot;| 22&lt;br /&gt;
|colspan=&amp;quot;6&amp;quot; align=&amp;quot;center&amp;quot;| 5&lt;br /&gt;
|colspan=&amp;quot;6&amp;quot; align=&amp;quot;center&amp;quot;| 46&lt;br /&gt;
|-&lt;br /&gt;
!scope=&amp;quot;row&amp;quot;| Base64-kodat&lt;br /&gt;
|colspan=&amp;quot;6&amp;quot; align=&amp;quot;center&amp;quot;| &#039;&#039;&#039;T&#039;&#039;&#039;&lt;br /&gt;
|colspan=&amp;quot;6&amp;quot; align=&amp;quot;center&amp;quot;| &#039;&#039;&#039;W&#039;&#039;&#039;&lt;br /&gt;
|colspan=&amp;quot;6&amp;quot; align=&amp;quot;center&amp;quot;| &#039;&#039;&#039;F&#039;&#039;&#039;&lt;br /&gt;
|colspan=&amp;quot;6&amp;quot; align=&amp;quot;center&amp;quot;| &#039;&#039;&#039;u&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Implementationsexempel = &lt;br /&gt;
&lt;br /&gt;
== C ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// BASE64 kodningstabell&lt;br /&gt;
static const char base64_table[] = &amp;quot;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Funktion för BASE64 kodning (från tidigare)&lt;br /&gt;
char* base64_encode(const unsigned char* input, size_t length) {&lt;br /&gt;
    size_t output_length = 4 * ((length + 2) / 3);&lt;br /&gt;
    char* encoded = malloc(output_length + 1);&lt;br /&gt;
    &lt;br /&gt;
    if (encoded == NULL) return NULL;&lt;br /&gt;
    &lt;br /&gt;
    size_t i, j;&lt;br /&gt;
    for (i = 0, j = 0; i &amp;lt; length;) {&lt;br /&gt;
        unsigned int octet_a = i &amp;lt; length ? input[i++] : 0;&lt;br /&gt;
        unsigned int octet_b = i &amp;lt; length ? input[i++] : 0;&lt;br /&gt;
        unsigned int octet_c = i &amp;lt; length ? input[i++] : 0;&lt;br /&gt;
        &lt;br /&gt;
        unsigned int triple = (octet_a &amp;lt;&amp;lt; 16) + (octet_b &amp;lt;&amp;lt; 8) + octet_c;&lt;br /&gt;
        &lt;br /&gt;
        encoded[j++] = base64_table[(triple &amp;gt;&amp;gt; 18) &amp;amp; 0x3F];&lt;br /&gt;
        encoded[j++] = base64_table[(triple &amp;gt;&amp;gt; 12) &amp;amp; 0x3F];&lt;br /&gt;
        encoded[j++] = base64_table[(triple &amp;gt;&amp;gt; 6) &amp;amp; 0x3F];&lt;br /&gt;
        encoded[j++] = base64_table[triple &amp;amp; 0x3F];&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    switch (length % 3) {&lt;br /&gt;
        case 1:&lt;br /&gt;
            encoded[j - 2] = &#039;=&#039;;&lt;br /&gt;
            encoded[j - 1] = &#039;=&#039;;&lt;br /&gt;
            break;&lt;br /&gt;
        case 2:&lt;br /&gt;
            encoded[j - 1] = &#039;=&#039;;&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    encoded[output_length] = &#039;\0&#039;;&lt;br /&gt;
    return encoded;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Funktion för BASE64 avkodning&lt;br /&gt;
unsigned char* base64_decode(const char* input, size_t* output_length) {&lt;br /&gt;
    size_t input_length = strlen(input);&lt;br /&gt;
    if (input_length % 4 != 0) return NULL; // Ogiltig BASE64-längd&lt;br /&gt;
    &lt;br /&gt;
    // Beräkna utdatalängd&lt;br /&gt;
    *output_length = input_length / 4 * 3;&lt;br /&gt;
    if (input[input_length - 1] == &#039;=&#039;) (*output_length)--;&lt;br /&gt;
    if (input[input_length - 2] == &#039;=&#039;) (*output_length)--;&lt;br /&gt;
    &lt;br /&gt;
    unsigned char* decoded = malloc(*output_length);&lt;br /&gt;
    if (decoded == NULL) return NULL;&lt;br /&gt;
    &lt;br /&gt;
    // Skapa lookup-tabell för snabbare avkodning&lt;br /&gt;
    unsigned char decode_table[256] = {0};&lt;br /&gt;
    for (int i = 0; i &amp;lt; 64; i++) {&lt;br /&gt;
        decode_table[(unsigned char)base64_table[i]] = i;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Avkoda 4 tecken åt gången till 3 bytes&lt;br /&gt;
    for (size_t i = 0, j = 0; i &amp;lt; input_length;) {&lt;br /&gt;
        unsigned int sextet_a = input[i] == &#039;=&#039; ? 0 : decode_table[(unsigned char)input[i]];&lt;br /&gt;
        i++;&lt;br /&gt;
        unsigned int sextet_b = input[i] == &#039;=&#039; ? 0 : decode_table[(unsigned char)input[i]];&lt;br /&gt;
        i++;&lt;br /&gt;
        unsigned int sextet_c = input[i] == &#039;=&#039; ? 0 : decode_table[(unsigned char)input[i]];&lt;br /&gt;
        i++;&lt;br /&gt;
        unsigned int sextet_d = input[i] == &#039;=&#039; ? 0 : decode_table[(unsigned char)input[i]];&lt;br /&gt;
        i++;&lt;br /&gt;
        &lt;br /&gt;
        unsigned int triple = (sextet_a &amp;lt;&amp;lt; 18) + (sextet_b &amp;lt;&amp;lt; 12) + &lt;br /&gt;
                            (sextet_c &amp;lt;&amp;lt; 6) + sextet_d;&lt;br /&gt;
        &lt;br /&gt;
        if (j &amp;lt; *output_length) decoded[j++] = (triple &amp;gt;&amp;gt; 16) &amp;amp; 0xFF;&lt;br /&gt;
        if (j &amp;lt; *output_length) decoded[j++] = (triple &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;&lt;br /&gt;
        if (j &amp;lt; *output_length) decoded[j++] = triple &amp;amp; 0xFF;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return decoded;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Testprogram&lt;br /&gt;
int main() {&lt;br /&gt;
    const char* original = &amp;quot;Hello World!&amp;quot;;&lt;br /&gt;
    size_t input_length = strlen(original);&lt;br /&gt;
    &lt;br /&gt;
    // Kodning&lt;br /&gt;
    char* encoded = base64_encode((const unsigned char*)original, input_length);&lt;br /&gt;
    if (!encoded) {&lt;br /&gt;
        printf(&amp;quot;Kodningsfel\n&amp;quot;);&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Avkodning&lt;br /&gt;
    size_t decoded_length;&lt;br /&gt;
    unsigned char* decoded = base64_decode(encoded, &amp;amp;decoded_length);&lt;br /&gt;
    if (!decoded) {&lt;br /&gt;
        printf(&amp;quot;Avkodningsfel\n&amp;quot;);&lt;br /&gt;
        free(encoded);&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Skriv ut resultat&lt;br /&gt;
    printf(&amp;quot;Original: %s\n&amp;quot;, original);&lt;br /&gt;
    printf(&amp;quot;Encoded: %s\n&amp;quot;, encoded);&lt;br /&gt;
    printf(&amp;quot;Decoded: %.*s\n&amp;quot;, (int)decoded_length, decoded);&lt;br /&gt;
    &lt;br /&gt;
    // Frigör minne&lt;br /&gt;
    free(encoded);&lt;br /&gt;
    free(decoded);&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[category:Formatspecifikation]]&lt;br /&gt;
[[category:Telekommunikation]]&lt;br /&gt;
[[category:Data]]&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Base32&amp;diff=1853</id>
		<title>Base32</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Base32&amp;diff=1853"/>
		<updated>2026-04-24T15:18:21Z</updated>

		<summary type="html">&lt;p&gt;Anders: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:c]]&lt;br /&gt;
[[category:programmering]]&lt;br /&gt;
[[category:algoritmer]]&lt;br /&gt;
&lt;br /&gt;
För bakgrundsinformation se [[Base64]]. &lt;br /&gt;
&lt;br /&gt;
= Implementation =&lt;br /&gt;
&lt;br /&gt;
= C = &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// BASE32 kodningstabell&lt;br /&gt;
static const char base32_table[] = &amp;quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ234567&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Funktion för BASE32 kodning&lt;br /&gt;
char* base32_encode(const unsigned char* input, size_t length) {&lt;br /&gt;
    // Beräkna utdatalängd: 8 tecken för varje 5 bytes&lt;br /&gt;
    size_t output_length = 8 * ((length + 4) / 5);&lt;br /&gt;
    char* encoded = malloc(output_length + 1);&lt;br /&gt;
    if (encoded == NULL) return NULL;&lt;br /&gt;
    &lt;br /&gt;
    size_t i = 0, j = 0;&lt;br /&gt;
    unsigned long buffer = 0;&lt;br /&gt;
    int bits_left = 0;&lt;br /&gt;
    &lt;br /&gt;
    while (i &amp;lt; length || bits_left &amp;gt; 0) {&lt;br /&gt;
        // Fyll buffert med upp till 5 bytes&lt;br /&gt;
        if (bits_left &amp;lt; 5 &amp;amp;&amp;amp; i &amp;lt; length) {&lt;br /&gt;
            buffer = (buffer &amp;lt;&amp;lt; 8) | input[i++];&lt;br /&gt;
            bits_left += 8;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        // Om vi har minst 5 bitar, ta ut ett BASE32-tecken&lt;br /&gt;
        if (bits_left &amp;gt;= 5) {&lt;br /&gt;
            int value = (buffer &amp;gt;&amp;gt; (bits_left - 5)) &amp;amp; 0x1F;&lt;br /&gt;
            encoded[j++] = base32_table[value];&lt;br /&gt;
            bits_left -= 5;&lt;br /&gt;
        } else if (i &amp;gt;= length) {&lt;br /&gt;
            // Padding för sista gruppen&lt;br /&gt;
            encoded[j++] = &#039;=&#039;;&lt;br /&gt;
            bits_left = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Fyll på med padding till multipel av 8&lt;br /&gt;
    while (j % 8 != 0) {&lt;br /&gt;
        encoded[j++] = &#039;=&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    encoded[j] = &#039;\0&#039;;&lt;br /&gt;
    return encoded;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Funktion för BASE32 avkodning&lt;br /&gt;
unsigned char* base32_decode(const char* input, size_t* output_length) {&lt;br /&gt;
    size_t input_length = strlen(input);&lt;br /&gt;
    if (input_length % 8 != 0) return NULL; // BASE32 måste vara multipler av 8&lt;br /&gt;
    &lt;br /&gt;
    // Räkna faktiska databytes (exkludera padding)&lt;br /&gt;
    size_t padding = 0;&lt;br /&gt;
    for (int i = input_length - 1; i &amp;gt;= 0 &amp;amp;&amp;amp; input[i] == &#039;=&#039;; i--) {&lt;br /&gt;
        padding++;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Beräkna utdatalängd&lt;br /&gt;
    *output_length = (input_length * 5) / 8 - padding;&lt;br /&gt;
    unsigned char* decoded = malloc(*output_length);&lt;br /&gt;
    if (decoded == NULL) return NULL;&lt;br /&gt;
    &lt;br /&gt;
    // Skapa lookup-tabell&lt;br /&gt;
    unsigned char decode_table[256] = {0};&lt;br /&gt;
    for (int i = 0; i &amp;lt; 32; i++) {&lt;br /&gt;
        decode_table[(unsigned char)base32_table[i]] = i;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    unsigned long buffer = 0;&lt;br /&gt;
    int bits_left = 0;&lt;br /&gt;
    size_t j = 0;&lt;br /&gt;
    &lt;br /&gt;
    for (size_t i = 0; i &amp;lt; input_length; i++) {&lt;br /&gt;
        if (input[i] == &#039;=&#039;) break;&lt;br /&gt;
        &lt;br /&gt;
        buffer = (buffer &amp;lt;&amp;lt; 5) | decode_table[(unsigned char)input[i]];&lt;br /&gt;
        bits_left += 5;&lt;br /&gt;
        &lt;br /&gt;
        if (bits_left &amp;gt;= 8) {&lt;br /&gt;
            decoded[j++] = (buffer &amp;gt;&amp;gt; (bits_left - 8)) &amp;amp; 0xFF;&lt;br /&gt;
            bits_left -= 8;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return decoded;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Testprogram&lt;br /&gt;
int main() {&lt;br /&gt;
    const char* original = &amp;quot;Hello World!&amp;quot;;&lt;br /&gt;
    size_t input_length = strlen(original);&lt;br /&gt;
    &lt;br /&gt;
    // Kodning&lt;br /&gt;
    char* encoded = base32_encode((const unsigned char*)original, input_length);&lt;br /&gt;
    if (!encoded) {&lt;br /&gt;
        printf(&amp;quot;Kodningsfel\n&amp;quot;);&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Avkodning&lt;br /&gt;
    size_t decoded_length;&lt;br /&gt;
    unsigned char* decoded = base32_decode(encoded, &amp;amp;decoded_length);&lt;br /&gt;
    if (!decoded) {&lt;br /&gt;
        printf(&amp;quot;Avkodningsfel\n&amp;quot;);&lt;br /&gt;
        free(encoded);&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Skriv ut resultat&lt;br /&gt;
    printf(&amp;quot;Original: %s\n&amp;quot;, original);&lt;br /&gt;
    printf(&amp;quot;BASE32: %s\n&amp;quot;, encoded);&lt;br /&gt;
    printf(&amp;quot;Decoded: %.*s\n&amp;quot;, (int)decoded_length, decoded);&lt;br /&gt;
    &lt;br /&gt;
    // Frigör minne&lt;br /&gt;
    free(encoded);&lt;br /&gt;
    free(decoded);&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Base24&amp;diff=1852</id>
		<title>Base24</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Base24&amp;diff=1852"/>
		<updated>2026-04-24T14:36:54Z</updated>

		<summary type="html">&lt;p&gt;Anders: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:c]]&lt;br /&gt;
[[category:programmering]]&lt;br /&gt;
[[category:algoritmer]]&lt;br /&gt;
&lt;br /&gt;
= Bakgrund = &lt;br /&gt;
&lt;br /&gt;
Base24 är inte en standardkodning och den är lite mer komplex än de som baseras på ett jämt antal oktetter som [[base32]] samt [[base64]] men det har en fördel också, vi använder bara stora bokstäver A-X.&lt;br /&gt;
&lt;br /&gt;
= Implementation =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
const char ALPHABET[] = &amp;quot;BCDFGHJKMNPQRTVWXY2346789&amp;quot;;&lt;br /&gt;
#define BASE 24&lt;br /&gt;
#define MAX_LINE 70&lt;br /&gt;
#define CHARS_PER_BLOCK 6 // 6 tecken för data täcker 24 bitar (24^6 &amp;gt; 2^24)&lt;br /&gt;
&lt;br /&gt;
int get_index(char c) {&lt;br /&gt;
    for (int i = 0; i &amp;lt; BASE; i++) if (ALPHABET[i] == c) return i;&lt;br /&gt;
    return -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void encode_block(const uint8_t *in, int len, char *out_buf) {&lt;br /&gt;
    uint32_t val = 0;&lt;br /&gt;
    // Packa indata till en 24-bitars integer&lt;br /&gt;
    if (len &amp;gt;= 1) val |= ((uint32_t)in[0] &amp;lt;&amp;lt; 16);&lt;br /&gt;
    if (len &amp;gt;= 2) val |= ((uint32_t)in[1] &amp;lt;&amp;lt; 8);&lt;br /&gt;
    if (len &amp;gt;= 3) val |= ((uint32_t)in[2]);&lt;br /&gt;
&lt;br /&gt;
    out_buf[0] = ALPHABET[len]; // Header: längd&lt;br /&gt;
    &lt;br /&gt;
    // Konvertera val till bas 24 över 6 tecken (position 1 till 6)&lt;br /&gt;
    uint32_t temp = val;&lt;br /&gt;
    for (int i = CHARS_PER_BLOCK; i &amp;gt;= 1; i--) {&lt;br /&gt;
        out_buf[i] = ALPHABET[temp % BASE];&lt;br /&gt;
        temp /= BASE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int decode_block(const char *in_buf, uint8_t *out_three) {&lt;br /&gt;
    int len = get_index(in_buf[0]);&lt;br /&gt;
    if (len &amp;lt; 0 || len &amp;gt; 3) return -1;&lt;br /&gt;
&lt;br /&gt;
    uint32_t val = 0;&lt;br /&gt;
    for (int i = 1; i &amp;lt;= CHARS_PER_BLOCK; i++) {&lt;br /&gt;
        int idx = get_index(in_buf[i]);&lt;br /&gt;
        if (idx == -1) return -1;&lt;br /&gt;
        // Vi bygger värdet baserat på positionell vikt&lt;br /&gt;
        val = val * BASE + idx;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (len &amp;gt;= 1) out_three[0] = (uint8_t)((val &amp;gt;&amp;gt; 16) &amp;amp; 0xFF);&lt;br /&gt;
    if (len &amp;gt;= 2) out_three[1] = (uint8_t)((val &amp;gt;&amp;gt; 8) &amp;amp; 0xFF);&lt;br /&gt;
    if (len &amp;gt;= 3) out_three[2] = (uint8_t)(val &amp;amp; 0xFF);&lt;br /&gt;
    &lt;br /&gt;
    return len;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void encode_stream() {&lt;br /&gt;
    printf(&amp;quot;--- BEGIN BASE24 ENCODED DATA ---\n&amp;quot;);&lt;br /&gt;
    uint8_t in[3];&lt;br /&gt;
    char out[CHARS_PER_BLOCK + 1];&lt;br /&gt;
    int bytes_read, line_pos = 0;&lt;br /&gt;
    while ((bytes_read = fread(in, 1, 3, stdin)) &amp;gt; 0) {&lt;br /&gt;
        encode_block(in, bytes_read, out);&lt;br /&gt;
        for (int i = 0; i &amp;lt; CHARS_PER_BLOCK + 1; i++) {&lt;br /&gt;
            putchar(out[i]);&lt;br /&gt;
            if (++line_pos &amp;gt;= MAX_LINE) {&lt;br /&gt;
                putchar(&#039;\n&#039;);&lt;br /&gt;
                line_pos = 0;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if (line_pos &amp;gt; 0) putchar(&#039;\n&#039;);&lt;br /&gt;
    printf(&amp;quot;--- END BASE24 ENCODED DATA ---\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void decode_stream() {&lt;br /&gt;
    int ch, count = 0;&lt;br /&gt;
    char block[CHARS_PER_BLOCK + 1];&lt;br /&gt;
    uint8_t out[3];&lt;br /&gt;
&lt;br /&gt;
    while ((ch = getchar()) != EOF) {&lt;br /&gt;
        if (ch == &#039;-&#039; || ch == &#039;\n&#039; || ch == &#039;\r&#039; || ch == &#039; &#039; || ch == &#039;\t&#039;) {&lt;br /&gt;
            if (ch == &#039;-&#039;) while ((ch = getchar()) != &#039;\n&#039; &amp;amp;&amp;amp; ch != EOF);&lt;br /&gt;
            continue;&lt;br /&gt;
        }&lt;br /&gt;
        block[count++] = (char)ch;&lt;br /&gt;
        if (count == CHARS_PER_BLOCK + 1) {&lt;br /&gt;
            int decoded = decode_block(block, out);&lt;br /&gt;
            if (decoded &amp;gt; 0) fwrite(out, 1, decoded, stdout);&lt;br /&gt;
            count = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void run_test_case(const char *name, uint8_t *orig, int len) {&lt;br /&gt;
    printf(&amp;quot;Testar: %s (%d bytes)\n&amp;quot;, name, len);&lt;br /&gt;
    &lt;br /&gt;
    int num_blocks = (len + 2) / 3;&lt;br /&gt;
    char *encoded = malloc(num_blocks * (CHARS_PER_BLOCK + 1));&lt;br /&gt;
    for (int i = 0; i &amp;lt; num_blocks; i++) {&lt;br /&gt;
        int chunk = (len - i * 3 &amp;gt; 3) ? 3 : (len - i * 3);&lt;br /&gt;
        encode_block(&amp;amp;orig[i * 3], chunk, &amp;amp;encoded[i * (CHARS_PER_BLOCK + 1)]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    uint8_t *reconstructed = malloc(num_blocks * 3);&lt;br /&gt;
    int total_decoded = 0;&lt;br /&gt;
    for (int i = 0; i &amp;lt; num_blocks; i++) {&lt;br /&gt;
        int res = decode_block(&amp;amp;encoded[i * (CHARS_PER_BLOCK + 1)], &amp;amp;reconstructed[total_decoded]);&lt;br /&gt;
        if (res &amp;gt; 0) total_decoded += res;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (total_decoded == len &amp;amp;&amp;amp; memcmp(orig, reconstructed, len) == 0) {&lt;br /&gt;
        printf(&amp;quot;  [PASS] Data matchar perfekt.\n&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
        printf(&amp;quot;  [FAIL] Korruption! Längd: %d/%d\n&amp;quot;, total_decoded, len);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    free(encoded);&lt;br /&gt;
    free(reconstructed);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void run_tests() {&lt;br /&gt;
    printf(&amp;quot;BASE24 SJÄLVTEST - FINAL VERSION\n================================\n&amp;quot;);&lt;br /&gt;
    uint8_t test1[13];&lt;br /&gt;
    for(int i=0; i&amp;lt;13; i++) test1[i] = (uint8_t)(rand() % 256);&lt;br /&gt;
    run_test_case(&amp;quot;13 bytes slumpdata (inkl. höga bitvärden)&amp;quot;, test1, 13);&lt;br /&gt;
&lt;br /&gt;
    uint8_t test2[12] = {0};&lt;br /&gt;
    run_test_case(&amp;quot;12 bytes nollor&amp;quot;, test2, 12);&lt;br /&gt;
&lt;br /&gt;
    uint8_t test3[] = &amp;quot;Klockrent, Täpp-Anders!&amp;quot;;&lt;br /&gt;
    run_test_case(&amp;quot;Sträng med UTF-8&amp;quot;, test3, strlen((char*)test3));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]) {&lt;br /&gt;
    if (argc &amp;lt; 2) return 1;&lt;br /&gt;
    if (strcmp(argv[1], &amp;quot;--test&amp;quot;) == 0) run_tests();&lt;br /&gt;
    else if (strcmp(argv[1], &amp;quot;--encode&amp;quot;) == 0 || strcmp(argv[1], &amp;quot;-e&amp;quot;) == 0) encode_stream();&lt;br /&gt;
    else if (strcmp(argv[1], &amp;quot;--decode&amp;quot;) == 0 || strcmp(argv[1], &amp;quot;-d&amp;quot;) == 0) decode_stream();&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Base24&amp;diff=1851</id>
		<title>Base24</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Base24&amp;diff=1851"/>
		<updated>2026-04-24T14:36:34Z</updated>

		<summary type="html">&lt;p&gt;Anders: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:c]]&lt;br /&gt;
[[castegory:programmering]]&lt;br /&gt;
[[category:algoritmer]]&lt;br /&gt;
&lt;br /&gt;
= Bakgrund = &lt;br /&gt;
&lt;br /&gt;
Base24 är inte en standardkodning och den är lite mer komplex än de som baseras på ett jämt antal oktetter som [[base32]] samt [[base64]] men det har en fördel också, vi använder bara stora bokstäver A-X.&lt;br /&gt;
&lt;br /&gt;
= Implementation =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
const char ALPHABET[] = &amp;quot;BCDFGHJKMNPQRTVWXY2346789&amp;quot;;&lt;br /&gt;
#define BASE 24&lt;br /&gt;
#define MAX_LINE 70&lt;br /&gt;
#define CHARS_PER_BLOCK 6 // 6 tecken för data täcker 24 bitar (24^6 &amp;gt; 2^24)&lt;br /&gt;
&lt;br /&gt;
int get_index(char c) {&lt;br /&gt;
    for (int i = 0; i &amp;lt; BASE; i++) if (ALPHABET[i] == c) return i;&lt;br /&gt;
    return -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void encode_block(const uint8_t *in, int len, char *out_buf) {&lt;br /&gt;
    uint32_t val = 0;&lt;br /&gt;
    // Packa indata till en 24-bitars integer&lt;br /&gt;
    if (len &amp;gt;= 1) val |= ((uint32_t)in[0] &amp;lt;&amp;lt; 16);&lt;br /&gt;
    if (len &amp;gt;= 2) val |= ((uint32_t)in[1] &amp;lt;&amp;lt; 8);&lt;br /&gt;
    if (len &amp;gt;= 3) val |= ((uint32_t)in[2]);&lt;br /&gt;
&lt;br /&gt;
    out_buf[0] = ALPHABET[len]; // Header: längd&lt;br /&gt;
    &lt;br /&gt;
    // Konvertera val till bas 24 över 6 tecken (position 1 till 6)&lt;br /&gt;
    uint32_t temp = val;&lt;br /&gt;
    for (int i = CHARS_PER_BLOCK; i &amp;gt;= 1; i--) {&lt;br /&gt;
        out_buf[i] = ALPHABET[temp % BASE];&lt;br /&gt;
        temp /= BASE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int decode_block(const char *in_buf, uint8_t *out_three) {&lt;br /&gt;
    int len = get_index(in_buf[0]);&lt;br /&gt;
    if (len &amp;lt; 0 || len &amp;gt; 3) return -1;&lt;br /&gt;
&lt;br /&gt;
    uint32_t val = 0;&lt;br /&gt;
    for (int i = 1; i &amp;lt;= CHARS_PER_BLOCK; i++) {&lt;br /&gt;
        int idx = get_index(in_buf[i]);&lt;br /&gt;
        if (idx == -1) return -1;&lt;br /&gt;
        // Vi bygger värdet baserat på positionell vikt&lt;br /&gt;
        val = val * BASE + idx;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (len &amp;gt;= 1) out_three[0] = (uint8_t)((val &amp;gt;&amp;gt; 16) &amp;amp; 0xFF);&lt;br /&gt;
    if (len &amp;gt;= 2) out_three[1] = (uint8_t)((val &amp;gt;&amp;gt; 8) &amp;amp; 0xFF);&lt;br /&gt;
    if (len &amp;gt;= 3) out_three[2] = (uint8_t)(val &amp;amp; 0xFF);&lt;br /&gt;
    &lt;br /&gt;
    return len;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void encode_stream() {&lt;br /&gt;
    printf(&amp;quot;--- BEGIN BASE24 ENCODED DATA ---\n&amp;quot;);&lt;br /&gt;
    uint8_t in[3];&lt;br /&gt;
    char out[CHARS_PER_BLOCK + 1];&lt;br /&gt;
    int bytes_read, line_pos = 0;&lt;br /&gt;
    while ((bytes_read = fread(in, 1, 3, stdin)) &amp;gt; 0) {&lt;br /&gt;
        encode_block(in, bytes_read, out);&lt;br /&gt;
        for (int i = 0; i &amp;lt; CHARS_PER_BLOCK + 1; i++) {&lt;br /&gt;
            putchar(out[i]);&lt;br /&gt;
            if (++line_pos &amp;gt;= MAX_LINE) {&lt;br /&gt;
                putchar(&#039;\n&#039;);&lt;br /&gt;
                line_pos = 0;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if (line_pos &amp;gt; 0) putchar(&#039;\n&#039;);&lt;br /&gt;
    printf(&amp;quot;--- END BASE24 ENCODED DATA ---\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void decode_stream() {&lt;br /&gt;
    int ch, count = 0;&lt;br /&gt;
    char block[CHARS_PER_BLOCK + 1];&lt;br /&gt;
    uint8_t out[3];&lt;br /&gt;
&lt;br /&gt;
    while ((ch = getchar()) != EOF) {&lt;br /&gt;
        if (ch == &#039;-&#039; || ch == &#039;\n&#039; || ch == &#039;\r&#039; || ch == &#039; &#039; || ch == &#039;\t&#039;) {&lt;br /&gt;
            if (ch == &#039;-&#039;) while ((ch = getchar()) != &#039;\n&#039; &amp;amp;&amp;amp; ch != EOF);&lt;br /&gt;
            continue;&lt;br /&gt;
        }&lt;br /&gt;
        block[count++] = (char)ch;&lt;br /&gt;
        if (count == CHARS_PER_BLOCK + 1) {&lt;br /&gt;
            int decoded = decode_block(block, out);&lt;br /&gt;
            if (decoded &amp;gt; 0) fwrite(out, 1, decoded, stdout);&lt;br /&gt;
            count = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void run_test_case(const char *name, uint8_t *orig, int len) {&lt;br /&gt;
    printf(&amp;quot;Testar: %s (%d bytes)\n&amp;quot;, name, len);&lt;br /&gt;
    &lt;br /&gt;
    int num_blocks = (len + 2) / 3;&lt;br /&gt;
    char *encoded = malloc(num_blocks * (CHARS_PER_BLOCK + 1));&lt;br /&gt;
    for (int i = 0; i &amp;lt; num_blocks; i++) {&lt;br /&gt;
        int chunk = (len - i * 3 &amp;gt; 3) ? 3 : (len - i * 3);&lt;br /&gt;
        encode_block(&amp;amp;orig[i * 3], chunk, &amp;amp;encoded[i * (CHARS_PER_BLOCK + 1)]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    uint8_t *reconstructed = malloc(num_blocks * 3);&lt;br /&gt;
    int total_decoded = 0;&lt;br /&gt;
    for (int i = 0; i &amp;lt; num_blocks; i++) {&lt;br /&gt;
        int res = decode_block(&amp;amp;encoded[i * (CHARS_PER_BLOCK + 1)], &amp;amp;reconstructed[total_decoded]);&lt;br /&gt;
        if (res &amp;gt; 0) total_decoded += res;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (total_decoded == len &amp;amp;&amp;amp; memcmp(orig, reconstructed, len) == 0) {&lt;br /&gt;
        printf(&amp;quot;  [PASS] Data matchar perfekt.\n&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
        printf(&amp;quot;  [FAIL] Korruption! Längd: %d/%d\n&amp;quot;, total_decoded, len);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    free(encoded);&lt;br /&gt;
    free(reconstructed);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void run_tests() {&lt;br /&gt;
    printf(&amp;quot;BASE24 SJÄLVTEST - FINAL VERSION\n================================\n&amp;quot;);&lt;br /&gt;
    uint8_t test1[13];&lt;br /&gt;
    for(int i=0; i&amp;lt;13; i++) test1[i] = (uint8_t)(rand() % 256);&lt;br /&gt;
    run_test_case(&amp;quot;13 bytes slumpdata (inkl. höga bitvärden)&amp;quot;, test1, 13);&lt;br /&gt;
&lt;br /&gt;
    uint8_t test2[12] = {0};&lt;br /&gt;
    run_test_case(&amp;quot;12 bytes nollor&amp;quot;, test2, 12);&lt;br /&gt;
&lt;br /&gt;
    uint8_t test3[] = &amp;quot;Klockrent, Täpp-Anders!&amp;quot;;&lt;br /&gt;
    run_test_case(&amp;quot;Sträng med UTF-8&amp;quot;, test3, strlen((char*)test3));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]) {&lt;br /&gt;
    if (argc &amp;lt; 2) return 1;&lt;br /&gt;
    if (strcmp(argv[1], &amp;quot;--test&amp;quot;) == 0) run_tests();&lt;br /&gt;
    else if (strcmp(argv[1], &amp;quot;--encode&amp;quot;) == 0 || strcmp(argv[1], &amp;quot;-e&amp;quot;) == 0) encode_stream();&lt;br /&gt;
    else if (strcmp(argv[1], &amp;quot;--decode&amp;quot;) == 0 || strcmp(argv[1], &amp;quot;-d&amp;quot;) == 0) decode_stream();&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Base24&amp;diff=1850</id>
		<title>Base24</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Base24&amp;diff=1850"/>
		<updated>2026-04-19T09:53:09Z</updated>

		<summary type="html">&lt;p&gt;Anders: /* Implementation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Bakgrund = &lt;br /&gt;
&lt;br /&gt;
Base24 är inte en standardkodning och den är lite mer komplex än de som baseras på ett jämt antal oktetter som [[base32]] samt [[base64]] men det har en fördel också, vi använder bara stora bokstäver A-X.&lt;br /&gt;
&lt;br /&gt;
= Implementation =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
const char ALPHABET[] = &amp;quot;BCDFGHJKMNPQRTVWXY2346789&amp;quot;;&lt;br /&gt;
#define BASE 24&lt;br /&gt;
#define MAX_LINE 70&lt;br /&gt;
#define CHARS_PER_BLOCK 6 // 6 tecken för data täcker 24 bitar (24^6 &amp;gt; 2^24)&lt;br /&gt;
&lt;br /&gt;
int get_index(char c) {&lt;br /&gt;
    for (int i = 0; i &amp;lt; BASE; i++) if (ALPHABET[i] == c) return i;&lt;br /&gt;
    return -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void encode_block(const uint8_t *in, int len, char *out_buf) {&lt;br /&gt;
    uint32_t val = 0;&lt;br /&gt;
    // Packa indata till en 24-bitars integer&lt;br /&gt;
    if (len &amp;gt;= 1) val |= ((uint32_t)in[0] &amp;lt;&amp;lt; 16);&lt;br /&gt;
    if (len &amp;gt;= 2) val |= ((uint32_t)in[1] &amp;lt;&amp;lt; 8);&lt;br /&gt;
    if (len &amp;gt;= 3) val |= ((uint32_t)in[2]);&lt;br /&gt;
&lt;br /&gt;
    out_buf[0] = ALPHABET[len]; // Header: längd&lt;br /&gt;
    &lt;br /&gt;
    // Konvertera val till bas 24 över 6 tecken (position 1 till 6)&lt;br /&gt;
    uint32_t temp = val;&lt;br /&gt;
    for (int i = CHARS_PER_BLOCK; i &amp;gt;= 1; i--) {&lt;br /&gt;
        out_buf[i] = ALPHABET[temp % BASE];&lt;br /&gt;
        temp /= BASE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int decode_block(const char *in_buf, uint8_t *out_three) {&lt;br /&gt;
    int len = get_index(in_buf[0]);&lt;br /&gt;
    if (len &amp;lt; 0 || len &amp;gt; 3) return -1;&lt;br /&gt;
&lt;br /&gt;
    uint32_t val = 0;&lt;br /&gt;
    for (int i = 1; i &amp;lt;= CHARS_PER_BLOCK; i++) {&lt;br /&gt;
        int idx = get_index(in_buf[i]);&lt;br /&gt;
        if (idx == -1) return -1;&lt;br /&gt;
        // Vi bygger värdet baserat på positionell vikt&lt;br /&gt;
        val = val * BASE + idx;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (len &amp;gt;= 1) out_three[0] = (uint8_t)((val &amp;gt;&amp;gt; 16) &amp;amp; 0xFF);&lt;br /&gt;
    if (len &amp;gt;= 2) out_three[1] = (uint8_t)((val &amp;gt;&amp;gt; 8) &amp;amp; 0xFF);&lt;br /&gt;
    if (len &amp;gt;= 3) out_three[2] = (uint8_t)(val &amp;amp; 0xFF);&lt;br /&gt;
    &lt;br /&gt;
    return len;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void encode_stream() {&lt;br /&gt;
    printf(&amp;quot;--- BEGIN BASE24 ENCODED DATA ---\n&amp;quot;);&lt;br /&gt;
    uint8_t in[3];&lt;br /&gt;
    char out[CHARS_PER_BLOCK + 1];&lt;br /&gt;
    int bytes_read, line_pos = 0;&lt;br /&gt;
    while ((bytes_read = fread(in, 1, 3, stdin)) &amp;gt; 0) {&lt;br /&gt;
        encode_block(in, bytes_read, out);&lt;br /&gt;
        for (int i = 0; i &amp;lt; CHARS_PER_BLOCK + 1; i++) {&lt;br /&gt;
            putchar(out[i]);&lt;br /&gt;
            if (++line_pos &amp;gt;= MAX_LINE) {&lt;br /&gt;
                putchar(&#039;\n&#039;);&lt;br /&gt;
                line_pos = 0;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if (line_pos &amp;gt; 0) putchar(&#039;\n&#039;);&lt;br /&gt;
    printf(&amp;quot;--- END BASE24 ENCODED DATA ---\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void decode_stream() {&lt;br /&gt;
    int ch, count = 0;&lt;br /&gt;
    char block[CHARS_PER_BLOCK + 1];&lt;br /&gt;
    uint8_t out[3];&lt;br /&gt;
&lt;br /&gt;
    while ((ch = getchar()) != EOF) {&lt;br /&gt;
        if (ch == &#039;-&#039; || ch == &#039;\n&#039; || ch == &#039;\r&#039; || ch == &#039; &#039; || ch == &#039;\t&#039;) {&lt;br /&gt;
            if (ch == &#039;-&#039;) while ((ch = getchar()) != &#039;\n&#039; &amp;amp;&amp;amp; ch != EOF);&lt;br /&gt;
            continue;&lt;br /&gt;
        }&lt;br /&gt;
        block[count++] = (char)ch;&lt;br /&gt;
        if (count == CHARS_PER_BLOCK + 1) {&lt;br /&gt;
            int decoded = decode_block(block, out);&lt;br /&gt;
            if (decoded &amp;gt; 0) fwrite(out, 1, decoded, stdout);&lt;br /&gt;
            count = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void run_test_case(const char *name, uint8_t *orig, int len) {&lt;br /&gt;
    printf(&amp;quot;Testar: %s (%d bytes)\n&amp;quot;, name, len);&lt;br /&gt;
    &lt;br /&gt;
    int num_blocks = (len + 2) / 3;&lt;br /&gt;
    char *encoded = malloc(num_blocks * (CHARS_PER_BLOCK + 1));&lt;br /&gt;
    for (int i = 0; i &amp;lt; num_blocks; i++) {&lt;br /&gt;
        int chunk = (len - i * 3 &amp;gt; 3) ? 3 : (len - i * 3);&lt;br /&gt;
        encode_block(&amp;amp;orig[i * 3], chunk, &amp;amp;encoded[i * (CHARS_PER_BLOCK + 1)]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    uint8_t *reconstructed = malloc(num_blocks * 3);&lt;br /&gt;
    int total_decoded = 0;&lt;br /&gt;
    for (int i = 0; i &amp;lt; num_blocks; i++) {&lt;br /&gt;
        int res = decode_block(&amp;amp;encoded[i * (CHARS_PER_BLOCK + 1)], &amp;amp;reconstructed[total_decoded]);&lt;br /&gt;
        if (res &amp;gt; 0) total_decoded += res;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (total_decoded == len &amp;amp;&amp;amp; memcmp(orig, reconstructed, len) == 0) {&lt;br /&gt;
        printf(&amp;quot;  [PASS] Data matchar perfekt.\n&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
        printf(&amp;quot;  [FAIL] Korruption! Längd: %d/%d\n&amp;quot;, total_decoded, len);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    free(encoded);&lt;br /&gt;
    free(reconstructed);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void run_tests() {&lt;br /&gt;
    printf(&amp;quot;BASE24 SJÄLVTEST - FINAL VERSION\n================================\n&amp;quot;);&lt;br /&gt;
    uint8_t test1[13];&lt;br /&gt;
    for(int i=0; i&amp;lt;13; i++) test1[i] = (uint8_t)(rand() % 256);&lt;br /&gt;
    run_test_case(&amp;quot;13 bytes slumpdata (inkl. höga bitvärden)&amp;quot;, test1, 13);&lt;br /&gt;
&lt;br /&gt;
    uint8_t test2[12] = {0};&lt;br /&gt;
    run_test_case(&amp;quot;12 bytes nollor&amp;quot;, test2, 12);&lt;br /&gt;
&lt;br /&gt;
    uint8_t test3[] = &amp;quot;Klockrent, Täpp-Anders!&amp;quot;;&lt;br /&gt;
    run_test_case(&amp;quot;Sträng med UTF-8&amp;quot;, test3, strlen((char*)test3));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]) {&lt;br /&gt;
    if (argc &amp;lt; 2) return 1;&lt;br /&gt;
    if (strcmp(argv[1], &amp;quot;--test&amp;quot;) == 0) run_tests();&lt;br /&gt;
    else if (strcmp(argv[1], &amp;quot;--encode&amp;quot;) == 0 || strcmp(argv[1], &amp;quot;-e&amp;quot;) == 0) encode_stream();&lt;br /&gt;
    else if (strcmp(argv[1], &amp;quot;--decode&amp;quot;) == 0 || strcmp(argv[1], &amp;quot;-d&amp;quot;) == 0) decode_stream();&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Racket/RLE&amp;diff=1849</id>
		<title>Racket/RLE</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Racket/RLE&amp;diff=1849"/>
		<updated>2026-04-11T14:45:36Z</updated>

		<summary type="html">&lt;p&gt;Anders: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#lang racket&lt;br /&gt;
&lt;br /&gt;
;;;;;&lt;br /&gt;
;; RLE – Run Length Encoder&lt;br /&gt;
;;&lt;br /&gt;
;; I/O via stdio &amp;lt;infil &amp;gt;utfil&lt;br /&gt;
;;&lt;br /&gt;
;; Kodar data genom att räkna antal förekomster av samma tecken/byte i rad och&lt;br /&gt;
;; ersätter den med ett cons-par (antal . tecken) tills nästa förekomst finns.&lt;br /&gt;
;; Kan operera binärt men med begränsningen av max 255 bytes konsekutivt sedan&lt;br /&gt;
;; startas en ny ram.&lt;br /&gt;
;;&lt;br /&gt;
;; racket rle.rkt [ --encode | --decode | --help ] [ --binary ] &amp;lt; infil &amp;gt; utfil&lt;br /&gt;
;;&lt;br /&gt;
;; --encode kodar stdin till stdout lisp style om inte --binary används&lt;br /&gt;
;; --decode avkodar stdin till stdout lisp style om inte --binary används&lt;br /&gt;
;; --binary skriver kodad data binärt, läser binär data för avkodning&lt;br /&gt;
;; --help visar en enkel hjälptext&lt;br /&gt;
;; --test kör en enkel sån därn JOONIT TÄST di kallart&lt;br /&gt;
;;&lt;br /&gt;
;; Saker som kan göras bättre:&lt;br /&gt;
;;&lt;br /&gt;
;; Det finns ganska lite felkontroll och vad du kastar på dekodern kommer den försöka&lt;br /&gt;
;; tills det skiter sig.&lt;br /&gt;
;;&lt;br /&gt;
;; Man kan också tänka sig att använda mer än en byte för antal i binärt mode&lt;br /&gt;
;; men också en grej är ju att man aldrig kommer koda för 0 tecken så man kunde&lt;br /&gt;
;; ju lika gärna koda för 1-256 i stället för 0-255. Jag har struntat i det.&lt;br /&gt;
;;&lt;br /&gt;
;;;;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;; --- Kärnlogik ---&lt;br /&gt;
&lt;br /&gt;
;; Grupperar element&lt;br /&gt;
(define (pack-limited lst)&lt;br /&gt;
  (cond [(empty? lst) &#039;()]&lt;br /&gt;
        [else &lt;br /&gt;
         (let-values ([(prefix suffix) (splitf-at lst (lambda (x) (equal? x (first lst))))])&lt;br /&gt;
           (if (&amp;gt; (length prefix) 255)&lt;br /&gt;
               ;; Om gruppen är för lång, hugg av vid 255 och fortsätt med resten&lt;br /&gt;
               (cons (take prefix 255) (pack-limited (append (drop prefix 255) suffix)))&lt;br /&gt;
               ;; Annars, fortsätt som vanligt&lt;br /&gt;
               (cons prefix (pack-limited suffix))))]))&lt;br /&gt;
&lt;br /&gt;
(define (encode lst)&lt;br /&gt;
  (map (lambda (group) (list (length group) (first group))) &lt;br /&gt;
       (pack-limited lst)))&lt;br /&gt;
&lt;br /&gt;
(define (decode lst)&lt;br /&gt;
  (append-map (lambda (entry) (make-list (first entry) (second entry))) &lt;br /&gt;
              lst))&lt;br /&gt;
&lt;br /&gt;
;; --- Binär I/O ---&lt;br /&gt;
&lt;br /&gt;
(define (write-binary encoded-data)&lt;br /&gt;
  (for ([pair encoded-data])&lt;br /&gt;
    (write-byte (first pair))&lt;br /&gt;
    (write-byte (second pair))))&lt;br /&gt;
&lt;br /&gt;
(define (read-binary)&lt;br /&gt;
  (let ([count (read-byte)])&lt;br /&gt;
    (if (eof-object? count)&lt;br /&gt;
        &#039;()&lt;br /&gt;
        (let ([val (read-byte)])&lt;br /&gt;
          (cons (list count val) (read-binary))))))&lt;br /&gt;
&lt;br /&gt;
;; --- Körlägen ---&lt;br /&gt;
&lt;br /&gt;
(define (run-encode binary?)&lt;br /&gt;
  (let* ([input (port-&amp;gt;bytes (current-input-port))]&lt;br /&gt;
         [encoded (encode (bytes-&amp;gt;list input))])&lt;br /&gt;
    (if binary?&lt;br /&gt;
        (write-binary encoded)&lt;br /&gt;
        (write encoded)))) ; Använd write för att få korrekt läsbar listformat&lt;br /&gt;
&lt;br /&gt;
(define (run-decode binary?)&lt;br /&gt;
  (let* ([data (if binary? (read-binary) (read))]&lt;br /&gt;
         [decoded (decode data)])&lt;br /&gt;
    (display (list-&amp;gt;bytes decoded))))&lt;br /&gt;
&lt;br /&gt;
(define (run-test)&lt;br /&gt;
  (let* ([input (port-&amp;gt;bytes (current-input-port))]&lt;br /&gt;
         [encoded (encode (bytes-&amp;gt;list input))]&lt;br /&gt;
         [decoded (list-&amp;gt;bytes (decode encoded))])&lt;br /&gt;
    (if (equal? input decoded)&lt;br /&gt;
        (printf &amp;quot;Test lyckades! (~a bytes in, ~a noder skapade)\n&amp;quot; &lt;br /&gt;
                (bytes-length input) (length encoded))&lt;br /&gt;
        (error &amp;quot;Test misslyckades: Datat korrupt!&amp;quot;))))&lt;br /&gt;
&lt;br /&gt;
;; --- CLI ---&lt;br /&gt;
&lt;br /&gt;
(define (show-help)&lt;br /&gt;
  (displayln &amp;quot;Användning: racket rle.rkt [FLAGGA] &amp;lt; infil &amp;gt; utfil&amp;quot;)&lt;br /&gt;
  (displayln &amp;quot;  -e, --encode  Koda (standard: text-listor)&amp;quot;)&lt;br /&gt;
  (displayln &amp;quot;  -d, --decode  Dekoda (standard: text-listor)&amp;quot;)&lt;br /&gt;
  (displayln &amp;quot;  -b, --binary  Kör i binärläge (1 byte antal, 1 byte värde)&amp;quot;)&lt;br /&gt;
  (displayln &amp;quot;  -t, --test    Verifiera att koda+dekoda bevarar data&amp;quot;)&lt;br /&gt;
  (displayln &amp;quot;  -h, --help    Visa denna hjälp&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
(define (main)&lt;br /&gt;
  (let ([args (vector-&amp;gt;list (current-command-line-arguments))])&lt;br /&gt;
    (cond&lt;br /&gt;
      [(member &amp;quot;-t&amp;quot; args) (run-test)]&lt;br /&gt;
      [(and (member &amp;quot;-e&amp;quot; args) (or (member &amp;quot;-b&amp;quot; args) (member &amp;quot;--binary&amp;quot; args))) (run-encode #t)]&lt;br /&gt;
      [(member &amp;quot;-e&amp;quot; args) (run-encode #f)]&lt;br /&gt;
      [(and (member &amp;quot;-d&amp;quot; args) (or (member &amp;quot;-b&amp;quot; args) (member &amp;quot;--binary&amp;quot; args))) (run-decode #t)]&lt;br /&gt;
      [(member &amp;quot;-d&amp;quot; args) (run-decode #f)]&lt;br /&gt;
      [else (show-help)])))&lt;br /&gt;
&lt;br /&gt;
(main)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Racket/RLE&amp;diff=1848</id>
		<title>Racket/RLE</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Racket/RLE&amp;diff=1848"/>
		<updated>2026-04-11T14:38:41Z</updated>

		<summary type="html">&lt;p&gt;Anders: Skapade sidan med &amp;#039;&amp;lt;pre&amp;gt;  #lang racket  ;;;;; ;; RLE – Run Length Encoder ;; ;; I/O via stdio &amp;lt;infil &amp;gt;utfil ;; ;; Kodar data genom att räkna antal förekomster av samma tecken/byte i rad och ;; ersätter den med ett cons-par (antal . tecken) tills nästa förekomst finns. ;; Kan operera binärt men med begränsningen av max 255 bytes konsekutivt sedan ;; startas en ny ram. ;; ;; racket rle.rkt [ --encode | --decode | --help ] [ --binary ] &amp;lt; infil &amp;gt; utfil ;; ;; --encode kodar stdin till...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#lang racket&lt;br /&gt;
&lt;br /&gt;
;;;;;&lt;br /&gt;
;; RLE – Run Length Encoder&lt;br /&gt;
;;&lt;br /&gt;
;; I/O via stdio &amp;lt;infil &amp;gt;utfil&lt;br /&gt;
;;&lt;br /&gt;
;; Kodar data genom att räkna antal förekomster av samma tecken/byte i rad och&lt;br /&gt;
;; ersätter den med ett cons-par (antal . tecken) tills nästa förekomst finns.&lt;br /&gt;
;; Kan operera binärt men med begränsningen av max 255 bytes konsekutivt sedan&lt;br /&gt;
;; startas en ny ram.&lt;br /&gt;
;;&lt;br /&gt;
;; racket rle.rkt [ --encode | --decode | --help ] [ --binary ] &amp;lt; infil &amp;gt; utfil&lt;br /&gt;
;;&lt;br /&gt;
;; --encode kodar stdin till stdout lisp style om inte --binary används&lt;br /&gt;
;; --decode avkodar stdin till stdout lisp style om inte --binary används&lt;br /&gt;
;; --binary skriver kodad data binärt, läser binär data för avkodning&lt;br /&gt;
;; --help visar en enkel hjälptext&lt;br /&gt;
;; --test kör en enkel sån därn JOONIT TÄST di kallart&lt;br /&gt;
;;;;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;; --- Kärnlogik ---&lt;br /&gt;
&lt;br /&gt;
;; Grupperar element&lt;br /&gt;
(define (pack-limited lst)&lt;br /&gt;
  (cond [(empty? lst) &#039;()]&lt;br /&gt;
        [else &lt;br /&gt;
         (let-values ([(prefix suffix) (splitf-at lst (lambda (x) (equal? x (first lst))))])&lt;br /&gt;
           (if (&amp;gt; (length prefix) 255)&lt;br /&gt;
               ;; Om gruppen är för lång, hugg av vid 255 och fortsätt med resten&lt;br /&gt;
               (cons (take prefix 255) (pack-limited (append (drop prefix 255) suffix)))&lt;br /&gt;
               ;; Annars, fortsätt som vanligt&lt;br /&gt;
               (cons prefix (pack-limited suffix))))]))&lt;br /&gt;
&lt;br /&gt;
(define (encode lst)&lt;br /&gt;
  (map (lambda (group) (list (length group) (first group))) &lt;br /&gt;
       (pack-limited lst)))&lt;br /&gt;
&lt;br /&gt;
(define (decode lst)&lt;br /&gt;
  (append-map (lambda (entry) (make-list (first entry) (second entry))) &lt;br /&gt;
              lst))&lt;br /&gt;
&lt;br /&gt;
;; --- Binär I/O ---&lt;br /&gt;
&lt;br /&gt;
(define (write-binary encoded-data)&lt;br /&gt;
  (for ([pair encoded-data])&lt;br /&gt;
    (write-byte (first pair))&lt;br /&gt;
    (write-byte (second pair))))&lt;br /&gt;
&lt;br /&gt;
(define (read-binary)&lt;br /&gt;
  (let ([count (read-byte)])&lt;br /&gt;
    (if (eof-object? count)&lt;br /&gt;
        &#039;()&lt;br /&gt;
        (let ([val (read-byte)])&lt;br /&gt;
          (cons (list count val) (read-binary))))))&lt;br /&gt;
&lt;br /&gt;
;; --- Körlägen ---&lt;br /&gt;
&lt;br /&gt;
(define (run-encode binary?)&lt;br /&gt;
  (let* ([input (port-&amp;gt;bytes (current-input-port))]&lt;br /&gt;
         [encoded (encode (bytes-&amp;gt;list input))])&lt;br /&gt;
    (if binary?&lt;br /&gt;
        (write-binary encoded)&lt;br /&gt;
        (write encoded)))) ; Använd write för att få korrekt läsbar listformat&lt;br /&gt;
&lt;br /&gt;
(define (run-decode binary?)&lt;br /&gt;
  (let* ([data (if binary? (read-binary) (read))]&lt;br /&gt;
         [decoded (decode data)])&lt;br /&gt;
    (display (list-&amp;gt;bytes decoded))))&lt;br /&gt;
&lt;br /&gt;
(define (run-test)&lt;br /&gt;
  (let* ([input (port-&amp;gt;bytes (current-input-port))]&lt;br /&gt;
         [encoded (encode (bytes-&amp;gt;list input))]&lt;br /&gt;
         [decoded (list-&amp;gt;bytes (decode encoded))])&lt;br /&gt;
    (if (equal? input decoded)&lt;br /&gt;
        (printf &amp;quot;Test lyckades! (~a bytes in, ~a noder skapade)\n&amp;quot; &lt;br /&gt;
                (bytes-length input) (length encoded))&lt;br /&gt;
        (error &amp;quot;Test misslyckades: Datat korrupt!&amp;quot;))))&lt;br /&gt;
&lt;br /&gt;
;; --- CLI ---&lt;br /&gt;
&lt;br /&gt;
(define (show-help)&lt;br /&gt;
  (displayln &amp;quot;Användning: racket rle.rkt [FLAGGA] &amp;lt; infil &amp;gt; utfil&amp;quot;)&lt;br /&gt;
  (displayln &amp;quot;  -e, --encode  Koda (standard: text-listor)&amp;quot;)&lt;br /&gt;
  (displayln &amp;quot;  -d, --decode  Dekoda (standard: text-listor)&amp;quot;)&lt;br /&gt;
  (displayln &amp;quot;  -b, --binary  Kör i binärläge (1 byte antal, 1 byte värde)&amp;quot;)&lt;br /&gt;
  (displayln &amp;quot;  -t, --test    Verifiera att koda+dekoda bevarar data&amp;quot;)&lt;br /&gt;
  (displayln &amp;quot;  -h, --help    Visa denna hjälp&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
(define (main)&lt;br /&gt;
  (let ([args (vector-&amp;gt;list (current-command-line-arguments))])&lt;br /&gt;
    (cond&lt;br /&gt;
      [(member &amp;quot;-t&amp;quot; args) (run-test)]&lt;br /&gt;
      [(and (member &amp;quot;-e&amp;quot; args) (or (member &amp;quot;-b&amp;quot; args) (member &amp;quot;--binary&amp;quot; args))) (run-encode #t)]&lt;br /&gt;
      [(member &amp;quot;-e&amp;quot; args) (run-encode #f)]&lt;br /&gt;
      [(and (member &amp;quot;-d&amp;quot; args) (or (member &amp;quot;-b&amp;quot; args) (member &amp;quot;--binary&amp;quot; args))) (run-decode #t)]&lt;br /&gt;
      [(member &amp;quot;-d&amp;quot; args) (run-decode #f)]&lt;br /&gt;
      [else (show-help)])))&lt;br /&gt;
&lt;br /&gt;
(main)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Racket&amp;diff=1847</id>
		<title>Racket</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Racket&amp;diff=1847"/>
		<updated>2026-04-11T14:34:37Z</updated>

		<summary type="html">&lt;p&gt;Anders: /* Kodexempel (Sommarhack 2026) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Racket är ett programmeringsspråk i Lispfamiljen och underfamilj till Scheme. Det är kompatibelt med Scheme R5RS och andra varianter men har också ett eget väl utbyggt bibliotek av funktioner och rutiner och kanske en av de enklaste språken att komma igång och skapa GUI-applikationer i.&lt;br /&gt;
&lt;br /&gt;
= Installation Ubuntu = &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo add-apt-repository ppa:plt/racket -y&lt;br /&gt;
sudo apt update &lt;br /&gt;
sudo apt install racket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kör igång det inbyggda IDE:t med &amp;quot;drracket&amp;quot; antingen från applikationsmenyn eller terminalen.&lt;br /&gt;
&lt;br /&gt;
= Kodexempel (Sommarhack 2026) =&lt;br /&gt;
&lt;br /&gt;
# [[Racket/Erastothenes]]&lt;br /&gt;
# [[Racket/Hexdump]]&lt;br /&gt;
# [[Racket/base24]]&lt;br /&gt;
# [[Racket/Personreg]]&lt;br /&gt;
# [[Racket/RLE]]&lt;br /&gt;
# [[Racket/Lille-GUI]]&lt;br /&gt;
# [[Racket/Multitråd]]&lt;br /&gt;
# [[Racket/6502-emu]]&lt;br /&gt;
# [[Racket/Genetic]]&lt;br /&gt;
# [[Racket/Markov]]&lt;br /&gt;
# [[Racket/Neural]]&lt;br /&gt;
# [[Racket/Posits]]&lt;br /&gt;
# [[Racket/3D-boll]] -- från Olme&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Emacs&amp;diff=1846</id>
		<title>Emacs</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Emacs&amp;diff=1846"/>
		<updated>2026-04-10T08:41:25Z</updated>

		<summary type="html">&lt;p&gt;Anders: /* .emacs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Configuration =&lt;br /&gt;
&lt;br /&gt;
== .emacs ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
;; Custom settings&lt;br /&gt;
(custom-set-variables&lt;br /&gt;
&lt;br /&gt;
 ;; Setting the theme I line&lt;br /&gt;
 &#039;(custom-enabled-themes &#039;(wheatgrass))&lt;br /&gt;
&lt;br /&gt;
 ;; Removing splash screen and scratch pad on open&lt;br /&gt;
 &#039;(inhibit-startup-message t)&lt;br /&gt;
 &#039;(initial-scratch-message nil)&lt;br /&gt;
&lt;br /&gt;
 ;; Move all emacs backup files to one and the same directory&lt;br /&gt;
 ;; avoiding file system clutter and problematic behaviour when&lt;br /&gt;
 ;; editing certain folders such as /etc/rc.d/ and similar&lt;br /&gt;
 &#039;(backup-directory-alist &#039;((&amp;quot;.&amp;quot; . &amp;quot;~/.emacs.d/backup-dir&amp;quot;))))&lt;br /&gt;
&lt;br /&gt;
(custom-set-faces)  ;; Enable wanted face&lt;br /&gt;
&lt;br /&gt;
;; Allow tex input for Unicode characters&lt;br /&gt;
(set-input-method &amp;quot;TeX&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category:konfigurationsfil]]&lt;br /&gt;
[[category:programvara]]&lt;br /&gt;
[[category:linux]]&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Racket/3D-boll&amp;diff=1845</id>
		<title>Racket/3D-boll</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Racket/3D-boll&amp;diff=1845"/>
		<updated>2026-04-07T18:18:11Z</updated>

		<summary type="html">&lt;p&gt;Anders: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Version &amp;quot;snurra själv&amp;quot; = &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#lang racket&lt;br /&gt;
(require plot)&lt;br /&gt;
(require racket/pretty)&lt;br /&gt;
;; En pixelboll iracket&lt;br /&gt;
;; Från Buzzern skrivet under påskhelgen&lt;br /&gt;
&lt;br /&gt;
(define π (acos -1))&lt;br /&gt;
(define VERTICAL-SPLIT 16)&lt;br /&gt;
(define HORIZONTAL-SPLIT 16)&lt;br /&gt;
(define PARTICLE-SIZE (* VERTICAL-SPLIT HORIZONTAL-SPLIT))&lt;br /&gt;
(define particles (for/vector ([i (in-range PARTICLE-SIZE)])&lt;br /&gt;
                    (make-vector 3)))&lt;br /&gt;
&lt;br /&gt;
;; from scheme.com since normal scheme lacks for/vector&lt;br /&gt;
(define make-matrix&lt;br /&gt;
  (lambda (rows columns)&lt;br /&gt;
    (do ((m (make-vector rows))&lt;br /&gt;
         (i 0 (+ i 1)))&lt;br /&gt;
        ((= i rows) m)&lt;br /&gt;
        (vector-set! m i (make-vector columns)))))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(define (to-&amp;gt;deg rad)&lt;br /&gt;
  (* rad (/ 180 π)))&lt;br /&gt;
&lt;br /&gt;
(define (print-dots amount)&lt;br /&gt;
  (let myloop ((count 0))&lt;br /&gt;
    (if (&amp;gt;= count amount)&lt;br /&gt;
        &#039;()&lt;br /&gt;
        (begin&lt;br /&gt;
        (println count)&lt;br /&gt;
        (myloop (+ count 1))))))&lt;br /&gt;
&lt;br /&gt;
(define (generate-xyz radius θ ϕ)&lt;br /&gt;
  (let* ([x (* radius (sin θ) (cos ϕ))]&lt;br /&gt;
         [y (* radius (sin θ) (sin ϕ))]&lt;br /&gt;
         [z (* radius (cos θ))]&lt;br /&gt;
         )&lt;br /&gt;
  (vector x y z)))&lt;br /&gt;
&lt;br /&gt;
(define (test-loop amount)&lt;br /&gt;
  (let loop ((count 0))&lt;br /&gt;
    (if (&amp;gt;= count amount)&lt;br /&gt;
        &#039;()&lt;br /&gt;
        (begin&lt;br /&gt;
        (println count)&lt;br /&gt;
        (loop (+ count 1))))))&lt;br /&gt;
&lt;br /&gt;
(define (get-angle index split)&lt;br /&gt;
  (* 2 π index (/ split)))&lt;br /&gt;
&lt;br /&gt;
(define (generate-dots particles)&lt;br /&gt;
  (let* ([index-y -1])&lt;br /&gt;
  (for ([row (in-vector particles)]&lt;br /&gt;
        [index (in-naturals)])&lt;br /&gt;
    (set! index-y (if (= 0 (modulo index HORIZONTAL-SPLIT))&lt;br /&gt;
        (+ index-y 1)&lt;br /&gt;
        index-y))&lt;br /&gt;
    ;(printf &amp;quot; ~a ~a\n&amp;quot; (modulo index HORIZONTAL-SPLIT) index-y)&lt;br /&gt;
    (define new-θ (get-angle (modulo index HORIZONTAL-SPLIT) HORIZONTAL-SPLIT))&lt;br /&gt;
    (define new-ϕ (get-angle (modulo index-y VERTICAL-SPLIT) VERTICAL-SPLIT))&lt;br /&gt;
    (printf &amp;quot; ~a ~a \n&amp;quot; (to-&amp;gt;deg new-θ) (to-&amp;gt;deg new-ϕ))&lt;br /&gt;
    ;;(vector-set! row 0 )&lt;br /&gt;
    (vector-set! particles index (generate-xyz 1.0 new-θ new-ϕ)))))&lt;br /&gt;
&lt;br /&gt;
;;(test-loop HORIZONTAL-SPLIT)&lt;br /&gt;
;;(generate-xyz 1 π (* 2.0 π))&lt;br /&gt;
(generate-dots particles)&lt;br /&gt;
(plot3d (points3d particles))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Version &amp;quot;snurrar själv&amp;quot; =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#lang racket&lt;br /&gt;
(require plot)&lt;br /&gt;
(require racket/gui/base)&lt;br /&gt;
(require racket/pretty)&lt;br /&gt;
;; En pixelboll i racket&lt;br /&gt;
;; Från Buzzern skrivet under påskhelgen&lt;br /&gt;
&lt;br /&gt;
(define π (acos -1))&lt;br /&gt;
(define HEIGHT 600)&lt;br /&gt;
(define WIDTH 800)&lt;br /&gt;
(define VERTICAL-SPLIT 16)&lt;br /&gt;
(define HORIZONTAL-SPLIT 16)&lt;br /&gt;
(define RADIUS 100.0)&lt;br /&gt;
(define PARTICLE-SIZE (* VERTICAL-SPLIT HORIZONTAL-SPLIT))&lt;br /&gt;
(define particles (for/vector ([i (in-range PARTICLE-SIZE)])&lt;br /&gt;
                    (make-vector 3)))&lt;br /&gt;
&lt;br /&gt;
;; from scheme.com since normal scheme lacks for/vector&lt;br /&gt;
(define make-matrix&lt;br /&gt;
  (lambda (rows columns)&lt;br /&gt;
    (do ((m (make-vector rows))&lt;br /&gt;
         (i 0 (+ i 1)))&lt;br /&gt;
      ((= i rows) m)&lt;br /&gt;
      (vector-set! m i (make-vector columns)))))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(define (to-&amp;gt;deg rad)&lt;br /&gt;
  (* rad (/ 180 π)))&lt;br /&gt;
&lt;br /&gt;
(define (to-&amp;gt;rad deg)&lt;br /&gt;
  (/ (* deg π) 180 ))&lt;br /&gt;
&lt;br /&gt;
(define (print-dots amount)&lt;br /&gt;
  (let myloop ((count 0))&lt;br /&gt;
    (if (&amp;gt;= count amount)&lt;br /&gt;
        &#039;()&lt;br /&gt;
        (begin&lt;br /&gt;
          (println count)&lt;br /&gt;
          (myloop (+ count 1))))))&lt;br /&gt;
&lt;br /&gt;
(define (generate-xyz radius θ ϕ)&lt;br /&gt;
  (let* ([x (* radius (sin θ) (cos ϕ))]&lt;br /&gt;
         [y (* radius (sin θ) (sin ϕ))]&lt;br /&gt;
         [z (* radius (cos θ))]&lt;br /&gt;
         )&lt;br /&gt;
    (vector x y z)))&lt;br /&gt;
&lt;br /&gt;
(define (projection x y z width height)&lt;br /&gt;
  (let* ([camera-distance 300.0]  ; Push the object away from the camera&lt;br /&gt;
         [scale-factor 250.0]     ; Keep the object visible after pushing it back         &lt;br /&gt;
         ; Translate Z away from the viewer&lt;br /&gt;
         [z-translated (+ z camera-distance)]         &lt;br /&gt;
         ; Prevent divide-by-zero (just in case a point hits exactly 0)&lt;br /&gt;
         [z-safe (if (= z-translated 0.0) 0.001 z-translated)]&lt;br /&gt;
         &lt;br /&gt;
         ; Perspective projection with scaling&lt;br /&gt;
         [xp (* x (/ scale-factor z-safe))]&lt;br /&gt;
         [yp (* y (/ scale-factor z-safe))])&lt;br /&gt;
    ;over to screen coords&lt;br /&gt;
    (vector (+ xp (/ width 2.0)) (+ (/ height 2.0) yp))&lt;br /&gt;
    ))&lt;br /&gt;
    &lt;br /&gt;
(define (get-angle index split)&lt;br /&gt;
  (* 2 π index (/ split)))&lt;br /&gt;
&lt;br /&gt;
(define (generate-dots particles)&lt;br /&gt;
  (let* ([index-y -1])&lt;br /&gt;
    (for ([row (in-vector particles)]&lt;br /&gt;
          [index (in-naturals)])&lt;br /&gt;
      (set! index-y (if (= 0 (modulo index HORIZONTAL-SPLIT))&lt;br /&gt;
                        (+ index-y 1)&lt;br /&gt;
                        index-y))&lt;br /&gt;
      (define new-θ (get-angle (modulo index HORIZONTAL-SPLIT) HORIZONTAL-SPLIT))&lt;br /&gt;
      (define new-ϕ (get-angle (modulo index-y VERTICAL-SPLIT) VERTICAL-SPLIT))&lt;br /&gt;
      (vector-set! particles index (generate-xyz RADIUS new-θ new-ϕ)))))&lt;br /&gt;
&lt;br /&gt;
(define (rotateX x y z angle)&lt;br /&gt;
  (let ([y-new (-(* y (cos angle)) (* z (sin angle)))]&lt;br /&gt;
        [z-new (+ (* y (sin angle)) (* z (cos angle)))])&lt;br /&gt;
    (vector x y-new z-new)))&lt;br /&gt;
&lt;br /&gt;
(define (rotateY x y z angle)&lt;br /&gt;
  (let ([x-new (+(* x (cos angle)) (* z (sin angle)))]&lt;br /&gt;
        [z-new (+ (* (- x) (sin angle)) (* z (cos angle)))])&lt;br /&gt;
    (vector x-new y z-new)))&lt;br /&gt;
&lt;br /&gt;
(define angleX 0.1)&lt;br /&gt;
(define angleXspeed 0)&lt;br /&gt;
(define angleY 0.1)&lt;br /&gt;
(define angleYspeed 0)&lt;br /&gt;
&lt;br /&gt;
(define deltaTime (current-milliseconds))&lt;br /&gt;
(define my-pen (new pen% [color &amp;quot;blue&amp;quot;] [width 2]))&lt;br /&gt;
&lt;br /&gt;
(define (paint canvas dc)&lt;br /&gt;
  (send dc clear)&lt;br /&gt;
  (send dc set-pen&lt;br /&gt;
          my-pen)&lt;br /&gt;
  (for ([row (in-vector particles)])&lt;br /&gt;
    (let* ([rotX (rotateX (vector-ref row 0) (vector-ref row 1) (vector-ref row 2) (to-&amp;gt;rad angleXspeed))]&lt;br /&gt;
           [rotY (rotateY (vector-ref rotX 0) (vector-ref rotX 1) (vector-ref rotX 2) (to-&amp;gt;rad angleYspeed))]&lt;br /&gt;
           [xy (projection (vector-ref rotY 0) (vector-ref rotY 1) (vector-ref rotY 2) WIDTH HEIGHT)])&lt;br /&gt;
      (send dc draw-point (vector-ref xy 0) (vector-ref xy 1)))))&lt;br /&gt;
&lt;br /&gt;
(define frame (new frame% [label &amp;quot;Animation&amp;quot;] [width WIDTH] [height HEIGHT]))&lt;br /&gt;
(define canvas (new canvas% [parent frame] [paint-callback paint]))&lt;br /&gt;
&lt;br /&gt;
(generate-dots particles)&lt;br /&gt;
&lt;br /&gt;
(define timer (new timer% [notify-callback&lt;br /&gt;
                           (lambda ()&lt;br /&gt;
                             ;(set! x (add1 x))&lt;br /&gt;
                             (set! deltaTime (- (current-milliseconds) deltaTime))&lt;br /&gt;
                             (set! angleXspeed (* angleX deltaTime))&lt;br /&gt;
                             (set! angleYspeed (* angleY deltaTime))&lt;br /&gt;
                             ;(printf &amp;quot;~a\n&amp;quot; (current-milliseconds))&lt;br /&gt;
                             (send canvas refresh)&lt;br /&gt;
                             ;(send timer start 16)&lt;br /&gt;
                             )]&lt;br /&gt;
                   [interval #f]&lt;br /&gt;
                   [just-once? #f]&lt;br /&gt;
                   ))&lt;br /&gt;
(send frame show #t)&lt;br /&gt;
(send timer start 16) ; ~60 FPS in best case i guess...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
</feed>