Logging af klik

Posted by Anders Carlsen Wed, 10 Feb 2010 19:18:00 GMT

Fornyligt fjernede jeg logging af klik på en hjemmeside for dels at få hurtigere og flere sidevisninger , dels for at højne min troværdighed i forhold til Google Bot.

Min gamle strategi

Jeg brugt en teknik hvor jeg ved hjælp af onclick function return false skjulte at når folk klikkede på et link først blev send til en controller som loggede klikket i database inden det blev vidresendt til den ønskede adresse. f.eks.

<a href="http://dr.dk" onclick="window.open('/links/goto/12') ; return false; >

Selvom Google skriver i deres information til webmastere at Google Bot ikke følger javascript, kunne jeg konstatere at det gør den faktisk. Dvs. Google registerede adressen links/goto og ikke dr.dk, hvilket ikke er særligt hensigtsmæssigt. Desuden koster en omdirigering ekstra tid for brugeren og ekstra resurcer på serveren, så jeg valgte at fjerne funktionen og finde en anden strategi.

Nye klik logging strategi

Så jeg tænkte, – hvordan gør Google det?

Ind på Google med Chrome, højreklik og vælg, kontroller element(Googles svar på Firebug)

<a href="http://www.1001line.dk/" class="l" 
onmousedown="return
 clk(this.href,'','','res',
'1','&amp;sig2=Yd8YBx8q77M9QpTMyuWYcw'
,'0CBAQFjAA')"><em>Svendborg Web</em></a>

Aha, så Google bruger onmusedown event til at registrerer hvad brugeren klikker på.

Onmouse down er den event som indtræffer lige når brugeren har klikket inden onclick event indtræffer.

EventListener Jeg ønskede ikke at have onmousdown tilskrevet inline til alle mine links, så jeg skulle bruge noget eventhandling og tænkte at det må jeg kunne gøre med prototype

Så jeg fandt følgende eksempel på http://www.prototypejs.org/api/function/bindaseventlistener

EventListener

var obj = { name: 'A nice demo' };

function handler(e) {
  var tag = Event.element(e).tagName.toLowerCase();
  var data = $A(arguments);
  data.shift();
  alert(this.name + '\nClick on a ' + tag +
    '\nOther args: ' + data.join(', '));
}

Event.observe(document.body, 'click', handler.bindAsEventListener(obj, 1, 2, 3));

(Af en eller anden grund virkede det først for mig da jeg fjernede body fra document.body)

Da det først virkede fik jeg hurtigt omskrevet scriptet så det passer til mit formål.


function handler(e) {
  var tag = Event.element(e).tagName.toLowerCase();
    if(tag == "a"){
        new Ajax.Request('/link_hits/click/?id=' 
                  + Event.element(e).id + "&url=" 
                  + eval('Event.element(e).href').escapeHTML() ,
                   {method: 'get', asynchronous:true, evalScripts:true})
        }
}

Event.observe(document, 'mousedown', handler.bindAsEventListener());

For at spare på serveren ønskede jeg ikke at skrive loggen i databasen men i en logfil, som jeg så efterfølgende kan parse.

Min controller action kom til at se sådan her ud.
def click
   render :nothing => true
    logger = Logger.new("#{RAILS_ROOT}/log/hits.log", 50, 1048576)
    logger.info "#{Time.now}, #{params[:url]}, #{params[:id]}, #{request.remote_ip}" 
  end

Og sådan ser min log info ud:

# Logfile created on Wed Feb 01 15:44:28 +0100 2010 by /
Wed Feb 10 15:44:28 +0100 2010, http://1001lin.dk/, 481, 127.0.0.1
Wed Feb 10 15:48:03 +0100 2010, http://localhost:3000/links/index/217-haandvaerk_byggeri, , 127.0.0.1

Så snart kan mine webstedsbrugere igen bruge links hits siden på mit websted.


Del

Posted in , , ,  | Tags , ,  | no comments

If you can't beat them, join them

Posted by Anders Carlsen Tue, 09 Feb 2010 13:27:00 GMT

Mit vejkort til at blive Facebook applikations udvikler

If you can’t beat ‘em, join ‘em You better do it ‘Cause it makes you feel good – Queen

Facebook har ændret vilkårene på Internettet dramatisk

Lige før sommerferien 2008 besluttede jeg mig for at oprette et login til Facebook. Lige siden da har det været mit foretrukne sted på Internettet. Idag 2010 er stort set alle, som bruger Internettet på Facebook.

Facebook har på dramatisk vis ændret Internettet og den måde vi bruger det på. Og det er en udvikling som vil fortsætte.

