torsdag 23 februari 2017

Bevisapologetik och bevismetoden

Gudstro är blind tro. Man tror inte på Gud för att det, ur ett vetenskapligt perspektiv, finns några rimliga skäl, man tror för att man vill tro. Men det finns en ådra inom apologetiken som kallas för bevisapologetik, där man anser sig ha kombinerat sin gudstro med evidentialism. YouTube-kanalen Questions From Atheists är en apologetisk kanal som har den här inriktningen, och i en video som handlar om Jesus lägger man ut texten genom att nämna ett vanligt påstående från ateister (?) som man sedan besvarar.

Jesu existens är inte vetenskapligt bevisad. Detta besvaras med att "den vetenskapliga metoden" endast kan gälla när man pratar om något som är observerbart, mätbart och möjligt att upprepa. I själva verket är den bästa metoden för att skaffa kunskap inom ett område att betrakta som vetenskaplig. Det handlar ibland om att upprepa och mäta saker, ibland om logik, ibland om observationer och ibland om att studera vittnesmål. Det finns inte en enda vetenskaplig metod, utan vetenskapligt arbete ser olika ut beroende på vad man gör. Påståendet att Jesus hade en verklig förebild, är ett påstående som faller i samma kategori som det att Napoleon har funnits. Och för tydlighetens skull vill jag säga att även om Jesus har haft en verklig förebild, så har inte den som tror på återuppståndelsen, jungfrufödseln eller helbrägdagörelse, något att hämta från det.

Sedan gör man ett eget påstående:

För att utvärdera historiska händelser används "den evidensiära metoden", som tar hänsyn till ögonvittnen och vittnesmål. Och tydligen även till Bibeln. Ingen som skrev någon av Bibelns böcker har någonsin sett Jesus. Några evangelister hördes inte av förrän långt efter hans död - dessa är varken ögonvittnen eller oberoende, men väl inkonsekventa och tydligt färgade av drivkraften att skapa en legitim religion av en sekt som kretsade kring Jesuskulten. Jag erkänner gärna att Jesus kan ha haft en verklig förebild, eller kanske rent av flera, men här går man vidare och hävdar att "bevisen finns redo för mitt övervägande" med hänvisning till just Bibeln och evangelisterna. Aj då!

Hur man agerar vetenskapligt varierar med vad man gör, vilket gör att Questions From Atheists får ett halvt rätt. Men när man tar till sin "evidensiära metod", verkar man just inte göra något annat än att ta evangelisterna på orden, och ge det ett namn som låter viktigare än "blind auktoritetstro", trots att det är närmare sanningen. Att tro på Gud, eller att tro på den Jesus som som var hans som, är något man gör i strid med vad vi vet om hur verkligheten är beskaffad. Det är blind tro, det ankommer inte på en skeptiker.

tisdag 21 februari 2017

Willkommen in der Bibliothek auf Ekerö



Och om du missat Dagens Nyheters Facebook-video som förklarar svensk utrikespolitik för lekmän, rekommenderar jag att du tar en titt här!

måndag 20 februari 2017

Radio Houdi 193

I veckans Radio Houdi blir det Facebook, Donald Trump, Pewdiepie, Milo Yiannopoulos och mycket mer! Lyssna här, mycket nöje!

lördag 18 februari 2017

Sverige producerar brottslingar

Idag publicerar Nerikes Allehanda en debattartikel av kammaråklagare Louise Helleday. Hon vill nyansera den bild som örebropolisen Peter Springare målade upp på Facebook, som i princip går ut på att det är flyktingar som står för våldsrelaterad brottslighet. Helleday skriver att om "man själv väljer ut en tidsperiod och en eller ett par brottstyper är det ofta inte svårt att få fram bevis för just den tes som man själv vill driva", vilket är att skurken är en flykting.

I Sverige är det Brottsförebyggande rådet (BRÅ) som ansvarar för att sammanställa vad vi vet om brott, och när det gäller gärningsmän så har vi just ingen publik statistik på deras demografi. Brottstyper och trender finns öppet att läsa på BRÅ:s hemsida, där den demografiska informationen är begränsad till i vilket område brottet begicks, förövarnas ålder och vilka reproduktionsorgan hen bar med sig. Det publiceras ingen statistik på t.ex. ursprung, varför Louise Helleday förklarar att hon, likt Peter Springare, säger sig uttala sig utifrån sin "ovetenskapliga erfarenhetsbaserade" grund. Fast med mer sympatiska motiv, måste jag tycka. För hur roligt är det att tillhöra den grupp som misstänkliggörs som benägen att begå våldsbrott?

Helledays analys kastar en mörk skugga över tillståndet i landet. Hon skriver att flyktingar är överrepresenterade i brottsstatistiken, men att Springare överdriver. Dessutom skriver hon:

"Huvuddelen av överrepresentationen förklaras med att med att en större andel av dessa personer har vuxit upp i familjer med lägre socioekonomisk status samt i segregerade områden."

