Donker Netbeans theme (optimaal voor PHP)

Iedereen heeft zo zijn eigen wensen hoe een IDE eruit moet zien qua font, kleurgebruik etc. Sinds ik overgestapt ben op Netbeans moet ik zeggen dat het tweaken van de kleuren wel erg makkelijk geworden is. Met als basis een kleurthema wat ik van één van de collega’s op kantoor gekregen had ben ik verder gaan tweaken. Nu, na een ruime maand gebruik, durf ik wel te zeggen dat mijn theme klaar is voor de grote wereld.

Natuurlijk zitten er altijd nog wat kleine scenario’s in de kleurconfiguratie die je vooraf niet had voorzien maar bij standaard gebruik in PHP, CSS, XHTML, XML en INI’s gedraagt het zich prima. Hier wat screenshots van de verschillende weergaves:

PHP

INI

CSS

(X)HTML

Zelf testen? Download hier dit Netbeans theme

dark_netbeans_theme.zip

ps. Wellicht overbodig maar: maak even een backup van je huidige theme’s voor het geval mijn export dingen overschrijft die je graag had behouden


APC cache en Zend Server CE

Als je op je Zend Server CE kijkt in de extensions lijst zoals die default ingesteld staan zou je vermoeden dan APC erop draait.

Dit blijkt echter niet geheel het geval als je de php.ini bekijkt. De versie die erop staat lijkt een soort port te zijn naar de cache engine van Zend Server zelf. Niet alle commando’s die normaal in APC beschikbaar zijn werken etc.

APC installeren
Paul Kiddie heeft op zijn weblog al redelijk goed uitgezocht hij hij dit kon doen ten behoeve van een file upload progress bar.

  • Ga naar http://downloads.php.net/pierre/
  • Zoek de juiste versie van APC caching die bij je systeem past. In mijn geval was dit php_apc-3.1.5-5.3-nts-vc9-x86.zip (APC versie 3.1.5 voor PHP 5.3, Non-Threading Safe VC9 versie)
  • Plaats php_apc.dll in je zendServer map \lib\phpext\
  • Pas je php.ini (zendServer map \etc\) aan en voeg onderin bij de extensions extension=php_apc.dll toe.
  • Restart je PHP engine en klaar

Als het goed is bevat je phpinfo nu het APC configuratie deel:

Kanttekening

Je PHP log bevat nu een warning.

[20-Nov-2010 15:31:48] PHP Warning:  Module 'apc' already loaded in Unknown on line 0

Dit heeft te maken met de “APC” zoals Zend Server die zelf laadt. Je nu toegevoegde extension botst daar licht mee. Heb wel gekeken naar de opties maar heb nog geen oplossing. De APC request die Zend Server al doet voor je eigen extensies komt mee uit een kant-en-klare extension-dll van Zend Server. Als je hem via de Zend Server configuratietool disabled gooit hij ook gelijk je zelf toegevoegde APC extensie uit de php.ini. Zet je de eigen extension regel er dan weer in dan zet hij ook gelijk die van Zend Server weer aan op één of andere manier.

Update 23 november @ 22:05

We hadden het er vandaag op kantoor nog eens over en Pieter (thnx!) kwam met een briljant idee. Hij kon zich namelijk herinneren ergens in de configs van ZendServer ook nog een file tegengekomen te zijn waarin de oorzaak mogelijk stond.

Hierbij dus alsnog de oplossing voor deze error:

In ZendServer/etc/cfg staat het bestand datacache.ini. Hierin staat:

; When enabled, the Data Cache extension registers APC compatibility methods
zend_datacache.apc_compatibility=1

Als je die parameter op 0 zet ben je er. Op zich ook een erg logische regel om op 0 te zetten als je hem zo leest.

Online favicon.ico maken in 3-stappen

Voorbeel van een favicon

Voorbeeld van een favicon in actie

