semanticdave.se

En webbplats under konstruktion

Vårkänslor och ett snedtramp

Som en kalv på grönbete kastar man sig ut i stadsmiljön och tar sikte på en närbelägen park. Elva minuter senare haltar man rejält och har ont av en sträckning i revbensmuskulaturen som följd av ett semilyckat försök att undvika ett fall.

Nu gick det förstås inte att sluta springa där för hela (den korta) rundan skulle ju tas igenom trots det. Återstår att se hur illa det är med foten imorgon.

SemanticDave @ 2011-04-26 16:08:34 (uppdaterad 2011-04-26 16:09:06) » Permalänk

löpning

Länge sedan sist

Ja, vad ska man säga? Lite upptagen kanske? Japp, så är det. Nu var det dags att börja visa upp det här systemet för studenterna och vad upptäcker man då om inte några tjusiga bypass-liknande fix och trix som inte alls ser bra ut. In med admin på service, tack!

Men vi avslutar med två roliga saker i sann TV3-anda. Först lite datornördshumor och sedan lite fotbollsnördshumor. Footballers, go and kiss one today!

Edit (och memo to self): service avslutad, du kan nu ta bort den bortkommenterade koden och fixa visningsfilerna.

SemanticDave @ 2011-03-29 16:21:52 (uppdaterad 2011-03-29 17:12:23) » Permalänk

sql-injektioner fotbollsskoj

Sociala medier och buzzwords

Jag hade lika gärna kunnat skriva en text om det själv, men länkar istället till Amber Naslund som träffar huvudet på spiken. Många förstå sig på-are slänger fram fina ord egentligen inte betyder så mycket. Ett föredrag om sociala medier, nya medier, webb 2.0 eller vad det nu kan tänkas försöka ringa in är ofta synonymt med bullshit bingo.

Nu har jag både twittrat och bloggat lite på arbetstid om något som rör mitt arbete. Jag tänker mer 2.0.

SemanticDave @ 2010-09-22 11:34:46 (uppdaterad 2010-09-22 11:37:01) » Permalänk

sociala medier bullshit bingo buzzwords

Scour, en social söktjänst

I Firefox på jobbet har Google en enastående irriterande feature vid sökning i sökfältet längst upp till höger i webbläsaren. När man börjar titta i resultatlistan efter en sökning poppar till slut ett hjälpfönster innehållande relaterade söktermer upp. Detta är egentligen en ganska bra och intressant hjälpfunktion om det inte var så att det tar sin lilla tid för detta att ladda färdigt, och att den platshållare som sedan ska innehålla termerna av förståeliga skäl inte kan reservera den så långt okända höjden på elementet. Följden blir att när jag tittar igenom resultatlistan skjuts denna ner en bit och jag måste försöka hitta var jag var någonstans. Dagens i-landsproblem förvisso, men likväl irriterande när man vill ha ett snabbt resultat. Mest irriterande är att jag inte kan ändra på det utan att koppla in IT-avdelningen och det känns som ett lite väl trivialt och onödigt uppdrag för dem.

Så jag försökte hitta andra alternativa söktjänster och fann först den miljövänliga Growyn, som kändes väldigt korrekt att använda med tanke på att min arbetsplats satsar extra på hållbar utveckling, men jag har alltid varit lite extra svag för Scour. Scour är en metasöktjänst som arbetar socialt där medlemmarnas sökningar, pushningar och kommentarer används för att vässa sökresultatet. Scour skriver:

Scour's purpose is to bridge the gap between searchers and relevant results. By providing a platform for the user to vote and comment on relevancy, searchers connect with one another creating a true social search community, attained through innovative solutions to meet the needs of today's web searchers.

Detta är alltså en applikation som använder sig av kollektiv intelligens. En annan intressant feature som gör det lättare är att man kan lätt öppna en sida från sökresultatet i ny flik. Och så kan man nu äntligen också lägga till Scour som en av de valda söktjänsterna i sin sökruta i webbläsaren.

SemanticDave @ 2010-09-10 11:34:18 (uppdaterad 2010-09-10 11:53:10) » Permalänk

scour growyn webb 2.0 social sökning kollektiv intelligens

Skoj med rekursion

När man granskar loggar finner man ofta att sidor som visas efter att användaren klickat på framåt- eller bakåtknappen i webbläsaren inte registreras. Det innebär att man som en del av förarbetet måste fylla igen luckor. Detta är till stor del ett rekursivt arbete. Det startar med att man har två sidor som man ska finna en länk emellan, dvs sida a länkar till b eller tvärtom. Om det inte finns en länk kan man undersöka ifall det finns en gemensam sida som bägge länkar till. a och b länkar inte till varandra men bägge länkar till c, därmed blir vägen a → c b.

Men algoritmen måste ju också täcka upp de fall då b inte länkar till c medan a länkar till c som länkar till b, och användaren bakåtklickat sig från b till a via c efter att ha klickat sig från a till c till b.

