kimfalk

  • Når man snakker om Machine Learning og Data Science, og alle deres vidunderligheder, så kigges der normalt altid ud I fremtiden, og der fokuseres på hvilke nye ting som kan løses med kraftige computere, det […]

  • Privacy eller privatliv har spillet fallit på nettet, ikke kun på den måde som mange tænkte det ville gøre for 20 år siden hvor teorien var at folk ville blive overvåget mod deres vilje, okay det sker også, […]

  • Halvt igennem den anden dag af GOTO, og jeg sidder og lytter til hvordan mennesker reagerer i semi-selvkørende biler (link). Et af deres forsøg viser at folk meget hurtigt taber interesse i at følge trafikken, nå […]

  • Jeg må krybe til korset og indrømme at jeg er ikke udvikler længere, og derfor er der rigtig mange af de emner som jeg engang syntes var enormt spændende ved Goto der ikke rigtig fanger længere. Derfor var […]

  • Læste I dr.dk’s artikel om panama-papirene? Deri kan man læse at panamapapirene angiveligt indeholder informationer om 5-600 danskeres skattely-aktiviteter.

    De papirer der omtales er en del af de 11,5 mil […]

  • Der er mange måder at man kan få en computer til at se intelligent ud, man kan for eksempel programmer den til at huske ting som du som bruger gør ofte og anbefale dem lige før brugeren normalt gør tingene. Elle […]

  • Artem Aliev som skal lære mig at bruge Spark på torsdag, holder en præsentation om hvordan man kan overkomme NoSQLs databasers problemer med at de ikke har noget stærkt query sprog. Fra min egen erfaring kan jeg […]

  • kimfalk wrote a new post, En snak om RavenDb, on the site Kim Falk 3 years, 1 month ago

    Ayende Rahien aka Oren Eini er kommet for at fortælle om RavenDb her på Goto Konference.

    Han fortæller at grunden til at de gik igang med at udvikle RavenDb var fordi de var trætte løse de samme trivielle prob […]

  • Thumbnail

    Alle der er interesseret i data analytics, machine learning eller big data, har på et tidspunkt prøvet at kigge på et dataset som er så stort, at det bliver svært at arbejde med i R eller med SQL.

    En […]

  • Firmaet som altid har været kendt for aldrig at følge en standard, ved altid at enten at lave sin egne proprietære teknologier som gjorde det sværere at samarbejde med andre, eller at følge en standard, men så […]

  • ThumbnailDark patterns er ikke noget som folk ”on the dark side” bruger til at sejre over flere jedi-riddere, men noget som dukker op flere og flere steder på nettet.

    Pioneren inden for dark patterns er et flyselskab […]

  • Lyder som en spændende leg, var der noget om hvordan man kan introducere sådan noget i et projekt team. Jeg mener.., jeg tror mine kollegaer ville kigge lidt, hvis jeg kom og fortalte dem at når vi er færdig med standup meeting, så skal vi lige stå og stirre på hinanden i 4 minutter. .

  • kimfalk wrote a new post, Ligheden af ting, on the site Kim Falk 4 years ago

    En spørgsmål som man ofte møder i forbindelse med Machine learning og data mining er at bestemme hvor meget to ting ligner hinanden, altså hvordan måler man ligheden af ting, det kan være personer, dokumenter, film eller frugter i et supermarkedet. Og det er der selvfølgelig mange måder at gøre det på, men en god en, at have i tasken, er opfundet af en franskmand ved navnet Jaccard, og kendes som Jaccard Ligheden (også kendt som Jaccard Index).

    Ideen er ret simple, givet to mængder A og B, beregner man ligheden ved at sige:

    J(A,B) = |A∩B|/|AUB|

    Hvor

    J(A,B) ligeheden af A og B
    |A∩B| er antallet af elementer A har til fælles med B
    |AUB| alle elementer der er kan findes i A og B.

    Det virker jo lidt fjernt fra at sammenligne personer og film, men hold på hat og briller for nu bliver det hele klart!

    Hvis man nu kigger på en film som en liste af features, så kan man sige at “star wars” er følgende:

    Fantasy
    Harrison Ford
    Kamp mellem godt og ondt
    Rumskibe
    Magi

    Og hvis vi prøver at lave en ligende liste for “Ringenes herre” kunne det være:

    Fantasy
    Elijah Wood
    Kamp mellem godt og ondt
    Drager
    Magi

    Her skal man selvfølgelig forstille sig at listen indeholder alle skuespillerne og alle nøgleordene (som drager, magi). Vil man nu gerne prøve at finde et tal for ligheden af de to film så kan man få hjælp fra vores nye ven Jaccard som siger at “Star wars” og “Ringenes herre” (faktisk havde Paul Jaccard ikke nogen holdning om de film da han døde i 1944 i Zürich). Indsættes mængderne i formlen får vi følgende:

    J(“Star Wars”, “Ringenes herre”) =
    |{ “Fantasy”, “Kamp mellem godt og ondt”, “Magi”}| / | { “Harrison Ford”,”Kamp mellem godt og ondt”, “Rumskibe”, “Fantasy”, “Elijah Wood”, “Kamp mellem godt og ondt”, “Drager”, “Magi”} |
    = 3 / 7

    Det giver måske stadig ikke noget særligt godt billede af om hvorvidt de ligner hinanden eller ej. Men ideen er heller ikke at det skal forstås som en faktisk værdi, men som et indeks. Således at hvis du laver samme sammenligning med andre film, så ender man med at film der minder om hinanden har et indeks tæt på 1 mens dem som ingenting har til fælles har et indeks tæt på nul. Dette indeks kan derefter bruges til at sortere filmene og finde en rankering af hvor meget de ligner den sammenlignede film. Så hvis vi laver samme udregning mellem “Star wars” og en masse andre film også, kan vi lave en liste af film som er sorteret efter film der minder mest om “Star wars”.

    Dette eksempel illustrere også et interessant problem, som jeg mener, faktisk er et af de største problemer ved at bruge machine learning, nemlig at vælge input, samme algoritme kan virke fantastisk på en type input men forfærdeligt på andre. I eksemplet ovenfor kan man diskutere om “The Force” er “magi” eller ej, og om “Drager” måske skulle have være overnaturlige dyr, og om der er sådan nogle med i “Star wars”.

    Man kunne sagtens lave en lang række beskrivende tillægs ord som vil beskrive begge film, og samtidig finde en anden lige så lang liste af tillægsord som gør dem forskellige. Samme problemstilling kan man finde ved sammenligning af personer og de fleste andre ting. Det er også grunden til at mange kalder machine learning for en kunstart mere end matematik.

  • Ting lyder bedre når man siger dem på engelsk, der er ikke noget at gøre, men vi skriver jo på dansk.

    I sidste uge var der RecSys 2014 i Californien som er en af de største recommender systems konferencer, og […]

  • kimfalk wrote a new post, Side rankering , on the site Kim Falk 4 years, 1 month ago

    Google-søgemaskinen er, som de fleste ved, ret berømt, du har måske oven i købet brugt den til at ankomme her – forhåbentlig lå denne post højt på resultatlisten.

    Alt det startede med en algoritme ved navnet PageRank, som gjorde det muligt for computere at lave rankeringer af internet-sider og ved et slag lavede internet-søgemaskiner til relevans-maskiner i stedet for store leksikale opslagsværker.

    Ideen bag PageRank er ret genial, da man ikke kigger på selve siden, og derved frigiver forfatteren af siden for fristelsen at manipulere med søgemaskinen, men måler i stedet en sides relevans på, hvor mange andre sider der linker til siden. Faktisk kan man forstille sig at hver side på internettet “stemmer” på andre sider. Så hvis en side linker til en anden, så siger man at siden stemmer på den anden side.

    Men hov.. tænker den kloge læser sikkert, så kunne forfatteren jo bare lave million sider som linker til siden, så er problemet løst, og man kommer til at stå øverst på alle søgninger alligevel. Men så nemt er det ikke. For PageRank bruger den stemmendes egen pagerank til at beregne stemmens værdi, således at hvis der ikke er nogen som stemmer på den side som stemmer, er stemmerens stemme ikke noget værd. Lad os tage et eksempel:

    Lad os forestille os at følgende er et udsnit af internettet og lad os beregne PageRank for siden C:

    pagerank

    For at beregne dette skal man kigge på alle de sider som peger på C, hvilket er A og B. Antag nu at A’s PageRank er Ra og B’s er Rb.

    Da A har “stemt” på tre sider (altså 3 links på siden til andre sider), derfor vil A’s stemme på C give en værdi på Ra/3, Siden B’s stemme derimod tilføjer Rb/2 da siden B kun har stemt på 2 sider. Det betyder at C’s pagerank er:

    Rc = Ra/3 + Rb/2

    Envidere stemmer siden C på 2 andre sider, derfor tilføjer Siden C, Rc/2 til D og E’s pagerank. Det betyder derfor at nu flere vigtige sider som peger på din side nu højere PageRank får den. Men hvad så med A og B, og de sider som peger på dem? Hvordan starter man? Faktisk starter man med det hele.

    Kigger man f.eks. et meget forsimplet internet som kun har 3 sider, så ender man med 3 ligninger med 3 ubekendte og ingen konstanter, hvilket ikke har nogen entydig løsning. Men da kan man tilføje et ekstra krav om at summen af alle Pageranks skal være 1, hvilket er nok til at man kan finde en løsning. Dette kan man løse ved hjælp af Gausisk udelukkelse.

    Problemet er nu at det bliver kompliceret hvis man har et faktisk internet. Men heldigvis kan problemet defineres ved hjælp af matricer og eigenvektorer og kan derefter løses det med en iterativ algoritme ved navnet power iteration, som kan være en opgave til læseren at kigge på.

    Når man så har fundet PageRank kommer det meget mere komplekse problemer man skal løse hvis man er en søgemaskine: Hvilke sider skal man returnere på hvilke søgninger, og hvordan man laver disse koblinger er normalt en velbevaret hemmelighed.

    Men en måde kunne være at man laver det der hedder en tf–idf som beregner vigtigheden af ord i dokumenter. Når der bliver søgt på et ord, returner de dokumenter hvor ordet er mest vigtig sorteret efter pagerank. Men Google gør det helt sikkert noget som er bedre og mere effektivt.

    • Så vidt jeg husker bruger de også relevans i forhold til nøgleord og andre linkede sider til at putte vægte på grafen.

  • kimfalk wrote a new post, Microsoft i skyen, on the site Kim Falk 4 years, 1 month ago

    ThumbnailEn ting som der bliver snakket næsten endnu mere om end Big Data er skyen, og i dag er jeg taget på Azure DevCamp for at lære hvordan det hænger sammen i en Microsoft verden.

    Hos Microsoft ved siden af den […]

  • Hej, skriver live GOTO cph, sidder og lytter til Adrian Cockcroft som fortæller om fast delivery, om hvordan de hos Netflix kom ud så hurtigt på cloud.

    Han beretter om en kultur som blandt andet indeholder:

    Om man koncentere sig om at hastighed vinder i markedet
    Man skal fjerne friktion i udviklings cyklusen
    Managere og udviklere skal have høj tillid, udvilking skal ikke styres med process, og ingen overlevering mellem teams, alle team skal behandle alle andre teams som 3’de parts kode (man snakker kun med API’er)
    En kultur hvor Frihed til prøve nye ting er vigtig
    Man skal koncentere sig om sit kerne område, og køre andre til at gøre resten
    Brug simple deploy teknikker ved hjælp af værktøjer
    Arkitekter prøver at fremme brugen af gode patterns, mens man fraråder dårlige
    Lad arkitektur være offentligt, således kan mange give feedback på det – Adrian snakker om at han har brugt konferencer til at verificere nye arkitekturer
    Alle har adgang til at tilføje services til et cloud miljø (her skal det nævnes at de bruger continous delivery, som man kan høre jez humble blandt andet snakker om i hans deep dive om Lean Enterprise som starter om lidt)

    ”assumptions: process prevents problems.”

    Et problem i mange firmaer er Hver gang noget går galt, så laves en process så man undgår at det sker igen, hvilket er godt i det øjeblik problemet opstod, men i ældere firmaer bliver det en hemsko da de antagelser som gik forud for problemet ofte ikke er opfyldt et år eller to senere, men processen bliver.

    Det gælder om at få tiden fra ide til markedet forkortet så meget som muligt. Mens jeg skriver dette sidder Jex Humble faktisk ved siden af mig og gnider sig i skægget – faktisk står Alistair gentager mere eller mindre hvad jeg lærte i går til Jez’ tutorial om Continuous Delivery.

    Efter at have siddet i flere firmaer som har vokse værk og som er meget fokuseret på hvordan man kan få sat så meget i process som muligt er det meget interessant at høre disse ting.

    Han anbefaler at alle læser The phoenix project.

    Mikroservices

    I udviklings afdelingen er en af problemerne at når man laver et release, afhænger det af mange udviklere, så hvis bare en udvikler har lavet en fejl, er hele systemet pludselig bremset, derfor er det en god idee at bruge microservices, som kan releases isoleret. Således kan alle release uden at være afhængige af andre, For at ungå at man ødelægger noget ved et release af en mikroservice bruges noget som hedder non destructive production update, som betyder at man aldrig overskriver en version, den nye version kører side om side med den gamle, således at man ikke ødelægger noget ved release. Når man har verificeret at ting virker kan man langsomt lade andre afhængige service migrere til den nye service. Den måde risikere man aldrig at ødelægge systemet.

    En mikroservice kan fylde millioner af kode, men må kun udføre en ting. Alle mikroservices skal ejes af mindst to udviklere. Således at man kan sende den ene på ferie engang imellem.

    Det hele koger ned til at mindske prisen ved ændringer.

    Open Source
    Ved at bruge open source kode kan man spare meget udviklings tid, omvendt så kan man vinde meget ved at lade mange ting være open source og offentlig tilgængelige, der vil lade en mange mennesker teste koden, og hjælpe med at udvide det.

    Høre ham sige:
    De fleste nye spændende projekter er skrevet i Go (http://golang.org/) uden at jeg fik fat i konteksten.

    Løs kobling
    For at man kan lave små opdateringer uden at man skal opdatere alt, skal alt være løst koblet, og altid kun snakke med andre service gennem API’er.

    DevOps
    En ting som mange snakker om her på konferencen er at development og operations skal smelte sammen, således at en udvikler ikke er færdig med koden, før den dag det er færdigt med at køre i produktion ikke når man overlever det til QA.

    Adrian Cockcroft

    Igår sagde Jez:
    Release skal være så rutinerede at det er kedeligt.

    Stateless business logic
    Her brugte han en rimlig drablig analogi: Man skal have Køer ikke kæledyr: Nogen køer kan godt dø, og du kan stadig få mælk og tilføje nogle flere køer til at få ligeså meget mælk som før, man må ikke ha kæledyr som ikke kan udskiftes.

    Læs også Domain Driven design bogen siger han også

    Man får fornemmelsen af at I dag er lidt af en forsmag til det 2 timers deep dive som han giver i morgen om hvordan de gør det hos Netflix. Han havde mange flere gode points som jeg ikke fik med, da jeg desværre ikke er så god til at oversætte og skrive mens jeg lytter. Men jeg kan kun anbefale at se det når det kommer online.

  • Hvordan kan man være sikker på at et en feature virker. Nemt tænker man jeg prøver bare at køre mit software, og tjekker om den omtalte feature virker som forventet. Når man har to features så gør man det samme og […]

  • Ja, det læste jeg på wikipedia, men tænkte at de passede bedre ind i næste post om frontend :).

  • Når jeg tænker på Single Page Architecture (SPA) er der en række problemer som popper op, som f.eks: Back button virker ikke, da browseren ikke oplever det som side skift når man navigere rundt på siden, eller at UX delen er en suppe af div-tags of javascript, som hurtig bliver svær at overskue og umulig at debugge.

    Derfor er jeg lidt skeptisk når jeg høre om det nye sort hos ASP.NET nemlig SPA – single page architecture, som skulle være en nem og overskuelig måde at lave apps på, netop ved at man kun har en HTML side hvor alt logic bliver lavet i siden med Javascript, for mig lyder det som gammel vin på nye flasker. Men man skal jo aldrig sige aldrig, så derfor tror jeg også det ville være spændende at komme med til training sessionen Build a SPA in Just One Day på GOTO konferencen i Aarhus.

    Men mens man venter er der mange tutorials på nettet, som man kan kigge på. Men hvorfor ikke skrive en selv 🙂

    Jeg hellere indrømme at jeg har startet den her blog post to gange; Første jeg prøvede var lave en ny løsning i VS2013, med en SPA template. Men SPA templaten inkludere MVC, hvilket jo er et godt framework, men en hel del mere end hvad jeg er ude efter. Men lad os lige tage to skridt tilbage først.

    Mit projekt (for man er vel ikke udvikler, hvis man ikke har en lille projekt ide) er at lave en side hvor jeg kan lister de bøger som jeg har stående der hjemme, lave ratings på dem jeg har læst også få anbefalinger til hvilke jeg skal læse næste gang. Det kan så udvides til at venner kan tilføje deres bøger, vi kan bruge hinandens anmeldelser til at lave bedre anbefalinger. Så kommer deres venner på besøg, og vil også være med. Derefter går det hurtigt med verdens herredømmet og vi ender med enten at købe Facebook, eller blive opkøbt af Amazon.

    Ikke? man kan jo altid drømme.

    Men fra et mere teknisk synspunkt, så vil jeg gerne have en simpel side hvor jeg kan teste forskellige anbefalings algoritmer, og samtidig prøve at lege med forskellige nye teknologier, f.eks. MongoDb, ASP.NET SPA, OData, knockout.js, Måske SignalR, men jeg ved ikke helt om det passer ind endnu.

    Før jeg overhovedet begynder at kode startede jeg med hentet data om bøger hos goodreads.com, hvor jeg har en konto med lidt over 100 bøger, og dem kan man eksporterer til en CSV fil, hvilket jo gør det til en leg at importere i mongoDb.

    Så er det bare med at komme igang! En definition af SPA er ifølge wikipedia kan SPA defineres som:

    In a SPA, either all necessary code – HTML, JavaScript, and CSS – is retrieved with a single page load, or the appropriate resources are dynamically loaded and added to the page as necessary, usually in response to user actions.

    Det oversætter jeg til at en SPA handler om at der kun fortages et request til serveren for at hente selve “siden” og så bliver alt data opdatering håndteret ved hjælp af AJAX-kald til serveren, uden “siden” bliver loaded igen.

    Med det i tankerne blev jeg noget overrasket ovet at SPA templaten i Visual Studio 2013 inkludere MVC. Nu skal man ikke kimse af MVC for det er jo et godt framework, som jeg selv har lavet flere hello-worlds i, men hvis man kigger på definitionen af SPA så passer det jo ikke helt sammen. VS2013 templaten bruger følgende arkitektur:

    Microsoft SPA architecture

    Jeg har så senere fundet ud af at ideen er at man laver en MVC løsning, og så lader man de sider som bygges på MVCvis hente data med AJAX, men det er jo ikke single page, men few page architecture (FPA), jeg ikke syntes passer helt overens med definitionen af SPA.

    Så efter at have slåset en del med MVC og ikke kunne få det presset ned i den simple model, startede jeg forfra og brugte empty site som template med Web-API inkluderet. Da det passer bedre med mit verdensbillede (og i håbet om at jeg ikke kommer til at savne MVC, efterhånden som millioner af bruger begynder at bruge sitet).

    Da jeg godt kan lide at se noget som kører i en fart, og så tilføje funktionalitet ovenpå, starter jeg med en meget simple data struktur, som jeg ligger i en folder jeg kalder Model:

    namespace Books.Models
    {
    public class Book
    {
    [Key]
    public Guid Id { get; set; }
    public int BookId { get; set; }
    public string Title { get; set; }
    public string Author { get; set; }
    public int MyRating { get; set; }
    }
    }

    Det skal helt sikkert udvides senere, men det er rigeligt til at starte med. Når man har en klasse kan man autogenere en controller for klassen som håndtere hent, gem, editering og slet (så kaldte CRUD functioner.). Jeg kan godt lide OData så jeg laver en odata enabled controller. Det gøres ved at vælge Add-Controller i højreklik på controller folderen.

    AddingODataController

    AddingODataController2

    Det var næsten alt hvad vi skal bruge fra backend til at starte på front end, man skal lige læse den autogenerede kommentar som der er i Controlleren som siger at du skal kopiere nogle liner kode ind i WebApiConfig.cs filen, for ellers virker OData kontrollen nemlig ikke.

    Og til sidst, skal vi hacke løsningen lidt fordi jeg vil gerne have EF ud af systemet og hardcode nogle bøger som vi kan arbejde med til at få det hele op og køre. I bookContext laver jeg følgende:


    public class BooksContext : DbContext
    {
    public BooksContext() : base("name=BooksContext")
    {
    Books = new List();
    Books.Add(new Book { Author = "Douglas Adams", BookId = 42, Id = Guid.NewGuid(), MyRating = 100, Title = "Hitchhikers Guide to the Galaxy" });
    Books.Add(new Book { Author = "Umberto Eco", BookId = 2, Id = Guid.NewGuid(), MyRating = 0, Title = "L'isola del giorno prima" });
    }

    public List Books { get; set; }
    }

    Også gik jeg gennem BookController og ændrede alle metoder så det id man finder bøger på er BookId som er en int og ikke en Guid. Det betyder at man lave følgende kald, i browseren når man kører projektet:

    http://localhost:51253/odata/Book(2)

    Som returnere:

    {
    odata.metadata: "http://localhost:51253/odata/$metadata#Book/@Element",
    Id: "06c89b4d-7941-4a5c-884b-c28fc87a3ab9",
    BookId: 2,
    Title: "L'isola del giorno prima",
    Author: "Umberto Eco",
    MyRating: 0
    }

    Hvilket er nok til at vi nu kan vende os mod frontend og dermed html og Javascript. Hvordan man bruger de data som jeg har hentet fra GoodReads er en historie for sig, som kommer i en fremtidig blog.

    HTML5 og javascript, det er ikke min stærke side, så jeg vil sætte pris på alle kommentar og vittigheder omkring min kode :). Så find den røde pen frem og glæd jer til part 2.

  • Load More