Dessa områden skulle enligt Helleday kunna vara en flyktingförläggning, Vivalla, Rinkeby, Bergsjön, Oxhagen, Varberga, Alby eller Fittja.

När man förklarar flyktingars kriminalitet genom att hänvisa till ursprung, ställer man kulturer mot varandra - det skulle antas finnas bättre och sämre kulturer. Det kan naturligtvis vara sant att t.ex. en feministisk kultur är bättre än en misogyn kultur, men det är självklart stigmatiserande för en människa med rakt igenom sympatiska värderingar att behöva bära en stämpel som hen fått på grund av sitt ursprung. Fattigdom och segregation antas då vara en bättre förklaring.

För att citera Oisin Cantwell: "En etnisk norrman eller svensk som lever under samma förhållanden har precis lika allvarliga problem, visar alla studier." Det Helleday påstår utifrån sina anekdoter, säger Cantwell med hänvisning till "alla studier". Vi lever alltså i ett samhälle som producerar våldsbrottslingar av dem som flyr hit för en bättre tillvaro. Det är, för att uttrycka mig försiktigt, ett stort problem. Inte bara för att varje människa har rätt till en trygg tillvaro, utan även för att det ger utrymme för den åsikt som nu Peter Springare har anklagats för att göda, genom att utelämna Vivalla ur ekvationen: Flyktingar är kriminella.

onsdag 15 februari 2017

Preservera program utan specialutrustning

Här försöker jag visa hur man kan bevara sina gamla Commodore-program, trots att man inte äger någon specialutrustning för ändamålet.

måndag 13 februari 2017

Radio Houdi 192

Idag diskuteras muslimer, mormoner, religionsdiskussioner och Bibeln! Lyssna här, mycket nöje!

tisdag 7 februari 2017

Ingen ska behöva utföra abort

Angående barnmorskorna Ellinor Grimmark och Linda Steen som inte vill utföra abort, skriver Frida Park att "moraliskt tänkande människor borde ses som en tillgång, inte en belastning". Att man inte vill hjälpa till, är ett dåligt indicium på att man är "moraliskt tänkande". Jag är själv abortmotståndare, i den bemärkelsen att jag anser att abort bör förebyggas. Bra saker en abortmotståndare kan göra, är att förespråka sexualupplysning och att verka för att underlätta tillgången av preventivmedel. Den som praktiserar sitt abortmotstånd mot den individ som behöver en abort, beskriver jag hellre som omoralisk.

Gissningsvis har inte Grimmark låtit sig bjudas av staten på en yrkesutbildning, för att helt plötsligt drabbas av någon samvetsrelaterad åkomma som förbjuder henne att utföra abort. Nej, mer troligt är att hon tagit emot utbildningen i vetskapen av att hon aldrig tänkt att utföra de sysslor som är förknippade med yrkesrollen. Vad vet jag, hon kanske rent av hade planerat att detta skulle mynna ut i en kampanj tillsammans med ADF? Helt klart är i alla fall att ordet "moral" betyder något annat för dessa människor. Jag anser rent av att hon borde betala tillbaka vad utbildningen kostade.

Men visst, ingen ska behöva utföra abort. Det finns gott om sysslor som jag inte kan tänka mig att utföra. Men så kräver jag inte att få jobba inom de yrken där dessa sysslor är en del av arbetsuppgifterna.

2015-09-14: Vi betackar oss kristnas "välvilja"

måndag 6 februari 2017

Radio Houdi 191

Kvinnans ställning i Islam, alternativ fakta och de allra senaste skeptiska nyheterna i Radio Houdi! Lyssna här, mycket nöje!

fredag 3 februari 2017

Om livet efter döden: Hjärnkirurg chockar alla?

Dr. Eben Alexander är, enligt Dagens PS, mannen som chockerat alla genom att leverera bevis för att vi överlever vår död. Himlen existerar, och det är där vi hamnar när vi är döda. Eller döda och döda, rent tekniskt är man ju död när man inte lever, men det som Alexander menar är att vi kan leva trots att våran kropp är död. Detta har hävdats länge av diverse pseudovetenskapare och religiösa fundamentalister, men nu när en hjärnkirurg ställer sig till kören är "alla" chockade.


Eller nästan. Jag har sett respektabla yrkesmän falla offer för religiösa vanföreställningar förr, så jag är mer besviken än chockad. Men vänta nu...

"Det hela är faktiskt något utöver det vanliga och ett läsvärt måste för alla tänkande varelser – oavsett religiös tro eller ideologisk inriktning."

Kanske man kan leva utan sin kropp, trots allt...? En lä

"I november 2008 hade Eben Alexander en nära-döden-upplevelse som för evigt skulle förändra hans liv." Där han "...plötsligt förpassades till en magisk plats högt, högt ovanför molnen". Magi, alltså bevis? Nej, tanken att överleva sin död är så lockande, att även en läkare förledas till att lita mer på sina sinnesintryck än på något som skulle kunna kallas förnuft, och utanför Dagens PS skiljer man faktiskt på anspråk och evidens.

