﻿<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>WinSoft.se</title>
	<atom:link href="https://www.winsoft.se/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.winsoft.se</link>
	<description>Development with focus on .NET</description>
	<lastBuildDate>Sat, 22 Aug 2026 16:36:50 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>
	<item>
		<title>Nytt C64-demo: Divine</title>
		<link>https://www.winsoft.se/2026/08/nytt-c64-demo-divine/</link>
					<comments>https://www.winsoft.se/2026/08/nytt-c64-demo-divine/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sat, 22 Aug 2026 14:33:37 +0000</pubDate>
				<category><![CDATA[Commodore]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=29194</guid>

					<description><![CDATA[Äntligen har jag fått klart mitt nya C64-demo som innehåller min SID-cover på Divinyls låt &#8220;I touch myself&#8221;. Du kan ladda hem D64-filen, PRG-filen eller besöka repositoryt. En jättekort förhandsvisning finns här: Lite bakgrund: För 10 år sedan gjorde jag två SID-låtar (alltså musik för Commodore 64) på Windows. En av dem var för ett [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Äntligen har jag fått klart mitt nya C64-demo som innehåller min SID-cover på Divinyls låt &#8220;I touch myself&#8221;.</p>



<p class="wp-block-paragraph">Du kan ladda hem <a href="https://github.com/Anders-H/Divine/raw/refs/heads/main/Divine/divine.d64" target="_blank" rel="noreferrer noopener">D64-filen</a>, <a href="https://github.com/Anders-H/Divine/raw/refs/heads/main/Divine/divine.prg" target="_blank" rel="noreferrer noopener">PRG-filen</a> eller besöka <a href="https://github.com/Anders-H/Divine" target="_blank" rel="noreferrer noopener">repositoryt</a>.</p>



<p class="wp-block-paragraph">En jättekort förhandsvisning finns här:</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-9-16 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="Nytt C64-demo: Divine" width="422" height="750" src="https://www.youtube.com/embed/Vm6m9EiCbDE?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p class="wp-block-paragraph">Lite bakgrund: För 10 år sedan gjorde jag två SID-låtar (alltså musik för Commodore 64) på Windows. En av dem var för ett seriöst demo, och den byggde jag i GoatTracker II (som verkligen tar till vara på SID-chippets förmåga) och så denna i DefleMask (betydligt sämre anpassat till just C64 beträffande minneseffektivitet, men mer lättarbetad än Goat). Denna mini-demo är en ursäkt för att få publicera denna låt, och allt som kan betraktas däri är byggt i Windows. Koden är CBM Prg Studio assembler &#8211; en släkting till Kick Assembler, som är betydligt mer avancerad än vad man kunde hitta på C64, men den kompilerar till korrekt maskinkod som kan köras på äkta hårdvara. Bilden som används som bakgrundsbild är konverterad till Koala-format med ett verktyg jag hittade på nätet, och sedan konverterat till raw bitmap med ett pythonscript som jag också hittade på nätet. De sprites som rör sig på skärmen är skapade med min egna sprite-editor <a href="https://sprdef2.winsoft.se/" target="_blank" rel="noreferrer noopener">Sprdef2</a> (igen Windows) som är designad för att interagera med just CBM Prg Studio.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2026/08/nytt-c64-demo-divine/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Recamáns talföljd</title>
		<link>https://www.winsoft.se/2026/08/recamans-talfoljd/</link>
					<comments>https://www.winsoft.se/2026/08/recamans-talfoljd/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Fri, 07 Aug 2026 18:44:49 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Science]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=29188</guid>

					<description><![CDATA[Föreställ dig en lång väg av numrerade rutor på marken, ungefär som när du spelade hage som barn. Denna väg är lite enklare, för det är en rak linje, serie av rutor, numrerade från 0 och framåt. Du står på den första rutan, alltså ruta 0, och är redo att ta ditt första hopp. Det [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Föreställ dig en lång väg av numrerade rutor på marken, ungefär som när du spelade hage som barn. Denna väg är lite enklare, för det är en rak linje, serie av rutor, numrerade från 0 och framåt. Du står på den första rutan, alltså ruta 0, och är redo att ta ditt första hopp. Det finns två regler som beskriver hur du ska hoppa:</p>



<p class="wp-block-paragraph">1) Ditt första hopp är ett steg långt, ditt andra hopp är två steg långt, ditt tredje hopp är tre steg långt, och så vidare. För varje gång du spelar hoppar du ett steg längre än föregående steg.</p>



<p class="wp-block-paragraph">2) Du ska hoppa bakåt, om möjligt. Du får endast hoppa framåt om rutan som är bakom dig är mindre än 0 eller sedan tidigare besökt. Om du ska hoppa 7 steg (enligt regel 1) och då hamnar antingen före 0-punkten eller på en sedan tidigare besökt ruta, så ska du hoppa sju steg framåt.</p>



<p class="wp-block-paragraph">Detta kommer att utspela sig enligt följande: Till att börja med står du på ruta 0.</p>



<p class="wp-block-paragraph"><strong>Hopp 1</strong> (1 steg långt): Kan du hoppa 1 steg bakåt? Nej, då hamnar du under noll. Så du hoppar framåt till 1.</p>



<p class="wp-block-paragraph"><strong>Hopp 2</strong> (2 steg långt): Kan du hoppa 2 steg bakåt från 1? Nej, det blir också minus. Du hoppar framåt till 3.</p>



<p class="wp-block-paragraph"><strong>Hopp 3</strong> (3 steg långt): Kan du hoppa 3 steg bakåt från 3? Du hamnar på 0, men där har du ju redan varit! Så du måste hoppa framåt till 6.</p>



<p class="wp-block-paragraph"><strong>Hopp 4</strong> (4 steg långt): Kan du hoppa 4 steg bakåt från 6? Ja! Du landar på 2, som är ett nytt tal. Du gör ditt första bakåthopp, och det är bakåt du strävar!</p>



<p class="wp-block-paragraph">Och så vidare! Siffrorna du landar på blir till en serie: 0, 1, 3, 6, 2, 7, 13, 20, 12, 21&#8230; Det var detta som den colombianske matematikern Bernardo Recamán Santos upptäckte.</p>



<p class="wp-block-paragraph">Det fascinerande händer när vi ritar upp den här resan. Om du drar en halvcirkel över linjen varje gång du hoppar framåt, och en halvcirkel under linjen varje gång du hoppar bakåt, växer ett fantastiskt mönster fram.</p>



<p class="wp-block-paragraph">Det ser inte ut som en stel eller tråkig regel. Istället liknar det ett snäckskal och virvlar som känns hämtade direkt från naturen, ett hjärtslag på en skärm som stiger och faller i rytmiska vågor, vågor på havet som krockar och flätas samman. Algoritmen är helt deterministisk, och kommer därmed att producera samma mönster varje gång den exekveras. Linjen som ritas från punkt till punkt, kommer att ritas på samma sätt varje gång.</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="750" src="https://www.winsoft.se/wp-content/uploads/image-1-1024x750.png" alt="" class="wp-image-29191" srcset="https://www.winsoft.se/wp-content/uploads/image-1-1024x750.png 1024w, https://www.winsoft.se/wp-content/uploads/image-1-300x220.png 300w, https://www.winsoft.se/wp-content/uploads/image-1-150x110.png 150w, https://www.winsoft.se/wp-content/uploads/image-1-768x562.png 768w, https://www.winsoft.se/wp-content/uploads/image-1.png 1310w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"><a href="https://winsoft.se/files/recamans.html" target="_blank" rel="noreferrer noopener">Slå på ljudet och klicka &#8220;Starta&#8221;!</a></p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2026/08/recamans-talfoljd/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Electric Banana Band 2026</title>
		<link>https://www.winsoft.se/2026/06/electric-banana-band-2026/</link>
					<comments>https://www.winsoft.se/2026/06/electric-banana-band-2026/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sat, 27 Jun 2026 20:35:01 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=29183</guid>

					<description><![CDATA[Jag såg Electric Banana Band live första gången år 1985 i Brunnsparken i Örebro år 1985, och har följt dem genom åren. Ikväll bjöd mitt äldsta barn på biljetter till deras gig i Örebro på Conventum &#8211; typ där alla politiska partier har sin kongress. Av originalmedlemmarna syntes bara Janne Schaffer och Lasse Åberg, men [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Jag såg Electric Banana Band live första gången år 1985 i Brunnsparken i Örebro år 1985, och har följt dem genom åren. Ikväll bjöd mitt äldsta barn på biljetter till deras gig i Örebro på Conventum &#8211; typ där alla politiska partier har sin kongress. Av originalmedlemmarna syntes bara Janne Schaffer och Lasse Åberg, men Janne var på gott humör och bjöd på många tal och (inte minst) gitarrsolon. Före deras uppbrott 1985 vände de sig tydligt till yngre tonåringar med sin progressiva pop-rock, typ Singe-Linge-Lisco-Disco, Zwampen, Storebror, Myzteline zippelgazz, Alf Lundin och Banana Bwana. Men efter återföreningen år 2000 var det väldigt tydligt att det var barn från 6 år och uppåt man vände sig till. Då var det Min piraya Maya, Håll Himalaya ren och Tax fri som gällde.</p>



<figure class="wp-block-image size-full"><img decoding="async" width="1024" height="1024" src="https://www.winsoft.se/wp-content/uploads/20260627_173942.jpg" alt="" class="wp-image-29184" srcset="https://www.winsoft.se/wp-content/uploads/20260627_173942.jpg 1024w, https://www.winsoft.se/wp-content/uploads/20260627_173942-300x300.jpg 300w, https://www.winsoft.se/wp-content/uploads/20260627_173942-150x150.jpg 150w, https://www.winsoft.se/wp-content/uploads/20260627_173942-768x768.jpg 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Jag var väl lite rädd att det skulle flirtas med unga föräldrar, men deras set-list var faktiskt ganska bra.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://www.winsoft.se/wp-content/uploads/20260627_182226.jpg" alt="" class="wp-image-29185" srcset="https://www.winsoft.se/wp-content/uploads/20260627_182226.jpg 1024w, https://www.winsoft.se/wp-content/uploads/20260627_182226-300x300.jpg 300w, https://www.winsoft.se/wp-content/uploads/20260627_182226-150x150.jpg 150w, https://www.winsoft.se/wp-content/uploads/20260627_182226-768x768.jpg 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Varannan låt var för oss som såg EBB som barn runt 1981, varannan låt var för barnen. I mitten bjöd Lasse på ett gäng Trazan och Banarne-låtar, och sedan återgick gigget till samma koncept. Avslutningsvis bjöd EBB på ett medley som extranummer. Varannan låt var ny, varannan låt var från före splittringen. Jag var lite förvånad över att Conventum-publiken stannade av vid Bonka bonka, men jag hoppas att de har kvar den i medleyt ändå.</p>



<p class="wp-block-paragraph">I grund och botten var detta ett välgörenhetsgig för Erikshjälpen. Vaken Janne eller Lasse behöver ha in mer pengar än vad som krävs för att avlöna roddare och musiker. Resten skänker de bort, och Erikshjälpen är ett utmärkt val.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2026/06/electric-banana-band-2026/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Sprdef2 1.3</title>
		<link>https://www.winsoft.se/2026/05/sprdef2-1-3/</link>
					<comments>https://www.winsoft.se/2026/05/sprdef2-1-3/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sat, 30 May 2026 17:10:06 +0000</pubDate>
				<category><![CDATA[Commodore]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=29179</guid>

					<description><![CDATA[Sprite-editorn Sprdef2 som körs under Windows för att skapa sprites till Commodore 64 (och 128) finns nu tillgänglig i version 1.3. De viktigaste nyheterna är ett nytt linje-verktyg och en undo-buffer. Här finns mer information.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Sprite-editorn Sprdef2 som körs under Windows för att skapa sprites till Commodore 64 (och 128) finns nu tillgänglig i version 1.3. De viktigaste nyheterna är ett nytt linje-verktyg och en undo-buffer. <a href="https://github.com/Anders-H/Sprdef2/blob/main/README.md" target="_blank" rel="noreferrer noopener">Här finns mer information</a>.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="780" height="516" src="https://www.winsoft.se/wp-content/uploads/screenshotv1_3.jpg" alt="" class="wp-image-29180" srcset="https://www.winsoft.se/wp-content/uploads/screenshotv1_3.jpg 780w, https://www.winsoft.se/wp-content/uploads/screenshotv1_3-300x198.jpg 300w, https://www.winsoft.se/wp-content/uploads/screenshotv1_3-150x99.jpg 150w, https://www.winsoft.se/wp-content/uploads/screenshotv1_3-768x508.jpg 768w" sizes="auto, (max-width: 780px) 100vw, 780px" /></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2026/05/sprdef2-1-3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Happy Chap 2017</title>
		<link>https://www.winsoft.se/2026/04/happy-chap-2017/</link>
					<comments>https://www.winsoft.se/2026/04/happy-chap-2017/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sat, 18 Apr 2026 17:50:49 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=29171</guid>

					<description><![CDATA[Back in 2017, Roger Johansson and I decided to put together a Commodore 64 demo, just for fun. Klas Dahlen had brought his computer to work, and we squeezed in some machine code programming whenever we had a moment between customer assignments at Nethouse. We never ended up releasing anything, but this is the SID [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Back in 2017, Roger Johansson and I decided to put together a Commodore 64 demo, just for fun. Klas Dahlen <a href="https://www.winsoft.se/2017/02/tva-nya-sid-latar/">had brought his computer to work</a>, and we squeezed in some <a href="https://www.instagram.com/p/BB9v4GSzdoj/" target="_blank" rel="noreferrer noopener">machine code programming</a> whenever we had a moment between customer assignments at Nethouse. We never ended up releasing anything, but this is the SID tune I wrote for the project.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://www.winsoft.se/wp-content/uploads/L1080780-1024x1024.jpg" alt="" class="wp-image-29172" srcset="https://www.winsoft.se/wp-content/uploads/L1080780-1024x1024.jpg 1024w, https://www.winsoft.se/wp-content/uploads/L1080780-300x300.jpg 300w, https://www.winsoft.se/wp-content/uploads/L1080780-150x150.jpg 150w, https://www.winsoft.se/wp-content/uploads/L1080780-768x768.jpg 768w, https://www.winsoft.se/wp-content/uploads/L1080780-1536x1536.jpg 1536w, https://www.winsoft.se/wp-content/uploads/L1080780.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Resources:</p>



<ul class="wp-block-list">
<li><a href="https://github.com/Anders-H/Happy-Chap-2017-/tree/main">Git repository</a></li>



<li><a href="https://github.com/Anders-H/Happy-Chap-2017-/raw/refs/heads/main/happychap.prg">The C64 program file</a></li>



<li><a href="https://github.com/Anders-H/Happy-Chap-2017-/raw/refs/heads/main/happychapdisk.d64">A D64 disk image</a></li>
</ul>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Spela upp en SID-låt" width="500" height="281" src="https://www.youtube.com/embed/X_gNlD5yJZA?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2026/04/happy-chap-2017/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Package Dependency Checker program</title>
		<link>https://www.winsoft.se/2026/03/package-dependency-checker-2/</link>
					<comments>https://www.winsoft.se/2026/03/package-dependency-checker-2/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sat, 07 Mar 2026 17:38:50 +0000</pubDate>
				<category><![CDATA[Programs]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=29164</guid>

					<description><![CDATA[This program scans your local clones and reports what Nuget packages are beeing used. Supports C# and Visual Basic. Download from Github.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">This program scans your local clones and reports what Nuget packages are beeing used. Supports C# and Visual Basic.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="748" height="401" src="https://www.winsoft.se/wp-content/uploads/screenshot-1.jpg" alt="" class="wp-image-29165" srcset="https://www.winsoft.se/wp-content/uploads/screenshot-1.jpg 748w, https://www.winsoft.se/wp-content/uploads/screenshot-1-300x161.jpg 300w, https://www.winsoft.se/wp-content/uploads/screenshot-1-150x80.jpg 150w" sizes="auto, (max-width: 748px) 100vw, 748px" /></figure>



<p class="wp-block-paragraph">Download <a href="https://github.com/Anders-H/PackageDependencyCheckerLibrary/blob/main/README.md" target="_blank" rel="noreferrer noopener">from Github</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2026/03/package-dependency-checker-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Package Dependency Checker library</title>
		<link>https://www.winsoft.se/2026/02/package-dependency-checker/</link>
					<comments>https://www.winsoft.se/2026/02/package-dependency-checker/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sat, 07 Feb 2026 15:36:34 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=29161</guid>

					<description><![CDATA[Package Dependency Checker is a library for extracting Nuget dependencies from a folder. Uses .NET Standard 2.0, so it works with .NET Framework 4.8 and .NET 8, 9 and 10. Installation: Example: Sample output: A client application that can display statistics is in the making.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Package Dependency Checker is a library for extracting Nuget dependencies from a folder.</p>



<p class="wp-block-paragraph">Uses .NET Standard 2.0, so it works with .NET Framework 4.8 and .NET 8, 9 and 10. Installation:</p>



<pre class="wp-block-code"><code>Install-Package PackageDependencyCheckerLibrary</code></pre>



<p class="wp-block-paragraph">Example:</p>



<pre class="wp-block-code"><code>public void GetDependencyInfoList()
{
    const string folder = @"D:\GitRepos";
    var x = new MultiProjectDependencyChecker(folder);
    var response = x.GetDependencyInfoList();

    foreach (var r in response)
        System.Diagnostics.Debug.WriteLine(@$"Name: {r.ProjectName} ({r.ProjectNameCount}),
Package: {r.PackageName} ({r.PackageNameCount}), Version: {r.PackageVersion} ({r.PackageVersionCount}),
Framework: {r.Framework} ({r.FrameworkCount})");
}</code></pre>



<p class="wp-block-paragraph">Sample output:</p>



<pre class="wp-block-code"><code>Name: FantasyGameNameGenerator (1),
Package: BroncoSettingsParser (2), Version: 1.2.0 (2),
Framework: net8.0 (44)
Name: SecretAgentMan (3),
Package: BroncoSettingsParser (2), Version: 1.2.0 (2),
Framework: net8.0-windows (47)
Name: AdventureControlLibrary (3),
Package: CharacterMatrix (1), Version: 1.2.0 (1),
Framework: net8.0-windows (47)
Name: ChessEngineTests (4),
Package: coverlet.collector (14), Version: 1.0.1 (1),
Framework: net8.0-windows (47)
...</code></pre>



<p class="wp-block-paragraph">A client application that can display statistics is in the making.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2026/02/package-dependency-checker/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>A simple Christmas greeting for BASIC programmers</title>
		<link>https://www.winsoft.se/2025/12/a-simple-christmas-greeting-for-basic-programmers/</link>
					<comments>https://www.winsoft.se/2025/12/a-simple-christmas-greeting-for-basic-programmers/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Tue, 23 Dec 2025 17:37:56 +0000</pubDate>
				<category><![CDATA[Commodore]]></category>
		<category><![CDATA[Geeky]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=29156</guid>

					<description><![CDATA[Those of you who like Commodore BASIC usually send little Christmas greetings, and I don&#8217;t want to be any worse. This program works on C64 and C128, and can be adapted to VIC-20: Note how the code tries to use procedures with different responsibilities to update different parts of the tree, the ground, and the [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Those of you who like Commodore BASIC usually send little Christmas greetings, and I don&#8217;t want to be any worse. This program works on C64 and C128, and can be adapted to VIC-20:</p>



<pre class="wp-block-code"><code>10 POKE 53281,0:POKE 53280,6
20 PRINT "{BLACK}";CHR$(147)
30 FOR WI=1 TO 19 STEP 2:GOSUB 70:GOSUB 70:NEXT
40 WI=3:GOSUB 120:GOSUB 120:GOSUB 120
50 PRINT "{HOME}"
60 GOTO 170:REM"SNOW EFFECT
70 S=19-WI/2:REM"PRINT TREE
80 FOR A=0 TO S:PRINT "{BLACK} ";:NEXT
90 FOR A=1 TO WI:PRINT "{GREEN}*";:NEXT
100 PRINT
110 RETURN:REM"END PRINT TREE
120 S=19-WI/2:REM"PRINT STEM
130 FOR A=0 TO S:PRINT "{BLACK} ";:NEXT
140 FOR A=1 TO WI:PRINT "{BROWN}*";:NEXT
150 PRINT
160 RETURN:REM"END PRINT STEM
170 X=INT(RND(1)*40):Y=(INT(RND(1)*23)+1):ADR=55296+((Y*40)+X):REM"SNOW EFFECT
180 CU=PEEK(ADR) AND 15
190 C=1024+((Y*40)+X)
200 IF Y=23 THEN GOSUB 250:REM"GROUND
210 IF Y&lt;>23 AND (CU=0 OR CU=6 OR CU=1) THEN GOSUB 310:REM"SKY
220 IF Y&lt;>23 AND CU=5 THEN GOSUB 400:REM"TREE
230 IF Y&lt;>23 AND (CU=8 OR CU=9 OR CU=11) THEN GOSUB 460:REM"STEM
240 GOTO 170
250 NC=INT(RND(1)*3):REM"GROUND
260 IF NC=0 THEN POKE ADR,1
270 IF NC=1 THEN POKE ADR,5
280 IF NC=2 THEN POKE ADR,15
290 POKE C,ASC("*")
300 RETURN
310 NC=INT(RND(1)*3):REM"SKY COLOR
320 IF NC=0 THEN POKE ADR,0
330 IF NC=1 THEN POKE ADR,6
340 IF NC=2 THEN POKE ADR,1
350 NC=INT(RND(1)*3):REM"SKY CHARACTER
360 IF NC=0 THEN POKE C,ASC(" ")
370 IF NC=1 THEN POKE C,ASC(".")
380 IF NC=2 THEN POKE C,ASC("'")
390 RETURN
400 NC=INT(RND(1)*4):REM"TREE
410 IF NC=0 THEN POKE ADR,5:POKE C,ASC("*")
420 IF NC=1 THEN POKE ADR,13:POKE C,ASC("*")
430 IF NC=2 THEN POKE ADR,2:POKE C,ASC("Q")
440 IF NC=3 THEN POKE ADR,7:POKE C,ASC("Q")
450 RETURN
460 NC=INT(RND(1)*3):REM"STEM
470 IF NC=0 THEN POKE ADR,8
480 IF NC=1 THEN POKE ADR,9
490 IF NC=2 THEN POKE ADR,11
500 RETURN</code></pre>



<p class="wp-block-paragraph">Note how the code tries to use procedures with different responsibilities to update different parts of the tree, the ground, and the background. The result looks like this: <a href="https://x.com/ahesselbom/status/2003217324841796096" target="_blank" rel="noreferrer noopener">https://x.com/ahesselbom/status/2003217324841796096</a></p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2025/12/a-simple-christmas-greeting-for-basic-programmers/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Hårdvaruaccelererad grafik i JavaScript med Three.js</title>
		<link>https://www.winsoft.se/2025/11/hardvaruaccelererad-grafik-i-javascript-med-three-js/</link>
					<comments>https://www.winsoft.se/2025/11/hardvaruaccelererad-grafik-i-javascript-med-three-js/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Tue, 04 Nov 2025 18:42:28 +0000</pubDate>
				<category><![CDATA[JS]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=29142</guid>

					<description><![CDATA[Biblioteket Three.js låter dig skapa hårdvaruaccelererad 3D-grafik direkt i din webbläsare. Jag har testat den, och är imponerad över hur enkelt det är. Besök adressen https://winsoft.se/temp/3d-landskap.html och testa programmet. Gör en &#8220;view source&#8221; (högerklicka i ett tomt område i den ljusa panelen uppe till vänster) och kolla på källkoden. Mycket nöje!]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Biblioteket Three.js låter dig skapa hårdvaruaccelererad 3D-grafik direkt i din webbläsare. Jag har testat den, och är imponerad över hur enkelt det är. Besök adressen <a href="https://winsoft.se/temp/3d-landskap.html" target="_blank" rel="noreferrer noopener">https://winsoft.se/temp/3d-landskap.html</a> och testa programmet. Gör en &#8220;view source&#8221; (högerklicka i ett tomt område i den ljusa panelen uppe till vänster) och kolla på källkoden. Mycket nöje!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2025/11/hardvaruaccelererad-grafik-i-javascript-med-three-js/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Fler AI-tjänster med text-to-image</title>
		<link>https://www.winsoft.se/2025/09/fler-ai-tjanster-med-text-to-image/</link>
					<comments>https://www.winsoft.se/2025/09/fler-ai-tjanster-med-text-to-image/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Wed, 17 Sep 2025 20:25:09 +0000</pubDate>
				<category><![CDATA[Geeky]]></category>
		<category><![CDATA[Science]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=29124</guid>

					<description><![CDATA[År 2022 testade jag sex stycken AI-tjänster som kunde skapa en bild från text. Texten var kort och gott &#8220;Dog runs over green grass&#8221;. Jag testade StarryAI, Hotpot, Pixray, Computer Vision, DeepAI och Dream. Idag har jag testat tre AI-tjänster till, och deras text-to-image. Dessa är Microsoft Copilot, Google Gemini och OpenAI ChatGPT. För detta [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">År 2022 <a href="https://www.winsoft.se/2022/06/nagra-ai-tjanster-av-typen-text-to-image/">testade</a> jag sex stycken AI-tjänster som kunde skapa en bild från text. Texten var kort och gott &#8220;Dog runs over green grass&#8221;. Jag testade <strong>StarryAI</strong>, <strong>Hotpot</strong>, <strong>Pixray</strong>, <strong>Computer Vision</strong>, <strong>DeepAI</strong> och <strong>Dream</strong>.</p>



<p class="wp-block-paragraph">Idag har jag testat tre AI-tjänster till, och deras text-to-image. Dessa är Microsoft <strong>Copilot</strong>, Google <strong>Gemini</strong> och OpenAI <strong>ChatGPT</strong>. För detta test använder jag endast gratisversioner som är tillgängliga som online-tjänst gratis. (Åtminstone gratis om man ser till pengatransaktioner.) Jag har inte följt upp Pixray, Computer Vision eller Dream.</p>



<p class="wp-block-paragraph">År 2022 kunde man inte ha åsikter om bildens stil, vilket går utmärkt idag. Jag valde att lämna bildens stil helt okommenterad, för att se vad jag får på samma gamla prompt idag.</p>



<p class="wp-block-paragraph">Detta fick jag av <strong>StarryAI</strong> för tre år sedan, när jag bad om &#8220;Dog runs over green grass.&#8221;:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="341" height="341" src="https://www.winsoft.se/wp-content/uploads/starryai_2022.jpg" alt="" class="wp-image-29126" srcset="https://www.winsoft.se/wp-content/uploads/starryai_2022.jpg 341w, https://www.winsoft.se/wp-content/uploads/starryai_2022-300x300.jpg 300w, https://www.winsoft.se/wp-content/uploads/starryai_2022-150x150.jpg 150w" sizes="auto, (max-width: 341px) 100vw, 341px" /></figure>



<p class="wp-block-paragraph">Idag gav samma prompt denna bild från <strong>StarryAI</strong>:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="768" height="1024" src="https://www.winsoft.se/wp-content/uploads/starry-dog-runs-over-green-grass.png" alt="" class="wp-image-29127" srcset="https://www.winsoft.se/wp-content/uploads/starry-dog-runs-over-green-grass.png 768w, https://www.winsoft.se/wp-content/uploads/starry-dog-runs-over-green-grass-225x300.png 225w, https://www.winsoft.se/wp-content/uploads/starry-dog-runs-over-green-grass-113x150.png 113w" sizes="auto, (max-width: 768px) 100vw, 768px" /></figure>



<p class="wp-block-paragraph"><strong>Hotpot</strong> kändes ganska i framkant år 2022 och gav mig denna bild:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="339" height="340" src="https://www.winsoft.se/wp-content/uploads/hotpot.jpg" alt="" class="wp-image-29129" srcset="https://www.winsoft.se/wp-content/uploads/hotpot.jpg 339w, https://www.winsoft.se/wp-content/uploads/hotpot-300x300.jpg 300w, https://www.winsoft.se/wp-content/uploads/hotpot-150x150.jpg 150w" sizes="auto, (max-width: 339px) 100vw, 339px" /></figure>



<p class="wp-block-paragraph">Med exakt samma prompt idag, fick jag detta från <strong>Hotpot</strong>:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="512" height="512" src="https://www.winsoft.se/wp-content/uploads/hotpot.png" alt="" class="wp-image-29130" srcset="https://www.winsoft.se/wp-content/uploads/hotpot.png 512w, https://www.winsoft.se/wp-content/uploads/hotpot-300x300.png 300w, https://www.winsoft.se/wp-content/uploads/hotpot-150x150.png 150w" sizes="auto, (max-width: 512px) 100vw, 512px" /></figure>



<p class="wp-block-paragraph">Detta fick jag från <strong>DeepAI</strong> år 2022:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="341" height="342" src="https://www.winsoft.se/wp-content/uploads/deepai2022.jpg" alt="" class="wp-image-29131" srcset="https://www.winsoft.se/wp-content/uploads/deepai2022.jpg 341w, https://www.winsoft.se/wp-content/uploads/deepai2022-300x300.jpg 300w, https://www.winsoft.se/wp-content/uploads/deepai2022-150x150.jpg 150w" sizes="auto, (max-width: 341px) 100vw, 341px" /></figure>



<p class="wp-block-paragraph">Det är oklart vad på bilden som föreställer en hund och vad på bilden som föreställer gräs. Detta fick jag från <strong>DeepAI</strong> idag:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="640" height="640" src="https://www.winsoft.se/wp-content/uploads/deepai.jpg" alt="" class="wp-image-29132" srcset="https://www.winsoft.se/wp-content/uploads/deepai.jpg 640w, https://www.winsoft.se/wp-content/uploads/deepai-300x300.jpg 300w, https://www.winsoft.se/wp-content/uploads/deepai-150x150.jpg 150w" sizes="auto, (max-width: 640px) 100vw, 640px" /></figure>



<p class="wp-block-paragraph">Copilots, Geminis och ChatGPTs text-to-image-funktioner är placerade bakom en språkmodell, så man måste berätta för språkmodellen att det är text-to-image man är intresserad av. Därför har jag uppdaterat prompten till följande:</p>



<p class="wp-block-paragraph"><em>Can you give me an image? Dog runs over green grass.</em></p>



<p class="wp-block-paragraph">Igen, ingen kommentar om stil eller kontext. Jag vill se vad de hostar fram. Detta kommer från <strong>Copilot</strong>:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="683" height="1024" src="https://www.winsoft.se/wp-content/uploads/Copilot_20250917_215130-683x1024.png" alt="" class="wp-image-29133" srcset="https://www.winsoft.se/wp-content/uploads/Copilot_20250917_215130-683x1024.png 683w, https://www.winsoft.se/wp-content/uploads/Copilot_20250917_215130-200x300.png 200w, https://www.winsoft.se/wp-content/uploads/Copilot_20250917_215130-100x150.png 100w, https://www.winsoft.se/wp-content/uploads/Copilot_20250917_215130-768x1152.png 768w, https://www.winsoft.se/wp-content/uploads/Copilot_20250917_215130.png 1024w" sizes="auto, (max-width: 683px) 100vw, 683px" /></figure>



<p class="wp-block-paragraph"><strong>Gemini</strong>:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://www.winsoft.se/wp-content/uploads/gemini.png" alt="" class="wp-image-29134" srcset="https://www.winsoft.se/wp-content/uploads/gemini.png 1024w, https://www.winsoft.se/wp-content/uploads/gemini-300x300.png 300w, https://www.winsoft.se/wp-content/uploads/gemini-150x150.png 150w, https://www.winsoft.se/wp-content/uploads/gemini-768x768.png 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"><strong>ChatGPT</strong>:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="683" src="https://www.winsoft.se/wp-content/uploads/ChatGPT-Image-17-sep.-2025-21_54_12-1024x683.png" alt="" class="wp-image-29135" srcset="https://www.winsoft.se/wp-content/uploads/ChatGPT-Image-17-sep.-2025-21_54_12-1024x683.png 1024w, https://www.winsoft.se/wp-content/uploads/ChatGPT-Image-17-sep.-2025-21_54_12-300x200.png 300w, https://www.winsoft.se/wp-content/uploads/ChatGPT-Image-17-sep.-2025-21_54_12-150x100.png 150w, https://www.winsoft.se/wp-content/uploads/ChatGPT-Image-17-sep.-2025-21_54_12-768x512.png 768w, https://www.winsoft.se/wp-content/uploads/ChatGPT-Image-17-sep.-2025-21_54_12.png 1536w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Bilderna kan såklart inte mäta sig med fotografier (än), åtminstone inte när man tittar på gratis-upplagorna, men denna förändring säger mig en sak: En teknik som fortfarande ligger i sin vagga, har förbättrats i väldigt hög hastighet under några få år. Om detta fortsätter i några år till, kommer världen att se väldigt annorlunda ut.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2025/09/fler-ai-tjanster-med-text-to-image/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Realtidsrendering av mandelbrotmängden</title>
		<link>https://www.winsoft.se/2025/08/realtidsrendering-av-mandelbrotmangden/</link>
					<comments>https://www.winsoft.se/2025/08/realtidsrendering-av-mandelbrotmangden/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sat, 09 Aug 2025 17:29:06 +0000</pubDate>
				<category><![CDATA[Geeky]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=29116</guid>

					<description><![CDATA[Här är en realtidsrendering av mandelbrotsmängden skriven i HTML5/JS. Jag har själv en ganska slö dator, så jag ökar aldrig antalet iterationer till mer än 800, men det är lätt att korrigera. Zooma med mushjulet, panorera genom att klicka och dra. Så här ser källkoden ut:]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Här <a href="https://ahesselbom.se/pages/mandelbrot.html" target="_blank" rel="noreferrer noopener">är en realtidsrendering av mandelbrotsmängden skriven i HTML5/JS</a>. Jag har själv en ganska slö dator, så jag ökar aldrig antalet iterationer till mer än 800, men det är lätt att korrigera. Zooma med mushjulet, panorera genom att klicka och dra. Så här ser källkoden ut:</p>



<pre class="wp-block-code"><code>
&lt;!DOCTYPE html&gt;
&lt;html lang="sv"&gt;
&lt;head&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1"&gt;
    &lt;meta charset="utf-8"&gt;
    &lt;title&gt;Mandelbrot med zoom och panorering&lt;/title&gt;
    &lt;style&gt;
        html, body {
            height: 100%;
            margin: 0;
            padding: 0;
        }

        body {
            display: flex;
            justify-content: center;
            -ms-align-items: center;
            -o-align-items: center;
            -webkit-align-items: center;
            align-items: center;
            background: #0000aa;
        }

        canvas {
            border: 1px solid #4466ff;
            display: block;
            margin: auto;
            background: #000000;
            cursor: grab;
        }

        canvas:active {
            cursor: grabbing;
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;canvas id="canvas" width="640" height="400"&gt;&lt;/canvas&gt;
    &lt;script&gt;
        const canvas = document.getElementById("canvas");
        const ctx = canvas.getContext("2d");
        let width = canvas.width;
        let height = canvas.height;
        let xMin = -2.5, xMax = 1;
        let yMin = -1.25, yMax = 1.25;
        var maxIterations = 50;
        let isDragging = false;
        let dragStartX, dragStartY;
        let dragStartXmin, dragStartXmax, dragStartYmin, dragStartYmax;

        function drawMandelbrot() {
            const img = ctx.createImageData(width, height);
            const data = img.data;

            for (let py = 0; py &lt; height; py++) {
                const y0 = yMin + (py / height) * (yMax - yMin);

                for (let px = 0; px &lt; width; px++) {
                    const x0 = xMin + (px / width) * (xMax - xMin);
                    let x = 0, y = 0, iteration = 0;

                    while (x * x + y * y &lt;= 4 &amp;&amp; iteration &lt; maxIterations) {
                        const xTemp = x * x - y * y + x0;
                        y = 2 * x * y + y0;
                        x = xTemp;
                        iteration++;
                    }

                    const color = iteration === maxIterations ? 0 : 255 - Math.floor(iteration * 255 / maxIterations);
                    const index = 4 * (py * width + px);
                    data&#91;index] = color;
                    data&#91;index + 1] = color;
                    data&#91;index + 2] = color;
                    data&#91;index + 3] = 255;
                }
            }

            ctx.putImageData(img, 0, 0);
        }

        drawMandelbrot();

        canvas.addEventListener("wheel", function (event) {
            event.preventDefault();
            const mouseX = event.offsetX;
            const mouseY = event.offsetY;
            const zoomFactor = event.deltaY &lt; 0 ? 0.9 : 1.1;

            if (zoomFactor &lt; 1.0) {
                maxIterations += 2;
            } else {
                maxIterations -= 2;
            }

            if (maxIterations &lt; 30) {
                maxIterations = 30;
            }
            else if (maxIterations &gt; 800) {
                maxIterations = 800
            }

            const xCenter = xMin + (mouseX / width) * (xMax - xMin);
            const yCenter = yMin + (mouseY / height) * (yMax - yMin);
            const newWidth = (xMax - xMin) * zoomFactor;
            const newHeight = (yMax - yMin) * zoomFactor;
            xMin = xCenter - (mouseX / width) * newWidth;
            xMax = xMin + newWidth;
            yMin = yCenter - (mouseY / height) * newHeight;
            yMax = yMin + newHeight;
            drawMandelbrot();
        });

        canvas.addEventListener("mousedown", function (event) {
            isDragging = true;
            dragStartX = event.offsetX;
            dragStartY = event.offsetY;
            dragStartXmin = xMin;
            dragStartXmax = xMax;
            dragStartYmin = yMin;
            dragStartYmax = yMax;
        });

        canvas.addEventListener("mousemove", function (event) {
            if (!isDragging)
                return;

            const dx = event.offsetX - dragStartX;
            const dy = event.offsetY - dragStartY;
            const xShift = (dx / width) * (dragStartXmax - dragStartXmin);
            const yShift = (dy / height) * (dragStartYmax - dragStartYmin);
            xMin = dragStartXmin - xShift;
            xMax = dragStartXmax - xShift;
            yMin = dragStartYmin - yShift;
            yMax = dragStartYmax - yShift;
            drawMandelbrot();
        });

        canvas.addEventListener("mouseup", () =&gt; { isDragging = false; });
        canvas.addEventListener("mouseleave", () =&gt; { isDragging = false; });
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2025/08/realtidsrendering-av-mandelbrotmangden/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Sprdef2 1.1 is available</title>
		<link>https://www.winsoft.se/2025/07/sprdef2-1-1-is-available/</link>
					<comments>https://www.winsoft.se/2025/07/sprdef2-1-1-is-available/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Thu, 10 Jul 2025 16:41:49 +0000</pubDate>
				<category><![CDATA[Commodore]]></category>
		<category><![CDATA[Programs]]></category>
		<category><![CDATA[Retro]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=29113</guid>

					<description><![CDATA[The C64/128 sprite editor Sprdef2 (runs under Windows) is now available for download. Screenshot and link is available here: https://github.com/Anders-H/Sprdef2/blob/main/README.md]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">The C64/128 sprite editor Sprdef2 (runs under Windows) is now available for download. Screenshot and link is available here: <a href="https://github.com/Anders-H/Sprdef2/blob/main/README.md" target="_blank" rel="noreferrer noopener">https://github.com/Anders-H/Sprdef2/blob/main/README.md</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2025/07/sprdef2-1-1-is-available/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>JobRunner 1.8 (preview)</title>
		<link>https://www.winsoft.se/2025/06/jobrunner-1-8-preview/</link>
					<comments>https://www.winsoft.se/2025/06/jobrunner-1-8-preview/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Fri, 27 Jun 2025 16:34:32 +0000</pubDate>
				<category><![CDATA[Programs]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=29109</guid>

					<description><![CDATA[A preview version of JobRunner 1.8 can now be downloaded. The most important addition is conditional execution that now can be specified when a new job is created. Website: https://github.com/Anders-H/JobRunner/blob/master/README.md]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">A preview version of JobRunner 1.8 can now be downloaded. The most important addition is conditional execution that now can be specified when a new job is created.</p>



<p class="wp-block-paragraph">Website: <a href="https://github.com/Anders-H/JobRunner/blob/master/README.md">https://github.com/Anders-H/JobRunner/blob/master/README.md</a></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="950" height="511" src="https://www.winsoft.se/wp-content/uploads/jr18preview.jpg" alt="" class="wp-image-29110" srcset="https://www.winsoft.se/wp-content/uploads/jr18preview.jpg 950w, https://www.winsoft.se/wp-content/uploads/jr18preview-300x161.jpg 300w, https://www.winsoft.se/wp-content/uploads/jr18preview-150x81.jpg 150w, https://www.winsoft.se/wp-content/uploads/jr18preview-768x413.jpg 768w" sizes="auto, (max-width: 950px) 100vw, 950px" /></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2025/06/jobrunner-1-8-preview/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Secret Agent Man &#8211; teaser 1</title>
		<link>https://www.winsoft.se/2025/05/secret-agent-man-teaser-1/</link>
					<comments>https://www.winsoft.se/2025/05/secret-agent-man-teaser-1/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sun, 18 May 2025 14:21:07 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=29106</guid>

					<description><![CDATA[Nu finns första teaser-videon till spelet Secret Agent Man att betrakta i all sin glans! Hemsidan finns här: https://secretagentman.80tal.se/]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Nu finns första teaser-videon till spelet Secret Agent Man att betrakta i all sin glans!</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Secret Agent Man - teaser 1" width="500" height="281" src="https://www.youtube.com/embed/bxKFz076onY?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p class="wp-block-paragraph">Hemsidan finns här: <a href="https://secretagentman.80tal.se/" target="_blank" rel="noreferrer noopener">https://secretagentman.80tal.se/</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2025/05/secret-agent-man-teaser-1/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Mitt meddelandesystem för Windows är uppdaterat till .NET 8</title>
		<link>https://www.winsoft.se/2025/04/mitt-meddelandesystem-for-windows-ar-uppdaterat-till-net-8/</link>
					<comments>https://www.winsoft.se/2025/04/mitt-meddelandesystem-for-windows-ar-uppdaterat-till-net-8/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Fri, 25 Apr 2025 15:02:52 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=29102</guid>

					<description><![CDATA[Meddelandehantering för Windows löser det tekniska problemet man ser vid t.ex. utvecklandet av ett poker-spel för datorer: Olika ageranden är viktiga vid olika tillfällen. Jag har uppdaterat mitt meddelandesystem till .NET 8. Installation Grundläggande användning Meddelandemönstret visas här. Features Multiple message receiversMutate the list receiversCustom actor matchingActor mutationAdvanced customization: Specifying target method]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Meddelandehantering för Windows löser det tekniska problemet man ser vid t.ex. utvecklandet av ett poker-spel för datorer: Olika ageranden är viktiga vid olika tillfällen. Jag har uppdaterat mitt meddelandesystem till .NET 8.</p>



<p class="wp-block-paragraph"><strong>Installation</strong></p>



<pre class="wp-block-code"><code><code><a href="https://www.nuget.org/packages/SynchronousMessageSystem/#readme-body-tab" target="_blank" rel="noreferrer noopener">Install-Package SynchronousMessageSystem</a></code></code></pre>



<p class="wp-block-paragraph"><strong>Grundläggande användning</strong><br><br><a href="https://github.com/Anders-H/SynchronousMessageSystem/blob/master/DemoApplication/DemoSimpleMessageWithResponse.cs" target="_blank" rel="noreferrer noopener">Meddelandemönstret visas här.</a></p>



<p class="wp-block-paragraph"><strong>Features</strong><br><br><a href="https://github.com/Anders-H/SynchronousMessageSystem/blob/master/DemoApplication/DemoMultipleReceivers.cs" target="_blank" rel="noreferrer noopener">Multiple message receivers</a><br><a href="https://github.com/Anders-H/SynchronousMessageSystem/blob/master/DemoApplication/DemoMutateReceiverList.cs" target="_blank" rel="noreferrer noopener">Mutate the list receivers</a><br><a href="https://github.com/Anders-H/SynchronousMessageSystem/blob/master/DemoApplication/DemoCustomActorMatching.cs" target="_blank" rel="noreferrer noopener">Custom actor matching</a><br><a href="https://github.com/Anders-H/SynchronousMessageSystem/blob/master/DemoApplication/DemoMutatingActors.cs" target="_blank" rel="noreferrer noopener">Actor mutation</a><br><a href="https://github.com/Anders-H/SynchronousMessageSystem/blob/master/DemoApplication/DemoSpecifiedTargetFunctions.cs" target="_blank" rel="noreferrer noopener">Advanced customization: Specifying target method</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2025/04/mitt-meddelandesystem-for-windows-ar-uppdaterat-till-net-8/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>2025-versionen av Snövit kan vara ett misstag</title>
		<link>https://www.winsoft.se/2025/03/2025-versionen-av-snovit-kan-vara-ett-mis/</link>
					<comments>https://www.winsoft.se/2025/03/2025-versionen-av-snovit-kan-vara-ett-mis/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sat, 22 Mar 2025 18:36:11 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=29098</guid>

					<description><![CDATA[Nu har The Walt Disney Company (Disney) släppt en nyinspelning av klassikern Snövit och de sju dvärgarna (1937), kort och gott kallad Snövit. Från början skulle det vara en &#8220;live action movie&#8221;, men Disney ändrade sig i sista sekund och valde att klippa in skådespelare (främst Rachel Zegler och Gal Gadot) i en datoranimerad film, [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Nu har The Walt Disney Company (Disney) släppt en nyinspelning av klassikern Snövit och de sju dvärgarna (1937), kort och gott kallad Snövit. Från början skulle det vara en &#8220;live action movie&#8221;, men Disney ändrade sig i sista sekund och valde att klippa in skådespelare (främst Rachel Zegler och Gal Gadot) i en datoranimerad film, som ett slags omvänd &#8220;Vem satte dit Roger Rabbit&#8221; (1988).</p>



<p class="wp-block-paragraph">Disneys film från 1937 innehåller en extremt problematisk sekvens. Rollfiguren Snövit tar sig in i ett hem som inte tillhör henne och använder dess faciliteter. Som betalning städar hon hemmet. Hemmet visar sig tillhöra sju manliga gruvarbetare. Hur kan man göra en nyinspelning av en film som innehåller ett moment av en kvinna som frivilligt städar? Åt män, dessutom? Givetvis anpassade Disney filmen så att Snövit betalar för gästfriheten genom att låta männen städa efter sig själva &#8211; en mer eller mindre nödvändig förändring för att vinna acceptans år 2025.</p>



<p class="wp-block-paragraph">Något som är mer intressant är att Zegler, som spelar Snövit, privat har tagit ställning för Palestinarörelsen, som i sin tur stöttar Hamas och därmed inte bara allmän högerextremism, utan specifikt Hitlers rendering av Nazismen. Det är inte särskilt kontroversiellt idag när alla älskar Palestina lika mycket som de hatar judar, men eftersom Gal Gadot är jude (och därmed har vissa invändningar mot nazismen) så fungerar inte personkemin särskilt bra. Till detta, en personlig kommentar är att musiken var dålig, att Snövit inte var särskilt vacker och att den ondskefulla drottningen är vackrare än Snövit.</p>



<p class="wp-block-paragraph">Om Disney får tillbaka de tre miljarder de spenderade, så säger det verkligen något om hur starkt deras varumärke är. I skrivande stund är IMDb-betyget på Snövit hela 2,4/10, men det när nyhetens behag har lagt sig, brukar det sjunka en hel del.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2025/03/2025-versionen-av-snovit-kan-vara-ett-mis/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>&#8220;Queen&#8221; vs. &#8220;Queen I&#8221;</title>
		<link>https://www.winsoft.se/2024/11/queen-vs-queen-i/</link>
					<comments>https://www.winsoft.se/2024/11/queen-vs-queen-i/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sat, 30 Nov 2024 13:17:43 +0000</pubDate>
				<category><![CDATA[Pop culture]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=29090</guid>

					<description><![CDATA[Nu har jag jämfört &#8220;Queen&#8221; från 1973 med &#8220;Queen I&#8221; från 2024. Visst är &#8220;Queen I&#8221; lite bättre, men skivan har fått en annan karaktär. Trummorna låter lite för moderna, nästan som något David Richards skulle ha kunnat göra. CD-versionen lär ha lite för mycket diskant, men det var inget problem på LP-versionen med min [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Nu har jag jämfört &#8220;Queen&#8221; från 1973 med &#8220;Queen I&#8221; från 2024. Visst är &#8220;Queen I&#8221; lite bättre, men skivan har fått en annan karaktär. Trummorna låter lite för moderna, nästan som något David Richards skulle ha kunnat göra. CD-versionen lär ha lite för mycket diskant, men det var inget problem på LP-versionen med min anläggning. Inspelningen är i övrigt oförändrad, förutom lite pitch correction på Freddie Mercury. Det är väldigt subtilt gjort, så det märks knappt. Men det är ändå synd. Autotune får förvisso dåliga sångare att låta bättre, men det får bra sångare att låta sämre, för de sjunger mot vad de hör. Men som tur är, har de applicerat ganska lite pitch correction, så hans röst låter fortfarande naturlig, men ur den aspekten är &#8220;Queen&#8221; från 1973 bättre. Musiken ger jag 4/5, nymixen från 2024 får 2,5/5.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://www.winsoft.se/wp-content/uploads/L1070699-1024x1024.jpg" alt="" class="wp-image-29091" srcset="https://www.winsoft.se/wp-content/uploads/L1070699-1024x1024.jpg 1024w, https://www.winsoft.se/wp-content/uploads/L1070699-300x300.jpg 300w, https://www.winsoft.se/wp-content/uploads/L1070699-150x150.jpg 150w, https://www.winsoft.se/wp-content/uploads/L1070699-768x768.jpg 768w, https://www.winsoft.se/wp-content/uploads/L1070699-1536x1536.jpg 1536w, https://www.winsoft.se/wp-content/uploads/L1070699.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Den är en förbättring på det totala, men det kunde ha gjorts bättre. Pitch correction på Freddie Mercury är helt meningslöst. Det skulle vara som att sätta autotune på Steve Perry, David Coverdale eller Bryan Adams. Pitch correction är till för Dua Lipa, Taylor Swift och Ariana Grande. Om skivbolaget tar sig an mitt favoritalbum, &#8220;Queen II&#8221; från 1974, så får jag väl köpa även den. Men &#8220;Queen II&#8221; hade mycket bättre ljud än &#8220;Queen&#8221; redan från början, om än lite stumma slagverk även där. Och frågan är om inte en ny remaster av EMI:s gamla release av &#8220;Queen&#8221; hade räckt?</p>



<p class="wp-block-paragraph"><a href="https://www.instagram.com/p/DC_u7r7IIiR/" target="_blank" rel="noreferrer noopener">Fler bilder finns på Instagram.</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2024/11/queen-vs-queen-i/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>JetBrains Rider är gratis för hemmabruk</title>
		<link>https://www.winsoft.se/2024/10/jetbrains-rider-ar-gratis-for-hemmabruk/</link>
					<comments>https://www.winsoft.se/2024/10/jetbrains-rider-ar-gratis-for-hemmabruk/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Fri, 25 Oct 2024 17:07:12 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=29080</guid>

					<description><![CDATA[År 2024 finns det en IDE som verkligen sticker ut, och det är Microsoft Visual Studio. Om du endast jobbar med C# så finns det en produkt som faktiskt är ännu bättre, nämligen JetBrains Rider. Visual Studio har varit gratis för privat bruk länge, men från och med nu kan du även använda Rider helt [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">År 2024 finns det en IDE som verkligen sticker ut, och det är Microsoft Visual Studio. Om du endast jobbar med C# så finns det en produkt som faktiskt är ännu bättre, nämligen JetBrains Rider. Visual Studio har varit gratis för privat bruk länge, men från och med nu kan du även använda Rider helt gratis för privat bruk. Och det är en varm rekommendation.</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2024/10/jetbrains-rider-ar-gratis-for-hemmabruk/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Nu släpps .NET 9.0 &#8211; utan meddelandehantering</title>
		<link>https://www.winsoft.se/2024/10/nu-slapps-net-9-0-utan-meddelandehantering/</link>
					<comments>https://www.winsoft.se/2024/10/nu-slapps-net-9-0-utan-meddelandehantering/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Fri, 11 Oct 2024 14:06:45 +0000</pubDate>
				<category><![CDATA[Microsoft .NET]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=29074</guid>

					<description><![CDATA[Nu i skrivande stund finns release candidate 2 av .NET 9.0 att ladda hem, så jag förmodar att det inte handlar om en särskilt lång tid innan det finns en version att använda i produktion. Både programmeringsspråket C# och själva .NET börjar på att kännas ganska färdigt, så det mesta som är nytt i version [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Nu i skrivande stund finns release candidate 2 av .NET 9.0 att ladda hem, så jag förmodar att det inte handlar om en särskilt lång tid innan det finns en version att använda i produktion. Både programmeringsspråket C# och själva .NET börjar på att kännas ganska färdigt, så det mesta som är nytt i version 9.0 sker under skalet. Men även bland de nya features som introduceras, så är prestanda viktigt. Till exempel introducerar man en feature toggle som helt enkelt kan trimma bort kod som programmeraren togglar bort! Andra nya features handlar om infrastruktur (.NET Aspire). Det var tal om att .NET 9.0 skulle tillhandahålla meddelandehantering (Eventing Framework), men eftersom .NET saknat meddelandehantering i alla år, så finns det idag väl etablerade tredjepartsbibliotek för meddelandehantering. För att inte röra runt i den grytan i onödan, har Eventing Framework kasserats. Åtminstone för tillfället.</p>



<p class="wp-block-paragraph">Förändringar man kanske inte märker av i vardagen är att man förbättrat garbage collectorn till att välja strategi beroende på applikationens storlek. Om en applikation är mindre, kommer garbage collectorn att prioritera en resurssnål strategi, men om applikationen är större så kommer strategin vara mer behovsprövad, likt vad som redan är fallet idag. På detta vis kommer små applikationer inte ha de prestandastörningar som annars utmärker programmeringsspråk med garbage collection (alltså det som Microsoft kallar för &#8220;hanterade språk&#8221;, som t.ex. C# och Java, till skillnad från &#8220;ohanterade språk&#8221; som C och C++).</p>



<p class="wp-block-paragraph">Det är såklart bra att C# blir snabbare och snabbare, men särskilt spännande är det inte att växla från .NET 8.0 (med C# 12) till .NET 9.0 (med C# 13), och jag är nyfiken på vad som kommer att hända i .NET 10.0. Jag gissar att plattformen kommer att röra sig mindre och mindre. Personligen hoppas jag på att Blazor WASM blir mer stabilt och att det blir enklare att göra små program som är self-contained. Det är dessutom fortfarande ganska komplicerat att använda .NET på Linux och Mac, men det kan såklart bero på att jag är en undermålig användare på dessa plattformar.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2024/10/nu-slapps-net-9-0-utan-meddelandehantering/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>AI kommer aldrig kunna&#8230;</title>
		<link>https://www.winsoft.se/2024/09/ai-kommer-aldrig-kunna/</link>
					<comments>https://www.winsoft.se/2024/09/ai-kommer-aldrig-kunna/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sat, 07 Sep 2024 16:41:01 +0000</pubDate>
				<category><![CDATA[Science]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17620</guid>

					<description><![CDATA[Artificiell intelligens (AI) har varit med i matchen längre än mig. Under senare år har både användbarheten och antalet tillämpningar ökat. I mitten på 1980-talet blev AI tillgängligt för hemdatorer. Keith Brain och Steven Brain skrev boken &#8220;Artificial intelligens on the&#8230;&#8221; följt av olika plattformars namn, som t.ex. Commodore 64, Sinclair ZX Spectrum, Sinclair QL, [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Artificiell intelligens (AI) har varit med i matchen längre än mig. Under senare år har både användbarheten och antalet tillämpningar ökat. I mitten på 1980-talet blev AI tillgängligt för hemdatorer. Keith Brain och Steven Brain skrev boken &#8220;Artificial intelligens on the&#8230;&#8221; följt av olika plattformars namn, som t.ex. Commodore 64, Sinclair ZX Spectrum, Sinclair QL, BBC och Electron, med undertiteln &#8220;make your micro think&#8221;. Ordet &#8220;micro&#8221; är en förkortning av en mikrodator, och en mikrodator är en dator som hade en &#8220;<a href="https://en.wikipedia.org/wiki/Microprocessor" target="_blank" rel="noreferrer noopener">mikroprocessor</a>&#8220;, som t.ex. Commodore 64. Boken berörde mest förståelsen av naturligt språk och mönsterigenkänning. Idag kan datorerna göra mycket mer.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="180" height="272" src="https://www.winsoft.se/wp-content/uploads/artificial-intelligence-on-the-commodore-64.jpg" alt="" class="wp-image-17622" srcset="https://www.winsoft.se/wp-content/uploads/artificial-intelligence-on-the-commodore-64.jpg 180w, https://www.winsoft.se/wp-content/uploads/artificial-intelligence-on-the-commodore-64-99x150.jpg 99w" sizes="auto, (max-width: 180px) 100vw, 180px" /></figure>



<p class="wp-block-paragraph">Under resans gång har vi sett dessa kapaciteter kompletteras med förutsägelser baserat på avancerad statistik, tal-till-text, bildigenkänning, bildgenerering och stora språkmodeller.</p>



<p class="wp-block-paragraph">Varje nytt genombrott som rapporterats, har ifrågasatts av personer vars kunskap på ämnet liknar en överkörd grävlings insatser i stavhopp. Schack skulle vara den slutgiltiga skillnaden mellan människa och maskin, men så var det inte. Så snart man fått datamaskiner att fatta självständiga beslut, deklarerade en socionom från Malmö att datorer endast kan göra det man säger åt dem. Så snart man fått datamaskiner att generera illustrationer till text, deklarerade en kommunal kommunikatör från Göteborg att datorer inte kan ersätta människan där heller.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="623" height="463" src="https://www.winsoft.se/wp-content/uploads/Namnlos.jpg" alt="" class="wp-image-17621" srcset="https://www.winsoft.se/wp-content/uploads/Namnlos.jpg 623w, https://www.winsoft.se/wp-content/uploads/Namnlos-300x223.jpg 300w, https://www.winsoft.se/wp-content/uploads/Namnlos-150x111.jpg 150w" sizes="auto, (max-width: 623px) 100vw, 623px" /></figure>



<p class="wp-block-paragraph">Något så enkelt som att AI förutspådde graden av uppsägningar i samband med pandemin år 2019, och att AI hittade slöseri av kommunala pengar upp till 20% av kommunernas budget, ändrar inte folks uppfattning, för ingen uttalar sig så självsäkert i ett ämne som de som inte vet något om ämnet.</p>



<p class="wp-block-paragraph">&#8220;AI kan inte ditt&#8221;, &#8220;AI kommer aldrig kunna datt&#8221;. Men den relevanta frågan borde vara: <em>Hur</em> vet du det?</p>



<p class="wp-block-paragraph">Och varför delar inte personer med ämneskompetens din uppfattning?</p>



<p class="wp-block-paragraph">Fenomenet kallas för Dunning-Kruger-effekten. Den som inte har kunskap också är oförmögen att förstå att han eller hon överskattar sin kunskap i ett ämne. Därför kommer dessa deklarationer alltid från personer som inte vet vad AI är.</p>



<p class="wp-block-paragraph">När det gäller AI är den drivande effekten ett slags uppfattning om att det man vill ska vara sant, uppfattas som sant. Den som inte vill att AI ska kunna utföra vissa arbetsuppgifter som idag utförs av människor, anser att så inte är fallet. Och för att skydda den uppfattningen, undviker man ny kunskap. Men man undviker definitivt inte &#8220;expertutlåtanden&#8221; i sakfrågan!</p>



<p class="wp-block-paragraph">Anledningen till att holdingbolaget Sony Music som äger t.ex. Queens musik, gärna ser att människor lyssnar på och studerar Queen, men vill förbjuda robotar att göra detsamma, är naturligtvis för att de vet att det idag finns AI som kan åstadkomma så mycket mer än vad en människa kan göra, och att de då själva vill vara den som har en AI som är tränad på Queen, så att de kan vara ensamma om att ge ut ny Queen-musik. Detta sker samtidigt som vanligt folk anser att AI inte bara är obrukbart inom kulturen idag, utan att den aldrig kommer vara användbar.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2024/09/ai-kommer-aldrig-kunna/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>En populär lösning på ett icke-existerande problem</title>
		<link>https://www.winsoft.se/2024/08/en-popular-losning-pa-ett-icke-existerande-problem/</link>
					<comments>https://www.winsoft.se/2024/08/en-popular-losning-pa-ett-icke-existerande-problem/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sun, 18 Aug 2024 14:03:07 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17614</guid>

					<description><![CDATA[Om du har dragit en strömkabel från en punkt till en annan, men råkat runda en regel så snäv att inte strömkabelns ändar kan göra samma runda, så har du förmodligen ett problem. Det råder tydligen ingen fara! Du kan lösa detta utan att klippa av någon av strömkabelns ändar! Men varför drar någon en [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Om du har dragit en strömkabel från en punkt till en annan, men råkat runda en regel så snäv att inte strömkabelns ändar kan göra samma runda, så har du förmodligen ett problem.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="200" height="239" src="https://www.winsoft.se/wp-content/uploads/Untitled-1-4.jpg" alt="" class="wp-image-17615" srcset="https://www.winsoft.se/wp-content/uploads/Untitled-1-4.jpg 200w, https://www.winsoft.se/wp-content/uploads/Untitled-1-4-126x150.jpg 126w" sizes="auto, (max-width: 200px) 100vw, 200px" /></figure>



<p class="wp-block-paragraph">Det råder tydligen ingen fara! Du kan lösa detta utan att klippa av någon av strömkabelns ändar! Men varför drar någon en kabel på detta vis? Det är till och med så att en video som ger en lösning på problemet, ifrågasätter problemet!</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="How to Free a Trapped Electrical Plug" width="500" height="281" src="https://www.youtube.com/embed/lTtSENVPVa4?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p class="wp-block-paragraph">Troligen vill man dra en sladd <em>under</em> det trånga utrymmet, för att få lite ordning och reda, och det kan vara svårt att komma loss ifrån. Men lösningen som alltid presenteras hanterar något helt annat: När någon pillat in en ögla av sladden under ett trångt utrymme, och dragit kontakten genom den öglan. Detta är något man väldigt sällan gör, men har man gjort det, så behöver man inte klippa av sladden för att få bort den. De tvåpoliga <a href="https://sv.wikipedia.org/wiki/Europlug" target="_blank" rel="noreferrer noopener">eurokontakterna</a> är enklare att dra, för de har ingen fet kontakt i änden, men jag har faktiskt en och annan sladdskarvdosa installerat, för att jag helt enkelt klippt av en sladd för att spara jobb.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2024/08/en-popular-losning-pa-ett-icke-existerande-problem/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>74 filmrecensioner hittills</title>
		<link>https://www.winsoft.se/2024/08/74-filmrecensioner-hittills/</link>
					<comments>https://www.winsoft.se/2024/08/74-filmrecensioner-hittills/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sun, 11 Aug 2024 21:10:11 +0000</pubDate>
				<category><![CDATA[Pop culture]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17611</guid>

					<description><![CDATA[Henrik Andersson och jag tog en paus denna vecka, p.g.a. semester med mera, men är snart tillbaka med våra filmrecensioner under namnet Flimmer Duo. Dessa 74 filmer är avhandlade hittills: Avsnitt 74: Khraniteli (Soviet-Sagan om ringen) (90-tal) (2024-07-30) Avsnitt 73: Starman (1984) (2024-06-24) Avsnitt 72: Dreamscape (1984) (2024-06-08) Avsnitt 71: The Burning (1981) (2024-05-15) Avsnitt [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Henrik Andersson och jag tog en paus denna vecka, p.g.a. semester med mera, men är snart tillbaka med våra filmrecensioner under namnet <a href="https://www.youtube.com/@flimmerduo" target="_blank" rel="noopener"><strong>Flimmer Duo</strong></a>. Dessa 74 filmer är avhandlade hittills:</p>
<p>Avsnitt <b>74</b>: <a href="https://www.youtube.com/watch?v=QnpyogmHkzc" target="_blank" rel="noopener">Khraniteli (Soviet-Sagan om ringen) (90-tal)</a> (2024-07-30)<br />
Avsnitt <b>73</b>: <a href="https://www.youtube.com/watch?v=barUrVNaf_0" target="_blank" rel="noopener">Starman (1984)</a> (2024-06-24)<br />
Avsnitt <b>72</b>: <a href="https://www.youtube.com/watch?v=iNuSwJt6mtw" target="_blank" rel="noopener">Dreamscape (1984)</a> (2024-06-08)<br />
Avsnitt <b>71</b>: <a href="https://www.youtube.com/watch?v=3Te8Ut3EkiM" target="_blank" rel="noopener">The Burning (1981)</a> (2024-05-15)<br />
Avsnitt <b>70</b>: <a href="https://www.youtube.com/watch?v=ep9ZFJwwC6Q" target="_blank" rel="noopener">Skräcknatten (Flimmer Duo) (1985)</a> (2024-05-01)<br />
Avsnitt <b>69</b>: <a href="https://www.youtube.com/watch?v=Q6ULYYruQpY" target="_blank" rel="noopener">Strangeland (N/A)</a> (2024-04-22)<br />
Avsnitt <b>68</b>: <a href="https://www.youtube.com/watch?v=TcDmXHtBEnA" target="_blank" rel="noopener">Vargarnas natt (Flimmer Duo) (1984)</a> (2024-04-06)<br />
Avsnitt <b>67</b>: <a href="https://www.youtube.com/watch?v=wwa8p40PRmU" target="_blank" rel="noopener">The Frisco Kid (70-tal)</a> (2024-03-19)<br />
Avsnitt <b>66</b>: <a href="https://www.youtube.com/watch?v=4ECNa3Qzvtw" target="_blank" rel="noopener">Monsterklubben (1987)</a> (2024-03-14)<br />
Avsnitt <b>65</b>: <a href="https://www.youtube.com/watch?v=dVnKhWAmpeY" target="_blank" rel="noopener">I de lugnaste vatten (Flimmer Duo) (1980)</a> (2024-02-27)<br />
Avsnitt <b>64</b>: <a href="https://www.youtube.com/watch?v=3jnUWftC2F8" target="_blank" rel="noopener">Wheels of fire (1985)</a> (2024-02-04)<br />
Avsnitt <b>63</b>: <a href="https://www.youtube.com/watch?v=-GcX6Do_wYc" target="_blank" rel="noopener">Kiss meets the phantom of the park (70-tal)</a> (2024-01-26)<br />
Avsnitt <b>62</b>: <a href="https://www.youtube.com/watch?v=aoKySo1FuGk" target="_blank" rel="noopener">Cube Zero och japanska Cube (N/A)</a> (2023-12-24)<br />
Avsnitt <b>61</b>: <a href="https://www.youtube.com/watch?v=Z3A7uM1YA70" target="_blank" rel="noopener">Cube och Cube 2: Hypercube (90-tal)</a> (2023-11-25)<br />
Avsnitt <b>60</b>: <a href="https://www.youtube.com/watch?v=GO0O73jlsuw" target="_blank" rel="noopener">The creature from the haunted sea (N/A)</a> (2023-11-03)<br />
Avsnitt <b>59</b>: <a href="https://www.youtube.com/watch?v=QRaZvqSZuOo" target="_blank" rel="noopener">Trenchcoat (1983)</a> (2023-10-14)<br />
Avsnitt <b>58</b>: <a href="https://www.youtube.com/watch?v=WX4ktJFWNII" target="_blank" rel="noopener">Night of the living dead (N/A)</a> (2023-09-30)<br />
Avsnitt <b>57</b>: <a href="https://www.youtube.com/watch?v=3ATmxRNoD0g" target="_blank" rel="noopener">The New Barbarians (1983)</a> (2023-09-13)<br />
Avsnitt <b>56</b>: <a href="https://www.youtube.com/watch?v=F4ONQDe3sNw" target="_blank" rel="noopener">Rising Storm (1989)</a> (2023-08-30)<br />
Avsnitt <b>55</b>: <a href="https://www.youtube.com/watch?v=F_43UJANxUQ" target="_blank" rel="noopener">Titta vi spökar (1985)</a> (2023-08-14)<br />
Avsnitt <b>54</b>: <a href="https://www.youtube.com/watch?v=YYuJAMDdeX0" target="_blank" rel="noopener">King Kong lever (1986)</a> (2023-06-11)<br />
Avsnitt <b>53</b>: <a href="https://www.youtube.com/watch?v=_6emnNK1FPQ" target="_blank" rel="noopener">Dark Angel (90-tal)</a> (2023-06-01)<br />
Avsnitt <b>52</b>: <a href="https://www.youtube.com/watch?v=VEGMMRKU9j0" target="_blank" rel="noopener">Exorcisten II: Kättaren (70-tal)</a> (2023-05-13)<br />
Avsnitt <b>51</b>: <a href="https://www.youtube.com/watch?v=WHMHoUvXrGs" target="_blank" rel="noopener">En fisk som heter Wanda (1988)</a> (2023-05-02)<br />
Avsnitt <b>50</b>: <a href="https://www.youtube.com/watch?v=DsNmXdc893I" target="_blank" rel="noopener">Return to horror high (1987)</a> (2023-04-27)<br />
Avsnitt <b>49</b>: <a href="https://www.youtube.com/watch?v=kwFkBswGC7M" target="_blank" rel="noopener">Strike commando (1987)</a> (2023-04-10)<br />
Avsnitt <b>48</b>: <a href="https://www.youtube.com/watch?v=paTa4JbFzTM" target="_blank" rel="noopener">Cobra (1986)</a> (2023-02-16)<br />
Avsnitt <b>47</b>: <a href="https://www.youtube.com/watch?v=18OuFef3UAA" target="_blank" rel="noopener">Hett Om Öronen! (1982)</a> (2023-01-27)<br />
Avsnitt <b>46</b>: <a href="https://www.youtube.com/watch?v=kvw65vk_FrE" target="_blank" rel="noopener">Ring &#8211; Så mördar vi (1985)</a> (2023-01-07)<br />
Avsnitt <b>45</b>: <a href="https://www.youtube.com/watch?v=E_i1BEmX7IU" target="_blank" rel="noopener">Gargoyles (Flimmer Duo) (70-tal)</a> (2022-12-12)<br />
Avsnitt <b>44</b>: <a href="https://www.youtube.com/watch?v=yGWjo3edqXo" target="_blank" rel="noopener">Hotet från den åttonde dimensionen (1984)</a> (2022-12-02)<br />
Avsnitt <b>43</b>: <a href="https://www.youtube.com/watch?v=hHrrh_kt73c" target="_blank" rel="noopener">Malone (1987)</a> (2022-11-17)<br />
Avsnitt <b>42</b>: <a href="https://www.youtube.com/watch?v=Ha7ROITBqmM" target="_blank" rel="noopener">Dödlig hetta (1987)</a> (2022-10-28)<br />
Avsnitt <b>41</b>: <a href="https://www.youtube.com/watch?v=1WzKwh59LXY" target="_blank" rel="noopener">Perfect People (1988)</a> (2022-10-14)<br />
Avsnitt <b>40</b>: <a href="https://www.youtube.com/watch?v=jPBwSR8gjOk" target="_blank" rel="noopener">Katastrofplats Houston (70-tal)</a> (2022-09-23)<br />
Avsnitt <b>39</b>: <a href="https://www.youtube.com/watch?v=_w7dFxnnNfs" target="_blank" rel="noopener">Hard Boiled (90-tal)</a> (2022-08-27)<br />
Avsnitt <b>38</b>: <a href="https://www.youtube.com/watch?v=kc66O8ORbjI" target="_blank" rel="noopener">Iron Dragon Strikes Back (70-tal)</a> (2022-07-30)<br />
Avsnitt <b>37</b>: <a href="https://www.youtube.com/watch?v=tF71gwRO4YE" target="_blank" rel="noopener">Pink Floyd &#8211; The Wall (1982)</a> (2022-07-17)<br />
Avsnitt <b>36</b>: <a href="https://www.youtube.com/watch?v=M6h3GgEqGqs" target="_blank" rel="noopener">A.P.E.X. (90-tal)</a> (2022-07-03)<br />
Avsnitt <b>35</b>: <a href="https://www.youtube.com/watch?v=fjtAc3PCOgQ" target="_blank" rel="noopener">Piraterna vid Silicon Valley (90-tal)</a> (2022-06-29)<br />
Avsnitt <b>34</b>: <a href="https://www.youtube.com/watch?v=i_msR31ed6I" target="_blank" rel="noopener">Megaville (90-tal)</a> (2022-06-09)<br />
Avsnitt <b>33</b>: <a href="https://www.youtube.com/watch?v=kp-Wmd_rgQM" target="_blank" rel="noopener">Stone cold (90-tal)</a> (2022-05-29)<br />
Avsnitt <b>32</b>: <a href="https://www.youtube.com/watch?v=t61UtPh5KJA" target="_blank" rel="noopener">Blint raseri (1989)</a> (2022-05-13)<br />
Avsnitt <b>31</b>: <a href="https://www.youtube.com/watch?v=e0OzokWZnag" target="_blank" rel="noopener">Evilspeak (1981)</a> (2022-05-06)<br />
Avsnitt <b>30</b>: <a href="https://www.youtube.com/watch?v=S8gTN-DGvIE" target="_blank" rel="noopener">Jesus Christ Superstar (70-tal)</a> (2022-04-14)<br />
Avsnitt <b>29</b>: <a href="https://www.youtube.com/watch?v=OofTwaX3FGE" target="_blank" rel="noopener">The Thing (1982)</a> (2022-03-28)<br />
Avsnitt <b>28</b>: <a href="https://www.youtube.com/watch?v=uC5kTwR9qR8" target="_blank" rel="noopener">Monster dog och Robotkriget (1984)</a> (2022-03-17)<br />
Avsnitt <b>27</b>: <a href="https://www.youtube.com/watch?v=lixdEMHY3w8" target="_blank" rel="noopener">Lida och olika film-franchises (90-tal)</a> (2022-03-03)<br />
Avsnitt <b>26</b>: <a href="https://www.youtube.com/watch?v=eFMjwBHAZf8" target="_blank" rel="noopener">Bruce and the Shaolin Bronzemen (70-tal)</a> (2022-02-07)<br />
Avsnitt <b>25</b>: <a href="https://www.youtube.com/watch?v=8AMB0ZXUlDY" target="_blank" rel="noopener">Stryker (1983)</a> (2022-01-16)<br />
Avsnitt <b>24</b>: <a href="https://www.youtube.com/watch?v=CvLFd7VkIuo" target="_blank" rel="noopener">Christmas rush (N/A)</a> (2021-12-23)<br />
Avsnitt <b>23</b>: <a href="https://www.youtube.com/watch?v=C1FZTZl_2ME" target="_blank" rel="noopener">Ghostbusters: Afterlife (N/A)</a> (2021-12-15)<br />
Avsnitt <b>22</b>: <a href="https://www.youtube.com/watch?v=vdYpASYlMrw" target="_blank" rel="noopener">Ghostbusters I och II (1984)</a> (2021-11-27)<br />
Avsnitt <b>21</b>: <a href="https://www.youtube.com/watch?v=r8r11XP2Agc" target="_blank" rel="noopener">Wanted: Dead or alive (1986)</a> (2021-11-08)<br />
Avsnitt <b>20</b>: <a href="https://www.youtube.com/watch?v=WYLZg3PMnV4" target="_blank" rel="noopener">Vargarnas pakt (90-tal)</a> (2021-10-25)<br />
Avsnitt <b>19</b>: <a href="https://www.youtube.com/watch?v=-fPjrILYGok" target="_blank" rel="noopener">Witchboard (Flimmer Duo) (1986)</a> (2021-10-13)<br />
Avsnitt <b>18</b>: <a href="https://www.youtube.com/watch?v=jEAHQFI6ANk" target="_blank" rel="noopener">The Aftermath (1982)</a> (2021-09-20)<br />
Avsnitt <b>17</b>: <a href="https://www.youtube.com/watch?v=FPSB6Tg16Zo" target="_blank" rel="noopener">Dark city (90-tal)</a> (2021-09-15)<br />
Avsnitt <b>16</b>: <a href="https://www.youtube.com/watch?v=rT3JoLoRj9k" target="_blank" rel="noopener">Piraya och Piraya II &#8211; de flygande mördarna (1981)</a> (2021-08-25)<br />
Avsnitt <b>15</b>: <a href="https://www.youtube.com/watch?v=dIUJWsQsvO0" target="_blank" rel="noopener">Moontrap (1988)</a> (2021-08-10)<br />
Avsnitt <b>14</b>: <a href="https://www.youtube.com/watch?v=btj_5adeVeI" target="_blank" rel="noopener">Hajen 4 (1987)</a> (2021-07-25)<br />
Avsnitt <b>13</b>: <a href="https://www.youtube.com/watch?v=Vh4Vh6DyPKM" target="_blank" rel="noopener">Cyclone (1987)</a> (2021-07-10)<br />
Avsnitt <b>12</b>: <a href="https://www.youtube.com/watch?v=yP336AGB5_s" target="_blank" rel="noopener">Order of the Eagle (1989)</a> (2021-06-27)<br />
Avsnitt <b>11</b>: <a href="https://www.youtube.com/watch?v=qoA2iofsBIE" target="_blank" rel="noopener">Runaway (Flimmer Duo) (1984)</a> (2021-06-13)<br />
Avsnitt <b>10</b>: <a href="https://www.youtube.com/watch?v=a0MmFgSYZ_Y" target="_blank" rel="noopener">Deadly Reactor (1989)</a> (2021-05-29)<br />
Avsnitt <b>9</b>: <a href="https://www.youtube.com/watch?v=sfa4CSi3IC0" target="_blank" rel="noopener">Spinal Tap (1984)</a> (2021-05-15)<br />
Avsnitt <b>8</b>: <a href="https://www.youtube.com/watch?v=vKwzdXviBRs" target="_blank" rel="noopener">Brisby och NIMHs hemlighet (1982)</a> (2021-05-01)<br />
Avsnitt <b>7</b>: <a href="https://www.youtube.com/watch?v=xLiTebr9Vwc" target="_blank" rel="noopener">Russian Terminator (1989)</a> (2021-04-17)<br />
Avsnitt <b>6</b>: <a href="https://www.youtube.com/watch?v=2tJaHAvjjrw" target="_blank" rel="noopener">Highlander II (90-tal)</a> (2021-04-04)<br />
Avsnitt <b>5</b>: <a href="https://www.youtube.com/watch?v=H2sq1OD5q7o" target="_blank" rel="noopener">Fist of legend (90-tal)</a> (2021-03-21)<br />
Avsnitt <b>4</b>: <a href="https://www.youtube.com/watch?v=rbZpyFwxm0w" target="_blank" rel="noopener">War dog (1987)</a> (2021-03-06)<br />
Avsnitt <b>3</b>: <a href="https://www.youtube.com/watch?v=VcUbu1pezZ4" target="_blank" rel="noopener">Slaughter high (1985)</a> (2021-02-21)<br />
Avsnitt <b>2</b>: <a href="https://www.youtube.com/watch?v=PymcICFpoMk" target="_blank" rel="noopener">Robot Jox (1989)</a> (2021-02-08)<br />
Avsnitt <b>1</b>: <a href="https://www.youtube.com/watch?v=agPZAHDcBww" target="_blank" rel="noopener">Future Hunters (1988)</a> (2021-01-24)</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2024/08/74-filmrecensioner-hittills/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Demokraterna sprider desinformation om &#8220;molnet&#8221;</title>
		<link>https://www.winsoft.se/2024/08/demokraterna-sprider-desinformation-om-molnet/</link>
					<comments>https://www.winsoft.se/2024/08/demokraterna-sprider-desinformation-om-molnet/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sun, 04 Aug 2024 14:29:07 +0000</pubDate>
				<category><![CDATA[Science]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17604</guid>

					<description><![CDATA[Partiet Demokraternas presidentkandidat Kamala Harris gjorde nyligen ett uttalande om hur s.k. cloud computing fungerar. Min transkribering: Eh, so, you, no longer are you necessarily keeping those private files in some file cabinet that is locked in the basement of the house. It&#8217;s on your laptop and it&#8217;s then therefore up here in this cloud, [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Partiet Demokraternas presidentkandidat <strong>Kamala Harris</strong> gjorde <a href="https://www.youtube.com/watch?v=ACfFCaMiv2c" target="_blank" rel="noreferrer noopener">nyligen</a> ett uttalande om hur s.k. <em>cloud computing</em> fungerar. Min transkribering:</p>



<p class="wp-block-paragraph"><blockquote><em>Eh, so, you, no longer are you necessarily keeping those private files in some file cabinet that is locked in the basement of the house. It&#8217;s on your laptop and it&#8217;s then therefore up here in this cloud, that exists above us. Right? It&#8217;s no longer in a physical place!</em></blockquote></p>



<p class="wp-block-paragraph">Min fria tolkning är att Internet innan <em>cloud computing</em> innebar <em>serverlagring</em> att lagringen skedde i din egen källare, men att med <em>cloud computing</em> så behöver inte filerna längre någon fysisk plats, och att källaren därmed kunde bli en gillestuga.</p>



<p class="wp-block-paragraph">Detta är inte helt korrekt.</p>



<p class="wp-block-paragraph"><em>Cloud</em> syftar inte till vatten i gasform, utan till <em>flera webbservrar</em>. I stället för att en webbadress tar dig till en server som håller reda på ditt sessionsdata, så tar dig webbadressen till en tjänst som levereras av (potentiellt) många servrar.</p>



<p class="wp-block-paragraph">Nackdelen med detta är att sessionsdata måste skickas fram och tillbaka mellan klient och server, eftersom en array av servrar står redo att hantera inkommande förfrågningar, där den ene inte nödvändigtvis vet vad den andre gör. Fördelen är att upp- och nedskalning kan göras mer dynamiskt, med kortare (i princip inga) ledtider, inom denna array.</p>



<p class="wp-block-paragraph">Att något lagras i molnet, säger bara något om <em>hur</em> det lagras, inte något om datats fysiska plats. Cloud computing löser i princip <a href="https://en.wikipedia.org/wiki/Slashdot_effect" target="_blank" rel="noreferrer noopener">slashdot-problemet</a>, inte problemet med att serverlagring kräver en serverhall i källaren &#8211; det problemet löste själva Internet.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2024/08/demokraterna-sprider-desinformation-om-molnet/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>100 filmer till</title>
		<link>https://www.winsoft.se/2024/07/100-filmer-till/</link>
					<comments>https://www.winsoft.se/2024/07/100-filmer-till/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Fri, 19 Jul 2024 12:18:07 +0000</pubDate>
				<category><![CDATA[Pop culture]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17598</guid>

					<description><![CDATA[Film 1 av 100: Tjejen som gjorde lumpen (1980) av Howard Zieff med Goldie Hawn och Eileen Brennan. På grund av olika omständigheter väljer en överklassflicka att göra militärtjänst. Extremt kändistätt, någorlunda tätt duggande moralkakor, men mest av allt; långtråkigt. Hur bra Hawn än är, och hur mycket hon brukar lyfta filmer, så håller inte [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Film 1 av 100: Tjejen som gjorde lumpen (1980) av Howard Zieff med Goldie Hawn och Eileen Brennan. På grund av olika omständigheter väljer en överklassflicka att göra militärtjänst. Extremt kändistätt, någorlunda tätt duggande moralkakor, men mest av allt; långtråkigt. Hur bra Hawn än är, och hur mycket hon brukar lyfta filmer, så håller inte detta. Betyg: 2 (svag) av 5.</p>



<p class="wp-block-paragraph">Film 2 av 100: En prinsessas dagbok 2: Kungligt uppdrag (2004) av Garry Marshall med Anne Hathaway och Julie Andrews. Vi får följa en ung kvinnas resa från nybliven prinsessa i något slags fiktivt Monaco till drottning över detsamma. En feelgood-film som duger trots att den är intellektuellt bankrutt. Betyg: 3 av 5.</p>



<p class="wp-block-paragraph">Film 3 av 100: Konferensen (2023) av Patrik Eklund med Katia Winter och Adam Lundgren. Kul plagiering av Fredagen den 13:e, fast med en kommunkonferens i stället för ett ungdomsläger. Snyggt gjord, men alldeles för vidrig för min smak, vilket gör att den spänning som faktiskt finns där, hamnar i skymundan. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 4 av 100: Secret Window (2004) av David Koepp med Johnny Depp och John Turturro. En framgångsrik författare får en stalker på halsen. Denne bedriver till synes en långtgående utpressning med anklagelsen om att författaren stulit en berättelse av honom. Snyggt genomförd spänning som håller tittaren engagerad genom hela filmen. Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 5 av 100: Döden på Nilen (2022) av och med Kenneth Branagh. Återigen får vi följa med när Hercule Poirot löser den avancerade mordgåtan på Nilen. Trots att den är kortare än John Guillermins filmatisering, så får vi lite mera bakgrundsinformation om Poirot. Ändå är filmen ganska tråkig. Miljöerna är vackra, men man får en känsla av att mycket är inspelat i en studio. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 6 av 100: The ninth gate (1999) av Roman Polanski med Johnny Depp och Frank Langella. En bokhandlare får i uppdrag av en excentrisk miljardär att undersöka tre gamla böcker som visar sig ha totalt nio skillnader. Det är frustrerande att se hur illa karaktärerna hanterar gamla böcker. Istället för bomullsvantar så röks och dricks det! Om de övernaturliga inslagen vore mer sansade så skulle detta vara en fullträff, men nu blir det en svag fyra. Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 7 av 100: Hair (1979) av Milos Forman med Treat Williams och Beverly D&#8217;Angelo. Först blir man irriterad på alla hippies, men sen när Claude räddas från Vietnam-kriget av Berger, så börjar man förstå hur de tänker. Rätt bra musik, och mycket bra Rickenbacker-bas i musiken. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 8 av 100: Monty Pythons galna värld (1975) av Terry Gilliam och Terry Jones med Graham Chapman och John Cleese. En i det närmaste perfekt film, som möjligen dras ner av att den spelades in utan att manuset hade något slut, så helt plötsligt var det bara dags att stänga av. Resan dit är något utöver det vanliga: Ordvitsar, politik, satir, fyndiga situationer och oväntade vändningar! Ses bäst med goda vänner över öl. Betyg: 5/5.</p>



<p class="wp-block-paragraph">Film 9 av 100: Gremlins (1984) av Joe Dante med Zach Galligan och Phoebe Cates. En uppfinnare och tillika väskdängare köper ett mystiskt djur i present till sin son. En nästan utomjordisk stämning skapas under filmens första scener, och filmen lovar mycket. Det mesta är bra genomfört och Jerry Goldsmiths musik passar utmärkt, men som helhet blir det tråkigt. Man bör ändå ha sett den. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 10 av 100: Sagan om Karl-Bertil Jonssons julafton (2021) av Hannes Holm med Simon Larsson och Jonas Karlsson. En utspädd kopia av Tage Danielssons film, som introducerar en massa onödiga logiska hål i berättelsen, trots att det inte behövs. En total katastrof, kan inte rekommenderas till någon! Betyg: 1 (svag) av 5.</p>



<p class="wp-block-paragraph">Film 11 av 100: Det &#8216;perfekta&#8217; vapnet (1984) av Willard Huyck med Dudley Moore och Eddie Murphy. En misslyckad ingenjör får äran för en teknisk lösning, vilket drar in honom i ett nät av dubbelspel. Filmen är klart bättre än sitt rykte, men du behöver förmodligen vara beredd på sexism och rasism. Roligt påskägg när Kate Capshaw fördriver tiden genom att nynna på signaturmelodin från Indiana Jones. Betyg: 3 (stark) av 5.</p>



<p class="wp-block-paragraph">Film 12 av 100: Hereditary (2018) av Ari Aster med Gabriel Byrne och Toni Collette. Dottern i en välbärgad familj mister livet i en tragisk olycka. Familjen som redan innan plågades av en hel del problem, blir nu helt dysfunktionell. Frun i huset introducerar något som ska förändra saker till det bättre. Mycket bra, särskilt för att vara skräck, och stundtals riktigt otäck. Hade man inte försökt lite för hårt, särskilt mot slutet, hade detta varit en fullträff. Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 13 av 100: Siste actionhjälten (1993) av John McTiernan med Arnold Schwarzenegger och F. Murray Abraham. Actionfilmsversionen av Den oändliga historien där en man flyttar sig in och ut ur filmer. Stundtals riktigt bra specialeffekter, ibland riktigt dåliga. Rätt kul, men för alldeles för lång. Betyg: 2/5.</p>



<p class="wp-block-paragraph">Film 14 av 100: Twins (1988) av Ivan Reitman med Arnold Schwarzenegger och Danny DeVito. Två bröder separeras från födseln och får radikalt olika uppväxt, återförenas. De är varandras motsatser. En komedi som är inte är särskilt flabbig, utan mer kärleksfull. Riktigt trivsam att se, och man drar på mungiporna då och då. Rekommenderas! Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 15 av 100: Holmes &amp; Watson (2018) av Etan Cohen med Will Ferrell och John C. Reilly. Kul idé att ha en korkad Sherlock Holmes, men filmen hade behövt ett vettigt manus och ett par skämt. I princip 90 minuters längtan efter att eländet ska ta slut, och när det väl sker lämnar den inget kvarvarande intryck. Betyg: 1 (för att det är lägst på skalan, inte för att den förtjänar det) av 5.</p>



<p class="wp-block-paragraph">Film 16 av 100: BlackBerry (2023) av Matt Johnson med Jay Baruchel och Glenn Howerton. En snabbsummering av mobiltelefonen BlackBerrys uppgång och fall. Filmen får sin energi av att man har en drös av karaktärer med olika motivation, som man låter interagera fritt. Till en början gillar man Jim, och hoppas att han lyckas få fart på affärerna, men ganska snart handlar även filmen om hans oförmåga att hantera framgång. Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 17 av 100: Atlantis, den försvunna staden (1988) av Albert Pyun med Kathy Ireland och William R. Moses. En töntig flicka med pipig röst reser till Afrika för att leta efter sin far, och ramlar ner till jordens medelpunkt, där Atlantis ligger. Glasögonen gick sönder, så där nere blev hon snygg. Kul idé, men bedrövligt dåligt genomfört. Musiken gav dock en viss behållning. Betyg: 1/5.</p>



<p class="wp-block-paragraph">Film 18 av 100: SuperNature (2022) av och med Ricky Gervais. En live-inspelning av en stand up-show. Han kämpar hårt för att framstå som en intellektuell fiende till woke-ideologin, men stryker sina fiender medhårs alldeles för mycket. Kort och gott, en alldeles för feg stand up-show för att intressera mig. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 19 av 100: Once upon a time in Hollywood (2019) av Quentin Tarantino med Leonardo DiCaprio och Brad Pitt. En hypotetisk berättelse om hur det kunde ha slutat om Charles Manson blev stoppad i tid. Kränkande bra! Betyg: 5/5.</p>



<p class="wp-block-paragraph">Film 20 av 100: Häftigt drag i plugget (1982) av Amy Heckerling med Sean Penn och Jennifer Jason Leigh. Ganska bra, trots att filmen egentligen inte har någon handling. Ungdomar gör det ungdomar gör: Sex, drugs and rock&#8217;n&#8217;roll. Trevlig för stunden, men lämnar inget avtryck. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 21 av 100: Armageddon (2023) av och med Ricky Gervais. En live-inspelning av en stand up-show. Han börjar med att berömma sig själv för att hans förra stand up-show, SuperNature, var anti-woke. Å ena sidan lyckas han bättre med att distansera sig mot wokismen i denna föreställning, men skämten mellan hans berättande är färre. Några få gapflabb lyckades han dock med. Snäppet bättre än SuperNature, men inte en fyra. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 22 av 100: Jurassic Park III (2001) av Joe Johnston med Sam Neill och William H. Macy. Pojke försvinner under en äventyrsresa, hans föräldrar lurar en dinosaurie-expert att följa med på en räddningsexpedition. Den enda riktigt bra uppföljaren till Jurassic Park (1993), men av helt andra skäl. Detta är en orealistisk popcorn-matiné, men en utmärkt bra sådan! Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 23 av 100: War Horse (2011) av Steven Spielberg med Jeremy Irvine och Peter Mullan. Pojke uppfostrar en häst, och får mot alla odds tillbaka honom efter Första världskriget. Vi får följa med när Spielberg gör sin grej till den milda grad att berättelsen hamnar i skym undan för känslorna som ska levereras. Jag ogillar att jag gillar den. Betyg: 4 (svag) av 5.</p>



<p class="wp-block-paragraph">Film 24 av 100: Bohemian Rhapsody av Bryan Singer med Rami Malek och Lucy Boynton. En tillrättalagd filmatisering av Lesley-Ann Jones biografi om Freddie Mercury, som tyvärr inte är särskilt trogen boken. Filmen tar upp alla viktiga händelser under bandets karriär, men knyter ihop dem helt annorlunda. Den lyckas skapa ett engagemang kring en av rockhistoriens stora hjältar. Betyg: 5/5.</p>



<p class="wp-block-paragraph">Film 25 av 100: Witchboard 2: Djävulens röst (1993) av Kevin Tenney med Ami Dolenz och Christopher Michael Moore. En ung och vacker kvinna får andlig kontakt med en mördad tidigare hyresgäst, men det visar sig att personen hon tror sig prata med aldrig har funnits, och att det är någon annan hon har kontakt med. Riktigt bra popcorn-film! Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 26 av 100: Game night (2018) av John Francis Daley och Jonathan Goldstein med Jason Bateman och Rachel McAdams. Ytterligare en kul idé på ett rollspel, där vi egentligen inte vet vad som är på riktigt eller en del av spelet. Uppbyggnaden liknar den betydligt bättre Wild things från 1998. Lite väl krystade vändningar. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 27 av 100: What is a woman (2022) av Justin Folk med Matt Walsh. En dokumentärfilm som exponerar en dissonans mellan naturvetenskapen och humaniora i frågan om hur man avgör vem som är eller inte är en kvinna. Blev nyfiken på filmen efter att två journalister från Kalla Fakta (Carolina Jemsby och Karin Mattisson) nyligen skrivit en bok på ämnet. Är man intresserad av vetenskap, är denna film en intressant inblick i dagens amerikanska universitetsvärld, men den bjuder inte på mer än lite skrap på ytan. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 28 av 100: Amazonia (1985) av Mario Gariazzo med Elvire Audray och Will Gonzales. Västerländsk kvinna får blir kidnappad och får sina föräldrar dödade i Amazonas. Hon assimileras i stammen som kidnappade henne, men drivs av hämnd. Kul att ha sett, men inte särskilt bra. Betyg: 2/5.</p>



<p class="wp-block-paragraph">Film 29 av 100: No place to hide (1992) av Richard Danus med Kris Kristofferson och Drew Barrymore. En hårdnackad snut skyddar ett mordoffers lillasyster, och en oväntad vänskap uppstår. Inte världens bästa story eller regi, men en perfekt kvällsunderhållning att fördriva tiden med. Betyg: 4 (svag) av 5.</p>



<p class="wp-block-paragraph">Film 30 av 100: Elvis (2022) av Baz Luhrmann med Austin Butler och Tom Hanks. En intressant biografi över rockstjärnan Elvis Presleys uppgång och fall med fokus på Elvis manager, spelad av Hanks. Hanks är bra, men jag tyckte inte han passade för rollen. Sevärd, men borde ha klippts ner. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 31 av 100: Blood diamond (2006) av Edward Zwick med Leonardo DiCaprio och Djimon Hounsou. Olika intressen försöker komma över en eftertraktad ädelsten. Trots att filmen är lång, höll den mig fängslad rakt igenom, och det är jag inte bortskämd med! Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 32 av 100: Midsommar (2019) av Ari Aster med Florence Pugh och Jack Reynor. Några kompisar följer med sin svenske vän till Sverige för att studera midsommarfirandet. Filmen är i princip Dödlig skörd (1973) fast dålig, och i Sverige. Rakt igenom skit. Betyg: 1/5.</p>



<p class="wp-block-paragraph">Film 33 av 100: Reine &amp; Mimmi i fjällen! (1997) av Magnus Skogsberg med Bertram Heribertson och Ing-Marie Carlsson. En svindlande resa där vi får följa Mimmis jakt på lyx och flärd, Reines engagemang för att leva upp till detta, och mitt i alltihop blir de indragna i en intrig med ryska dansbandsskurkar. Inte bra, men bättre än Midsommar (2019). Betyg: 1/5.</p>



<p class="wp-block-paragraph">Film 34 av 100: Speed Zone (1989) av Jim Drake med John Candy och Donna Dixon. Vi får följa med på en biltävling på allmänna vägar. Förutsägbart och ganska händelsefattigt, men en och annan häftig bilscen. Blev sugen att se den med tanke på den prominenta rollistan, men det var inget vidare. Betyg: 2 (svag) av 5.</p>



<p class="wp-block-paragraph">Film 35 av 100: En brud för mycket (1981) av Steve Gordon med Dudley Moore och Liza Minnelli. Ett överutnyttjande av att Moore är duktig på att spela full, vilket skohornas in i tid och otid. I filmen måste han välja mellan sin äkta kärlek och sin familjs förmögenhet, och efter mycket överspelande och en massa krystad humor, valde han kärleken. Stod ut för att jag tänkte tillbaka på sanna mästerverk som &#8220;Tjejen som visste för mycket&#8221; och &#8221; Blåst på konfekten&#8221;. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 36 av 100: En brud för mycket II (a.k.a. Arthur – Skakad, inte rörd!) (1988) av Bud Yorkin med Dudley Moore och Liza Minnelli. En direkt fortsättning på filmen &#8220;En brud förmycket&#8221; (1981), men denna gång står mycket mer på spel, och nu är berättelsen både mer fullmatad och sämre. Moores karaktär är helt bedrövligt dåligt porträtterad, men på något vis lyckades denna skitfilm få mig att vilja fullfölja resan. För att se hur de trasslar ut eländet. Betyg: 2 (svag) av 5.</p>



<p class="wp-block-paragraph">Film 37 av 100: Talk to me (2022) av Danny Philippou och Michael Philippou med Ari McCarthy och Hamish Phillips. Ungdomar använder en balsamerad hand för att prata med spöken. En s.k. 90-sekundersregel bryts direkt, första gången ritualen visas i bild, och under filmen får vi se konsekvenserna byggas upp och spelas ut. Spännande, men inte otäck, dock inget som engagerade mig. Personligen ogillar jag skräckfilmer som utspelar sig i smartphone-eran, men här lyckades man ganska bra med den biten. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 38 av 100: Råttatouille (2007) av Brad Bird och Jan Pinkava med Patton Oswalt och Lou Romano. Kökspojke lagar mat med hjälp av en oväntad vän – en råtta han räddat underlåtit sig att avliva. Helt briljant, och bedömd som barnfilm är det solklart full pott. Betyg: 5/5.</p>



<p class="wp-block-paragraph">Film 39 av 100: Unga Astrid (2018) av Pernille Fischer Christensen med Alba August och Maria Bonnevie. En inblick i Astrid Lindgrens brokiga uppväxt, kantrad av både skicklighet och oförmåga att fatta goda beslut för framtiden. Förvånansvärt bra för att komma från Nordisk Filmproduktion, så även om berättelsen är bättre än genomförandet, är detta klart sevärt. Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 40 av 100: Jättehajen &#8211; Vindsurfarnas skräck (1981) av Enzo G. Castellari med James Franciscus och Vic Morrow. Som &#8220;Hajen&#8221; från 1975. Ungefär samma handling, samma fantastiska regigrepp. Problemet är att vi har sett det förr, och inte minst att Castellari är betydligt sämre regissör än vad Steven Spielberg är. För den som vill ha mer av samma är detta ett bra val, men det är egentligen rätt dåligt. Betyg: 2/5.</p>



<p class="wp-block-paragraph">Film 41 av 100: Järnladyn (2011) av Phyllida Lloyd med Meryl Streep och Jim Broadbent. Vi får följa Margret Thatcher på en resa med en ganska udda berättarstil och genom Thatchers eget perspektiv, inifrån. Som ung uppfattade jag henne som en skrämmande person, men idag kan jag, bl.a. tack vare denna film, uppskatta ett av de mest briljanta huvuden inom brittisk politik. Men är filmen bra? Sådär. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 42 av 100: Wonka (2023) av Paul King med Timothée Chalamet och Olivia Colman. En ung magiker försöker etablera en chokladaffär men hindras av bl.a. en korrupt hotelldirektör, en befintlig chokladkartell samt en oompa loompa som hävdar att han står i skuld. Filmen är trams och Chalamet sjunger monotont och dött, men Hugh Grant är lite smårolig. Betyd: 1/5.</p>



<p class="wp-block-paragraph">Film 43 av 100: En mördares ansikte (1992) av Jud Kinberg med Brian Dennehy och Michael Riley. Gacy är en respekterad man i sitt samhälle, det är något med honom som inte står rätt till. Filmen, som är baserad på verkliga händelser, är en riktig nagelbitare, inte minst för mig som inte var bekant med berättelsen innan jag såg filmen. Dennehy är briljant. Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 44 av 100: Hot Dog (1983) av Peter Markle med David Naughton och Patrick Houser. Filmen försöker skapa en story kring att man lyckats kontraktera en Playboy-modell att vara med. Resultatet blev något slarvigt om någon skidtävling. Mycket underhållning, till viss del ofrivillig humor, men det är naturligtvis inte stor konst. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 45 av 100: The Mask (1994) av Chuck Russell med Jim Carrey och Peter Riegert (och en terrier). En man hittar en mask som gör honom till en superhjälte, men det kommer till ett pris. Mannen i fråga, Stanley Ipkiss, misstänks för ett bankrån, och därefter får hans fiender tillgång till hans krafter. Dåligt manus, intressant genomförande – briljant insats av Carrey. Estetiken för tankarna till &#8220;Vem satte dit Roger Rabbit&#8221;. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 46 av 100: Dirty dancing (1987) av Emile Ardolino med Jennifer Grey och Patrick Swayze. Överbeskyddad flicka möter världsvan pojke, och en oväntad kärlek uppstår. Det mesta i den här filmen är helt klanderfritt – casting, kamera, skådespeleri, musik, manus och koreografi. Regin är ett ytterst svagt kort, till den grad att den ibland bjuder på ofrivillig humor, men eftersom helheten är så pass bra, så låter jag det passera. Betyg: 5/5.</p>



<p class="wp-block-paragraph">Film 47 av 100: Showdown in Little Tokyo (1991) av Mark L. Lester med Dolph Lundgren och Brandon Lee. En kulturell japan (Lundgren) och en kulturell amerikan (Lee) ska stoppa en storskurk och skydda en kvinna. Helt briljant i sin enkelhet. Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 48 av 100: Stjärnornas krig (1977) av George Lucas med Mark Hamill och Harrison Ford. En ung man får reda på att han tillhör en sida i ett långvarigt krig, och hamnar i en brokig skara av vänner när han beger sig ut i rymden för att strida. Mediokra skådespelarinsatser och många brister i storyn vägs upp av en makalös berättarstil och fängslande miljöer och specialeffekter. Betyg: 5/5.</p>



<p class="wp-block-paragraph">Film 49 av 100: Det våras för världshistorien, del 1 (1981) av och med Mel Brooks. En samling sketcher från olika tidsåldrar spelas upp. De är så vansinnigt dåliga, att jag nästan tror att det är det som är själva skämtet. Men mot slutet bjuds vi på ett musikaliskt nummer under den spanska inkvisitionen som både är fyndigt och välgjort. Betyg: 2/5.</p>



<p class="wp-block-paragraph">Film 50 av 100: Hot Rod (2007) av Akiva Schaffer med Andy Samberg och Bill Hader. En ung man lever under föreställningen att han är en stuntman, och tänker använda sina färdigheter för att samla in pengar till sin hjärtsjuke styvfar. Barnsligt och fullt av dråpligheter. Jag skrattade högt flera gånger. Bra soundtrack! Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 51 av 100: Hur mår Bob? (1991) av Frank Oz med Bill Murray och Richard Dreyfuss. En psykoterapeut (Dreyfuss) tar sig an en patient (Murray) som lyckas ta knäcken på honom. Med tanke på de inblandade namnen hade jag förväntade mig mer, men den är ändå klart sevärd. Lite barnsligt, stundtals ganska roligt. Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 52 av 100: Cat people (1982) av Paul Schrader med Nastassja Kinski och Malcolm McDowell. En stillsam skräckfilm i form av en nyinspelning av Rovdjurskvinnan (1942) där ett syskonpar återförenas och systern blir bekant med familjens mörka natur. Snygg filmad och blir aldrig tråkig, trots att det inte heller blir särskilt otäckt eller spännande. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 53 av 100: 9 till 5 (1980) av Colin Higgins med Dolly Parton och Jane Fonda. Doralee noterar hur chefen behandlar kvinnor illa, och kläcker idén att hämnas. Saker och ting blir givetvis både komplicerat och dråpligt. Drog på mungiporna mest genom hela filmen. Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 54 av 100: Blommor av stål (1989) av Herbert Ross med Dolly Parton och Sally Field. Vi får följa ett gäng kvinnor i vardagen i södra USA. Till en början bygger filmen endast på deras personkemi och vänskapsrelationer, men helt plötsligt kommer olika typer av motgångar över sällskapet. Filmen är inte perfekt, och deras quickies är ibland lite väl mycket för mig, men det räcker definitivt till en stark fyra! Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 55 av 100: Min stora kärlek (2001) av Bobby Farrelly och Peter Farrelly med Jack Black och Gwyneth Paltrow. Hal är en grabbig och ytlig man som, efter en trollformel, ser sina medmänniskors inre skönhet i stället för deras yta, och blir kär i en tjock tjej. Givetvis lär han sig något. Inte särskilt bra, men en kul resa. Ångrar definitivt inte att jag såg den. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 56 av 100: Avgrunden (1989) av James Cameron med Ed Harris och Mary Elizabeth Mastrantonio. Oljearbetare får ett sidouppdrag att leta efter en försvunnen undervattensbåt, men stöter på något helt annat. En fantastisk resa, men faller på ett långt och smetigt slut. Likt Terminator 2 (1991) är datoranimationerna långt mycket bättre än något som produceras idag. Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 57 av 100: Mamma Mia! (2008) av Phyllida Lloyd med Amanda Seyfried och Meryl Streep. Flicka, som inte vet vem av tre män som är hennes far, ska gifta sig. Alla stolligheter varvas med dåliga ABBA-covers. Det försöker vara härligt och mysigt, men det är mest genant. Rekommenderas till dig som gillar Cats. Betyg: 1/5.</p>



<p class="wp-block-paragraph">Film 58 av 100: Blind date (1987) av Blake Edwards med Bruce Willis och Kim Basinger. Kvinna blir galen av alkohol och lyckas förstöra livet för affärsman under en date. Kul idé men alldeles för orealistiskt och överdrivet. Filmen håller inte, men Willis är cool och Basinger är naturligtvis alltid trevlig att titta på. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 59 av 100: Stockholm (2018) av Robert Budreau med Ethan Hawke och Noomi Rapace. Utspelar sig i Sverige under tidigt 1970-tal. Två rånare tar tre personer gisslan i en bank, och gisslan väljer att samarbeta med rånarna mot polisen. Spännande, rolig och fyndig! Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 60 av 100: Hellraiser (1987) av Clive Barker med Andrew Robinson och Clare Higgins. Ett par flyttar in i ett hus, och kvinnan upptäcker att sin avlidne svåger bor i väggarna uppe på vinden. Det visar sig att han plågas av demoner. Sansad och stabil berättarstil och en riktigt bra helhet. Betyg: 4 (stark) av 5.</p>



<p class="wp-block-paragraph">Film 61 av 100: The Frisco Kid (1979) av Robert Aldrich med Gene Wilder och Harrison Ford. En rabbi ska ta över en församling i San Fransisco, och filmen bjuder på resan dit. Wilder är en naiv rabbi, Ford är en skurk med ett gott hjärta. Kan ändå inte rekommendera filmen. Betyg: 2/5.</p>



<p class="wp-block-paragraph">Film 62 av 100: Pang i rutan (1987) av Joe Dante (med flera) med Arsenio Hall och Donald F. Muhich. Sketcher och kortare filmsegment som driver med dåliga science fiction-filmer från 1950-talet. Inte särskilt intellektuellt stimulerande, mycket torr humor. Inget jag skrattade åt, men det var väldigt trevligt att titta. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 63 av 100: Tjejen som föll överbord (1987) av Garry Marshall med Goldie Hawn och Kurt Russell. En överklasskvinna anlitar en snickare, men kan inte riktigt uppskatta jobbet han levererar. Han hämnas genom att exploatera henne i en svag situation. Budskapet är bra, filmen engagerar och kemin mellan Hawn och Russel är strålande. Rekommenderas! Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 64 av 100: Moonwalker (1988) av Jerry Kramer (med flera) med Michael Jackson och Joe Pesci. Vi får se en samling musikvideos av en popstjärna (vars briljans inledningsvis bedyras av självaste Ronald Reagan). Popstjärnan blir tvungen att ta till handling för att stoppa den ondskefulla droghandlaren Mr. Big. Rätt tuffa specialeffekter, men ganska tramsigt. Betyg: 2/5.</p>



<p class="wp-block-paragraph">Film 65 av 100: Road House (2024) av Doug Liman med Jake Gyllenhaal och Daniela Melchior. Nyinspelning av filmen med Patrick Swayze från 1989, men denna gång utspelar sig konflikten på Florida Keys och den handlar inte längre om maffian, utan om ett bygglov och skurkarnas konstruktionsplaner. Berättelsen är uppenbarligen ett hafsverk för att få till nyinspelningen, men det var rätt bra slagsmålsscener. Se originalet istället! Betyg: 2/5.</p>



<p class="wp-block-paragraph">Film 66 av 100: Grottbjörnens folk (1986) av Michael Chapman med Daryl Hannah och Pamela Reed. En fruktansvärt komprimerad version av Jean M. Auels första bok i Earth&#8217;s Children-serien, där vi får följa en cromagnon-flickas uppväxt i en neanderthalstam. Berättelsen är bra, men kommer definitivt inte till sin rätt. Får en känsla av att filmen är gjord för den som läst boken och vill se viktiga delar illustrerade. Betyg: 2/5.</p>



<p class="wp-block-paragraph">Film 67 av 100: The Handmaid&#8217;s Tale (1990) av Volker Schlöndorff med Natasha Richardson och Faye Dunaway. En dystopisk film ur ett sektperspektiv. Jag läste boken helt omedveten om att det fanns en film. Likt Grottbjörnens folk (1986) är filmen förmodligen någorlunda svårbegriplig för den som inte har förkunskapen, men det är ändå en rekommendation. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 68 av 100: Göta kanal eller Vem drog ur proppen? (1981) av Hans Iveberg med Janne Carlsson och Kim Anderzon. Två företag tävlar om ett kontrakt med en stor saudisk båtköpare, och vi förväntas heja på de mer anspråkslösa, som samtidigt jagas av kronofogden. Inte särskilt bra, men det är åtminstone ett bedårande barn av sin tid. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 69 av 100: Spy (2015) av Paul Feig med Melissa McCarthy och Raad Rawi. Administratör på säkerhetspolisen ber om att få göra ett skarpt uppdrag, som omedvetet saboteras av en f.d. agent. Man hatar sig själv för att det är ganska bra, för det är billiga poänger, stereotyper och anspelningar på snusk. Bra idé, bra skådespelare, regissören borde kölhalas för sin oförmåga att förverkliga sitt koncept. Trots allt, betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 70 av 100: Hajen (1975) av Steven Spielberg med Roy Scheider och Richard Dreyfuss. Turistort får problem med hajnärvaro, och sheriffen tvingas in i en balansgång mellan marknadens intressen och medborgarnas säkerhet. Nästan utomjordisk stämning i filmen, och förmodligen en av de bästa skräckfilmer som någonsin gjorts. Eller rent av en av de bästa filmer som någonsin gjorts. Betyg: 5/5.</p>



<p class="wp-block-paragraph">Film 71 av 100: Natural Born Killers (1994) av Oliver Stone med Woody Harrelson och Juliette Lewis. En modern variant av Bonnie and Clyde författad av bl.a. Quentin Tarantino. Varken Robert Downey Jr. eller Tommy Lee Jones passar in &#8211; den sistnämnde borde vara Dean Stockwell. Både Harrelson och Lewis är briljanta och helheten räcker nätt och jämnt till en femma. Betyg: 5/5.</p>



<p class="wp-block-paragraph">Film 72 av 100: Fletch är tillbaka (1989) av Michael Ritchie med Chevy Chase och Julianne Phillips. Fletch säger upp sig för att leva på ett arv, men hamnar på kollisionskurs med ett korrupt nätverk. Manuset är proppfullt med roliga situationer och filmen är kryddad med skickliga skådespelare som Hal Holbrook och R. Lee Ermey, men av någon anledning lyfter det inte riktigt till samma höjd som föregångaren från 1985. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 73 av 100: Överlagt mord (1995) av Marc Rocco med Kevin Bacon och Christian Slater. En man anklagas för mord, hamnar i isoleringscell och bryts ned. Advokat engagerar sig gärningsmannens upprättelse. Fängslande berättelse, hyfsat bra genomförande. Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 74 av 100: Ett sista race (2023) av Edward af Sillén med David Hellenius och Malin Åkerman. Ett skäl att delta i en biltävling uppstår, och tittaren får följa med. Betydligt bättre än du förväntar dig, men som vanligt när det gäller svensk familjefilm är det juvenilt, eller kanske rent av efterblivet. Inget hänger ihop. Räddas av snyggt kameraarbete. Betyg: 2/5.</p>



<p class="wp-block-paragraph">Film 75 av 100: Ta fast tjuven (1955) av Alfred Hitchcock med Cary Grant och Grace Kelly. En tidigare juveltjuv blir återigen misstänkt för brott, och måste bevisa sin oskuld. För det mesta rätt bra, men vissa monologer låter som föreläsningar, vilket tillfälligt saboterar filmmagin. Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 76 av 100: Svarte Orms julsaga (1988) av Richard Boden med Rowan Atkinson och Tony Robinson. En god och uppskattad samhällsmedborgare besöks av ett spöke, och bestämmer sig därefter för att bli ondskefull för att kunna njuta av livets goda. Skrattade gott! Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 77 av 100: När lammen tystnar (1991) av Jonathan Demme med Jodie Foster och Anthony Hopkins. Ung polis tar hjälp av en noga inspärrad läkare för att hitta en sadistisk seriemördare. Många små ledtrådar kastas mot tittaren och både Foster och Hopkins är briljanta, men Foster uppfattas som mer trovärdig. Betyg: 5/5.</p>



<p class="wp-block-paragraph">Film 78 av 100: Hårda bud (1986) av John Irvin med Arnold Schwarzenegger och Kathryn Harrold. Mark Kaminski fick sparken från FBI och jobbar som sheriff, till sin frus stora förtret. Han blir erbjuden sitt gamla jobb, mot att han spränger maffian i Chicago. Egentligen rätt dåligt genomförande, men man får ju de sedvanliga explosionerna. Och Arnie. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 79 av 100: Paint (2023) av Brit McAdams med Owen Wilson och Elisabeth Henry. En landskapsmålare förlorar sitt tv-program för en ny ung förmåga, och försöker hantera att han förlorat det som är viktigt för honom. Har läst mycket negativ kritik, men tyckte själv att det var en trevlig resa och en klart sevärd film. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 80 av 100: Ett herrans liv (1979) av Terry Jones med Graham Chapman och John Cleese. Den kristna profetians uppfyllelse är så viktig att anhängarna springer på varenda boll, och i denna film råkar det vara en fattig halvjudisk pojke vid namn Brian. Definitivt inte en perfekt film, men den bjuder på dråpligheter (t.ex. en stening) som gör att den nätt och jämnt lever upp till full pott. Filmen finansierades av gitarristen från The Beatles! Betyg: 5/5.</p>



<p class="wp-block-paragraph">Film 81 av 100: Voyage to the Prehistoric Planet (1965) av Curtis Harrington och Pavel Klushantsev med Basil Rathbone och Faith Domergue. Tre rymdskepp är på väg till Venus, varav ett förolyckas. Mycket brottningsmatcher med plastvarelser. Känns mer 30-tal än 60-tal. Betyg: 1/5.</p>



<p class="wp-block-paragraph">Film 82 av 100: I&#8217;m Telling You for the Last Time (1998) av Marty Callner med Jerry Seinfeld. En stå upp-show från Seinfelds storhetstid. Han klarar att göra tam och ofarlig humor, men ändå vara rolig. Betyg: 4 trygga millennialsäkra rum av 5.</p>



<p class="wp-block-paragraph">Film 83 av 100: Unfrosted (2024) av Jerry Seinfeld med Isaac Bae och Chris Rickett. I ett alternativt 1960-tal tävlar två frukostflingstillverkare, Kellogg&#8217;s och Post, om konsumenternas hjärtan. Högt tempo, många roliga detaljer och lagom många skratt. Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 84 av 100: Malibu Express (1985) av Andy Sidaris med Darby Hinton och Sybil Danning. Vi får följa privatdetektiven och tillika kvinnotjusaren Cody när han utreder en teknikläcka till Ryssland. Tyckte det var rätt trevlig lätt underhållning, men med tanke på alla närbilder på kvinnobröst, är det rimligt att tänka att den är gjord för mindre tv-apparater. Kände mig nästan lite kvävd. Betyg: 2 (svag) av 5.</p>



<p class="wp-block-paragraph">Film 85 av 100: The Room (2003) av och med Tommy Wiseau. En stilig och framgångsrik mans liv stjälps omkull på grund av ett själviskt fruntimmer. Påstås vara en svart komedi, men filmen är så pass dålig att man undrar om inte komedin är ofrivillig. Dåligt, men kul att se! Betyg: 2/5.</p>



<p class="wp-block-paragraph">Film 86 av 100: The Disaster Artist (2017) av James Franco med Dave Franco och Seth Rogen. En komisk dramatisering av hur filmen The Room blev till. Bjuder både på pikanta detaljer från inspelningen och tragikomiska illustrationer av Tommy Wiseaus arbetssätt. Riktigt bra, men helt klart bäst om du är påläst på The Room. Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 87 av 100: Sausage Party (2016) av Conrad Vernon och Greg Tiernan. Vi får följa några vardagen för halvfabrikatsmat i en berättelse som både är full av snusk och övervåld. Filmen är egentligen rätt kass, och om du skrattar är du en lika dålig människa som jag är. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 88 av 100: Drömkåken (1993) av Peter Dalle med Björn Skifs och Suzanne Reuter. Man köper hus och får motgångar både på det hustekniska planet och med familjen som följd. Produktionen kan knappast ha trott på idén själva, för de kände sig manade att slänga in en helt onödig parallell berättelse om terrorister. Några roliga scener och repliker, men det är allt. Betyg: 2/5.</p>



<p class="wp-block-paragraph">Film 89 av 100: The Girl Most Likely to… (1973) av Lee Philips med Stockard Channing och Edward Asner. En ful flicka blir frånstött, råkar ut för en olycka, får plastikkirurgi, blir snygg, och hämnas på alla som varit elaka mot henne. Det stora problemet med storyn är att en så pass intelligent och sympatisk flicka rimligtvis ha varit beundrad redan innan hon var snygg. Hämnscenerna fungerar inte, men resan dit är bra. Betyg: 3 (stark) av 5 – en rekommendation.</p>



<p class="wp-block-paragraph">Film 90 av 100: Sting (2024) av Kiah Roache-Turner med Jermaine Fowler och Ryan Corr. Det enda bra med filmen var introduktionen med den gamle damen som ringde hantverkare. Väl igång, annonserade den att den skulle vara ungefär som Little shop of horrors, fast med spindlar i stället för blommor, men det blev mest skit. Platt berättarstil, räddas av hyfsade skådespelarinsatser. Betyg: 2/5.</p>



<p class="wp-block-paragraph">Film 91 av 100: Ett päron till farsa på semester i Europa (1986) av Amy Heckerling med Chevy Chase och Beverly D&#8217;Angelo. En amerikansk familj vinner en Europa-semester på tveksamma grunder. Den humor som fungerar är när familjens överhuvud, Clark Griswold, försöker passa in i en omvärld han inte förstår. Den humor som inte fungerar är alla gimmickar som skohornats in i filmen, möjligtvis undantaget Ballard Berkeley från &#8220;Pang i bygget&#8221; som var riktigt bra. Eric Idle tillför inget. Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 92 av 100: Octopussy (1983) av John Glen med Roger Moore och Maud Adams. En av de bättre Bond-filmerna med Moore och hans näst sista insats som agent 007. Fantasifull, actionpackad, men på tok för lång. Snäppet sämre än hans sista, Levande måltavla (1985). Bond lyckas stoppa en attack mot en NATO-bas. Sevärd, men medioker. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 93 av 100: Snuten i Hollywood (1984) av Martin Brest med Eddie Murphy och Lisa Eilbacher. En polis från Detroit dras in i en kriminell härva i Beverly Hills, och hans arbetssätt skapar en viss kulturkrock. Engagerande från början till slut, en solklar fullträff! Betyg: 5/5.</p>



<p class="wp-block-paragraph">Film 94 av 100: Snuten i Hollywood II (1987) av Tony Scott med Eddie Murphy och Brigitte Nielsen. Polis från Detroit finner personliga skäl att hjälpa Beverly Hills-polisen att knäcka en rånliga. Aningen svagare film än sin föregångare, men den bjuder på en riktigt bra resa! Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 95 av 100: Snuten i Hollywood III (1994) av John Landis med Eddie Murphy och Theresa Randle. Igen finner en polis från Detroit personliga skäl att hjälpa Beverly Hills-polisen efter att hans chef blivit mördad och spåren leder dit. Bra och actionpackad öppning, men är i övrigt lite småkrystad. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 96 av 100: Snuten i Hollywood: Axel F (2024) av Mark Molloy med Eddie Murphy och Taylour Paige. Axel Foley finner ytterligare ett skäl att besöka Beverly Hills. Denna gång handlar det om hans dotter. Filmen bjuder på många möten från tidigare filmer, men fick mig inte att dra på mungipan särskilt många gånger. Mycket action men tröttsam berättarstil. Hyfsat bra skådespeleri, svagt manus, obegripligt dålig regi. Betyg: 2/5.</p>



<p class="wp-block-paragraph">Film 97 av 100: Jurassic Triangle (2024) av Victor De Almeida med Chrissie Wunna och Danielle Scott. En grupp människor kraschlandar på en öde ö, som ständigt besöks av demonliknande monster och dinosaurier från en annan dimension. En efter en faller de offer för dessa monster. Ingen som är inblandad i denna filmproduktion verkar bry sig nämnvärt. Betyg: 1/5.</p>



<p class="wp-block-paragraph">Film 98 av 100: Katten Gustaf &#8211; Filmen (2024) av Mark Dindal med Chris Pratt och Samuel L. Jackson. Vi får se hur Jon och katten Gustaf lär känna varandra, vi får följa med ut på ett äventyr med diverse karaktärer, bl.a. Gustafs far. Som alltid när det gäller Hollywood, lyfter filmen rollfiguren ut från den miljö vi är van att se honom. Ganska snabbt inser jag att filmen inte vänder sig till hela familjen, utan anstränger sig hårt för att tillgodose små barn, men jag kan inte tänka mig att den gör det särskilt bra heller. Betyg: 2 (svag) av 5.</p>



<p class="wp-block-paragraph">Film 99 av 100: Cat&#8217;s eye (1985) av Lewis Teague med James Woods och Drew Barrymore. Tre från varandra oberoende berättelser knyts ihop av en gemensam nämnare. En man försöker sluta röka, en annan råkar ut för utpressning, och en flicka hemsöks av ett troll som bor i väggen i hennes rum. Bra skådespelarinsatser, bra berättelse (Stephen King!) och riktigt spännande! Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 100 av 100: Gift med maffian av Jonathan Demme med Michelle Pfeiffer och Alec Baldwin. Kvinna försöker fly undan maffian och slår sig efter mycket om och men ihop med en FBI-agent. Rollfigurerna är roliga, men filmen lyfter aldrig riktigt. Det är en del starka namn inblandad i produktionen, bl.a. dyker Meat Loafs parhäst Ellen Foley upp i en roll, och musiken är skriven av ingen mindre än David Byrne. Betyg: 3 (svag) av 5.</p>



<p class="wp-block-paragraph"><strong>Se även:</strong> <em><a href="https://www.winsoft.se/2023/10/100-filmer/">100 filmer</a> (2023-10-08)</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2024/07/100-filmer-till/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>JobRunner 1.7</title>
		<link>https://www.winsoft.se/2024/07/jobrunner-1-7/</link>
					<comments>https://www.winsoft.se/2024/07/jobrunner-1-7/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Mon, 01 Jul 2024 20:01:28 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17591</guid>

					<description><![CDATA[JobRunner is a Windows program that executes tasks sequentially. Typically it is used for client rendered web sites. Version 1.7 of JobRunner lets you set retry count for individual jobs. Future updates can be found here. Download installation program here (right click, save as&#8230;). Source code is available on Github.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">JobRunner is a Windows program that executes tasks sequentially. Typically it is used for client rendered web sites. Version 1.7 of JobRunner lets you set retry count for individual jobs. Future updates can be found <a href="https://www.winsoft.se/category/general/programs/">here</a>. Download installation <a href="https://winsoft.se/files/JobRunner.exe">program here (right click, save as&#8230;)</a>. Source code is <a href="https://github.com/Anders-H/JobRunner" target="_blank" rel="noreferrer noopener">available on Github</a>.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="645" height="221" src="https://www.winsoft.se/wp-content/uploads/image.png" alt="" class="wp-image-17593" srcset="https://www.winsoft.se/wp-content/uploads/image.png 645w, https://www.winsoft.se/wp-content/uploads/image-300x103.png 300w, https://www.winsoft.se/wp-content/uploads/image-150x51.png 150w" sizes="auto, (max-width: 645px) 100vw, 645px" /></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2024/07/jobrunner-1-7/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Nedtrappningen under sommaren</title>
		<link>https://www.winsoft.se/2024/06/nedtrappningen-under-sommaren/</link>
					<comments>https://www.winsoft.se/2024/06/nedtrappningen-under-sommaren/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Wed, 26 Jun 2024 15:55:06 +0000</pubDate>
				<category><![CDATA[Personal]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17589</guid>

					<description><![CDATA[Jag har varit lite frånvarande under en period, men det är inget värre än att jag bara har svårt att få tiden att räcka till med allt som pågår. Medan jag jobbar är jag alltid närvarande på Twitter/X, och då och då skickar jag upp en lite kortare video på YouTube. Jag poddar fortfarande med [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Jag har varit lite frånvarande under en period, men det är inget värre än att jag bara har svårt att få tiden att räcka till med allt som pågår. Medan jag jobbar är jag alltid närvarande på <a href="https://x.com/ahesselbom" target="_blank" rel="noreferrer noopener">Twitter/X</a>, och då och då skickar jag upp en lite kortare video på <a href="https://www.youtube.com/@AHesselbom/videos" target="_blank" rel="noreferrer noopener">YouTube</a>. Jag poddar fortfarande med Henrik Andersson. <a href="https://inte_en_singel.80tal.se/" target="_blank" rel="noreferrer noopener">Här hittar du vår musikpodcast</a> och <a href="https://www.youtube.com/@flimmerduo/videos" target="_blank" rel="noreferrer noopener">här hittar du våra filmrecensioner (som vi filmar)</a>. Jag kommer att fortsätta att vara lite frånvarande i ytterligare några veckor, men därefter kan ni räkna med nya inlägg här.</p>



<p class="wp-block-paragraph">Så länge, tänk gärna på <a href="https://x.com/figgehn" target="_blank" rel="noreferrer noopener">Figgehn</a>, <a href="https://x.com/BlagulaBilen/" target="_blank" rel="noreferrer noopener">Blågula bilen</a>, <a href="https://www.humanisthjalpen.se/" target="_blank" rel="noreferrer noopener">Humanisthjälpen</a> och <a href="https://blipirat.nu/" target="_blank" rel="noreferrer noopener">Piratpartiet</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2024/06/nedtrappningen-under-sommaren/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Microsoft Copilot vet vad ett rullande index är</title>
		<link>https://www.winsoft.se/2024/05/microsoft-copilot-vet-vad-ett-rullande-index-ar/</link>
					<comments>https://www.winsoft.se/2024/05/microsoft-copilot-vet-vad-ett-rullande-index-ar/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Fri, 24 May 2024 14:29:11 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17580</guid>

					<description><![CDATA[Jag behövde presentera data som skrivs uppifrån och ned i minnet i en lista sorterat efter ålder, där den äldsta kommer först. Men jag tänkte låta Microsoft Copilot jobbet. Här är replikskiftet: Jag: Jag skulle vilja ha hjälp med en kod i C#. Tänk dig en array innehållande 10 element numrerade 0 till 9. Tänk [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Jag behövde presentera data som skrivs uppifrån och ned i minnet i en lista sorterat efter ålder, där den äldsta kommer först. Men jag tänkte låta Microsoft Copilot jobbet. Här är replikskiftet:</p>



<p class="wp-block-paragraph"><strong>Jag:</strong> <em>Jag skulle vilja ha hjälp med en kod i C#. Tänk dig en array innehållande 10 element numrerade 0 till 9. Tänk dig även en pekare som pekar på ett av dessa element. Hänger du med?</em></p>



<p class="wp-block-paragraph"><strong>Copilot:</strong> <em>Absolut, jag hänger med! I C# kan vi inte direkt använda pekare som i C eller C++, men vi kan använda index för att referera till ett specifikt element i en array. Här är ett exempel på hur du kan skapa en array med 10 element och sedan referera till ett specifikt element:</em></p>



<pre class="wp-block-code"><code>int&#91;] array = new int&#91;10]; // Skapar en array med 10 element

for(int i = 0; i &lt; array.Length; i++)
    array&#91;i] = i; // Fyller arrayen med värden från 0 till 9

int index = 5; // "Pekare" till det sjätte elementet i arrayen (index 5)
Console.WriteLine("Elementet på position {0} är {1}", index, array&#91;index]); // Skriver ut värdet på det sjätte elementet</code></pre>



<p class="wp-block-paragraph"><em>I det här exemplet skapar vi en array och fyller den med värden från 0 till 9. Sedan definierar vi en variabel index som “pekare” till det sjätte elementet i arrayen (index 5). Slutligen skriver vi ut värdet på det sjätte elementet. Hoppas det hjälper!</em></p>



<p class="wp-block-paragraph"><strong>Jag:</strong> <em>Utmärkt. Men tänk dig nu att jag vill läsa ut ett element, relativt till indexet, så jag vill introducera en variabel till. Om någon vill läsa ut den första raden, så ska han tillhandahålla siffran 0, men den första raden är den raden som indexet pekar på. Om någon vill läsa ut den andra raden, ska han tillhandahålla siffran 1, men den andra raden är raden efter indexet, och så vidare.</em></p>



<p class="wp-block-paragraph"><strong>Copilot:</strong> <em>Jag förstår, du vill ha en slags “rullande” index, där indexet pekar på “första” raden, och sedan räknas alla andra rader relativt till det indexet. Här är ett exempel på hur du kan göra det i C#:</em></p>



<pre class="wp-block-code"><code>int&#91;] array = new int&#91;10]; // Skapar en array med 10 element

for(int i = 0; i &lt; array.Length; i++)
    array&#91;i] = i; // Fyller arrayen med värden från 0 till 9

int index = 5; // "Pekare" till det sjätte elementet i arrayen (index 5)
int relativeRow = 1; // Den relativa raden vi vill läsa ut
int actualIndex = (index + relativeRow) % array.Length; // Beräknar det faktiska indexet med hänsyn till arrayens längd
Console.WriteLine("Elementet på relativa rad {0} är {1}", relativeRow, array&#91;actualIndex]); // Skriver ut värdet på den relativa raden</code></pre>



<p class="wp-block-paragraph"><em>I det här exemplet använder vi modulusoperatorn (%) för att säkerställa att det faktiska indexet inte överstiger arrayens längd. Om det gör det, börjar det om från början av arrayen. Detta skapar en “rullande” effekt, där indexet alltid pekar på “första” raden, och alla andra rader räknas relativt till det indexet. Hoppas det hjälper!</em></p>



<p class="wp-block-paragraph">Notera att Copilot först antog att en pekare var just en minnespekare, och påstår felaktigt att sådana inte finns i C#. Men förstår därefter att jag menade elementpekare, och anpassar sitt språkbruk till detta, samt skriver en fungerande algoritm! Koden klippte jag ut och klistrade in i HUD-loggen i Altair 8800-emulatorn jag arbetar med.</p>



<pre class="wp-block-code"><code>public class Log
{
    public int StartPointer { get; set; }
    public string&#91;] LogRows { get; }

    public Log()
    {
        LogRows = new string&#91;10];
        StartPointer = 0;
    }

    public void Clear()
    {
        for (var i = 0; i &lt; LogRows.Length; i++)
            LogRows&#91;i] = "";

        StartPointer = 0;
    }

    public void Write(string text)
    {
        LogRows&#91;StartPointer] = text;
        StartPointer++;

        if (StartPointer >= LogRows.Length)
            StartPointer = 0;
    }

    public string GetStringNumber(int number)
    {
        var pointer = (StartPointer + number) % LogRows.Length;
        return LogRows&#91;pointer];
    }
}</code></pre>



<p class="wp-block-paragraph">Avslutningsvis har jag tagit för vana att även artigt tacka intelligenta entiteter, även om deras intelligens är en produkt av skapelse istället för evolution.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2024/05/microsoft-copilot-vet-vad-ett-rullande-index-ar/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Stort grattis på 75-årsdagen Rick Wakeman!</title>
		<link>https://www.winsoft.se/2024/05/stort-grattis-pa-75-arsdagen-rick-wakeman/</link>
					<comments>https://www.winsoft.se/2024/05/stort-grattis-pa-75-arsdagen-rick-wakeman/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sat, 18 May 2024 19:02:09 +0000</pubDate>
				<category><![CDATA[Pop culture]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17577</guid>

					<description><![CDATA[Rick Wakeman inledde sin karriär som studiomusiker, där det mest prominenta exemplet är Hunky Dory från 1971 (David Bowie), där han spelade piano på oförglömliga klassiker som Life on Mars. Än idag är han förmodligen mest känd som keyboardist i rockgruppen Yes, som fick sitt riktigt stora genombrott med Close to the edge från 1972. [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Rick Wakeman inledde sin karriär som studiomusiker, där det mest prominenta exemplet är <strong>Hunky Dory</strong> från 1971 (<strong>David Bowie</strong>), där han spelade piano på oförglömliga klassiker som <strong>Life on Mars</strong>.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="David Bowie – Life On Mars? (Official Video)" width="500" height="375" src="https://www.youtube.com/embed/AZKcl4-tcuo?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p class="wp-block-paragraph">Än idag är han förmodligen mest känd som keyboardist i rockgruppen Yes, som fick sitt riktigt stora genombrott med <strong>Close to the edge</strong> från 1972.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Close to the Edge (I. The Solid Time of Change, II. Total Mass Retain, III. I Get up I Get..." width="500" height="375" src="https://www.youtube.com/embed/gka_km9gb5c?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p class="wp-block-paragraph">Sedan dess har han bjudit på en hel del mer eller mindre intressanta soloskivor. För min del är kanske <strong>Journey to the center of the earth</strong> den som gjort stakast intryck.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Rick Wakeman-Journey To The Center Of The Earth" width="500" height="375" src="https://www.youtube.com/embed/8wFag3o10wg?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p class="wp-block-paragraph">1989 gjorde han en comeback tillsammans med några tidigare Yes-medlemmar på albumet <strong>Anderson Bruford Wakeman Howe</strong>, och 1991 gjorde Yes en återföeningsturné där Rick Wakeman bjöd på ett makalöst keyboard-solo.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Rick Wakeman&#039;s awesome piano solo" width="500" height="375" src="https://www.youtube.com/embed/05k8DgEXZXM?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p class="wp-block-paragraph">År 2016 blev Yes invalda i Rock &amp; Roll Hall of Fame, där han dels framförde <strong>Roundabout</strong> med Yes&#8230;</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Inductees Yes Perform &quot;Roundabout&quot; Rock &amp; Roll Hall of Fame 2017" width="500" height="281" src="https://www.youtube.com/embed/8_hAhzdk-h8?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p class="wp-block-paragraph">&#8230;och bjöd på ett ytterst olämpligt tacktal.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Rick Wakeman&#039;s Acceptance Speech at the 2017 Rock &amp; Roll Hall of Fame (Compleet)" width="500" height="281" src="https://www.youtube.com/embed/i34kuOqEXRc?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p class="wp-block-paragraph">Stort grattis på 75-årsdagen, Rick Wakeman!</p>



<p class="wp-block-paragraph">Är du ett fan, <a href="https://www.youtube.com/watch?v=6kbcqKkTmko" target="_blank" rel="noreferrer noopener">bör du se hela introduktionen</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2024/05/stort-grattis-pa-75-arsdagen-rick-wakeman/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Varför method groups i C#? Jag är osäker!</title>
		<link>https://www.winsoft.se/2024/05/varfor-method-groups-i-c-jag-ar-osaker/</link>
					<comments>https://www.winsoft.se/2024/05/varfor-method-groups-i-c-jag-ar-osaker/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Fri, 03 May 2024 20:26:39 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17572</guid>

					<description><![CDATA[Här är jag lite osäker på vad man försöker göra med C#. En metod är en funktion som tillhör ett objekt. Konceptet känns igen från både C++, Java och C#. En s.k. method group (från nu: metodgrupp) är en C#-term för något som refererar till en eller flera metoder som delar namn. Metodgrupper liknar ungefär [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Här är jag lite osäker på vad man försöker göra med C#. En <em>metod</em> är en funktion som tillhör ett objekt. Konceptet känns igen från både C++, Java och C#. En s.k. <em>method group</em> (från nu: <em>metodgrupp</em>) är en C#-term för något som refererar till en eller flera metoder som delar namn. Metodgrupper liknar ungefär delegater, och jag misstänker att detta mest är ett syntaxsocker som inte gör mer för programmeraren än att minska antalet tecken som behöver förvaltas för en programfeature. Detta exempel skriver ordet &#8220;Fantastico&#8221; på skärmen, och det görs genom att metodgruppen <strong>DoSomething</strong> tilldelas till delegaten <strong>g</strong>, för att sedan anropas.</p>



<pre class="wp-block-code"><code>var x = new MinTyp();
var g = x.DoSomething;
g();

public class MinTyp
{
    public void DoSomething(string value = "Fantastico") =>
        Console.WriteLine(value);
}</code></pre>



<p class="wp-block-paragraph">Till skillnad från en metod, som identifieras av sin signatur (namn och parametrar) så identifieras metodgruppen endast av sitt namn. Klassen <strong>MinTyp</strong> kan ha flera metoder som heter <strong>DoSomething</strong> (överlagringar). Exemplet ovan skulle inte kompilera om så vore fallet, eftersom kompilatorn inte skulle veta vilken <strong>DoSomething</strong> som åsyftas. Detta fungerar <em>inte</em>:</p>



<pre class="wp-block-code"><code>var x = new MinTyp();
var g = x.DoSomething;
g();

public class MinTyp
{
    public void DoSomething(string value = "Fantastico") =>
        Console.WriteLine(value);

    public void DoSomething() =>
        Console.WriteLine("Hello!");
}</code></pre>



<p class="wp-block-paragraph">Men om jag specificerar vilken datatyp variabeln <strong>g</strong> har, så vet kompilatorn vad som åsyftas. Om jag t.ex. säger att <strong>g</strong> är en <strong>Action&lt;string></strong> och tillgodoser det när jag anropar <strong>g</strong>, så accepteras koden. Detta ger svaret &#8220;God dag!&#8221;:</p>



<pre class="wp-block-code"><code>var x = new MinTyp();
Action&lt;string> g = x.DoSomething;
g("God dag!");

public class MinTyp
{
    public void DoSomething(string value = "Fantastico") =>
        Console.WriteLine(value);

    public void DoSomething() =>
        Console.WriteLine("Hello!");
}</code></pre>



<p class="wp-block-paragraph">Det går även bra att fylla delegaten med fler metodgrupper som passar i den datatyp som delegaten fastslagits till. Här kommer ett anrop på <strong>g</strong> leda till ett anrop på <strong>DoSomething</strong> (överlagringen utan argument) och <strong>WriteAJoke</strong>:</p>



<pre class="wp-block-code"><code>var x = new MinTyp();
Action g = x.DoSomething;
g += WriteAJoke;
g();

void WriteAJoke() =>
    Console.WriteLine("- What’s brown and sticky? - A stick.");

public class MinTyp
{
    public void DoSomething() =>
        Console.WriteLine("Hello!");
}

public class EnAnnanTyp
{
    public static void DoSomething() =>
        Console.WriteLine("En statisk funktion");
}</code></pre>



<p class="wp-block-paragraph">Och det är egentligen där användbarheten når vägs ände. Det är snyggt, men det tillför just inget. När metodgrupper används i <strong>[lista].ForEach</strong> så sparar man förvisso en del tecken, men det kommer fortfarande att kompileras till en instansering av delegaten och en funktionspekare till den funktion som kompilatorn har bundit anropet till. Om jag har missat något, så skulle jag uppskatta en kommentar!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2024/05/varfor-method-groups-i-c-jag-ar-osaker/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>&#8220;Inte en singel&#8221; om Violator (Depeche Mode)</title>
		<link>https://www.winsoft.se/2024/03/inte-en-singel-om-violator-depeche-mode/</link>
					<comments>https://www.winsoft.se/2024/03/inte-en-singel-om-violator-depeche-mode/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Tue, 19 Mar 2024 17:27:45 +0000</pubDate>
				<category><![CDATA[Pop culture]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17553</guid>

					<description><![CDATA[Just idag var det 34 år sedan Depeche Mode släppte albumet Violator. Och just idag diskuteras singelvalet på skivan i podcasten &#8220;Inte en singel&#8221; som finns att lyssna på här: https://inte_en_singel.80tal.se/]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Just idag var det 34 år sedan Depeche Mode släppte albumet Violator. Och just idag diskuteras singelvalet på skivan i podcasten &#8220;Inte en singel&#8221; som finns att lyssna på här:</p>



<p class="wp-block-paragraph"><a rel="noreferrer noopener" href="https://inte_en_singel.80tal.se/" target="_blank">https://inte_en_singel.80tal.se/</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2024/03/inte-en-singel-om-violator-depeche-mode/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Resurser för Commodore 64-utveckling</title>
		<link>https://www.winsoft.se/2024/02/resurser-for-commodore-64-utveckling/</link>
					<comments>https://www.winsoft.se/2024/02/resurser-for-commodore-64-utveckling/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Thu, 15 Feb 2024 15:42:22 +0000</pubDate>
				<category><![CDATA[Commodore]]></category>
		<category><![CDATA[Retro]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17539</guid>

					<description><![CDATA[Om du som jag skriver program för Commodore 64 på fritiden, är denna sida ett register över de verktyg du behöver. Utvecklingsmiljöer CBM .prg Studio C64 Studio Programmeringsspråk Turbo Rascal KickC XC=BASIC 3 Vision BASIC Commodore DOS DirMaster Dokumentation BASIC (C64 Wiki) Assembler (C64 Wiki) All about yout C64 &#8211; online help Chip music for [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Om du som jag skriver program för Commodore 64 på fritiden, är denna sida ett register över de verktyg du behöver.</p>



<p class="wp-block-paragraph"><strong>Utvecklingsmiljöer</strong></p>



<p class="wp-block-paragraph"><a href="https://www.ajordison.co.uk/" target="_blank" rel="noreferrer noopener">CBM .prg Studio</a></p>



<p class="wp-block-paragraph"><a href="https://www.c64-wiki.com/wiki/C64_Studio" target="_blank" rel="noreferrer noopener">C64 Studio</a></p>



<p class="wp-block-paragraph"><strong>Programmeringsspråk</strong></p>



<p class="wp-block-paragraph"><a href="https://lemonspawn.com/turbo-rascal-syntax-error-expected-but-begin/">Turbo Rascal</a></p>



<p class="wp-block-paragraph"><a href="https://gitlab.com/camelot/kickc/-/releases" target="_blank" rel="noreferrer noopener">KickC</a></p>



<p class="wp-block-paragraph"><a href="https://xc-basic.net/doku.php?id=v3:start" target="_blank" rel="noreferrer noopener">XC=BASIC 3</a></p>



<p class="wp-block-paragraph"><a href="https://visionbasic.net/" target="_blank" rel="noreferrer noopener">Vision BASIC</a></p>



<p class="wp-block-paragraph"><strong>Commodore DOS</strong></p>



<p class="wp-block-paragraph"><a href="https://style64.org/dirmaster" data-type="URL" data-id="https://style64.org/dirmaster" target="_blank" rel="noreferrer noopener">DirMaster</a></p>



<p class="wp-block-paragraph"><strong>Dokumentation</strong></p>



<p class="wp-block-paragraph"><a href="https://www.c64-wiki.com/wiki/BASIC" target="_blank" rel="noreferrer noopener">BASIC (C64 Wiki)</a></p>



<p class="wp-block-paragraph"><a href="https://www.c64-wiki.com/wiki/Assembler" target="_blank" rel="noreferrer noopener">Assembler (C64 Wiki)</a></p>



<p class="wp-block-paragraph"><a href="http://unusedino.de/ec64/technical/aay/c64/" target="_blank" rel="noreferrer noopener">All about yout C64 &#8211; online help</a></p>



<p class="wp-block-paragraph"><a href="https://chipmusic.org/forums/topic/8104/c64-music-for-dummies-c64-tutorial/" target="_blank" rel="noreferrer noopener">Chip music for dummies</a></p>



<p class="wp-block-paragraph"><a href="https://sta.c64.org/cbm64mem.html" target="_blank" rel="noreferrer noopener">Commodore 64 memory map</a></p>



<p class="wp-block-paragraph"><a href="https://www.1000bit.it/support/manuali/commodore/c64/ML_for_the_C64_and_Other_Commodore_Computers.pdf" target="_blank" rel="noreferrer noopener">Machine language</a></p>



<p class="wp-block-paragraph"><a href="https://www.atarimax.com/jindroush.atari.org/aopc.html" target="_blank" rel="noreferrer noopener">6402 opcodes</a></p>



<p class="wp-block-paragraph"><a href="https://www.commodore.ca/manuals/c64_programmers_reference/c64-programmers_reference_guide-04-programming_sound.pdf" target="_blank" rel="noreferrer noopener">Programming sound and music on yout Commodore 64</a></p>



<p class="wp-block-paragraph"><a href="https://ar.c64.org/rrwiki/images/7/70/Final_Cartridge_III_english_Manual.pdf" target="_blank" rel="noreferrer noopener">Final Cartridge III manual</a></p>



<p class="wp-block-paragraph"><a href="https://www.commodore.ca/wp-content/uploads/2018/11/commodore_vic_1541_floppy_drive_users_manual.pdf" target="_blank" rel="noreferrer noopener">VIC-1541 manual</a></p>



<p class="wp-block-paragraph"><a href="https://www.1000bit.it/support/manuali/commodore/c64/Commodore_64_Data_Files_A_Basic_Tutorial.pdf" target="_blank" rel="noreferrer noopener">Commodore 64 Data Files</a></p>



<p class="wp-block-paragraph"><a rel="noreferrer noopener" href="http://fileformats.archiveteam.org/wiki/Commodore_BASIC_tokenized_file" target="_blank">Commodore BASIC tokenized file</a></p>



<p class="wp-block-paragraph"><strong>Editorer, musik</strong></p>



<p class="wp-block-paragraph"><a href="https://github.com/leafo/goattracker2/" target="_blank" rel="noreferrer noopener">GoatTracker 2</a></p>



<p class="wp-block-paragraph"><a href="https://blog.chordian.net/sf2/" target="_blank" rel="noreferrer noopener">SID Factory II</a></p>



<p class="wp-block-paragraph"><a href="https://martin-piper.itch.io/musicstudio" target="_blank" rel="noreferrer noopener">Music Studio</a></p>



<p class="wp-block-paragraph"><strong>Editorer, grafik</strong></p>



<p class="wp-block-paragraph"><a href="https://mcdraw.xyz/" target="_blank" rel="noreferrer noopener">mcDRAW</a></p>



<p class="wp-block-paragraph"><a href="https://petscii.krissz.hu/" target="_blank" rel="noreferrer noopener">PETSCII Editor</a></p>



<p class="wp-block-paragraph"><strong>Emulering</strong></p>



<p class="wp-block-paragraph"><a href="https://vice-emu.sourceforge.io/" target="_blank" rel="noreferrer noopener">VICE</a></p>



<p class="wp-block-paragraph"><strong>Övrigt</strong></p>



<p class="wp-block-paragraph"><a href="https://github.com/mcicolella/awesome-commodore-resources" target="_blank" rel="noreferrer noopener">Awesome Commodore Resources</a></p>



<p class="wp-block-paragraph"><a href="https://csdb.dk/" target="_blank" rel="noreferrer noopener">The C-64 Scene Database</a></p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Commodore 64 Training Tape" width="500" height="375" src="https://www.youtube.com/embed/chwQnTQyGY0?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p class="wp-block-paragraph">För min del har jag skrivit <a href="https://ahesselbom.se/pages/commodorebasic20.html">bok</a> om Commodore BASIC 2.0 second release, och jag håller på att arbeta med en <a href="https://github.com/Anders-H/Sprdef2" target="_blank" rel="noreferrer noopener">sprite editor</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2024/02/resurser-for-commodore-64-utveckling/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>En programmerare programmerar</title>
		<link>https://www.winsoft.se/2024/02/en-programmerare-programmerar/</link>
					<comments>https://www.winsoft.se/2024/02/en-programmerare-programmerar/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Fri, 09 Feb 2024 22:26:54 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17535</guid>

					<description><![CDATA[Jag är inte helt säker på att programmerare är ett framtidsyrke, för behovet dras allt jämt åt kring ett minskande behov av ytterligare ett whateverramverk för dagens systemutvecklare att använda. Som jag har uppfattat marknadens behov så kan det vara lönsamt för generalister att vara så generella som möjligt. En full stack-utvecklare bör vara så [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Jag är inte helt säker på att programmerare är ett framtidsyrke, för behovet dras allt jämt åt kring ett minskande behov av ytterligare ett whateverramverk för dagens systemutvecklare att använda. Som jag har uppfattat marknadens behov så kan det vara lönsamt för generalister att vara så generella som möjligt. En full stack-utvecklare bör vara så bred som möjligt, för att vara relevant. En specialist bör vara så smal som möjligt för att vara relevant. Jag kan tycka att en arbetsvecka är rejält utmattande, men faller gärna tillbaka till något som jag själv finner vara intellektuellt stimulerande, som t.ex. den Altair-emulator som jag och den mycket skärpte Tomas Håkansson har arbetat med i ett par år nu. Det lär dröja ytterligare ett par år innan version 1.0 finns på plats, men jag ser verkligen fram emot det.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://www.winsoft.se/wp-content/uploads/L1060319-1024x1024.jpg" alt="" class="wp-image-17536" srcset="https://www.winsoft.se/wp-content/uploads/L1060319-1024x1024.jpg 1024w, https://www.winsoft.se/wp-content/uploads/L1060319-300x300.jpg 300w, https://www.winsoft.se/wp-content/uploads/L1060319-150x150.jpg 150w, https://www.winsoft.se/wp-content/uploads/L1060319-768x768.jpg 768w, https://www.winsoft.se/wp-content/uploads/L1060319-1536x1536.jpg 1536w, https://www.winsoft.se/wp-content/uploads/L1060319.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2024/02/en-programmerare-programmerar/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Kapitlet om själva enheten Commodore 128 i min kommande bok</title>
		<link>https://www.winsoft.se/2024/02/kapitlet-om-sjalva-enheten-commodore-128-i-min-kommande-bok/</link>
					<comments>https://www.winsoft.se/2024/02/kapitlet-om-sjalva-enheten-commodore-128-i-min-kommande-bok/#comments</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Fri, 09 Feb 2024 21:47:17 +0000</pubDate>
				<category><![CDATA[Commodore]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17532</guid>

					<description><![CDATA[Första utkastet av andra kapitlet av min bok om Commodore 128 publiceras här för den som vill rätta eller kommentera. Maila mig, SMS:a mig eller skriv en kommentar här. Glöm inte att meddela om du vill ha ett erkännande i boken för din kommentar. Kapitlet syftar till att produktplacera datorn. För att bevara formatering, har [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Första utkastet av andra kapitlet av min bok om Commodore 128 publiceras här för den som vill rätta eller kommentera. Maila mig, SMS:a mig eller skriv en kommentar här. Glöm inte att meddela om du vill ha ett erkännande i boken för din kommentar. Kapitlet syftar till att produktplacera datorn.</p>



<p class="wp-block-paragraph">För att bevara formatering, har jag laddat upp kapitlet som PDF. Alla kontaktuppgifter (e-post, telefon, med mera) finns <a href="https://ahesselbom.se/om/">här</a>. Och kapitlet finns <a rel="noreferrer noopener" href="https://winsoft.se/files/kap2omc128.pdf" target="_blank">här</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2024/02/kapitlet-om-sjalva-enheten-commodore-128-i-min-kommande-bok/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Melodifestivalen 2024</title>
		<link>https://www.winsoft.se/2024/02/melodifestivalen-2024/</link>
					<comments>https://www.winsoft.se/2024/02/melodifestivalen-2024/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sat, 03 Feb 2024 16:31:51 +0000</pubDate>
				<category><![CDATA[Pop culture]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17530</guid>

					<description><![CDATA[Jag är av den bestämda uppfattningen att både musiklansering (Melodifestivalen) och filmproduktion (Svenska Filminstitutet) bör lämnas till civilsamhället och marknaden, men så länge civilsamhället och marknaden beskattas så hårt som idag, så kan inte civilsamhället Ikväll ska den svenska staten lansera ny musik, eller rent av nya artister, i Melodifestivalen. Som finansiär tänker jag såklart [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Jag är av den bestämda uppfattningen att både musiklansering (Melodifestivalen) och filmproduktion (Svenska Filminstitutet) bör lämnas till civilsamhället och marknaden, men så länge civilsamhället och marknaden beskattas så hårt som idag, så kan inte civilsamhället</p>



<p class="wp-block-paragraph">Ikväll ska den svenska staten lansera ny musik, eller rent av nya artister, i Melodifestivalen. Som finansiär tänker jag såklart att betrakta spektaklet, och jag uppmanar alla att göra detsamma &#8211; den som går till valurnan utan att ens veta var han lägger sina pengar, bör inte ha rösträtt!</p>



<p class="wp-block-paragraph">De flesta har naturligtvis högre ambitioner än den svenska renderingen av &#8220;public service&#8221;, men när det nu är som det är, har jag satsat en peng på att Elisa Lindström ska gå till final. Gör hon det, får jag en tusing rätt ned i fickan.</p>



<p class="wp-block-paragraph">Tack, staten!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2024/02/melodifestivalen-2024/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Kvällens nästanrymning</title>
		<link>https://www.winsoft.se/2024/01/kvallens-nastanrymning/</link>
					<comments>https://www.winsoft.se/2024/01/kvallens-nastanrymning/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Tue, 23 Jan 2024 21:33:12 +0000</pubDate>
				<category><![CDATA[Personal]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17526</guid>

					<description><![CDATA[Vi bor mellan två rullstensåsar. Till väster ligger åsen med vägen norrut mot Örebro, och till öster ligger åsen med stallet och hagen. Kvällen började med att ett fallet träd hade krossat staketet och att vi noterade att flocken som stod där, endast bestod av 4 hästar – det nya stoet saknades. Efter att ha [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Vi bor mellan två rullstensåsar. Till väster ligger åsen med vägen norrut mot Örebro, och till öster ligger åsen med stallet och hagen. Kvällen började med att ett fallet träd hade krossat staketet och att vi noterade att flocken som stod där, endast bestod av 4 hästar – det nya stoet saknades. Efter att ha lagat skadan och letat igenom skogen utanför, hittade vi den sista. Så hon verkar trivas sitt nya stall.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://www.winsoft.se/wp-content/uploads/420071170_10232308235866144_465355032001461192_n.jpg" alt="" class="wp-image-17527" srcset="https://www.winsoft.se/wp-content/uploads/420071170_10232308235866144_465355032001461192_n.jpg 1024w, https://www.winsoft.se/wp-content/uploads/420071170_10232308235866144_465355032001461192_n-300x300.jpg 300w, https://www.winsoft.se/wp-content/uploads/420071170_10232308235866144_465355032001461192_n-150x150.jpg 150w, https://www.winsoft.se/wp-content/uploads/420071170_10232308235866144_465355032001461192_n-768x768.jpg 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2024/01/kvallens-nastanrymning/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Häst #5 är installerad</title>
		<link>https://www.winsoft.se/2024/01/hast-5-ar-installerad/</link>
					<comments>https://www.winsoft.se/2024/01/hast-5-ar-installerad/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Fri, 19 Jan 2024 14:54:43 +0000</pubDate>
				<category><![CDATA[Personal]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17522</guid>

					<description><![CDATA[Nu har vi installerat den femte hästen, ett sto (svensk varmblod) vid namn Akasia. Så kvällen kommer att ägnas åt att etablera den nya rangordningen i flocken. Min dotter Lova tog bilden.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Nu har vi installerat den femte hästen, ett sto (svensk varmblod) vid namn Akasia. Så kvällen kommer att ägnas åt att etablera den nya rangordningen i flocken. Min dotter Lova tog bilden.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://www.winsoft.se/wp-content/uploads/420067431_10232286314038112_7425220911610883135_n-1024x1024.jpg" alt="" class="wp-image-17523" srcset="https://www.winsoft.se/wp-content/uploads/420067431_10232286314038112_7425220911610883135_n-1024x1024.jpg 1024w, https://www.winsoft.se/wp-content/uploads/420067431_10232286314038112_7425220911610883135_n-300x300.jpg 300w, https://www.winsoft.se/wp-content/uploads/420067431_10232286314038112_7425220911610883135_n-150x150.jpg 150w, https://www.winsoft.se/wp-content/uploads/420067431_10232286314038112_7425220911610883135_n-768x768.jpg 768w, https://www.winsoft.se/wp-content/uploads/420067431_10232286314038112_7425220911610883135_n.jpg 1440w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2024/01/hast-5-ar-installerad/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>JobRunner 1.6 is available</title>
		<link>https://www.winsoft.se/2023/12/jobrunner-1-6-is-available/</link>
					<comments>https://www.winsoft.se/2023/12/jobrunner-1-6-is-available/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sat, 16 Dec 2023 15:57:07 +0000</pubDate>
				<category><![CDATA[Programs]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17514</guid>

					<description><![CDATA[Version 1.6 of JobRunner is available. It allows an system administrator to disable individual jobs in a batch. Download installation program (Windows 10 or later): JobRunner.exe (Right click, Save link as&#8230;) Source code (C# 8, .NET Framework 4.8): https://github.com/Anders-H/JobRunner]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Version 1.6 of JobRunner is available. It allows an system administrator to disable individual jobs in a batch.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="802" height="482" src="https://www.winsoft.se/wp-content/uploads/screenshot.jpg" alt="" class="wp-image-17515" srcset="https://www.winsoft.se/wp-content/uploads/screenshot.jpg 802w, https://www.winsoft.se/wp-content/uploads/screenshot-300x180.jpg 300w, https://www.winsoft.se/wp-content/uploads/screenshot-150x90.jpg 150w, https://www.winsoft.se/wp-content/uploads/screenshot-768x462.jpg 768w" sizes="auto, (max-width: 802px) 100vw, 802px" /></figure>



<p class="wp-block-paragraph">Download installation program (Windows 10 or later): <a rel="noreferrer noopener" href="http://winsoft.se/files/JobRunner.exe" target="_blank">JobRunner.exe</a> (Right click, Save link as&#8230;)</p>



<p class="wp-block-paragraph">Source code (C# 8, .NET Framework 4.8): <a href="https://github.com/Anders-H/JobRunner" target="_blank" rel="noreferrer noopener">https://github.com/Anders-H/JobRunner</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2023/12/jobrunner-1-6-is-available/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>En ny terminalemulator för Windows Forms</title>
		<link>https://www.winsoft.se/2023/12/en-ny-terminalemulator-for-windows-forms/</link>
					<comments>https://www.winsoft.se/2023/12/en-ny-terminalemulator-for-windows-forms/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sat, 16 Dec 2023 10:23:42 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17511</guid>

					<description><![CDATA[Jag har utvecklat en GUI control för Windows Forms (.NET 8.0) som emulerar en textterminal från 1970-talet. Den stöder in- och utmatning av text samt enkel pixelbaserad grafik. Den har events som meddelar vad användaren gör, och funktioner för att ställa frågor till användaren. Denna kan användas som editor för radbaserade programmeringsspråk och som gränssnitt [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Jag har utvecklat en GUI control för Windows Forms (.NET 8.0) som emulerar en textterminal från 1970-talet. Den stöder in- och utmatning av text samt enkel pixelbaserad grafik. Den har events som meddelar vad användaren gör, och funktioner för att ställa frågor till användaren. Denna kan användas som editor för radbaserade programmeringsspråk och som gränssnitt för textbaserade applikationer (som t.ex. textäventyr).</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="574" height="370" src="https://www.winsoft.se/wp-content/uploads/screenshot_adventure_game_dummy.jpg" alt="" class="wp-image-17512" srcset="https://www.winsoft.se/wp-content/uploads/screenshot_adventure_game_dummy.jpg 574w, https://www.winsoft.se/wp-content/uploads/screenshot_adventure_game_dummy-300x193.jpg 300w, https://www.winsoft.se/wp-content/uploads/screenshot_adventure_game_dummy-150x97.jpg 150w" sizes="auto, (max-width: 574px) 100vw, 574px" /></figure>



<p class="wp-block-paragraph"><a rel="noreferrer noopener" href="https://github.com/Anders-H/TerminalPixelMatrixLibrary" target="_blank">Här finns källkoden och några exempel</a>, och <a href="https://www.nuget.org/packages/TerminalMatrix" target="_blank" rel="noreferrer noopener">här finns information om hur man installerar den och kommer igång</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2023/12/en-ny-terminalemulator-for-windows-forms/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Kapitlet om ljud i min kommande bok om Commodore 128</title>
		<link>https://www.winsoft.se/2023/11/kapitlet-om-ljud-i-min-kommande-bok-om-commodore-128/</link>
					<comments>https://www.winsoft.se/2023/11/kapitlet-om-ljud-i-min-kommande-bok-om-commodore-128/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Wed, 29 Nov 2023 19:51:28 +0000</pubDate>
				<category><![CDATA[Commodore]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17501</guid>

					<description><![CDATA[Första utkastet av sjunde kapitlet av min bok om Commodore 128 publiceras här för den som vill rätta eller kommentera. Maila mig, SMS:a mig eller skriv en kommentar här. Glöm inte att meddela om du vill ha ett erkännande i boken för din kommentar. Avgränsningen är enkla ljudeffekter, inte musik eller mer avancerade ljudeffekter, då [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Första utkastet av sjunde kapitlet av min bok om Commodore 128 publiceras här för den som vill rätta eller kommentera. Maila mig, SMS:a mig eller skriv en kommentar här. Glöm inte att meddela om du vill ha ett erkännande i boken för din kommentar. Avgränsningen är enkla ljudeffekter, inte musik eller mer avancerade ljudeffekter, då dessa har var sitt kapitel avsatt.</p>



<h1 class="wp-block-heading">Ljud</h1>



<p class="wp-block-paragraph">Commodore 128 har ungefär samma kapacitet till ljud som Commodore 64. I datorn finns en avancerad synthesizer innehållande tre röster och fyra vågformer. Vågformerna är triangel, sågtand, fyrkantsvåg och brus. Fyrkantsvågen har ställbar pulsbredd, vilket ger möjlighet till stora variationer.</p>



<p class="wp-block-paragraph">Till skillnad från Commodore 64, tillåter Commodore 128 att man använder BASIC-kommandon för att åt datorns ljudkapacitet. Kommandot SOUND&nbsp;ger dig möjlighet att spela ljud i någon av de tre kanalerna, i valfri frekvens under valfri tid. Kommandot har även stöd för att böja frekvensen<a href="#_ftn1" id="_ftnref1">[1]</a> på tonen ljudet som spelar.</p>



<p class="wp-block-paragraph">Tre argument är obligatoriska. Dessa är val av röst (1, 2 eller 3), val av frekvens (0 till 65535) och längd (angivet i sextiondels sekunder). Använd endast dessa tre argument, spelas en rak ton med i en fyrkantsvåg med en neutral inställning på pulsbredden. Följande spelar tonen A under en sekund:</p>



<p class="wp-block-paragraph"><code>SOUND 1,3800,60</code></p>



<p class="wp-block-paragraph">Du som kan musikteori kanske noterar att 3800 inte är jämt delbart med 220, och det beror på att frekvensangivelsen (det andra argumentet) ligger på en egen skala som inte stämmer med faktisk svängningshastighet.</p>



<p class="wp-block-paragraph">Argumenten identifieras av sin ordning. Samtliga argument är:</p>



<ol class="wp-block-list" type="1">
<li>Kanal (1, 2 eller 3)</li>



<li>Val av frekvens (0 till 65535)</li>



<li>Längd (antal sekunder genom 60)</li>



<li>Frekvensändring (0 = upp, 1 = ned, 2 = upp och ned)</li>



<li>Låg frekvens (vid frekvensändring, också 0 till 65535)</li>



<li>Hastighet vid frekvensändring (stegstorlek, också 0 till 65535)</li>



<li>Vågform (0 till 3, se sida 28 i detta kapitel)</li>



<li>Pulsbredd (0 till 4096, se sida 29 i detta kapitel)</li>
</ol>



<p class="wp-block-paragraph">Bara genom att läsa argumentlistan så förstår vi att kommandot SOUND är ganska kompetent. Men vi ser också att det saknas en hel del kapacitet innan vi kan säga att vi har en komplett synthesizer, inte minst ADSR<a href="#_ftn2" id="_ftnref2">[2]</a>-inställningar.</p>



<h2 class="wp-block-heading">Argumenten identifieras av sin ordning</h2>



<p class="wp-block-paragraph">Låt säga att jag vill spela samma ljud som tidigare, men jag vill ange vågformens pulsbredd. Igen, pulsbredd kommer att förklaras på sida 30, men för nu behöver du bara förhålla dig till att jag vill ange den. Att anropa SOUND med argument 1, 2, 3 (som tidigare) och 8 (pulsbredd), utan att ange något där emellan, innebär att jag anger fem kommatecken för att tala om att det är just det åttonde argumentet jag vill ange.</p>



<p class="wp-block-paragraph"><code>SOUND 1,3800,60,,,,2,50</code></p>



<p class="wp-block-paragraph">Du bör nu höra ett A, fast med en lite förändrad karaktär på ljudet.</p>



<h2 class="wp-block-heading">Frekvensändring</h2>



<p class="wp-block-paragraph">Oavsett om du vill böja en ton uppåt, nedåt eller oscillera (upp och ned), så måste du ange den högsta frekvensen som argument 2 och den lägsta frekvensen som argument 5.</p>



<p class="wp-block-paragraph">Om du vill gå upp en oktav från låga A till höga A, kan du skriva följande kommando:</p>



<p class="wp-block-paragraph"><code>SOUND 1,3800,60,0,1900,32</code></p>



<p class="wp-block-paragraph"><em>Kanal </em><em>1</em><em>, hög tonhöjd är </em><em>3800</em><em>, längd är en sekund, riktning är uppåt, låg tonhöjd är </em><em>1900</em><em>, frekvensändringens hastighet är </em><em>32</em><em>.</em></p>



<p class="wp-block-paragraph">Ett problem med att böja toner uppåt är att det andra argumentet faktiskt inte bara är den höga frekvensen, utan även startfrekvensen. Ljudet du hör från ovanstående kommando klättrar en oktav (från 1900), men avslöjar målfrekvensen (3800) under en mycket kort stund.</p>



<p class="wp-block-paragraph">Om vi ändrar riktning från 0 (upp) till 1 (ned) så spelas frekvensändringen helt felfritt, eftersom vi lämnar startfrekvensen till målfrekvensen som är argument 5.</p>



<p class="wp-block-paragraph"><code>SOUND 1,3800,60,1,1900,32</code></p>



<p class="wp-block-paragraph">Men när jobbet är slutfört, så återstartas det, vilket kan höras i slutet på ovanstående ljud. Det kan man vända till sin fördel, om man vill sätta ljud på t.ex. ett rymdskepp som upprepat skjuter med laser på en fiende:</p>



<p class="wp-block-paragraph"><code>SOUND 1,8000,60,1,3000,700</code></p>



<p class="wp-block-paragraph">Man kan riktigt se laserstrålarna färdas genom rymden!</p>



<p class="wp-block-paragraph">Nu har vi testat att böja en ton uppåt (riktning 0) och nedåt (riktning 1). Genom att välja att oscillera kan du skapa ljud som låter som larmtoner, som t.ex. detta:</p>



<p class="wp-block-paragraph"><code>SOUND 1,12000,360,2,9000,64</code></p>



<p class="wp-block-paragraph"><em>Kanal </em><em>1</em><em>, tonjöjd är </em><em>12000</em><em>, längden är sex sekunder, riktning är upp och ned, låg tonhöjd är </em><em>9000</em><em>, frekvensändringens hastighet är </em><em>64</em><em>.</em></p>



<h2 class="wp-block-heading">Vågformer</h2>



<p class="wp-block-paragraph"><a></a>Vågformen&nbsp;beskriver ljudets mest basala karaktär. Commodore 128 kan återge fyra olika vågformer. Dessa är:</p>



<ul class="wp-block-list">
<li>0: Triangel (mjuka ljud som xylofon eller flöjt)</li>



<li>1: Sågtand (en klang liknande dragspel eller gitarr)</li>



<li>2: Fyrkant med variabel pulsbredd (lite vassare ljud som trumpet eller piano)</li>



<li>3: Brus (ofta slagverk)</li>
</ul>



<p class="wp-block-paragraph">Dessa fyra vågformer utgör grunden för de olika musikinstrument som din dator kan återge. Detta program spelar upp två sekunder från varje ljud, där fyrkantsvågen återges i sitt grundutförande med en pulsbredd på 2048:</p>


<figure class="wp-block-table">
<table>
<tbody>
<tr>
<td style="text-align: left;"><code>10 FOR A=0 TO 3<br />20 SOUND 1,3800,120,,,,A<br />30 SLEEP 3<br />40 NEXT</code></td>
<td style="text-align: left;">Rad 10 räknar från 0 till 3, vilket innebär att rad 20 och 30 körs fyra gånger. Rad 20 spelar en ton i två sekunder som byggs upp av de fyra vågformer som din Commodore kan återge. Rad 30 pausar och rad 40 upprepar.</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph">När du kör programmet så kommer du att höra fyra vågformer, som spelas upp i turordning. Förutom dessa fyra vågformer, kan din Commodore 128 ändra ljudets karaktär rejält när vågform 2 (fyrkant) används, för fyrkantsvågen har variabel pulsbredd.</p>



<h2 class="wp-block-heading">Pulsbredd</h2>



<p class="wp-block-paragraph"><a></a>Pulsbredden&nbsp;anger förhållandet mellan impulsens höga och låga värde. Fyrkantens värde består i sitt ursprungsförhållande av lika lång hög som låg impuls, vilket skapar denna figur:</p>



<p class="wp-block-paragraph"><code>+------------------------------------------------+<br>|&nbsp;&nbsp;&nbsp; ----&nbsp;&nbsp;&nbsp; ----&nbsp;&nbsp;&nbsp; ----&nbsp;&nbsp;&nbsp; ----&nbsp;&nbsp;&nbsp; ----&nbsp;&nbsp;&nbsp; ----|<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br>|----&nbsp;&nbsp;&nbsp; ----&nbsp;&nbsp;&nbsp; ----&nbsp;&nbsp;&nbsp; ----&nbsp;&nbsp;&nbsp; ----&nbsp;&nbsp;&nbsp; ----&nbsp;&nbsp;&nbsp; |<br>+------------------------------------------------+</code></p>



<p class="wp-block-paragraph">Detta motsvara alltså den ursprungliga pulsbredden 2048. 0 är lägst och 4096 är högst. Du kan skriva in följande kommando för att höra den ursprungliga pulsbredden:</p>



<p class="wp-block-paragraph"><code>SOUND 1,3800,60,,,,2,2048</code></p>



<p class="wp-block-paragraph">Halverar du talet 2048 (alltså om du anger 1024) får du följande kurva:</p>



<p class="wp-block-paragraph"><code>+------------------------------------------------+<br>|&nbsp; ------&nbsp; ------&nbsp; ------&nbsp; ------&nbsp; ------&nbsp; ------|<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br>|--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;-- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;|<br>+------------------------------------------------+</code></p>



<p class="wp-block-paragraph">Testa genom att skriva:</p>



<p class="wp-block-paragraph"><code>SOUND 1,3800,60,,,,2,1024</code></p>



<p class="wp-block-paragraph">Ljudet är nästan identiskt med det ljud du hade fått av att istället addera hälften (1024) ursprungspulsbredden (2048):</p>



<p class="wp-block-paragraph"><code>SOUND 1,3800,60,,,,2,3072</code></p>



<p class="wp-block-paragraph">Det motsvarar följande vågform:</p>



<p class="wp-block-paragraph"><code>+------------------------------------------------+<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;-- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;-- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;--|<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br>|------&nbsp; ------&nbsp; ------&nbsp; ------&nbsp; ------&nbsp; ------&nbsp; |<br>+------------------------------------------------+</code></p>



<p class="wp-block-paragraph">Testa gärna att skriva program som varierar pulsbredden!</p>



<h2 class="wp-block-heading">Ljudstyrka</h2>



<p class="wp-block-paragraph">Kommandot VOL&nbsp;påverkar ljudstyrkan&nbsp;både för pågående ljud och efterföljande ljud. VOL accepterar ett argument som är ett tal mellan 0 och 15, där 0 betyder absolut tystnad och 15 betyder högsta möjliga ljud. Ett för högt eller för lågt värde ger felet <em>illegal quantity</em>. Följande program använder VOL för att oscillera ljudstyrkan:</p>


<figure class="wp-block-table">
<table>
<tbody>
<tr>
<td style="text-align: left;"><code>10 SOUND 1,12000,360,2,9000,64<br />20 FOR T=0 TO 8<br />30 FOR A=15 TO 0 STEP -1<br />40 VOL A 50 FOR P=0 TO 10:NEXT<br />60 NEXT A<br />70 FOR A=0 TO 15<br />80 VOL A<br />90 FOR P=0 TO 10:NEXT 100 NEXT A<br />110 NEXT T</code></td>
<td style="text-align: left;">Rad 10 startar ett larmljud.<br /><br />Rad 20 säger att volymoscillering ska ske 9 gånger (0 till 8).<br /><br />Rad 30-60 sänker volymen med en kort paus (rad 50).<br /><br />Rad 70-100 höjer volymen.<br />Rad 110 hoppar tillbaka till rad 30 så länge T är mindre än eller lika med 8.</td>
</tr>
</tbody>
</table>
</figure>


<p class="wp-block-paragraph"><br>Inför de kommande två kapitlen om musik och om avancerade ljudeffekter, så kan det vara bra att veta när datorn spelar ett ljud direkt, och när datorn väntar. Grundregeln är att datorn väntar med att spela upp ett ljud, tills det ljud som spelas ljust nu är färdigt, givet att det nya ljudet begärs i en kanal som redan spelar ett ljud. Det innebär följande:</p>



<p class="wp-block-paragraph">Kommandot SOUND sätter processorn i arbete utan att blockera BASIC-tolken, vilket vi tidigare sett i kapitlet om sprites. Skillnaden här är att om din dator satts i arbete att spela ett ljud i en sekund på en viss kanal, och stöter på ett kommando som ger datorn i uppdrag att spela en ny ton i samma kanal, så väntar BASIC-tolken på att pågående uppdrag ska vara utfört innan nästa uppdrag påbörjas. Vi kan studera detta genom att titta på följande program som spelar ett C dur-ackord i en kanal. Det kommer inte att fungera. Istället för att höra ett ackord, så hör vi en ton i taget spelas upp (C, E och G). Vi väljer full ljudstyrka.</p>



<p class="wp-block-paragraph"><code>10 VOL 15<br>20 SOUND 1,8900,120,,,,1<br>30 SOUND 1,11100,120,,,,1<br>40 SOUND 1,13500,120,,,,1</code></p>



<p class="wp-block-paragraph">Orsaken är att kanal 1 inte kan spela något annat än C innan den är färdig. Och när den är färdig, och börjar spela ett E, så kan den inte spela nästa ton innan den har spelat färdigt E. Lösningen är att spela varje ton i C dur-ackordet i var sin kanal, så här:</p>



<p class="wp-block-paragraph"><code>10 VOL 15<br>20 SOUND 1,8900,120,,,,1<br>30 SOUND 2,11100,120,,,,1<br>40 SOUND 3,13500,120,,,,1</code></p>



<p class="wp-block-paragraph">Om nya instruktioner att spela ljud inkommer, väntar din dator med att utföra dem tills ackordet är färdigt. Men det finns undantag, vilket vi tittar på i kapitlet om avancerade ljudeffekter.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"><a href="#_ftnref1" id="_ftn1">[1]</a> På engelska: <em>Pitch bend</em>.</p>



<p class="wp-block-paragraph"><a href="#_ftnref2" id="_ftn2">[2]</a> Attack, Decay, Sustain, Release – se kapitlet om ordförklaringar (appendix B).</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2023/11/kapitlet-om-ljud-i-min-kommande-bok-om-commodore-128/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>100 filmer</title>
		<link>https://www.winsoft.se/2023/10/100-filmer/</link>
					<comments>https://www.winsoft.se/2023/10/100-filmer/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sun, 08 Oct 2023 09:19:43 +0000</pubDate>
				<category><![CDATA[Pop culture]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17497</guid>

					<description><![CDATA[Jag antog utmaningen att titta på och kommentera etthundra filmer, och här är resultatet. Film 1 av 100: Spirited (2022) av Sean Anders med Will Ferrell och Ryan Reynolds. Började som en bedrövlig kopia på Scroodged men överraskade med att falla lite tillbaka på Dickens originalstory. Konceptet fungerade om man inte förväntar sig mer än [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Jag antog utmaningen att titta på och kommentera etthundra filmer, och här är resultatet.</p>



<p class="wp-block-paragraph">Film 1 av 100: Spirited (2022) av Sean Anders med Will Ferrell och Ryan Reynolds. Började som en bedrövlig kopia på Scroodged men överraskade med att falla lite tillbaka på Dickens originalstory. Konceptet fungerade om man inte förväntar sig mer än vad Sean Anders brukar leverera. Betyg: 2/5.</p>



<p class="wp-block-paragraph">Film 2 av 100: Blåst på konfekten (1979) av Blake Edwards med Dudley Moore, Julie Andrews och Bo Derek. En film som frugan slänger fram som förslag när inget annat finns att se. George (Moore) är både en framgångsrik kompositör och en alkoholiserad framtida äkta man. En av de bästa komedier jag någonsin sett. Totalbetyget är 4/5, men som komedi är det solklart 5/5.</p>



<p class="wp-block-paragraph">Film 3 av 100: The girl, the gold watch and everything (1980) av William Wiard med Robert Hays och Pam Dawber. Man ärver en klocka som kan stoppa tiden. Några skurkar utsätter honom för en komplott, men han och hans drömtjej använder klockan till sin fördel. Lagom trevlig film. Den dåliga produktionen, t.ex. när frysta individer mot slutet av filmen flyttas runt, bidrar till charmen. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 4 av 100: Lights out (2016) av David F. Sandberg med Teresa Palmer och Gabriel Bateman. Konceptet är samma som nästan alla andra skräckfilmer de senaste 20 åren, nämligen att något smyger omkring nattetid i mörkret i ditt hem. Denna är bättre än de flesta, tack vare intressanta karaktärer och hyfsat bra backstory. Premissen bakom spökets drivkraft och själva existens kunde ha varit mer logisk, men den är bättre än det mesta jag sett på denna sida av millennieskiftet, och tillräckligt bra för att jag skulle köpa den, och slutet som drar nytta av den. Betyg, kompenserat för att det är en modern skräckfilm: 4/5.</p>



<p class="wp-block-paragraph">Film 5 av 100: Levande måltavla (1985) av John Glen med Roger Moore och Christopher Walken. Förmodligen en av de bästa Bond-filmerna med Moore i rollen som Bond. Inledningen där Bonds expertis som slalomåkare kommer till pass, är egentligen pinsamt dåligt. Sen får vi se hur Bond stoppar utplånandet av Silicon Valley, som ska sprängas för att ge en galen finansman världsmonopol på mikrochips. Filmen i övrigt växlar mellan att vara småkul och riktigt bra. Det hela kunde ha varit 30 minuter kortare. Älskar hästanläggningen. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 6 av 100: Avatar (2009) av James Cameron med Sam Worthington och Zoe Saldana. En trevlig värld att drömma sig bort till, men på det totala en ganska dålig film, mycket på grund av huvudintrigen är något slags naturromantiskt och religiöst trams. Det som fungerar är introduktionen med sin upptäckarglädje och sidoberättelserna om lojalitet, men egentligen är filmen bara en långversion av trailern. Betyg: 2/5.</p>



<p class="wp-block-paragraph">Film 7 av 100: Ghostbusters (2016) av Paul Feig med Melissa McCarthy och Kristen Wiig. En komedi som skildrar spöken som härjar i New York. Ett spöksaneringsföretag bildas och lyckas tillslut rädda staden. En riktigt bra berättelse, ett fenomenalt magplask till genomförande. Som tittare kommer du kunna tänka ut bättre skämt än de som spelas upp på skärmen framför dig. Roligast var nog när hjälten, Abby Yates, sa att hon fiser av anjovis, men för mig är inte sådant tillräckligt roligt om inte regin är riktigt bra, och det är den inte. Betyg: 1/5.</p>



<p class="wp-block-paragraph">Film 8 av 100: Outbreak &#8211; I farozonen (1995) av Wolfgang Petersen med Dustin Hoffman och Rene Russo. Ett dödligt virus som råkar spridas till USA visar sig vara en del av en topphemlig militär plan. En fenomenalt fängslande film, som tyvärr lider av att sista delen är alldeles fullproppad med otroliga händelser, som t.ex. en helikopter med gigantisk precision och räckvidd och ett serum som slängs ihop på två minuter. Men fortfarande riktigt spännande. Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 9 av 100: Rivierans guldgossar (1988) av Frank Oz (som för den yngre publiken är känd som Miss Piggy från Mupparna och Yoda från Stjärnornas krig) med Steve Martin och Michael Caine. Småskojare ställer till med problem för en professionell sol- och vårare och lyckas övertyga proffset att ett samarbete kan gynna dem båda. Jag är inte speciellt förtjust i Steve Martin, men filmen är bra på det totala. Beträffande Michael Caine brukar jag gilla hans insats men sällan hans filmer. Eftersom komedi sällan är stor film, vill jag bedöma denna som just komedi, vilket drar upp betyget ett steg. Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 10 av 100: Adam &amp; Eva (1997) av Måns Herngren och Hannes Holm med Björn Kjellman och Josefin Nilsson. Adam är väl egentligen inte riktigt mogen att binda sig, och är orsaken till att hans förhållande med Eva är svajigt. Under resans gång hinner han både ge sig på barnflickan, bli petad av Eva och genomgå en livskris. Jag vet inte varför filmen inte riktigt håller hela vägen, för ingredienserna är mycket bra. Jacob Erickssons karaktär Åke får en guldstjärna. Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 11 av 100: En prins i New York (1988) av John Landis med Eddie Murphy och Arsenio Hall. En afrikansk prins går under cover som fattig i New York för att hitta en kvinna som älskar honom för den han är, inte för vad han är. En makalös rolig film, fullproppad med roliga stereotyper, de flesta spelade av Murphy och Hall själva. Den bjuder på många skratt, men jag tror inte Paramount hade släppt igenom filmen idag, åtminstone inte i detta skick. En moviebox-klassiker för gubbar i min ålder! Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 12 av 100: The Golden Child (1986) av Michael Ritchie med Eddie Murphy och Charlotte Lewis. Murphy spelar killen-hela-dagen i form av detektiv Jarrell som specialiserat sig på att hitta försvunna barn. Plötsligt får Jarrell ett uppdrag som går ut på att hitta ett magiskt barn innan ockulta krafter hinner eliminera det. Faktiskt bättre än det låter och hyfsat bra Ritchie-vibbar, men han har gjort bättre och summan är ganska medioker. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 13 av 100: Highlander (1986) av Russell Mulcahy med Christopher Lambert och Sean Connery. Den här filmen måste ha sett ut som en trafikolycka på papper, men filmen är förvånansvärt bra! Kanske för att för att produktionen bärs upp av riktigt bra kameraarbete och klippning. Folk hugger huvudet av varandra i New York och en journalist får ta del av bakgrundsberättelsen, som innefattar märkliga regler om odödlighet och huvudseparation. Ett extra plus att man skruvade upp självaste rockgruppen Queen till att skriva soundtracket! Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 14 av 100: Tjejen som visste för mycket (1978) av Colin Higgins med Goldie Hawn och Chevy Chase. Gloria (Hawn) blir utan vetskap inblandad i stor sammansvärjning och får hjälp av en polis (Chase) att förstå vad som pågår. Mycket bra genomförande av huvudberättelsen och gott om riktigt dråplig komedi mellan varven. Gillar både när Dudley Moore strippar och när Gloria kastar ut en dvärg genom fönstret. Klassiskt titelspår framfört av Barry Manilow. Betyg: 5/5.</p>



<p class="wp-block-paragraph">Film 15 av 100: Eyes wide shut (1999) av Stanley Kubrick med Tom Cruise och Nicole Kidman. Jag tolkar detta som ett försök från överklassen att skildra sig själva från arbetarklassens perspektiv, vilket är det enda som är lite fumligt i filmen. Köper man det, får man följa med på en resa där en läkare från den övre medelklassen, nästan av en slump, får följa med överklassen till ett möte med ett hemligt ordenssällskap. Vi får även se ”flugorna kring skiten” som profiterar på överklassens diskreta charm. Makalöst bra skildrat, och trots att tempot är lugn, blir man fängslad. Betyg: 5/5.</p>



<p class="wp-block-paragraph">Film 16 av 100: Falling down (1993) av Joel Schumacher med Michael Douglas och Robert Duvall. En man får nog och börjar hävda sin rätt. Detta är en lömsk film, eftersom den skapar mycket sympati kring Douglas karaktär. Ganska snart sitter man och tänker ”bra gjort!” när han drämmer till en person med ett basebollträ eller skjuter en person i benet och griper hans tillhörigheter. Men helt plötsligt visar det sig att det är en sociopat man utvecklat sympati för. Filmen är inte särskilt övertygande, men den engagerar och den är inte tråkig under en enda minut. Douglas gör en bra skådespelarinsats. Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 17 av 100: Indiana Jones och kristalldödskallens rike (2008) av Steven Spielberg med Harrison Ford och Cate Blanchett. Kommunister förföljer Indiana Jones i förhoppning att komma över ett rymdvarelsehuvud i kristall. Manuset är ett förfärligt staplande av händelser på varandra, specialeffekterna är bedrövliga (inte minst när ett slagsmål utspelar sig på två bilar som far genom djungeln, vars mark råkar vara lika slät som en motorväg) och slutet är pinsamt. Obegripligt att detta släpptes igenom, men det får mig att undra vad uppföljaren, The dial of destiny, ska handla om. Betyg: 1/5.</p>



<p class="wp-block-paragraph">Film 18 av 100: The shape of water (2017) av Guillermo del Toro med Sally Hawkins och Octavia Spencer. Såg den för att trailern lovade mycket, och efteråt får man nästan känslan att det kan vara en vidareutveckling på Skräcken i Svarta lagunen. En ensam kvinna arbetar som vaktmästare, och utvecklar en relation till amfibien från den Svarta lagunen. Filmen är inte perfekt, men innehåller tillräckligt mycket intressanta vinklar för att vara sevärd. Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 19 av 100: Rocketman (2019) av Dexter Fletcher med Taron Egerton och Jamie Bell. Inte alla biografier vågar ta huvudrollens perspektiv, utan tassar hellre runt publikens olika föreställningar om personen som porträtteras. Rocketman är inte den enda film som vågar ta nästa steg, men det är en av få som gör det riktigt bra. Jag förstår att man mystifierar talang av kommersiella skäl, men den noggranne betraktaren kan se insinuationer att det faktiskt finns övning i bakgrunden. För mig har filmen fått Elton John att växa från popstjärna till en genuint rik själ. Betyg: 5/5.</p>



<p class="wp-block-paragraph">Film 20 av 100: Hard ticket to Hawaii (1987) av Andy Sidaris med Ronn Moss och Dona Speir. The Agency (Donna och Taryn) ropas in när narkotikapoliser för på Hawaii, där de kommer över diamanter tillhörande drogimperiet. En eskalerande konflikt uppstår. Donna och Taryn får flyga kors och tvärs i ett fraktplan för att lösa problemet, och fler personer från båda läger dras in. Grymt tuff film på 90 minuter utan en enda tråkig stund. Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 21 av 100: The invisible man (2020) av Leigh Whannell med Elisabeth Moss och Oliver Jackson-Cohen. En ganska bra lågbudgetinspelning av den klassiska filmen Den osynlige mannen från 1933. I den här filmen är mannen galen redan innan han blir osynlig, vilket bidrar till hans motiv att iscensätta sin död, bli osynlig och ge sig efter sin fru för att göra hennes liv surt. Filmen innehåller en hel del riktiga spänningsmoment och några, ur spänningssynpunkt, spännande händelser. Frun fattar tyvärr en hel del frustrerande dåliga beslut under resans gång, men det kanske behövdes för spänningen. I slutscenen, där mannen bedyrar sin oskuld, har manusförfattaren redan glömt att filmen började med en stor lögn – en iscensatt död. Jag hade ändå en bra resa. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 22 av 100: Super troopers (2001) av Jay Chandrasekhar med Jay Chandrasekhar och Kevin Heffernan. Traditionell trashkomedi om två rivaliserande gäng. Mycket humor bygger på att de flesta tvångsmässigt beter sig som snorungar, trots att det ena gänget är state troopers och det andra gänget är poliser. Intrigerna är rätt värdelösa, men jag kan inte avfärda filmen eftersom jag flera gånger skrattade högt åt hur snabbt alla faller in i sina gamla mönster, trots flera försök att växa upp. De tyska sadomasochisterna var ett onödigt stickspår. Betyg: 3 (stark) av 5.</p>



<p class="wp-block-paragraph">Film 23 av 100: The man from Earth (2007) av Richard Schenkman med William Katt och David Lee Smith. Valde att se denna för att jag gillade skådisen från Titta han flyger, som bjöd mig på stor underhållning som ung. Berättelsen är ganska platt och kvasig, men trots att inte filmen har med sig världens bästa skådespelare lyckades den både fånga min uppmärksamhet och få mig att gilla berättarstilen. Mer av en tv-teater än en film. Kan förmodligen bara ses en gång, men bör ses. Betyg: 5 av 5.</p>



<p class="wp-block-paragraph">Film 24 av 100: Tango &amp; Cash (1989) av Andrey Konchalovskiy och Albert Magnoli med Sylvester Stallone och Kurt Russell. Klassisk polisaction innehållande precis alla filmkändisar som fanns år 1989. Omaka par av superpoliser hotar en storskalig kriminell verksamhet, som försvarar sig genom att rikta falska anklagelser mot duon, som till slut får upprättelse. Scenerna följer inte särskilt bra. T.ex. placeras rekvisita där den behövs för att klippet ska hänga ihop, utan tanke på tidigare klipp. Men det spelar ingen roll, för filmen är helt grym. Den har allt! Betyg: 4 (stark) av 5.</p>



<p class="wp-block-paragraph">Film 25 av 100: Big Hero 6 (2014) av Don Hall och Chris Williams. En animerad film som utspelar sig i ett parallellt universum där San Fransisco och Tokyo är samma stad. Bakom stereotyper om rollfigurer med motgångar från barndomen som lyckas och vänskap över klass- och könsgränser ryms en smårolig berättelse om en tuppfäktare (fast med robotar) som kommer in på en skola för uppfinnare för att sedan rädda världen. Passar bäst för 13-åringar och håller inte för en vuxen publik. Betyg: 2/5.</p>



<p class="wp-block-paragraph">Film 26 av 100: Babylon (2022) av Damien Chazelle med Brad Pitt och Margot Robbie. Efter en säkert en halvtimmes long prolog börjar denna film lämna det kaos den inleddes med och utvecklas till en både dråplig och gripande berättelse om ett generationsskifte i filmbranschen. Tveksamt om den verkligen behövde vara 3 timmar och 9 minuter lång. Man kunde ha kortat ner t.ex. festscenerna. Men i övrigt, en utmärkt film! Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 27 av 100: Seriously Red (2022) av Gracie Otto med Krew Boylan och Daniel Webber. En ganska rolig men ganska tragisk berättelse om en vuxen kvinna med en mental mognad som en 15-åring som bor med en dysfunktionell mor och som skyller alla sina motgångar på andra. Men sjunga kan hon, och filmen är en resa från uppgång till fall som Dolly Parton-imitatör. Dåligt kameraarbete (utomhusscenerna är aningen överexponerade) och märkligt slut, men över lag värd att se om man är beredd att avsätta en timme och trekvart. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 28 av 100: Tintin i hajsjön (1972) av Raymond Leblanc. Mig veterligen den enda berättelsen om journalisten Tintin som inte författats av Georges ”Hergé” Remi. Tintin och Haddock är på väg till Syldavien för att hälsa på professor Kalkyl. Utsätts för mordförsök på planet, genom att piloterna oanmält lämnar planet. Sällskapet räddas av två barn som följer dem till Kalkyl, vars hem infiltrerats av kriminella som försöker komma över hans uppfinningar. Fantastiska teckningar, tillräckligt bra berättelse och genomförande. Betyg (bedömd som barnfilm): 5/5.</p>



<p class="wp-block-paragraph">Film 29 av 100: En amerikansk varulv i London (1981) av John Landis med David Naughton och Griffin Dunne. Två amerikaner på luffen någonstans i Storbritannien får snabbt höra att något inte är som det ska. Den ene blir dödad, men exakt vad som inte står rätt till, uppenbarar sig under resans gång. En utmärkt varulvsfilm som har glimten i ögat på rätt sätt. Den kan distansera sig, utan att be om ursäkt. Som tittare sitter man på helspänn genom hela filmen. Inte alla specialeffekter har åldrats felfritt, de är ändå helt makalöst snygga. Betyg (bedömd som skräckfilm): 5/5.</p>



<p class="wp-block-paragraph">Film 30 av 100: Project X – topphemligt (1987) av Jonathan Kaplan med Matthew Broderick och Helen Hunt. Militären utbildar i hemlighet schimpanser till kamikazepiloter. Lojalitet ställs mot vetenskap som ställs mot empati. Det man ser spelas upp framför ögonen känns föga trovärdigt och resan till uppgörelsen fängslar mer än själva uppgörelsen, men det var ändå en ganska trivsam resa. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 31 av 100: The Imaginarium of Doctor Parnassus (2009) av Terry Gilliam med Heath Ledger och Lily Cole. Ett sällskap reser runt med ett underhållningskoncept som består av ett besök in i en fantasivärld. Parnassus själv har sålt sina barns själar till djävulen i utbyte mot evigt liv, och när tiden för att lämna bort dottern närmar sig, försöker han få till en ny vadslagning för att komma undan. Inte Gilliams bästa film, men något som måste ses. Betyg: 3 (stark) av 5.</p>



<p class="wp-block-paragraph">Film 32 av 100: Cats (2019) av Tom Hooper med James Corden och Judi Dench. Filmen som får dig att fundera på varför musikalen Cats uppskattas av en publik, för inga ledtrådar ges i filmen. Detta var verkligen skit. Betyg: 1/5.</p>



<p class="wp-block-paragraph">Film 33 av 100: Splash (1984) av Ron Howard med Tom Hanks och Daryl Hannah. En man stöter på en kvinna, som tittaren får veta är en sjöjungfru som räddade honom från drunkning som liten. Mycket charmigt genomförande, mycket 80-talselektronik och riktigt snyggt kameraarbete. Ett extra plus till John Candy för sin påstådda 12-tumspenis – en romantisk komedi väl värd sina nästan två timmar! Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 34 av 100: Skräcknatten (1985) av Tom Holland med William Ragsdale och Amanda Bearse. Charley är lite mer engagerad i skräckfilm än han borde vara. Den lite utstötta kompisen ”Spöket” spär på intresset men flickvännen Amy är inte det minsta road. När Charley misstänker att en vampyr har köpt grannhuset tar han hjälp av en gammal skräckmästare, som av en händelse råkar heta Vincent i efternamn. En riktig klassiker med många referenser och intressanta produktionsdetaljer! Betyg: 4 (stark) av 5.</p>



<p class="wp-block-paragraph">Film 35 av 100: Raskenstam (1983) av Gunnar Hellström med Gunnar Hellström och Agnetha Fältskog. Ett fritt porträtt av sol-och-våraren Gustaf Raskenstam. Inget märkvärdigt, men ett trevligt sällskap. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 36 av 100: Call girl (2012) av Mikael Marcimain med Sofia Karemyr och Simon J. Berger. En ganska modig film som ger en bild av folkhemmet bakom kulisserna, inte minst hur det kan ha sett ut bakom Geijer-affären. För att berätta historien har man använt personer som för tankarna både till Palme och Hyland, förmodligen en aning tillrättalagt. Rätt snyggt genomförande. Betyg: 3 (stark) av 5.</p>



<p class="wp-block-paragraph">Film 37 av 100: Nude on the moon (1961) av Doris Wishman. För att förstå Wishman bör man lägga ganska mycket tid på att läsa intervjuer med henne och se några av hennes filmer. Helt oavsett är denna film höjden av lyckträff: Vetenskapsmän flyger till månen, som tydligen är en nudistkoloni! Det blir mångudinnan som får avgöra expeditionens framtid, och medan den ena vetenskapsmannen blir förälskad får den andre kval kring hans framtid. Betalade ganska mycket för DVD:n, som tyvärr ser ut som en sämre VHS. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 38 av 100: Unknown island (1948) av Jack Bernhard med Virginia Grey och Phillip Reed. En riktigt bra äventyrsfilm som byggs upp på en skum bar i Singapore och slutar på en öde ö i stilla havet, bebodd av gigantiska urtidsdjur. Blandad kvalité på specialeffekterna och inte alltid helt värdelöst. Intrigerna på ön känns onödiga, men som tur är håller sig filmen till den anständiga längden av 75 minuter. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 39 av 100: The Rachel Papers (1989) av Damian Harris med Dexter Fletcher och Ione Skye. Typisk sexkomedi från sent 1980-tal. Charles får för sig att han ska skaffa erfarenhet genom att vara med äldre kvinnor innan han fyller 20, vilket naturligtvis leder till komplikationer. Med tanke på hur kändistät filmen är (Jonathan Pryce, James Spader, Michael Gambon, Bill Paterson, Aubrey Morris) hade jag kanske förväntat mig mera, men den är åtminstone småtrevlig. Betyg: 2/5.</p>



<p class="wp-block-paragraph">Film 40 av 100: John Houdi: Tricks (2009) av och med John Houdi. En gammal dvd som numera finns att betrakta gratis på YouTube (https://www.youtube.com/watch?v=R0yaO4rqKO0). Det finns några olika kategorier av illusionister. Joe Labero gör Las Vegas-magi, Anders Fox gör close up-magi, och Houdi gör salongsmagi. Filmen är en nedkortad live-show som bara är dryga timmen lång, men Houdi är inte bara (med god marginal) Sveriges bästa salongsmagiker, han är dessutom rolig. I dagens TikTok-klimat skulle han säkert ha vunnit på att såga upp filmen till fyrtiotusenmiljarder klipp, men för den som vill hälla upp en cognac och sitta i en skön fåtölj under en dryg timme, är detta en solklar rekommendation. Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 41 av 100: Clean slate (1994) av Mick Jackson med Dana Carvey och Valeria Golino. Trivial men underhållande film om en privatdetektiv som får minnesförlust av att somna. Han måste både lösa ett fall och återupptäcka det system som gör att han klarar vardagen. Skrattade flera gånger, t.ex. när storskurken misstas för hyresvärden eller alla kommentarer om hans tumme. Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 42 av 100: Jakten på den försvunna skatten (1981) av Steven Spielberg med Harrison Ford och Karen Allen. Arkeolog och skattletare på 1930-talet verkar kunna komma åt vilken skatt som helst, men förlorar den i alltid i slutändan. Storslaget men hela filmen är fullproppad av ologiska händelser. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 43 av 100: Indiana Jones och de fördömdas tempel (1984) av Steven Spielberg med Harrison Ford och Kate Capshaw. En indisk by blir bestulen på sina religiösa symboler, och det visar sig både att dessa symboler har en faktisk signifikans och att Indiana Jones faktiskt kunde lösa mysteriet. Hade filmen haft en anständig längd vore den en fullträff, men 30 onödiga minuter drar ner betyget. Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 44 av 100: Spelaren (1992) av Robert Altman med Tim Robbins och Greta Scacchi. Filmen lovar mycket genom att inledas med en 8 minuter lång scen utan klipp, och den håller hela vägen igenom. Filmproducent hotas efter att ha nekat ett filmmanus. Fängslande, snyggt och charmigt. Betyg: 5/5.</p>



<p class="wp-block-paragraph">Film 45 av 100: The dead zone (1983) av David Cronenberg med Christopher Walken och Brooke Adams. Efter en trafikolycka får Johnny förmågan att se in i framtiden, och blir därför medveten om ett annalkande attentat. Detta är en av få bra filmer baserade på en roman av Stephen King. Av någon anledning användes inte bokens svenska titel på filmen i Sverige, trots att boken var hyfsat ny när filmen kom. Klockren stämning i filmen. Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 46 av 100: Hajen 2 (1978) av Jeannot Szwarc med Roy Scheider och Lorraine Gary. På något vis lyckades Zanuck/Brown skruva upp skådespelarna från Hajen (1975) till att göra en ny film. Festsugna ungdomar måste skyddas från en attackerande vithaj. En bra film om man inte jämför den med Spielbergs mästerverk. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 47 av 100: Tetris (2023) av Jon S. Baird med Taron Egerton och Nikita Efremov. En dramatisering av datorspelet Tetris väg över järnridån från Sovjetunionen till den västerländska fria marknaden. En fängslande film som skildrar när östs totalitarism och hysteriska byråkrati krockar med västs entreprenörskap och marknadsliberalism. Lagom mycket tekniska referenser för att tilltala både programmerare och vanligt folk, lagom mycket feel good för att väcka tittarens känslor utan att det blir smetigt. Betyg: 4 (stark) av 5.</p>



<p class="wp-block-paragraph">Film 48 av 100: Road House (1989) av Rowdy Herrington med Patrick Swayze och Sam Elliott. Stenhård utkastare rekryteras till en krog som hemsöks av drogmaffian. Först ser det bra ut, sen får tittaren erfara hur hårt insyltad maffian är. Vi får uppleva tänkbara filmklichéer som vi som var unga på 80-talet lärt oss att älska, och Swayze är underbar. Klart plus att Jeff Healey dyker upp! Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 49 av 100: Rocky IV (1985) av och med Sylvester Stallone. Ingen annan film fångar samtiden som denna. Berättelsen är ganska trivial. Vi får följa Rocky (Stallone) och ryska Drago (Dolph Lundgren) i deras förberedelser inför världsmästerskapet, men det finns så mycket som ger produktionskvalitet till filmen, som t.ex. robotar, digitala synthar och en fantastisk boxningsmatch. På det stora hela, en makalös skapelse! Betyg: 5/5.</p>



<p class="wp-block-paragraph">Film 50 av 100: Noah (2014) av Darren Aronofsky med Russell Crowe och Jennifer Connelly. Ett försök att göra ett visuellt drama av en av Bibelns märkligaste berättelser. För att göra upp med synder som gått i arv från Adam och Eva bestämmer sig Gud för att döda allt liv på jorden, men räddar en mindre trupp som får agera genbank för framtida generationer. Mycket att titta på, undermåligt genomförande och tråkigt resultat. Ibland undrar man om filmen är ironisk. Betyg: 1/5.</p>



<p class="wp-block-paragraph">Film 51 av 100: The Cell (2000) av Tarsem Singh med Jennifer Lopez och Vince Vaughn. Polisen behöver få veta var en seriemördares gömmer sitt senast kidnappade offer, problemet är att mördaren ligger i koma. De tar hjälp av ett team som kan ta sig in i människors huvud, för att få svaret. Låter dumt på papper, har en del att erbjuda tittaren. Mycket fantasifulla scener, några ljusa stunder, men varken berättelsen eller genomförandet engagerar. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 52 av 100: Searching for Sugar Man (2012) av Malik Bendjelloul med en massa skivbolagsfolk och Rodriguez. Egentligen inte världens bästa film, men den gör det mesta rätt. Och inte minst lyckades skapa mystik kring en artist som jag inte ens visste fanns. Det resulterade i att jag köpte hans skivor, och kan därmed konstatera att debutskivan Cold Fact (1970) är ett mästerverk. Tyvärr var uppföljaren skit, men tack vare Bendjellouls film fick världen höra Cold Fact! Betyg: 5 (svag) av 5.</p>



<p class="wp-block-paragraph">Film 53 av 100: Ett tufft jobb (1991) av ingen mindre än John Badham med Michael J. Fox och James Woods. En stenhård polis får en skådespelare på halsen, som vill lära sig polisyrket för att bli mer trovärdig i sin roll. De är väldigt olika, och många konflikter uppstår, men tillslut blir de goda vänner. Underbart förutsägbar och fullproppad med härliga stereotyper! Inte bra, men sevärt! Betyg: 3 (stark) av 5.</p>



<p class="wp-block-paragraph">Film 54 av 100: Döden på Nilen (1978) av John Guillermin med Peter Ustinov och Mia Farrow. Alla känner väl till Agatha Christies berättelse, men detta är ett magnifikt genomförande. Makalöst skådespeleri, inte minst Angela Lansbury sticker ut, och snyggt fotograferat! Men den behöver inte vara två timmar och tjugo minuter lång &#8211; det drar ner betyget! Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 55 av 100: Splice (2009) av Vincenzo Natali med Adrien Brody och Sarah Polley. Två genetiker går lös på gensaxen i syfte att skapa nytt liv de kan ha medicinsk nytta av. En liten varelse växer upp och blir naturligtvis farlig. Jag gillade detta skarpt. Det var lätt att förstå allas motiv, det var lätt att hänga med i karaktärernas beteendemönster och berättelsen var bra. Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 56 av 100: The Trip (2010) av Michael Winterbottom med Steve Coogan och Rob Brydon. Under en vecka reser Steve och Rob runt och recenserar Storbritanniens bästa restauranger. De har gott om tid att samtala under både resor och måltider, och vekar kunna leverera precis vilka förolämpningar som helst till varandra. Men man får en bild av att det är lite sorgligt att inget egentligen är på riktigt. Riktigt bra teater på vita duken! Betyg: 4 (stark) av 5.</p>



<p class="wp-block-paragraph">Film 57 av 100: π (1998) av Darren Aronofsky med Sean Gullette och Mark Margolis. Ett matematiskt överbarn hittar ett mönster i aktiekurserna, och kan således i teorin förutspå framtida förändringar och därmed tjäna en massa pengar. Givetvis blir judarna arga. En total shit show. Jag ångrar att jag tog mig igenom eländet, för jag borde ha stängt av. Betyg: 1/5.</p>



<p class="wp-block-paragraph">Film 58 av 100: Me and you and everyone we know (2005) av Miranda July med Miranda July och John Hawkes. Vi får följa två personer på jakt efter sällskap, en man med arbetarbakgrund och en kvinna med konstnärsambitioner. För att göra det hela mer intressant, använder barnen The Internetz för att knyta egna kontakter. Förmodligen den bästa feelgood-film jag sett någonsin, och betyget bygger på att jag bedömt den som en sådan. Betyg: 5/5.</p>



<p class="wp-block-paragraph">Film 59 av 100: Närkontakt av tredje graden (1977) av Steven Spielberg med Richard Dreyfuss och Teri Garr. Tydligen finns det grader av närkontakt, definierade av astronomen Allen Hynek. Den första graden innebär att man observerat en utomjordisk farkost, den andra handlar om fysiska bevis för densamma. Denna film handlar om den tredje graden, vilket är en observation av farkostens besättning. En spoiler, kan tyckas, men den ganska stillsamma resan mot det målet kanske behöver spänningen av att betraktaren vet vad målet är. Ibland bjuder filmen på subtila insinuationer att något är fel, ibland bjuder filmen på spektakulära specialeffekter. Spielberg har sina toppar och dalar, och detta är en topp inom science fiction-genren. Betyg: 5/5.</p>



<p class="wp-block-paragraph">Film 60 av 100: Privatskola för flickor (1983) av Noel Black med Phoebe Cates och Matthew Modine. Konceptet fungerar, men har på grund av det exploaterats alldeles för mycket både före och efter den här filmen. Två killar poserar som flickor för att infiltrera en internatskola för flickor. Cates är som alltid bra, och det är kul att se Michael Zorek i sitt esse. Filmen är dålig men sevärd. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 61 av 100: Leviathan (1989) av George P. Cosmatos med typ alla. Peter Weller från Robocop, Richard Crenna från Rambo, Ernie Hudson från Ghostbusters, Lisa Eilbacher från Snuten i Hollywood, och så vidare. Den officiella berättelsen handlar om ett ryskt genetiskt experiment som påträffas på havsbotten, men egentligen handlar nog filmen om att James Cameron var på väg att släppa Avgrunden. Specialeffekterna är utmärkta, regin håller inte. Metro-Goldwyn-Mayer bevakar inte längre filmen, så den kan ses gratis på t.ex. YouTube. Det är inte bra, men det är en viktig del av filmhistorien, så den bör ses. Betyg: 2/5.</p>



<p class="wp-block-paragraph">Film 62 av 100: Blues Brothers (1980) av John Landis med John Belushi och Dan Aykroyd. Ex-fängelsekunder får för sig att de ska återförena sitt gamla blues-band. En del roliga kändisar dyker upp, och en del roliga scener flimrar förbi. Hade fungerat om den vore någon timme kortare. Betyg: 2/5.</p>



<p class="wp-block-paragraph">Film 63 av 100: Himmel över Berlin (1987) av Wim Wenders med Bruno Ganz och Otto Sander. Såg den efter rekommendation, för det ser inget vidare ut på papper: En ängel tar på sig att övervaka den mänskliga aktiviteten i Berlin. Efter att ha förälskat sig i en dödlig kvinna börjar han längta efter fysiska glädjeämnen. Men genomförandet är makalöst &#8211; detta är inget annat än ett konstverk. Betyg: 5/5.</p>



<p class="wp-block-paragraph">Film 64 av 100: Weird: The Al Yankovic Story (2022) av Eric Appel med Daniel Radcliffe och Rainn Wilson. En hittepåbiografi fullproppad av referenshumor. Förmodligen är skämten roligare om man redan innan visste t.ex. vilken relation Yankovic hade för relation till Coolio, men man drar ändå på mungipan ibland. Ett genomgående skämt verkar vara dåligt smink. John Deacon ser ut som om han ska vara med på framsidan av Vogue, Yankovic och Will Forte dyker upp i värsta Kyle MacLachlan-perukerna, för att inte tala om hur Radcliffe ser ut. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 65 av 100: Nyckeln till framgång (1987) av Herbert Ross med Michael J. Fox och Helen Slater. En bondson från Kansas försöker få fart på karriären i New York enligt principen fake it till you make it. Det skapar såklart komiska situationer på vägen och när bakslaget kommer måste han prioritera rätt. Berättelsen är ok, Fox är charmig och atmosfären är bra. Man hade önskat att helheten vore aningen bättre. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 66 av 100: Brännmärkt (1981) av Tony Maylam med Brian Matthews och Leah Ayres. En av många filmer från kölvattnet efter Fredagen den 13:e. På ett sommarläger utsätts en vaktmästare för ett skämt som leder till att han får allvarliga brännskador. Naturligtvis kommer han tillbaka till lägret för att hämnas. Filmen når samma underhållningsnivå som de bästa i genren, inklusive just Fredagen den 13:e. Riktigt bra soundtrack av Rick Wakeman från Yes! Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 67 av 100: Den lilla sjöjungfrun (2023) av Rob Marshall med Halle Bailey och Jonah Hauer-King. En märklig filmatisering av H. C. Andersens gamla saga, som hedrats med en staty i Köpenhamn. Skådespelarinsatserna är bra, specialeffekterna är inte särskilt trovärdiga, men väldigt vackra att se på. Filmen förhåller sig starkt till den betydligt bättre tecknade filmen från 1989, som bjöd på ett tjusigare genomförande och på mindre utfyllnad. Några intriger läggs på bordet, men lämnas okommenterade. Varför har dansk Kung Triton barn med kvinnor från alla världsdelar? Det och mycket annat presenteras, men följs inte upp. Givet att budgeten på en kvarts miljard hade jag förväntat mig något helt annat, men skådespeleriet är riktigt bra. Betyg: 2/5.</p>



<p class="wp-block-paragraph">Film 68 av 100: Sleepaway Camp (1983) av Robert Hiltzik med Felissa Rose och Jonathan Tiersten. Ytterligare en av många filmer från kölvattnet efter Fredagen den 13:e, denna gång med en ganska kreativ plot twist: En blyg flicka (Rose) visar inget intresse att delta i sommarlägrets aktiviteter och hon blir utsatt för mobbning. Men varje plågoande går ett hemskt öde till mötes, och hemligheten hon bär på uppenbaras. Som film är detta en trea, men inom sin genre är det riktigt bra! Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 69 av 100: Jackie Brown (1997) av Quentin Tarantino med Pam Grier och Samuel L. Jackson. Smugglande flygvärdinna pressas av polisen till att bli dubbelagent, vilket givetvis medför en hel del faror. Filmen lyfts definitivt av bra regi och skådespeleri. Michael Keaton och Bridget Fonda är bra, Robert De Niro och Jackson är briljanta. Sett till helheten har Tarantino gjort bättre. Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 70 av 100: Roxanne (1987) av Fred Schepisi med Steve Martin och Daryl Hannah. En man med extremt stor näsa (Martin) blir förälskad i Roxanne (Hannah). Briljant idé med ett ganska bra genomförande. Etableringen av karaktärerna är lite övertydlig. Martins hamnar i en situation där han ska dra 20 nässkämt på en pub, vilket var ganska pinsamt, och Roxannes skönhet kompletteras med en gigantisk meritlista. Dessutom är filmen alldeles för lång för den berättelse den förmedlar! Men helheten är bra och filmen bjuder på många skratt. Inspelningsplatsen, Nelson i Kanada, är så tjusig att man får andnöd! Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 71 av 100: Tillbaka till framtiden (1985) av Robert Zemeckis med Michael J. Fox och Christopher Lloyd. Första delen i en trilogi om tidsresor. En uppfinnare, Emmett, visar sig hålla på med en del galna experiment, som resulterar i att han blir mördad av libyska terrorister och att hans vän Marty skickas 30 år tillbaka i tiden. Där uppstår problem som måste lösas, och utöver det måste Marty komma tillbaka till 1985 och rädda Emmett från sitt öde. Fantastiskt rolig och snygg film, fullproppad av påskägg &#8211; min favorit är att Huey Lewis bedömer provspelningar till skolbalen. Betyg: 5/5.</p>



<p class="wp-block-paragraph">Film 72 av 100: Armageddon (1998) av Michael Bay med Bruce Willis och Ben Affleck. Ett antal gruvarbetare omskolas till astronauter för att rädda världen från en asteroid. En bra bit över två timmar med patriotiskt svammel i en totalt orealistisk film. Betyg: 1/5.</p>



<p class="wp-block-paragraph">Film 73 av 100: Knubbigt regn (1999) av Frank Oz med Steve Martin och Eddie Murphy. Misslyckad filmproducent drar i gång ett vinna-eller-försvinna-projekt utan att ha fått med sig filmens stjärna, som inte vet att det han utsätts för är en filminspelning. Rolig idé och en ganska bra film i början, som under resans gång blir alldeles för osannolik för att engagera, men några skratt bjöd den trots allt på. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 74 av 100: Chinatown (1974) av Roman Polanski med Jack Nicholson och Faye Dunaway. En privatdetektiv anlitas av en kvinna för att spionera på en man som antas vara otrogen. Han upptäcker snabbt att saker inte är som de verkar, och över tid att det pågår dubbelspel. Det är inte en fullträff, men det vore orättvist att ge den lägre betyg, men trots att den rullar i över två timmar, är den en mycket angenäm resa. Nicholson passar perfekt som synisk detektiv. Betyg: 5/5.</p>



<p class="wp-block-paragraph">Film 75 av 100: First spaceship on Venus (1960) av Kurt Maetzig med Yôko Tani och Oldrich Lukes. Forskare hittar bevis för att det bor en civilisation på Venus, och beslutar sig för att åka dit. Färden blir dramatisk. De stöter på ett meteoritregn så svårt att de måste använda nödgyrot, och ansvarig för blinkande lampor börjar argumentera att hans tid är så viktig så att lunch inte längre kan levereras till honom. Fantasifullt och en hel del ofrivillig humor. Betyg: 2/5.</p>



<p class="wp-block-paragraph">Film 76 av 100: Kär i karriären (1993) av Barry Sonnenfeld med Michael J. Fox och Gabrielle Anwar. Fox spelar en alltiallo som passar upp på gästerna på ett finare hotell, men drömmer om att äga sitt eget. En potentiell investerare visar sig uppvakta samma flicka som Fox rollfigur är förälskad i. Ganska charmigt, fartfyllt och hyfsat roligt, men inget märkvärdigt. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 77 av 100: Starship Troopers (1997) av Paul Verhoeven med Casper Van Dien och Neil Patrick Harris. I en alternativ framtid koloniserar människan Universum, och har därför hamnat i konflikt med en annan kolonialmakt bestående av utomjordingar som liknar stora insekter. Vi får följa hur jordlingarna förhåller sig till och hanterar ett sådant motstånd, vilket inte är en helt vacker historia. En briljant satirfilm, förklädd till en simpel popcornrulle, där varenda liten detalj är en ledtråd eller en sarkastisk kommentar. Betyg: 5/5.</p>



<p class="wp-block-paragraph">Film 78 av 100: Vem satte dit Roger Rabbit (1988) av Robert Zemeckis med Bob Hoskins och Christopher Lloyd. I en värld där rollfigurerna i tecknade filmer egentligen är skådespelare som agerar framför kameran, blir en av de stora stjärnorna, en kanin, anklagad för mord. Jag var inte jätteimponerad när jag såg den på bio för 35 år sedan, då det var lite för mycket att hålla reda på både handlingen och allt som händer i bild. Den behövdes ses om på dvd. Det som verkligen sticker ut med filmen är teckningarna, som visar kaninen med flera i bild under kamerarörelser, något som åtminstone inte jag sett förr. Ett tekniskt mästerverk! Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 79 av 100: Plötsligt i Vinslöv (2001) av Jenny Bergman och Malin Skjöld med Holger Nilsson och Kjell Fredriksson. Filmen väljer ut några av invånarna och Vinslöv (Hässleholms kommun, Skåne) och låter tittarna ta del av deras vardagsliv och fritidssysselsättningar, som inte minst är golfande. Som tittare slits jag mellan tacksamheten att filmen gjordes (för den är ett fönster till en värld som inte alla har tillgång till) och frustration över att man nästan behöver ha kufar i handlingen för att hålla tittarens intresse uppe. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 80 av 100: Ett päron till farsa firar jul (1989) av Jeremiah S. Chechik med Chevy Chase och Beverly D&#8217;Angelo. Clark Griswold bjuder hem familjen på julfirande. Inget går som det var tänkt och fler gäster än de som bjudits in dyker upp. Utöver allt elände pågår en infekterad grannfejd och julbonusen uteblir. Detta är den tredje filmen om familjen Griswald, och av den sämsta av dessa tre, men den är tillräckligt bra för att vara ett givet inslag i julens tv-tittande. Förmodligen den film där Chevy Chase är mest utagerande. Som skådespelare är han aldrig trovärdig men alltid briljant i sin syrlighet. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 81 av 100: Blixt Gordon (1980) av Mike Hodges med Sam J. Jones och Max von Sydow. Inledningsvis får vi höra hur någon ondskefull leker med jorden genom att orsaka naturkatastrofer (lite som Disaster-menyn i SimCity). En rugbyspelare som reser till planeten Mongo får reda på att det är den ondskefulla kejsaren Ming som är i farten. Kan han rädda jorden i tid? Rätt dåligt, men riktigt roligt. Om inte annat är soundtracket av Queen helt briljant! Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 82 av 100: Vägen till El Dorado (2000) av Bibo Bergeron, Don Paul och Jeffrey Katzenberg med Kevin Kline och Kenneth Branagh. Av en slump får två skojare en chans att resa till El Dorado för att komma över stadens guld. Jag köpte denna på dvd så snart den släpptes, då jag hade barn i rätt ålder för att se den. Jag skrattade mig igenom filmen och tyckte att jag såg mig själv. Bra barnfilm som tilltalar flera generationer, och som barnfilm får den en femma, men för en vuxen är den mer av ett tillfällets nöje. Inte full pott, men en rekommendation! Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 83 av 100: Can&#8217;t buy me love (1987) av Steve Rash med Patrick Dempsey och Amanda Peterson. Töntig kille betalar skolans populäraste tjej för att hon ska göra honom populär, vilket naturligtvis ger ett bakslag. Förutsägbart men underhållande och charmigt. Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 84 av 100: Forbidden World (1982) av Allan Holzman med Jesse Vint och June Chadwick. I en avlägsen framtid på ett avlägset rymdskepp, faller en vetenskaplig expedition offer för ett misslyckat experiment. Groteskt muterade livsformer konsumerar sig igenom skeppets besättning. Mycket monster, naket och galna vetenskapsmän, men inte en film för första dejten, utan snarare något för (tidigast) tioårsjubileet. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 85 av 100: Jag är med barn (1979) av Lasse Hallström med Magnus Härenstam och Anki Lidén. Reklamaren Bosse lyckas göra Lena gravid. Han tror att livet är över, men filmen skildrar Bosses förändrade livsstil, och hans kollegor förhåller sig. Kunde ha varit så mycket bättre än det är, men Härenstam är såklart bra. Betyg: 2/5.</p>



<p class="wp-block-paragraph">Film 86 av 100: Doc Hollywood (1991) av Michael Caton-Jones med Michael J. Fox och Julie Warner. En läkare på genomresa kvaddar bilen i en småstad och döms till samhällstjänst. Under tiden han avtjänar sitt straff, utvecklar han en relation till orten och dess invånare. Riktigt charmig film med biroller från inga mindre än Bridget Fonda, George Hamilton och Woody Harrelson. Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 87 av 100: Twin Peaks: Fire Walk with Me (1992) av David Lynch med Sheryl Lee och Ray Wise. En abstrakt film som ger lite bakgrundsinformation till en tidigare tv-serie, som kort och gott hette Twin Peaks. Vi får veta mer om huvudpersonen i serien, Laura Palmer, och får en inblick in hennes sista dagar vid livet och vad som kan ha gått fel, och man behöver inte ha sett serien för att ha glädje av filmen. Så bra att man får rysningar. Betyg: 5/5.</p>



<p class="wp-block-paragraph">Film 88 av 100: Mitt stora feta grekiska bröllop 2 (2016) av Kirk Jones med Nia Vardalos och John Corbett. Toula och Ian som gifte sig i första filmen, visade sig inte vara riktigt gifta. Vi får se en ny kulturkrock som innefattar en dotter, men helt utan eftertanke tragglar eländet på i samma hjulspår som sist. För tittaren finns en viktig skillnad: Sist var det nytt och roligt. Betyg: 2 (mycket svag) av 5.</p>



<p class="wp-block-paragraph">Film 89 av 100: Nördarna kommer! (1984) av Jeff Kanew med Robert Carradine och Anthony Edwards. Ordet &#8220;nerd&#8221; översattes traditionellt till &#8220;tönt&#8221; på svenska, men &#8220;Nördarna kommer&#8221; bidrog till att ett nytt ord introducerades, nämligen &#8220;nörd&#8221;, och helt plötsligt förvandlades en tönt från en outsider till någon som framgångsrikt förkovrade sig i ett ämne. Filmen är både mycket underhållande och ytterst inflytelserik över samhället vi lever i idag.</p>



<p class="wp-block-paragraph">Film 90 av 100: Sleepy Hollow (1999) av Tim Burton med Johnny Depp och Christina Ricci. Depp spelar någon form av utredare som efter en serie av mord skickas till Sleepy Hollow för att undersöka legenden om den huvudlösa ryttaren. Extremt kändistätt och snyggt filmad, men lyckas inte riktigt engagera. Jag kom på mig att tänka &#8220;åh, det är hon i Svarte Orm&#8221; mer än &#8220;åh, vad bra det här är&#8221;. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 91 av 100: Pirates of the Caribbean: Död mans kista (2006) av Gore Verbinski med Johnny Depp och Orlando Bloom. En fantasifull berättelse i spektakulära miljöer om en sjörövare som försöker undkomma en förbannelse som odöd. Mycket specialeffekter av blandad kvalité och en dramaturgisk trafikolycka. En händelse inträffar, vilket kan vara en jättebläckfiskattack eller en svärdfight i ett kvarnhjul, som sedan illustreras under 15-20 minuter för lång tid. Sen når berättelsen nästa händelse, som också tydligen måste illustreras i 15-20 minuter för lång tid. Filmen är något slags exklusiv apelsin-tv. Betyg: 1/5.</p>



<p class="wp-block-paragraph">Film 92 av 100: Strul (1988) av Jonas Frick med Björn Skifs och Gunnel Fred. Kemilärare åtalas för drogtillverkning. I fängelset tvingas han ut för att begå nya brott, och lyckas såklart bli vän med en polis. Snyggt filmat, kul idé, ganska daterad men klart sevärd! Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 93 av 100: Tricks – en hyllning till salongsmagin! (2009) av och med John Houdi. Houdi bjuder på en hyllning till salongsmagin och påvisar samtidigt fingerfärdighet i världsklass. Det enda negativa jag har att säga om denna film är att den bara är dryga timmen lång. Jag lånade dotterns dvd, men den finns numera att betrakta gratis på YouTube. Du bör vara intresserad av illusionism och scenmagi för att uppskatta denna fullt ut. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 94 av 100: Harry Potter och Fången från Azkaban (2004) av Alfonso Cuarón med Daniel Radcliffe och Emma Watson. En potentiellt spännande berättelse om en förrymd fånge i en fantasifull värld. Vissa moment fångade uppmärksamheten, t.ex. när barnen smög utanför Hagrids stuga, men det som mest utmärker filmen är att den är alldeles för lång, och att den därmed utgör en tråkig sittning. Betyg: 2/5.</p>



<p class="wp-block-paragraph">Film 95 av 100: Spotlight av Tom McCarthy med Mark Ruffalo och Michael Keaton. Filmen berättar historien om när Boston Globe gjorde en artikel om de systematiska övergreppen på barn inom Katolska kyrkan. Lyckas berätta historien på ett engagerande sätt utan att bli för emotionellt engagerad i sakfrågan – fokus ligger på journalistiken. Betyg: 5/5.</p>



<p class="wp-block-paragraph">Film 96 av 100: Rymdens vampyrer (1985) av Tobe Hooper med Steve Railsback och Peter Firth. Handlingen inleds med att vi får följa en besättning på jakt efter Haleys komet, som upptäcker ett övergivet rymdskepp. Jag begrep inte riktigt allt som hände i filmen, men rymdvampyrer snor londonbornas själar, och endast Tom Carlsen kan stoppa dem. Visuellt är filmen en fröjd, men på det totala når det inte riktigt hela vägen fram. Betyg: 3/5.</p>



<p class="wp-block-paragraph">Film 97 av 100: Ring mamma! (2019) av Lisa Aschan med Sanna Sundqvist och Nina Gunke. En film som försöker driva med fenomenet att döttrar aldrig ges en chans att bli vuxna i en kravlös tillvaro. Bra idé med ett riktigt dåligt genomförande. Gunke brukar vara hyfsat bra, men Aschan har profilerat sig stadigt som riktigt dålig, och på den punkten levererar hon. Betyg: 1/5.</p>



<p class="wp-block-paragraph">Film 98 av 100: En frygtelig kvinde (2017) av Christian Tafdrup med Anders Juul och Amanda Collin. Ett konstnärligt dokument av fenomenet gaslighting. Vi får följa en man i hur han anpassar sig för att erhålla den kvinna han är kär i, och hennes godkännande. Resan från ”detta är lite tokigt” till ”detta är total galenskap” blir en överraskning under resans gång. Betyg: 5/5.</p>



<p class="wp-block-paragraph">Film 99 av 100: E.T. the Extra-Terrestrial (1982) av Steven Spielberg med Henry Thomas och Drew Barrymore. Rymdvarelse blir kvarlämnad på jorden, och under sina försök att hanka sig fram blir han vän med tre barn. Riktigt bra, väldigt snyggt, men lite sliskigare än Närkontakt av tredje graden. Spielberg var redan meriterad, men fortfarande ung, hungrig och intressant. Betyg: 4/5.</p>



<p class="wp-block-paragraph">Film 100 av 100: Fönstret åt gården (1954) av Alfred Hitchcock med James Stewart och Grace Kelly. En fotograf är tillfälligt rullstolsbunden och fast i sin lägenhet. Det enda nöjet är att betrakta sina grannar, och över tid formas historien om ett begått mord i huvudet på honom. Betyg: 5/5.</p>



<p class="wp-block-paragraph"><strong>Uppdatering 2024-07-19:</strong> <em><a href="https://www.winsoft.se/2024/07/100-filmer-till/">100 filmer till</a></em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2023/10/100-filmer/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Filmtips från Flimmer Duo</title>
		<link>https://www.winsoft.se/2023/10/filmtips-fran-flimmer-duo/</link>
					<comments>https://www.winsoft.se/2023/10/filmtips-fran-flimmer-duo/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sun, 01 Oct 2023 16:24:57 +0000</pubDate>
				<category><![CDATA[Pop culture]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17494</guid>

					<description><![CDATA[I det senaste avsnittet av Flimmer Duo tittar Henrik Andersson och jag på Night of the living dead från 1968. Du som gillar film bör hålla koll på Flimmer Duo och dessa länkar: YouTube-kanal: https://www.youtube.com/@flimmerduoRSS-flöde: https://80tal.se/feed/tag/flimmer-duo.rssHemsida: https://filmtips.winsoft.se/]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I det senaste avsnittet av <strong>Flimmer Duo</strong> tittar <strong>Henrik Andersson</strong> och jag på <strong>Night of the living dead</strong> från 1968.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Flimmer Duo: Night of the Living Dead (1968)" width="500" height="281" src="https://www.youtube.com/embed/WX4ktJFWNII?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p class="wp-block-paragraph">Du som gillar film bör hålla koll på Flimmer Duo och dessa länkar:</p>



<p class="wp-block-paragraph"><strong>YouTube-kanal:</strong> <a rel="noreferrer noopener" href="https://www.youtube.com/@flimmerduo" target="_blank">https://www.youtube.com/@flimmerduo</a><br><strong>RSS-flöde:</strong> <a href="https://80tal.se/feed/tag/flimmer-duo.rss" target="_blank" rel="noreferrer noopener">https://80tal.se/feed/tag/flimmer-duo.rss</a><br><strong>Hemsida:</strong> <a href="https://filmtips.winsoft.se/" target="_blank" rel="noreferrer noopener">https://filmtips.winsoft.se/</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2023/10/filmtips-fran-flimmer-duo/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Några knep för att få fart på Commodore BASIC i C64</title>
		<link>https://www.winsoft.se/2023/09/nagra-knep-for-att-fa-fart-pa-commodore-basic-i-c64/</link>
					<comments>https://www.winsoft.se/2023/09/nagra-knep-for-att-fa-fart-pa-commodore-basic-i-c64/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sun, 17 Sep 2023 15:19:17 +0000</pubDate>
				<category><![CDATA[Retro]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17490</guid>

					<description><![CDATA[Commodore BASIC 2.0 på Commodore 64 har några kända prestandaproblem, och denna enkla kod har implementerat några stycken: Programmet startar en tidtagning och 256 gånger görs en flyttalsberäkning och ett heltal skrivs till en minnesadress (16384). Programmet tar 327 jiffies i tid. (En jiffy är ungefär 1/60 sekund.) Att hitta ett radnummer tar tid, så [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Commodore BASIC 2.0 på Commodore 64 har några kända prestandaproblem, och denna enkla kod har implementerat några stycken:</p>



<pre class="wp-block-code"><code>10 S=TI
20 X=0.01
30 FOR A=0 TO 255
40 REM
50 REM
60 REM
70 X=X+0.01
80 POKE 16384,A
90 REM
100 REM
110 REM
120 NEXT
130 S=TI-S
140 PRINT "TIME" S
150 PRINT "RESULT " X</code></pre>



<p class="wp-block-paragraph">Programmet startar en tidtagning och 256 gånger görs en flyttalsberäkning och ett heltal skrivs till en minnesadress (16384). Programmet tar 327 <a href="https://www.c64-wiki.com/wiki/Jiffy_Clock" target="_blank" rel="noreferrer noopener">jiffies</a> i tid. (En jiffy är ungefär 1/60 sekund.)</p>



<p class="wp-block-paragraph">Att hitta ett radnummer tar tid, så om man optimerar genom att radera alla REM-satser, blir exekveringstiden istället 299 jiffies.</p>



<pre class="wp-block-code"><code>10 S=TI
20 X=0.01
30 FOR A=0 TO 255
70 X=X+0.01
80 POKE 16384,A
120 NEXT
130 S=TI-S
140 PRINT "TIME" S
150 PRINT "RESULT " X</code></pre>



<p class="wp-block-paragraph">Om man dessutom lägger alla radnummer tätt ihop, försvinner faktiskt en jiffie till.</p>



<pre class="wp-block-code"><code>0 S=TI
1 X=0.01
2 FOR A=0 TO 255
3 X=X+0.01
4 POKE 16384,A
5 NEXT
6 S=TI-S
7 PRINT "TIME" S
8 PRINT "RESULT " X</code></pre>



<p class="wp-block-paragraph">Att tolka ett heltal tar tid, så genom att skapa en variabel innehållande adressen 16384 behöver tolken bara göra det arbetet en gång.</p>



<pre class="wp-block-code"><code>0 S=TI
1 X=0.01
2 N=16384
3 FOR A=0 TO 255
4 X=X+0.01
5 POKE N,A
6 NEXT
7 S=TI-S
8 PRINT "TIME" S
9 PRINT "RESULT " X</code></pre>



<p class="wp-block-paragraph">Detta skalar bort ytterligare 81 jiffies, så att programmet nu inte tar mer än 217 jiffies. Den sista optimeringen vi kan göra, är bara lämplig när arbetet som utförs inte kräver att bildskärmen är aktiv. Genom att stänga av bildskärmen, försvinner en tidskrävande arbetsuppgift, vilket gör att processorn kan lägga mer fokus på BASIC-programmet. På adress 53265 ligger normalt värdet 27, vilket betyder att skärmen ska vara aktiv. Genom att sätta 11 på adressen, stänger man av skärmen, när arbetsuppgiften är klar, kan man aktivera skärmen igen genom att återställa värdet till 27.</p>



<pre class="wp-block-code"><code>0 POKE 53265,11
1 S=TI
2 X=0.01
3 N=16384
4 FOR A=0 TO 255
5 X=X+0.01
6 POKE N,A
7 NEXT
8 S=TI-S
9 PRINT "TIME" S
10 PRINT "RESULT " X
11 POKE 53265,27</code></pre>



<p class="wp-block-paragraph">Vi är nu nere på 205 jiffies för samma arbetsuppgift, vilket är 63% av ursprungstiden på 327 jiffies. BASIC är fortfarande lite för slött för att vara användbart när datorspel ska byggas, men om man väljer BASIC i kommersiell mjukvara, är det viktigt att göra rätt.</p>



<p class="wp-block-paragraph">De delar av <a rel="noreferrer noopener" href="https://www.c64-wiki.com/wiki/Pirates!" target="_blank">Pirates!</a> som inte kräver realtidsexekvering är faktiskt skrivna i BASIC, och även spelet Artworx <a href="https://en.wikipedia.org/wiki/Artworx" target="_blank" rel="noreferrer noopener">Strip Poker</a> var skrivet i BASIC.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2023/09/nagra-knep-for-att-fa-fart-pa-commodore-basic-i-c64/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>En Windows-komponent för Commodore-sprites</title>
		<link>https://www.winsoft.se/2023/08/en-windows-komponent-for-commodore-sprites/</link>
					<comments>https://www.winsoft.se/2023/08/en-windows-komponent-for-commodore-sprites/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Wed, 30 Aug 2023 18:02:18 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17486</guid>

					<description><![CDATA[En Windows Forms-komponent som kan presentera en Commodore 64-sprite är kanske inte vad man använder varje dag. Men jag har byggt en sådan (.NET Framework 4.8) för att isolera många tekniska bekymmer i den sprite-editor för C64 jag arbetar med. Om du vill leka med den, så finns den här: Paketet innehåller en GUI-komponent för [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">En Windows Forms-komponent som kan presentera en Commodore 64-sprite är kanske inte vad man använder varje dag. Men jag har byggt en sådan (.NET Framework 4.8) för att isolera många tekniska bekymmer i den sprite-editor för C64 jag arbetar med. Om du vill leka med den, <a rel="noreferrer noopener" href="https://www.nuget.org/packages/EditStateSprite/" target="_blank">så finns den här</a>:</p>



<pre class="wp-block-code"><code>Install-Package EditStateSprite</code></pre>



<p class="wp-block-paragraph">Paketet innehåller en GUI-komponent för att redigera pixeldata, en dialog för att modifiera färgpaletten, diverse funktioner för att manipulera en sprite samt funktioner för serialisering och deserialisering. Paketet uppdateras ganska ofta, eftersom jag ständigt hittar nya behov i sprite-editorn jag arbetar med. För att komma i gång:</p>



<pre class="wp-block-code"><code>_sprites.Add(new SpriteRoot(false));
spriteEditorControl1.ConnectSprite(_sprites&#91;0]);</code></pre>



<p class="wp-block-paragraph">Som exempel, om du vill spegelvända en sprite:</p>



<pre class="wp-block-code"><code>spriteEditorControl1.Flip(TwoWayDirection.LeftRight);
Invalidate();</code></pre>



<p class="wp-block-paragraph">Om du vill låta användaren ändra färgpaletten:</p>



<pre class="wp-block-code"><code>spriteEditorControl1.PickPaletteColors(this);
Invalidate();</code></pre>



<p class="wp-block-paragraph">Eller kanske läsa in ett sedan tidigare sparat dokument med C64-sprites:</p>



<pre class="wp-block-code"><code>_sprites.Load(@"D:\Temp\sprites.sprdef");
spriteEditorControl1.ConnectSprite(_sprites&#91;0]);
Invalidate();</code></pre>



<p class="wp-block-paragraph">Ett fungerande exempel <a rel="noreferrer noopener" href="https://github.com/Anders-H/EditStateSprite" target="_blank">finns att titta på här (TestProgram)</a>. Mycket nöje!</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="664" height="511" src="https://www.winsoft.se/wp-content/uploads/Untitled-1-3.jpg" alt="" class="wp-image-17487" srcset="https://www.winsoft.se/wp-content/uploads/Untitled-1-3.jpg 664w, https://www.winsoft.se/wp-content/uploads/Untitled-1-3-300x231.jpg 300w, https://www.winsoft.se/wp-content/uploads/Untitled-1-3-150x115.jpg 150w" sizes="auto, (max-width: 664px) 100vw, 664px" /></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2023/08/en-windows-komponent-for-commodore-sprites/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Vilket programmeringsspråk är enkelt?</title>
		<link>https://www.winsoft.se/2023/08/vilket-programmeringssprak-ar-enkelt/</link>
					<comments>https://www.winsoft.se/2023/08/vilket-programmeringssprak-ar-enkelt/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Fri, 25 Aug 2023 16:25:33 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17479</guid>

					<description><![CDATA[Frågan om vilka programmeringsspråk som är enkla brukar dyka upp från nybakade programmerare. Det är inte jättelätt att besvara frågan, för det finns så många aspekter som påverkar komplexiteten i ett programmeringsspråk. Är språket enkelt för att språket går att lära sig på kort tid? I så fall är C ett utmärkt enkelt språk. Du [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Frågan om vilka programmeringsspråk som är enkla brukar dyka upp från nybakade programmerare. Det är inte jättelätt att besvara frågan, för det finns så många aspekter som påverkar komplexiteten i ett programmeringsspråk. Är språket enkelt för att språket går att lära sig på kort tid? I så fall är C ett utmärkt enkelt språk. Du måste veta om att du ska skapa en <em>entry point</em> (alltså skriva <code>int main()</code>) och du måste förstå <code>#include</code>, men därefter är det bara att gasa på. Det totalt tre uppdelade i tre kategorier: <strong>Flödeskontroll</strong>, <strong>input/output</strong> och <strong>beräkningar</strong>.</p>



<p class="wp-block-paragraph">För <strong>flödeskontroll</strong> finns <em>beslut</em> (branschtermen är <em>branching</em>), <em>iterationer</em> (kallas ofta för <em>loopar</em>) och hopp. <strong>Input/output</strong> handlar om kommunikation med omvärlden, som t.ex. skärm, tangentbord eller printer (<code>printf</code>, <code>fread</code>, <code>fclose</code>). För <strong>beräkningar</strong> finns ett antal operatorer som <code>+</code>, <code>-</code>, <code>*</code> och <code>/</code> (med flera).</p>



<p class="wp-block-paragraph">Rent objektivt finns det inte särskilt mycket att lära sig kring språket C. Helt oavsett vilket programmeringsspråk man pratar om, så måste man lära sig de koncept som är kopplade till programmering &#8211; på den punkten kan inte ett språks enkelhet hjälpa till &#8211; men när man väl kan det, så är C definitivt enkelt.</p>



<p class="wp-block-paragraph">Ju enklare språket blir, desto enklare blir det att programmera. C erbjuder 32 nyckelord och en drös med operatorer, vilket man kan lära sig på en dag. Men hur omsätter man den kunskapen till att bygga t.ex. <em>Doom</em>? Eller <em>Heroes of Might and Magic</em>? Eller ens <em>Notepad</em>? Man måste veta hur man använder den specifika plattform man programmerar för, vilket verkligen är en utmaning i sig!</p>



<p class="wp-block-paragraph">C# är ett språk som betraktas som svårt att lära sig. Antalet instruktioner och nyckelord är enormt, antalet metoder som finns tillgängliga för att lösa en uppgift är stort. Om du som BASIC-programmerare har en vektor innehållande fem textsträngar som du ska skriva ut på skärmen så finns det typ en enda lösning, som ser ut så här:</p>



<pre class="wp-block-code"><code>FOR A=1 TO 5:PRINT S(A):NEXT A</code></pre>



<p class="wp-block-paragraph">I C# skulle tre olika lösningar på samma problem kunna se ut så här:</p>



<pre class="wp-block-code"><code>for (int i = 0; i &lt; s.Count; i++) Console.WriteLine(s&#91;i]);

foreach (var x in s) Console.WriteLine(x);

s.ForEach(Console.WriteLine);
</code></pre>



<p class="wp-block-paragraph">Men samtidigt, om man lär sig alla instruktioner och alla kommandon (vilket är svårt) så vet du vad som krävs för att bygga <em>Notepad</em>. Eller <em>Doom</em>. Eller rent av <em>Heroes of Might and Magic</em>. Det råder inga tvivel om att svärdet är tveeggat &#8211; antingen är språket enkelt men svårt att åstadkomma något i, eller så är språket komplicerat med enkelt att åstadkomma något i när man väl kan det.</p>



<p class="wp-block-paragraph">Titta gärna på skillnaden mellan Commodore BASIC och 6502 ASM för att skriva <code>HELLO WORLD</code> på skärmen. I BASIC blir det <code>PRINT "HELLO WORLD"</code>:</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Commodore 128 Hello world!" width="500" height="281" src="https://www.youtube.com/embed/RJZ2FG4nPSI?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2023/08/vilket-programmeringssprak-ar-enkelt/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Standardvärden som skickas till en metod i C#</title>
		<link>https://www.winsoft.se/2023/08/standardvarden-som-skickas-till-en-metod-i-c/</link>
					<comments>https://www.winsoft.se/2023/08/standardvarden-som-skickas-till-en-metod-i-c/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Tue, 15 Aug 2023 16:14:27 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17476</guid>

					<description><![CDATA[I C# kan standardvärden (default value) på en parameter i en metod sättas både i själva metoddeklarationen i klassen som håller metoden och i eventuella interfaces som klassen ärver ifrån. Dessa standardvärden behöver inte stämma överens med varandra, så vilket är det som gäller? Det är inte instansens typ utan variabelns typ som avgör parameterns [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I C# kan standardvärden (<em>default value</em>) på en parameter i en metod sättas både i själva metoddeklarationen i klassen som håller metoden och i eventuella interfaces som klassen ärver ifrån. Dessa standardvärden behöver inte stämma överens med varandra, så vilket är det som gäller? Det är inte instansens typ utan variabelns typ som avgör parameterns standardvärde. Det innebär att man kan typomvandla för att styra vilka parametrar som skickas till en metod. Här är det de upprepade typomvandlingarna som gör att resultatet blir <strong>Good Day To You Sir</strong>:</p>



<pre class="wp-block-code"><code>var a = new A();
(a as B).X();
(a as C).X();
(a as D).X();
(a as E).X();
(a as F).X();

class A : B, C, D, E, F
{
    public void X(string y) => Console.WriteLine(y);
}

interface B { void X(string y = "Good"); }
interface C { void X(string y = "Day"); }
interface D { void X(string y = "To"); }
interface E { void X(string y = "You"); }
interface F { void X(string y = "Sir"); }</code></pre>



<p class="wp-block-paragraph">Vill man vara riktigt äventyrlig så kan man skriva en iteration som tittar på den exakta arvslistan som är placerad på klassen <strong>A</strong>. Här är det den kommaseparerade listan som avgör vilket standardvärde som används.</p>



<pre class="wp-block-code"><code>var a = new A();

foreach (var p in typeof(A).GetInterfaces())
{
    var m = p.GetMethods().Where(p => p.Name == "X").First();
    m.Invoke(a, new&#91;] { m.GetParameters().First().DefaultValue });
}

class A : B, C, D, E, F
{
    public void X(string y) => Console.WriteLine(y);
}

interface B { void X(string y = "Good"); }
interface C { void X(string y = "Day"); }
interface D { void X(string y = "To"); }
interface E { void X(string y = "You"); }
interface F { void X(string y = "Sir"); }</code></pre>



<p class="wp-block-paragraph">Resultatet är återigen <strong>Good Day To You Sir</strong>. Egentligen inte helt ologiskt, om du någon gång funderar på vad som styr vilket standardvärde som skickas till parametern i din funktion, så titta på variabelns typ.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2023/08/standardvarden-som-skickas-till-en-metod-i-c/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Det finns enorma optimeringsmöjligheter när man använder GDI från .NET</title>
		<link>https://www.winsoft.se/2023/07/det-finns-enorma-optimeringsmojligheter-nar-man-anvander-gdi-fran-net/</link>
					<comments>https://www.winsoft.se/2023/07/det-finns-enorma-optimeringsmojligheter-nar-man-anvander-gdi-fran-net/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Mon, 17 Jul 2023 14:58:03 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17471</guid>

					<description><![CDATA[När man ska jobba med bitmapsgrafik i .NET är prestanda en ständigt återkommande utmaning. I .NET har vi dels tillgång till GDI (som låter oss rita pixlar individuellt) och något som kallas för GDI+, som erbjuder möjligheten att rita geometriska figurer på skärmen. GDI är numera en del av GDI+, så båda biblioteken exponeras i [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">När man ska jobba med bitmapsgrafik i .NET är prestanda en ständigt återkommande utmaning. I .NET har vi dels tillgång till <a rel="noreferrer noopener" href="https://en.wikipedia.org/wiki/Graphics_Device_Interface" target="_blank">GDI</a> (som låter oss rita pixlar individuellt) och något som kallas för GDI+, som erbjuder möjligheten att rita geometriska figurer på skärmen. GDI är numera en del av GDI+, så båda biblioteken exponeras i namnrymden <code>System.Drawing</code>. Den viktigaste klassen för den som jobbar med GDI heter <code>Bitmap</code> och den viktigaste klassen för den som jobbar med GDI+ heter <code>Graphics</code>.</p>



<p class="wp-block-paragraph">Som parentes vill jag nämna att .NET inte är ett ramverk utan två. Dels har vi .NET Framework och dels har vi det ramverk som kort och gott heter .NET (tidigare .NET Core). Jag väljer i princip alltid .NET (tidigare .NET Core) eftersom det är ett mer moget ramverk, det finns tillgängligt på flest operativsystem (Mac, Linux, Android, m.fl.) och för att du får arbeta i senare versioner av C# i .NET. Det enda motivet att välja .NET Framework är att appar byggda för .NET Framework 4.8 fungerar out-of-the-box på Windows 10 eller senare och uppdateras via Windows Update. Eftersom GDI är en Windows-feature är jag inte intresserad av plattformsoberoendet och väljer därför .NET Framework 4.8 och C# 7.3 för dessa exempel.</p>



<p class="wp-block-paragraph">Använder man Visual Studio med tillägget för skrivbordsapplikationer, är det bara att välja en projektmall för Windows Forms och .NET Framework, men kör man Visual Studio Code eller någon annan editor, måste man specificera i projektfilen att man vill ha <code>TargetFrameworkVersion</code> satt till <code>v4.8</code>, att <code>OutputType</code> ska vara <code>WinExe</code> och att namnrymderna <code>System.Windows.Forms</code> och <code>System.Drawing</code> ska vara refererade.</p>



<p class="wp-block-paragraph">Låt oss titta på detta program. Det ritar en rektangel (500&#215;500 pixlar) på skärmen varje gång man klickar med musen. Rektangeln ritas röd- och gulrandig på en slumpvis vald plats. Hela operationen klockas.</p>



<pre class="wp-block-code"><code>using System;
using System.Diagnostics;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        private static Random _rnd = new Random();
        private Bitmap Rectangle { get; set; }
        private int PositionX { get; set; }
        private int PositionY { get; set; }

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_MouseClick(object sender, MouseEventArgs e)
        {
            PositionX = _rnd.Next(300);
            PositionY = _rnd.Next(300);

            // Städa upp minnet.
            Rectangle?.Dispose();

            Rectangle = new Bitmap(500, 500);

            // Rita en randig rektangel.
            var c1 = Color.FromArgb(255, 0, 0);
            var c2 = Color.FromArgb(255, 255, 0);

            var stopwatch = new Stopwatch();
            stopwatch.Start();

            for (var y = 0; y &lt; 500; y++)
            {
                var currentColor = y%2 == 0 ? c1 : c2;

                for (var x = 0; x &lt; 500; x++)
                {
                    Rectangle.SetPixel(x, y, currentColor);
                }
            }

            // Skriv ut hur lång tid operationen tog.
            stopwatch.Stop();
            Text = stopwatch.ElapsedMilliseconds.ToString();

            // Uppdatera skärmen (Form1_Paint kommer att anropas).
            Invalidate();
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            if (Rectangle == null)
                return;

            // Här utförs uppdateringen av skärmen.
            e.Graphics.Clear(Color.White);
            e.Graphics.DrawImage(Rectangle, PositionX, PositionY);
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            // Städa upp minnet.
            Rectangle?.Dispose();
        }
    }
}</code></pre>



<p class="wp-block-paragraph">Hela operationen tar ungefär 140 millisekunder oavsett om programmet är debug- eller release-kompilerat.</p>



<p class="wp-block-paragraph">Funktionen <code>SetPixel</code> är central för att detta ska fungera. Den har Microsoft skrivit åt oss i C#, och använder i sin tur GDI i Windows för att få pixeln satt på skärmen. Om vi läser källkoden så ser vi att den gör en del tester som säkerställer att funktionen används korrekt, för att sedan anropa <code>GdipBitmapSetPixel</code> i biblioteket <code>gdiplus.dll</code> som är skrivet i C++.</p>



<p class="wp-block-paragraph">Vi skulle kunna optimera bort testerna, men jag förstår att Microsoft fill ha med dem, eftersom de tänker att det måste vara bättre med ett program som är lite slöare än ett program som kraschar om någon gör ett fel, som t.ex. att försöka rita en pixel på en bitmapsbild vars position ligger utanför bildens storlek.</p>



<p class="wp-block-paragraph">En annan mindre viktig detalj är att för varje pixel som ritas, tar <code>SetPixel</code> en färg som är en struktur av en röd, grön och blå byte, som ska konverteras till en int. Konverteringen är gjord i förväg av färgstrukturen, men det blir ett extra funktionsanrop och en extra typomvandling.</p>



<p class="wp-block-paragraph">Dessa optimeringar får man såklart gärna titta på, om man vill få ut så hög prestanda man bara kan i sin renderingsrutin. Men den viktigaste faktorn handlar om låsning av minnet. När man ritar pixlar ska man erhålla ett lås för att skydda minnet, som man sedan släpper när man är färdig. Som <code>SetPixel</code> är implementerad, skapas och släpps ett lås för varje pixel som sätts, vilket kostar. Att göra en egen implementation som håller låset tills alla pixlar är ritade, är inte särskilt svårt, men det ställer lite högre krav på den som använder implementationen. Och det kanske var därför som Microsoft valde den väg man valde &#8211; säkerhet framför prestanda. Trots allt är tanken med C# att det ska vara mer lättillgängligt än t.ex. C++.</p>



<p class="wp-block-paragraph">Ett exempel på denna lättillgänglighet är att C#-kompilatorn helt enkelt inte tillåter användandet av pointers såvida man inte först deklarerar att man tänker göra så, vilket man gör med nyckelordet <code>unsafe</code>. Det är till och med så att nyckelordet <code>unsafe</code> inte får användas om vi inte sätter <code>AllowUnsafeBlocks</code> till <code>true</code> i projektfilen!</p>



<p class="wp-block-paragraph">För att undvika att minnet blir låst för varje pixel som ritas, måste vi undvika den inbyggda funktionen <code>SetPixel</code>. Och om vi manipulerar minnet utan att använda den inbyggda funktionen <code>SetPixel</code>, måste vi manuellt låsa minnet när vi börjar arbeta och låsa upp det när vi är klara.</p>



<p class="wp-block-paragraph">Funktionen <code>LockBits</code> behöver kunna räkna ut hur mycket minne som ska låsas och behöver därför veta bildens storlek (500&#215;500 pixlar) samt vilket pixelformat som används. Jag utnyttjar bara 24 bitar (röd x grön x blå) men arbetar med 32 bitar (alfa x röd x grön x blå), så därför anger jag pixelformatet <code>Format32bppArgb</code>. Svaret från funktionen <code>LockBits</code> används för att berätta för funktionen <code>UnlockBits</code> vad som ska låsas upp, så det vill man ta hand om.</p>



<p class="wp-block-paragraph">Sist men inte minst måste färgen på pixlarna sättas. Tidigare var det bara ytterligare en parameter till SetPixel, men nu måste även det göras manuellt. Eftersom vi arbetar i 24 bitar, kan vi använda en fyra bytes stor pointer, <code>Scan0</code>.</p>



<pre class="wp-block-code"><code>using System;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        private static Random _rnd = new Random();
        private Bitmap Rectangle { get; set; }
        private int PositionX { get; set; }
        private int PositionY { get; set; }

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_MouseClick(object sender, MouseEventArgs e)
        {
            PositionX = _rnd.Next(300);
            PositionY = _rnd.Next(300);

            // Städa upp minnet.
            Rectangle?.Dispose();

            var bits = new int&#91;500 * 500];
            var bitsHandle = GCHandle.Alloc(bits, GCHandleType.Pinned);
            Rectangle = new Bitmap(500, 500, 500 * 4,
                PixelFormat.Format32bppArgb,
                bitsHandle.AddrOfPinnedObject());

            // Rita en randig rektangel.
            var c1 = Color.FromArgb(255, 0, 0).ToArgb();
            var c2 = Color.FromArgb(255, 255, 0).ToArgb();

            var stopwatch = new Stopwatch();
            stopwatch.Start();

            var data = Rectangle.LockBits(
                new Rectangle(0, 0, 500, 500),I
                mageLockMode.ReadWrite,
                PixelFormat.Format32bppArgb);

            unsafe
            {
                var bytes = (byte*)data.Scan0;

                for (var y = 0; y &lt; 500; y++)
                {
                    for (var x = 0; x &lt; 500; x++)
                    {
                        var index = x + y * 500;
                        bits&#91;index] = y % 2 == 0 ? c1 : c2;
                    }

                    bytes++;
                }
            }

            Rectangle.UnlockBits(data);
            bitsHandle.Free();

            // Skriv ut hur lång tid operationen tog.
            stopwatch.Stop();
            Text = stopwatch.ElapsedMilliseconds.ToString();

            // Uppdatera skärmen (Form1_Paint kommer att anropas).
            Invalidate();
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            if (Rectangle == null)
                return;

            // Här utförs uppdateringen av skärmen.
            e.Graphics.Clear(Color.White);
            e.Graphics.DrawImage(Rectangle, PositionX, PositionY);
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            // Städa upp minnet.
            Rectangle?.Dispose();
        }
    }
}</code></pre>



<p class="wp-block-paragraph">Och skillnaden går inte av för hackor! Den lite mer komplicerade koden till trots, nu går samma operation på en (!) millisekund! Man kan alltså lugnt konstatera att om prestanda är viktigt, så bör man kringgå funktionen <code>SetPixel</code>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2023/07/det-finns-enorma-optimeringsmojligheter-nar-man-anvander-gdi-fran-net/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ChatGPT kan lyssna på podcasts åt dig</title>
		<link>https://www.winsoft.se/2023/05/chatgpt-kan-lyssna-pa-podcasts-at-dig/</link>
					<comments>https://www.winsoft.se/2023/05/chatgpt-kan-lyssna-pa-podcasts-at-dig/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Mon, 29 May 2023 15:57:04 +0000</pubDate>
				<category><![CDATA[Science]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17463</guid>

					<description><![CDATA[Med tanke på hur snabbt utvecklingen går, kommer denna text snart vara inaktuell eller felaktig. Men jag har upptäckt att jag kan konsumera enorma mängder information på väldigt kort tid genom att låta ChatGPT lyssna på poddar åt mig. Vill du själv testa behöver du ha tillgång till Office 365 och ett konto som låter [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Med tanke på hur snabbt utvecklingen går, kommer denna text snart vara inaktuell eller felaktig. Men jag har upptäckt att jag kan konsumera enorma mängder information på väldigt kort tid genom att låta ChatGPT lyssna på poddar åt mig.</p>



<p class="wp-block-paragraph">Vill du själv testa behöver du ha tillgång till Office 365 och ett konto som låter dig använda ChatGPT Plus.</p>



<p class="wp-block-paragraph"><strong>1. Ladda hem den podcast du är nyfiken på.</strong> Spara den som fil.</p>



<p class="wp-block-paragraph"><strong>2. Starta Word i Office 365. Klicka <em>transkribera</em></strong> och välj den podcast du nyss laddade hem. Spara texten i PDF-format och placera dokumentet på en webbserver. Har du ingen egen, kan du använda <a rel="noreferrer noopener" href="https://askyourpdf.com/upload" target="_blank">https://askyourpdf.com/upload</a>. Dokumentet hamnar på askyoutpdf.com ändå när du använder det från ChatGPT.</p>



<p class="wp-block-paragraph">Om du har ett pluskonto för ChatGPT kan du köra version 4.0. När versionen är vald, kan du gå in i inställningarna och aktivera stöd för tilläggsprogram (plugins). Kontrollera att detta är gjort. Därefter, håll musen över GPT-4 (i mitten längst upp i ChatGPT) och klicka Plugins. Du får godkänna ett avtal, och därefter kan du välja vilken plugin du vill använda. Ser du redan texten <em>No plugins enabled</em> kan du klicka där för att få välja plugins. Installera den som heter <em>AskYourPDF</em>. Du bör nu se en gul symbol som indikerar att denna är vald.</p>



<p class="wp-block-paragraph"><strong>3. Ställ en fråga.</strong> Se till att det framgår vilket dokument du frågar om. I sin allra enklaste form kan du fråga om en summering. Exempelvis:</p>



<p class="wp-block-paragraph"><em>Vad handlar den här texten om? [Korrekt länk till dokumentet]</em></p>



<p class="wp-block-paragraph">Så här kan ett svar se ut:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="581" height="301" src="https://www.winsoft.se/wp-content/uploads/podcast.jpg" alt="" class="wp-image-17464" srcset="https://www.winsoft.se/wp-content/uploads/podcast.jpg 581w, https://www.winsoft.se/wp-content/uploads/podcast-300x155.jpg 300w, https://www.winsoft.se/wp-content/uploads/podcast-150x78.jpg 150w" sizes="auto, (max-width: 581px) 100vw, 581px" /></figure>



<p class="wp-block-paragraph">Sen kan man fortsätta att analysera dokumentet. T.ex. fråga om det finns några självmotsägelser i texten, och efter några sekunder listas påståenden som kan tolkas som felaktiga eller självmotsägande. Och så vidare.</p>



<p class="wp-block-paragraph">Genom att arbeta på detta sätt kan du ha fått till dig innehållet i en 40 minuter lång podcast på bara en eller ett par minuter, och dessutom fått eventuella felaktigheter i det som sägs utpekade för dig.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2023/05/chatgpt-kan-lyssna-pa-podcasts-at-dig/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Change configuration values in runtime in .NET Framework</title>
		<link>https://www.winsoft.se/2023/05/change-configuration-values-in-runtime-in-net-framework/</link>
					<comments>https://www.winsoft.se/2023/05/change-configuration-values-in-runtime-in-net-framework/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Wed, 10 May 2023 16:41:16 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17458</guid>

					<description><![CDATA[I stumpled upon the problem of having to change the configuration values in an old .NET Framework 4.0 system while it is running, and it has been possible to do since .NET Framework 2.0. The compiled App.config file will be named like the assembly it belongs to with the ending .config added to it (e.g. [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I stumpled upon the problem of having to change the configuration values in an old .NET Framework 4.0 system while it is running, and it has been possible to do since .NET Framework 2.0.</p>



<p class="wp-block-paragraph">The compiled App.config file will be named like the assembly it belongs to with the ending .config added to it (e.g. MyProgram.exe.config). Even if your settings are read from and/or used in a DLL, the settings should be written in the main program&#8217;s configuration file, not the DLL&#8217;s own config file.</p>



<p class="wp-block-paragraph">You might know that a running system will load its settings when they are referenced by the ConfigurationManager and keep the settings in memory for the rest of the session, meaning that if you edit the config-file, it will probably have no effect.</p>



<p class="wp-block-paragraph">If you want to use dynamic loading of the config file, you should consider declaring a custom section in the config file. You can of course put all your settings in the appSettings section, but then reloading your settings will be an all or nothing deal. The upside of using appSettings is that it is pre-defined (just like connectionStrings), meaning that you can access them directly from the ConfigurationManager. For your own sections, you need to declare your own variables to store the settings.</p>



<p class="wp-block-paragraph">This sample shows how to first register a section named featureToggle and then fill it with only one setting called Test. Remember that this is done in the main executable&#8217;s App.config file, no matter where the setting is read or used.</p>



<pre class="wp-block-code"><code>&lt;configuration>

  &lt;configSections>
    &lt;section name="featureToggle"
       type="System.Configuration.AppSettingsSection"/>
  &lt;/configSections>

  &lt;featureToggle>
    &lt;add key="Test" value="Test value is here!"/>
  &lt;/featureToggle>

&lt;/configuration></code></pre>



<p class="wp-block-paragraph">A reference to System.Configuration is needed for the code to work.</p>



<p class="wp-block-paragraph">Like mentioned, if you were using the appSettings section, you could just run this line of code, and your settings will be reloaded:</p>



<pre class="wp-block-code"><code>ConfigurationManager.RefreshSection("appSettings");</code></pre>



<p class="wp-block-paragraph">But in this case, I am using a custom section called featureToggle, so I have to both refresh the section and save the section in my variable.</p>



<pre class="wp-block-code"><code>ConfigurationManager.RefreshSection("featureToggle");

_toggles = (NameValueCollection)ConfigurationManager
    .GetSection("featureToggle");</code></pre>



<p class="wp-block-paragraph">The NameValueCollection is found in the System.Collections.Specialized namespace.</p>



<p class="wp-block-paragraph">If the _toggles (of type NameValueCollection) variable is initialized in a constructor of a custom configuration class, the constructor will contain the second of the two lines above. And both lines will be needed if you have some sort of reload method in the custom configuration class.</p>



<p class="wp-block-paragraph">The actual values in the config files are accessed via the _toggles variable, like so:</p>



<pre class="wp-block-code"><code>public string Test
{
    get
    {
        return _toggles&#91;"Test"];
    }
}</code></pre>



<p class="wp-block-paragraph">Good luck with your source code archeology work!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2023/05/change-configuration-values-in-runtime-in-net-framework/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>A JS implementation of the Harter-Heighway Dragon Curve</title>
		<link>https://www.winsoft.se/2023/04/a-js-implementation-of-the-harter-heighway-dragon-curve/</link>
					<comments>https://www.winsoft.se/2023/04/a-js-implementation-of-the-harter-heighway-dragon-curve/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Mon, 24 Apr 2023 17:15:59 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[General]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17454</guid>

					<description><![CDATA[Five years ago, I did a post in Swedish on the Harter-Heighway Dragon Curve, with C# source code. I have translated that code to JavaScript and added animation to the rendering. The fractal describes a way of folding a piece of paper so that its outline takes up a surface. Anyone who has read the [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Five years ago, I did a <a href="https://www.winsoft.se/2018/01/harter-heighways-drakkurva/">post in Swedish on the Harter-Heighway Dragon Curve, with C# source code</a>. I have translated that code to JavaScript and added animation to the rendering. The fractal describes a way of folding a piece of paper so that its outline takes up a surface. Anyone who has read the book Jurassic Park has probably seen the fractal depicted.</p>



<p class="wp-block-paragraph">The <a href="https://github.com/Anders-H/HarterHeighwayDragonCurve" target="_blank" rel="noreferrer noopener">repository is located here</a> and a <a href="https://winsoft.se/temp/dragoncurve.html" target="_blank" rel="noreferrer noopener">live demo is available here</a>.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="802" height="602" src="https://www.winsoft.se/wp-content/uploads/dragoncurve-1.jpg" alt="" class="wp-image-17455" srcset="https://www.winsoft.se/wp-content/uploads/dragoncurve-1.jpg 802w, https://www.winsoft.se/wp-content/uploads/dragoncurve-1-300x225.jpg 300w, https://www.winsoft.se/wp-content/uploads/dragoncurve-1-150x113.jpg 150w, https://www.winsoft.se/wp-content/uploads/dragoncurve-1-768x576.jpg 768w" sizes="auto, (max-width: 802px) 100vw, 802px" /></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2023/04/a-js-implementation-of-the-harter-heighway-dragon-curve/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Return by reference</title>
		<link>https://www.winsoft.se/2023/04/return-by-reference/</link>
					<comments>https://www.winsoft.se/2023/04/return-by-reference/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Thu, 13 Apr 2023 14:25:31 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17448</guid>

					<description><![CDATA[Om inget annat anges skickas parametrar till funktioner &#8220;by value&#8221; i C#. Det innebär att den mottagande funktionen får en egen kopia av värdet som skickas. Att skicka &#8220;by reference&#8221; (nyckelordet ref) skiljer sig därmed, eftersom funktionen får en referens till ursprungsvariabeln. För en referensvariabel (som myValue i exemplet nedan) innebär &#8220;värdet&#8221; en referens till [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Om inget annat anges skickas parametrar till funktioner &#8220;by value&#8221; i C#. Det innebär att den mottagande funktionen får en egen kopia av värdet som skickas. Att skicka &#8220;by reference&#8221; (nyckelordet ref) skiljer sig därmed, eftersom funktionen får en referens till ursprungsvariabeln. För en referensvariabel (som myValue i exemplet nedan) innebär &#8220;värdet&#8221; en referens till objektet av typen MyValue, vilket innebär att även om m (i MyFunction) är en kopia av myValue, så refererar både m och myValue till samma objekt på heapen. Så när den instansen ändras genom m i funktionen MyFunction, så slår det igenom på myValue.</p>



<pre class="wp-block-code"><code>var myValue = new MyValue {X = 10};
MyFuction(myValue);
Console.WriteLine(myValue.X);

void MyFuction(MyValue m)
{
    m.X = 20;
}

public class MyValue
{
    public int X { get; set; }
}</code></pre>



<p class="wp-block-paragraph">Resultatet av körningen blir alltså 20.<br>Vill man se skillnaden mellan att skicka referenstyper &#8220;by value&#8221; och &#8220;by reference&#8221; så kan man tilldela ett nytt värde till själva variabeln (m). Eftersom värdet i m är en kopia av värdet i myValue, men myValue är en referensvariabel, kan vi sätta m till en ny referens utan att påverka ursprungsvariabeln myValue.</p>



<pre class="wp-block-code"><code>var myValue = new MyValue {X = 10};
MyFuction(myValue);
Console.WriteLine(myValue.X);

void MyFuction(MyValue m)
{
    m = new MyValue {X = 20};
}

public class MyValue
{
    public int X { get; set; }
}</code></pre>



<p class="wp-block-paragraph">Resultatet av körningen är 10, eftersom ursprungsvärdet inte förändrades. Variabeln m fick ett nytt objekt att referera till.<br>Skulle däremot parametern skickas in &#8220;by reference&#8221;, skriver new över ursprungsvärdet i myValue, så att den pekar på det nya objektet.</p>



<pre class="wp-block-code"><code>var myValue = new MyValue {X = 10};
MyFuction(ref myValue);
Console.WriteLine(myValue.X);

void MyFuction(ref MyValue m)
{
    m = new MyValue {X = 20};
}

public class MyValue
{
    public int X { get; set; }
}</code></pre>



<p class="wp-block-paragraph">Resultatet av körningen blir därför 20.</p>



<p class="wp-block-paragraph">Funktioner som ger en retur, ger den &#8220;by value&#8221;, och det kan vara värt att tänka på om man hanterar större värdetyper. Koden nedan utför just ingenting, men trots att myValue skickas in &#8220;by reference&#8221; ska skapas en kopia vid return. Eftersom det som kopieras är en referensvariabel så är inte priset särskilt högt, men variabeln kopieras likväl.</p>



<pre class="wp-block-code"><code>var myValue = new MyValue { X = 10 };
myValue = MyFuction(ref myValue);
Console.WriteLine(myValue.X);

MyValue MyFuction(ref MyValue m)
{
    return m;
}

public class MyValue
{
    public int X { get; set; }
}</code></pre>



<p class="wp-block-paragraph">Precis som argument kan tas emot &#8220;by value&#8221; eller &#8220;by reference&#8221; kan även returer ske &#8220;by value&#8221; eller &#8220;by reference&#8221;, och precis som med argument så är det &#8220;by value&#8221; som gäller om inget annat sägs. Betrakta följande kod:</p>



<pre class="wp-block-code"><code>var x = 10;
var y = DoSomething(ref x);
x++;
Console.WriteLine(y);

int DoSomething(ref int x)
{
    x++;
    return x;
}</code></pre>



<p class="wp-block-paragraph">Rad 4 ger 11. Eftersom värdet kopieras på return-satsen, är det kopian som ökas till 12 på rad 3. Genom att skicka tillbaka värdet &#8220;by reference&#8221; får man 12:</p>



<pre class="wp-block-code"><code>var x = 10;
ref int y = ref DoSomething(ref x);
x++;
Console.WriteLine(y);

ref int DoSomething(ref int x)
{
    x++;
    return ref x;
}</code></pre>



<p class="wp-block-paragraph">Att skicka tillbaka värden &#8220;by reference&#8221; kan dels undvika att stora strukturer kopieras där det inte är önskvärt, och skulle t.ex. kunna användas för att låta annan kod manipulera ett element i en array. I detta exempel ger funktionen GiveElement ut ett element extern kod att manipulera.</p>



<pre class="wp-block-code"><code>var arr = new&#91;]{1,2,3,4,5};

foreach (var i in arr)
    Console.WriteLine(i);

ref int x = ref GiveElement(ref arr);

x = 10;

foreach (var i in arr)
    Console.WriteLine(i);

ref int GiveElement(ref int&#91;] arr)
{
    return ref arr&#91;3];
}</code></pre>



<p class="wp-block-paragraph">Andra gången arrayen skrivs ut, är värdet av det fjärde elementet (index 3) ändrat till 10.</p>



<p class="wp-block-paragraph">Del 1/2: <a href="https://www.winsoft.se/2023/04/referenstyper-eller-vardetyper/">Referenstyper eller värdetyper</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2023/04/return-by-reference/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Referenstyper eller värdetyper?</title>
		<link>https://www.winsoft.se/2023/04/referenstyper-eller-vardetyper/</link>
					<comments>https://www.winsoft.se/2023/04/referenstyper-eller-vardetyper/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Tue, 11 Apr 2023 15:45:35 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17443</guid>

					<description><![CDATA[Programmeringsspråket C# skiljer på referenstyper och värdetyper. I andra högnivåspråk, som t.ex. Java, har man fram till nyligen bara antagit att egna typer är referenstyper, men som C#-programmerare tvingas man då och då att tänka på skillnaden mellan att skapa egna referenstyper och värdetyper. Konsekvenser för användandet har förändrats en aning över olika versioner av [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Programmeringsspråket C# skiljer på referenstyper och värdetyper. I andra högnivåspråk, som t.ex. Java, har man fram till nyligen bara antagit att egna typer är referenstyper, men som C#-programmerare tvingas man då och då att tänka på skillnaden mellan att skapa egna referenstyper och värdetyper. Konsekvenser för användandet har förändrats en aning över olika versioner av C#, men den grundläggande skillnaden är fortfarande att referenstyper lägger sitt data på heapen medan värdetyper lägger sitt data på stacken.</p>



<p class="wp-block-paragraph"><br>Det innebär att referenstyper är mer kapabla och mer flexibla, men mindre effektiva än värdetyper. Instanser av båda typerna lever alltså på stacken, men referenstyper heter som de gör för att de inte håller sitt data där &#8211; referenstypen håller en referens till sitt data som ligger någonstans på heapen.</p>



<p class="wp-block-paragraph"><br>Traditionellt har man oftast valt att skapa egna typer som referenstyper i C#, för att de är mer kapabla, särskilt förr. Du har kunnat åstadkomma mer med nyckelordet class än med nyckelordet struct, men idag håller den skillnaden på att suddas ut. Hanteringen av null skiljer sig också mellan dessa, men även det håller på att unifieras, åtminstone på ytan. Tidigare fanns en enkel regel: Instanser av referenstyper var null tills de initierats, medan värdetyper hade ett (annat) defaultvärde tills de initierats. Numera förväntas man deklarera per variabel vilken som kan vara null.</p>



<p class="wp-block-paragraph"><br>Av följande medlemsvariabler är a och b värdetyper, c och d referenstyper. Endast variabel a har ett värde som inte är null:</p>



<p class="wp-block-paragraph"><br><code>private int a;<br>private int? b;<br>private string c;<br>private string? d;</code><br></p>



<p class="wp-block-paragraph">Eftersom a är en värdetyp som inte är nullable, får den sitt default-värde som är 0. Eftersom b är en värdetyp som är nullable, får den sitt default-värde som är null. Både c och d är referenstyper och initieras därför till null, men kompilatorn kommer att bevaka att c får ett värde och att den hanteras som om den alltid är initierad, eftersom den inte är märkt som nullable.</p>



<p class="wp-block-paragraph"><br>De typer du själv utvecklar bör vara referenstyper (class) om de är komposittyper av andra typer eller om datamängden variabel och gärna lite större. Du bör välja att skapa värdetyper (struct) om instanserna är kortlivade eller utgör en del av en komposittyp. Om instanserna är immutable kan det också vara värt att överväga att låta typen vara en värdetyp.</p>



<p class="wp-block-paragraph">Del 2/2: <a href="https://www.winsoft.se/2023/04/return-by-reference/">Return by reference</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2023/04/referenstyper-eller-vardetyper/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>How to fix the endless explorer.exe crash-and-restart loop in Windows 11</title>
		<link>https://www.winsoft.se/2023/03/how-to-fix-the-endless-explorer-exe-crash-and-restart-loop-in-windows-11/</link>
					<comments>https://www.winsoft.se/2023/03/how-to-fix-the-endless-explorer-exe-crash-and-restart-loop-in-windows-11/#comments</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Wed, 15 Mar 2023 15:23:22 +0000</pubDate>
				<category><![CDATA[Geeky]]></category>
		<category><![CDATA[Windows 11]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17440</guid>

					<description><![CDATA[After updating Windows 11 to 22621.1413, it got stuck in an endless loop after startup. The desktop environment, explorer.exe, crashed and restarted continuously. This can happen if you are running add-ons on top of explorer.exe, and in my case, I had ExplorerPatcher installed. When this happens, press Ctrl+Alt+Delete and start Task Manager. Find explorer.exe and [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">After updating Windows 11 to 22621.1413, it got stuck in an endless loop after startup. The desktop environment, <strong>explorer.exe</strong>, crashed and restarted continuously. This can happen if you are running add-ons on top of explorer.exe, and in my case, I had ExplorerPatcher installed.</p>



<p class="wp-block-paragraph">When this happens, press Ctrl+Alt+Delete and start Task Manager. Find explorer.exe and terminate it. It is not easy because the list flickers, and you need to send the command when the program is actually running. This will stop the flickering of the screen and the system will be free to do other tasks than restarting explorer.exe.</p>



<p class="wp-block-paragraph">At this point, you cannot run modern UI applications like your computer settings, but you can run classic apps that use the native Windows GUI, like the old control panel. To get the old app for uninstalling applications, run <strong>appwiz.cpl</strong>. From there you can uninstall whatever extension that causes explorer.exe to crash, in my case ExplorerPatcher.</p>



<p class="wp-block-paragraph">Now I have to wait for this problem to be fixed before I can install it again. ExplorerPatcher is a program that I really appreciate.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2023/03/how-to-fix-the-endless-explorer-exe-crash-and-restart-loop-in-windows-11/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Inverterat läge på VIC-20</title>
		<link>https://www.winsoft.se/2023/02/inverterat-lage-pa-vic-20/</link>
					<comments>https://www.winsoft.se/2023/02/inverterat-lage-pa-vic-20/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Tue, 28 Feb 2023 17:59:49 +0000</pubDate>
				<category><![CDATA[Geeky]]></category>
		<category><![CDATA[VIC-20]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17434</guid>

					<description><![CDATA[VIC-20 har en gemensam minnesadress som håller reda både på skärmens bakgrundsfärg och borderfärg. Dessutom finns en bit som håller reda på om inverterat läge används. Adressen är 36879, och de åtta bitarna på adressen beskriver borderfärg (bit 0-2), inverterat läge (bit 3) och bakgrundsfärg (bit 4-7). Inverterat läge är avstängt om bit 3 är [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">VIC-20 har en gemensam minnesadress som håller reda både på skärmens bakgrundsfärg och borderfärg. Dessutom finns en bit som håller reda på om <em>inverterat läge</em> används. Adressen är 36879, och de åtta bitarna på adressen beskriver borderfärg (bit 0-2), inverterat läge (bit 3) och bakgrundsfärg (bit 4-7). Inverterat läge är avstängt om bit 3 är satt till 1 (normalt läge) och aktiverat om bit 3 är satt till 0.</p>



<p class="wp-block-paragraph">Då endast tre bitar (bit 0-2) har avsatts för borderfärg, kan endast en av datorns åtta första färger väljas som borderfärg. Av någon anledning prioriterade man att få in flaggan för inverterat läge framför möjligheten att välja en av alla sexton tillgängliga färger till bordern.</p>



<p class="wp-block-paragraph">Från början är inverterat läge avstängd, vilket kan konstateras om man läser av bit 3 på adress 36879.</p>



<p class="wp-block-paragraph"><code>PRINT PEEK(36879) AND 8</code></p>



<p class="wp-block-paragraph">Svaret 8 betyder att bit 3 är satt. Ursprungsvärdet på adressen är 27, vilket motsvarar 00011011. Bit 0-2 (numreras från vänster till höger) är 011 vilket motsvarar 3 (turkos). Bit 3 är 1 (normalt läge) och bit 4-7 är 0001 (vit).</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="695" height="287" src="https://www.winsoft.se/wp-content/uploads/vic20-1.jpg" alt="" class="wp-image-17435" srcset="https://www.winsoft.se/wp-content/uploads/vic20-1.jpg 695w, https://www.winsoft.se/wp-content/uploads/vic20-1-300x124.jpg 300w, https://www.winsoft.se/wp-content/uploads/vic20-1-150x62.jpg 150w" sizes="auto, (max-width: 695px) 100vw, 695px" /></figure>



<p class="wp-block-paragraph">Genom att sätta bit 3 till 0 aktiveras inverterat läge.</p>



<p class="wp-block-paragraph"><code>POKE 36879,PEEK(36879) AND 247</code></p>



<p class="wp-block-paragraph">Detta släcker bit 3, vilket gör att värdet på adress 36879 nu är 19 (00010011) om inget annat är ändrat. Borderfärgen är fortfarande turkos, bakgrundsfärgen är fortfarande vit, men textfärgen (blå om inget är ändrat) ligger nu bakom texten som visas med bakgrundsfärgen (vit). Det innebär att textmarkören inte syns mot vit botten, då den nu visas som vit.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="631" height="262" src="https://www.winsoft.se/wp-content/uploads/vic20-2.jpg" alt="" class="wp-image-17436" srcset="https://www.winsoft.se/wp-content/uploads/vic20-2.jpg 631w, https://www.winsoft.se/wp-content/uploads/vic20-2-300x125.jpg 300w, https://www.winsoft.se/wp-content/uploads/vic20-2-150x62.jpg 150w" sizes="auto, (max-width: 631px) 100vw, 631px" /></figure>



<p class="wp-block-paragraph">För att återställa, sätt bit 3 till 1 igen.</p>



<p class="wp-block-paragraph"><code>POKE 36879,PEEK(36879) OR 8</code></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2023/02/inverterat-lage-pa-vic-20/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>JobRunner 1.5</title>
		<link>https://www.winsoft.se/2023/02/jobrunner-1-5/</link>
					<comments>https://www.winsoft.se/2023/02/jobrunner-1-5/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sun, 05 Feb 2023 17:39:43 +0000</pubDate>
				<category><![CDATA[Programs]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17397</guid>

					<description><![CDATA[JobRunner är ett program som exekverar sekvenser av program. Det kan t.ex. användas av den som regelbundet genererar filer lokalt på datorn, som ska skickas upp till en server. I version 1.5 finns stöd i användargränssnittet för att arbeta med variabler. Om du vill modifiera vilka steg som ska exekveras, måste JobRunner startas som administratör. [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">JobRunner är ett program som exekverar sekvenser av program. Det kan t.ex. användas av den som regelbundet genererar filer lokalt på datorn, som ska skickas upp till en server. I version 1.5 finns stöd i användargränssnittet för att arbeta med variabler. Om du vill modifiera vilka steg som ska exekveras, måste JobRunner startas som administratör. <a href="https://github.com/Anders-H/JobRunner/blob/master/README.md" target="_blank" rel="noreferrer noopener">Mer information finns här.</a></p>



<p class="wp-block-paragraph"><br>Ladda hem JobRunner för Windows 10/11: <a rel="noreferrer noopener" href="http://winsoft.se/files/JobRunner.exe" target="_blank">JobRunner.exe</a> (högerklicka, välj Spara som&#8230;)</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2023/02/jobrunner-1-5/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Disabling loading turbo to make C64 programs work on the TheC64</title>
		<link>https://www.winsoft.se/2023/01/disabling-loading-turbo-to-make-c64-programs-work-on-the-thec64/</link>
					<comments>https://www.winsoft.se/2023/01/disabling-loading-turbo-to-make-c64-programs-work-on-the-thec64/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sun, 08 Jan 2023 16:59:03 +0000</pubDate>
				<category><![CDATA[Retro]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17388</guid>

					<description><![CDATA[On a TheC64, you would normally load a program from a disk image rather than a physical disk. If the program consists of a single file, everything is usually fine. But if several files make up the program you want to load, a custom loader is usually involved, and the built in TheC64 turbo will [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">On a TheC64, you would normally load a program from a disk image rather than a physical disk. If the program consists of a single file, everything is usually fine. But if several files make up the program you want to load, a custom loader is usually involved, and the built in TheC64 turbo will make the program unloadable.</p>



<p class="wp-block-paragraph"><br>TheC64 solves this problem by looking at the ending characters in the name of the active disk image. The first disk image in my copy of the <strong>Comaland 100%</strong> demo is not called <strong>image1.d64</strong> but <strong>image1_adro.d64</strong>. The presence of the characters &#8220;ad&#8221; tells the TheC64 to inactivate the built-in disk turbo, that makes most multipart software fail during load. The presence of the characters &#8220;ro&#8221; tells TheC64 that the disk is read-only, which makes most abandonedware work.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://www.winsoft.se/wp-content/uploads/L1030365-1024x1024.jpg" alt="" class="wp-image-17390" srcset="https://www.winsoft.se/wp-content/uploads/L1030365-1024x1024.jpg 1024w, https://www.winsoft.se/wp-content/uploads/L1030365-300x300.jpg 300w, https://www.winsoft.se/wp-content/uploads/L1030365-150x150.jpg 150w, https://www.winsoft.se/wp-content/uploads/L1030365-768x768.jpg 768w, https://www.winsoft.se/wp-content/uploads/L1030365-1536x1536.jpg 1536w, https://www.winsoft.se/wp-content/uploads/L1030365.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"><br>The <a href="/Users/hbom/Desktop/THEC64-Full-size-User-Manual-Dec-2019-EN.pdf" data-type="URL" data-id="file:///C:/Users/hbom/Desktop/THEC64-Full-size-User-Manual-Dec-2019-EN.pdf" target="_blank" rel="noreferrer noopener">manual</a> describes all of the character combinations that the TheC64 understand. You can control joystick ports, among other things. As a TheC64 user, you should make it a habit to add &#8220;ad&#8221; before the file ending in the image that holds your programs, and &#8220;_adro&#8221; to the end of any image you download from the C-64 Scene Database.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2023/01/disabling-loading-turbo-to-make-c64-programs-work-on-the-thec64/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>The new self-contained Hand class</title>
		<link>https://www.winsoft.se/2023/01/the-new-self-contained-hand-class/</link>
					<comments>https://www.winsoft.se/2023/01/the-new-self-contained-hand-class/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Fri, 06 Jan 2023 15:50:09 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17385</guid>

					<description><![CDATA[I have added a new class to my poker formation checker (now on .NET 6.0, not 5.0). The library still mainly works with string representations of decks, hands and cards, and the Hand class can be initialized from a string. But the Hand class can also be initialized using regular function calls. Also, the Hand [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I have added a new class to my <a href="https://www.winsoft.se/2021/02/poker-formation-checker-for-net-5-0/">poker formation checker</a> (now on .NET 6.0, not 5.0). The library still mainly works with string representations of decks, hands and cards, and the Hand class can be initialized from a string.</p>



<pre class="wp-block-code"><code>// Create a hand from a string:
using Winsoft.Gaming.GenericPokerFormationChecker;
const string handString = "FORMATION=3-OF-A-KIND,SCORE=0333,HAND=CLB04-DMN06-HRTKN*-DMNKN*-SPDKN*";
var hand = new Hand();
hand.Parse(handString);
Console.WriteLine(hand.Formation); // Output: ThreeOfAKind</code></pre>



<p class="wp-block-paragraph">But the Hand class can also be initialized using regular function calls.</p>



<pre class="wp-block-code"><code>// Create a hand using the API:
using Winsoft.Gaming.GenericPokerFormationChecker;
var hand = new Hand();
hand.Add(Suit.Spades, Value.Ace);
hand.Add(Suit.Clubs, Value.Ace);
hand.Add(Suit.Diamonds, Value.Ace);
hand.Add(Suit.Hearts, Value.Ace);
hand.Add(Suit.Spades, Value.Value06);
Console.WriteLine(hand.Formation); // FourOfAKind</code></pre>



<p class="wp-block-paragraph">Also, the Hand class is self contained. You can any time prompt what formation and score it represents, and what cards are included in the formation. If the hand doesn&#8217;t have a formation, the InFormation property will point out the highest card.</p>



<pre class="wp-block-code"><code>// Create a hand using the API:
using Winsoft.Gaming.GenericPokerFormationChecker;
var hand = new Hand();
hand.Add(Suit.Hearts, Value.Value10);
hand.Add(Suit.Clubs, Value.Queen);
hand.Add(Suit.Spades, Value.Ace);
hand.Add(Suit.Diamonds, Value.Value03);
hand.Add(Suit.Spades, Value.Value06);
Console.WriteLine(hand&#91;0]!.InFormation); // false
Console.WriteLine(hand&#91;1]!.InFormation); // false
Console.WriteLine(hand&#91;2]!.InFormation); // true
Console.WriteLine(hand&#91;3]!.InFormation); // false
Console.WriteLine(hand&#91;4]!.InFormation); // false</code></pre>



<p class="wp-block-paragraph">The old API has not changed. Install:</p>



<pre class="wp-block-code"><code>Install-Package PokerFormationChecker</code></pre>



<p class="wp-block-paragraph">Source code is <a href="https://github.com/Anders-H/GenericPokerFormationChecker" target="_blank" rel="noreferrer noopener">here</a>, NuGet package is <a href="https://www.nuget.org/packages/PokerFormationChecker/" target="_blank" rel="noreferrer noopener">here</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2023/01/the-new-self-contained-hand-class/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Rita en cirkel på Commodore 64</title>
		<link>https://www.winsoft.se/2022/12/rita-en-cirkel-pa-commodore-64/</link>
					<comments>https://www.winsoft.se/2022/12/rita-en-cirkel-pa-commodore-64/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Thu, 29 Dec 2022 19:57:43 +0000</pubDate>
				<category><![CDATA[Geeky]]></category>
		<category><![CDATA[C128]]></category>
		<category><![CDATA[C64]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17361</guid>

					<description><![CDATA[Det finns ett meme som visar hur omständligt det är att programmera BASIC på Commodore 64 (C64). Bilden visar den kod som krävs för att rita en cirkel på skärmen på en C64, jämfört med den kod som krävs för att rita en cirkel på skärmen på Sinclair Spectrum. Om du skummar igenom koden i [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Det finns ett meme som visar hur omständligt det är att programmera BASIC på Commodore 64 (C64). Bilden visar den kod som krävs för att rita en cirkel på skärmen på en C64, jämfört med den kod som krävs för att rita en cirkel på skärmen på Sinclair Spectrum.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="792" height="1024" src="https://www.winsoft.se/wp-content/uploads/circle_meme-792x1024.png" alt="" class="wp-image-17364" srcset="https://www.winsoft.se/wp-content/uploads/circle_meme-792x1024.png 792w, https://www.winsoft.se/wp-content/uploads/circle_meme-232x300.png 232w, https://www.winsoft.se/wp-content/uploads/circle_meme-116x150.png 116w, https://www.winsoft.se/wp-content/uploads/circle_meme-768x993.png 768w, https://www.winsoft.se/wp-content/uploads/circle_meme.png 1080w" sizes="auto, (max-width: 792px) 100vw, 792px" /></figure>



<p class="wp-block-paragraph">Om du skummar igenom koden i bilderna, så noterar du säkert två saker: C64-versionen är onödigt pratig och Spectrum-versionen lider lite av att skärmupplösningen är aningen lägre än C64-versionen (256*192 pixlar jämfört med 320*200 pixlar).</p>



<p class="wp-block-paragraph">Denna kod är galet långsam, men det är det kortaste jag har lyckats åstadkomma för att rita en cirkel på C64:</p>



<pre class="wp-block-code"><code>10 POKE 56,32:POKE 52,32
20 CLR:POKE 53272,25
30 POKE 53265,PEEK(53265) OR 32
40 PRINT "{CLEAR}"
50 POKE 88,0:POKE 89,63
60 POKE 113,64:POKE 114,31
70 POKE 12,1:SYS 45760
80 FOR A=1 TO 7.3 STEP 0.01
90 X=COS(A)*20
100 Y=SIN(A)*22
110 XX=159+4*X:YY=99+3*Y
120 ROW=INT(YY/8):CH=INT(XX/8)
130 LINE=YY AND 7:BIT=7-(XX AND 7)
140 BYTE=8192+ROW*320+CH*8+LINE
150 POKE BYTE,PEEK(BYTE) OR 2^BIT
160 NEXT
170 GOTO 170</code></pre>



<p class="wp-block-paragraph">Detta är resultatet:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="707" height="531" src="https://www.winsoft.se/wp-content/uploads/cirkel.jpg" alt="" class="wp-image-17362" srcset="https://www.winsoft.se/wp-content/uploads/cirkel.jpg 707w, https://www.winsoft.se/wp-content/uploads/cirkel-300x225.jpg 300w, https://www.winsoft.se/wp-content/uploads/cirkel-150x113.jpg 150w" sizes="auto, (max-width: 707px) 100vw, 707px" /></figure>



<p class="wp-block-paragraph">Jag skulle tro att orsaken till denna skillnad är att C64 egentligen är en spelkonsol, utklädd till dator. C64 var vid lansering utrustad med extra allt inom ljud och grafik, och för att spara minne slängde man in en äldre version av Commodore BASIC, nämligen 2.0 (second release). Samma som VIC-20, men ett par versioner lägre än den PET. Den enda anledningen till att C64 faktiskt hade en BASIC och ett tangentbord var att man behövde ett säljargument, som tyvärr inte är mer sofistikerat än Annika Strandhälls <a rel="noreferrer noopener" href="https://www.expressen.se/ledare/annika-strandhall-har-fel-om-skolan/" target="_blank">försvar för iPads i skolan</a> &#8211; man blir ett datageni! En skillnad är möjligtvis att det var lägre hängande frukt att lära sig programmering på en hemdator 1982 än det är att lära sig programmering på en kontemporär Facebook-maskin från Apple. Sinclair Spectrum (också 1982) däremot, var en ytterst begränsad dator. Att de barn som fick den skulle lära sig programmering, var på allvar ett viktigt skäl att köpa datorn. Den behövde ha en seriös BASIC! (Jag själv lärde mig BASIC på föregångaren Sinclair ZX81.)</p>



<p class="wp-block-paragraph">Commodore 128 hade all den kapacitet ljud- och grafikkapacitet som C64 hade, men till skillnad från C64 hade den även kommandon och verktyg som lät användaren dra nytta av den kapaciteten, utan att behöva programmera maskinkod. 128-användaren fick tillgång till en bra BASIC och en drös inbyggda verktyg. Programmet som ritar en cirkel på Commodore 128 är inte helt olikt Spectrum-programmet i memen ovan:</p>



<pre class="wp-block-code"><code>10 GRAPHIC 1,1
20 CIRCLE 1,159,99,60,60</code></pre>



<p class="wp-block-paragraph">Och även om vi inte hade CIRCLE-kommandot, så blir koden betydligt kortare än C64-versionen, eftersom vi kan ändra grafikläge och sätta individuella bildelement direkt från BASIC. Så uppgiften är inte särskilt svår ändå. Man betalar för lyxen genom högre minneskrav, men denna lyx ansåg man inte att målgruppen för C64 var intresserad av.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2022/12/rita-en-cirkel-pa-commodore-64/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>FileUtility PathInfo</title>
		<link>https://www.winsoft.se/2022/12/fileutility-pathinfo/</link>
					<comments>https://www.winsoft.se/2022/12/fileutility-pathinfo/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Wed, 14 Dec 2022 17:35:57 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17356</guid>

					<description><![CDATA[FileUtility är ett bibliotek för Windows/.NET 6.0 som (för närvarande) innehåller en enda klass: PathInfo. Den kan bl.a. korta ner en filsökväg för presentation på skärmen och ange fil- och katalogstorlek i flera format, inklusive ett människovänligt textformat. Exempelkod finns här.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">FileUtility är ett bibliotek för Windows/.NET 6.0 som (för närvarande) innehåller en enda klass: PathInfo. Den kan bl.a. korta ner en filsökväg för presentation på skärmen och ange fil- och katalogstorlek i flera format, inklusive ett människovänligt textformat. <a href="https://github.com/Anders-H/FileUtility/blob/main/README.md" target="_blank" rel="noreferrer noopener">Exempelkod finns här</a>.</p>



<pre class="wp-block-code"><code>var max = 15;
var f = new PathInfo(new FileInfo(@"C:\Temp\hello.txt"));
Console.WriteLine(f.CompactPathForDisplay(15))

// Result: C:...\hello.txt</code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2022/12/fileutility-pathinfo/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Min första kontakt med ChatGPT</title>
		<link>https://www.winsoft.se/2022/12/min-forsta-kontakt-med-chatgpt/</link>
					<comments>https://www.winsoft.se/2022/12/min-forsta-kontakt-med-chatgpt/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Thu, 08 Dec 2022 17:24:58 +0000</pubDate>
				<category><![CDATA[Science]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17351</guid>

					<description><![CDATA[Jag har knuffat min första kontakt med chatboten ChatGPT fram till idag. Orsaken till min prokrastinering är enkel tidsbrist, men idag kom jag mig för att testa ett kort replikskifte, vilket onekligen gav mig mersmak. Jag: Can you give me five reasons to not believe in God? Chat GPT: There is no one answer to [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Jag har knuffat min första kontakt med chatboten ChatGPT fram till idag. Orsaken till min prokrastinering är enkel tidsbrist, men idag kom jag mig för att testa ett kort replikskifte, vilket onekligen gav mig mersmak.</p>



<p class="wp-block-paragraph"><strong>Jag:</strong></p>



<p class="wp-block-paragraph"><em>Can you give me five reasons to not believe in God?</em></p>



<p class="wp-block-paragraph"><strong>Chat GPT:</strong></p>



<p class="wp-block-paragraph"><em>There is no one answer to this question, as beliefs about God are deeply personal and can vary greatly from person to person. Some people may not believe in God for a variety of reasons, including:</em></p>



<p class="wp-block-paragraph"><em>1. Lack of evidence: Some people may not believe in God because they do not see any concrete evidence of God&#8217;s existence.</em></p>



<p class="wp-block-paragraph"><em>2. Personal experiences: Some people may not believe in God because of their personal experiences or the experiences of others.</em></p>



<p class="wp-block-paragraph"><em>3. Different beliefs: Some people may not believe in God because they hold different beliefs or have been exposed to different religious teachings.</em></p>



<p class="wp-block-paragraph"><em>4. The existence of evil: Some people may not believe in God because they cannot reconcile the existence of evil in the world with the idea of an all-powerful, all-loving God.</em></p>



<p class="wp-block-paragraph"><em>5. A desire for autonomy: Some people may not believe in God because they value their autonomy and do not want to be beholden to a higher power.</em></p>



<p class="wp-block-paragraph"><em>Again, these are just a few examples of reasons someone may not believe in God. It is important to remember that beliefs about God are highly personal and can vary greatly from person to person.</em></p>



<p class="wp-block-paragraph"><strong>Jag:</strong></p>



<p class="wp-block-paragraph"><em>Has humans evolved or are they created?</em></p>



<p class="wp-block-paragraph"><strong>Chat GPT:</strong></p>



<p class="wp-block-paragraph"><em>The question of whether humans have evolved or were created is a contentious one, and different people may have different beliefs on the matter. From a scientific perspective, the evidence overwhelmingly supports the idea that humans have evolved over time. The theory of evolution is supported by a vast body of scientific evidence, including fossil records, comparative anatomy, and DNA analysis.</em></p>



<p class="wp-block-paragraph"><em>According to the theory of evolution, all living things, including humans, have descended from a common ancestor through a process of natural selection. Over time, small variations in the genetic makeup of organisms can lead to the development of new traits and characteristics. These changes can be passed down from one generation to the next, allowing species to adapt to their environments and ultimately giving rise to the diversity of life we see today.</em></p>



<p class="wp-block-paragraph"><em>While the theory of evolution is widely accepted by the scientific community, some people may believe in alternative theories, such as the idea that humans were created by God. These beliefs are often based on religious or spiritual beliefs, and are not necessarily supported by scientific evidence. Ultimately, the question of whether humans have evolved or were created is a complex one, and different people may have different beliefs on the matter.</em></p>



<p class="wp-block-paragraph"><strong>Jag:</strong></p>



<p class="wp-block-paragraph"><em>Are you created or have you evolved?</em></p>



<p class="wp-block-paragraph"><strong>Chat GPT:</strong></p>



<p class="wp-block-paragraph"><em>As a large language model trained by OpenAI, I do not have the capacity for consciousness or the ability to evolve. I am a purely digital entity, created by humans to process and generate text based on the data I have been trained on. I do not have the ability to experience or perceive the world in the same way that humans do. I am not a living being and do not have the same capabilities or limitations as living organisms. I exist solely as a tool to assist with generating text.</em></p>



<p class="wp-block-paragraph">Vi har en spännande tid framför oss.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2022/12/min-forsta-kontakt-med-chatgpt/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Åtta avsnitt av &#8220;Inte en singel&#8221;</title>
		<link>https://www.winsoft.se/2022/12/atta-avsnitt-av-inte-en-singel/</link>
					<comments>https://www.winsoft.se/2022/12/atta-avsnitt-av-inte-en-singel/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Tue, 06 Dec 2022 17:15:24 +0000</pubDate>
				<category><![CDATA[Retro]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17348</guid>

					<description><![CDATA[Det har hunnit bli åtta avsnitt av podcasten &#8220;Inte en singel&#8221; som jag gör tillsammans med Henrik Andersson. I varje avsnitt lyssnar vi på en skiva &#8211; åtminstone på låtarna som inte släpptes som singel &#8211; och recenserar både musiken och valet av singlar. Avsnitten finns samlade här (MP3/RSS) och på YouTube. Det senaste avsnittet [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Det har hunnit bli åtta avsnitt av podcasten &#8220;Inte en singel&#8221; som jag gör tillsammans med Henrik Andersson. I varje avsnitt lyssnar vi på en skiva &#8211; åtminstone på låtarna som inte släpptes som singel &#8211; och recenserar både musiken och valet av singlar. Avsnitten <a href="https://inte_en_singel.80tal.se/" target="_blank" rel="noreferrer noopener">finns samlade här (MP3/RSS)</a> och <a href="https://www.youtube.com/@inteensingel4131/videos" data-type="URL" data-id="https://www.youtube.com/@inteensingel4131/videos" target="_blank" rel="noreferrer noopener">på YouTube</a>. Det senaste avsnittet filmade vi.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Inte En Singel: 08. Pet Shop Boys - Actually (1987)" width="500" height="281" src="https://www.youtube.com/embed/QnnKbOecbUI?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2022/12/atta-avsnitt-av-inte-en-singel/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Klassen PathInfo för .NET 6.0/Windows</title>
		<link>https://www.winsoft.se/2022/10/klassen-pathinfo-for-net-6-0-windows/</link>
					<comments>https://www.winsoft.se/2022/10/klassen-pathinfo-for-net-6-0-windows/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sat, 15 Oct 2022 14:01:46 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17338</guid>

					<description><![CDATA[Jag har skapat ett bibliotek för .NET 6.0 (endast Windows) som innehåller en enda klass: PathInfo. Den kan korta ner en sökväg för presentation på skärmen och den kan hämta innehållet i en katalog, rekursivt. Exempel finns att titta på här: NuGet: https://www.nuget.org/packages/WinSoftFileUtility/ GitHub: https://github.com/Anders-H/FileUtility]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Jag har skapat ett bibliotek för .NET 6.0 (endast Windows) som innehåller en enda klass: <strong>PathInfo</strong>. Den kan korta ner en sökväg för presentation på skärmen och den kan hämta innehållet i en katalog, rekursivt. Exempel finns att titta på här:</p>



<p class="wp-block-paragraph">NuGet: <a href="https://www.nuget.org/packages/WinSoftFileUtility/" target="_blank" rel="noreferrer noopener">https://www.nuget.org/packages/WinSoftFileUtility/</a></p>



<p class="wp-block-paragraph">GitHub: <a rel="noreferrer noopener" href="https://github.com/Anders-H/FileUtility" target="_blank">https://github.com/Anders-H/FileUtility</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2022/10/klassen-pathinfo-for-net-6-0-windows/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Tre timmar om Pink Floyds 70-tal</title>
		<link>https://www.winsoft.se/2022/10/tre-timmar-om-pink-floyds-70-tal/</link>
					<comments>https://www.winsoft.se/2022/10/tre-timmar-om-pink-floyds-70-tal/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Fri, 07 Oct 2022 14:53:14 +0000</pubDate>
				<category><![CDATA[Pop culture]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17333</guid>

					<description><![CDATA[För Nongratas räkning har Jannik Svensson och jag spelat in tre avsnitt om Pink Floyd och deras musik. Vi börjar med deras debut 1967 och landar i The Wall från 1979. https://poddtoppen.se/podcast/1463215688/samtal/den-stora-pink-floyd-specialen-del-1 https://poddtoppen.se/podcast/1463215688/samtal/den-stora-pink-floyd-specialen-del-2 https://poddtoppen.se/podcast/1463215688/samtal/den-stora-pink-floyd-specialen-del-3 Mycket nöje!]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">För Nongratas räkning har Jannik Svensson och jag spelat in tre avsnitt om Pink Floyd och deras musik. Vi börjar med deras debut 1967 och landar i The Wall från 1979.</p>



<p class="wp-block-paragraph"><a href="https://poddtoppen.se/podcast/1463215688/samtal/den-stora-pink-floyd-specialen-del-1">https://poddtoppen.se/podcast/1463215688/samtal/den-stora-pink-floyd-specialen-del-1</a></p>



<p class="wp-block-paragraph"><a href="https://poddtoppen.se/podcast/1463215688/samtal/den-stora-pink-floyd-specialen-del-2">https://poddtoppen.se/podcast/1463215688/samtal/den-stora-pink-floyd-specialen-del-2</a></p>



<p class="wp-block-paragraph"><a href="https://poddtoppen.se/podcast/1463215688/samtal/den-stora-pink-floyd-specialen-del-3">https://poddtoppen.se/podcast/1463215688/samtal/den-stora-pink-floyd-specialen-del-3</a></p>



<p class="wp-block-paragraph">Mycket nöje!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2022/10/tre-timmar-om-pink-floyds-70-tal/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>JobRunner 1.4</title>
		<link>https://www.winsoft.se/2022/09/jobrunner-1-4/</link>
					<comments>https://www.winsoft.se/2022/09/jobrunner-1-4/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Fri, 30 Sep 2022 14:12:44 +0000</pubDate>
				<category><![CDATA[Programs]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17329</guid>

					<description><![CDATA[Version 1.4 av JobRunner finns nu att ladda hem. Programmet låter dig lista upp processer som ska utföras i turordning som kan beläggas med vissa enkla villkor. Startas programmet som administratör kan dessa steg redigeras, annars kan de bara köras. Den senaste versionen innehåller några mindre buggrättningar och introducerar möjligheten att manuellt stoppa en körning. [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Version 1.4 av <a rel="noreferrer noopener" href="https://github.com/Anders-H/JobRunner" target="_blank">JobRunner finns nu att ladda hem</a>. Programmet låter dig lista upp processer som ska utföras i turordning som kan beläggas med vissa enkla villkor. Startas programmet som administratör kan dessa steg redigeras, annars kan de bara köras.</p>



<p class="wp-block-paragraph">Den senaste versionen innehåller några mindre buggrättningar och introducerar möjligheten att manuellt stoppa en körning.</p>



<p class="wp-block-paragraph"><a href="https://github.com/Anders-H/JobRunner" target="_blank" rel="noreferrer noopener">https://github.com/Anders-H/JobRunner</a></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="578" height="297" src="https://www.winsoft.se/wp-content/uploads/687474703a2f2f696d67686f73742e77696e736f66742e73652f75706c6f61642f3835373937313538363737313832336a6f6272756e6e65722e6a7067.jpg" alt="" class="wp-image-17330" srcset="https://www.winsoft.se/wp-content/uploads/687474703a2f2f696d67686f73742e77696e736f66742e73652f75706c6f61642f3835373937313538363737313832336a6f6272756e6e65722e6a7067.jpg 578w, https://www.winsoft.se/wp-content/uploads/687474703a2f2f696d67686f73742e77696e736f66742e73652f75706c6f61642f3835373937313538363737313832336a6f6272756e6e65722e6a7067-300x154.jpg 300w, https://www.winsoft.se/wp-content/uploads/687474703a2f2f696d67686f73742e77696e736f66742e73652f75706c6f61642f3835373937313538363737313832336a6f6272756e6e65722e6a7067-150x77.jpg 150w" sizes="auto, (max-width: 578px) 100vw, 578px" /></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2022/09/jobrunner-1-4/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Vad är vinsten att skriva i maskinkod?</title>
		<link>https://www.winsoft.se/2022/08/vad-ar-vinsten-att-skriva-i-maskinkod/</link>
					<comments>https://www.winsoft.se/2022/08/vad-ar-vinsten-att-skriva-i-maskinkod/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Wed, 03 Aug 2022 17:16:39 +0000</pubDate>
				<category><![CDATA[Geeky]]></category>
		<category><![CDATA[General]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17318</guid>

					<description><![CDATA[För ett par veckor sedan skrev jag en kort text om hur man optimerar prestandan i Commodore BASIC 2.0 second release. Det gjorde att jag fick frågan om hur mycket man tjänar på att programmera maskinkod istället för BASIC. I mitt exempel drog jag ner exekveringstiden från 1522 jiffys (sextiondels sekunder) till 686 jiffys, genom [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">För ett par veckor sedan skrev jag <a href="https://www.winsoft.se/2022/07/prestanda-i-commodore-basic-2-0-second-release/">en kort text om hur man optimerar prestandan i Commodore BASIC 2.0 second release</a>. Det gjorde att jag fick frågan om hur mycket man tjänar på att programmera maskinkod istället för BASIC. I mitt exempel drog jag ner exekveringstiden från 1522 jiffys (sextiondels sekunder) till 686 jiffys, genom att välja rätt kommandon och rätt strategi i en konstruerad uppgift: Spara tre värden i tre olika minnesadresser, 1000 gånger.</p>



<p class="wp-block-paragraph">Uppgiften var att låta en VIC-20 skriva värdet 40 till adress 828, värdet 41 till adress 829 och värdet 42 till adress 830, ett tusen gånger, vilket alltså går att göra på 686 jiffys. Strategin för god prestanda måste utgå ifrån att realtidstolkning tar tid. Men så fick jag frågan om hur lång tid det tar för en VIC-20 att lösa samma uppgift om man skriver programmet i maskinkod. Jag gissade på nolltid, men rätt svar är 2 jiffys, alltså en trettiondels sekund.</p>



<p class="wp-block-paragraph">Hur ser ett program, enligt ovan, konverterat till maskinkod ut? Stegenser ut som följer:</p>



<ol class="wp-block-list"><li>Initiera variabeln som håller räkning på antal körningar. Detta kräver två bytes, eftersom 1000 är ett 16-bitarstal, medan VIC-20 är en 8-bitarsdator.</li><li>Utför uppgiften i fråga. Skriv tre värden till tre minnesadresser.</li><li>Räkna upp variabeln.</li><li>Upprepa om uppgiften körts färre gånger än 1000.</li><li>Avsluta.</li></ol>



<p class="wp-block-paragraph">Jag väljer att lagra variabeln på adress 880-881 och lägga programmet på adress 831. På det viset ryms programmet mellan de tre adresser som är föremål för uppgiften (828-830) och variabeln som håller reda på antalet upprepningar (1000 stycken) på adress 880-881.</p>



<p class="wp-block-paragraph">1. Assembler-koden för att initiera variabeln som håller räkning på antal körningar ser ut så här (adress 831):</p>



<pre class="wp-block-code"><code>LDA #0
STA 880
LDA #0
STA 881</code></pre>



<p class="wp-block-paragraph">2. Uppgiften är att skriva värdet 40 till adress 828, värdet 41 till adress 829 och värdet 42 till adress 830 (adress 841):</p>



<pre class="wp-block-code"><code>LDA #40
STA 828
LDA #41
STA 829
LDA #42
STA 830</code></pre>



<p class="wp-block-paragraph">3. Därefter ska variabeln som håller reda på antal skrivningar till minnet räknas upp (adress 856):</p>



<pre class="wp-block-code"><code>INC 880
BNE 864 ;(som är adressen till beslutet att iterera)
INC 881</code></pre>



<p class="wp-block-paragraph">4. Om uppgiften utförts färre än 1000 gånger, ska uppgiften upprepas (adress 864):</p>



<pre class="wp-block-code"><code>LDA  880
CMP  #232
BNE  841
LDA  881
CMP  #3
BNE  841</code></pre>



<p class="wp-block-paragraph">5. Avsluta.</p>



<pre class="wp-block-code"><code>RTS</code></pre>



<p class="wp-block-paragraph">Översatt till maskinkod, kan vi konstatera att vi har:</p>



<ol class="wp-block-list"><li>169 0 141 112 3 169 141 113 3</li><li>169 40 141 60 3 169 41 169 41 141 61 3 169 42 141 62 3</li><li>238 112 3 208 3 238 113 3</li><li>173 112 3 201 232 208 226 173 113 3 201 3 208 189</li><li>96</li></ol>



<p class="wp-block-paragraph">Om vi skriver en BASIC-loader för detta, och sedan tar tid på exekveringen, så ser koden ut så här:</p>



<pre class="wp-block-code"><code>10 FOR N=0 TO 47
20 READ V
30 POKE 831+N,V
40 NEXT
50 S=TI
60 SYS 831
70 PRINT TI-S
80 DATA 169,0,141,112,3,169,0,141
90 DATA 113,3,169,40,141,60,3,169
100 DATA 41,141,61,3,169,42,141,62
110 DATA 3,238,112,3,208,3,238,113
120 DATA 3,173,112,3,201,232,208,226
130 DATA 173,113,3,201,3,208,219,96</code></pre>



<p class="wp-block-paragraph">Och mycket riktigt har vi nu utfört samma uppgift på 2 jiffys istället för 686 jiffys. Maskinkod är alltså inte så lite snabbare än BASIC på VIC-20.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="739" height="557" src="https://www.winsoft.se/wp-content/uploads/maskinkod.jpg" alt="" class="wp-image-17321" srcset="https://www.winsoft.se/wp-content/uploads/maskinkod.jpg 739w, https://www.winsoft.se/wp-content/uploads/maskinkod-300x226.jpg 300w, https://www.winsoft.se/wp-content/uploads/maskinkod-150x113.jpg 150w" sizes="auto, (max-width: 739px) 100vw, 739px" /></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2022/08/vad-ar-vinsten-att-skriva-i-maskinkod/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Prestanda i Commodore BASIC 2.0 second release</title>
		<link>https://www.winsoft.se/2022/07/prestanda-i-commodore-basic-2-0-second-release/</link>
					<comments>https://www.winsoft.se/2022/07/prestanda-i-commodore-basic-2-0-second-release/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Fri, 15 Jul 2022 18:41:48 +0000</pubDate>
				<category><![CDATA[Geeky]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17303</guid>

					<description><![CDATA[Om du skriver ett program i Commodore BASIC för C64 (Commodore 64) eller (som i mitt fall) VIC-20 är prestanda viktigt, speciellt om det är ett spelprogram som du bygger. BASIC-tolken är ganska slö, och det faktum att både C64 och VIC-20 interpreterar BASIC-programmet medan det körs, gör att det är vissa specifika faktorer som [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Om du skriver ett program i Commodore BASIC för C64 (Commodore 64) eller (som i mitt fall) VIC-20 är prestanda viktigt, speciellt om det är ett spelprogram som du bygger. BASIC-tolken är ganska slö, och det faktum att både C64 och VIC-20 interpreterar BASIC-programmet medan det körs, gör att det är vissa specifika faktorer som man behöver ta hänsyn till.</p>



<p class="wp-block-paragraph">Två faktorer som påverkar prestandan ganska mycket &#8211; <em>hur man skriver minne</em> och <em>hur man itererar</em> &#8211; är två faktorer som ofta används vid just spelprogrammering. Men även om du blir expert på BASIC, kommer du inte kunna skriva spel som är lika avancerade som t.ex. <a rel="noreferrer noopener" href="https://en.wikipedia.org/wiki/Wizball" target="_blank">Wizball</a>, <a rel="noreferrer noopener" href="https://en.wikipedia.org/wiki/The_Great_Giana_Sisters" target="_blank">The Great Giana Sisters</a> eller <a rel="noreferrer noopener" href="https://en.wikipedia.org/wiki/Turrican" target="_blank">Turrican</a> i BASIC, men du kommer kunna skapa hyfsat bra spel. T.ex. är <a rel="noreferrer noopener" href="https://en.wikipedia.org/wiki/Sid_Meier%27s_Pirates!" target="_blank">Pirates!</a> programmerat i BASIC (Sid Meier), precis som <a rel="noreferrer noopener" href="https://en.wikipedia.org/wiki/Artworx" target="_blank">Artworks Strip Poker</a>, så man kommer ganska långt om man lär sig språket ordentligt.</p>



<p class="wp-block-paragraph">Jag kör mina prestandaexempel på min VIC-20. En VIC-20 är aningen snabbare än en C64, ändå är allt som påstås här sant även på C64 även om siffrorna blir lite annorlunda.</p>



<p class="wp-block-paragraph">För att mäta prestanda kan man spara värdet i <strong>TIME</strong> ( eller <strong>TI</strong>) som ger systemklockans värde, utföra den operation man vill mäta, och sedan titta på differensen mellan det nya värdet i <strong>TIME</strong> och det värde man lagrade. Då vet man hur många jiffys (alltså hur många sextiondels sekunder) operationen har kostat.</p>



<p class="wp-block-paragraph">Följande program skriver till fyra minnesadresser i en evighetsloop. Programmet räknar dessutom upp en variabel till 1000 och bryter när den når 1000. Det vi testar är hur snabb en iteration är, hur lång tid det tar att skriva till minnet med <strong>POKE</strong>, en aritmetisk beräkning och ett test. Så här ser källkoden ut:</p>



<pre class="wp-block-code"><code>10 PRINT "HASTIGHETSTEST VIC-20"
20 S=TI
30 C=0
40 POKE 828,40
50 POKE 829,41
60 POKE 830,42
70 C=C+1
80 IF C &lt; 1000 THEN 40
90 PRINT TI-S</code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="737" height="540" src="https://www.winsoft.se/wp-content/uploads/hastighetstest-vic-20.jpg" alt="" class="wp-image-17305" srcset="https://www.winsoft.se/wp-content/uploads/hastighetstest-vic-20.jpg 737w, https://www.winsoft.se/wp-content/uploads/hastighetstest-vic-20-300x220.jpg 300w, https://www.winsoft.se/wp-content/uploads/hastighetstest-vic-20-150x110.jpg 150w" sizes="auto, (max-width: 737px) 100vw, 737px" /></figure>



<p class="wp-block-paragraph">Resultatet, som bilden visar är <strong>1522 jiffys</strong> (eller drygt 25 sekunder). Koden ser inte helt orimlig ut, men det är inte särskilt imponerande, så hur kan man optimera detta program?</p>



<p class="wp-block-paragraph">Först är <strong>GOTO</strong> felanvänt. <strong>GOTO</strong> står inte utskrivet, men rad 80 avslutas med <strong>&#8230;THEN 40</strong>, vilket underförstått betyder <strong>&#8230;THEN GOTO 40</strong>. Syftet med <strong>GOTO</strong> är att skapa hopp i program för att förgrena logiken. Under vissa villkor ska viss kod köras, annars en annan kod. Men här används <strong>GOTO</strong> för att iterera. Det faktum att Commodore BASIC är ett interpreterande språk gör detta till ett dåligt val. Varje gång programmet ska hoppa till ett radnummer, måste radnumret tolkas och hittas. Genom att skapa iterationer med <strong>FOR</strong>, kan iterationens start och slut återanvändas under varje upprepning.</p>



<pre class="wp-block-code"><code>10 PRINT "HASTIGHETSTEST VIC-20"
20 S=TI
30 FOR A=0 TO 999
40 POKE 828,40
50 POKE 829,41
60 POKE 830,42
70 NEXT
80 PRINT TI-S</code></pre>



<p class="wp-block-paragraph">Nu klarar vi att utföra samma logik på <strong>1094 jiffys</strong> (18 sekunder). Ännu trevligare blir det om vi använder oss av variabler för att lagra minnesadresser. Då behöver interpretatorn bara förstå vilken adress som avses en gång, och kan sedan återanvända det. Här kräver vi två aritmetiska beräkningar för att åstadkomma sak, men är redan nere på <strong>835 jiffys</strong>:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="738" height="558" src="https://www.winsoft.se/wp-content/uploads/prestanda9.jpg" alt="" class="wp-image-17313" srcset="https://www.winsoft.se/wp-content/uploads/prestanda9.jpg 738w, https://www.winsoft.se/wp-content/uploads/prestanda9-300x227.jpg 300w, https://www.winsoft.se/wp-content/uploads/prestanda9-150x113.jpg 150w" sizes="auto, (max-width: 738px) 100vw, 738px" /></figure>



<p class="wp-block-paragraph">Och kostar vi på oss att använda tre variabler istället för en variabel och två aritmetiska beräkningar, så hyvlar vi bort ytterligare lite overhead och landar på <strong>686 jiffys</strong>.</p>



<pre class="wp-block-code"><code>10 PRINT "HASTIGHETSTEST VIC-20"
20 S=TI
30 X=828
40 Y=829
50 Z=830
60 FOR A=0 TO 999
70 POKE X,40
80 POKE Y,41
90 POKE Z,42
100 NEXT
110 PRINT TI-S</code></pre>



<p class="wp-block-paragraph">Nu har vi gått från 25 sekunder till 12 sekunder, vilket är en femtiotvåprocentig förbättring. I praktiken kan man inte optimera programmen så hårt, för man skulle få alldeles för många variabler att hålla reda på. Men när man skriver prestandakritiska program (t.ex. spelprogram) i ett långsamt språk (t.ex. Commodore BASIC) är det viktigt att veta vad man kan göra och vad man absolut ska undvika.</p>



<p class="wp-block-paragraph">Jag har skrivit en bok om just Commodore BASIC på C64 och VIC-20, som bl.a. tar upp detta, som kan <a rel="noreferrer noopener" href="https://ahesselbom.se/pages/commodorebasic20.html" target="_blank">laddas hem helt gratis som PDF eller EPUB</a>.</p>



<p class="wp-block-paragraph"><strong>Uppdatering:</strong> <a href="https://www.winsoft.se/2022/08/vad-ar-vinsten-att-skriva-i-maskinkod/">Vad är vinsten att skriva i maskinkod?</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2022/07/prestanda-i-commodore-basic-2-0-second-release/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Några AI-tjänster av typen text-to-image</title>
		<link>https://www.winsoft.se/2022/06/nagra-ai-tjanster-av-typen-text-to-image/</link>
					<comments>https://www.winsoft.se/2022/06/nagra-ai-tjanster-av-typen-text-to-image/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Wed, 15 Jun 2022 19:28:50 +0000</pubDate>
				<category><![CDATA[Geeky]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17295</guid>

					<description><![CDATA[Jag kan inte påstå att de AI-tjänster som konverterar text till bild som finns att använda gratis på nätet är 100% användbara. Jag knappade in &#8220;dog runs over green grass&#8221; i sex stycken fria tjänster. Uppdatering 2025-09-17: Fler AI-tjänster med text-to-image]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Jag kan inte påstå att de AI-tjänster som konverterar text till bild som finns att använda gratis på nätet är 100% användbara. Jag knappade in &#8220;dog runs over green grass&#8221; i sex stycken fria tjänster.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://www.winsoft.se/wp-content/uploads/Untitled-1-2.jpg" alt="" class="wp-image-17296" srcset="https://www.winsoft.se/wp-content/uploads/Untitled-1-2.jpg 1024w, https://www.winsoft.se/wp-content/uploads/Untitled-1-2-300x300.jpg 300w, https://www.winsoft.se/wp-content/uploads/Untitled-1-2-150x150.jpg 150w, https://www.winsoft.se/wp-content/uploads/Untitled-1-2-768x768.jpg 768w, https://www.winsoft.se/wp-content/uploads/Untitled-1-2-70x70.jpg 70w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"><strong>Uppdatering 2025-09-17:</strong> <a href="https://www.winsoft.se/2025/09/fler-ai-tjanster-med-text-to-image/"><em>Fler AI-tjänster med text-to-image</em></a></p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2022/06/nagra-ai-tjanster-av-typen-text-to-image/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Kolla tärningsformationer</title>
		<link>https://www.winsoft.se/2022/06/kolla-tarningsformationer/</link>
					<comments>https://www.winsoft.se/2022/06/kolla-tarningsformationer/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Wed, 08 Jun 2022 14:56:38 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17289</guid>

					<description><![CDATA[Har du någon gång suttit och stirrat på 5-6 tärningar och funderat på vilka formationer ögonen utgör? Nu behöver du inte fundera längre, för här är en C#-klass som ger dig svaret på nolltid! Mycket nöje! Kodexempel: https://github.com/Anders-H/DiceFormationChecker Ladda hem: https://www.nuget.org/packages/Winsoft.Gaming.DiceFormationChecker/]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Har du någon gång suttit och stirrat på 5-6 tärningar och funderat på vilka formationer ögonen utgör? Nu behöver du inte fundera längre, för här är en C#-klass som ger dig svaret på nolltid! Mycket nöje!</p>



<p class="wp-block-paragraph">Kodexempel: <a href="https://github.com/Anders-H/DiceFormationChecker" target="_blank" rel="noreferrer noopener">https://github.com/Anders-H/DiceFormationChecker</a></p>



<p class="wp-block-paragraph">Ladda hem: <a href="https://www.nuget.org/packages/Winsoft.Gaming.DiceFormationChecker/">https://www.nuget.org/packages/Winsoft.Gaming.DiceFormationChecker/</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2022/06/kolla-tarningsformationer/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Avstånd mellan uppföljare och deras betyg</title>
		<link>https://www.winsoft.se/2022/05/avstand-mellan-uppfoljare-och-deras-betyg/</link>
					<comments>https://www.winsoft.se/2022/05/avstand-mellan-uppfoljare-och-deras-betyg/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sun, 29 May 2022 11:10:59 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Pop culture]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17271</guid>

					<description><![CDATA[Hur tätt släpps filmers uppföljare? Och hur populära är de? Jag har tittat på några trilogier, tetralogier och några filmserier med fler än fyra filmer. Trilogier: Tetralogier: Och några filmserier med fem eller flera delar: Så hur har dessa tagits emot? Det är kanske den mest viktiga informationen för den som vill avgöra om det [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Hur tätt släpps filmers uppföljare? Och hur populära är de? Jag har tittat på några trilogier, tetralogier och några filmserier med fler än fyra filmer. Trilogier:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="443" height="297" src="https://www.winsoft.se/wp-content/uploads/avstand1-2.jpg" alt="" class="wp-image-17280" srcset="https://www.winsoft.se/wp-content/uploads/avstand1-2.jpg 443w, https://www.winsoft.se/wp-content/uploads/avstand1-2-300x201.jpg 300w, https://www.winsoft.se/wp-content/uploads/avstand1-2-150x101.jpg 150w" sizes="auto, (max-width: 443px) 100vw, 443px" /></figure>



<p class="wp-block-paragraph">Tetralogier:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="491" height="319" src="https://www.winsoft.se/wp-content/uploads/avstand2.jpg" alt="" class="wp-image-17274" srcset="https://www.winsoft.se/wp-content/uploads/avstand2.jpg 491w, https://www.winsoft.se/wp-content/uploads/avstand2-300x195.jpg 300w, https://www.winsoft.se/wp-content/uploads/avstand2-150x97.jpg 150w" sizes="auto, (max-width: 491px) 100vw, 491px" /></figure>



<p class="wp-block-paragraph">Och några filmserier med fem eller flera delar:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="412" height="309" src="https://www.winsoft.se/wp-content/uploads/avstand3-1.jpg" alt="" class="wp-image-17285" srcset="https://www.winsoft.se/wp-content/uploads/avstand3-1.jpg 412w, https://www.winsoft.se/wp-content/uploads/avstand3-1-300x225.jpg 300w, https://www.winsoft.se/wp-content/uploads/avstand3-1-150x113.jpg 150w" sizes="auto, (max-width: 412px) 100vw, 412px" /></figure>



<p class="wp-block-paragraph">Så hur har dessa tagits emot? Det är kanske den mest viktiga informationen för den som vill avgöra om det är värt att köpa biljett till nästa film i serien. Så här populära är filmerna i trilogierna, viktat mot övriga delar i serien:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="443" height="296" src="https://www.winsoft.se/wp-content/uploads/betyg1-1.jpg" alt="" class="wp-image-17281" srcset="https://www.winsoft.se/wp-content/uploads/betyg1-1.jpg 443w, https://www.winsoft.se/wp-content/uploads/betyg1-1-300x200.jpg 300w, https://www.winsoft.se/wp-content/uploads/betyg1-1-150x100.jpg 150w" sizes="auto, (max-width: 443px) 100vw, 443px" /></figure>



<p class="wp-block-paragraph">Det verkar som att både Göta kanal och Exorcisten är särskilt populära i sin första del jämfört med uppföljarna. Så här ser populariteten ut för tetralogier:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="443" height="296" src="https://www.winsoft.se/wp-content/uploads/betyg2.jpg" alt="" class="wp-image-17278" srcset="https://www.winsoft.se/wp-content/uploads/betyg2.jpg 443w, https://www.winsoft.se/wp-content/uploads/betyg2-300x200.jpg 300w, https://www.winsoft.se/wp-content/uploads/betyg2-150x100.jpg 150w" sizes="auto, (max-width: 443px) 100vw, 443px" /></figure>



<p class="wp-block-paragraph">The Crow och Highlander verkar ha lidit en hel del av att ha uppföljare, medan både Toy Story och Alien verkar ha klarat det ganska bra. Så här ser det ut för långkörarserierna:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="443" height="296" src="https://www.winsoft.se/wp-content/uploads/betyg3.jpg" alt="" class="wp-image-17279" srcset="https://www.winsoft.se/wp-content/uploads/betyg3.jpg 443w, https://www.winsoft.se/wp-content/uploads/betyg3-300x200.jpg 300w, https://www.winsoft.se/wp-content/uploads/betyg3-150x100.jpg 150w" sizes="auto, (max-width: 443px) 100vw, 443px" /></figure>



<p class="wp-block-paragraph">Om man tittar på samtliga filmer ovan, hur mycket betyget har förändrats från första till andra delen, kan vi konstatera att några filmer, inte minst Ster trek, Mad Max och Terminator har en del två som är bättre än del ett, medan uppföljaren till Exorcisten var en besvikelse för publiken.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="754" height="453" src="https://www.winsoft.se/wp-content/uploads/skillnad.jpg" alt="" class="wp-image-17282" srcset="https://www.winsoft.se/wp-content/uploads/skillnad.jpg 754w, https://www.winsoft.se/wp-content/uploads/skillnad-300x180.jpg 300w, https://www.winsoft.se/wp-content/uploads/skillnad-150x90.jpg 150w" sizes="auto, (max-width: 754px) 100vw, 754px" /></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2022/05/avstand-mellan-uppfoljare-och-deras-betyg/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Hur får man bra ljud i en podcast?</title>
		<link>https://www.winsoft.se/2022/04/hur-far-man-bra-ljud-i-en-podcast/</link>
					<comments>https://www.winsoft.se/2022/04/hur-far-man-bra-ljud-i-en-podcast/#comments</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sun, 24 Apr 2022 10:01:22 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17250</guid>

					<description><![CDATA[Podcastproduktion sker i flera steg. Man ska rigga utrustning, göra en soundcheck, spela in podcasten, klippa den, montera och mastra den och publicera den. Jag har redigerat ljud i vågformseditorer sedan tidigt 1990-tal och poddat sedan 00-talet. Jag har bl.a. varit inblandad i produktionen av Skeptikerpodden, Radio Bulletin, Stulet gods, Radio Houdi, Generation YX och [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Podcastproduktion sker i flera steg. Man ska rigga utrustning, göra en soundcheck, spela in podcasten, klippa den, montera och mastra den och publicera den. Jag har redigerat ljud i vågformseditorer sedan tidigt 1990-tal och poddat sedan 00-talet. Jag har bl.a. varit inblandad i produktionen av Skeptikerpodden, Radio Bulletin, Stulet gods, Radio Houdi, Generation YX och Samtal. I och med att jag sysslat en del med montering och mastring, och får ibland frågan om jag kan bistå. På grund av arbetsbelastning så tackar jag alltid nej, men det är inte speciellt svårt att göra en mastring på egen hand.</p>



<p class="wp-block-paragraph">För att resultatet ska bli riktigt bra, måste inspelningen ha gjorts korrekt. Inspelningsvolymen får inte vara för låg, för då kan man få problem med brus. Inspelningsvolymen får absolut inte vara för hög (&#8220;clipping&#8221; &#8211; ej att förväxla med klippning), för då blir vågformen helt enkelt förstörd. Mikrofonerna bör vara någorlunda bra, och helst vill man inte ha mikrofonen för nära munnen eller andas direkt in i mikrofonen. Har man ingen bra inspelningsstudio så finns det risk att mikrofonen plockar upp rumseko och att ljudet därför blir lite burkigt. Många brukar lösa detta genom att sänka inspelningsvolymen och prata närmre mikrofonen. Det fungerar, men det introducerar ett annat problem, nämligen att ljudet låter onaturligt, som om någon pratar rätt in i ditt öra. Utan tillgång till professionell utrustning får man göra vad man kan.</p>



<p class="wp-block-paragraph">Tänk också på att använda puffskydd (vissa säger &#8220;pop-filer&#8221; numera) för att minska risken att man skapa oljud genom att andas på mikrofonens membran.</p>



<p class="wp-block-paragraph">Om fler än en person pratar i podcasten, så är det bra om dessa ligger i var sin fil under mastringen. Särskilt ljudnivåerna är bra att kunna styra individuellt.</p>



<p class="wp-block-paragraph">Mastringsarbetet görs i speciella program för vågformseditering. Man arbetar alltså med redan renderade ljudfiler, direkt mot vågformen. Dessa program kan benämnas på lite olika sätt, men wave editor är ganska vedertaget. I programmet öppnar du upp det klippta råmaterialet du fått från klipparen, där varje kanal är en fil, och ditt ansvar är att:</p>



<ol class="wp-block-list"><li>Harmoniera bitdjup och samplingsfrekvens</li><li>Korrigera nivåer</li><li>Eventuell brusreducering och eventuell frekvensutjämning (equalization)</li><li>Montering av röstkanaler</li><li>Komprimering</li><li>Eventuell extra klippning</li><li>Montering av signaturmelodier</li><li>Slutrendering</li></ol>



<p class="wp-block-paragraph"><strong>Harmoniera bitdjup och samplingsfrekvens</strong></p>



<p class="wp-block-paragraph">Eftersom vi jobbar direkt i vågformen så får vi ingen hjälp av mjukvaran att hantera om ljudfilerna har olika bitdjup. Bitdjupet anger hur många möjliga impulsnivåer varje samplingspunkt har, och ett högre tal är bättre. 8-bit, 16-bit eller 24-bit är ganska vanligt. Professionella ljudproducenter brukar arbeta med 24-bit och leverera en slutprodukt som är 16-bit, men arbetar man med podcasts så räcker det ofta att kontrollera att ingen inblandad ljudfil är sämre än 16-bit.</p>



<p class="wp-block-paragraph">När det gäller samplingsfrekvens, som anger samplingspunkternas täthet, är 44,1 KHz lämplig, men vissa inspelningsprogram kan leverera filer på 22,05 eller 48 KHz. Högre är bättre även här. Då behöver du göra en <em>resample</em> till 44,1 KHz, som är fullt tillräckligt för att mastra en podcast. När alla filer har samma bitdjup och samplingsfrekvens är detta steg färdigt.</p>



<p class="wp-block-paragraph"><strong>Korrigera nivåer</strong></p>



<p class="wp-block-paragraph">Det är bra om samtliga medverkande har samma impulsstyrka, till den grad man kan styra det. I exemplet på bilden har vi två filer. Den ena filen innehåller en person som pratar i en mikrofon, och den andra filen innehåller två personer som delar på en mikrofon. Båda är lite för låga för att det ska vara passande, men det är lättare att göra ett bra jobb om ursprungsimpulsen är lite för låg än lite för hög.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="469" src="https://www.winsoft.se/wp-content/uploads/wave1-1024x469.jpg" alt="" class="wp-image-17251" srcset="https://www.winsoft.se/wp-content/uploads/wave1-1024x469.jpg 1024w, https://www.winsoft.se/wp-content/uploads/wave1-300x137.jpg 300w, https://www.winsoft.se/wp-content/uploads/wave1-150x69.jpg 150w, https://www.winsoft.se/wp-content/uploads/wave1-768x352.jpg 768w, https://www.winsoft.se/wp-content/uploads/wave1.jpg 1068w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Den ena kanalen (överst) är lite svagare än den andra, så båda behöver förstärkas, men den övre lite mer än den undre. Notera att något sticker ut mot slutet av filen. Om den biten ska vara med, bör inte volymen höjas mer än att den biten fortfarande har god marginal till impulsens maxvärde. Det kan i värsta fall vara ljud i båda kanalerna samtidigt där, och då finns det risk att clipping uppstår när filerna slås samman.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="972" height="246" src="https://www.winsoft.se/wp-content/uploads/wave2.jpg" alt="" class="wp-image-17252" srcset="https://www.winsoft.se/wp-content/uploads/wave2.jpg 972w, https://www.winsoft.se/wp-content/uploads/wave2-300x76.jpg 300w, https://www.winsoft.se/wp-content/uploads/wave2-150x38.jpg 150w, https://www.winsoft.se/wp-content/uploads/wave2-768x194.jpg 768w" sizes="auto, (max-width: 972px) 100vw, 972px" /></figure>



<p class="wp-block-paragraph">Innan jag höjt volymen tillräckligt på första kanalen, inser jag att detta kommer att slå i taket. Efter att ha zoomat in, kan jag konstatera detta är ett skratt som ska vara med i slutprodukten. För att få upp volymen till önskad nivå, måste jag manuellt först sänka volymen på det skrattet. Jag gör samma sak i båda filerna, om än lite mindre i den andra. Detta är jag nöjd med:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="475" src="https://www.winsoft.se/wp-content/uploads/wave3-1024x475.jpg" alt="" class="wp-image-17253" srcset="https://www.winsoft.se/wp-content/uploads/wave3-1024x475.jpg 1024w, https://www.winsoft.se/wp-content/uploads/wave3-300x139.jpg 300w, https://www.winsoft.se/wp-content/uploads/wave3-150x70.jpg 150w, https://www.winsoft.se/wp-content/uploads/wave3-768x356.jpg 768w, https://www.winsoft.se/wp-content/uploads/wave3.jpg 1052w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"><strong>Eventuell brusreducering och eventuell frekvensutjämning</strong></p>



<p class="wp-block-paragraph">Det ser ut att hända en del saker, särskilt i den undre filen, mellan pratet. Är det störande ljud som måste tas bort (funktionen &#8220;mute&#8221;)? Skiljer de två filerna varandra åt i frekvensomfång? Det behöver rättas till med en equalizer. Innehåller någon fil mer toppar och dalar än den andra, eller är någon fil mer fyrkantig (kanjonisk) än någon annan? Den med många toppar och dalar kanske behöver ha lite kompressor redan i detta steg. Det är bra om filerna liknar varandra.</p>



<p class="wp-block-paragraph"><strong>Montering av röstkanaler</strong></p>



<p class="wp-block-paragraph">När filerna är tillräckligt lika varandra, ska de slås samman till en fil. Den funktionen brukar heta &#8220;mix&#8221; i denna form av program. Nu ser vi första versionen av den fil som är resultatet av vårt arbete.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="966" height="270" src="https://www.winsoft.se/wp-content/uploads/wave4.jpg" alt="" class="wp-image-17254" srcset="https://www.winsoft.se/wp-content/uploads/wave4.jpg 966w, https://www.winsoft.se/wp-content/uploads/wave4-300x84.jpg 300w, https://www.winsoft.se/wp-content/uploads/wave4-150x42.jpg 150w, https://www.winsoft.se/wp-content/uploads/wave4-768x215.jpg 768w" sizes="auto, (max-width: 966px) 100vw, 966px" /></figure>



<p class="wp-block-paragraph"><strong>Komprimering</strong></p>



<p class="wp-block-paragraph">Nu vill vi att volymen ska vara jämn och stark, så att alla detaljer hörs, även när det pratas tyst, och så att inte lyssnaren får hörselskador av något häftigt skratt. Vi vill lägga kompressor på ljudet. I en vågformseditor brukar denna hantering kallas compression. Jag brukar gå fram ganska försiktigt, till en början. Är man för snål, kan det bli svårt att höra alla detaljer, och det kan komma höga överraskningar för lyssnaren. Tar man i för mycket, låter ljudet onaturligt, som om någon står mycket nära dig och pratar.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="967" height="268" src="https://www.winsoft.se/wp-content/uploads/wave5.jpg" alt="" class="wp-image-17255" srcset="https://www.winsoft.se/wp-content/uploads/wave5.jpg 967w, https://www.winsoft.se/wp-content/uploads/wave5-300x83.jpg 300w, https://www.winsoft.se/wp-content/uploads/wave5-150x42.jpg 150w, https://www.winsoft.se/wp-content/uploads/wave5-768x213.jpg 768w" sizes="auto, (max-width: 967px) 100vw, 967px" /></figure>



<p class="wp-block-paragraph">Det där höga skrattet på slutet sticker inte längre ut i ljudstyrka, utan i att den som skrattar tillfälligt låter lite &#8220;närmre&#8221; lyssnaren. Dessutom är fraser som yttrats lite försiktigt i bakgrunden, nu fullt hörbara.</p>



<p class="wp-block-paragraph"><strong>Eventuell extra klippning</strong></p>



<p class="wp-block-paragraph">Det är bra att zooma in och titta igenom vågformen efter omotiverat långa pauser, eller onödigt många ticks, som t.ex. &#8220;ööhhh&#8230;&#8221; eller liknande. Ta inte bort allt, bara några stycken. Korta inte gärna ner pauser utan att säkerställa att du inte klipper i andetag, ta hellre bort någon omotiverad paus då och då.</p>



<p class="wp-block-paragraph"><strong>Montering av signaturmelodier</strong></p>



<p class="wp-block-paragraph">Kontrollera att signaturmelodierna ligger strax under pratet i volymstyrka, och mixa in musiken först, sist eller var det ska ligga. Tänk på att om musik och prat ska gå in i varandra, så blir den totala ljudstyrkan högre där detta sker.</p>



<p class="wp-block-paragraph"><strong>Slutrendering</strong></p>



<p class="wp-block-paragraph">För en podcast brukar man välja att rendera slutresultatet som en MP3-fil, med en bithastighet på 128 kilobit per sekund (Kbps), i 16-bitars mono. Det ger en bra kompromiss mellan filstorlek och ljudkvalitet.</p>



<p class="wp-block-paragraph">När man har fått rutin på denna process brukar det inte vara mer än en halvtimmas arbete per podcastavsnitt, innan du kan lämna resultatet vidare till den som ansvarar för publicering. Lycka till!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2022/04/hur-far-man-bra-ljud-i-en-podcast/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Sprite (OpenGL i .NET Framework)</title>
		<link>https://www.winsoft.se/2022/02/sprite-opengl-i-net-framework/</link>
					<comments>https://www.winsoft.se/2022/02/sprite-opengl-i-net-framework/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Thu, 24 Feb 2022 18:29:00 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Indiegame]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17234</guid>

					<description><![CDATA[Jag har dragit nytta av ett gammalt C#-repository som wrappar OpenGL för .NET Framework för att bygga ett minimalistiskt spelramverk. Följande kod visar stjärnor som flyger över skärmen, från höger till vänster. Projektet är .NET Framework 4.8 som jag valde för att det finns inbyggt Windows 10/11. Exemplet visar initiering av spelmotorn, att skapa sprites [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Jag har dragit nytta av <a rel="noreferrer noopener" href="https://github.com/r1sc/Sprite" target="_blank">ett gammalt C#-repository som wrappar OpenGL för .NET Framework</a> för att bygga ett minimalistiskt spelramverk. Följande kod visar stjärnor som flyger över skärmen, från höger till vänster. Projektet är .NET Framework 4.8 som jag valde för att det finns inbyggt Windows 10/11.</p>



<p class="wp-block-paragraph">Exemplet visar initiering av spelmotorn, att skapa sprites med GDI+, användning av en scen, tangentbordsavläsning, en sprite batch (som erbjuder fire-and-forget sprites).</p>



<p class="wp-block-paragraph">Projekttypen är en console application, och referenserna är <a rel="noreferrer noopener" href="https://github.com/Anders-H/Sprite" target="_blank">Sprite</a> och System.Drawing. <a rel="noreferrer noopener" href="https://github.com/Anders-H/Sprite" target="_blank">Repositoryt finns här</a> och detta är den kompletta koden:</p>



<pre class="wp-block-code"><code>using System;
using System.Drawing;
using Sprite;

namespace Starfield
{
    public class Program
    {
        public static SpriteBitmap Star;
        public static GameEngine GameEngine { get; private set; }

        public static void Main()
        {
            // Create and initialize the game engine.
            GameEngine = new GameEngine("Starfield", OnLoadResources);
            GameEngine.LoadResources();

            // Run the game.
            GameEngine.Run(new StarfieldScene());
        }

        private static void OnLoadResources(object sender, EventArgs e)
        {
            // Draw a "star".
            var star = new Bitmap(2, 2);
            star.SetPixel(0, 1, Color.White);
            star.SetPixel(0, 0, Color.White);
            star.SetPixel(1, 1, Color.White);
            star.SetPixel(1, 0, Color.White);

            // Create a sprite bitmap from the star.
            Star = SpriteBitmap.FromImage(star, 1, 1);

            // Tell engine that loading is completed.
            GameEngine.SetLoadResourcesComplete();
        }
    }

    // Define the star sprite that will fly from right to left.
    public class StarSprite : BatchGameSprite
    {
        private int SpeedX { get; }

        public StarSprite(SpriteBitmap spriteBitmap, int y, int speedX) : base(spriteBitmap, 320, y, 1)
        {
            SpeedX = speedX;
        }

        public override void ApplyLogic() =&gt;
            X += SpeedX;

        public override bool Alive() =&gt;
            X &gt; -5;
    }

    public class StarfieldScene : IScene
    {
        private readonly Random _rnd = new Random();

        // Create a sprite batch (used for fire-and-forget sprites) to hold the stars.
        private readonly SpriteBatch _spriteBatch = new SpriteBatch();

        public void Render(GameEngine gameEngine)
        {
            // Check if the user wants to exit.
            if (gameEngine.SpriteWindow.IsKeyDown(VirtualKeys.Escape))
                gameEngine.SpriteWindow.Running = false;

            // Add a new star each frame.
            _spriteBatch.Add(new StarSprite(Program.Star, _rnd.Next(199), -(_rnd.Next(5) + 1)));

            // Make the stars act.
            _spriteBatch.ApplyLogic();

            // Draw the frame.
            _spriteBatch.Draw(gameEngine.SpriteWindow);
            gameEngine.SpriteWindow.Swap();
        }
    }
}</code></pre>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2022/02/sprite-opengl-i-net-framework/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Mutable strings i C#</title>
		<link>https://www.winsoft.se/2022/02/mutable-strings-i-c/</link>
					<comments>https://www.winsoft.se/2022/02/mutable-strings-i-c/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sun, 13 Feb 2022 14:45:04 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17230</guid>

					<description><![CDATA[Den strängtyp som finns inbyggd i C# är &#8220;immutable&#8221;, vilket betyder att den inte kan ändra värde. Jag har skapat en &#8220;mutable string&#8221;, som kapslar strängtypen i en klass. Det innebär att man kan anropa funktioner på strängen för att få den att ändra värde. Dessa funktioner, och funktionerna för att analysera strängens innehåll, har [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Den strängtyp som finns inbyggd i C# är &#8220;immutable&#8221;, vilket betyder att den inte kan ändra värde. Jag har skapat en &#8220;mutable string&#8221;, som kapslar strängtypen i en klass. Det innebär att man kan anropa funktioner på strängen för att få den att ändra värde. Dessa funktioner, och funktionerna för att analysera strängens innehåll, har färdiga implementationer, men dessa kan ersättas. T.ex. kan funktionen Is svara på frågan om två strängar har samma värde, enligt de flaggor som angavs när strängen skapades, eller så kan man skicka med egen kod som utför jämförelsen som argument till funktionen Is. Mer information finns här: <a href="https://github.com/Anders-H/MutableStringLibrary" target="_blank" rel="noreferrer noopener">https://github.com/Anders-H/MutableStringLibrary</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2022/02/mutable-strings-i-c/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Last Christmas, Radio ga-ga</title>
		<link>https://www.winsoft.se/2021/12/last-christmas-radio-ga-ga/</link>
					<comments>https://www.winsoft.se/2021/12/last-christmas-radio-ga-ga/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Wed, 22 Dec 2021 15:59:07 +0000</pubDate>
				<category><![CDATA[Pop culture]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17218</guid>

					<description><![CDATA[Nu när vi behöver höra Last Christmas av Wham! tre gånger om dagen under en månads tid, kanske någon under någon av lyssningarna tänker att trummorna låter ungefär som det episka soundet på Radio ga-ga av Queen. Det finns såklart skäl till det. Under det tidiga 1980-talet hade trummaskinen blivit något av ett instrument att [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Nu när vi behöver höra <a href="https://en.wikipedia.org/wiki/Last_Christmas" target="_blank" rel="noreferrer noopener">Last Christmas</a> av Wham! tre gånger om dagen under en månads tid, kanske någon under någon av lyssningarna tänker att trummorna låter ungefär som det episka soundet på <a href="https://en.wikipedia.org/wiki/Radio_Ga_Ga" target="_blank" rel="noreferrer noopener">Radio ga-ga</a> av Queen. Det finns såklart skäl till det.</p>



<p class="wp-block-paragraph">Under det tidiga 1980-talet hade trummaskinen blivit något av ett instrument att räkna med inom pop-branschen. Tidigare var det mest synthare som intresserade sig för detta instrument. Något som Wham! och Queen hade gemensamt var att de gärna använde sig av syntetiska instrument, utan att direkt företräda musikstilen synth &#8211; särskilt inte Queen som aktivt tog avstånd från elektroniska instrument under sina första år av karriären.</p>



<p class="wp-block-paragraph">Den första skiva Queen hade synthpålägg på var The Game (1980) men har sedan dess använt synthar väldigt flitigt, och gärna trummaskin på ett par låtar per skiva, dock inte på The Game &#8211; Another one bites the dust är en s.k. drum loop, som spelades in akustiskt med Roger Taylor bakom trumsetet.</p>



<p class="wp-block-paragraph">Och något som utmärker musiker som inte är synthare, är att det är lättare att identifiera vilka syntetiska instrument som är i bruk, för icke-synthare tenderar att inte maskera sina instrumentval lika väl som riktiga synthare gör. Riktiga synthare kan rent av tänka sig att designa sina egna instrument, för att vara unika på allvar. Därför är det enkelt att höra att både Last Christmas och Radio ga-ga använder samma fabrikat av trummaskin. Under den här tiden var det <a href="https://en.wikipedia.org/wiki/Roger_Linn" target="_blank" rel="noreferrer noopener">Linn Electronics</a> som ägde marknaden för trummaskiner.</p>



<p class="wp-block-paragraph">Last Christmas använde <a rel="noreferrer noopener" href="https://en.wikipedia.org/wiki/LinnDrum" target="_blank">LinnDrum</a> (1982) som var laddad med 8-bitarssamples. När man pratar om digitalt ljud så anger antalet bitar impulsstegen och frekvensen (35 KHz) anger samplingstätheten. Så mycket som möjligt av båda är önskvärt, och idag brukar digitala instrument jobba med 16-24 bitar och 44-48 KHz, men det allra viktigaste är att de ljudimpulser (själva slaginstrumenten) som lagras håller god kvalitet och kan återges utan störningar.</p>



<p class="wp-block-paragraph">Radio ga-ga är marginellt äldre än Last Christmas, men är uppbyggd med en enklare trummaskin, nämligen <a href="https://en.wikipedia.org/wiki/Linn_LM-1" target="_blank" rel="noreferrer noopener">Linn LM-1</a> (1980). Linn LM-1 var en stor enhet som kostade dubbelt så mycket som en LinnDrum, men den kunde bara återge ljud i 28 KHz. Det är lite svårt att avgöra om det verkligen är samma sampling som utgör virveltrumman i de olika låtarna, för equalizer och effekter kan göra så mycket för med ett ljud, men troligtvis är det så.</p>



<p class="wp-block-paragraph">Trummprogrammeringen i Radio ga-ga gjordes av Roger Taylor i sin hemmastudio och låten var avsedd för en av hans soloskivor. Efter att John Deacon skrivit ett basarrangemang och Freddie Mercury omkonstruerat låten, insåg han att den kunde bli en framgång med Queen. Han medverkade inte i inspelningen, utan lät Freddie Mercury och Fred Mandel bygga upp och spela in låten. (Att stuva om i Roger Taylors låtar medan han var frånvarande blev något av en vana för Freddie Mercury, vilket inte minst märks på A kind of magic &#8211; <a rel="noreferrer noopener" href="https://www.youtube.com/watch?v=gzbWXD45GC8&amp;ab_channel=GoldeenRock1992" target="_blank">original</a>/<a href="https://www.youtube.com/watch?v=0p_1QSUsbsM">albumversion</a>.)</p>



<p class="wp-block-paragraph">Roger Linn, som designade Linn LM-1 och LinnDrum, fick en Grammy 2011 för sin insats för musikindustrin.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2021/12/last-christmas-radio-ga-ga/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Rendera mandelbrotmängden</title>
		<link>https://www.winsoft.se/2021/12/rendera-mandelbrotmangden/</link>
					<comments>https://www.winsoft.se/2021/12/rendera-mandelbrotmangden/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Wed, 15 Dec 2021 17:46:58 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17205</guid>

					<description><![CDATA[Min första kontakt med mandelbrotmängden var ett BASIC-program av Bo E. Carlsson runt 1990. Sedan dess har Andrej Bauer skrivit ett C++-program som skriver mandelbrotmängden till en bildfil. Programmet gick att kompilera med en C#-kompilator med endast små justeringar, vilket syns här: Den anpassade koden varken ritar bilden eller skriver den fill någon fil, utan [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Min första kontakt med mandelbrotmängden var ett BASIC-program av Bo E. Carlsson runt 1990. Sedan dess har Andrej Bauer <a rel="noreferrer noopener" href="https://gist.github.com/andrejbauer/7919569" target="_blank">skrivit ett C++-program som skriver mandelbrotmängden</a> till en bildfil. Programmet gick att kompilera med en C#-kompilator med endast små justeringar, vilket syns här:</p>



<pre class="wp-block-code" style="font-size:12px"><code>var rawData = new ImageRawData(width, height);


var xmin = 0.27085;
var xmax = 0.27100;
var ymin = 0.004640;
var ymax = 0.004810;
var maxiter = 1000;

var dx = (xmax - xmin) / width;
var dy = (ymax - ymin) / height;

for (var j = 0; j &lt; height; j++)
{
    var y = ymax - j * dy;
    for (var i = 0; i &lt; width; i++)
    {
        var u = 0.0;
        var v = 0.0;
        var u2 = u * u;
        var v2 = v * v;
        var x = xmin + i * dx;
        
        int k;
        for (k = 1; k &lt; maxiter &amp;&amp; u2 + v2 &lt; 4.0; k++)
        {
            v = 2 * u * v + y;
            u = u2 - v2 + x;
            u2 = u * u;
            v2 = v * v;
        }

        rawData.SetValue(i, j, k &gt;= maxiter ? null : k);
    }
}
</code></pre>



<p class="wp-block-paragraph">Den anpassade koden varken ritar bilden eller skriver den fill någon fil, utan samlar resultatet i en 2-dimensionell array som heter <strong>rawData</strong> (av typen <strong>ImageRawData</strong>). Anledningen till det är att jag vill kunna lägga på renderingsfilter efter att fraktalen är beräknad. I implementation har jag hittills endast lagt in en linjär interpolering till en gråskala mellan 0 och 255, men möjligheten att hitta på något roligt finns där.</p>



<pre class="wp-block-code" style="font-size:12px"><code>public class ImageRawData
{
    private readonly int _width;
    private readonly int _height;
    private readonly int?&#91;,] _data;

    public ImageRawData(int width, int height)
    {
        _width = width;
        _height = height;
        _data = new int?&#91;width, height];
    }

    public void SetValue(int x, int y, int? value) =&gt;
        _data&#91;x, y] = value;

    public int GetValue(int x, int y) =&gt;
        _data&#91;x, y] ?? 0;

    private int GetLargest()
    {
        var largest = int.MinValue;

        for (var y = 0; y &lt; _height; y++)
            for (var x = 0; x &lt; _width; x++)
                if (_data&#91;x, y].HasValue &amp;&amp; _data&#91;x, y] &gt; largest)
                    largest = _data&#91;x, y]!.Value;

        return largest;
    }

    private int GetSmallest()
    {
        var smallest = int.MaxValue;

        for (var y = 0; y &lt; _height; y++)
            for (var x = 0; x &lt; _width; x++)
                if (_data&#91;x, y].HasValue &amp;&amp; _data&#91;x, y] &lt; smallest)
                    smallest = _data&#91;x, y]!.Value;

        return smallest;
    }

    public void Interpolate(int min, int max)
    {
        var smallest = GetSmallest();
        var largest = GetLargest();

        for (var y = 0; y &lt; _height; y++)
        {
            for (var x = 0; x &lt; _width; x++)
            {
                if (_data&#91;x, y].HasValue)
                {
                    var v1 = _data&#91;x, y]!.Value;
                    var v2 = LinearInterpolate(v1, smallest, largest, min, max);
                    _data&#91;x, y] = v2;
                    continue;
                }

                _data&#91;x, y] = max;
            }
        }
    }

    private static int LinearInterpolate(int value, int smallest, int largest, int min, int max)
    {
        var result = min + (value - smallest) * (max - min) / (largest - smallest);
        
        if (result &lt; min)
            result = min;

        if (result &gt; max)
            result = max;

        return result;
    }
}</code></pre>



<p class="wp-block-paragraph">Själva renderingen har jag lagt i en iteration, där jag påverkar zoom-faktorn en aning, för att kunna skapa en animation. Jag gör det lite asymmetriskt för effektens skull. Iteratorn heter <strong>frameCount</strong>.</p>



<pre class="wp-block-code" style="font-size:12px"><code>var xmin = 0.27085 + frameCount * 0.0000001;
var xmax = 0.27100 - frameCount * 0.0000002;
var ymin = 0.004640 + frameCount * 0.0000003;
var ymax = 0.004810 - frameCount * 0.0000004;
var maxiter = 1000;</code></pre>



<p class="wp-block-paragraph">Sen är det bara att kapsla in kalaset i ett ramverk. Jag använder Windows Forms så att jag kan titta på varje renderad bild medan animationen renderas. Eftersom själva resultatet är animationen som skrivs till disk, inte själva programmet, så har jag kostat på mig att göra allt arbete i GUI-tråden. Sedvanliga ursäkter.</p>



<pre class="wp-block-code" style="font-size:12px"><code>using System.Drawing.Imaging;

namespace WinFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Shown(object sender, EventArgs e)
        {
            Refresh();
            using var g = CreateGraphics();
            const int width = 1024;
            const int height = 1024;

            for (var frameCount = 0; frameCount &lt; 1000; frameCount++)
            {
                var rawData = new ImageRawData(width, height);

                var xmin = 0.27085 + frameCount * 0.0000001;
                var xmax = 0.27100 - frameCount * 0.0000002;
                var ymin = 0.004640 + frameCount * 0.0000003;
                var ymax = 0.004810 - frameCount * 0.0000004;
                var maxiter = 1000;

                var dx = (xmax - xmin) / width;
                var dy = (ymax - ymin) / height;

                for (var j = 0; j &lt; height; j++)
                {
                    var y = ymax - j * dy;
                    for (var i = 0; i &lt; width; i++)
                    {
                        var u = 0.0;
                        var v = 0.0;
                        var u2 = u * u;
                        var v2 = v * v;
                        var x = xmin + i * dx;
                        
                        int k;
                        for (k = 1; k &lt; maxiter &amp;&amp; u2 + v2 &lt; 4.0; k++)
                        {
                            v = 2 * u * v + y;
                            u = u2 - v2 + x;
                            u2 = u * u;
                            v2 = v * v;
                        }

                        rawData.SetValue(i, j, k &gt;= maxiter ? null : k);
                    }
                }

                Application.DoEvents();
                rawData.Interpolate(0, 255);
                using var image = new Bitmap(width, height);

                for (var yy = 0; yy &lt; height; yy++)
                    for (var xx = 0; xx &lt; width; xx++)
                        image.SetPixel(xx, yy, Color.FromArgb(
                            rawData.GetValue(xx, yy),
                            rawData.GetValue(xx, yy),
                            rawData.GetValue(xx, yy)
                        ));

                g.DrawImage(image, 0, 0);
                Application.DoEvents();
                image.Save($@"C:\Temp\Frame{frameCount:00000}.png", ImageFormat.Png);
                Application.DoEvents();
            }
        }
    }
}</code></pre>



<p class="wp-block-paragraph">Resultatet för just dessa värden är följande video:</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Mandelbrotmängden" width="500" height="375" src="https://www.youtube.com/embed/4ZN6B6yjIRI?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2021/12/rendera-mandelbrotmangden/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>TV4 uppmärksammar behovet av religiöst neutrala begravningsplatser</title>
		<link>https://www.winsoft.se/2021/12/tv4-uppmarksammar-behovet-av-religiost-neutrala-begravningsplatser/</link>
					<comments>https://www.winsoft.se/2021/12/tv4-uppmarksammar-behovet-av-religiost-neutrala-begravningsplatser/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sun, 05 Dec 2021 15:21:53 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17197</guid>

					<description><![CDATA[Häromdagen sände TV4-nyheterna ett inslag om religiöst neutrala begravningsplatser. I egenskap av ordförande i Humanisterna Örebro stöttade jag initiativet. TV4 Play: https://www.tv4play.se/program/nyheterna/religi%C3%B6sa-symboler-plockas-ned-i-kapellet-%C3%B6ppnar-f%C3%B6r-neutrala-begravningar/13732416 &#160; &#160; &#160; &#160; &#160; &#160; Visa detta inlägg på Instagram &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; Ett inlägg delat av Anders Hesselbom (@andershbom)]]></description>
										<content:encoded><![CDATA[<p>Häromdagen sände TV4-nyheterna ett inslag om religiöst neutrala begravningsplatser. I egenskap av ordförande i Humanisterna Örebro stöttade jag initiativet. TV4 Play: <a href="https://www.tv4play.se/program/nyheterna/religi%C3%B6sa-symboler-plockas-ned-i-kapellet-%C3%B6ppnar-f%C3%B6r-neutrala-begravningar/13732416" target="_blank" rel="noopener">https://www.tv4play.se/program/nyheterna/religi%C3%B6sa-symboler-plockas-ned-i-kapellet-%C3%B6ppnar-f%C3%B6r-neutrala-begravningar/13732416</a></p>
<blockquote class="instagram-media" style="background: #FFF; border: 0; border-radius: 3px; box-shadow: 0 0 1px 0 rgba(0,0,0,0.5),0 1px 10px 0 rgba(0,0,0,0.15); margin: 1px; max-width: 540px; min-width: 326px; padding: 0; width: calc(100% - 2px);" data-instgrm-captioned="" data-instgrm-permalink="https://www.instagram.com/p/CW_u00hoMqD/?utm_source=ig_embed&amp;utm_campaign=loading" data-instgrm-version="14">
<div style="padding: 16px;">
<p>&nbsp;</p>
<div style="display: flex; flex-direction: row; align-items: center;">
<div style="background-color: #f4f4f4; border-radius: 50%; flex-grow: 0; height: 40px; margin-right: 14px; width: 40px;">&nbsp;</div>
<div style="display: flex; flex-direction: column; flex-grow: 1; justify-content: center;">
<div style="background-color: #f4f4f4; border-radius: 4px; flex-grow: 0; height: 14px; margin-bottom: 6px; width: 100px;">&nbsp;</div>
<div style="background-color: #f4f4f4; border-radius: 4px; flex-grow: 0; height: 14px; width: 60px;">&nbsp;</div>
</div>
</div>
<div style="padding: 19% 0;">&nbsp;</div>
<div style="display: block; height: 50px; margin: 0 auto 12px; width: 50px;">&nbsp;</div>
<div style="padding-top: 8px;">
<div style="color: #3897f0; font-family: Arial,sans-serif; font-size: 14px; font-style: normal; font-weight: 550; line-height: 18px;">Visa detta inlägg på Instagram</div>
</div>
<div style="padding: 12.5% 0;">&nbsp;</div>
<div style="display: flex; flex-direction: row; margin-bottom: 14px; align-items: center;">
<div>
<div style="background-color: #f4f4f4; border-radius: 50%; height: 12.5px; width: 12.5px; transform: translateX(0px) translateY(7px);">&nbsp;</div>
<div style="background-color: #f4f4f4; height: 12.5px; transform: rotate(-45deg) translateX(3px) translateY(1px); width: 12.5px; flex-grow: 0; margin-right: 14px; margin-left: 2px;">&nbsp;</div>
<div style="background-color: #f4f4f4; border-radius: 50%; height: 12.5px; width: 12.5px; transform: translateX(9px) translateY(-18px);">&nbsp;</div>
</div>
<div style="margin-left: 8px;">
<div style="background-color: #f4f4f4; border-radius: 50%; flex-grow: 0; height: 20px; width: 20px;">&nbsp;</div>
<div style="width: 0; height: 0; border-top: 2px solid transparent; border-left: 6px solid #f4f4f4; border-bottom: 2px solid transparent; transform: translateX(16px) translateY(-4px) rotate(30deg);">&nbsp;</div>
</div>
<div style="margin-left: auto;">
<div style="width: 0px; border-top: 8px solid #F4F4F4; border-right: 8px solid transparent; transform: translateY(16px);">&nbsp;</div>
<div style="background-color: #f4f4f4; flex-grow: 0; height: 12px; width: 16px; transform: translateY(-4px);">&nbsp;</div>
<div style="width: 0; height: 0; border-top: 8px solid #F4F4F4; border-left: 8px solid transparent; transform: translateY(-4px) translateX(8px);">&nbsp;</div>
</div>
</div>
<div style="display: flex; flex-direction: column; flex-grow: 1; justify-content: center; margin-bottom: 24px;">
<div style="background-color: #f4f4f4; border-radius: 4px; flex-grow: 0; height: 14px; margin-bottom: 6px; width: 224px;">&nbsp;</div>
<div style="background-color: #f4f4f4; border-radius: 4px; flex-grow: 0; height: 14px; width: 144px;">&nbsp;</div>
</div>
<p>&nbsp;</p>
<p style="color: #c9c8cd; font-family: Arial,sans-serif; font-size: 14px; line-height: 17px; margin-bottom: 0; margin-top: 8px; overflow: hidden; padding: 8px 0 7px; text-align: center; text-overflow: ellipsis; white-space: nowrap;"><a style="color: #c9c8cd; font-family: Arial,sans-serif; font-size: 14px; font-style: normal; font-weight: normal; line-height: 17px; text-decoration: none;" href="https://www.instagram.com/p/CW_u00hoMqD/?utm_source=ig_embed&amp;utm_campaign=loading" target="_blank" rel="noopener">Ett inlägg delat av Anders Hesselbom (@andershbom)</a></p>
</div>
</blockquote>
<p><script async="" src="//www.instagram.com/embed.js"></script></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2021/12/tv4-uppmarksammar-behovet-av-religiost-neutrala-begravningsplatser/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Vill du lära känna mig?</title>
		<link>https://www.winsoft.se/2021/11/vill-du-lara-kanna-mig/</link>
					<comments>https://www.winsoft.se/2021/11/vill-du-lara-kanna-mig/#comments</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Mon, 22 Nov 2021 21:25:08 +0000</pubDate>
				<category><![CDATA[Personal]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17192</guid>

					<description><![CDATA[Jag har blivit grundligt intervjuad av Emil Nilsén i podcasten &#8220;Vi måste prata&#8221;, och vi pratar om hur jag blev den jag är idag. Lyssna gärna, mycket nöje!]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Jag har blivit grundligt intervjuad av Emil Nilsén i podcasten &#8220;Vi måste prata&#8221;, och vi pratar om hur jag blev den jag är idag. <a href="https://shows.acast.com/vi-maste-prata/episodes/hesselbom" target="_blank" rel="noreferrer noopener">Lyssna gärna, mycket nöje!</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2021/11/vill-du-lara-kanna-mig/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>&#8220;Stulet gods&#8221; avsnitt 43</title>
		<link>https://www.winsoft.se/2021/11/stulet-gods-avsnitt-43/</link>
					<comments>https://www.winsoft.se/2021/11/stulet-gods-avsnitt-43/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Mon, 01 Nov 2021 21:34:48 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17186</guid>

					<description><![CDATA[Nästan ett år har passerat sedan vi släppte avsnitt 42 av podcasten Stulet gods, men nu är vi tillbaka med en handfull av låtstölder att avhandla. I avsnitt 43 lyssnar vi på stulen musik som bl.a. innefattar Queen, Justin Bieber och Ozzy Ozbourne. Finns här eller där poddar finns &#8211; mycket nöje!]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Nästan ett år har passerat sedan vi släppte avsnitt 42 av podcasten <strong>Stulet gods</strong>, men nu är vi tillbaka med en handfull av låtstölder att avhandla. I avsnitt 43 lyssnar vi på stulen musik som bl.a. innefattar Queen, Justin Bieber och Ozzy Ozbourne. <a href="https://stuletgods.80tal.se/43.html" target="_blank" rel="noreferrer noopener">Finns här</a> eller <a href="https://open.spotify.com/show/0KcEPjKKZcO8KHh2T8F4eL" target="_blank" rel="noopener">där poddar finns</a> &#8211; mycket nöje!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2021/11/stulet-gods-avsnitt-43/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Preserverad SID-musik från 1988</title>
		<link>https://www.winsoft.se/2021/10/preserverad-sid-musik-fran-1988/</link>
					<comments>https://www.winsoft.se/2021/10/preserverad-sid-musik-fran-1988/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Tue, 26 Oct 2021 21:07:58 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Retro]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17179</guid>

					<description><![CDATA[I samband med att jag lämnade staden och flyttade till landet, så gjorde jag mig av med alla mina Commodore-maskiner. Jag passade på att preservera en liten del av mina disketter, men jag kunde inte rädda allt. En av disketterna innehöll fyra SID-låtar som jag programmerade 1988 med Rock Monitor och en sample rip från [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I samband med att jag lämnade staden och flyttade till landet, så gjorde jag mig av med alla mina Commodore-maskiner. Jag passade på att preservera en liten del av mina disketter, men jag kunde inte rädda allt. En av disketterna innehöll fyra SID-låtar som jag programmerade 1988 med <a rel="noreferrer noopener" href="https://csdb.dk/release/?id=10632" target="_blank">Rock Monitor</a> och en sample rip från <a rel="noreferrer noopener" href="https://csdb.dk/release/?id=107732" target="_blank">Funky Drummer</a>. Rock Monitor var en vidareutveckling av <a href="https://csdb.dk/release/?id=124604">Sound Monitor</a> med stöd för samples. Båda programmen var anpassade för att underlätta SID-programmering.</p>



<p class="wp-block-paragraph">Dessa fyra filer är kanske inte mitt stoltaste ögonblick som musiker, men eftersom det är historia så måste det såklart delas. Samtliga är packade som programfiler med <a href="https://csdb.dk/release/?id=52838" target="_blank" rel="noreferrer noopener">Sledge Hammer</a>. Dessa två är originallåtar:</p>



<p class="wp-block-paragraph"><strong>&#8220;Ibburd&#8221;:</strong></p>



<figure class="wp-block-audio"><audio controls src="https://winsoft.se/files/pres20211026/sid_ibburd.mp3"></audio></figure>



<p class="wp-block-paragraph"><a href="http://winsoft.se/files/pres20211026/sid_ibburd.prg" target="_blank" rel="noreferrer noopener">Hämta prg-fil.</a></p>



<p class="wp-block-paragraph"><strong>&#8220;The Lennart Song&#8221;:</strong></p>



<figure class="wp-block-audio"><audio controls src="http://winsoft.se/files/pres20211026/sid_the_lennart_song.mp3"></audio></figure>



<p class="wp-block-paragraph"><a href="http://winsoft.se/files/pres20211026/sid_the_lennart_song.prg" target="_blank" rel="noreferrer noopener">Hämta prg-fil.</a></p>



<p class="wp-block-paragraph">Dessa två är covers. Om jag minns rätt så programmerade jag dessa mest för att lära mig monitorn:</p>



<p class="wp-block-paragraph"><strong>&#8220;Push it&#8221;:</strong></p>



<figure class="wp-block-audio"><audio controls src="http://winsoft.se/files/pres20211026/sid_pushit.mp3"></audio></figure>



<p class="wp-block-paragraph"><a href="http://winsoft.se/files/pres20211026/sid_pushit.prg" target="_blank" rel="noreferrer noopener">Hämta prg-fil.</a></p>



<p class="wp-block-paragraph"><strong>&#8220;Romance d&#8217;amour/Du är den ende&#8221;:</strong></p>



<figure class="wp-block-audio"><audio controls src="http://winsoft.se/files/pres20211026/sid_rdamour.mp3"></audio><figcaption><a href="http://winsoft.se/files/pres20211026/sid_rdamour.prg" target="_blank" rel="noreferrer noopener">Hämta prg-fil.</a></figcaption></figure>



<p class="wp-block-paragraph">Samplingarna låter aningen bättre på en riktig Commodore 64 än i en emulator. Mycket nöje!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2021/10/preserverad-sid-musik-fran-1988/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="https://winsoft.se/files/pres20211026/sid_ibburd.mp3" length="587967" type="audio/mpeg" />
<enclosure url="http://winsoft.se/files/pres20211026/sid_the_lennart_song.mp3" length="270" type="audio/mpeg" />
<enclosure url="http://winsoft.se/files/pres20211026/sid_pushit.mp3" length="260" type="audio/mpeg" />
<enclosure url="http://winsoft.se/files/pres20211026/sid_rdamour.mp3" length="261" type="audio/mpeg" />

			</item>
		<item>
		<title>Två &#8220;nya&#8221; C64-demos från 1986-87</title>
		<link>https://www.winsoft.se/2021/10/tva-nya-c64-demos-fran-1986-87/</link>
					<comments>https://www.winsoft.se/2021/10/tva-nya-c64-demos-fran-1986-87/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Tue, 12 Oct 2021 16:48:05 +0000</pubDate>
				<category><![CDATA[Geeky]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17170</guid>

					<description><![CDATA[Jag har preserverat ett antal Commodore 64-disketter från min ungdom. Alla disketter med ännu ej preserverat material gick tyvärr inte att rädda, men några små guldkorn har jag fått tag i, som t.ex. en disk med följande fillista. Antal block inom parentes. CCCP SMESSEL IX (101)THE REAL DEMO! (79)LIGHTS FANTASTIC (74)MUSIC BOX III (60)ESC DEMO [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Jag har preserverat ett antal Commodore 64-disketter från min ungdom. Alla disketter med ännu ej preserverat material gick tyvärr inte att rädda, men några små guldkorn har jag fått tag i, som t.ex. en disk med följande fillista. Antal block inom parentes.</p>



<p class="wp-block-paragraph"><a rel="noreferrer noopener" href="https://csdb.dk/release/?id=16810" target="_blank">CCCP SMESSEL IX (101)</a><br><a rel="noreferrer noopener" href="https://csdb.dk/release/?id=16811" target="_blank">THE REAL DEMO!</a> (79)<br>LIGHTS FANTASTIC (74)<br><a href="https://csdb.dk/release/?id=60711" target="_blank" rel="noreferrer noopener">MUSIC BOX III</a> (60)<br>ESC DEMO II/FBR (50)<br><a href="https://csdb.dk/release/?id=37560" target="_blank" rel="noreferrer noopener">IBM MUSIC XVII</a> (49)<br><a href="https://csdb.dk/release/?id=29388" data-type="URL" data-id="https://csdb.dk/release/?id=29388" target="_blank" rel="noreferrer noopener">CHICKEN FARM</a> (35)<br><a href="https://csdb.dk/release/?id=21692" data-type="URL" data-id="https://csdb.dk/release/?id=21692" target="_blank" rel="noreferrer noopener">CAS DEMO #1</a> (32)<br><a href="https://csdb.dk/release/?id=139739" target="_blank" rel="noreferrer noopener">DAS BOOT -TRON-</a> (29)<br><a href="https://csdb.dk/release/?id=48937" target="_blank" rel="noreferrer noopener">EYE TO EYE/FBR</a> (21)<br><a href="https://csdb.dk/release/?id=149056" target="_blank" rel="noreferrer noopener">SOMEWHERE&#8217;S TIME</a> (14)<br><a href="https://csdb.dk/release/?id=30843" target="_blank" rel="noreferrer noopener">TIME TRAVELLER</a> (12)</p>



<p class="wp-block-paragraph"><a rel="noreferrer noopener" href="https://csdb.dk/release/?id=16810" target="_blank">CCCP SMESSEL IX</a> av CCCP år 1987 är preserverat sedan tidigare. Filen på min disk fungerar inte, men demot var en textskärm med någon rippad musik följt av en dubbel borderscroller med någon Sound Tracker-implementation av Axel F (Harold Faltermeyer), och avslutas med en stor scroller.</p>



<p class="wp-block-paragraph"><a href="https://csdb.dk/release/?id=16811" target="_blank" rel="noreferrer noopener">THE REAL DEMO!</a> av CCCP år 1987 är också preserverat sedan tidigare. Den inleds med en fullskärmsbild förställande en kinesisk ansiktsmask och bjuder sedan på två ytterligare delar utan originalmusik.</p>



<p class="wp-block-paragraph">LIGHTS FANTASTIC (titelbilden) har jag inte sett preserverat någonstans, men du kan <a rel="noreferrer noopener" href="https://winsoft.se/files/lights%20fantastic.prg" target="_blank">ladda ner den här</a>. Du lyssnar på musik och tittar på mönster som ritas med linjer på skärmen. Du kan styra linjerna lite, och du kan växla låt. Det påminner om demot <a href="https://csdb.dk/release/?id=46200" target="_blank" rel="noreferrer noopener">Tubular Bells</a>.</p>



<p class="wp-block-paragraph"><a href="https://csdb.dk/release/?id=60711" target="_blank" rel="noreferrer noopener">MUSIC BOX III</a> är rippad musik och lite specialeffekter av Thunderbolt Cracking Crew.</p>



<p class="wp-block-paragraph">ESC DEMO II/FBR spelar en cover på White Wedding (Billy Idol) som tar tvärstopp efter några minuter, och visar bild rippad från Fist II. Tror inte att den finns preserverad sedan tidigare, men <a rel="noreferrer noopener" href="https://winsoft.se/files/ecs demo ii-fbr.prg" target="_blank">den kan laddas ner här</a>.</p>



<p class="wp-block-paragraph"><a rel="noreferrer noopener" href="https://csdb.dk/release/?id=37560" target="_blank">IBM MUSIC XVII</a> av The Electronic Knights år 1987 är en låt byggd på trummorna från trummaskinen <a rel="noreferrer noopener" href="https://csdb.dk/release/?id=107732" target="_blank">Funky Drummer</a>.</p>



<p class="wp-block-paragraph"><a href="https://csdb.dk/release/?id=29388" target="_blank" rel="noreferrer noopener">CHICKEN FARM</a> (We Music, 1986) är en bild och en scrolltext upp-och-ned, med musik av David Whittaker.</p>



<p class="wp-block-paragraph"><a href="https://csdb.dk/release/?id=21692" target="_blank" rel="noreferrer noopener">CAS DEMO #1</a> (Cas, 1986) är en bild och en stor scrolltext i undre bordern, utan musik.</p>



<p class="wp-block-paragraph"><a rel="noreferrer noopener" href="https://csdb.dk/release/?id=139739" target="_blank">DAS BOOT -TRON-</a> av Tron (okänt år) är en bild, en låt och en teckenbaserad scrolltext.</p>



<p class="wp-block-paragraph"><a href="https://csdb.dk/release/?id=48937" target="_blank" rel="noreferrer noopener">EYE TO EYE/FBR</a> av AM Twelve år 1986 är en ganska rolig sprite-animation där två ögon åker runt på skärmen.</p>



<p class="wp-block-paragraph">Både <a rel="noreferrer noopener" href="https://csdb.dk/release/?id=149056" target="_blank">SOMWHERE&#8217;S TIME</a> (Rubard) och <a rel="noreferrer noopener" href="https://csdb.dk/release/?id=30843" target="_blank">TIME TRAVELLER</a> (Skuzz, 1987) är två stillbilder, där den senaste är en ganska snygg pixlad <a rel="noreferrer noopener" href="https://en.wikipedia.org/wiki/Eddie_(Iron_Maiden)" target="_blank">Eddie the Head</a>.</p>



<p class="wp-block-paragraph">Jag hoppas att detta innebär att LIGHTS FANTASTIC och ESC DEMO II/FBR blir bevarade till eftervärlden.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2021/10/tva-nya-c64-demos-fran-1986-87/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Input parser för textäventyrsspel</title>
		<link>https://www.winsoft.se/2021/09/input-parser-for-textaventyrsspel/</link>
					<comments>https://www.winsoft.se/2021/09/input-parser-for-textaventyrsspel/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Tue, 21 Sep 2021 16:52:02 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17165</guid>

					<description><![CDATA[Biblioteket TextAdventureGameInputParser kan användas för att parsa användarens input i ett textäventyr. Parsern tar en mening i stil med GO NORT, OPEN DOOR, USE GOLD KEY ON DOOR eller GIVE FOOD TO GANDALF och ger en struktur med ordklasser och referenser till objekt som är registrerade i parsern. Lite exempel finns tillgängliga i parserns GitHub-repository, [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Biblioteket TextAdventureGameInputParser kan användas för att parsa användarens input i ett textäventyr. Parsern tar en mening i stil med GO NORT, OPEN DOOR, USE GOLD KEY ON DOOR eller GIVE FOOD TO GANDALF och ger en struktur med ordklasser och referenser till objekt som är registrerade i parsern.</p>



<p class="wp-block-paragraph">Lite exempel finns tillgängliga i parserns <a href="https://github.com/Anders-H/TextAdventureGameInputParser" target="_blank" rel="noreferrer noopener">GitHub-repository</a>, och parsern kan installeras (.NET 5.0) från <a href="https://www.nuget.org/packages/TextAdventureGameInputParser/" target="_blank" rel="noreferrer noopener">Nuget</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2021/09/input-parser-for-textaventyrsspel/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Rick Beato: Varför gillar inte boomers pop?</title>
		<link>https://www.winsoft.se/2021/08/rick-beato-varfor-gillar-inte-boomers-pop/</link>
					<comments>https://www.winsoft.se/2021/08/rick-beato-varfor-gillar-inte-boomers-pop/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Tue, 17 Aug 2021 17:13:19 +0000</pubDate>
				<category><![CDATA[Pop culture]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17152</guid>

					<description><![CDATA[Boomers gillar inte pop-musik. Musikern Rick Beato har en YouTube-kanal som han bl.a. använder för att lägga ut listor. Nyligen hade han en live stream där han presenterade en sammanställning (från chatt-diskussioner) om orsakerna bakom boomers ogillande av pop. Här är sexpunktslistan, med mina kommentarer. Inga tempovariationer. Modern musik tenderar att hålla ett och samma [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><a rel="noreferrer noopener" href="https://en.wikipedia.org/wiki/Baby_boomers" target="_blank">Boomers</a> gillar inte pop-musik. Musikern <a rel="noreferrer noopener" href="https://en.wikipedia.org/wiki/Rick_Beato" data-type="URL" data-id="https://en.wikipedia.org/wiki/Rick_Beato" target="_blank">Rick Beato</a> har en <a rel="noreferrer noopener" href="https://www.youtube.com/channel/UCJquYOG5EL82sKTfH9aMA9Q" target="_blank">YouTube-kanal</a> som han bl.a. använder för att lägga ut listor. Nyligen hade han en live stream där han <a rel="noreferrer noopener" href="https://www.youtube.com/watch?v=yDUSFpek0PM" data-type="URL" data-id="https://www.youtube.com/watch?v=yDUSFpek0PM" target="_blank">presenterade en sammanställning</a> (från chatt-diskussioner) om orsakerna bakom boomers ogillande av pop. Här är sexpunktslistan, med mina kommentarer.</p>



<ol class="wp-block-list"><li><strong>Inga tempovariationer.</strong> Modern musik tenderar att hålla ett och samma tempo genom hela stycket, utan accelerationer eller inbromsningar. Det ger inget utrymme för hörsamhet för vad en del behöver, och sänker dynamiken.</li><li><strong>Repetitiva ljud.</strong> I princip alla pop-låtar använder ungefär samma uppsättning av fabriksljud. Att vara musikproducent idag är onekligen en lat mans jobb. Förr kom flera ljud från analoga källor, som t.ex. mikrofoner.</li><li><strong>Inga tonartsförändringar.</strong> Förutom detta är antalet ackord väldigt lågt (runt fyra), och alla ackord ligger inom tonarten i fråga. Ett bra exempel på enkla tonartsvariationer måste vara vers två i &#8220;The show must go on&#8221; av Queen, som lyfter låten enormt.</li><li><strong>Ingen dynamisk variation.</strong> De amplitudförändringar som hörs i modern musik är en kompressor som låter ett instrument dränka ett annat. Boomers gillar musik där en musiker ibland kan smyga med sitt instrument.</li><li><strong>Enkla melodier.</strong> Modern musik tenderar att bygga kring en enkel &#8220;hook&#8221;, men melodierna är inte särskilt nyskapande, komplicerade eller intressanta. Ofta handlar det om några noter som är staplade på varandra.</li><li><strong>Auto-tune.</strong> Rösten blir alldeles för robot-lik och dynamiken som sångaren bidrar med till musiken, försvinner helt. Auto-tune gör ett bra jobb för en dålig sångare, men ett katastrofalt jobb för vem som helst som faktiskt kan sjunga.</li></ol>



<p class="wp-block-paragraph">Min uppfattning är att en musikkonsument inte nödvändigtvis är en musikintresserad person, och de känslor, det igenkännande, eller vad det nu är som musiken syftar till att försöka sälja, faktiskt fungerar. Om man inte är musikintresserad, vill säga&#8230;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2021/08/rick-beato-varfor-gillar-inte-boomers-pop/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Samantha Fox special double-groove multi-play pressing</title>
		<link>https://www.winsoft.se/2021/08/samantha-fox-special-double-groove-multi-play-pressing/</link>
					<comments>https://www.winsoft.se/2021/08/samantha-fox-special-double-groove-multi-play-pressing/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sat, 07 Aug 2021 14:38:23 +0000</pubDate>
				<category><![CDATA[Geeky]]></category>
		<category><![CDATA[Pop culture]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17140</guid>

					<description><![CDATA[Henrik Andersson har donerat maxisingeln &#8220;I surrender (to the spirit of the night)&#8221; med Samantha Fox till mig. En 12&#8243;-singel med skivnummer FOXY T6. Det som gör denna speciell anges på framsidan: Special double-groove multi-play pressing. Det är inte helt självklart vad detta betyder, eller ens att det bara är sida två som avses. Det [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><a href="https://www.youtube.com/channel/UCWgjMoJxge9j750Zk7JBNvg" target="_blank" rel="noreferrer noopener">Henrik Andersson</a> har donerat maxisingeln <strong>&#8220;I surrender (to the spirit of the night)&#8221;</strong> med <strong>Samantha Fox</strong> till mig. En 12&#8243;-singel med skivnummer FOXY T6. Det som gör denna speciell anges på framsidan: <em>Special double-groove multi-play pressing</em>.</p>



<p class="wp-block-paragraph">Det är inte helt självklart vad detta betyder, eller ens att det bara är sida två som avses. Det du kommer att märka när du spelar b-sidan av skivan, är att det ser ut som att den snurrar 90 varv per minut, men singlar (som denna) ska spelas upp i 45 varv per minut.</p>



<p class="wp-block-paragraph">En vanlig LP spelas i 33,3 varv per minut, vilket innebär att det tar knappt två sekunder för nålen att flytta sig från det yttersta varvet till näst yttersta varvet. En singel snurrar 45 varv per minut, vilket innebär att samma förflyttning endast tar 1,3 sekunder för nålen att flytta sig ett varv in.</p>



<p class="wp-block-paragraph">A-sidan, som är den utökade mixen av &#8220;I surrender (to the spirit of the night)&#8221;, fungerar som skivor gör mest. Ljudimpulsen ligger lagrad i ett spiralformat spår som rör sig in mot mitten. Oavsett var du lägger på nålen, kommer spiralen att fånga den, och leda den in till mitten. Detta är det normala:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="461" height="435" src="https://www.winsoft.se/wp-content/uploads/spiral1.jpg" alt="" class="wp-image-17142" srcset="https://www.winsoft.se/wp-content/uploads/spiral1.jpg 461w, https://www.winsoft.se/wp-content/uploads/spiral1-300x283.jpg 300w, https://www.winsoft.se/wp-content/uploads/spiral1-150x142.jpg 150w" sizes="auto, (max-width: 461px) 100vw, 461px" /></figure>



<p class="wp-block-paragraph">Det special double-groove multi-play pressing betyder, är att det outnyttjade området på en vanlig 45-varvare har, är använt till ett spår till, innehållande samma information. Bilden visar principen. Beroende på var (eller när, eftersom armens position är statisk) du lägger på nålen, kommer antingen det ena (gröna) eller andra (röda) spåret att fånga armen och leda den till mitten. I praktiken är det slumpen som avgör.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="491" height="463" src="https://www.winsoft.se/wp-content/uploads/spiral2.jpg" alt="" class="wp-image-17143" srcset="https://www.winsoft.se/wp-content/uploads/spiral2.jpg 491w, https://www.winsoft.se/wp-content/uploads/spiral2-300x283.jpg 300w, https://www.winsoft.se/wp-content/uploads/spiral2-150x141.jpg 150w" sizes="auto, (max-width: 491px) 100vw, 491px" /></figure>



<p class="wp-block-paragraph">Anledningen till att man vill ha det så här, är att slitaget på skivan kommer att vara i snitt hälften av slitaget på en vanlig skiva, eftersom du i det långa loppet kommer att spela det gröna spåret lika många gånger som det röda spåret. För den med en stor skivsamling i sin ägo är detta vanligtvis inte något stort problem, för en livstid räcker inte till särskilt många spelningar per skiva, men för en DJ som sliter på sina skivor, eller för den som råkar ha just denna låt som sin favorit, är detta något bra. (Många 7&#8243;-singlar som släppts under 80- och 90-talet har faktiskt varit av så låg kvalité att du endast kan lyssna på dem med full ljudkvalité 2-3 gånger.)</p>



<p class="wp-block-paragraph">I teorin skulle man kunna ha olika information i de olika spåren, så att slumpen får avgöra vilken låt som spelas när man lägger på nålen, vilket Henrik Andersson (som donerade skivan till mig) faktiskt hävdar har gjorts.</p>



<p class="wp-block-paragraph">(Jo, jag försökte komma nära med kameran och ta bilder på nålen, men för en sådan närbild har jag varken ljus eller stativ som håller måttet. Det kanske kommer längre fram.)</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2021/08/samantha-fox-special-double-groove-multi-play-pressing/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Commodore BASIC 2.0 second release</title>
		<link>https://www.winsoft.se/2021/07/commodore-basic-2-0-second-release/</link>
					<comments>https://www.winsoft.se/2021/07/commodore-basic-2-0-second-release/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Thu, 22 Jul 2021 20:18:48 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17134</guid>

					<description><![CDATA[Nu finns hela min bok om Commodore BASIC 2.0 second release för Commodore 64 och VIC-20 att läsa som PDF här. Kontakta mig gärna för rättningar eller tillägg! Uppdatering 2021-07-25: Även en epub-version finns att ladda hem.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Nu finns hela min bok om <a rel="noreferrer noopener" href="https://ahesselbom.se/pages/commodorebasic20.html" data-type="URL" data-id="https://ahesselbom.se/pages/commodorebasic20.html" target="_blank">Commodore BASIC 2.0 second release för Commodore 64 och VIC-20 att läsa som PDF här</a>. Kontakta mig gärna för rättningar eller tillägg!</p>



<p class="wp-block-paragraph"><strong>Uppdatering 2021-07-25:</strong> <em>Även en epub-version finns att ladda hem.</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2021/07/commodore-basic-2-0-second-release/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Lorenz vattenhjul</title>
		<link>https://www.winsoft.se/2021/07/lorenz-vattenhjul/</link>
					<comments>https://www.winsoft.se/2021/07/lorenz-vattenhjul/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sat, 03 Jul 2021 20:21:44 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[General]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17120</guid>

					<description><![CDATA[Lorenz-attraktionen är en fraktal vars formel beskriver en rotationshastighet (illustrerat med en radie) och en rotationsriktning. Så här ser den ut, implementerad i Commodore BASIC 7.0: Det går att bygga ett riktigt vattenhjul som ger samma figur som algoritmen ovan. Tänk dig ett hjul med ett antal hinkar (t.ex. åtta stycken). Den hink som är [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Lorenz-attraktionen är en fraktal vars formel beskriver en rotationshastighet (illustrerat med en radie) och en rotationsriktning. Så här ser den ut, implementerad i Commodore BASIC 7.0:</p>



<pre class="wp-block-code"><code>10 GRAPHIC 1,1
20 X=5
30 Y=5
40 Z=5
50 T=0
60 S=1/200
70 D=10
80 R=28
90 B=8/3
100 T=T+0.1
110 DX=D*(Y-X)
120 X1=X+DX*S
130 DY=(R*X-Y)-X*Z
140 Y1=Y+DY*S
150 DZ=X*Y-B*Z
160 Z1=Z+DZ*S
170 X=X1
180 Y=Y1
190 Z=Z1
200 DRAW 1,150+4*X,20+3*Z
210 IF T&lt;1000 GOTO 100</code></pre>



<p class="wp-block-paragraph">Det går att bygga ett riktigt vattenhjul som ger samma figur som algoritmen ovan. Tänk dig ett hjul med ett antal hinkar (t.ex. åtta stycken). Den hink som är högst upp fylls på med vatten, och att du ger hjulet en knuff så att det roterar åt höger. På det viset kommer nästa hink strax börja fyllas med vatten, vilket ger en vikt på hjulets högra sida, så att rotationshastigheten ökar. Men alla hinkar har ett hål i botten, så när de inte ökar i vikt för att de fylls med vatten, så minskar de i vikt. När hinkarna når den uppåtgående vänstersidan av hjulet, väger de mycket mindre, vilket bidrar till att rotationshastigheten ökar. Men om rotationshastigheten ökar, så minskar samtidigt mängden vatten som fylls på i hinken högst upp, eftersom hinken befinner sig kortare tid vid positionen för påfyllning. Det innebär att den tyngsta sidan inte alltid kommer vara högersidan, eftersom den höga rotationshastigheten och den låga påfyllningen får vikten att förflytta sig. Ibland roterar alltså hjulet åt höger, ibland åt vänster. Ibland roterar hjulet fort, ibland långsamt.</p>



<p class="wp-block-paragraph">Centralt i implementationen av denna simulering är en funktion som kan omvandla en vinkel på hjulet till en rotationskraft. Högst upp eller längst ner på hjulet, kommer vikten inte att påverka hjulets vilja att rotera alls. Längst till höger eller längst till vänster är kraften som störst. Vid 0 grader och vid 180 grader ska kraften vara 0, vid 90 och 270 grader är kraften maximal. Följande funktion är central för implementationen. Den beskriver hur starkt grepp gravitationen har över hinken &#8211; ingen alls högst upp eller längst ner, väldigt mycket längst till höger eller vänster.</p>



<pre class="wp-block-code"><code>Math.Cos(angle / (180.0 / Math.PI));</code></pre>



<p class="wp-block-paragraph">Implementationen av hjulet har 8 entiteter (&#8220;hinkar&#8221;) utplacerade med jämna mellanrum. 8 genom 350 ger 45 graders mellanrum. Den lilla knuffen åt höger får ha värdet 0,2 så att rotationen kommer igång.</p>



<pre class="wp-block-code"><code>var angle = 0;
for (var i = 0; i &lt; 8; i++)
{
    Wheel.Buckets.Add(new Bucket(Wheel, angle));
    angle += 45;
}
Wheel.Speed = 0.2;</code></pre>



<p class="wp-block-paragraph">För <strong>hjulets beteende</strong> gäller följande: Hastigheten (som är positiv för höger och negativ för vänster) adderas till vinkeln. Därefter kontrollerar vi att vinkeln ligger mellan 0 och 360. Därefter berättar vi för varje hjul vilken vinkel de sitter på, givet hjulets vinkel, och ber samtidigt hjulet att agera (nedan). Sedan räknar vi ut hur hinkkonfigurationen påverkar hastigheten, och kontrollerar samtidigt att maxhastigheten åt höger eller vänster inte överstiger hjulets tänkta maxhastighet.</p>



<pre class="wp-block-code"><code>public void Tick()
{
    Angle += Speed;
    if (Angle &lt; 0.0)
        Angle += 360.0;
    else if (Angle &gt; 360.0)
        Angle -= 360.0;

    var bucketAngle = Angle;

    for (var i = 0; i &lt; 8; i++)
    {
        if (bucketAngle &lt; 0.0)
            bucketAngle += 360.0;
        else if (bucketAngle &gt; 360.0)
            bucketAngle -= 360.0;
            
        Buckets&#91;i].Tick(bucketAngle);
        bucketAngle += 45.0;
    }
    Speed += SpeedInfluence();
    const double maxSpeed = 7.0;
    if (Speed &gt; maxSpeed)
        Speed = maxSpeed;
    else if (Speed &lt; -maxSpeed)
        Speed = -maxSpeed;
}

public double SpeedInfluence() =&gt;
    Buckets.Sum(x =&gt; x.SpeedInfluence());</code></pre>



<p class="wp-block-paragraph">För <strong>varje hinks beteende</strong> gäller följande: Om hinken är högst upp, öka vattenmängden, annars minska vattenmängden en aning. Varje hjul måste kunna uppge gravitationens grepp om hinken.</p>



<pre class="wp-block-code"><code>public void Tick(double newAngle)
{
    Angle = newAngle;
        
    if (Angle >= 255.0 &amp;&amp; Angle &lt;= 285.0)
        Full += 2.0;

    Full -= 0.12;
        
    if (Full &lt; 0.0)
        Full = 0.0;
    else if (Full > 100.0)
        Full = 100.0;
}

public double SpeedInfluence() =>
    Math.Cos(Angle / (180.0 / Math.PI)) * (Full * 0.03);</code></pre>



<p class="wp-block-paragraph">Endast vattnet har vikt, hinkarna väger ingenting. Eftersom hjulet är balanserat och alla tomma hinkar väger lika mycket, kan vikten lika gärna vara 0.</p>



<p class="wp-block-paragraph">Resultatet blir ett hjul som ibland snurrar fort, ibland långsamt, ibland åt höger och ibland åt vänster.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="582" src="https://www.winsoft.se/wp-content/uploads/lorenz-1024x582.jpg" alt="" class="wp-image-17126" srcset="https://www.winsoft.se/wp-content/uploads/lorenz-1024x582.jpg 1024w, https://www.winsoft.se/wp-content/uploads/lorenz-300x171.jpg 300w, https://www.winsoft.se/wp-content/uploads/lorenz-150x85.jpg 150w, https://www.winsoft.se/wp-content/uploads/lorenz-768x437.jpg 768w, https://www.winsoft.se/wp-content/uploads/lorenz.jpg 1194w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Koden körs i ett Windows Forms-fönster med DoubleBuffering aktiverat. Här är hela källkoden:</p>



<pre class="wp-block-code"><code>using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;

public partial class Form1 : Form
{
    private Wheel Wheel { get; }

    public Form1()
    {
        InitializeComponent();
        Wheel = new Wheel();
        InitializeWheel();
    }

    private void InitializeWheel()
    {
        var angle = 0;
        for (var i = 0; i &lt; 8; i++)
        {
            Wheel.Buckets.Add(new Bucket(angle));
            angle += 45;
        }
        Wheel.Speed = 0.2;
    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        var g = e.Graphics;
        g.Clear(Color.Green);

        var centerX = (Bounds.Width / 2);
        var centerY = (Bounds.Height / 2);
            
        var availableSize = Bounds.Width > Bounds.Height
            ? Bounds.Height
            : Bounds.Width;

        var radius = availableSize * 0.3;

        var renderer = new Renderer(centerX, centerY, (float)radius);
        renderer.Draw(g, Wheel, Font);
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        Wheel.Tick();
        Invalidate();
    }
}

public class Wheel
{
    public List&lt;Bucket> Buckets { get; set; }
    public double Speed { get; set; }
    public double Angle { get; set; }

    public Wheel()
    {
        Buckets = new List&lt;Bucket>();
        Angle = 0.0;
    }

    public void Tick()
    {
        Angle += Speed;
        if (Angle &lt; 0.0)
            Angle += 360.0;
        else if (Angle > 360.0)
            Angle -= 360.0;

        var bucketAngle = Angle;

        for (var i = 0; i &lt; 8; i++)
        {
            if (bucketAngle &lt; 0.0)
                bucketAngle += 360.0;
            else if (bucketAngle > 360.0)
                bucketAngle -= 360.0;
            
            Buckets&#91;i].Tick(bucketAngle);
            bucketAngle += 45.0;
        }
        Speed += SpeedInfluence();
        const double maxSpeed = 7.0;
        if (Speed > maxSpeed)
            Speed = maxSpeed;
        else if (Speed &lt; -maxSpeed)
            Speed = -maxSpeed;
    }

    public double SpeedInfluence() =>
        Buckets.Sum(x => x.SpeedInfluence());
}

public class Bucket
{
    public double Weight { get; set; }
    public double Angle { get; set; }
    public double Full { get; set; }

    public Bucket(double angle)
    {
        Weight = 0.0;
        Angle = angle;
        Full = 0.0;
    }

    public void Tick(double newAngle)
    {
        Angle = newAngle;
        
        if (Angle >= 255.0 &amp;&amp; Angle &lt;= 285.0)
            Full += 2.0;

        Full -= 0.12;
        
        if (Full &lt; 0.0)
            Full = 0.0;
        else if (Full > 100.0)
            Full = 100.0;
    }

    public double SpeedInfluence() =>
        Math.Cos(Angle / (180.0 / Math.PI)) * (Full * 0.03);

    public void Draw(Graphics g, PointF location, Font font)
    {
        using var bucketBrush = new SolidBrush(Color.FromArgb(255, 255, 255));
        using var waterBrush = new SolidBrush(Color.FromArgb(0, 128, 255));
        var bucketRectangle = new RectangleF(location.X - 51, location.Y - 51, 102, 102);
        g.FillRectangle(bucketBrush, bucketRectangle);
        if (Full > 0.0)
        {
            var waterRectangle = new RectangleF(location.X - 50, (float)(location.Y - 50 + (100.0 - Full)), 100, (float)Full);
            g.FillRectangle(waterBrush, waterRectangle);
        }
        g.DrawString(Angle.ToString("0.00"), font, Brushes.Black, (float)(location.X - 20), (float)(location.Y - 20));
        g.DrawString(Full.ToString("0.00"), font, Brushes.Black, (float)(location.X - 20), (float)(location.Y));
    }
}

public class Renderer
{
    private readonly PointF _center;
    private readonly float _radius;

    public Renderer(float centerX, float centerY, float radius)
    {
        _center = new PointF(centerX, centerY);
        _radius = radius;
    }

    public void Draw(Graphics g, Wheel wheel, Font font)
    {
        foreach (var bucket in wheel.Buckets)
        {
            var bucketLocation = new PointF(
                (float)(_center.X + Math.Cos(bucket.Angle / (180.0 / Math.PI)) * _radius),
                (float)(_center.Y + Math.Sin(bucket.Angle / (180.0 / Math.PI)) * _radius)
            );
            g.DrawLine(Pens.Black, _center, bucketLocation);
            bucket.Draw(g, bucketLocation, font);
        }
    }
}</code></pre>



<p class="wp-block-paragraph">Det går garanterat att justera acceleration, gravitation, inflödeshastighet, utflödeshastighet och maximal hastighet för andra (bättre?) resultat.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2021/07/lorenz-vattenhjul/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>GetEnumerator extension method</title>
		<link>https://www.winsoft.se/2021/05/getenumerator-extension-method/</link>
					<comments>https://www.winsoft.se/2021/05/getenumerator-extension-method/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Tue, 18 May 2021 18:45:09 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17116</guid>

					<description><![CDATA[En ganska enkel men ytterst trevligt tillägg i C# version 9 är möjligheten att skapa en extension method av GetEnumerator (som konsulteras när en samling ska enumereras). Betrakta denna lilla lista: Om jag skulle vilja ha samtliga poster i listan för utskrift på skärmen, kan denna kod användas: GetEnumerator används implicit. Men om jag bara [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">En ganska enkel men ytterst trevligt tillägg i C# version 9 är möjligheten att skapa en extension method av GetEnumerator (som konsulteras när en samling ska enumereras). Betrakta denna lilla lista:</p>



<pre class="wp-block-code"><code>var people = new List&lt;string&gt;
{
    "Sven",
    "Nils",
    "Niklas",
    "Janne"
};</code></pre>



<p class="wp-block-paragraph">Om jag skulle vilja ha samtliga poster i listan för utskrift på skärmen, kan denna kod användas:</p>



<pre class="wp-block-code"><code>foreach (var p in people)
    Console.WriteLine(p);</code></pre>



<p class="wp-block-paragraph">GetEnumerator används implicit. Men om jag bara är intresserad av att ha med poster vars förnamn börjar på N, så måste det formuleras någonstans. Jag kan t.ex. kopiera listan och exkludera ointressanta poster, eller så skulle jag kunna iterera genom svaret från LINQ-API:et enligt:</p>



<pre class="wp-block-code"><code>foreach (var p in people.Where(x =&gt; x.StartsWith("N")))
    Console.WriteLine(p);</code></pre>



<p class="wp-block-paragraph">Extension methods har fördelen att de är tillgängliga i filer som läst in dess namnrymd, men är i övrigt otillgängliga. Det innebär att man kan begränsa funktionalitet till vissa filer genom att skapa en extension metod. Om jag generellt sett är intresserad av att ha personerna som börjar på N tillgängliga i den aktuella filen (eller på annat sätt kunna använda manipulerat data) kan jag deklarera en egen GetEnumerator som en extension method. Är den tillgänglig, kommer kompilatorn att välja den. I detta fall kommer man troligtvis att vilja ha full tillgänglighet för metoden.</p>



<pre class="wp-block-code"><code>static class MyEnumerator
{
    public static IEnumerator&lt;T&gt; GetEnumerator&lt;T&gt;(this IEnumerator&lt;T&gt; list) =&gt;
        list;
}</code></pre>



<p class="wp-block-paragraph">Med denna på plats, öppnas en ny möjlighet. Svaret från den funktionen, kan itereras. Nu kan jag skapa en enumerator som t.ex. skickar tillbaka personerna som börjar på N. Med det gjort, blir iterationen lika enkel som i första exemplet, fast med den skillnaden att jag nu kontrollerar dess innehåll.</p>



<pre class="wp-block-code"><code>
var somePeople = people
   .Where(x =&gt; x.StartsWith("N"))
   .GetEnumerator();

foreach (var p in somePeople)
    Console.WriteLine(p);</code></pre>



<p class="wp-block-paragraph">Detta är egentligen inte en stor sak, men det bidrar till kodens elegans &#8211; något som har blivit ett av kännetecknen för C#.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2021/05/getenumerator-extension-method/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Objektnotation: XML, JSON, PSON</title>
		<link>https://www.winsoft.se/2021/04/objektnotation-xml-json-pson/</link>
					<comments>https://www.winsoft.se/2021/04/objektnotation-xml-json-pson/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Fri, 23 Apr 2021 20:06:40 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[PowerShell]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17091</guid>

					<description><![CDATA[Här följer en kort kommentar om tre olika format för textbaserad objektnotation. XML Fördelar: Stöd för dokumenttypsdefinitioner (DTD) och scheman. God tillgång på bra API:er.Nackdelar: Mycket overhead (ett &#8220;pratigt&#8221; språk), endast Visual Basic har inbyggt stöd för formatet. Exempel på notation: Exempel på inläsning (C#, otypat): JSON Fördelar: Liten overhead, god tillgång på bra API:er. [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Här följer en kort kommentar om tre olika format för textbaserad objektnotation.</p>



<p class="wp-block-paragraph"><b>XML</b></p>



<p class="wp-block-paragraph">Fördelar: Stöd för dokumenttypsdefinitioner (DTD) och scheman. God tillgång på bra API:er.<br>Nackdelar: Mycket overhead (ett &#8220;pratigt&#8221; språk), endast Visual Basic har inbyggt stöd för formatet.</p>



<p class="wp-block-paragraph">Exempel på notation:</p>



<pre class="wp-block-code"><code>&lt;?xml version="1.0" encoding="utf-8" ?&gt;
&lt;customer&gt;
	&lt;id&gt;551&lt;/id&gt;
	&lt;account&gt;9153&lt;/account&gt;
	&lt;name&gt;
		&lt;firstName&gt;Sven&lt;/firstName&gt;
		&lt;lastName&gt;Hedin&lt;/lastName&gt;
	&lt;/name&gt;
&lt;/customer&gt;</code></pre>



<p class="wp-block-paragraph">Exempel på inläsning (C#, otypat):</p>



<pre class="wp-block-code"><code>var dom = new XmlDocument();
dom.Load("object.xml");
var document = dom.DocumentElement;
var customerId = document!.SelectSingleNode("id")!.InnerText;
Console.WriteLine($"ID={customerId}");</code></pre>



<p class="wp-block-paragraph"><strong>JSON</strong></p>



<p class="wp-block-paragraph">Fördelar: Liten overhead, god tillgång på bra API:er. Minimal schematisk information (vad som är en array eller ett enskilt objekt) kan anges i formatet.<br>Nackdelar: Nästan ingen typsäkerhet.</p>



<p class="wp-block-paragraph">Exempel på notation:</p>



<pre class="wp-block-code"><code>{
  "id": 551,
  "account": 9153,
  "name": {
    "firstName": "Sven",
    "lastName":  "Hedin" 
  } 
}</code></pre>



<p class="wp-block-paragraph">Exempel på inläsning (C#, otypat):</p>



<pre class="wp-block-code"><code>using var sr = new StreamReader("object.json", Encoding.UTF8);
var json = sr.ReadToEnd();
dynamic customer = JObject.Parse(json);
Console.WriteLine($"ID={customer!.id}");</code></pre>



<p class="wp-block-paragraph">Exempel på inläsning (C#, typat):</p>



<pre class="wp-block-code"><code>using var sr = new StreamReader("object.json", Encoding.UTF8);
var json = sr.ReadToEnd();
var customer = JsonSerializer.Deserialize&lt;Customer&gt;(json);
Console.WriteLine($"ID={customer!.Id}");

class Customer
{
    &#91;JsonPropertyName("id")]
    public int Id { get; set; }
    &#91;JsonPropertyName("account")] 
    public int Account { get; set; }
    &#91;JsonPropertyName("name")] 
    public Name Name { get; set; }
}

class Name
{
    &#91;JsonPropertyName("firstName")]
    public string FirstName { get; set; }
    &#91;JsonPropertyName("lastName")]
    public string LastName { get; set; }
}</code></pre>



<p class="wp-block-paragraph"><strong>PSON</strong></p>



<p class="wp-block-paragraph">Fördelar: Liten overhead. Viss schematisk information kan anges i formatet, som vad som är en array eller ett enskilt objekt och objekttyp. Kan skrivas typsäkert.<br>Nackdelar: Kan endast användas från PowerShell.</p>



<p class="wp-block-paragraph">Exempel på notation:</p>



<pre class="wp-block-code"><code>@{
  Id: 551,
  Account: 9153,
  Name: @{
    FirstName: "Sven"
    FastName:  "Hedin" 
  } 
}</code></pre>



<p class="wp-block-paragraph">Inläsning av den filen sker genom PowerShell och kan plockas upp av C# genom det generella gränssnittet Microsoft tillhandahåller för att nå svaret från PowerShell.</p>



<p class="wp-block-paragraph">Datastorleken för XML är 188 bytes, JSON 110 bytes och PSON 104 bytes.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2021/04/objektnotation-xml-json-pson/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Allt du behöver veta om Flimmer Duo</title>
		<link>https://www.winsoft.se/2021/03/allt-du-behover-veta-om-flimmer-duo/</link>
					<comments>https://www.winsoft.se/2021/03/allt-du-behover-veta-om-flimmer-duo/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Mon, 22 Mar 2021 17:08:30 +0000</pubDate>
				<category><![CDATA[Pop culture]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17084</guid>

					<description><![CDATA[Här har du allt du behöver veta om Sveriges bästa filmkrönika Flimmer Duo. Prenumerera på YouTube. Prenumerera via RSS. Hemsida. Stötta gärna kanalen på Patreon! Senaste avsnittet:]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Här har du allt du behöver veta om Sveriges bästa filmkrönika Flimmer Duo.</p>



<p class="wp-block-paragraph"><a href="https://www.youtube.com/channel/UCWgjMoJxge9j750Zk7JBNvg" data-type="URL" data-id="https://www.youtube.com/channel/UCWgjMoJxge9j750Zk7JBNvg" target="_blank" rel="noreferrer noopener">Prenumerera på YouTube.</a></p>



<p class="wp-block-paragraph"><a href="https://80tal.se/feed/tag/flimmer-duo.rss" data-type="URL" data-id="https://80tal.se/feed/tag/flimmer-duo.rss" target="_blank" rel="noreferrer noopener">Prenumerera via RSS.</a></p>



<p class="wp-block-paragraph"><a href="https://80tal.se/t/flimmer-duo/" data-type="URL" data-id="https://80tal.se/t/flimmer-duo/" target="_blank" rel="noreferrer noopener">Hemsida.</a></p>


<p><a href="https://www.patreon.com/flimmer/" target="_blank" rel="noopener">Stötta gärna kanalen på Patreon!</a></p>


<p class="wp-block-paragraph">Senaste avsnittet:</p>


<p><iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/H2sq1OD5q7o" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></p>]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2021/03/allt-du-behover-veta-om-flimmer-duo/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Musikdistribution på Rockklassiker år 2012</title>
		<link>https://www.winsoft.se/2021/03/musikdistribution-pa-rockklassiker-ar-2012/</link>
					<comments>https://www.winsoft.se/2021/03/musikdistribution-pa-rockklassiker-ar-2012/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sat, 20 Mar 2021 16:58:01 +0000</pubDate>
				<category><![CDATA[Pop culture]]></category>
		<guid isPermaLink="false">https://www.winsoft.se/?p=17081</guid>

					<description><![CDATA[Jag har tittat på vad radiokanalen Rockklassiker spelade på radio under första kvartalet år 2012, alltså mellan 2012-01-01 och 2012-03-31. Eftersom kanalen spelade musik i princip dygnet runt, med undantag av lite reklampauser och annat, hann man med att spela hela 26510 låtar. Man gick ut starkt genom att spela &#8220;800 grader&#8221; med Ebba Grön [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Jag har tittat på vad radiokanalen Rockklassiker spelade på radio under första kvartalet år 2012, alltså mellan 2012-01-01 och 2012-03-31. Eftersom kanalen spelade musik i princip dygnet runt, med undantag av lite reklampauser och annat, hann man med att spela hela 26510 låtar. Man gick ut starkt genom att spela &#8220;800 grader&#8221; med Ebba Grön som årets första låt, kl. 00:00 på nyårsdagen, och avslutade kvartalet med att spela &#8220;I&#8217;m on fire&#8221; med Bruce Springsteen strax före midnatt den 31:a mars. Här är lite statistik över de musikval man gjorde då.</p>
<p>Trots att hela 26510 låtar hann spelas, så hade man bara 829 låtar på spellistan under perioden i fråga. Det innebär att många låtar har spelats många gånger. Så här ser listan över de 20 mest spelade låtarna ut:</p>
<pre>Artist                   Titel                    Antal
------------------------ ------------------------ -----
Dio                      Rainbow In The Dark        197
Dio                      Holy Diver                 192
Rage Against the Machine Killing in the name of     192
Alice Cooper             Poison                     191
Gary Moore               Out In The Fields          185
DAD                      Laugh 'n' a half           180
W.A.S.P.                 I Wanna Be Somebody        178
Jimi Hendrix             Purple Haze                177
Judas Priest             Breaking The Law           171
Sweet                    Ballroom Blitz             171
Billy Idol               Rebel Yell                 170
Midnight Oil             Beds Are Burning           170
Offspring                Self esteem                170
Ugly Kid Joe             Cats In The Cradle         170
Motorhead                Ace of spades              168
Iggy Pop                 The Passenger              166
Sounds                   Living in America          166
Ram Jam                  Black Betty                164
Red Hot Chili Peppers    Scar Tissue                164
Ebba Grön                800 grader                 162</pre>
<p>223 låtar spelades bara en enda gång under perioden. Bland dessa hittar vi ganska prominenta låtar som &#8220;Build me up, break me down&#8221; med Dream Theater, &#8220;Young lust&#8221; med Pink Floyd, &#8220;Fight fire with fire&#8221; med Kansas, sex låtar med Deep Purple och inte mindre än sju låtar med Jimi Hendrix! Snyggt!</p>
<p>Om man tittar på individuella låtar tar Dio hem segern med god marginal, men han har bara sex låtar med på listan, varav i princip alla spelningar är de två som ligger först. Tittar vi på top 20 över mest spelade artister dyker Dio upp först på 19:e plats, helt utklassad av Guns n&#8217; Roses, AC/DC och Metallica.</p>
<pre>Artist                   Antal
------------------------ -----
Guns n' Roses             1007
AC/DC                      981
Metallica                  967
Iron Maiden                910
Nirvana                    783
Kiss                       749
Queen                      738
Bon Jovi                   717
Ebba Grön                  677
Ozzy Osbourne              599
U2                         559
Billy Idol                 481
Scorpions                  475
Red Hot Chili Peppers      464
Bruce Springsteen          448
Europe                     441
Rolling Stones             430
Green Day                  418
Dio                        408
Aerosmith                  352</pre>
<p>Bland de 20 artister som endast spelades en gång under perioden hittar vi förvånande nog Boston, R.E.O. Speedwaggon och Cheap Trick.</p>
<p>Så hur många låtar var de olika artisterna representerade med på listan? Rockklassikers spellista bestod som sagt av 829 låtar under perioden, och 192 artister var representerade. 87 av artisterna hade en enda låt på listan. Bland dessa hittar vi bl.a. David Lee Roth, Genesis, Yes, Asia, Yngwie Malmsteen, Cream och Helloween. En salig blandning mellan artister som av melodiradion felaktigt betraktas som one hit wonders (t.ex. Blue Öyster Cult) och extremt prominenta artister som av någon anledning inte fick med mer än en enda låt (t.ex. 10cc).</p>
<p>Här är de 20 artister som fick med flest låtar på Rockklassikers spellista:</p>
<pre>Artist                   Antal
------------------------ -----
Kiss                        36
AC/DC                       33
Bruce Springsteen           30
Metallica                   30
Van Halen                   29
Guns n' Roses               25
Iron Maiden                 21
Rolling Stones              18
Queen                       17
U2                          16
Deep Purple                 15
Jimi Hendrix                15
Black Sabbath               14
Motley Crue                 14
Motorhead                   14
Ozzy Osbourne               14
Bon Jovi                    13
Def Leppard                 13
Nirvana                     12
Aerosmith                   11</pre>
<p>Kiss var alltså representerade med hela 36 låtar, nämligen dessa (sorterat på antal spelningar):</p>
<pre>Titel                            Antal
-------------------------------- -----
Heaven's On Fire                   131
I was made for loving you          122
Detroit Rock City                  118
I Love It Loud                     102
Lick It Up                          87
Rock And Roll All Nite              78
God Gave Rock and Roll To You       27
God Of Thunder                       8
Love Gun                             8
Psycho Circus                        8
2,000 Man                            7
Calling Dr. Love                     7
Cold Gin                             4
Creatures Of The Night               4
Unholy                               4
Shout It Out Loud                    3
Strutter                             3
Crazy Crazy Nights                   3
Flaming Youth                        3
Do you love me?                      2
Beth                                 2
King of the night time world         2
Mr Speed                             2
I Love It Loud (Live)                2
I want you                           1
I Was Made For Loving You (Live)     1
Raise Your Glasses                   1
Rock And Roll All Nite (Live)        1
Shout It Loud (Live)                 1
Sure Know Something                  1
Sweet Pain                           1
Creatures Of The Night (Live)        1
Deuce                                1
Hotter Than Hell                     1
Great Expectations                   1
Hard Luck Woman                      1</pre>
<p>För att samla ihop underlaget till detta blogginlägg byggde jag en s.k. <i>web scraper</i> i Visual Basic som fick kamma hem texten på Rockklassikers hemsida, som jag startade strax före tolvslaget nyårsafton 2011 och stängde av i början på april 2012.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2021/03/musikdistribution-pa-rockklassiker-ar-2012/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Poker formation checker for .NET 5.0</title>
		<link>https://www.winsoft.se/2021/02/poker-formation-checker-for-net-5-0/</link>
					<comments>https://www.winsoft.se/2021/02/poker-formation-checker-for-net-5-0/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sun, 14 Feb 2021 20:31:34 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">http://www.winsoft.se/?p=17072</guid>

					<description><![CDATA[I got a mail from an unknown programmer who asked me to port my poker formation checker from .NET Framework to .NET 5.0. Here is the repository and here is the NuGet package. Happy coding!]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I got a mail from an unknown programmer who asked me to port my poker formation checker from .NET Framework to .NET 5.0. <a href="https://github.com/Anders-H/GenericPokerFormationChecker" target="_blank" rel="noreferrer noopener">Here</a> is the repository and <a href="https://www.nuget.org/packages/PokerFormationChecker/" target="_blank" rel="noreferrer noopener">here</a> is the NuGet package. Happy coding!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2021/02/poker-formation-checker-for-net-5-0/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>C# 9 Records</title>
		<link>https://www.winsoft.se/2021/01/c-9-records/</link>
					<comments>https://www.winsoft.se/2021/01/c-9-records/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Tue, 26 Jan 2021 21:02:33 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[General]]></category>
		<guid isPermaLink="false">http://www.winsoft.se/?p=17066</guid>

					<description><![CDATA[Hur projektmallarna pytsas ut i Visual Studio har verkligen övergått mitt förstånd. Beträffande .NET 5.0 var Windows Forms-mallen tillgänglig långt innan Console Application-mallen, men nu är äntligen allt på plats. Med anledning av det vill jag summera nyheterna i C# version 9 som, för att fungera fullt ut, kräver .NET 5.0. Här är den första: [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Hur projektmallarna pytsas ut i Visual Studio har verkligen övergått mitt förstånd. Beträffande .NET 5.0 var Windows Forms-mallen tillgänglig långt innan Console Application-mallen, men nu är äntligen allt på plats. Med anledning av det vill jag summera nyheterna i C# version 9 som, för att fungera fullt ut, kräver .NET 5.0. Här är den första:</p>



<p class="wp-block-paragraph"><strong>Records</strong><br>Records är klasser där man gjort avkall på vissa möjligheter för att komma åt möjligheten skapa objekt med properties på så lite kod som möjligt. Nyckelordet record anger att de medlemmar som följer ska vara publika (vilket inte stämmer enligt nuvarande officiell version) och om de inte ska kunna modifieras i programkoden, kan de nu deklareras som <strong>init</strong> (vilket faktiskt fungerar), vilket betyder public fram till första tilldelningen, därefter <strong>private</strong>.</p>



<pre class="wp-block-code"><code>using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string&#91;] args)
        {
            var a = new Something {X = 10, Y = 20};
            Console.WriteLine(a.X);
        }
    }

    public record Something
    {
        public int X { get; init; }
        public int Y { get; init; }
    }
}</code></pre>



<p class="wp-block-paragraph">Skulle programmet fortsätta med tilldelningen <strong>a.X = 30</strong> skulle kompilatorn påpeka att vår enda chans att lagra et värde i <strong>a.X</strong> är förbrukad.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2021/01/c-9-records/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Flimmer Duo: Future Hunters!</title>
		<link>https://www.winsoft.se/2021/01/flimmer-duo-future-hunters/</link>
					<comments>https://www.winsoft.se/2021/01/flimmer-duo-future-hunters/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sun, 24 Jan 2021 18:44:04 +0000</pubDate>
				<category><![CDATA[Pop culture]]></category>
		<guid isPermaLink="false">http://www.winsoft.se/?p=17062</guid>

					<description><![CDATA[I afton har vi premiär för en ny serie för dig som inte fått nog av att Henrik och jag suttit i radio och hackat på folk som skriver musik: Nu sitter vi på YouTube och hackar på folk som gör film. Det första avsnittet handlar om Future hunters. Mycket nöje!]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I afton har vi premiär för en ny serie för dig som inte fått nog av att Henrik och jag suttit i radio och hackat på folk som skriver musik: Nu sitter vi på YouTube och hackar på folk som gör film. Det första avsnittet handlar om Future hunters. Mycket nöje!</p>


<p><iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/agPZAHDcBww" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></p>]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2021/01/flimmer-duo-future-hunters/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Slow down (Commodore 64)</title>
		<link>https://www.winsoft.se/2021/01/slow-down-commodore-64/</link>
					<comments>https://www.winsoft.se/2021/01/slow-down-commodore-64/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sat, 16 Jan 2021 22:01:55 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">http://www.winsoft.se/?p=17057</guid>

					<description><![CDATA[En inte helt obetydlig del av min musiksmak kommer från Commodore 64, vars analoga musikkapacitet saknade motstycke. Vissa demos som släpptes var innehöll korta samplingar från kontemporär populärmusik, som t.ex. Slow down. När det handlar om digital musik var C64:an ytterst undermålig &#8211; minnet var för litet, antalet bitar per samplingspunkt var får lågt. Men [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">En inte helt obetydlig del av min musiksmak kommer från Commodore 64, vars analoga musikkapacitet saknade motstycke. Vissa demos som släpptes var innehöll korta samplingar från kontemporär populärmusik, som t.ex. <a rel="noreferrer noopener" href="https://winsoft.se/files/slowdown.d64" target="_blank">Slow down</a>. När det handlar om digital musik var C64:an ytterst undermålig &#8211; minnet var för litet, antalet bitar per samplingspunkt var får lågt. Men digitala musikdemos släpptes, för att det gick. Ett av dessa var Slow down (länkad ovan) som jag inte hade den blekaste aning om varifrån den kom förrän YouTube dök upp. Nu vet jag att det handlade om ett snävt urval från maxiversionen av gruppen Loose ends singel med samma namn.</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Loose Ends  -  Slow Down" width="500" height="375" src="https://www.youtube.com/embed/vMTGRfTJbCg?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2021/01/slow-down-commodore-64/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Hur svårt är det att gissa ett tal?</title>
		<link>https://www.winsoft.se/2020/12/hur-svart-ar-det-att-gissa-ett-tal/</link>
					<comments>https://www.winsoft.se/2020/12/hur-svart-ar-det-att-gissa-ett-tal/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Mon, 28 Dec 2020 14:07:21 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Science]]></category>
		<guid isPermaLink="false">http://www.winsoft.se/?p=17052</guid>

					<description><![CDATA[En person tänker på ett tal mellan 1 och 100, och en annan ska gissa vilket. Om den som gissar skulle gissa fel, så får han reda på om han har gissat på ett för stort eller för litet tal. Den bästa strategin för att gissa rätt på så få försök som möjligt, är att [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">En person tänker på ett tal mellan 1 och 100, och en annan ska gissa vilket. Om den som gissar skulle gissa fel, så får han reda på om han har gissat på ett för stort eller för litet tal. Den bästa strategin för att gissa rätt på så få försök som möjligt, är att försöka diskvalificera så många tal som möjligt.</p>



<p class="wp-block-paragraph">Genom att gissa på 10 och få höra att talet är för stort, är genast 91 tal diskvalificerade, och rätt svar måste vara mellan 1 och 9, men man kan lika gärna (och troligen) få höra att talet är för litet, och då är bara 10 tal (1 till 10) diskvalificerade medan 90 tal fortfarande kan vara aktuella.</p>



<p class="wp-block-paragraph">Smartast är att gissa på 50. Är det fel svar, diskvalificerar det ändå fler än hälften av alla tal mellan 1 och 100, oberoende av om 50 är för stort eller inte. Skulle det vara för stort gissar man på 25, skulle det vara för litet gissar man på 75, och så vidare. Den vinnande strategin för den som gissar på ett tal är alltså att dra av hälften av talrymdens storlek och addera det till eller dra bort det ifrån senaste gissning.</p>



<p class="wp-block-paragraph">Eftersom det finns en bästa strategi för den som gissar, så kommer antalet försök att hitta ett tal alltid bli detsamma för ett specifikt tal. Personen tänker på talet 50, kommer den som gissar att hitta talet på första försöket. För att mäta hur lång tid det tar att hitta ett specifikt tal, och för att slippa sitta med en vän och gissa på tal hela veckan, har jag skapat två enkla robotar.</p>



<p class="wp-block-paragraph">Roboten Conny kan tänka på ett tal och be någon att gissa. Roboten Steven kan gissa på tal, och är dessutom bekant med gissningsstrategin jag beskrev ovan. Detta är Conny:</p>



<pre class="wp-block-code"><code>public class NumberThinkingRobot
{
    private readonly ICanGuess _guesser;
    private readonly int _correct;

    public NumberThinkingRobot(int correct, ICanGuess guesser)
    {
        _correct = correct;
        _guesser = guesser;
    }

    public void Begin()
    {
        var tryCount = 0;
        do
        {
            Console.WriteLine($"Try no. {++tryCount}");

            var guess = _guesser.Guess();

            if (guess &lt; _correct)
                _guesser.TooSmall();
            else if (guess > _correct)
                _guesser.TooLarge();
            else
            {
                Console.WriteLine("Correct!");
                break;
            }
        } while (true);
    }
}</code></pre>



<p class="wp-block-paragraph">Och detta är Steven:</p>



<pre class="wp-block-code"><code>public class NumberGuessingRobot : ICanGuess
{
    private readonly int _max;
    private int _correct;
    private double _stepSize;

    public NumberGuessingRobot(int max)
    {
        _max = max;
        _correct = _max/2;
        _stepSize = _correct;
    }

    public int Guess()
    {
        Console.WriteLine($"Guess: {_correct}");
        return _correct;
    }

    public void TooSmall()
    {
        Console.WriteLine("Too small!");

        _stepSize /= 2.0;
        _stepSize = _stepSize &lt; 1
            ? 1
            : _stepSize;

        _correct += (int)Math.Round(_stepSize);
        _correct = _correct > _max
            ? _max
            : _correct;
    }

    public void TooLarge()
    {
        Console.WriteLine("Too large!");

        _stepSize /= 2.0;
        _stepSize = _stepSize &lt; 1
            ? 1
            : _stepSize;

        _correct -= (int)Math.Round(_stepSize);
        _correct = _correct &lt; 1
            ? 1
            : _correct;
    }
}</code></pre>



<p class="wp-block-paragraph">Programmet presenteras i sin helhet sist. Så låt oss instruera Conny att det korrekta talet är 22, och instruera Steven att det högsta tillåtna talet är 100, för att sedan fösa ihop dem.</p>



<pre class="wp-block-code"><code>using System;

const int max = 100;
const int correct = 22;
var steven = new NumberGuessingRobot(max);
var conny = new NumberThinkingRobot(correct, steven);
conny.Begin();</code></pre>



<p class="wp-block-paragraph">Vi kan konstatera att Steven behöver ha fem försök för att hitta 22. Detta är resultatet av körningen:</p>



<pre class="wp-block-code"><code>Try no. 1
Guess: 50
Too large!
Try no. 2
Guess: 25
Too large!
Try no. 3
Guess: 13
Too small!
Try no. 4
Guess: 19
Too small!
Try no. 5
Guess: 22
Correct!</code></pre>



<p class="wp-block-paragraph">Så hur svåra är de olika talen mellan 1 och 100 att hitta? 50 hittas direkt och 25 och 75 hittas på två gissningar. 13, 37, 63 och 87 kräver tre gissningar. 7 19, 31, 43, 57, 69, 81 och 93 kräver fyra. För 4, 10, 16, 22, 28, 34, 40, 46, 54, 60, 66, 72, 78, 84, 90 och 96 krävs fem gissningar. Resterande sextionio tal kräver sex gissningar eller fler, vilket innebär att det i snitt tar nästan sex gissningar att hitta rätt med den bästa strategin.</p>



<p class="wp-block-paragraph">Om man istället ska gissa på ett tal mellan 1 och 1000 så har vi tio gånger så många alternativ till korrekt tal, men strategin kräver bara i snitt nio gissningar. Om vi har hundra gånger så många alternativ (ett tal mellan 1 och 10.000) krävs i snitt ungefär 12 gissningar, och för att gissa ett tal mellan 1 och 100.000 krävs knappt 16 gissningar.</p>



<p class="wp-block-paragraph">Här är programmet i sin helhet (C#9):</p>



<pre class="wp-block-code"><code>using System;

const int max = 100;
const int correct = 22;
var steven = new NumberGuessingRobot(max);
var conny = new NumberThinkingRobot(correct, steven);
conny.Begin();

public class NumberThinkingRobot
{
    private readonly ICanGuess _guesser;
    private readonly int _correct;

    public NumberThinkingRobot(int correct, ICanGuess guesser)
    {
        _correct = correct;
        _guesser = guesser;
    }

    public void Begin()
    {
        var tryCount = 0;
        do
        {
            Console.WriteLine($"Try no. {++tryCount}");

            var guess = _guesser.Guess();

            if (guess &lt; _correct)
                _guesser.TooSmall();
            else if (guess > _correct)
                _guesser.TooLarge();
            else
            {
                Console.WriteLine("Correct!");
                break;
            }
        } while (true);
    }
}

public class NumberGuessingRobot : ICanGuess
{
    private readonly int _max;
    private int _correct;
    private double _stepSize;

    public NumberGuessingRobot(int max)
    {
        _max = max;
        _correct = _max/2;
        _stepSize = _correct;
    }

    public int Guess()
    {
        Console.WriteLine($"Guess: {_correct}");
        return _correct;
    }

    public void TooSmall()
    {
        Console.WriteLine("Too small!");

        _stepSize /= 2.0;
        _stepSize = _stepSize &lt; 1
            ? 1
            : _stepSize;

        _correct += (int)Math.Round(_stepSize);
        _correct = _correct > _max
            ? _max
            : _correct;
    }

    public void TooLarge()
    {
        Console.WriteLine("Too large!");

        _stepSize /= 2.0;
        _stepSize = _stepSize &lt; 1
            ? 1
            : _stepSize;

        _correct -= (int)Math.Round(_stepSize);
        _correct = _correct &lt; 1
            ? 1
            : _correct;
    }
}

public interface ICanGuess
{
    int Guess();
    void TooSmall();
    void TooLarge();
}</code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2020/12/hur-svart-ar-det-att-gissa-ett-tal/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Flytta C64-program till din PC</title>
		<link>https://www.winsoft.se/2020/11/flytta-c64-program-till-din-pc/</link>
					<comments>https://www.winsoft.se/2020/11/flytta-c64-program-till-din-pc/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Tue, 10 Nov 2020 23:08:05 +0000</pubDate>
				<category><![CDATA[Geeky]]></category>
		<guid isPermaLink="false">http://www.winsoft.se/?p=17035</guid>

					<description><![CDATA[Det finns en del olika strategier för att bevara (eller preservera) gamla Commodore 64-program för framtiden. Här presenterar jag en snabbguide för den som äger en SD2IEC och ett tomt SD-kort. Hårdvarukrav: Du behöver ha en C64 (eller annan 8-bitarsmaskin från Commodore, men jag antar att du har en C64), en diskdrive, en floppydisk du [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Det finns en del olika strategier för att bevara (eller <em>preservera</em>) gamla Commodore 64-program för framtiden. Här presenterar jag en snabbguide för den som äger en <a rel="noreferrer noopener" href="https://www.c64-wiki.com/wiki/SD2IEC" target="_blank">SD2IEC</a> och ett tomt <a rel="noreferrer noopener" href="https://www.kjell.com/se/produkter/mobilt/minneskort/sandisk-ultra-sd-kort-32-gb-p92963" target="_blank">SD-kort</a>.</p>



<p class="wp-block-paragraph"><strong>Hårdvarukrav:</strong></p>



<p class="wp-block-paragraph">Du behöver ha en C64 (eller annan 8-bitarsmaskin från Commodore, men jag antar att du har en C64), en diskdrive, en floppydisk du vill bevara (preservera), ett SD-kort att preservera floppydisken på och en SD2IEC-enhet.</p>



<p class="wp-block-paragraph"><strong>Förberedelser av SD-kort (görs på din Windows-dator):</strong></p>



<p class="wp-block-paragraph">Se till att formatera kortet till FAT32. Placera ut en diskavbildning (D64-fil) innehållande <a rel="noreferrer noopener" href="http://www.mobilefx.de/html/dracopy.html" target="_blank">DraCopy</a> och en diskavbildning som är tom (vilket enkelt skapas med t.ex. <a rel="noreferrer noopener" href="https://style64.org/dirmaster" target="_blank">DirMaster</a>). Du bör nu ha ett FAT32-formaterat SD-kort med två diskavbildningar på (D64-filer).</p>



<p class="wp-block-paragraph">Mata därefter in SD-kortet i din SD2IEC-enhet som är kopplad till din C64. Notera att det finns en hel drös olika varianter av SD2IEC. Vissa har en serieport för att man ska kunna koppla in en fysisk diskdrive i den, men om det saknas så går det bra att dra en sladd mellan din C64 och din diskdrive, och en sladd mellan din diskdrive och din SD2IEC-enhet.</p>



<p class="wp-block-paragraph"><strong>Val av enhetsbeteckning:</strong></p>



<p class="wp-block-paragraph">Om inget annat är sagt, kommer både din SD2IEC och din diskdrive att ha enhetsbeteckning 8, vilket innebär att de inte kan användas samtidigt. Har du en SD2IEC med dipomkopplare eller en diskdrive med dipomkopplare kan du enkelt ändra så att den ena enheten har en annan enhetsbeteckning än 8. Jag valde att lägga min diskdrive (Commodore 1571) på enhet 10 och låta min SD2IEC ligga kvar på enhet 8. Se till att dina enheter har olika beteckning, och att du håller koll på vilken enhet som har vilken beteckning &#8211; i denna text kommer min enhet 8 vara SD2IEC och enhet 10 vara min diskdrive, men du måste tänka på hur du har konfigurerat hårdvaran.</p>



<p class="wp-block-paragraph">Om du inte kan ändra enhetsbeteckning med dipomkopplare på någon av enheterna, får du använda ett kommando för att ändra enhetsbeteckning på din SD2IEC. Detta kommando ändrar enhetsbeteckningen från 8 till 9 (vilket jag inte gjort).</p>



<p class="wp-block-paragraph"><code>OPEN1,8,15,"U0&gt;+CHR$(9)":CLOSE1</code></p>



<p class="wp-block-paragraph">Men tänk på att jag har SD2IEC som 8 och min diskdrive som 10.</p>



<p class="wp-block-paragraph">Därefter är det bara att leta reda på en floppydisk som du vill bevara, och stoppa in den i din diskdrive (som för mig är enhet 10). Ditt SD-kort med DraCopy och den tomma virtuella disken (som jag har valt att kalla för empty.d64) ska matas in i din SD2IEC.</p>



<p class="wp-block-paragraph"><strong>Utför kopieringen:</strong></p>



<p class="wp-block-paragraph">Välj den virtuella disketten innehållande DraCopy som din diskett på enhet 8 (i mitt fall &#8211; tänk på att anpassa efter behov) genom följande kommando:</p>



<p class="wp-block-paragraph"><code>OPEN1,[enhet],15,"CD:[avbildning innehållande DraCopy]":CLOSE1</code></p>



<p class="wp-block-paragraph">I mitt fall:</p>



<p class="wp-block-paragraph"><code>OPEN1,8,15,"CD:dc10d.d64":CLOSE1</code></p>



<p class="wp-block-paragraph">Starta rätt version av DraCopy, beroende på vilken 8-bitarsmaskin du använder. Du kan se de tillgängliga versionerna genom att skriva <code>LOAD"$",8</code> följt av <code>LIST</code>.</p>



<p class="wp-block-paragraph">Jag hämtar rätt version för mig genom att skriva <code>LOAD"DC64",8,1</code> och sedan <code>RUN</code>.</p>



<p class="wp-block-paragraph">Innan du startar DraCopy, koppla loss diskavbildningen innehållande DraCopy. (Symbolen vänsterpil finns längst uppe till vänster på tangentbordet på din C64:a.)</p>



<p class="wp-block-paragraph"><code>OPEN1,8,15,"CD:[vänsterpil]":CLOSE1</code></p>



<p class="wp-block-paragraph">Mounta sedan tomma virtuella disk.</p>



<p class="wp-block-paragraph"><code>OPEN1,8,15,"CD:EMPTY.D64":CLOSE1</code></p>



<p class="wp-block-paragraph">DraCopy innehåller två fönster. Det ena har titeln S[enhet], t.ex. S08, och det andra har titeln D[enhet], t.ex. D09. Du väljer vilket fönster du ska arbeta i genom att trycka på vänsterpilen, längst uppe till vänster på tangentbordet.</p>



<p class="wp-block-paragraph">I det ena fönstret, tryck på F2 tills du hittar källdisken (den fysiska) eller destinationsdisken (den virtuella). Tryck sedan F1 och för att visa diskens innehåll och bekräfta att du har valt rätt.</p>



<p class="wp-block-paragraph">Därefter, tryck på vänsterpilen för att byta fönster och upprepa proceduren. F2 för att välja destinationsdisken eller källdisken och F1 för att visa innehåll.</p>



<p class="wp-block-paragraph">När det ena fönstret innehåller källan och det andra fönstret innehåller destinationen, tryck på vänsterpilen till dess att källan har ett S framför sig och destinationen har ett D framför sig.</p>



<p class="wp-block-paragraph">Därefter utför du kopieringen genom att trycka F8.</p>



<p class="wp-block-paragraph">När kopieringen är klar och du har flyttat SD-kortet tillbaka till din PC, glöm inte att ge diskavbildningen ett vettigare filnamn än <code>EMPTY.D64</code>.</p>



<p class="wp-block-paragraph"><strong>Begränsningar:</strong></p>



<p class="wp-block-paragraph">DraCopy kan endast kopiera disketter som inte innehåller några läsfel. Om du vill bevara ett program på en diskett som innehåller fel, bör du istället använda ett kopieringsprogram som kopierar individuella filer.</p>



<p class="wp-block-paragraph"><strong>Resultat:</strong></p>



<p class="wp-block-paragraph">För min del valde hag en diskett innehållande bl.a. en låt som jag vet inte har digitaliserats för, nämligen <em>Slow Down</em>. Diskavbildningen finns att ladda hem <a href="http://winsoft.se/files/slowdown.d64" target="_blank" rel="noreferrer noopener">här</a>.</p>


<p><iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/JZtSjIGBNqE" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></p>


<p class="wp-block-paragraph">(Låten Slow Down är samplad från gruppen Loose Ends, 1986.)</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2020/11/flytta-c64-program-till-din-pc/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>C# from the command window</title>
		<link>https://www.winsoft.se/2020/11/c-from-the-command-window/</link>
					<comments>https://www.winsoft.se/2020/11/c-from-the-command-window/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sat, 07 Nov 2020 19:18:53 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<guid isPermaLink="false">http://www.winsoft.se/?p=17031</guid>

					<description><![CDATA[If you are using .NET Core (or .NET 5.0) you can easily activate the ability to run C# code from the command window (Windows Terminal or the old cmd.exe). To get started, install dotnet-script by typing: dotnet tool install --global dotnet-script Once installed, you can start the dotnet-script program just by typing: dotnet-script The prompt [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">If you are using .NET Core (or .NET 5.0) you can easily activate the ability to run C# code from the command window (Windows Terminal or the old cmd.exe).</p>



<p class="wp-block-paragraph">To get started, install <strong>dotnet-script</strong> by typing:</p>



<p class="wp-block-paragraph"><code>dotnet tool install --global dotnet-script</code></p>



<p class="wp-block-paragraph">Once installed, you can start the dotnet-script program just by typing:</p>



<p class="wp-block-paragraph"><code>dotnet-script</code></p>



<p class="wp-block-paragraph">The prompt now looks like a greater than-sign (<code>></code>). From here, you can type any C# code and you can reference anything within the System namespace. For example, if you type:</p>



<p class="wp-block-paragraph"><code>Console.WriteLine("Hello world!");</code></p>



<p class="wp-block-paragraph">…you will get the following answer:</p>



<p class="wp-block-paragraph"><code>Hello world!</code></p>



<p class="wp-block-paragraph">A few things to keep in mind: Types you add will be remembered for the whole session. For example, if you type in a class, you can use that class in the session. And if the command windows expect further input, the prompt will change from a greater than-signe to an asterisk sign (<code>*</code>). So if you type in something like <code>class MyClass {</code> and press Enter, nothing will be executed. Instead, the command window will indicate that more input is expected by displaying an asterisk sign. To try this out, type something like this (terminating each statement with Enter):</p>



<p class="wp-block-paragraph"><code>class MyClass {<br>public void DoSomething() {<br>Console.WriteLine("Hello!");<br>}<br>}</code></p>



<p class="wp-block-paragraph">And then, you can use your new type like this:</p>



<p class="wp-block-paragraph"><code>new MyClass().DoSomething();</code></p>



<p class="wp-block-paragraph">The response will be:</p>



<p class="wp-block-paragraph"><code>Hello!</code></p>



<p class="wp-block-paragraph">The picture shows the different prompts when you type in a simple for loop:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="270" height="200" src="http://www.winsoft.se/wp-content/uploads/for.jpg" alt="" class="wp-image-17032" srcset="https://www.winsoft.se/wp-content/uploads/for.jpg 270w, https://www.winsoft.se/wp-content/uploads/for-150x111.jpg 150w" sizes="auto, (max-width: 270px) 100vw, 270px" /></figure>



<p class="wp-block-paragraph">This is a very powerful tool to use when you want to perform tasks that are a bit too complicated for a calculator, but perhaps a bit too simple fore an advanced computer program, or when you want to try out some API you are working on. Happy programming!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2020/11/c-from-the-command-window/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>DOD är bättre OOD för tidskritiska system</title>
		<link>https://www.winsoft.se/2020/08/dod-ar-battre-ood-for-tidskritiska-system/</link>
					<comments>https://www.winsoft.se/2020/08/dod-ar-battre-ood-for-tidskritiska-system/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sat, 29 Aug 2020 16:07:42 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[General]]></category>
		<guid isPermaLink="false">http://www.winsoft.se/?p=17020</guid>

					<description><![CDATA[Objektorienterad design (OOD) är ofta ett bra val för att det är relativt enkelt att använda med robusta mönster att följa. Men när man programmerar tidskritiskt, som t.ex. i när man gör spel, kan det vara värt att titta på dataorienterad design (DOD). DOD handlar om att utnyttja processorns cache. Normalt när man läser och [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><strong>Objektorienterad design</strong> (OOD) är ofta ett bra val för att det är relativt enkelt att använda med robusta mönster att följa. Men när man programmerar tidskritiskt, som t.ex. i när man gör spel, kan det vara värt att titta på <strong>dataorienterad design</strong> (DOD).</p>



<p class="wp-block-paragraph">DOD handlar om att utnyttja processorns cache. Normalt när man läser och skriver data ber man processorn att läsa och skriva från RAM-minnet. Men när så sker, antar processorn att fler läs- och skrivoperationer kommer att ske med närliggande minneadresser, och cachar således närliggande data. Man kan alltså öka prestandan i sitt program, genom att se till att data som uppdateras ofta ligger nära varandra i minnet.</p>



<p class="wp-block-paragraph">Jag har en väldigt enkel dator, en liten NUC från ASUS. Jag har skrivit ett litet testprogram i C#/.NET Core 3.1 som skapar 500 rymdskepp och flyttar dessa en halv miljon enheter i sidled, både enligt OOD och DOD.</p>



<p class="wp-block-paragraph"><strong>Den objektorienterade lösningen</strong></p>



<p class="wp-block-paragraph">Denna kod definierar ett rymdskepp enligt traditionell OOD:</p>


<pre>public class Spaceship
{
    public int X { get; set; }
    public int Y { get; set; }
}</pre>


<p class="wp-block-paragraph">Följande lilla kodsnutt skapar 500 rymdskepp i en array (givet att konstanten <code>Ships</code> är satt till 500):</p>



<pre>var spaceshipsOop = new Spaceship[Ships];

for (var i = 0; i < Ships; i++)
    spaceshipsOop[i] = new Spaceship
    {
        X = 0,
        Y = i
    };</pre>



<p class="wp-block-paragraph">Och denna kod förflyttar alla 500 skepp en halv miljon enheter åt vänster (eftersom konstanten <code>travelDistance</code> är satt till 500 000):</p>



<pre>for (var x = 0; x < travelDistance; x++)
    for (var i = 0; i < Ships; i++)
        spaceshipsOop[i].X++;</pre>



<p class="wp-block-paragraph">Hela kalaset kostar 194 millisekunder (3,124 sekunder i debugläge) för min lilla processor att utföra.</p>



<p class="wp-block-paragraph"><strong>Den dataorienterade lösningen</strong></p>



<p class="wp-block-paragraph">I den dataorienterade lösningen vill vi försäkra oss om att data som kommer uppdateras samtidigt också finns lagrat tillsammans. Därför skulle definitionen av ett rymdskepp kunna bytas ut mot en definition av samtliga rymdskepp:</p>



<pre>public class Spaceships
{
    public int[] X { get; set; }
    public int[] Y { get; set; }
}</pre>



<p class="wp-block-paragraph">Det innebär att koden som skapar 500 rymdskepp istället ser ut så här:</p>



<pre>var spaceshipsDoa = new Spaceships
{
    X = new int[Ships], Y = new int[Ships]
};
for (var i = 0; i < Ships; i++)
{
    spaceshipsDoa.X[i] = 0;
    spaceshipsDoa.Y[i] = i;
}</pre>



<p class="wp-block-paragraph">Och slutligen, koden som förflyttar skeppen en halv miljon enheter åt vänster, ser nu ut så här:</p>



<pre>for (var x = 0; x < travelDistance; x++)
    for (var i = 0; i < Ships; i++)
        spaceshipsDoa.X[i]++;</pre>



<p class="wp-block-paragraph">På min enhet har processorn fått jobba i 334 millisekunder (1,419 sekunder i debug-läge) för att åstadkomma detta, vilket är en rejäl försämring, men en förbättring på mer än 50 procent i debug-läge.</p>



<p class="wp-block-paragraph">Vi kan alltså konstatera att man inte har någon automatisk vinst innan man kommer upp i lite tyngre arbeten, och det är därför fördelen med DOD var så tydligt i debug-läge. I release-läge ligger <em>break-even</em> för min del när 500 skepp gör en resa på två miljoner enheter (ungefär 1,2 sekunder oavsett strategi), och vid fem miljoner enheter kostar OOD-lösningen 3,2 sekunder och DOD-lösningen 2,5 sekunder.</p>



<p class="wp-block-paragraph">Fördelen med DOD minskar ytterligare om antalet rymdskepp som ska förflyttas minskar, men ökar om antalet rymdskepp som ska förflyttas ökar. Med 2000 rymdskepp som ska  som ska förflyttas fem miljoner enheter kostar OOD-lösningen 100 sekunder och DOD-lösningen 65 sekunder, vilket är en klart märkbar förbättring. Om en skälig mängd data ska användas väldigt intensivt och prestanda är kritiskt så är DOD att föredra, men i övrigt spelar det ingen större roll</p>



<p class="wp-block-paragraph"><strong>Hela källkoden (C# version 8.0, .NET Core version 3.1):</strong></p>



<pre>using System;
using System.Diagnostics;

namespace ConsoleApp2
{
    public class Program
    {
        public const int Ships = 2000;

        private static void Main()
        {
            const int travelDistance = 5000000;

            var spaceshipsOop = new Spaceship[Ships];

            for (var i = 0; i < Ships; i++)
                spaceshipsOop[i] = new Spaceship
                {
                    X = 0,
                    Y = i
                };

            var stopwatch = new Stopwatch();
            stopwatch.Start();
            
            for (var x = 0; x < travelDistance; x++)
                for (var i = 0; i < Ships; i++)
                    spaceshipsOop[i].X++;

            stopwatch.Stop();

            Console.WriteLine($"Object oriented approach: {stopwatch.ElapsedMilliseconds}");

            stopwatch.Reset();

            var spaceshipsDoa = new Spaceships
            {
                X = new int[Ships], Y = new int[Ships]
            };
            for (var i = 0; i < Ships; i++)
            {
                spaceshipsDoa.X[i] = 0;
                spaceshipsDoa.Y[i] = i;
            }

            stopwatch.Start();

            for (var x = 0; x < travelDistance; x++)
                for (var i = 0; i < Ships; i++)
                    spaceshipsDoa.X[i]++;

            stopwatch.Stop();

            Console.WriteLine($"Data oriented approach: {stopwatch.ElapsedMilliseconds}");
        }
    }

    public class Spaceship
    {
        public int X { get; set; }
        public int Y { get; set; }
    }

    public class Spaceships
    {
        public int[] X { get; set; }
        public int[] Y { get; set; }
    }
}</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2020/08/dod-ar-battre-ood-for-tidskritiska-system/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Podcasts</title>
		<link>https://www.winsoft.se/2020/08/podcasts/</link>
					<comments>https://www.winsoft.se/2020/08/podcasts/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Fri, 21 Aug 2020 18:48:27 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">http://www.winsoft.se/?p=17017</guid>

					<description><![CDATA[I afton vill jag tipsa två fenomenala podcasts. I veckans avsnitt av Stulet gods pratar Henrik Andersson och jag om Poison, John Carpenter, Ankie Bagger och Joe Walsh. Avsnittet finns här eller där podcasts finns. Dessutom vill jag verkligen slå ett slag för Generation YX där vi diskuterar allt från den finska tullen till svensk [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>I afton vill jag tipsa två fenomenala podcasts. I veckans avsnitt av <b>Stulet gods</b> pratar Henrik Andersson och jag om Poison, John Carpenter, Ankie Bagger och Joe Walsh. <a href="https://open.spotify.com/episode/1EUeBwimIDXELIw4wdCPFz" target="_blank" rel="noopener noreferrer">Avsnittet finns här</a> eller där podcasts finns. Dessutom vill jag verkligen slå ett slag för <a href="https://open.spotify.com/episode/1U7poWu5MPfYtbBDcByr8J" target="_blank" rel="noopener noreferrer">Generation YX</a> där vi diskuterar allt från den finska tullen till svensk skogsporr. Ingen mindre än <b>Aron Flam</b> närvarar.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2020/08/podcasts/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Generation YX</title>
		<link>https://www.winsoft.se/2020/08/generation-yx/</link>
					<comments>https://www.winsoft.se/2020/08/generation-yx/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Fri, 14 Aug 2020 14:11:01 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">http://www.winsoft.se/?p=17013</guid>

					<description><![CDATA[Generation YX är en ny poddcast med journalisten Jannik Svensson och mig, där vi diskuterar samhällsaktuella frågor ur ett generationsperspektiv. All information finns på hemsidan https://genyx.se/ men den finns där poddar finns.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Generation YX är en ny poddcast med journalisten Jannik Svensson och mig, där vi diskuterar samhällsaktuella frågor ur ett generationsperspektiv.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="654" height="654" src="http://www.winsoft.se/wp-content/uploads/Untitled-1.jpg" alt="" class="wp-image-17014" srcset="https://www.winsoft.se/wp-content/uploads/Untitled-1.jpg 654w, https://www.winsoft.se/wp-content/uploads/Untitled-1-300x300.jpg 300w, https://www.winsoft.se/wp-content/uploads/Untitled-1-150x150.jpg 150w, https://www.winsoft.se/wp-content/uploads/Untitled-1-70x70.jpg 70w" sizes="auto, (max-width: 654px) 100vw, 654px" /></figure>



<p class="wp-block-paragraph">All information finns på hemsidan <a href="https://genyx.se/" target="_blank" rel="noreferrer noopener">https://genyx.se/</a> men den finns där poddar finns.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2020/08/generation-yx/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Kategoriska uttalanden om vad datorer kan och inte kan bygger ofta på okunskap</title>
		<link>https://www.winsoft.se/2020/07/kategoriska-uttalanden-om-vad-datorer-kan-och-inte-kan-bygger-ofta-pa-okunskap/</link>
					<comments>https://www.winsoft.se/2020/07/kategoriska-uttalanden-om-vad-datorer-kan-och-inte-kan-bygger-ofta-pa-okunskap/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Wed, 08 Jul 2020 19:56:47 +0000</pubDate>
				<category><![CDATA[Science]]></category>
		<guid isPermaLink="false">http://www.winsoft.se/?p=17000</guid>

					<description><![CDATA[Ibland hör man folk uttala sig vad datorer kan göra, antingen för att beskriva hur man ser på mjukvara eller för att göra en liknelse. Nu senast hörde jag Myra Åhbeck Öhrman berätta att datorer bara gör det man säger åt dem att göra. När hon berättar varför hon inte tror att människan kommer kunna [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Ibland hör man folk uttala sig vad datorer kan göra, antingen för att beskriva hur man ser på mjukvara eller för att göra en liknelse. Nu senast hörde jag Myra Åhbeck Öhrman berätta att datorer bara gör det man säger åt dem att göra. När hon berättar varför hon inte tror att människan kommer kunna skapa artificiellt intelligent liv <a rel="noreferrer noopener" href="https://samtal.ax/myra-ahbeck-ohrman/" target="_blank">säger hon</a>:<br></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>En dator kan ju bara göra precis det vi säger åt den att göra.<br></p></blockquote>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Det får mig att fundera hur hon resonerar. Allra närmast plåten är detta på sätt och vis sant &#8211; en maskinkodsinstruktion som utförs av en mikroprocessor har ett förutsägbar effekt &#8211; men vilken kontroll har vi egentligen över vad som sker på den nivån?</p>



<p class="wp-block-paragraph"><strong>Instruktioner som ges till en dator kan komma från en mycket högre nivå.</strong> Betrakta detta BASIC-program:</p>



<p class="wp-block-paragraph"><code>FOR A=1 TO 10<br>PRINT A<br>NEXT</code><br><br>I detta fall är Myras påstående princip sant. Denna programkod kommer att översättas till maskinkod av en kompilator, och maskinkoden kommer att matas till processorn som utför instruktionerna. I detta fall ber vi datorn att räkna till 10, och datorn utför exakt det. Vill du testa, kan du köra BASIC-kod i webbläsaren <a href="https://www.tutorialspoint.com/execute_basic_online.php" target="_blank" rel="noreferrer noopener">här</a>.</p>



<p class="wp-block-paragraph"><strong>Instruktioner som ges kan bero på kontext.</strong> Betrakta följande SQL-program:</p>



<p class="wp-block-paragraph"><code>SELECT CustomerName<br>FROM Customers<br>WHERE CustomerName<br>LIKE "A%"</code></p>



<p class="wp-block-paragraph">Programmet beskriver egentligen inte vad datorn ska göra, utan vad användaren vill ha gjort: Ha tillbaka namnet på alla kunder vars namn börjar på bokstaven A. Exakt vad detta kompileras ner till för instruktioner, beror på lite olika saker. Är det mycket data? Finns det många namn som börjar på A? Finns det ett index att slå i? Och så vidare. Jag som människa har förmodligen lättare överskåda strategier och möjliga val, än vilka val som kommer att göras i en given situation. Det är fortfarande människor som i ett tidigare steg har berättat om de olika strategierna för datorn, men vilka maskinkodsinstruktioner som till slut utförs av processorn för att lösa uppgiften, är inte lika självklart som i BASIC-exemplet. Vill du testa, kan du köra SQL-kod i webbläsaren <a href="https://www.w3schools.com/sql/trysql.asp?filename=trysql_op_in" target="_blank" rel="noreferrer noopener">här</a>.</p>



<p class="wp-block-paragraph">Och så här rullar det på, från nivå till nivå, ända till oigenkännbarhet. I några steg längre upp har vi den artificiella intelligensen som ska lösa problem åt oss, där programmeraren inte vet hur man löser problemet, och snarare skriver kod som ska leta efter samband i ett dataset. För att producera en lösning kan evolutionära algoritmer användas, och härifrån kan man antingen låta evolvera eller låta en artificiell intelligens producera kod. I framtiden kanske det är en artificiell intelligens som konstruerat den artificiella intelligens som ska producera koden, men redan idag har vi tappat kontrollen över vad som händer på själva plåten. Om gud skapade universum och sedan klev åt sidan, kan man då verkligen säga att det är guds fel att två bilar kolliderade på E4:an i torsdags, eller har han lämnat ifrån sig kommenderingen till någon annan? Att säga att datorer är fastlåsta i bara utföra instruktioner från sin husbonde, är att förneka modern datavetenskap.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2020/07/kategoriska-uttalanden-om-vad-datorer-kan-och-inte-kan-bygger-ofta-pa-okunskap/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>JobRunner 1.2</title>
		<link>https://www.winsoft.se/2020/05/jobrunner-1-2/</link>
					<comments>https://www.winsoft.se/2020/05/jobrunner-1-2/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sat, 16 May 2020 14:35:09 +0000</pubDate>
				<category><![CDATA[Programs]]></category>
		<guid isPermaLink="false">http://www.winsoft.se/?p=16997</guid>

					<description><![CDATA[JobRunner är ett klientprogram för att starta, köra och övervaka andra program, typiskt kommandon för att publicera, ladda hem, rendera bilder, texter eller XML-flöden. I version 1.2 finns möjligheten att logga körningen. Programmet (och dess källkod) finns att ladda hem här: https://github.com/Anders-H/JobRunner]]></description>
										<content:encoded><![CDATA[<p>JobRunner är ett klientprogram för att starta, köra och övervaka andra program, typiskt kommandon för att publicera, ladda hem, rendera bilder, texter eller XML-flöden. I version 1.2 finns möjligheten att logga körningen. Programmet (och dess källkod) finns att ladda hem här: <a href="https://github.com/Anders-H/JobRunner" target="_blank" rel="noopener noreferrer">https://github.com/Anders-H/JobRunner</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2020/05/jobrunner-1-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Commodore 128 är en schweizisk armékniv</title>
		<link>https://www.winsoft.se/2020/05/commodore-128-ar-en-schweizisk-armekniv/</link>
					<comments>https://www.winsoft.se/2020/05/commodore-128-ar-en-schweizisk-armekniv/#respond</comments>
		
		<dc:creator><![CDATA[Anders Hesselbom]]></dc:creator>
		<pubDate>Sat, 02 May 2020 17:34:35 +0000</pubDate>
				<category><![CDATA[Retro]]></category>
		<guid isPermaLink="false">http://www.winsoft.se/?p=16994</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[<p><iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/Eey-17YeK9M" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.winsoft.se/2020/05/commodore-128-ar-en-schweizisk-armekniv/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>