Är att tippa är inte ett lotteri?

2013-03-28

Hittade följande klipp på Youtube som berättar lite historia kring Svenska Spel och hur lotteri osv har sett ut genom åren.

Då hoppade jag högt vid 5:31 (precis i slutet av filmen). De visade ett gammalt reklaminslag för Stryktipset. Vad säger de? Jo:

50 000 skickliga tippare vinner varje vecka. Stryktpset – mer än bara tur.

50000 skickliga vinnare… Jamen dåså! Om att tippa inte är lotteri så vad hindrar du utländska bolag att etablera sig på den svenska marknaden och bedriva tips-spel? Och till tips hör väl det närbesläktade området vadslagning också till?


Hittat: Intervju med Generaldirektören Håkan Hellstedt (LI)

2013-03-26

En utmärkt intervju av Lotteriinspektionens Generaldirektör Håkan Hellstedt:
I huvudet på Håkan Hallstedt

Den belyser väldigt tydligt att vi faktiskt inte skall klaga på LI – de agerar enkom utefter direktiv från riksdag/regering och vad som är skrivet i lagen. Lagen idag är mycket föråldrad och måste arbetas om. Därom råder inget tvivel. Det som diskuteras är nu hur man skall förändra den.

Väl värt att även läsa hans (Håkan Hellstedts) personliga blogg Spelvandel.se.


Hur stort problem är spelmissbruk ur ett folkhälsoperspektiv?

2013-03-22

Jag har ett tag försökt scanna igenom webben efter statistik kring spelmissbruk och inser att det inte är så lätt som det kan verka på ytan. Det närmaste jag kommer är på Statens Folkhälsoinstitut där jag lyckades gräva fram statistik som visar att gruppen ”Problemspelare” är ca 3,4 % i den undersökning som gjorts årligen i den s.k. Nationella folkhälsoenkäten (se länk nedan). Vad som stipulerar ”Problemspelare” och vad som skiljer den benämningen från ”Spelberoende” har jag inte lycktas klura ut, men så har jag inte läst hela bakgrundsfaktan kring enkäten ännu. Även den finns att ladda ner på fhi.se.

Hur som helst. Jag läste Swelogs faktablad nr 14 och reagerade på en formulering, faktiskt den absolut första meningen:

Spelproblem är ett folkhälsoproblem.

Det gör mig mycket konfunderad; hur kan man klassa ett problem som är i så extrem minoritet som ett ”folkhälsoproblem”, dvs ett problem för hela folket? I samma faktablad så stipulerar man ju att cirka 2% av befolkningen har upplevt så pass mycket negativa konsekvenser av sitt spelande att de var s.k. problemspelare. Titta på siffran en gång till: 2%. Är detta verkligen då ett folkhälsoproblem?

Missförstå mig inte – spelmissbruk och problem med sitt spelande är ett mycket allvarligt problem för den som är drabbad. Jag försöker inte bagatellisera och säga att spelmissbruk inte är ett problem. Tvärtom. Men att det skulle vara ett folkhälsoproblem är det jag invänder mig mot.

Detta gör mig lite irriterad – är det månne detta som ligger bakom varför vi har ett s.k. ”spelmonopol” i Sverige. (Ett monopol som faktiskt egentligen borde heta ”oligopol”, men det är en annan diskussion…)

Vi förstorar upp problematiken så att farbror staten skall fortsätta ha imaginär kontroll över svenska folkets pengar. Allt för att rättfärdiga att vi inte skall följa rekommendationer från EU som stipulerar att det svenska spelmonopolet strider mot EU-rätten.

Men om nu resten av Sverige (98%) inte har några problem med spelande utan faktiskt gillar att spela – varför kan vi inte då få göra det var vi vill och hos vem vi vill? Om vi vill spela hos Svenska Spel så skall det vara av egen fri vilja – inte för att staten förbjuder andra bolag att etablera sig. Jag personligen vill spela på Svenska Spel, men även hos Unibet, Pokerstars och NordicBet. Allt efter vad som tilltalar mig och min plånbok för tillfället. Inte för att staten säger så. Just nu så bojkottar jag Svenska Spel – inte för att de är sämre än någon annan – utan av princip. Jag vill att Svenska spel skall agera under samma förutsättningar som alla andra spelföretag. Konkurrens på lika villkor.


Källor:
http://www.fhi.se/Statistik-uppfoljning/Nationella-folkhalsoenkaten/Levnadsvanor/Spelvanor/
Swelogs faktablad nr 14


Alla kan vi göra nybörjarmisstag…

2013-03-19

Jag tycker att jag själv är en rätt så duktig programmerare och sköter mitt jobb och tar fram den ena kodsnutten efter den andra och får allt att fungera, men jag måste erkänna; även jag gör nybörjarmisstag ibland!

Tänkte faktiskt dela med mig av ett här. Det tog mig någon timma innan jag gav mig själv en ”facepalm” och korrigerade felet på en sekund. Allt handlar om ”typecasting”, dvs när man konverterar ett objekt till ett annat objekt t.ex. (som i det här fallet) en double till int.

Bakgrund: Eftersom det i HTML finns en begränsning att ett input-fält inte kan ha mer än 32767 tecken så behövde jag i min kod räkna ut när jag överskrider ett fördefinierat tröskelvärde och därefter vidta åtgärder.

Så jag började med följande:


//Declared as constant in the top of the class!
private final int MAXIMUM_STRING_LENGTH = 32767;

public int getPercentOfFieldsize() {
int pct = 0;
try {
double testvalue = 16383;
pct = (int) Math.round( (testvalue / MAXIMUM_STRING_LENGTH)*100f);
System.out.println("Current pct: " + pct);
} catch (Exception e) {}
return pct;
}

