i76 webdesign, Sittard

7 september 2010

Weblog Rubrieken

i76 webdesign, Sittard

Tom-Eric's Weblog

RubyWeb.nl

donderdag, 31 juli, 2008

Na een paar uur programmeren en content schrijven is gisteren RubyWeb gelanceerd, een Nederlandstalige nieuws en community website voor Ruby (en Rails) enthousiastelingen.

De website is een kopie van de engelse variant RubyFlow, maar het is de bedoeling de site uit te breiden zodat er meer met de Nederlandse Ruby community gedaan wordt. RubyWeb is tevens open source! Development is te volgen op Github

Wat is er mis met Google?

donderdag, 8 mei, 2008

Daan merkte gisteren al op dat google af en toe enkele seconden deed over een query. Vandaag begon de rest van i76 het ook te merken. Waar het door komt en of het iets betekent weten we niet, maar het is op z’n minst noemenswaardig.

Dezelfde query een tweede keer uitvoeren zorgt wel voor een snel resultaat, omdat Google dit dan gecached heeft.

Een query voor “Pagerank 9″ kost bijna 7 seconden
Een query voor “screenshot mac” kost ruim 7 seconden

Als je op de laatste thumbnail klikt en je kijkt rechtsonder, dan zie je zelfs dat de totale laadtijd ruim 12 seconden is!

Google code fragmenten in zoekresultaten

donderdag, 3 april, 2008

Ik zocht vandaag naar informatie over vCard’s, in verband met microformats, toen ik door mijn zoekresultaten code fragmenten zag uit google codesearch.

Zoekresultaten
Zoekresultaten van google op het woord 'vcard'

Volgens mij is dit nieuw, en het is wel interessant dat google nu ook informatie waar ‘normale’ gebruikers weinig aan hebben door hun zoekresultaten mengt.

Nieuw kantoor #1

donderdag, 6 maart, 2008

Begin dit jaar hebben we kantoorruimte in Sittard gekocht. Binnenkort gaat de aannemer aan de slag, en als alles goed is kunnen we in juni verhuizen.

Hier alvast de eerste foto’s van de ruimte voor de grote verbouwing:

Begane grond
Foto van de onverbouwde begane grond
Eerste verdieping
Foto van de onverbouwde eerste verdieping
Google SketchUp design van begane grond
Google SketchUp design van de begane grond

We zijn van plan om regelmatig foto’s te plaatsen en de voortgang ook bij te houden op ons blog.

Internet Explorer 8 Bèta 1 ervaringen

donderdag, 6 maart, 2008

Microsoft heeft gisteren de eerste IE8 bèta vrijgegeven, de eerste versie van IE die zich echt aan de standaarden zou moeten houden, dankzij de nieuwe super standards mode (zelfs <abbr /> doet het nu!).

Net als bij IE7 was ik in eerste instantie enthousiast, omdat een betere ondersteuning voor standaarden ons over enkele jaren, wanneer IE6 & 7 niet meer gebruikt worden, een hoop werk en frustratie zal sparen. Helaas levert deze eerste bèta tot nu toe alleen maar frustratie op!

Veel grote sites hebben kleine rendering bugs die je in andere browsers, die pretenderen de standaarden te volgen, niet ziet. Sites die gebruik maken van Google Maps (zoals onze eigen eet.nu en gitaar.nu) hebben echter grotere problemen. Ook heb ik in een half uur tijd al 3 crashes meegemaakt. YouTube is bij mij zelfs volledig ontoegankelijk, omdat de browser blijft crashen op het moment dat ik inlog.

Het blijft natuurlijk een bèta, dus hopelijk worden dit soort ergernissen op tijd geerpareerd. Zo niet, dan zie ik helaas in de toekomst weer vele uurtjes verdwijnen in het schrijven van CSS voor IE8. Iets dat nou juist voorkomen zou moeten worden met deze versie.

Het downloaden van video’s via KeepVid met ruby

vrijdag, 12 oktober, 2007

Voor sites zoals gitaar.nu, is het handig als je een backup van de geëmbedde video’s die je toevoegt hebt. Het zou natuurlijk zomaar kunnen dat er door YouTube in één keer alle video’s van een gebruiker verwijderd worden, waar misschien net die paar video’s bij zaten die jij op je site had staan. Met je eigen backup kan je deze dan later weer toevoegen.

