Vilters Godnathistorier - Kapitel 2

Vilters Godnathistorier - Kapitel 2

Udgivet den 30.april 2025

“Vilters Godnathistorier – Kapitel 2” lyder som om at nu er der sket en hel masse. Det er der egentligt også, men blot ikke noget som brugeren kan få øje på. Så egentligt burde det måske være “Vilters Godnathistorier – Oplag 2”?

Jeg skrev tidligere om en teknisk gæld mine venner hos Vilter have opbygget, og som skulle betales tilbage og det er den nu blevet. Det er egenligt blot det jeg gerne vil fortælle med dette indlæg.

Skynd dig over til Vilter for at se om det kunne være noget for dig. Mest for dem med mindre børn, eller dem som blot gerne vil se en lækker app. Igen har min gode ven Stefan, Superlade, hjulpet med det grafiske.


En ide ude - 19 tilbage!

En ide ude - 19 tilbage!

Skrevet og udgivet den 22. april 2025

Gennem årene har jeg fået skrevet pænt mange ideer ned. Mange af ideer er ikke længere blot ideer, men fuldt beskrevet koncepter, som er lige til at kaste sig over at realisere. Det begyndte jeg på for et par år siden, og nu er det lykkedes mig at få en af disse ideer til at blive en app som rent faktisk eksisterer.

Jeg præsenterer stolt Anbefal, som jeg håber du vil tjekke ud og som jeg håber enkelte af jer kunne blive glad for.

Det har været ufatteligt lærerigt at gå fra ide til udgivelse, da man ikke helt fatter hvor meget arbejde der reelt er i det før man er i mål. Især når man står for det meste selv – jeg har heldigvis fået hjælp af min gode ven Stefan, Superlade, som har hjulpet med med logo, grafik, design og mange gode samtaler.

Anbefal er som app på ingen måde verdens største udviklingsprojekt, men jeg blev lidt overrasket over hvor meget arbejde der er med alt det som skal være på plads rundt om selve app’en.

Der skal være et website, det skal også udtænkes, designes, skrives og bygges. Der skal være Privatlivs Politik, Brugerbetingelser og lignende utrolig spændende opgaver at kaste sig over.

Der skal designes og skrives e-mails, som bliver sendt til brugeren og hvordan sørger vi får at de kommer hurtigt frem og ikke ender i spam.

App’en skal udgives til både iPhone og Android, så der skal både udvikles til begge platforme, men de skal også sættes op i både App Store og Google Play. Så skal der skrives tekster igen, og der skal udvikles lækker grafik til at vise app’en frem.

Der skal udtænkes, og implementeres, hvordan man har tænkt sig at tjene penge på app’en – hvis det altså er noget man ønsker. Jeg prøver at gøre app’en gratis, og så bede om donationer fra dem som er glade for den. Så skal der besluttes hvordan det skal gøres og så skal det sættes op.

Nu jeg skriver “besluttes”, kommer jeg til at tænke på, at det måske føles af mere arbejde end det reelt er, fordi det meste er den ene beslutning efter den anden. Der er så mange beslutninger fra ide til produkt, og jeg kunne godt forestille mig at det mere er mængden af beslutninger, og ikke arbejde, som forhindrer de fleste ideer i at bliver til noget.


Præcis et år siden!

Præcis et år siden!

Udgivet den 7. marts 2025

Jeg var på rutinebesøg for at opdatere plugins på mit website, og så tilfældigt at det var præcis et år siden jeg havde skrevet det sidste blogindlæg. To tanker slog mig med det samme.

Først at jeg hverken havde skrevet så meget, som jeg naivt havde sat mig i hovedet jeg ville, eller skrevet om de emner jeg havde skrevet jeg ville. Så jeg tænkte at måske skal jeg blot bruge bloggen til at skrive om hvad jeg har snittet i – altså hvad man vil kalde cases og/eller portfolio.

Andet, at det kunne være sjovt at skrive et blogindlæg om denne ændring på den dag, hvor der var gået præcis et år siden sidste indlæg. Så vil der stå udgivet 7. marts 2024, og på næste blogindlæg 7. marts 2025 og blogindlægget kunne hedde “Præcis et år siden!”.

Men det fik jeg ikke gjort, og nu er vi langt inde i april. Jeg har dog ikke kunne slippe tanken, så nu har jeg bare angivet i WordPress at dette indlæg er udgivet 7. marts 2025.


Bedre sent end aldrig

Bedre sent end aldrig

Udgivet den 7. marts 2024

Nogen gange går et projekt bare i stå. Ikke fordi det er gået i fisk eller at kunden ikke er glad. Nogen gange så sker der bare noget for kunden, som gør at deres fokus flytter væk fra det projekt man arbejder på.

Det føles dog altid lidt ærgerligt når ens arbejde ikke virker til se dagens lys, selvom man er blevet betalt for opgaven. At det hele har været lidt spild af tid og penge – især for kunden.

