Google en zijn rekentalent

Computers rekenen in binaire getallen, dat is geen geheim voor de “normale” bezoeker van deze blog. Op het IRC kanaal #sitemasters werkt er een bot die voor ons kan rekenen. Eigenlijk gebruikt de bot de rekenmachine die gebouwd is in de google search functie. Waarom vertel ik dit nu? Een HDD wordt meestal gelabelt als zoveel GB of TB maar dat is niet de exacte grootte van je schijf. GB = gigabyte en giga is 10^6 en dat betekent dus dat je 1 miljoen bytes zou hebben. In werkelijkheid is schijf iets minder groot. Een 750GB schijf is 698GiB want 750*1000³ = 698*1024³.

Het grappige is dat Google, de heer en meester van het internet, het bedrijf met de “beste” engineers, hier serieus een fout tegen maakt. Google zegt namelijk dat GB gelijk is aan GiB! Best zielig voor de ingenieurs die dit gemaakt hebben ^^.

google_gb_gib

Zend Framework: relaties tussen je tabellen

Gisteren kreeg ik een vraag op IRC hoe je de naam van een categorie kan selecteren van een nieuwsbericht. Het probleem is dus, hoe leg ik een relatie tussen verschillende models en hoe vraag ik de gegevens ervan op? Laten we veronderstellen dat we een tabel news hebben en een tabel categories. De structuur ziet er als volgende uit.

CREATE TABLE `categories` (
`id` int(11) NOT NULL auto_increment,
`naam` varchar(50) NOT NULL,
PRIMARY KEY  (`id`)
);

CREATE TABLE `news` (
`id` tinyint(4) NOT NULL auto_increment,
`titel` varchar(255) NOT NULL,
`categorie` int(11) NOT NULL,
PRIMARY KEY  (`id`),
KEY `categorie` (`categorie`)
);

ALTER TABLE `news` ADD CONSTRAINT `nieuws_ibfk_1` FOREIGN KEY (`categories`) REFERENCES `categories` (`id`);

Dit is de structuur van je tabel. In PHP ziet ons model er als volgt uit.

class News extends Zend_Db_Table {
protected $_name = ‘news’;
}

class Categories extends Zend_Db_Table {
protected $_name = ‘categories’;
}

Dit ziet er in orde uit maar wat als ik nu een artikel wil weergeven en daaronder de naam van zijn categorie wil plaatsen.  Je kan natuurlijk de twee modellen oproepen en dan twee fetch instructies doen, zoals hieronder staat.

public function indexAction()
{
$nieuws = new News();
$categorie = new Categories();
$artikel = $nieuws->fetchRow(“id=1”);
$categorie = $artikel->fetchRow(“id=” . $artikel->categorie);
}

Je hebt nu wel de correcte informatie maar je relatie tussen je models zit niet goed. Als ik nu alle nieuwsberichten wil van één categorie, kan me dit behoorlijk wat werk geven. Ook zijn er verschillende soorten relaties. Daarom leg een relatie tussen je models. Hoe beginnen we eraan? In het ene model moet de relatie komen en de andere model moet weten welk model er van hem afhangt. De model News heeft een kolom catgorie die wijst naar Categorie en kolom id. Dus de waarde van News.categorie is een referentie/verwijst naar Categorie.id, dus we defineren de relatie in onze model News.  Dit betekent ook dat onze model News afhankelijk is van de model Categories. Onze models code ziet er als volgt uit (mijn excuses voor het gebrek aan tabs, quotes verwijdert die).

class News extends Zend_Db_Table {
protected $_name = ‘news’;

protected $_referenceMap = array(
‘Categorie’ => array(
‘columns’ => ‘categorie’,
‘refTableClass’ => ‘Categories’,
‘refTableColumn’ => ‘id’
)
);

}

class Categories extends Zend_Db_Table {
protected $_name = ‘categories’;

protected $_dependentTables = array(‘News’);

}

In de referenceMap komt een relatie identifier en die wijst naar de relatie tussen de kolommen. De relatie spreekt voor zich. In de dependentTables zet je een array met de model(s) die afhankelijk zijn.

Je kan nu je indexAction je code als volgt schrijven.

public function indexAction()
{
$nieuws = new News();
$artikel = $nieuws->fetchRow(“id=1”);
$categorie = $artikel->findParentRow(‘Categorie’);
}

Niet moeilijk te implementeren en vooral handig als je Zend Framework gebruikt! Meer informatie over relations.

JavaFX, een begin…

Een maand of twee terug las ik over JavaFX. Dit is een platform van Sun om RIA te ontwikkelen op meerdere platformen (computer, browser, Tv en mobiele toestelen). Het leuke is dat je één keer je code geschreven hebt, je applicatie kan draaien op al deze platformen. Na een tijd zag ik terug een link naar JavaFX en ben ik eens aan de slag gegaan. De tutorials vorderen goed die op Sun.com staan en er is genoeg ondersteuning voor foutmeldingen. Daarnaast is het handig om te weten dat er een Eclipse plugin bestaat, dus boe! aan Netbeans! (Jammer genoeg ondersteunt de plugin enkel versie 1.0.1 terwijl 1.1 al uit is, hopelijk is dat snel gefixed).

Enfin om van me gelul af te zijn, plaats ik nog eventjes een Stack code in JavaFx script geschreven met bijhorende output.

http://pastebin.com/f1e04443f

Pop 1: 5
Pop 2: 4
Stack size: 1

Owja, als lezer (en vooral mezelf) kan je je afvragen waarom je Java zelf nog zou gebruiken? Ik kan hier niet echt een duidelijk antwoord opgeven omdat JavaFX Java is maar draait op meerdere platformen, dus je vergroot je publiek. Ik zou enkel nog Java gebruiken als het echt om software gaat dat specifiek bedoelt is voor de computer en/of server.