Gud låter sig inte testas, men detta går att upprepa: När hjärnan lider av syrebrist, hallucinerar man. Hallucinationer uppfattas som verkliga för den som hallucinerar, och det är därför vi har vetenskap - allt man upplever och alla tillskrivningar som görs, beskriver inte den objektiva verkligheten korrekt. Poängen är inte att Alexander har fel, poängen är att om han skulle ha dött, skulle han inte ha några hallucinationer att berätta om.

Och allvarligt, om Eben Alexander inte hade behövt sin kropp, hade han inte heller behövt de pengar som boken genererar, mycket tack vare Dagens PS.

fredag 27 januari 2017

Kristen vetenskap avlivar Gud

Jag var nyligen med om att en person kände sig manad att bevisa för mig att Gud faktiskt finns. Tidigare under kvällen bjöd jag på erkännandet att man inte kan veta om Gud finns eller inte, och nu fick jag höra att gudstro minsann inte "bara" är religion, utan att det finns skäl att tro. Det var faktiskt så att den vetenskapliga texten X indikerade att Gud finns. Alltså:

1. X → Gud
2. X
3. Alltså Gud

Helt plötsligt blev jag utrustad med möjligheten att bevisa att Gud inte finns, för om X → Gud, måste ¬X → ¬Gud, så allt jag behöver göra är att vederlägga X, så kan man inte längre hävda att Gud finns. Men så var det tydligen inte. Nej, nej, Gud finns, och X ger stöd för den hypotesen.

Om Guds existens var den egentliga premissen, varför presenterades då X som en premiss och Gud som en slutsats? Naturligtvis producerar man argument för att ge sken av att gudstro har en legitimitet även hos en skeptiker, men minimal skepticism leder ofrånkomligen till en grundmurad ateism.

Hemligheten ligger i kontrasten, och världen är väldigt svart-vit. Nyanserna ligger i vår uppfattning av världen. Antingen lever vi i en verklighet där gudar existerar, eller så lever vi i en verklighet där gudar inte existerar. Från vår begränsade förmåga att förstå vår omvärld så lever vi antingen i en verklighet där det finns skäl att tro att gudar existerar, eller så lever vi i en verklighet där dessa skäl saknas.

Det enda vi kan vara absolut säkra på, är att kristna skeptiker antingen sitter på sina argument i väntan på ett bra tillfälle att presentera dem, eller att de helt enkelt smickrar sig själva genom att kalla sig skeptiker, helt oförmögna att legitimera den hållning som de vägrar lämna.

Och det är i kontrasten som sanningen ligger. Hur skulle en värld där Gud finns egentligen ser ut? Jo X. Eller (tydligen) även ¬X. Alla andra ämnen hanteras annorlunda av skeptiker, kristna eller ej. Det som gör att jorden anses vara rund, står i kontrast till det som gör att jorden anses vara platt. Och så vidare.

Men när alla fakta leder till samma slutsats - Gud finns - så behövs inga fakta. Därför är kristen skepticism en väldigt konstig form av skepticism.

tisdag 17 januari 2017

Radio Houdi 190

I detta bonusavsnitt av Radio Houdi avhandlar vi cirkus, 8-bit keyboards, VoF, Sauk, Fisher, skapelsetro och mycket mer! Lyssna här, mycket nöje!

fredag 13 januari 2017

Jocke och Jonna återvänder till spökslottet

0- 7 minuter: Innan man tittar på videon där Jocke och Jonna återvänder till spökslottet ska man se del 1, vilket jag inte gjort. Jag tillåter mig att direkt ta del av de fenomen som presenteras i del 2, och jag skulle tro att de uppjagade klipp som presenteras början, utgör essensen av första delen. Det är vad jag kan utläsa av dialogen som följer direkt efter.

Slottet där det enligt uppgift spökar är Husby Säteri, och denna gång har man ringt spökjägare - LaxTon Ghost Sweden - som har med sig sina elektroniska verktyg för spökkommunikation*.

7-12 minuter: Spökjägarna presenterar sig själva och sina prylar. Mest anmärkningsvärt en speldosa som spelar snabbare om en människa är nära. Jag förmodar att om speldosan spelar fort, trots att ingen synlig människa är nära, så har man identifierat ett spöke. Och är det inte detta som gör spökjägeri lite speciellt? Att man väljer en speldosa i en ask med formen av en likkista, istället för en plastdosa med en lysdiod?

12-13 minuter: Briefing med teamen. Team Jocke och team Jonna.

13-17 minuter: Dags att släcka ner Husby Säteri och inleda spökjakten tillsammans med team Jocke på vinden. Knappt har man börjat förrän första vittnesmålet kommer, faktiskt från en av spökjägarna. Det kändes som att någon tog hans hand. Efter förtydligande fråga från Jocke: Inte som någon vindpust. I egenskap av vetenskapsman bör spökjägaren bortse från det fenomenet, med hänvisning till bristande dokumentation** och Ockhams rakkniv***, men det nämndes.