Ok, så här långt är allt frid och fröjd. Jag fick ut att pct i det här fallet blev 50 och då visste jag att procentuträkningen var korrekt. Trodde jag. Jag ersatte därefter variablen testvalue med min genererade sträng:


String full = stringGenerator.toString();
int pct = (int) Math.round( (full.length() / MAXIMUM_STRING_LENGTH) * 100f);

Plötsligt blev resultatet 0! Detta trots att det borde ha varit runt 50 såsom mitt testvärde var. Ser Ni vad felet är?

Metoden .length() returnerar en int.

Konstanten MAXIMUM_STRING_LENGTH är en int.

Om du dividerar en int med en annan int så kommer resultatet att konverteras till en int innan det sker en multiplikation med 100f. Dela 16000 med 32767 och avrunda detta till en int och du får 0!

Lösningen var att konvertera konstanten till en double:


private final double MAXIMUM_STRING_LENGTH = 32767;

Då kommer nämligen att både täljare och nämnare att behandlas som double och divisionen returnera en double! *duh* Ett sådant billigt nybörjarmisstag…


SOLID programmering; del 2

2013-03-18

Dags för del 2 i serien om SOLID.

Del 2 – Open/Closed Principle

Bokstaven ”O” i akronymen SOLID betyder ”Open/Closed Principle”. Den dikterar följande:
En klass skall vara öppen för tillägg men stängd för ändringar.

Så vad betyder det egentligen? Jo, eftersom man i en produktionsmiljö vill ändra källkoden så lite så sällan som möjligt så bör man designa sitt program till att tillåta att programmet kan ändra sitt beteende utan att man behöver ändra källkoden. Att ändra källkoden innebär kodgranskning, godkännande osv osv, som kan vara en ganska omfattande procedur.

Det finns flera olika tolkningar om hur detta skall uppnås. En av de tidigaste sätten dikterade att du skall aldrig ändra en klass såvida den inte innehåller buggar och rena fel. Tillägg och ändringar skall läggas i en ny klass som ärver från den ursprungliga klassen. Den nya klassen behöver inte alltid ens ha samma interface som den klassen som den ärver ifrån.

Under 90-talet utvecklades dock en annan variant av arv; arv via abstrakta interface. Detta innebär att man ärver från en abstrakt basklass och med polymorfism kan den nya klassen utföra den nya funktionen baserat på ärvda eller nya interface.

I den här delen så har jag inte något kodexempel som illustrerar detta, då det mer handlar om arkitektur och design. Om jag hittar ett bra exempel så kommer jag att återkomma till denna princip.


Sortering av en Collection med Vector

2013-03-11

Här kommer ett litet intressant programmeringsproblem jag råkade ut för nyligen.

Att sortera en Vector är inga större problem; du anropar bara Collections.sort(myVector) och den sorterar alla items i din Vector. Men hur gör man egentligen om man har en hel collection av vectorer där man sedan skall sortera vectorerna baserad på ett av deras index/items?

T.ex. jag har


Vector vector1 = new Vector();
Vector vector2 = new Vector();
Vector vector3 = new Vector();

där jag har populerat ett antal items i varje vector, t.ex:


vector1.add("e");
vector1.add("f");
vector1.add("g");

vector2.add("a");
vector2.add("x");
vector2.add("m");

vector3.add("s");
vector3.add("o");
vector3.add("p");

och jag sedan lägger dem alla i en ny vector:


Vector<Vector> all = new Vector<Vector>();
all.add(vector1);
all.add(vector2);
all.add(vector3);

Om jag nu försöker skriva Collections.sort(all) så kommer det inte att fungera; editorn kommer att klaga på ”Bound mismatch: The generic method sort(List<T>) of type Collection is not…….” och du kommer inte att kunna kompilera koden. Hur gör jag om jag vill sortera på varje vectors första item? Eller andra? Eller låta användaren välja?

För att lösa detta så behöver vi skapa en s.k. Comparator, som implementerar metoden compare:


import java.util.Comparator;
import java.util.Vector;

public class VectorComparator implements Comparator<Vector<String>> {
@Override
public int compare(Vector<String> o1, Vector<String> o2) {
//TODO: Auto-generated code
}
}

Metoden compare skall returnera -1, 0 eller 1 beroende på om o1 är större än, lika med eller mindre än o2. Då behöver vi veta vilket index som vi skall använda oss av i vector o1 och o2. Vi lägger till följande privata fält och konstruktor för klassen:


private int useIndex = 0;

public VectorComparator() {
}
public VectorComparator(int index) {
this.useIndex = index;
}

Och då kan vi beräknade compare-metoden till följande:


return o1.get(useIndex).toString().compareTo( o2.get(useIndex).toString());

Här är hela klassen då jag har lagt till lite felhantering i compare-metoden:


import java.util.Comparator;
import java.util.Vector;

public class VectorComparator implements Comparator<Vector<String>> {
private int useIndex = 0;

public VectorComparator() {
}
public VectorComparator(int index) {
this.useIndex = index;
}

@Override
public int compare(Vector<String> o1, Vector<String> o2) {
if (useIndex <= o1.size() && useIndex >= 0) {
return o1.get(useIndex).toString().compareTo( o2.get(useIndex).toString());
} else {
throw new RuntimeException("Index out of bounds; max size is '" + Integer.toString(o1.size()) + "'!");
}
}
}

Nu kan vi använda vår comparator för att sortera:


VectorComparator comparator = new VectorComparator(1);
Collections.sort(all,comparator);

och vår collection av vectorer kommer att vara sorterad på varje vectors andra item!

Svårare än så var det inte…

Vill du veta mer om Comparator? Läs här: Vogella.com eller på Java Doc.