På Google Search for Insight kan man danne sig et indtryk ovre udviklingen, ved at sammenligne søgeudtrykket “Facebook” med f.eks. “Google” og “Twitter”.

Diagrammet giver et klart indtryk af hvor dramatisk den rolle Facebook spiller.

Hvis vi ser bort for hele snakken om sociale medier, at Facebbok introdukserer en helt ny måde at bruge nettet på, og kigger på hvilke konsekvenser Facebook har haft for faktorene besøgstal og aktiv internet tid, vil jeg slutte udfra min egen adfærd og mine Facebook venners adfærd, at disse konsekvenser også har været og fortsat vil være dramatiske.

Folk bruger mere tid på nettet, men da væksten i Internetbrugere i danmark er toppet, og da vi fortsat kun har 24 timer i døgnet. Har en af konsekvenserne ved Facebook været at andre websteder må have oplevet stagnerende eller negativ vækst i forløbne to år.

Det er Facebooks skyld

Man kan forestille sig hvordan folkene fra f.eks. Arto og Dating, efter en kort periode at have siddet på en guldgruppe, har haft det når de måned efter måned har se hvordan væksten er stagneret eller faldet de sidste to år.

Ifølge FDMI , er Arto gået fra 433000 måndlige brugere i august 2008 til 231.000 måndlige brugere i august 2009. Der kan være andre faktorer som gør tallene, men tendensen og årsagen er klar. Det er pga. Facebook.

Matthæus effekten

På Internettet som på andre frie markeder gælder Mathæus effekten Google og Facebook vokser og vokser, på bekostning af andre spillere.

Facebook applikations udvikling

Budskabet til websstedsejere og webstedsudviklere er klart. If you can’t beat them, join them

Heldigvis er Facebook meget åben i en positiv forstand. Ok man skal have et login, for at kunne være med. Men Facebook inviterer websteder og webudviklerer med indenfor. Der er rige og muligheder for at joine Facebook ved at lave Facebook applikationer og ved at Integrerer sit websted med Facebook. Man starter med Facebook Udvikler .

Mindre kan også gøre det, ved at benytte sig af muligheden for at oprette Facebook grupper og Facebook profiler.

Facebook støtter Open Source bevægelsen

Facebook er jo lavet med PHP, og Facebook har bidraget med flere udviklingsprojekter til bla. PHP

Generelt virker det som om at danske web-udviklere endnu ikke er vågnet op til realiteterne på nettet. Jeg har dog fundet et firma, Komfo , som ser ud til at have fået fat i den lange hale( long tail).

Selv er jeg for ganske nyligt gået igang med at lære at lave Facebook applikationer med Ruby On Rails og Facebooker som jeg ser som det pt. bedste Rails plugin til Facebook. Så om alt går vel, kan jeg inden længe smykke mig med titlen – Facebook-udvikler . ;-)

Jeg håber snart at kunne dele mine erfaringer her på denne weblog.


Del

Posted in , ,  | Tags , ,  | no comments

Google App Engine med Ruby On Rails

Posted by Anders Carlsen Sun, 24 Jan 2010 17:06:00 GMT

Min første applikation på Google App Engine er oppe at køre.
http://bodeval.appspot.com/

Det tog ikke lang tid at sætte det op, da jeg først havde fundet den rigtige vejledning , selvom AppEngine SDK er til Python eller Java. Men med JRuby er og dygtige Rails udviklere, er der for længst fundet løsninger der gør det muligt at køre Rails på AppEngine.

Jeg brugte denne vejledning, Rails 2.3.5 on App Engine .

De sidste par år har jeg ikke rigtigt fulgt med i udviklingen på Internettet og udviklingen af Rails i særdeleshed. Det er et lidt typisk mønster. Da asp toppede ville jeg hellere arbejde med ASP.Net. Da ASP.Net toppede ville jeg hellere arbejde med Ruby On Rails, og i de sidste år hvor Rails er stormet frem, har jeg primært brugt min tid på at passe mine unger og tage en meritlærer-uddannelse.

Så der er en hel del ting jeg skal have fulgt op på med hensyn til Rails. Heldigvis er der næsten altid en god vejledning lige ved hånden.

Database integration er helt sikker en af de ting som jeg skal have fulgt op på for at få en bedre forståelse for hvordan man gør det bedst med Rails i år 2010.

Næste skridt er at jeg vil prøve at lave en Facebook applikation på Google :-)


Del

Posted in , ,  | Tags , ,  | 1 comment

Google konkurent i Århus

Posted by Anders Carlsen Sat, 12 Jul 2008 00:48:00 GMT

Svendborgs lokale Google – Svendborg Web har fået en lillebror i form af Århus Web . Århus Web er en opdateret version til Rails 2.1.0 af koderne fra Svendborg Web.