Nu rör man sig i mörker. Tittaren har inga problem att se vad som händer, tack vare användandet av mörkerkameror. YouTube-stjärnorna ser ingenting, men som tur är har de ficklampor med sig. (Kommer på mig själv med att stanna upp och fundera lite kring detta...)

Uppe på vinden nämns den första utrustningen som ska användas: Ett iPad-baserat kommunikationsverktyg och två mätare som mäter elektroniska fält (gaus). Därefter uppmanas eventuella spöken**** att ge sig tillkänna, och det iPad-baserade kommunikationsverktyget plockas fram. Verktyget ger spöken en möjlighet att manipulera ett brus till ord eller meningar.

17-18 minuter: Nu får vi följa med team Jonna ner i källaren. I källaren används ingen iPad, men väl en gausmätare och en spirit box (som eventuellt är någon form av transistorradio - Jonna säger "radiogrejen").

18-23 minuter: Team Jocke är rädda på vinden. Någon av apparat piper, vilket utlöser reaktioner. Vid det här laget råder det absolut inga tvivel om att spöken inte behövs för att skapa kalabalik - låt dem jaga upp sig i mörkret tillsammans, så blir de rädda ändå.

Frågor ställs till kommunikationsverktyget***** som svarar "Allan" (?), och Jocke gör ett nummer av att en brummande motor "absolut" borde vara avstängd. Därefter har vi lite blandat tjatter.

23-24 minuter: I källaren utspelar sig ungefär samma sak, fast istället för iPad-baserat kommunikationsverktyg används en spirit box. Den påstås säga "Jonna", men jag kan inte riktigt uppfatta det.

24-30 minuter: Vi fortsätter att växla mellan Jocke på vinden och Jonna i källaren. Vi får reda på att teamen har utbytt information, men att det finns en misstro mellan teamen. Därför byts medlemmar ut och man går upp på vinden igen. Vi följa med upp på vinden där de återberättar sina upplevelser för nykomlingarna. Motorn kallas nu för "generatorn".

Efter ett nytt pip från någon utrustning, börjar man jaga upp varandra igen. Man vittnar om syner och iPaden säger "han slog mig". Av kommunikationen framgår att man tror sig prata med ett spöke****. "Vi är här för att vi finns här."

Gruppen hör ett ljud, och skeptikern från team Jonna påbörjar sin slaviska bekännelse om omvändelse. Men tittaren får inte riktigt ta del av vilket ljud det är, och jag har väldigt svårt att veta till vilken grad de hetsar upp varandra på grund av att det knarrar i träplankorna, eller till vilken grad de reagerar för att bjuda tittaren på en bra föreställning. Ljuden vi får höra istället, är pålagda i efterhand (smakfullt spetsade med lite passande spöktoner), så även om vi tittare får ta del av deras vittnesmål, så släpps vi inte riktigt in i ämnet som avhandlas.

Drygt 29 minuter in, kommer Jocke ut som spöktroende och berättar att de han upplevelser inte beror på slumpen. Motorn benämns nu som "kompressorn".

30-31 minuter: Team Jocke lämnar källaren. Eftersnack nedanför.

31-33 minuter: Nu får vi följa team Jonna i källaren. Man vill ha ett spökes (?) namn uttalat i spirit boxen. Jonna säger (väldigt insiktsfullt) att hon kanske hörde sitt namn för att hon ville höra sitt namn. En annan teammedlem åberopar att spöket är irriterat.

33-34 minuter: Eftersnack med team Jocke i belyst rum. Individuella vittnesmål ges med grönt filter på kameran (vilket påminner lite om mörkerkameran - är det show så är det show).

34-39 minuter: Mörkt igen. Team Jonna ska upp på vinden. Team Jocke har hämtat speldosan, och går också upp. Motorn (fortfarande "generatorn") orsakar fortfarande problem för Jocke, men Jonna är inte det minsta besväret. Både Jonna och spökjägaren delar ut instruktioner till spöket, och speldosan placeras på golvet. Speldosan fallerar, och Jonna konstaterar att energiförbrukningen har varit spöklikt stor, med medhåll från spökjägare.

Medan en spökjägare delar ut nya instruktioner säger iPaden "står där", och gruppen beslutar sig för att gå ner och byta batterier i speldosan.

39-43 minuter: Ett reducerat team med Jocke i spetsen ska titta på våning två. Man har släckt alla lampor och man bär med sig EMF-mätare (elektromagnetiskt fält). Man hör ett ljud, men får inga utslag. Då plockar man fram en annan utrustning (REM-pod) som ger utslag av människor, så att man identifierar osynliga människor. En spirit box verkar också användas. Vittnesmålen haglar in.

43-44 minuter: Varv två på våning två ska utföras i tystnad. En viss besvikelse över att den riktiga spökligan (Murray, Aykroyd, Ramis och Hudson) har tuffare spöken har helt klart infunnit sig. Speciellt tysta är man inte, men tittaren får först ta del av lite allmänt skojande och sedan får tittaren ta del av klagomål från kameramannen (som vi sedan får veta heter Danjal).