Laat uw website opvallen tussen andere websites met behulp van een favicon. Dit icoontje van 16 x 16 word door de meeste browsers in de adresbalk getoond en maakt het mogelijk uw website op te laten vallen tussen de overige tabbladen. Ook in de bladwijzers en favorieten word het favicon gebruikt.

Het maken van een favicon is in 3-stappen gedaan:

  1. Maak een plaatje van 16 x 16 pixels en sla deze op als .png, .gif, .jpg of .bmp
    (.png en .gif mogen ook transparant zijn)
  2. Ga naar www.dynamicdrive.com, upload uw bestand en klik op create icon
  3. Download uw favicon en sla deze op als favicon.ico

Als dit is gelukt hoeft u de favicon alleen nog op uw website te plaatsen. Om dit te doen doorloopt u de volgende 2-stappen. Het enige wat u hier voor nodig heeft is toegang tot de bestanden van uw website (FTP en een beetje kennis van HTML. Toevoegen van uw favicon gaat als volgt:

  1. Voeg de hieronder staande HTML code toe aan de code van uw website, doe dit tussen de <head> en </head> in uw broncode
    <link rel=”shortcut icon” href=”/favicon.ico”>
  2. Upload vervolgens de favicon.ico in de zelfde map als uw pagina.

Wanneer dit gelukt is zou de favicon moeten werken. Het kan zijn dat u de favicon niet direct ziet, start dan uw browser opnieuw of leeg uw cache.

PHP & AJAX met Jquery tutorial

Recent hadden voor een project een creatieve oplossing gemaakt om bepaalde velden in het CMS standaard te “locken” en alleen mensen met een bepaalde user-role mochten de velden unlocken en bewerken. Denk hierbij aan velden als permanames. Omdat dit meer een stukje bescherming van gebruikers dan een echte security kwestie was (in dit geval) leek het ons wel leuk dit met een eenvoudige AJAX call te doen. Met Jquery zijn dit soort opties binnen het handbereik van iedere developer gekomen.

Erover nadenkend hoe lastig dit vroeger was en hoe leuk het nu was realiseerde ik me dat het misschien voor sommige mensen nog niet zo voor de hand liggend was. Daarom deze “super recht toe recht aan” tutorial / voorbeeldcode hoe je een simpele AJAX call naar een PHP script doet vanuit je HTML en het resultaat teruggooit naar de HTML.

De HTML code












Jquery AJAX call example

Klik op een woord hieronder om het resultaat van dat woord op te halen via AJAX en terug te geven als result.

  • Appels
  • Peren
  • Bananen
  • Kersen
  • Pinguins
<< empty >>

De PHP code

$fruits = array('Appels', 'Peren', 'Bananen', 'Kersen');

if(in_array($_POST['ajaxableVar'], $fruits)){
	echo 'Eet veel ' . $_POST['ajaxableVar'] . ' dat is gezond!';
	return;
}

echo $_POST['ajaxableVar'] . ' kun je niet eten!';
return;

Ditzelfde principe kun je ook neerzetten met JSON zodat je bijvoorbeeld een boolean terug kunt geven aan je Jquery code om bepaalde acties wel / niet uit te voeren. Eigenlijk zijn de mogelijkheden redelijk ruim.

* Let op! Het voorbeeld is ZEER basic en vereist wel enige configuratie en mutaties om hem veilig te maken voor je website maar als voorbeeld van het principe dekt het de lading prima.

Download hier de bestanden als .rar

DD_roundies ronden hoeken in alle browsers

Nu CSS3 steeds meer als mogelijkheid wordt gezien en de opties voor ronde hoeken door de verschillende browsers ondersteund worden gaat dit interessant worden. Echter niet alle browsers ondersteunen ronde hoeken en de tags om ze toe te passen wijken nog af omdat ze voorafgegaan worden door “browser unieke” tags zoals -moz en -webkit.

Op zich is hier nog omheen te komen maar IE6, IE7 en IE8 doen helemaal nog niet mee. Nu zijn er flinke hoeveelheden oplossingen met o.a. Jquery (altijd een goed verkoopargument) om de ronde hoeken overal werkend te krijgen. Echter heb ik een enorm enthousiast gevoel bij de oplossing van Drew Diller.

Wij waren al bekend met zijn werk rondom één van de leukere PNG fixes voor Internet Explorer, DD belated PNG.

Nu heeft Drew Diller ook een prachtige fix gemaakt voor ronde hoeken welke je, in het kort, op twee manieren kunt toepassen;

Als aanvulling op je CSS3 code voor ronde hoeken in IE



Als enige bron van ronde hoeken in je code

Met de 3e parameter op true geef je opdracht om alle browsers van ronde hoeken te voorzien. DD roundies kijkt zelf welke syntax er nodig is voor je browser.



Download hier DD roundies en lees ook de volledige documentatie over de mogelijkheden (het is namelijk ook mogelijk met DD roundies ook gelijk DD belated te initiëren).

Jquery Nivo Slider

In een recent project heb ik gebruik gemaakt van de Nivo Slider. Een prettige slider die redelijk snel implementeert en vanuit de basis over een goede set functies beschikt.

Nu wilde onze opdrachtgever dat de slideshow alleen één afbeelding naar voren ging als je met je muis over de slideshow ging wat anders was dan we vooraf dachten (anders was de Nivo Slider er waarschijnlijk niet in gekomen). Al snel concludeerde ik dat de Nivo Slider dit niet ondersteunde. Ik heb toen de code iets aangepast. Je kunt nu een extra parameter meegeven aan de Nivo Slider settings;

nextOnHover: true

De volledige implementatie ziet er dan als volgt uit;

public.js

$('#topping_slider').nivoSlider({
	effect:'fade',
	animSpeed:200,
	directionNav:false,
	controlNav:false,
	keyboardNav:false,
	pauseOnHover:false,
	manualAdvance:true,
	captionOpacity:0.8,
	nextOnHover:true
});

jquery.nivo.slider.js

/*
 * jQuery Nivo Slider v2.1
 * http://nivo.dev7studios.com
 *
 * Copyright 2010, Gilbert Pellegrom
 * Free to use and abuse under the MIT license.
 * http://www.opensource.org/licenses/mit-license.php
 *
 * May 2010 - Pick random effect from specified set of effects by toronegro
 * May 2010 - controlNavThumbsFromRel option added by nerd-sh
 * May 2010 - Do not start nivoRun timer if there is only 1 slide by msielski
 * April 2010 - controlNavThumbs option added by Jamie Thompson (http://jamiethompson.co.uk)
 * March 2010 - manualAdvance option added by HelloPablo (http://hellopablo.co.uk)
 */

(function($) {

	$.fn.nivoSlider = function(options) {

		//Defaults are below
		var settings = $.extend({}, $.fn.nivoSlider.defaults, options);

		return this.each(function() {
			//Useful variables. Play carefully.
			var vars = {
				currentSlide: 0,
				currentImage: '',
				totalSlides: 0,
				randAnim: '',
				running: false,
				paused: false,
				stop:false
			};

			//Get this slider
			var slider = $(this);
			slider.data('nivo:vars', vars);
			slider.css('position','relative');
			slider.addClass('nivoSlider');

			//Find our slider children
			var kids = slider.children();
			kids.each(function() {
				var child = $(this);
				var link = '';
				if(!child.is('img')){
					if(child.is('a')){
						child.addClass('nivo-imageLink');
						link = child;
					}
					child = child.find('img:first');
				}
				//Get img width & height
                var childWidth = child.width();
                if(childWidth == 0) childWidth = child.attr('width');
                var childHeight = child.height();
                if(childHeight == 0) childHeight = child.attr('height');
                //Resize the slider
                if(childWidth > slider.width()){
                    slider.width(childWidth);
                }
                if(childHeight > slider.height()){
                    slider.height(childHeight);
                }
                if(link != ''){
                    link.css('display','none');
                }
                child.css('display','none');
                vars.totalSlides++;
			});

			//Set startSlide
			if(settings.startSlide > 0){
				if(settings.startSlide >= vars.totalSlides) settings.startSlide = vars.totalSlides - 1;
				vars.currentSlide = settings.startSlide;
			}

			//Get initial image
			if($(kids[vars.currentSlide]).is('img')){
				vars.currentImage = $(kids[vars.currentSlide]);
			} else {
				vars.currentImage = $(kids[vars.currentSlide]).find('img:first');
			}

			//Show initial link
			if($(kids[vars.currentSlide]).is('a')){
				$(kids[vars.currentSlide]).css('display','block');
			}

			//Set first background
			slider.css('background','url('+ vars.currentImage.attr('src') +') no-repeat');

			//Add initial slices
			for(var i = 0; i < settings.slices; i++){
				var sliceWidth = Math.round(slider.width()/settings.slices);
				if(i == settings.slices-1){
					slider.append(
						$('
').css({ left:(sliceWidth*i)+'px', width:(slider.width()-(sliceWidth*i))+'px' }) ); } else { slider.append( $('
').css({ left:(sliceWidth*i)+'px', width:sliceWidth+'px' }) ); } } //Create caption slider.append( $('

').css({ display:'none', opacity:settings.captionOpacity }) ); //Process initial caption if(vars.currentImage.attr('title') != ''){ var title = vars.currentImage.attr('title'); if(title.substr(0,1) == '#') title = $(title).html(); $('.nivo-caption p', slider).html(title); $('.nivo-caption', slider).fadeIn(settings.animSpeed); } //In the words of Super Mario "let's a go!" var timer = 0; if(!settings.manualAdvance && kids.length > 1){ timer = setInterval(function(){ nivoRun(slider, kids, settings, false); }, settings.pauseTime); } //Add Direction nav if(settings.directionNav){ slider.append(''); //Hide Direction nav if(settings.directionNavHide){ $('.nivo-directionNav', slider).hide(); slider.hover(function(){ $('.nivo-directionNav', slider).show(); }, function(){ $('.nivo-directionNav', slider).hide(); }); } $('a.nivo-prevNav', slider).live('click', function(){ if(vars.running) return false; clearInterval(timer); timer = ''; vars.currentSlide-=2; nivoRun(slider, kids, settings, 'prev'); }); $('a.nivo-nextNav', slider).live('click', function(){ if(vars.running) return false; clearInterval(timer); timer = ''; nivoRun(slider, kids, settings, 'next'); }); } if(settings.nextOnHover){ $('#'+slider.attr('id')).live("mouseenter", function() { if(vars.running) return false; clearInterval(timer); timer = ''; nivoRun(slider, kids, settings, 'next'); }); } //Add Control nav if(settings.controlNav){ var nivoControl = $('
'); slider.append(nivoControl); for(var i = 0; i < kids.length; i++){ if(settings.controlNavThumbs){ var child = kids.eq(i); if(!child.is('img')){ child = child.find('img:first'); } if (settings.controlNavThumbsFromRel) { nivoControl.append(''); } else { nivoControl.append(''); } } else { nivoControl.append(''+ (i + 1) +''); } } //Set initial active link $('.nivo-controlNav a:eq('+ vars.currentSlide +')', slider).addClass('active'); $('.nivo-controlNav a', slider).live('click', function(){ if(vars.running) return false; if($(this).hasClass('active')) return false; clearInterval(timer); timer = ''; slider.css('background','url('+ vars.currentImage.attr('src') +') no-repeat'); vars.currentSlide = $(this).attr('rel') - 1; nivoRun(slider, kids, settings, 'control'); }); } //Keyboard Navigation if(settings.keyboardNav){ $(window).keypress(function(event){ //Left if(event.keyCode == '37'){ if(vars.running) return false; clearInterval(timer); timer = ''; vars.currentSlide-=2; nivoRun(slider, kids, settings, 'prev'); } //Right if(event.keyCode == '39'){ if(vars.running) return false; clearInterval(timer); timer = ''; nivoRun(slider, kids, settings, 'next'); } }); } //For pauseOnHover setting if(settings.pauseOnHover){ slider.hover(function(){ vars.paused = true; clearInterval(timer); timer = ''; }, function(){ vars.paused = false; //Restart the timer if(timer == '' && !settings.manualAdvance){ timer = setInterval(function(){ nivoRun(slider, kids, settings, false); }, settings.pauseTime); } }); } //Event when Animation finishes slider.bind('nivo:animFinished', function(){ vars.running = false; //Hide child links $(kids).each(function(){ if($(this).is('a')){ $(this).css('display','none'); } }); //Show current link if($(kids[vars.currentSlide]).is('a')){ $(kids[vars.currentSlide]).css('display','block'); } //Restart the timer if(timer == '' && !vars.paused && !settings.manualAdvance){ timer = setInterval(function(){ nivoRun(slider, kids, settings, false); }, settings.pauseTime); } //Trigger the afterChange callback settings.afterChange.call(this); }); }); function nivoRun(slider, kids, settings, nudge){ //Get our vars var vars = slider.data('nivo:vars'); if((!vars || vars.stop) && !nudge) return false; //Trigger the beforeChange callback settings.beforeChange.call(this); //Set current background before change if(!nudge){ slider.css('background','url('+ vars.currentImage.attr('src') +') no-repeat'); } else { if(nudge == 'prev'){ slider.css('background','url('+ vars.currentImage.attr('src') +') no-repeat'); } if(nudge == 'next'){ slider.css('background','url('+ vars.currentImage.attr('src') +') no-repeat'); } } vars.currentSlide++; if(vars.currentSlide == vars.totalSlides){ vars.currentSlide = 0; //Trigger the slideshowEnd callback settings.slideshowEnd.call(this); } if(vars.currentSlide < 0) vars.currentSlide = (vars.totalSlides - 1); //Set vars.currentImage if($(kids[vars.currentSlide]).is('img')){ vars.currentImage = $(kids[vars.currentSlide]); } else { vars.currentImage = $(kids[vars.currentSlide]).find('img:first'); } //Set acitve links if(settings.controlNav){ $('.nivo-controlNav a', slider).removeClass('active'); $('.nivo-controlNav a:eq('+ vars.currentSlide +')', slider).addClass('active'); } //Process caption if(vars.currentImage.attr('title') != ''){ var title = vars.currentImage.attr('title'); if(title.substr(0,1) == '#') title = $(title).html(); if($('.nivo-caption', slider).css('display') == 'block'){ $('.nivo-caption p', slider).fadeOut(settings.animSpeed, function(){ $(this).html(title); $(this).fadeIn(settings.animSpeed); }); } else { $('.nivo-caption p', slider).html(title); } $('.nivo-caption', slider).fadeIn(settings.animSpeed); } else { $('.nivo-caption', slider).fadeOut(settings.animSpeed); } //Set new slice backgrounds var i = 0; $('.nivo-slice', slider).each(function(){ var sliceWidth = Math.round(slider.width()/settings.slices); $(this).css({ height:'0px', opacity:'0', background: 'url('+ vars.currentImage.attr('src') +') no-repeat -'+ ((sliceWidth + (i * sliceWidth)) - sliceWidth) +'px 0%' }); i++; }); if(settings.effect == 'random'){ var anims = new Array("sliceDownRight","sliceDownLeft","sliceUpRight","sliceUpLeft","sliceUpDown","sliceUpDownLeft","fold","fade"); vars.randAnim = anims[Math.floor(Math.random()*(anims.length + 1))]; if(vars.randAnim == undefined) vars.randAnim = 'fade'; } //Run random effect from specified set (eg: effect:'fold,fade') if(settings.effect.indexOf(',') != -1){ var anims = settings.effect.split(','); vars.randAnim = $.trim(anims[Math.floor(Math.random()*anims.length)]); } //Run effects vars.running = true; if(settings.effect == 'sliceDown' || settings.effect == 'sliceDownRight' || vars.randAnim == 'sliceDownRight' || settings.effect == 'sliceDownLeft' || vars.randAnim == 'sliceDownLeft'){ var timeBuff = 0; var i = 0; var slices = $('.nivo-slice', slider); if(settings.effect == 'sliceDownLeft' || vars.randAnim == 'sliceDownLeft') slices = $('.nivo-slice', slider)._reverse(); slices.each(function(){ var slice = $(this); slice.css('top','0px'); if(i == settings.slices-1){ setTimeout(function(){ slice.animate({ height:'100%', opacity:'1.0' }, settings.animSpeed, '', function(){ slider.trigger('nivo:animFinished'); }); }, (100 + timeBuff)); } else { setTimeout(function(){ slice.animate({ height:'100%', opacity:'1.0' }, settings.animSpeed); }, (100 + timeBuff)); } timeBuff += 50; i++; }); } else if(settings.effect == 'sliceUp' || settings.effect == 'sliceUpRight' || vars.randAnim == 'sliceUpRight' || settings.effect == 'sliceUpLeft' || vars.randAnim == 'sliceUpLeft'){ var timeBuff = 0; var i = 0; var slices = $('.nivo-slice', slider); if(settings.effect == 'sliceUpLeft' || vars.randAnim == 'sliceUpLeft') slices = $('.nivo-slice', slider)._reverse(); slices.each(function(){ var slice = $(this); slice.css('bottom','0px'); if(i == settings.slices-1){ setTimeout(function(){ slice.animate({ height:'100%', opacity:'1.0' }, settings.animSpeed, '', function(){ slider.trigger('nivo:animFinished'); }); }, (100 + timeBuff)); } else { setTimeout(function(){ slice.animate({ height:'100%', opacity:'1.0' }, settings.animSpeed); }, (100 + timeBuff)); } timeBuff += 50; i++; }); } else if(settings.effect == 'sliceUpDown' || settings.effect == 'sliceUpDownRight' || vars.randAnim == 'sliceUpDown' || settings.effect == 'sliceUpDownLeft' || vars.randAnim == 'sliceUpDownLeft'){ var timeBuff = 0; var i = 0; var v = 0; var slices = $('.nivo-slice', slider); if(settings.effect == 'sliceUpDownLeft' || vars.randAnim == 'sliceUpDownLeft') slices = $('.nivo-slice', slider)._reverse(); slices.each(function(){ var slice = $(this); if(i == 0){ slice.css('top','0px'); i++; } else { slice.css('bottom','0px'); i = 0; } if(v == settings.slices-1){ setTimeout(function(){ slice.animate({ height:'100%', opacity:'1.0' }, settings.animSpeed, '', function(){ slider.trigger('nivo:animFinished'); }); }, (100 + timeBuff)); } else { setTimeout(function(){ slice.animate({ height:'100%', opacity:'1.0' }, settings.animSpeed); }, (100 + timeBuff)); } timeBuff += 50; v++; }); } else if(settings.effect == 'fold' || vars.randAnim == 'fold'){ var timeBuff = 0; var i = 0; $('.nivo-slice', slider).each(function(){ var slice = $(this); var origWidth = slice.width(); slice.css({ top:'0px', height:'100%', width:'0px' }); if(i == settings.slices-1){ setTimeout(function(){ slice.animate({ width:origWidth, opacity:'1.0' }, settings.animSpeed, '', function(){ slider.trigger('nivo:animFinished'); }); }, (100 + timeBuff)); } else { setTimeout(function(){ slice.animate({ width:origWidth, opacity:'1.0' }, settings.animSpeed); }, (100 + timeBuff)); } timeBuff += 50; i++; }); } else if(settings.effect == 'fade' || vars.randAnim == 'fade'){ var i = 0; $('.nivo-slice', slider).each(function(){ $(this).css('height','100%'); if(i == settings.slices-1){ $(this).animate({ opacity:'1.0' }, (settings.animSpeed*2), '', function(){ slider.trigger('nivo:animFinished'); }); } else { $(this).animate({ opacity:'1.0' }, (settings.animSpeed*2)); } i++; }); } } }; //Default settings $.fn.nivoSlider.defaults = { effect:'random', slices:15, animSpeed:500, pauseTime:3000, startSlide:0, directionNav:true, directionNavHide:true, controlNav:true, controlNavThumbs:false, controlNavThumbsFromRel:false, controlNavThumbsSearch:'.jpg', controlNavThumbsReplace:'_thumb.jpg', keyboardNav:true, pauseOnHover:true, manualAdvance:false, captionOpacity:0.8, beforeChange: function(){}, afterChange: function(){}, slideshowEnd: function(){}, nextOnHover: false }; $.fn._reverse = [].reverse; })(jQuery);

Regel 68 tot 75 zijn toegevoegd

Ga naar de website van de originele Nivo Slider

De beste software en tools voor PHP webdevelopment

Met de jaren bouw je een verzameling op met software waar je als developer prettig mee werkt. Van tools om het programmeren eenvoudiger te maken tot software om grafische zaken te doen.

Hieronder staat mijn lijst met favorites en een korte omschrijving waar ze voor dienen / wat deze software waardig maakt om in deze lijst te komen;

  • Netbeans
    Als serieus PHP developer moet je een goede IDE hebben en Netbeans is dit meer dan waardig.
    www.netbeans.org
  • MySQL workbench
    Voor het maken van gelikte database ontwerpen en deze inzichtelijk maken aan projectmanagers / opdrachtgevers.
    wb.mysql.com
  • Photoshop
    Hoort eigenlijk niet thuis in een lijst voor PHP developers maar zeker wel als webdeveloper om zo nu en dan een plaatje te snijden of een knopje te maken.
    http://www.adobe.com/nl/products/photoshop/photoshop/
  • Notepad2
    Naast Netbeans is het altijd handig een lightweight tooltje te hebben om even snel htaccess bestanden of conf files te bewerken. Ik vervang altijd zelf de notepad van windows met notepad2 zodat ik altijd syntax highlighting en regelnummers tot mijn beschikking heb.
  • http://www.flos-freeware.ch/notepad2.html
  • Filezilla
    Een goede en stabiele FTP tool.
    http://filezilla-project.org
  • Tortoise SVN
    Soms kom je er met je IDE gewoon niet goed uit als het gaat om SVN en dan is Tortoise de beste windows oplossing. Mooi is hij niet maar wel effectief.
    http://tortoisesvn.tigris.org/
  • WAMP of Zend Server
    Niets werkt zo lekker als lokaal. Snel, veilig en resultaat voor je F5 hebt kunnen drukken.
    http://www.wampserver.com/en/
    of
    http://www.zend.com/en/products/server-ce/
  • De browsers om te testen
    Test op dit moment met Safari, Firefox, Chrome, IE7, IE8, IE9 en op een Virtual PC met windows XP en IE6. Voor noodgevallen vragen we een Mac visie op zaken. Daarnaast spelen we natuurlijk wel eens met Adobe labs maar bovenstaande dekt aardig de lading.

Dit zijn wel een beetje de belangrijkste.Niet alle software mag op kantoor in productie gebruikt worden maar als ik thuis voor mezelf aan het rommelen ben mag dit vaak wel dus dan komt mijn goede ervaring daaruit voort.

Nu ik dit lijstje typ realiseer ik me dat ik ook best veel handige firefox plugins gebruik. Zal daarover binnenkort een keer iets schrijven.

http://wb.mysql.com/