Om deze video’s te downloaden, moet je natuurlijk eerst weten waar de video staat. Elke provider doet dit weer anders, dus dit zelf programmeren zou veel tijd kosten. De site KeepVid, genereert download links van een heleboel video sites, waaronder YouTube, Google Video en Metacafe. Met behulp van Hpricot heb je zoiets redelijk snel gerealiseerd. Hieronder een voorbeeld:

def keepvid_uri(movie_url)
  # Eerst parsen we het formulier op keepvid om erachter te komen waar we
  # naar moeten posten
  uri = URI(Hpricot(URI('http://keepvid.com/').read).at('form')['action'])

  # Open een HTTP connectie
  Net::HTTP.start(uri.host, uri.port) do |http|
    # doe een POST request met de goede argumenten
    doc = Hpricot(http.post(uri.path, "url=#{movie_url}&site=aa").body)

    # Vind het anchor (a) element met de download link en return hem
    anchor = (doc/:a).find{ |a| a.to_s =~ /Download Link/ and
                                a.next_node.to_s =~ /flv/ }

    return URI(anchor['href']) if anchor
  end
end

Alhoewel bovenstaande oplossing prima werkt, is het natuurlijk afhankelijk van de HTML die KeepVid aanlevert. Aangezien dit bij bijvoorbeeld een redesign kan veranderen, zou ik dit soort dingen liever via een API doen. Helaas heb ik deze nog niet kunnen vinden op het web.

SEO Quiz

woensdag, 12 september, 2007

Ik kwam tijdens het surfen op het internet de SEO Quiz tegen, met een erg uitgebreide vragenlijst en na afloop van je quiz krijg je heldere antwoorden waarin uitgelegd wordt waarom je antwoord goed of fout is. Ik heb er in ieder geval een paar nieuwe dingen van geleerd!

Association Extensions in Ruby on Rails

donderdag, 6 september, 2007

Dit is een vertaling en uitbreiding van mijn orginele artikel, over association extensions in RoR.

Stel je bent een model aan het maken, en je wilt graag je messages koppelen aan je user. Dat is natuurlijk heel makkelijk in Ruby on Rails:

class User < ActiveRecord::Base
  has_many :messages
end

Vervolgens kan je op eenvoudige manier de berichten van een gebruiker benaderen. Alles wat nodig is is het vinden van de user en daarna kan je ze direct aanroepen om er leuke dingen mee te doen. Bijvoorbeeld het weergeven van de hoeveelheid berichten die een gebruiker heeft:

>> user = User.find :first
=> #<User:0xb715586c @attributes={"nickname"=>"tomeric", "id"=>"1", "first_name"=>"Tom-Eric", "last_name"=>"Gerritsen"}>
>> user.messages.length
=> 7

Maar nu heeft een gebruiker ongelezen berichten, en je wilt graag weten hoeveel dat er zijn. Je kan natuurlijk hier naar gaan zoeken:

>> user.messages.find(:conditions => 'unread = 1').length
=> 3

Of je kan een nieuwe relatie aanleggen:

class User < ActiveRecord::Base
  has_many :messages
  has_many :unread_messages, :conditions => 'unread = 1'
end

Zodat je nu met user.unread_messages.length de hoeveelheid ongelezen berichten kan opvragen, maar er is een nettere manier, namelijk met association extensions (documentatie op de Associations documentatie pagina).

Een passend voorbeeld van hoe je code er dan uit zou zien:

class User < ActiveRecord::Base
  has_many :messages do
    def unread(reload = false)
      @unread_messages = nil if reload
      @unread_messages ||= find(:all, :conditions => ‘unread is 1′)
    end
  end
end

Nu kan je de hoeveelheid ongelezen berichten opvragen met behulp van deze association extension; user.messages.unread.length. Het oogt meteen veel netter!

Rails, Apache, Mongrel en mod_proxy configureren

donderdag, 6 september, 2007

De titel lijkt nikszeggend, maar probeer maar eens een pakkende titel te vinden die in het kort samenvat dat je artikel gaat over het hosten van Ruby on Rails applicaties op mongrel, gebruik makend van Apache en mod_proxy voor het serveren van je statische content (zoals afbeeldingen, scripts en stylesheets). Op dit moment een van de beste manieren om RoR applicaties te hosten.