44-45 minuter: Sjuka ljud rapporteras från biljardrummet. Jonna rapporterar från "rum 3", som i första filmen hade "mest aktivitet". Vi får ta del av hennes inspelningsstrategier, och vi får höra att garderobsdörren är stängd.

45-48 minuter: Tack vare tända lampor, HD-kameror och miraklet med The Internetz får vi ta del av sovande ungdomar med smartphones. Jocke meddelar att de ska stänga ner kameran för att det är jättemycket aktivitet "men"...

En Tony bekräftar att kamerorna är borta, men att de bär med sig det iPad-baserade kommunikationsverktyget (numera benämnt "kommunikationsradion", trots att det är en IOS-app). Deltagarna hoppar upp i en säng, släcker sina ficklampor och konstaterar att det inte finns några spöken där.

48-52 minuter: En spökjägare försöker prata med ett spöke i ett hyfsat ljust rum. När svaret uteblev, lämnar man platsen. I biljardrummet hittar Jonna mattfransar (som borde suttit på mattan under biljardbordet) utspridda. Av vad jag kan se från filmen, har vi att göra med enorma materiella skador, men jag är osäker.

Ett ultimatum ställs: Om spöket är där, ska spöket ge sig tillkänna!

Inget spöke ger sig tillkänna, därför ska en spökjägare gå upp på vinden ensam. Jonna får hög puls, och följer - ett sista minuten beslut.

52-55 minuter: En spökjägare, Jonna och en kameraman uppmanar ett spöke att komma fram och visa sig. "Vem är det som är här på vinden?"

Kommunikationsverktyget (iPad-appen) pratar, men det övertygar inte Jonna och spökjägaren. De ropar vidare. Trots detta bryter Jonna, och går ner. Endast en spökjägare och en kameraman är kvar på vinden. Spökjägaren uppmanar spöket att få repet att röra sig. Han uppmanar spöket att visa sig. Sen ger han upp.

55 minuter: Skeptikern åberopar självöppnande dörr. Nu har jag svårt att hålla mig för skratt, men vad helst som säljer, är naturligtvis gångbart i detta sammanhang.


Detta följs av samtal mellan bl.a. Jocke och skeptikern om hur mystiskt allt är, och att det är dags att gå. Avslutningsvis vittnar skeptikern om att han aldrig känt så mycket paranormal aktivitet förr. Även om Husby Säteri vore fullproppat av spöken, framställer filmen de spöktroende som godtrogna och (ursäkta) faktiskt lite korkade.

Glöm inte att ge klippet en tummen upp om ni vill att Jocke och Jonna - som är överbevisade på alla plan om spökens existens - ska övernatta på fler ställen.

Slutsats: Om Jocke och Jonna tittar på denna video, kommer de förmodligen att se på varandra och säga "men så dumma vi var - vi hetsar ju upp oss för ingenting". Vi har egentligen inte bevittnat något annat än spekulationer och appar. Ghost Radio kostar ungefär 20 kronor, vilket är en dyr specialeffekt med tanke på kvalitén på denna video. Personligen anser jag att man bedrar sina tittare.

*) Utrustningen finns till försäljning på spökjägarnas hemsida, så eventuellt kan det finnas ett kommersiellt intresse för spökjägarna att faktiskt hitta spöken. Tittaren bör ta med det i sin bedömning.

**) Vetenskap och dokumentation: Upplevelser, minnen och känslor har många fler potentiella förklaringar än faktiska händelser. Det som inte kan dokumenteras, måste man bortse från.

***) Ockhams rakkniv: Man ska inte ska anta fler företeelser eller ting än som behövs för att förklara de observationer man gör. Det är betydligt mer rimligt att anta att man jagar upp sig och inbillar sig saker, än att anta att människan skulle överleva sin död och bli ett spöke.

****) Spöken antas enligt folktro vara entiteter som tidigare var människor som dött. Entiteten skulle vara personens ande eller själ, vilket är helt grundlöst.

*****) Kommunikationsverktyget är en iPad, en extern högtalare (för effektens skull) och en app med talsyntes.

måndag 9 januari 2017

Commoflage 76

Ett sjukvart långt avsnitt av Commoflage som (främst) handlar om Lazy Jones! Lyssna här, mycket nöje!

torsdag 5 januari 2017

Labyrint (recursive backtracking)

Jag har börjat arbeta med ett datorspel i kategorin roguelike. Varje spel ska vara unikt, så kartan genereras när en användare spelar spelet. Vid uppstart skapar jag en labyrint som sen används som kontur för rummen som genereras efter behov. De rum som spelaren inte besöker behöver man trots allt inte hålla i RAM, men jag vill ha konturen färdig för att kunna ha lite kontroll över kartans kvalité.

Totalt okunnig om labyrintalgoritmer läste jag igenom Wikipedias artikel om recursive backtracking som i korthet går ut på följande:

1. Utgå från den cell som ska vara startpunkten, C.

2. Om C inte är vald sedan tidigare, plocka bort en slumpvis utvald vägg på C. Följ den nyskapade öppningen och låt den vara C.

