No client transport named ‘null’ found

2013-08-13

Tänkte bara skriva en rad om detta hemska exception… När man googlar om det här felet så hittar man inlägg efter inlägg efter inlägg med folk som råkat ut för det här, men ingenstans finns det några vettiga svar.

När uppstår det här felet?

Jo, framförallt när man jobbar med Webservices. Detta fel uppstår som ett RemoteException, och av alla google-svar att döma så verkar det vanligaste felet till denna exception vara att endpoint inte är satt korrekt/saknas. Därför torde steg ett i felsökningen vara att kolla att du har en endpoint, och att den är giltig. Du kan kolla detta genom att öppna din browser, skriv in endpoint-adressen och tryck enter. Får du inget svar? Då vet du vad du skall kolla på härnäst. Då är din endpoint fel.

Om du dock får svar, och allt ser ut att vara frid o fröjd, men när du deployar ditt projekt på servern så fungerar det ändå inte.

Då har du troligtvis råkat ut för samma sak som mig: BRANDVÄGG! Kolla att brandväggen låter servern kommunicera utåt med internet (eller framförallt din endpoint-adress).

Så detta får bli en liten minnesanteckning för framtiden… Kolla även brandväggen!

Annonser

Refactoring är inte alltid så lätt…

2013-07-29

Jag har stött på ett litet problem; Jag sitter och skall göra en liten refactoring av en klass och funderar på hur man bäst skall gå tillväga. Här är min main-kod i min klass:


try {
 initialize();
 if (this.orderId.equals("")) {
  createErrorResponseOrderNumberIsMissing();
  outputResponse.println(jsonReturn.toJSON());
  return;
 }
 this.orderDocument = allOrders.getDocumentByKey(this.orderId);
 if (this.orderDocument == null) {
  createErrorResponseOrderNotFound();
 } else {
  processOrderDocument();
  createResponseMessage();
 }
 outputResponse.println(jsonReturn.toJSON());
} catch(Exception e) {
.... exception handling snipped out of this example... not of interest right now! ...
}

Mitt problem med koden är att jag inte gillar att ha två olika exit-points i koden; du har en om ordernummer saknas och en annan för alla andra resultat. Jag skulle vilja ha endast en exitpoint – den som finns precis före catch-satsen. Men hur löser jag att det finns två villkor som måste uppfyllas varav det andra inte kan kontrolleras såvida inte en lookup utförs, där argumentet för lookupen baseras på det första värdet i villkoret?

Jag vill ju inte utföra lookupen om ordernummer inte finns angiven – då kommer jag att få en massa följdfel som inte är önskvärt. Jag skulle önska att lookupen hellre returnerade en exception om man anger ett sträng utan innehåll som argument. Det gör den. Det blir då NullPointerException. Jag skulle kunna fånga upp detta fel och hantera detta, men eftersom det kan bli NullPointerException var somhelst i koden så har jag ingen koll att just denna NPE handlar om att ordernummer saknas.

Hur löste jag detta?

Det var tanken på att hantera ett exception som ledde mig åt rätt håll. Eftersom lookupen utförs av en 3:e parts produkt som jag inte kan modifiera så beslöt jag mig för att ändra min klass ”ReturnMessage” – vilket är den lokala variabeln jsonReturn som sätts i initialize() till objektet ReturnMessage;

this.jsonReturn = new ReturnMessage();

Jag beslutade mig för att den inte fick initieras utan argument. Konstruktorn utan argument togs bort så att man måste ange ReturnMessage(String id) istället. I konstruktorn kan jag sedan slänga en egen (ny) exception; OrderIdMissingException.

Nästa förändring som var tvunget för att detta skulle fungera är att ändra hur man initierar jsonReturn. Detta lades till i initialize()-metoden:

this.jsonReturn = new ReturnMessage(getOrderId());

(Och nej – jag kan inte lägga in exception-kontrollen i ”getOrderId”-metoden, för denna används på fler ställen där det skall vara fullt legalt att använda en tom sträng och inget exception får då genereras!)

I main-funktionen kunde jag sedan lägga till catch-sats för detta exception och skapa felmeddelandet där istället:


catch(OrderIdMissingException exception) {
 createErrorResponseOrderNumberIsMissing();
}

Jag flyttade också outputResponse.println(jsonReturn.toJSON()); till finally-satsen. Så här blev koden till slut:


try {
 initialize();
  this.docOrder = allOrders.getDocumentByKey(jsonReturn.orderId);
  if (this.docOrder == null) {
   createErrorResponseOrderNotFound();
  } else {
   processOrderDocument();
   createResponseMessage();
  }
 } catch(OrderIdNotSuppliedException missingOrderIdException) {
  createErrorResponseOrderNumberIsMissing();
 } catch(Exception e) {
... exclueded exceptionhandling from example...
 } finally {
  outputResponse.println(jsonReturn.toJSON());
 }

Eller är det någon som har förslag på en bättre lösning?


jQuery replaceClass

2013-05-28

Det finns en funktion jag saknar i jQuery core och det är replaceClass. Jag vill byta ut en klass mot en annan, och skulle vilja slippa att göra följande:
$(object).removeClass("x").addClass("y");
För att öka läsbarheten i min kod så skulle det vara enklare att läsa följande:
$(object).replaceClass("x", "y");
Nu verkar det finnas en slags koncencus att replaceClass inte skall införas i core, då allt för få ser någon anledning till att införa detta. Synd tycker jag.

Men jag har själv skrivit följande och använder i mina projekt där jag behöver. Det är ju enkelt att infoga kod i jQuery:


 jQuery.fn.extend({
  replaceClass: function( replaceFrom, replaceTo ) {
   return this.each( function() {
    var $this = $(this);
    if ($this.hasClass(replaceFrom)) {
     $this.removeClass( replaceFrom ).addClass( replaceTo );
    }
   });
  }
 });

Då blir det en enkel sak att byta ut en klass. Exempel:


<html>
....

<ul><li class="x">asdfasdf</li>
<ul><li class="x">asdfasdf2</li>
</ul>
<script>

function performReplace() {
 $("ul li").replaceClass("x","y");
}
(function() { $("button").click( performReplace ); })();
</script>
...

Jag tycker att läsbarheten i funktionen performReplace blir avsevärt mycket bättre – inga if-satser, inga krångligheter. Du gör en vanlig jQuery selektering och utför en replaceClass på resultatet. Precis på samma sätt som addClass, eller vilken annan jQuery funktion som helst.
Det som kan diskuteras är ju argumenten – hur vet jag vilken som är vilket? Det torde vara standard från alla andra skript-språk: Det första argumentet är alltid de facto vilken funktionen skall agera på och det andra argumentet vad som skall utföras när det första resulterar i ‘true’, dvs det första argumentet är VAD som skall ersättas och det andra vad det skall ersättas MED.

Solklart?


Ä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…