Er komt namelijk een tijd dat je je prachtige web applicatie online wilt plaatsen, en alhoewel er meer dan genoeg providers zijn die RoR hosting aanbieden, is het natuurlijk veel leuker om het zelf te doen!

Allereerst een lijstje van dingen die je nodig hebt:

Aangezien het installeren van deze packages op elk OS anders is, gaan we hier niet te diep op in. Wij draaien zelf debian stable op onze servers, en hebben Apache en mod_proxy via apt-get geinstalleerd, mongrel en mongrel_cluster hebben we echter via Ruby Gems geinstalleerd.

Nu komt het leuke gedeelte, het configureren van je server!

Laten we eerst een mongrel configuratie bestand genereren. We gaan in onze voorbeelden even uit van een voorbeeld rails applicatie die we webwinkel noemen.

$ cd /home/webwinkel
$ mongrel_rails cluster::configure -e production -p 5000 -N 1
   -c /home/webwinkel -a 127.0.0.1

Wat doet het mongrel_rails cluster::configure gedeelte precies? En wat betekenen de argumenten die we meegeven?

Als het goed is hebben we nu in /home/webwinkel/config een bestand staan dat mongrel_cluster.yml heet. Aangezien we straks het liefste al onze rails applicaties tegelijk opstarten, gaan we hiervoor een startup script schrijven. Hiervoor willen we alle configuratie bestanden het liefste op 1 centrale plek. Wat ik persoonlijk de makkelijkste oplossing vind is een directory /etc/mongrel_cluster te maken, en onze configuratie bestanden hier in te symlinken.

$ mkdir /etc/mongrel_cluster
$ ln -s /home/webwinkel/config/mongrel_cluster.yml
   /etc/mongrel_cluster/webwinkel.yml

Nu nog een script dat hier gebruik van maakt. Ik heb dit in /etc/init.d/mongrel_cluster staan:

#!/bin/bash

CONF_DIR=/etc/mongrel_cluster
RETVAL=0

case "$1" in
    start)
      mongrel_cluster_ctl start -c $CONF_DIR
      RETVAL=$?
  ;;
    stop)
      mongrel_cluster_ctl stop -c $CONF_DIR
      RETVAL=$?
  ;;
    restart)
      mongrel_cluster_ctl restart -c $CONF_DIR
      RETVAL=$?
  ;;
    *)
      echo "Usage: mongrel_cluster {start|stop|restart}"
      exit 1
  ;;
esac

exit $RETVAL

Nu kan ik door /etc/init.d/mongrel_cluster start aan te roepen, al mijn mongrel servers starten!

Aangezien mongrel een fijne webserver is voor rails applicaties, maar niet zo heel snel is in het serveren van statische content (afbeeldingen, scripts, stylesheets, ed.), gaan we nu Apache zo configureren, dat deze alle aanroepen naar statische content behandeld, en de resterende aanroepen doorsluist naar mongrel.

Open het bestand waar je je virtual host in configureert (in debian bijvoorbeeld /etc/apache2/sites-enabled/webwinkel.i76.nl), en voeg, uiteraard aangepast naar eigen instellingen, onderstaande tekst toe:

<VirtualHost *:80>
  ServerName webwinkel.i76.nl

  DocumentRoot /home/webwinkel/public/

  <Directory /home/webwinkel/public/>
    Options +FollowSymlinks
    AllowOverride None
    Order allow,deny
    Allow from all
  </Directory>

  ProxyRequests Off
  ProxyPass / http://127.0.0.1:5000/
  ProxyPassReverse / http://127.0.0.1:5000/
  ProxyPreserveHost On

  # Voor statische files
  RewriteRule "^/(images|stylesheets|javascripts)/?(.*)" "$0" [L]
  # Als een pagina gecached is, vraag die dan op
  RewriteRule ^([^.]+)$ $1.html [QSA]
  # Anders dan ...
  RewriteCond %{REQUEST_FILENAME} !-f
  # Sturen we het door naar onze mongrel
  RewriteRule "^/(.*)" "http://localhost:5000/$1" [P,QSA,L]
</VirtualHost>

Een herstart van Apache 2 later, en alles werkt precies zoals je het wilt. Mocht je website zeer populair worden, dan heeft het zeker zin om te kijken naar mongrel cluster configuraties. Hieronder een aantal gerelateerde links:

i76 webdesign, Sittard
Tel 046 4007004
Fax 046 4009640
E-mail