3. Om nya C har varit C tidigare, stega bakåt till första cell som fortfarande har fyra väggar, gör den till C, upprepa steg 2.

4. Om C nu är samma som var C vid punkt 1 så är labyrinten klar.

Så i princip startar mitt (blivande) datorspel med en hel hög av celler (precis hur många jag vill) som håller information om in- och utgångar (konturen), men det är först när cellen används som fyller jag på med s.k. tiles, alltså de byggstenar som bestämmer kartans detaljer. Låt oss titta på själva labyrinten, och lämna resten därhän.

För detta exempel valde jag språket C#. Trots att språket är lite pratigt, är det ganska flexibelt och användbart.

Först av allt behövs en entitet - en cell - som kan ha väggar i fyra riktningar: Norr, öst, söder och väst. Jag anger att jag både vill kunna läsa (get) och skriva (set) dessa egenskaper under programmets gång. Initialt måste cellen ha alla sina fyra möjliga väggar.

public class Cell
{
    public bool WallNorth { get; set; } = true;
    public bool WallEast { get; set; } = true;
    public bool WallSouth { get; set; } = true;
    public bool WallWest { get; set; } = true;
}

Vidare måste cellen kunna svara på var i labyrinten den befinner sig. Det behövs för att cellens grannar ska kunna hittas. En cell som inte kan svara på det, får inte skapas över huvudet taget.

    public int X { get; }
    public int Y { get; }
    public Cell(int x, int y)
    {
        X = x;
        Y = y;
    }

Eftersom cellen enligt algoritmens regler måste kunna svara på hur många väggar den har, måste vi beskriva hur vi kan veta det.

    public int WallsCount
    {
        get
        {
            var c = WallNorth ? 1 : 0;
            c += WallEast ? 1 : 0;
            c += WallSouth ? 1 : 0;
            c += WallWest ? 1 : 0;
            return c;
        }
    }

Och slutligen måste cellen kunna berätta om sin position i ett lämpligt format.

    public Point Position => new Point(X, Y);

Därefter behövs en representation av själva labyrinten som kan hålla en matris av celler. Denna gång väljer jag att skapa en liten labyrint med 100 celler (10 x 10). Bredden och höjden måste kunna läsas (get) under programmets gång. Koden skapar inte cellerna, endast platshållaren för dem.

public class Labyrinth
{
    public static int Width { get; } = 10;
    public static int Height { get; } = 10;
    public Cell[,] Cell = new Cell[Width, Height];
}

Sen ska vi beskriva algoritmen i labyrintens konstruktor (=funktion med ansvar för initiering). Vi börjar med att berätta att vi vill kunna skapa slumptal, och att platshållaren för våra celler verkligen ska innehålla celler.

        var rnd = new Random();
        for (var y = 0; y < Height; y++)
            for (var x = 0; x < Width; x++)
                Cells[x, y] = new Cell(x, y);

Därefter måste vi definiera konceptet med grannar för konstruktorn. Grannar är angränsande celler.

        Func<int, int, List<Point>> getNeighbours = (x, y) =>
        {
            var ret = new List<Point>();
            if (y > 0 && Cells[x, y - 1].WallsCount >= 4)
                ret.Add(Cells[x, y - 1].Position);
            if (x < Width - 1 && Cells[x + 1, y].WallsCount >= 4)
                ret.Add(Cells[x + 1, y].Position);
            if (y < Height - 1 && Cells[x, y + 1].WallsCount >= 4)
                ret.Add(Cells[x, y + 1].Position);
            if (x > 0 && Cells[x - 1, y].WallsCount >= 4)
                ret.Add(Cells[x - 1, y].Position);
            return ret;
        };

Sen måste vi beskriva hur man slår in en vägg. Det är inte så enkelt som att sätta en cells vägg-egenskap (t.ex. WallNorth) till false, eftersom grannen åt det hållet också måste få sin motsvarande vägg (t.ex. WallSouth) satt till false.

        Action<Cell, Point> knockWall = (cell1, cell2) =>
        {
            if (cell2.Y < cell1.Y)
            {
                cell1.WallNorth = false;
                Cells[cell2.X, cell2.Y].WallSouth = false;
                return;
            }
            if (cell2.X > cell1.X)
            {
                cell1.WallEast = false;
                Cells[cell2.X, cell2.Y].WallWest = false;
                return;
            }
            if (cell2.Y > cell1.Y)
            {
                cell1.WallSouth = false;
                Cells[cell2.X, cell2.Y].WallNorth = false;
                return;
            }
            if (cell2.X < cell1.X)
            {
                cell1.WallWest = false;
                Cells[cell2.X, cell2.Y].WallEast = false;
                return;
            }
        };

Nu har konstruktorn tillgång till resurserna, och den vet vad en granne är och hur man slår in en vägg. Dags att sätta igång! Vi behöver hålla koll på vilka celler vi besökt...

            var queue = new Queue<Cell>();