Vi har redan stött på patrull, men inget som är olösbart. Om det är så att det helt och hållet saknas sida som länkar ihop a och b blir det lite svårare. Då måste vi först titta på alla sidor p som a länkar till. För varje sida p kollar vi om det finns en länk till b, vilket vi vet att det inte finns (i så fall hade vi funnit den tidigare). Så vi kollar varje sida q som p länkar till, och sedan varje sida r som q länkar till tills vi funnit en länk till b. I själva verket finns det ingen sida q eller r, alla representeras av p som är en del av en rekursion.

När vi väl funnit en väg fram till b har vi en lång rad sidor som inte är del av vägen. Vi har samlat på oss alla sidor som a länkar till, och som p länkar till (inkluderat resultatet av rekursionen förstås). Därför måste vi skicka listan med sidor vidare till en funktion som rensar sökvägen. Denna funktion börjar bakifrån och kontrollerar om det finns en länk från näst sista sidan till den sista och tvärtom. Om inte plockas näst sista sidan bort och funktionen anropas på nytt med den nya listan med sidor. Är det så att det finns en länk mellan sidorna anropas funktionen igen med samma lista, men med instruktionen om att de x sista sidorna kan ignoreras.

Slutligen, när vi har fått en väg mellan de båda sidorna, ska vi vända på vägen. Exempel: vi har vägen abcd e a i loggen och vi saknar länk mellan e och a. e tar platsen som firstPage i algoritmen och a platsen som secondPage (det är egentligen vägen a e som vi söker). Vi finner att a inte länkar till e så vi testar om a länkar till sida som länkar till e. Detta stämmer inte heller eftersom a bara länkar till b. Men vi finner att a länkar till b som länkar till c som länkar till d som länkar till e tack vare rekursiva funktionen find_page. Hade vi nu, som på en normal webb är väldigt troligt, haft flera utgående länkar från sidorna hade vi samlat på oss ett antal sidor som är del av vägar som inte leder till e. Dessa måste rensas bort med clean_path.

Vår väg är för enkelhetens skull helt perfekt redan. Den är abcd e. Vägen från e till a blir då den omvända vägen edcba. Värt att notera är att det är mycket möjligt att användaren gått från e till a genom att klicka på ett bokmärke eller genom att skriva in a:s url.

Algoritmen

sessionPages ← secondPage, firstPage
for i = 0, i < sessionPages.count - 1, i++ do
  if sessionPagesi links to sessionPagesi+1 then
    output path sessionPagesi, sessionPagesi+1
  else if sessionPagesi+1 links to page p and p links to sessionPagesi then
    output path sessionPagesi, p, sessionPagesi+1
  else
    c = 0
    pagehit = 0
    foreach page p that sessionPagesi links to do
      pathscp, sessionPagesi
      visitedPagescp, sessionPagesi
      if pagehit == 0 then
        pagehit = find_page(sessionPagesi, p, pagehit, pathsc, c, visitedPagesc)
      endif
      if pagehit == 1 then
        pagehit = 0
      endif
      c++
    endforeach
  endif
endfor

Enkelt så långt, men nu ska vi titta på find_page:

function find_page(to, from, pagehit, path, c, visitedPages)
  if pagehit == 0 then
    visitedPages ← from
    foreach page p that from links to do
      if pagehit == 0 then
        if p not in visitedPages then
          path ← p
        endif
        if p == from then
          pagehit = 1
        if from not in visitedPages then
          path ← from
        endif
          clean_path(path, ignores = 0, c)
        else if p == to then
          pagehit = 1
        if to not in visitedPages then
          path ← to
        endif
          clean_path(path, ignores = 0, c)
        endif
        linksFromTo ← p
      endif
    end foreach
    if pagehit == 0 then
      foreach i in linksFromTo
        if i not in visitedPages then
          pagehit = find_page(to, i, pagehit, path, c, visitedPages)
        endif
      endforeach
    endif
  endif
  return pagehit
end function

function clean_path(path, ignores, c)
  cleanPath = chech_path(path)
  if cleanPath == false then
    pathCopy = path
    for i = 1, i <= ignores, i++ do
remove last item in pathCopy
endfor
if pathCopy.count >= 2 then
lastItem = pathCopy.last
remove last item in pathCopy
secondLastItem = pathCopy.last
remove last item in pathCopy
if !(lastItem links to secondLastItem or
secondLastItem
links to lastItem) then
remove secondLastItem from path
else
ignores++
endif
clean_path(path, ignores, c)
endif
else
output path
endif
end function

function check_path(path)
cleanPath = true
for i = 0, i < path.count - 1, i++ do
first = pathi
second = pathi+1
if !(first links to second or second links to first) then
cleanPath = false
endif
return cleanPath
end function

SemanticDave @ 2010-08-26 14:01:35 (uppdaterad 2010-11-30 18:57:50) » Permalänk

algoritm luckfyllning preprocessing data mining logganalys rekursion

SIDA 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16