i76 webdesign, Sittard
Tom-Eric's Weblog
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
Geplaatst in Ruby |
Geen reacties »
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!
Geplaatst in SEO |
1 reactie »
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

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.
Geplaatst in SEO |
1 reactie »
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

- Eerste verdieping

- Google SketchUp design van begane grond

We zijn van plan om regelmatig foto’s te plaatsen en de voortgang ook bij te houden op ons blog.
Geplaatst in Algemeen |
Geen reacties »
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.
Geplaatst in Browsers |
Geen reacties »
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.
Geplaatst in Ruby |
Geen reacties »
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!
Geplaatst in SEO |
Geen reacties »
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!
Geplaatst in Ruby on Rails |
Geen reacties »
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?
-e : Geeft de environment aan. in rails zijn dit development, production en testing. In principe wil je alle applicaties die via apache draaien als production laten draaien, aangezien je je development meestal met Webrick doet.
-p : Geeft de start poort aan van mongrel server aan. In ons geval starten we met poort 5000. Je moet er natuurlijk wel voor zorgen dat er geen andere applicaties zijn die deze poort gebruiken!
-N : Geeft aan hoeveel servers je wilt starten. We willen nu maar 1 server gebruiken, omdat we nog niet verwachten dat onze webwinkel veel bezoek gaat trekken. Niet dat we pessimistisch zijn, maar je wilt natuurlijk ook niet dat al je beschikbare geheugen opgaat aan niet gebruikte mongrel processen!
-c : De directory waar de rails applicatie zich bevind. In ons geval is dit dus /home/webwinkel.
-a : Het IP adres waar de mongrel server zich aan bindt. We zetten dit op 127.0.0.1, zodat het alleen lokaal beschikbaar is.
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:
Geplaatst in Ruby on Rails |
2 reacties »