...och så behöver vi en slumpvis utvald cell att börja i.

            var c = Cells[rnd.Next(Width), rnd.Next(Height)];
            queue.Enqueue(c);

Därefter, slå ut en vägg och följ efter. Om det inte går, backa till start och prova igen.

            while (queue.Count > 0)
            {
                var neighbours = getNeighbours(c.X, c.Y);
                if (neighbours.Count > 0)
                {
                    var neighbour = neighbours[rnd.Next(neighbours.Count)];
                    knockWall(c, neighbour);
                    queue.Enqueue(c);
                    c = Cells[neighbour.X, neighbour.Y];
                }
                else
                {
                    c = queue.Dequeue();
                }
            }

För att representera detta på skärmen, behöver jag bara bekymra mig om två av väggarna, höger och under. Högra grannens vänstervägg och undre grannens övre vägg har samma status (tack vare knockWall).

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        const int size = 20;
        for (var y = 0; y < Labyrinth.Height; y++)
            for (var x = 0; x < Labyrinth.Width; x++)
            {
                if (Labyrinth.Cells[x, y].WallEast)
                    e.Graphics.DrawLine(Pens.Black, x * size + (size - 1), y * size, x * size + (size - 1), y * size + (size - 1));
                if (Labyrinth.Cells[x, y].WallSouth)
                    e.Graphics.DrawLine(Pens.Black, x * size, y * size + (size - 1), x * size + (size - 1), y * size + (size - 1));
            }
    }

Hela källkoden ser ut så här:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private Labyrinth Labyrinth { get; } = new Labyrinth();
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            const int size = 20;
            for (var y = 0; y < Labyrinth.Height; y++)
                for (var x = 0; x < Labyrinth.Width; x++)
                {
                    if (Labyrinth.Cells[x, y].WallEast)
                        e.Graphics.DrawLine(Pens.Black, x * size + (size - 1), y * size, x * size + (size - 1), y * size + (size - 1));
                    if (Labyrinth.Cells[x, y].WallSouth)
                        e.Graphics.DrawLine(Pens.Black, x * size, y * size + (size - 1), x * size + (size - 1), y * size + (size - 1));
                }
        }
    }
    public class Cell
    {
        public bool WallNorth { get; set; } = true;
        public bool WallEast { get; set; } = true;
        public bool WallSouth { get; set; } = true;
        public bool WallWest { get; set; } = true;
        public int X { get; }
        public int Y { get; }
        public Cell(int x, int y)
        {
            X = x;
            Y = y;
        }
        public int WallsCount
        {
            get
            {
                var c = WallNorth ? 1 : 0;
                c += WallEast ? 1 : 0;
                c += WallSouth ? 1 : 0;
                c += WallWest ? 1 : 0;
                return c;
            }
        }
        public Point Position => new Point(X, Y);
    }
    public class Labyrinth
    {
        public static int Width { get; } = 10;
        public static int Height { get; } = 10;
        public Cell[,] Cells = new Cell[Width, Height];
        public Labyrinth()
        {
            var rnd = new Random();
            for (var y = 0; y < Height; y++)
                for (var x = 0; x < Width; x++)
                    Cells[x, y] = new Cell(x, y);
            Func<int, int, List<Point>> getNeighbours = (x, y) =>
            {
                var ret = new List<Point>();
                if (y > 0 && Cells[x, y - 1].WallsCount >= 4)
                    ret.Add(Cells[x, y - 1].Position);
                if (x < Width - 1 && Cells[x + 1, y].WallsCount >= 4)
                    ret.Add(Cells[x + 1, y].Position);
                if (y < Height - 1 && Cells[x, y + 1].WallsCount >= 4)
                    ret.Add(Cells[x, y + 1].Position);
                if (x > 0 && Cells[x - 1, y].WallsCount >= 4)
                    ret.Add(Cells[x - 1, y].Position);
                return ret;
            };
            Action<Cell, Point> knockWall = (cell1, cell2) =>
            {
                if (cell2.Y < cell1.Y)
                {
                    cell1.WallNorth = false;
                    Cells[cell2.X, cell2.Y].WallSouth = false;
                    return;
                }
                if (cell2.X > cell1.X)
                {
                    cell1.WallEast = false;
                    Cells[cell2.X, cell2.Y].WallWest = false;
                    return;
                }
                if (cell2.Y > cell1.Y)
                {
                    cell1.WallSouth = false;
                    Cells[cell2.X, cell2.Y].WallNorth = false;
                    return;
                }
                if (cell2.X < cell1.X)
                {
                    cell1.WallWest = false;
                    Cells[cell2.X, cell2.Y].WallEast = false;
                    return;
                }
            };
            var queue = new Queue<Cell>();
            var c = Cells[rnd.Next(Width), rnd.Next(Height)];
            queue.Enqueue(c);
            while (queue.Count > 0)
            {
                var neighbours = getNeighbours(c.X, c.Y);
                if (neighbours.Count > 0)
                {
                    var neighbour = neighbours[rnd.Next(neighbours.Count)];
                    knockWall(c, neighbour);
                    queue.Enqueue(c);
                    c = Cells[neighbour.X, neighbour.Y];
                }
                else
                {
                    c = queue.Dequeue();
                }
            }
        }
    }
}