Men nogen gange, så vender kunden tilbage efter laaaaaang tid og spørger om hjælp til det allersidste der mangler før de kan gå i luftet. Det skete for ikke så lang tid siden, og nu i dag kan man endelig se det arbejde som der blev lagt for år siden.

Besøg schibstedmedia.dk for at se dette arbejde – måske du endda kan regne ud hvorfor projektet blev lagt på hylden et godt stykke tid?


WordPress APPI

WordPress APPI

Udgivet den 20. februar 2024

Hvis man bygger en app, kan man så bruge WordPress som API?

Ja, det kan man faktisk, og det er blevet pænt lækkert at arbejde med som udvikler, så det er også ret hurtigt at bygge et simpelt API til ens app. Hermed link til dokumentation for dem som bare med det samme vil se hvad jeg taler om.

Men hvorfor overhovedet tænke på at bygge et API i WordPress?

  • Du vil gerne at dine brugere kan logge ind i app’en, og på dit website, så kan det være praktisk at det faktisk blot er den samme bruger i WordPress.
  • Din app er indholdstung, og WordPress er et glimrende Content Management System (CMS).
  • Du ender med kun at have et system at drive, og vedligeholde, fordi du allerede bruger WordPress til dit website.
  • Du er WordPressudvikler, og kunne godt tænke dig at tilbyde dine kunder andet end at bygge websites til dem.
  • WordPress er gratis. billigt at drive og der findes en million plugins som kan alt muligt og umuligt.

Find eventuelt selv på flere gode grunde for at komme i gang med at bygge et API i WordPress.


Teknisk gæld

Teknisk gæld

Bloggæld betalt den 13. januar 2024

Jeg vil anbefale alle aldrig at stifte gæld, men nogen former for gæld koster penge at undgå. Dette er tilfældet med teknisk gæld.

Dette skete for de gode mænd hos Vilter, vilter.dk, som jeg byggede en app til for flere år siden. Da app’en har virket uden problemer, og fra begyndelsen været som den skal være, har vi ikke set nogen grund til løbende at opdatere teknikken som app’en er bygget på.

Det ændrede sig dog, da Google skrev for at fortælle, at hvis vi ikke opdaterede de bagvedliggende SDK’er så ville app’en, mere eller mindre, bliver smidt ud af Play Store.

Der indhentede den tekniske gæld os, da det ikke kun var Google som havde opdateret deres SDK’er, men ALT hvad vi havde bygget app’en på var nu enten flere versioner foran vores oprindelig kode – eller fandtes simpelthen ikke mere.

Så konklusionen blev, at det vil være mindre tidskrævende at bygge app’en forfra end at forsøge at få den gamle kode til at virke i den nye verden.

Det er teknisk gæld – den kræver at blive betalt på et tidspunkt.


Jeg lovede mig selv.

Jeg lovede mig selv.

Nok taget flere uger at skrive, men udgivet den 6. november 2023

Jeg er lidt af en perfektionist. Det plejer jeg i hvert fald at tænke om mig selv. Nu jeg er blevet ældre, og klogere, ved jeg efterhånden, at jeg tit bare trækker tiden ud. Som de over fem minutter jeg lige har brugt på at gennemskue hvorfor vi ikke har ordet “procrastinate” på dansk.

Så da jeg skulle bruge et telefonsystem til et af mine egne projekter, lovede jeg mig selv at finde et fint system på abonnement. For de findes, koster ikke alverden og findes endda på dansk.

Så glad skrev jeg mig op, og begyndte at sætte telefonsystemet op som jeg ønskede. Lige så langsomt begyndte perfektionisten dog at komme op i mig. Jeg forsøgte at holde ham tilbage. Fortalte at det ikke gør så meget, at velkomstbeskeden bliver indtalt med en stemme, men at stemmen der fortæller hvor man er i køen er med en anden stemme. Det er nok bare mig der synes det er fjollet, at mine kunder skal lytte til flere forskellige stemmer når de ringer ind.

Men man kunne kun have en telefonsvarebesked. “Hvorfor?”, tænkte perfektionisten i mig, hvilket hurtigt blev efterfuldt af et “JA, hvorfor?!” af brokrøven i mig. Så nu var det to mod en, men jeg holdte fast. Jeg var dog enig i, at det ville være rart at kunne have forskellige beskeder om der bliver ringet i åbningstiden eller uden for åbningstiden. Det var dog stadig så meget nemmere at sætte et telefonsystem op, end at kode et fra bunden.

Da det gik op for mig, at telefonsystemet ikke kunne gennemskue om mine kunder ringede fra ukendt nummer stoppede legen dog. Brokrøven tog totalt over; “Hvor dum skal man være for at bygge et system hvor man tilbyder kunder der ringer ind, at hvis de blot trykker 1, så ringer man tilbage og så ikke tage hensyn til at de måske har ukendt nummer!?”

