Christian Alfredsson

Kategori: Digitalisering och IT

Inläsningstjänst – skapa importfil

Det kan vara riktigt jobbigt att skapa en importfil som en leverantör vill ha. Inläsningstjänst är bra då de har en bra specifikation som man får av dem, samt att de har sftp-servrar där man kan skicka upp filerna så eleverna automatiskt åker in.

Jag gjorde så här

1/ Installera Ubuntu 16.04 med en LAMP server. 

Jag valde att installera den i Vmware Fusion på min dator. Då blir det en lokal server. Den behöver komma åt LDAP-katalogen du vill läsa från.

2/ Kolla igenom scriptet nedan och bygg ett eget. Det är ganska logiskt och är inte så svårt. Du anropar scriptet med http://localhost/inlasningstjanst.php i webbläsaren.

Vad kan man göra mer? Någon form av felhantering kan vara bra att ha med. Jag har en metakatalog så alla konton är skapade med automatik så det är inte lika nödvändigt hos oss.

Hur ska vi kommuner slippa detta i framtiden?

Alingsås har två spår:

1/ En integration som klarar av att läsa LDAP och automatiskt skapa en .csv enligt styrfiler. Den håller Pulsen på att bygga åt oss och den kommer köras i Mule.

2/ SCIM och skolfederationsprojektet är så spännande . Det skulle lösa hela provisioneringsfrågan och standardisera om vi får snurr på det. Här kan du läsa mer om det: https://www.skolfederation.se/nyheter/2017/08/22/pocen-puttrar-pa/

Älmhults kommun är föredömliga och Max har gjort ett kanonjobb ni kan läsa mer om här: https://github.com/MaxWallstedt/SimpleSCIM

 

—> Scriptet <—

<?php

// Inställningar

$server = ‘192.168.1.200’; // IP-adress till LDAP server i mitt fall eDirectory
$dn = ‘cn=readonlyuser,ou=services,o=alingsas’; // Användare med rätt att läsa från LDAP
$pw = ‘ToyotaIsBest4Ever’; // Lösenord
$searchbase = ‘o=alingsas’; // Från vilken nivå ska vi söka. Här är översta nivån definerad

// Searchstring är ditt LDAP-filter där du ställer in vad du vill ha.
// Först tar jag med alla som är användare, sedan väljer jag ut elever och personal inom skolan
// Skolor kan byta namn så jag använder SCB’s skolkoder för att göra ett urval. Här får jag enbart med grundskolan i Alingsås

$searchstring=”(&(objectClass=user)(|(pidEduPersonScopedAffiliation=student@edu.alingsas.se)(pidEduPersonScopedAffiliation=faculty@edu.alingsas.se))
(|(pidschoolunitcode=74064638)
(pidschoolunitcode=74064638)
(pidschoolunitcode=63452058)
(pidschoolunitcode=49115714)
(pidschoolunitcode=78832157)
(pidschoolunitcode=34338735)
(pidschoolunitcode=32478204)
(pidschoolunitcode=28639614)
(pidschoolunitcode=78273632)
(pidschoolunitcode=87109819)
(pidschoolunitcode=46546067)
(pidschoolunitcode=84581048)
(pidschoolunitcode=92770341)
(pidschoolunitcode=76908037)
(pidschoolunitcode=38957274)
(pidschoolunitcode=90924483)
(pidschoolunitcode=98272016)
(pidschoolunitcode=71895385)
(pidschoolunitcode=57136802)
(pidschoolunitcode=70153094)
(pidschoolunitcode=63399058)
(pidschoolunitcode=87109819)
(pidschoolunitcode=75101306)
(pidschoolunitcode=70304200)
(pidschoolunitcode=70079232)
(pidschoolunitcode=63399058)
(pidschoolunitcode=87109819)
(pidschoolunitcode=75101306)
(pidschoolunitcode=70304200)
(pidschoolunitcode=70079232)
(pidschoolunitcode=63399058)
))”; //LDAP searchstring

//Skicka ut huvudrubrikerna. I Alingsås är alla fyllda utom Office365ID som vi inte har
echo “Name;Email;Username;Type;Class;Organization;SchoolfederationID;Office365ID;GSuiteEmail<br>”;