Det er dejligt at have tid til at hygge kode lidt efter et år med studier hvor der ikke har været meget tid til den slags. Nu skal jeg blot have fyldt links i Århus nye lokale link index, så er vi klar til at tage kampen op mod Google.


Del

Posted in  | no comments

Billed Galleri

Posted by Anders Carlsen Mon, 09 Apr 2007 23:19:00 GMT

Så blev jeg omsider færdig med mit billedgalleri, lavet med Ruby On Rails

Det kan ses på adressen: http://1001line.dk/galleri/1


Del

Posted in ,  | Tags  | no comments

Camera Date og RMagick

Posted by Anders Carlsen Sun, 01 Apr 2007 21:59:00 GMT

Jeg er ved at skrive et Billed Galleri komponent i Ruby On Rails. Via Flickr er jeg blevet opmærksom på at digitale kameraer gemmer meta data om billeder i selve billedet.

Så jeg tænkte hvordan får man fat i de data med Rmagick. F.eks. kunne - Camera Date - det tidspunkt billedet er taget på være interesant at få med i min billed database. Det ville gøre det lettere for mig at udvælge f.eks. forårsbilleder, vinterbilleder, morgenbilleder eller aften billeder osv.

Så hvordan gør man det og kan man overhovedet gøre det?
Det lykkedes mig ikke at finde noget jeg kunne bruge i Rmagicks ellers så anvendelige dokumentation. Måske gemmer det sig et eller andet sted i teksten.

Det er ikke altid at dokumentationen til diverse Ruby libs er tilstrækkelige. Tilgengæld så er Ruby stadigt et så exklusivt sprog at det som regl lykkes en at finde et eller andet stykke kode som en anden har lagt ud på nettet, som man kan bruge.
Jeg fandt denne kode på Alexa Developers Corner

Og så er det jo ganske let at få fat i billedets metadata.

image = Magick::Image.read( "my_picture.jpg" ).first
      

  puts image["Exif:DateTime"]
  puts image["Exif:Make"]
  puts image["Exif:Model"]
  puts image["Exif:ExposureTime"]
  puts image["Exif:FocalLength"]

Jeg er ikke kommet helt til bunds i problemstillingen, for jeg kan se i Picassa at et billede også har et UID, men det kan jeg ikke umiddelbart få fat i.
Del

Posted in ,  | Tags ,  | no comments | no trackbacks

Page Caching i Ruby On Rails

Posted by Anders Carlsen Fri, 23 Mar 2007 20:10:00 GMT


Hvis du skal igang med at lave page caching i Ruby On Rails kan jeg anbefale at du starter med at læsse denne blogpost. Ruby on Rails Caching Tutorial
Caching i Ruby On Rails er lige så genialt skruet sammen som resten af webframworket.
Del

Posted in ,  | no comments

Howto Conver from Lat to UTM

Posted by Anders Carlsen Tue, 20 Mar 2007 11:56:00 GMT

Converting Latitude/Longitude to Universal Transverse Mercator (UTM)

Adresse koordinater. Hvis man anvender AWS webservicen og får hentet de koordinaterne til en adresse, kan man ikke umiddelbart bruge disse koordinater i Google Maps. Google Maps anvender et andet koordinatsystem kaldet UTM.

Hvis man ikke er geofysiker eller matamatik nørd kan konverteringen forekomme temmeligt uoverkommeligt
og dokumentation på området er vanskelig at finde hvis man ikke graver dybt i stoffe.

Men hvis man er så heldig at have adgang til en Linux Box er vejen til konvertering meget kort:

Der findes et perl libary som kan konverterer.
Så det skal jeg først installere:

apt-get install libgeo-coordinates-utm-perl

nu kan jeg lave et perl script og køre det i konsollen:

test.pl :
---------------------------------------------------
use Geo::Coordinates::UTM;
my($latitude,$longitude)=utm_to_latlon("WGS-84","32V",$ARGV[0],$ARGV[1]);
print "$latitude $longitude";
--------------------------------------------------------
> perl test.pl 719779.29 6174497.76

resultatet bliver udskrevet på skærmen.
Men hvordan får jeg det ind i min database med adresser uden at skulle igang med at lære perl?

Jeg laver et først et lille test ruby-script:
---------------------------------------------------
args = "719779.29 6174497.76"
a = `perl test.pl #{args }`
b = a.split
puts b[0]
puts b[1]
----------------------------------------------------------------

i ruby kan man køre system-kommadoer meget let. F.eks. `dir` i windows eller `ls` i linux
det som normalt skrive i konsollen lægges over i variablen a som jeg så konvertere til et array.