Jeg var enig. Ikke særligt brugbart at få besked fra ens telefonsystem om at en kunde gerne vil ringes op, men vi har ikke hans nummer.

Suk! Så måtte jeg jo bygge det selv. Hvilket faktisk viste sig ikke at være så stor en mundfuld som man kunne frygte.

1) Først finder man en service som https://www.twilio.com, hvor man kan købe et danske telefonnummer. Hos Twilio kunne man endda købe hvad jeg har hørt omtalt som et “Guldnummer” til normal pris.

2) Så tjekker man deres dokumentation ud. Jeg besluttede at bygge mit telefonsystem ind i mit website som er WordPress. Fordi så skulle jeg ikke til at spinde et nyt system op og jeg er virkelig god til WordPress. Så min dokumentation er for PHP, https://www.twilio.com/docs/voice/quickstart/php, og jeg hentede deres PHP SDK.

3) Så er det bare at gå i gang med at bygge. WordPress har med tiden fået en rigtig fin måde at bygge et REST API, https://developer.wordpress.org/rest-api/, så det kastede jeg mig over. Det handler nemlig om at have forskellige endpoints som Twilio kan kalde alt efter hvad man beder systemet om.

Efter to dage er Bob din onkel.

Her er lidt kode at kigge på for at vise at det ikke er så komplekst. Dette er ikke en brugbar gennemgang for en begynder til at bygge et telefonsystem. Det er blot en smagsprøve af hvordan man kan bygge det (nemt) i WordPress.


/* Initial call */
register_rest_route( $this->endpoint, '/call/incoming', [
	'methods' => 'POST',
	'callback' => [ new TwilioController, 'incoming' ],
	'permission_callback' => [ $this, 'authenticateTwilio' ]
] );

Dette viser hvordan, og hvor simpelt, man kan sætte endpoints op i WordPress. Noget der kan drille, er at WordPress som standard returnerer JSON, mens Twilio har brug for at der bliver returneret XML. Jeg har løst det ved at hacke mig ind i følgende filter developer.wordpress.org/reference/hooks/rest_pre_serve_request/.


public function incoming ( $request ) {
  $call = $request->get_params();

  if ( $this->are_we_open() == true ) {
    return $this->we_are_open( $call );
  }

  return $this->we_are_closed( $call );
}

Når et kald kommer ind tjekker jeg om det er i åbningstiden, så jeg kan give forskellige beskeder, og forløb, til vedkommende som ringer ind.


private function we_are_open ( $call ) {

  if ( $this->known_caller( $call ) == true ) {
    $action = site_url( '/wp-json/' . ENDPOINT . '/call/open_unavailable_known_number' );
  } else {
    $action = site_url( '/wp-json/' . ENDPOINT . '/call/open_unavailable_unknown_number' );
  }

  $response = new VoiceResponse();
  $response->say('Velkommen. Vent venligst mens jeg sætter dig i forbindelse med et menneske.', ['language' => 'da-DK']);
  $response->dial('+45XXXXXXXX', [
    'action' => $action,
    'callerId' => '+45XXXXXXXX',
    'timeout' => 5,
  ] );

  return $response;
}

Jeg har en funktion til at gennemskue om vi har et nummer vi kan ringe tilbage på. Ingen grund til at tilbyde at vi kan ringe tilbage hvis vi ikke kender deres nummer.


private function we_are_closed ( $call ) {
  $response = new VoiceResponse();

  $response->gather([
      'action' => site_url( '/wp-json/' . ENDPOINT . '/call/gather' ),
      'numDigits' => 1,
      'timeout' => 15
  ])->say('Du har ringet uden for vores normale åbningstid. Tryk 1 hvis det er virkelig vigtigt. Tryk 2 hvis du ønsker at ligge en besked til os. Tak for tålmodigheden. Denne besked vil blive gentaget om lidt.', ['language' => 'da-DK']);
  $response->redirect( site_url( '/wp-json/' . ENDPOINT . '/call/incoming' ) );

  return $response;
}

Sidste kodeblok viser, at det er relativt simpelt at sætte en trykmenu op. Hedder det mon en trykmenu? Ikke vigtigt, men jeg håber at dette lidt viser, at det ikke er totalt raketvidenskab at bygge sit eget telefonsystem.

Nu mangler jeg blot at få indtalt beskederne. For selvom Twilio faktisk kan læse op på dansk, som man kan se i koden, så lyder det på ingen måde godt.

Lad os se hvor lang tid jeg kan trække indtalingen ud. Skriv gerne til mig hvis I ønsker hjælp til at bygge jeres eget telefonsystem. Så har jeg i det mindste en nogenlunde god undskyldning for det.

Tak for din tid.


Privacy Preference Center