// Välj vilka attribut som ska returneras. Ni ser att Office365ID lämnas tomt
$attnames=array(“fullname”,”mail”,”cn”,”pidcategory”,”ou”,”pidschoolunitcode”,”pidedupersonprincipalname”,””,”mail”); //Returned attributes

// Koppla mot servern
$ds=ldap_connect($server);

//Koppla upp mot LDAP
if ($ds) {
$r=ldap_bind($ds, $dn, $pw);
if($r) //echo “LDAP_bind gick bra<br>”;

//ldap_search söker från $searchbase och alla underkataloger
$r=ldap_search($ds,$searchbase, $searchstring, $attnames);

if($r)

$entries = ldap_get_entries($ds, $r);

//Snurra igenom alla träffar och välj vad som ska visas
for ($i=0; $i<$entries[“count”]; $i++) {
foreach($attnames as $attname){
if(is_array($entries[$i][$attname])){
$lastcount = $entries[$i][$attname][“count”] – 1;
for($j=0;$j<$entries[$i][$attname][“count”];$j++){

//Om det är en skolkod så vidar jag inte det. Jag visar inte heller pidcategory som kommer senare
if (($attname == ‘pidschoolunitcode’) || ($attname == ‘pidcategory’)) {
// Här visar vi inte något
}else{
// Skicka ut värdet
echo str_replace(“,”,””,$entries[$i][$attname][$j]);
}

//Om det är ett attribut som är en kategori så vill Inläsningstjänst ha andra namn. Stu blir lika med Student. Emp blir lika med Teacher
if ($attname == ‘pidcategory’) {
if ($entries[$i][$attname][$j] == ‘Stu’) {
echo “Student”;
}
if ($entries[$i][$attname][$j] == ‘Emp’) {
echo “Teacher”;
}
}

//Här tar jag skolkoderna och skickar ut namnen istället
if ($attname == ‘pidschoolunitcode’) {
if ($entries[$i][$attname][$j] == ‘74064638’) {
echo “Gustav Adolfsskolan”;
}
if ($entries[$i][$attname][$j] == ‘63452058’) {
echo “Hemsjö Kyrkskola”;
}
if ($entries[$i][$attname][$j] == ‘49115714’) {
echo “Ingaredsskolan”;
}
if ($entries[$i][$attname][$j] == ‘78832157’) {
echo “Kullingsbergsskolan”;
}
if ($entries[$i][$attname][$j] == ‘34338735’) {
echo “Lendahlsskolan”;
}
if ($entries[$i][$attname][$j] == ‘28639614’) {
echo “Långareds skola”;
}
if ($entries[$i][$attname][$j] == ‘78273632’) {
echo “Magra skola”;
}
if ($entries[$i][$attname][$j] == ‘46546067’) {
echo “Nolbyskolan”;
}
if ($entries[$i][$attname][$j] == ‘84581048’) {
echo “Nolhagaskolan”;
}
if ($entries[$i][$attname][$j] == ‘92770341’) {
echo “Noltorpsskolan”;
}
if ($entries[$i][$attname][$j] == ‘76908037’) {
echo “Sollebrunns skola”;
}
if ($entries[$i][$attname][$j] == ‘38957274’) {
echo “Stadsskogenskolan”;
}
if ($entries[$i][$attname][$j] == ‘90924483’) {
echo “Stora Mellby skola”;
}
if ($entries[$i][$attname][$j] == ‘71895385’) {
echo “Västra Bodarna skola”;
}
if ($entries[$i][$attname][$j] == ‘57136802’) {
echo “Ängaboskolan”;
}
if ($entries[$i][$attname][$j] == ‘70153094’) {
echo “Ödenäs skola”;
}
if ($entries[$i][$attname][$j] == ‘63399058’) {
echo “Östlyckeskolan”;
}
if ($entries[$i][$attname][$j] == ‘75101306’) {
echo “Nolhagaskolan”;
}
if ($entries[$i][$attname][$j] == ‘70304200’) {
echo “Noltorpskolan”;
}
if ($entries[$i][$attname][$j] == ‘70079232’) {
echo “Ängaboskolan”;
}
if ($entries[$i][$attname][$j] == ‘63399058’) {
echo “Östlyckeskolan”;
}
if ($entries[$i][$attname][$j] == ‘75101306’) {
echo “Nolhagaskolan”;
}
if ($entries[$i][$attname][$j] == ‘70304200’) {
echo “Noltorpskolan”;
}
if ($entries[$i][$attname][$j] == ‘70079232’) {
echo “Ängaboskolan”;
}
if ($entries[$i][$attname][$j] == ‘63399058’) {
echo “Östlyckeskolan”;
}

}
}
} else {
echo str_replace(“,”,””,$entries[$i][$attname]).””;
}
// En avgränsare efter varje värde då filen ska vara semikoloseparerad
echo “;”;
}
// Ny rad efter en post
echo “</br>”;
}
ldap_close($ds);

} else {
echo “Kan inte koppla mot LDAP-servern”;
}
?>