At håndtere MySql med Ruby er som at klø sig selv et hvis sted.
her er mit Ruby Script

convert_to_utm.rb
-------------------------------------------------------------------------------
require "mysql"
def getgeo(lo,la)
a = `perl test.pl #{lo} #{la}`
a.split
end

my = Mysql::new("localhost", "-my_username-", "-my_password-", "-my_database-")
res = my.query("select * from addresses")

res.each_hash do |row|
a = `perl test.pl #{row['easting']} #{row['northing']}`.split
sql = "update adresser set latitude = '#{a[0]}',longitude = '#{a[1]}' WHERE id = #{row["id"]}"
my.query(sql)
end

-----------------------------------------------------------------------------------


Wupti Google Maps here we come

Både perl og ruby køre fint på windows. Så har du ikke en Linux box kan du sagtens bruge eksemplet alligevel.
Det er bare så dejligt let at installerer libaries med debian/linux.
Del

Posted in , ,  | Tags  | no comments

Pretty Urls med RoR

Posted by Anders Carlsen Wed, 14 Mar 2007 09:06:00 GMT


Pæne url'er.
Jo de er pænere at se på, men først og fremmest er de lettere at læse og tyde. Hvis man ikke ligefrem er autist har de fleste lettere ved få mening ud af f.eks /musik_dansesteder end category_id=260 , hvis man er ved at analysere statestik fra ens website. Andre folk som besøger ens website bliver ubevidst utrygge ved lange query strings.


Med Ruby On Rails er det meget let at håndterer sine Url'er så de bliver pæne.
Jeg har for nyligt lagt en database med danske folkekirker på nettet.
Kirkerne er delt op i de nye kommunale regioner. Regionerne er delt op i kommuner og endeligt er der så sidste led med kirkerne. I det konkrete eksempel har jeg ikke haft brug for det sidste led, men ellers ville URLen have set sådan ud uden pretty urls.

http://1001line.dk/kirker?region=syd_danmark&kommune=svendborg_kommune&kirke=egense_kirke
istedet for kommer den til at se sådan her ud:
http://1001line.dk/kirker/syddanmark/svendborg/egense_kirke

I begge tilfælde vil alle queries blive håndteret fra den samme fil (kirker).
Men med Ruby On Rails' ruting er det meget enkelt at konfigurere min web applikation så at den sidste query bliver vist det rigtige sted hen.

Konfigurationen ser sådan ud:

map.connect 'kirker/:region/:kommune',
:controller => 'kirker',
:action => 'index',
:region => /.*/,
:kommune => /.*/

På den måde bliver region tilgængelig som param[:region]

Del

Posted in ,  | no comments

News Feeds med Ruby

Posted by Anders Carlsen Fri, 09 Mar 2007 18:46:00 GMT

Jeg ønskede at lave nyheder med RSS på min lokal hjemmeside Svendborg Web
Rss er meget let at arbejde med når man bruger Ruby
En to tre .. så er der  nyheder på min hjemmeside.

Eneste problem jeg stødte på, fordi jeg stadigt har meget at lære om Ruby, var at jeg ønskede at
sortere nyhederne fra forskellige kilder efter dato og tid.
sådan : items.sort{ |x, y| y.pubDate <=> x.pubDate}



-----------------------------------------------------------------------------------
require 'open-uri'
require 'rss/2.0'
require 'rss/parser'

def getFeeds(url,key_word)    
  items = []
  rss = RSS::Parser.parse(open(url))
  rss.items.each do |item|
      if item.category.to_s.index(key_word) or item.description.to_s.index(key_word) or item.title.to_s.index(key_word) then
          items << item
      end
  end
  items
end

rss_feeds = ["http://www.tv2fyn.dk/rss",
                  "http://www.dr.dk/regioner/fyn/newsfeed/rss",
                  "http://www.jp.dk/rss_indland/",
                  "http://www.fyens.dk/rss.xml"]
items = []
rss_feeds.each{|feed| items.concat(getFeeds(feed,"Svendborg"))}
a = items.sort{ |x, y| y.pubDate <=> x.pubDate}
  
html = "<ul id=\"news_feeds\">"      
a.each do |item|
      html << "<li>\n<h3><a href=\"#{item.link}\" target=\"_blank\">" +item.title + "</a></h3>\n"
      html << item.description + "<br />\n"
      html << "<span class=\"date\">" + item.pubDate.strftime("%H:%M %d %b %y") + "</span>\n"
      html << "</li>\n"
end

html << "</ul>"
File.open('news.html','w').write(html)



Her er ressultatet :

Del

Posted in ,  | no comments

Older posts: 1 2 3 4