egenkomponert UID - Utdanningsdirektoratet/Grep_SPARQL GitHub Wiki

Denne siden er knyttet til Samling av SPARQL spørringer

Behov for en kort UID

Jeg (Are) som har ansvaret for dokumentasjonen i disse wikiene, fikk i forbindelse med revidering av siden Samling av SPARQL spørringer behov for en kort UID, slik at hver spørring på siden hadde en referanse som ikke var numerisk (revisjon av siden fører fort til krøll med rekkefølge).

Så kom ideen om å lage en SPARQL-spørring jeg kunne fyre av hver gang jeg ville ha generert en UID. For ikke å bruke for mye tid på dette, brukte jeg chatGPT til å hjelpe meg.

Jeg tok utgangspunkt i dagens dato (NOW) med klokkeslett (inkl. sekunder), og bygde en form for kryptering på toppen, slik at den endelige koden virker mer tilfeldig enn om vi skulle lagt på bare et løpenummer eller ren dato.

Funksjonen NOW er en innebygd funksjon i SPARQL, og er hentet fra xsd: http://www.w3.org/2001/XMLSchema#.

Jeg ville at UID'en skulle være unik for vårt domene. Koden er bygd opp slik: Eksempel: "2024-07-01T14:42:16.155+02:00" Blir: xa14g42p

  • x = År: 24 etter år 2000: Blir y (den 24. bokstaven i alfabetet)
  • a = dag: 1. bokstaven
  • 14 = Time , her 14 (ingen endring)
  • g = måned: g er 7. bokstaven
  • 42 = minutter (ingen endring)
  • p = sekunder. den 16. bosktaven (00 vil gi "&")

Jeg har altså flyttet plassen til måned og time for å få en kode der bokstaver og tall sprer seg litt mer utover. Jeg syntes det så litt kulere ut 😜

Sjekk alfabetindeksen der jeg har lagt opp 60 bokstaver (må ty til stor Ä og Ö for å få det til å gå opp)

Her er spørringen:

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

SELECT 
  ?datetime 
  ?kode 
  ?limInn
WHERE {
  BIND(NOW() AS ?datetime)
  BIND(STR(?datetime) AS ?datetimeStr)

  BIND(SUBSTR(?datetimeStr, 1, 4) AS ?yearStr)
  BIND(xsd:integer(?yearStr) AS ?yearInt)
  
  # Fjerner århundre-delen av årstallet
  BIND(SUBSTR(?yearStr, 3, 2) AS ?yearWithoutCenturyStr)
  BIND(xsd:integer(?yearWithoutCenturyStr) AS ?yearWithoutCentury)
  
  BIND(SUBSTR(?datetimeStr, 9, 2) AS ?day)
  BIND(SUBSTR(?datetimeStr, 6, 2) AS ?month)
  BIND(SUBSTR(?datetimeStr, 12, 2) AS ?hour)
  BIND(SUBSTR(?datetimeStr, 15, 2) AS ?minute)
  BIND(SUBSTR(?datetimeStr, 18, 2) AS ?secondStr)
  BIND(xsd:integer(?secondStr) AS ?secondInt)

  # Definerer et alfabet med 60 bokstaver (for å passe med f.eks. 60 minutter)
  BIND("abcdefghijklmnopqrstuvwxyzæøåABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅÄÖ" AS ?alphabet)

  # Konverterer årstallet (uten århundre) til korresponderende bokstav
  BIND(SUBSTR(?alphabet, ?yearWithoutCentury, 1) AS ?yearLetter)
  
  # Konverter dag i henhold til spesifikke regler
  BIND(IF(xsd:integer(?day) = 24, "s", 
          IF(xsd:integer(?day) = 30, "1", 
          SUBSTR(?alphabet, xsd:integer(?day), 1))) AS ?dayLetter)
          
  # Konverter måned i henhold til spesifikke regler
  BIND(SUBSTR(?alphabet, xsd:integer(?month), 1) AS ?monthLetter)

  # Hånderer spesialtilfelle for sekunder: "00"
  BIND(IF(?secondStr = "00", "&", 
          SUBSTR(?alphabet, ?secondInt, 1)) AS ?secondLetter)

  # Kombinerer sekund-bokstaven
  BIND(?secondLetter AS ?secondCode)

  # Bygger opp koden
  BIND(CONCAT(?yearLetter, ?dayLetter, ?hour, ?monthLetter, ?minute, ?secondCode) AS ?kode)
  
  # Oppretter "name"- og "anchor"-strenger
  BIND(CONCAT("<a name=\"", ?kode, "\"></a>") AS ?name)
  BIND(CONCAT("<a href=\"", ?kode, "\">spørring ", ?kode, "</a>") AS ?anchor)
  
    # Spesialhåndtering for norske tegn i ?kode (æøå funker ikke i anchor-URL)
  BIND(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(?kode, "æ", "ae"), "Æ", "AE"), "ø", "oe"), "Ø", "OE"), "å", "aa"), "Å", "AA"), "ä", "Aae"), "Ä", "AaE"), "ö", "Ooe"), "Ö", "OoE") AS ?kodeSpecial)
  
  # Oppretter ?limInn med spesialhåndtering for norske tegn (det er denne jeg limer inn over hver spørring i SPARQL-samlingen)
  BIND(CONCAT("<SUP><a name=\"", ?kode, "\"></a>Ref.: <a href=\"#", ?kodeSpecial, "\">", ?kodeSpecial, "</a></SUP>") AS ?limInn)

# Og vipps, så har vi laget vår egen UID til wikien som funker helt til 2060 (ville begrense antall tegn) ;-)
}

En svakhet er selvfølgelig at URLer ikke tar hensyn til minuskler og versaler ("små" og "store" bokstaver). Dag 30 og 31 blir A og B, som i en URL blir det samme som 1. og 2. ("a" og "b"). Den samme problemstillingen har vi for sekunder. For sikkerhets skyld blir rutinen når jeg legger til en ny spørring med en slik referanse, at jeg bare søker på siden for å se om koden finnes fra før. I så fall er det bare å generere en ny (men sjansen er liten). Som "anchor" skal jo koden tross alt bare være unik for denne siden.

⚠️ **GitHub.com Fallback** ⚠️