Läromedlel och automatisk distribution

Uppdatering: En digital skiss

Idag var det lite prat om hur läromedelsföretagen ska kunna distribueras. I Alingsås kommun har vi pratat igenom lite och har en del tankar och idéer. Kolla in skissen. Så här skulle det fungera

Vi har våra elever, personal och vårdnadshavare i våra katalogtjänster. Jag låter en LDAP-proxy sammanfoga dem och hämtar sedan upp informationen med en integrationsmotor såsom Mule. I Mule kan jag bearbeta datat och sätta de attribut som företagen vill ha. Vi skickar över det datat till en katalogtjänst som läromedlesföretagen gemensamt har.

Det coola kommer när vi även tar med hela kommunens hierarki i form av grupper. Jag tillhör i exemplet gruppen 01TY1a (tyska). Antingen gör man en nationell portal där man köpa läromedel eller så kan vi importera det till typ Open Cart som kommunen själva driftar. Som lärare kan man köpa produkter per avsnitt och per tidsenhet. Dessa kopplar läraren till gruppen. Exempel jag köper kapitel 2 i ett läromedel gällande tyska. Beställer den till gruppen 01TY1a. Den kostar då 2 kr / elev och dag som jag vill använda den. På varje grupp kan man ha ett attribut som sätter beloppsgränser om man vill hålla budget.

När läromedlet är köpt kan vi i vår Arena för lärande via ett API automatiskt generera ikoner. I och med att de skapas live så får eleverna exakt de läromedel de ska ha för stunden.

Som extra bonus i Alingsås har vi en tjänstekatalog där vi automatisk lägger in kostnader på rätt kostnadsställe. Det betyder att läromedelsföretaget skickar en räkning varje månad till IT-enhet som betalar. Vi får även en fil med överenskommet data på vilka grupper/elever det köpts in. Då det är samma grunddata som används kan vi distribuera och fördela kostnaden genom automatiska bokföringsordrar.

Kom gärna med nackdelar. Min stora fördel är att vi får minimalt med administration för de som betyder mest pedagogerna!

Om man vill ge automatisk inloggning till vårdnadshavare löser vi även det via Arena för lärande och API-et. Där kanske vi gör dealen att om vårdnadshavare alltid har rätt till elevens läromedel. Det hade jag gillat som förälder.

Känner ni att det är rörigt? Det är en skiss och en tanke bara, men verksamhetsnyttan kan vara enorm!

Lansering av ny hemsida

Idag hade Ping Pong lansering av sin hemsida. Jag har byggt den med mycket god hjälp från en kunnig kommunikatör på Ping Pong. Som IT-arkitekt ville jag gärna testa om det går att bygga en snygg och funktionell hemsida som klarar av kundens alla behov på olika sidor med olika design. Mitt personliga mål vara att se om det fanns så utvecklade teman på marknaden att man kunde uppfylla detta utan att behöva koda något.

Mitt påstående är inga problem, det går lätt och det är inte jättesvårt.

Nyckelkomponenten var i detta bygge Visual Composer + att man måste ha någon som känsla för form och design.

Reklamjobb

Har denna helgen jobbat med affisch till Akvariehelg 2018. Det blir ett helt gäng med affischer i samma tema. Detta är den som kommer vara som mall till de andra. Föreningen har själva önskat en del saker i layouten som jag anpassat efter det.

Kommer även göra hemsidan https://www.akvariehelg.se

En text om integrationer att ha i upphandlingsunderlag

Här kommer en text jag använder i upphandlingar av system. Ta gärna och kopiera, men du får också återkomma med feedback om det är något jag kan förbättra

Integrationer