Och detta är resultatet:

lördag 31 december 2016

Canned Beer (Windows 10)

För dig som vill spela lite labyrintspel så här till nyår, ladda hem Canned Beer härifrån. Spelet fungerar under Windows 10. Mycket nöje och gott nytt år!



fredag 30 december 2016

Politiker ska företräda folket, inte sin religion!

Idag skrev Kahin Ahmed en kort debattartikel som uttrycker missnöje över att en partikollega pratat illa om islam. Det handlar om Hanif Bali, som bl.a. sagt att "profeten" Mohammed är pedofil. Ahmed inleder med att undra vad han ska säga till väljare som frågar hur han kan vara med i samma parti som Hanif Bali, vilket borde vara mycket lätt att besvara: Moderaterna betraktar inte Mohammed som helig - det är upp till var och en att uttrycka och stå för sina egna åsikter.
"När jag hörde vad hans sagt kände jag något som jag inte känt på mycket länge: jag skämdes för att vara moderat. Jag trodde jag var med i ett parti som stod upp för de mänskliga rättigheterna, inte ett vars företrädare kränker dem."
Det finns inga mänskliga rättigheter som säger att man inte får kritisera, driva med, utmana eller håna religion. Tvärt om, FN:s deklaration om mänskliga rättigheter försvarar yttrandefriheten, och det är ytterst obehagligt när en politiker (!) skruvar på begreppen för att de ska passa sitt syfte. Politiker ska företräda folket, inte sin religion!
"Det är hemskt när en riksdagsledamot som själv har invandrarbakgrund utsätter en annan invandrargrupp för kränkningar istället för att ta fighten för skapande av ett inkluderingssamhälle och kampen mot främlingsfientliga krafter i samhället."

Kahin Ahmed missar inte chansen att göra detta till en identitetspolitisk fråga. Eftersom Ahmed är invandrare och kränkt av Bali, kränker Bali invandrare! Men invandrare är inte en homogen grupp. Det finns gott om invandrare som förespråkar yttrandefrihet och åsiktsfrihet, och jag har bråkat med gott om svenskfödda som vill begränsa dessa. Ett inkluderande samhälle skapas inte av att alla underkastar sig den mest lättkränkte, däremot kan samhällets mest utsatta skyddas med hjälp av yttrandefrihet.
"Hanif Bali är oansvarig och gått över anständighets gräns när han förolämpat vår profet Mohamed, Guds frid och välsignelser vara över honom."
Allvarligt talat, denna mening signalerar snarare att Kahin Ahmed är kränkt för att Hanif Bali har talat illa om om Ahmeds låtsaskompis. Det har man naturligtvis rätt att vara, men då behöver man faktiskt växa upp och rycka upp sig. Att man inte förmår att hantera sina egna känslor, betyder inte att man har rätt att kontrollera andras beteende, det betyder bara att man har egna problem att ta itu med!
"Jag hoppas att Hanif Bali skäms, och jag kräver att han ber om ursäkt."
Jag hoppas att Moderaterna tar sitt förnuft till fånga och skickar Ahmed på kurs i demokrati. Att vara politiker är faktiskt ett viktigt jobb. Man ska kunna väcka en moderat politiker mitt i natten, och han ska, utan att blinka, försvara rätten att göra narr av "profeten" Mohammed. Den rättigheten är precis lika självklar som rätten att vara muslim, och Kahin Ahmed gör sig förtjänt av sitt ämbete genom att visa att han förstår detta.

torsdag 29 december 2016

Björn Söder och Margot Wallström

Förra året uppmärksammade Dagens Nyheter att Björn Söder stod med Simon Wiesenthal Centers lista över antisemitism. Så här skrev man då:
Sverigedemokraten Björn Söders uttalande om judar listas som en av de tio värsta antisemitiska händelserna i världen under 2014 av Simon Wiesenthal Center. 
Simon Wiesenthal-centrumet, som har sitt huvudkontor i Los Angeles, är en världsomspännande människorättsorganisation som konfronterar antisemitism, hat och terrorism mot judar. På tisdagen publicerade man en lista över de tio värsta händelserna under 2014.
Igår uppmärksammade DN att Margot Wallström hamnat på samma lista. Då skrev man:
Simon Wiesenthal-centret anklagar utrikesminister Margot Wallström (S) för ett av årets värsta anti-israeliska uttalande. 
Centret fungerar som en megafon för premiärminister Netanyahus högerpolitik, anser en Israelexpert.
Så vad har egentligen hänt under året? Den förändrade synen på Simon Wiesenthal Center kommenteras över huvudet taget inte, vilket lämnar läsaren att tänka man hanterar dem efter hur man gillar deras slutsatser. Annars kunde kritiken mot listan, som nämns redan i andra meningen i Wallström-artikeln, lika gärna nämnts redan i Söder-artikeln.