<företagsnamn> äger all data i systemet. Vi har läsrättigheter av allt data. Skrivrättigheter avtalas.

API

Integrationer sker via ett API som är https-baserat och således plattformsoberoende.

  • API’et är versionshanterat och två versioner är alltid supportade.
  • <företagsnamn> får utpekad kontaktperson som har kompetens inom API’et
  • Encoding bör vara UTF-8 eller ISO8859-1
  • SLA reglerar öppettider för API
Om någon av ovanstående punkter ej går att uppfylla ska leverantören beskriva ett motsvarande sätt för integration.
Leverantören beskriver hur notifieringar om förändringar via API sker.

Filintegration

I en filintegration vill vi ha följande format i prioriteringsordning
  1. Taggat filformat såsom XML eller JSON, med dokumentation
  2. Edfact som är dokumenterad
  3. CSV som är dokumenterat
  • <företagsnamn> får utpekad kontaktperson som har kompetens inom filintegrationen
  • SLA reglerar öppettider för API
  • Encoding bör vara UTF-8 eller ISO8859-1
Fastpositionerade filer undanbedes.

Get digital – or die trying

Här kommer en kortare bokrecension på en riktigt bra bok. Det är Arash Gilan och Jonas Hammarberg som skrivit Get digital – or die trying. Du hittar mer information på www.getdigital.nu

Det som slår mig är hur aktuellt citatet ”Culture eats strategy for breakfast” – Peter Drucker är. En av mina absoluta favoritdelar i denna bok handlar mindre om själva digitaliseringen utan de förutsättningar som krävs för att gå vidare inom digitaliseringen. Frågan är ju inte om vi kommer digitalisera utan när. Som kommun kan man välja, men med ökade krav från politik blir det mer nödvändigt med högre förändringstakt.

Bestäm dig här och nu, redan där har du ett försprång enligt författarna. Det finns ett antal mjuka värden som jag håller med om att de är viktiga för vår resa:

  1. Ledarskapet är avgörande
  2. Gamla vägar, vanor och rutiner fungerar inte längre
  3. Kulturen är allt och lite till
  4. Känsla trumfar häftiga produkter

Vi kan inom kommunen redan se att digitaliseringen sköljer över oss som en våg och att vi måste hänga med på alla dessa punkter. Redan nu så ökar användningen av sensorer, processer definieras, integrationer struktureras och vi låter data flöda. Vi ser en framtid där mycket kommer analyseras och optimeras. Yrken kommer försvinna och nya kommer tillkomma och som vanligt kommer det vara en stor oro.

Stor del av boken handlar om vad digitaliseringen är och vad det innebär. Det är enkelt förklarat med bra exempel.

Avslutningsvis måste jag citera författarna: Det handlar inte om att inte göra fel, det handlar om att förändras snabbare än omvärlden.

Är du ledare eller jobbar strategiskt med digitalisering är det obligatorisk läsning!

Kombinera din nyvunna kunskap med lite GTD och lite jävlaranamma, krydda med att förenkla.

Contentbuilder.js – Bygg vad som helst snyggt

https://www.zoopet.com/projekt har jag testat en ny produkt som heter Contentbuilder.js

Det som jag uppskattar är att den har många mallar med färdiga byggblock. Man drar och släpper och får till en snygg design utan så mycket arbete. Nackdelarna är som vanligt med webbeditorer att det kan vara krångligt med formatering om man klistrar in från sitt ordbehandlingsprogram. Men skulle ett block bli tokigt drar man bara in ett nytt från mallen och göra om det då det går så snabbt.

Den är lika lätt att integrera på en befintlig hemsida som vilken WYSIWYG-editor som helst.

Här är en video hur det fungerar för användaren att använda verktyget.

 

Aktivera SSO i G-Suite

Att aktivera SSO i G-Suite kan låta självklart. Om du dessutom har flera Chromebooks kan du låta dessa gå direkt mot din interna IdP. Effekten kan du se i videon, användarupplevelsen förenklad. Som extra steg kan du ta upp din egen portal där du redan är inloggad såsom elev eller personal.

Dessa inställningar görs i din Google domän.

  1. Aktivera SSO

2. Ställ in dina Chromebooks att använda din SSO

 

 

 

Copyright © 2019 Christian Alfredsson

Tema av Anders NorenUpp ↑