<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Thinksheep</title>
	<atom:link href="http://www.thinksheep.nl/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.thinksheep.nl</link>
	<description></description>
	<lastBuildDate>Mon, 30 Jan 2012 11:14:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>javascript settimeout class method</title>
		<link>http://www.thinksheep.nl/javascript/javascript-settimeout-class-method/</link>
		<comments>http://www.thinksheep.nl/javascript/javascript-settimeout-class-method/#comments</comments>
		<pubDate>Wed, 14 Dec 2011 12:19:26 +0000</pubDate>
		<dc:creator>Willem</dc:creator>
				<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.thinksheep.nl/?p=350</guid>
		<description><![CDATA[Zo en weer een mond vol. Gelukkig stelt het dan weer niet zo heel veel voor maar ontzettend makkelijk om te weten. Als je een setTimeout in je javascript &#8220;class&#8221; wilt, en je wilt dat de uiteindelijke method die aangesproken van die ene class is, zal je dit truukje heel handig vinden. [javascript] this.timer = [...]]]></description>
			<content:encoded><![CDATA[<p>Zo en weer een mond vol. Gelukkig stelt het dan weer niet zo heel veel voor maar ontzettend makkelijk om te weten.<br />
Als je een setTimeout in je javascript &#8220;class&#8221; wilt, en je wilt dat de uiteindelijke method die aangesproken van die ene class is,<br />
zal je dit truukje heel handig vinden.</p>
<p><span id="more-350"></span></p>
<p>[javascript]<br />
this.timer = setTimeout(function(_this){<br />
	_this.method();<br />
}, 1500, this);<br />
[/javascript]</p>
<p>in de timeout function mag je een derde optionele parameter meegeven die uiteindelijk als parameter in je functie terecht komt!<br />
Zo kan je je class meegeven en de method uitvoeren binnenin je class</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thinksheep.nl/javascript/javascript-settimeout-class-method/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FTP protocol in PHP</title>
		<link>http://www.thinksheep.nl/php/ftp-protocol-in-php/</link>
		<comments>http://www.thinksheep.nl/php/ftp-protocol-in-php/#comments</comments>
		<pubDate>Fri, 25 Nov 2011 08:47:18 +0000</pubDate>
		<dc:creator>Willem</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.thinksheep.nl/?p=347</guid>
		<description><![CDATA[Daar zijn we weer, maar dit keer met een oud scriptje. Altijd leuk om oude dingen weer even op te rakelen. Dit script laat zien hoe je met een FTP server kan communiceren. Hier heb ik een aardig rfc&#8217;tje voor moeten doorspitten (niet helemaal, dat was echt teveel) [php]]]></description>
			<content:encoded><![CDATA[<p>Daar zijn we weer, maar dit keer met een oud scriptje. Altijd leuk om oude dingen weer even op te rakelen. Dit script laat zien<br />
hoe je met een FTP server kan communiceren. Hier heb ik een aardig <a href="http://www.faqs.org/rfcs/rfc959.html" target="_blank">rfc&#8217;tje</a> voor moeten doorspitten (niet helemaal, dat was echt teveel)</p>
<p><span id="more-347"></span><br />
[php]<br />
<?php</p>
<p>	class ftp<br />
	{</p>
<p>		private $host;<br />
		private $port;<br />
		private $username;<br />
		private $password;<br />
		private $passive;<br />
		private $socket;<br />
		private $CRLF = "\r\n";<br />
		private $list = '';</p>
<p>		public function __construct(Array $config)<br />
		{<br />
			$this->host = $config['host'];<br />
			$this->port = $config['port'];<br />
			$this->username = $config['username'];<br />
			$this->password = $config['password'];<br />
			$this->passive = $config['passive'];<br />
		}</p>
<p>		public function connect()<br />
		{<br />
			$this->socket = fsockopen(<br />
					$this->host,<br />
					$this->port,$err,$errstr,10<br />
				);</p>
<p>			if (!$this->socket) {<br />
				echo &#8220;an error occured while connection to host : &#8221; . $this->host;<br />
				exit;<br />
			}</p>
<p>			$this->output(&#8220;<font color=green> >> Connected to &#8220;. $this->host . &#8221; on port &#8220;. $this->port . &#8220;</font><br />&#8220;);<br />
			$this->fetchData();<br />
		}</p>
<p>		public function fetchData($showOutput = true)<br />
		{</p>
<p>			$buffer = fread($this->socket, 1024);<br />
			$status = socket_get_status($this->socket);</p>
<p>			if ($status["unread_bytes"] > 0) {<br />
				$buffer .= fread($this->socket, $status["unread_bytes"]);<br />
			}<br />
			if ($showOutput)<br />
			{<br />
				$this->output(&#8220;<font color=blue> << ".$buffer . "</font><br />&#8220;);<br />
			}</p>
<p>			return $buffer;<br />
		}</p>
<p>		// ftp is two way communication<br />
		public function getTransferData($command)<br />
		{<br />
			$fd = fsockopen($this->ip, $this->port, $e, $d, 5);<br />
			$list = &#8220;&#8221;;</p>
<p>			while (!feof($fd)) {<br />
				$t = fgets($fd,1024);<br />
				$list .= &#8220;<font color=#a2a2a2>&#8221; . $t . &#8220;</font>&#8220;;<br />
				$list = str_replace(&#8220;\n&#8221;,&#8221;<br />&#8220;,$list);</p>
<p>				if (preg_match(&#8220;/&#8221;. $this->CRLF . $this->CRLF .&#8221;/&#8221;,$t)) {<br />
					break;<br />
				}<br />
			}</p>
<p>			fwrite($fd, &#8220;QUIT&#8221; . $this->CRLF);<br />
			$this->list = $list;<br />
		}</p>
<p>		public function command($command)<br />
		{<br />
			fwrite($this->socket, $command . $this->CRLF);</p>
<p>			$p_command = str_replace($this->password, str_repeat(&#8220;*&#8221;,strlen($this->password)), $command);</p>
<p>			$this->output(&#8220;<font color=green> >> &#8220;. $p_command . &#8220;</font><br />&#8220;);</p>
<p>			$split = explode(&#8221; &#8220;,$command);</p>
<p>			$exec = $split[0];</p>
<p>			switch ($exec) {</p>
<p>				case &#8220;LIST&#8221;:<br />
					$this->getTransferData($command);<br />
				break;</p>
<p>				case &#8220;PASV&#8221;:<br />
					$this->setPassiveMode();<br />
				break;</p>
<p>				default:<br />
					$this->fetchData();<br />
				break;</p>
<p>			}<br />
		}</p>
<p>		public function setPassiveMode()<br />
		{<br />
			$buffer = $this->fetchData(false);</p>
<p>			preg_match(&#8220;/\((.*)?\)/&#8221;, $buffer, $match);</p>
<p>			$transfer = str_replace(&#8220;(&#8220;, &#8220;&#8221;, $match[1]);<br />
			$transfer = str_replace(&#8220;)&#8221;, &#8220;&#8221;, $match[1]);</p>
<p>			$split = explode(&#8220;,&#8221;,$transfer);</p>
<p>			$ip = $split[0] . &#8220;.&#8221; . $split[1] . &#8220;.&#8221; . $split[2] . &#8220;.&#8221; . $split[3];<br />
			$port = $split[4] * 256 + $split[5];</p>
<p>			$this->ip = $ip;<br />
			$this->port = $port;<br />
		}</p>
<p>		public function getUsername()<br />
		{<br />
			return $this->username;<br />
		}</p>
<p>		public function getPassword()<br />
		{<br />
			return $this->password;<br />
		}</p>
<p>		public function getList()<br />
		{<br />
			return $this->list;<br />
		}</p>
<p>		public function output($output)<br />
		{<br />
			echo $output;<br />
		}</p>
<p>	}</p>
<p>	$ftp = new ftp(Array(<br />
		&#8216;host&#8217; => &#8217;127.0.0.1&#8242;,<br />
		&#8216;port&#8217; => &#8217;21&#8242;,<br />
		&#8216;username&#8217; => &#8216;user&#8217;,<br />
		&#8216;password&#8217; => &#8216;pass&#8217;,<br />
		&#8216;passive&#8217; => true,<br />
	));</p>
<p>	$ftp->connect();<br />
	$ftp->command(&#8220;USER &#8221; . $ftp->getUsername());<br />
	$ftp->command(&#8220;PASS &#8221; . $ftp->getPassword());<br />
	$ftp->command(&#8220;PASV&#8221;);<br />
	$ftp->command(&#8220;CWD&#8221;);<br />
	$ftp->command(&#8220;PWD&#8221;);<br />
	$ftp->command(&#8220;PASV&#8221;);<br />
	$ftp->command(&#8220;TYPE A&#8221;);<br />
	$ftp->command(&#8220;LIST&#8221;);<br />
	$ftp->command(&#8220;QUIT&#8221;);</p>
<p>	echo $ftp->getList();<br />
[/php]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thinksheep.nl/php/ftp-protocol-in-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>openx single page call lazy loading</title>
		<link>http://www.thinksheep.nl/javascript/openx-single-page-call-lazy-loading/</link>
		<comments>http://www.thinksheep.nl/javascript/openx-single-page-call-lazy-loading/#comments</comments>
		<pubDate>Wed, 12 Oct 2011 10:18:34 +0000</pubDate>
		<dc:creator>Willem</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[openx]]></category>
		<category><![CDATA[spc]]></category>

		<guid isPermaLink="false">http://www.thinksheep.nl/?p=337</guid>
		<description><![CDATA[Zo! Een hele mond vol maar de uitleg op de openx pagina staat alleen een kleine uitleg over hoe je gebruik kan maken van de SPCJS. Het is een mooi systeem maar niet handig als je provider even kwijt is en de pagina loopt vast om de banners op te zoeken. Meerdere mensen zijn hier [...]]]></description>
			<content:encoded><![CDATA[<p>Zo! Een hele mond vol maar de uitleg op de openx pagina staat alleen een kleine uitleg over hoe je gebruik kan maken van de SPCJS.<br />
Het is een mooi systeem maar niet handig als je provider even kwijt is en de pagina loopt vast om de banners op te zoeken.</p>
<p>Meerdere mensen zijn hier tegenaan gelopen (waaronder ik) en zitten dan met een probleem. Gelukkig is er altijd iemand op het grote boze internet die<br />
met een oplossing komt! Er zwerft nog een jquery lazy load rond maar die is knap irritant qua laden en gebruik (maar dat is mijn mening).</p>
<p>Dus hier een klein javascript die:<br />
 &#8211; banners pas inlaad op het moment dat de rest van de pagina in is geladen<br />
 &#8211; een timeout heeft na x seconden en het laden dan stopt.<br />
 &#8211; jQuery/scriptaculous/mootools onafhankelijk, maakt geen enkel gebruik van welke library dan ook</p>
<p><span id="more-337"></span></p>
<p><a href="/downloads/openx.zip">Download het hier</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.thinksheep.nl/javascript/openx-single-page-call-lazy-loading/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Haversine formule om te dichtsbijzijnde punt te vinden (google maps)</title>
		<link>http://www.thinksheep.nl/javascript/haversine-formule-om-te-dichtsbijzijnde-punt-te-vinden-google-maps/</link>
		<comments>http://www.thinksheep.nl/javascript/haversine-formule-om-te-dichtsbijzijnde-punt-te-vinden-google-maps/#comments</comments>
		<pubDate>Fri, 16 Sep 2011 08:01:55 +0000</pubDate>
		<dc:creator>Willem</dc:creator>
				<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.thinksheep.nl/?p=334</guid>
		<description><![CDATA[Het dichtsbijzijnde punt vinden op de kaart aan de hand van een lengte- en breedtegraad. Erg handig voor als je met route bepaling bezig bent. Deze functie is wel gebaseerd op de lat en lng van de google maps API. maar zou verder niks uit mogen maken. Hier wordt door een array van lat&#8217;s en [...]]]></description>
			<content:encoded><![CDATA[<p>Het dichtsbijzijnde punt vinden op de kaart aan de hand van een lengte- en breedtegraad.<br />
Erg handig voor als je met route bepaling bezig bent. Deze functie is wel gebaseerd op de lat en lng van<br />
de google maps API. maar zou verder niks uit mogen maken. Hier wordt door een array van lat&#8217;s en lng&#8217;s gelooped.</p>
<p><span id="more-334"></span><br />
[javascript]<br />
var R = 6371;<br />
var distances = [];<br />
var closest = -1;<br />
var prev = -1;<br />
for(var i = 0; i < markers.length; i++ ) {<br />
	var mlat = markers[i].position.lat();<br />
	var mlng = markers[i].position.lng();<br />
	var dLat  = rad(mlat &#8211; lat);<br />
	var dLong = rad(mlng &#8211; lng);<br />
	var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(rad(lat)) * Math.cos(rad(lat)) * Math.sin(dLong/2) * Math.sin(dLong/2);<br />
	var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));<br />
	var d = R * c;<br />
	distances[i] = d;<br />
	if ( closest == -1 || d < distances[closest] ) {<br />
		if (typeof closest != &#8216;undefined&#8217;)<br />
		{<br />
			prev = closest;<br />
		}<br />
		closest = i;</p>
<p>	}<br />
}<br />
alert(closest);<br />
[/javascript]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thinksheep.nl/javascript/haversine-formule-om-te-dichtsbijzijnde-punt-te-vinden-google-maps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ajax/xmlHttpRequest als object zonder jQuery</title>
		<link>http://www.thinksheep.nl/javascript/ajaxxmlhttptequest-als-object-zonder-jquery/</link>
		<comments>http://www.thinksheep.nl/javascript/ajaxxmlhttptequest-als-object-zonder-jquery/#comments</comments>
		<pubDate>Wed, 14 Sep 2011 14:25:43 +0000</pubDate>
		<dc:creator>Willem</dc:creator>
				<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.thinksheep.nl/?p=327</guid>
		<description><![CDATA[Een xmlHttpRequest, beter bekend als AJAX. Dit lijkt op de jQuery versie uiteraard alleen kan deze het zonder jQuery. Het laat je zien hoe je zelf een request kan maken via standaard javascript. Houd er rekening mee dat als je met XHR werkt dat je tegen het cross domain policy aan kan lopen. Dit houdt [...]]]></description>
			<content:encoded><![CDATA[<p>Een xmlHttpRequest, beter bekend als AJAX. Dit lijkt op de jQuery versie uiteraard alleen kan deze het zonder jQuery.<br />
Het laat je zien hoe je zelf een request kan maken via standaard javascript.</p>
<p>Houd er rekening mee dat als je met XHR werkt dat je tegen het cross domain policy aan kan lopen. Dit houdt in dat je gewoon<br />
niet bij de content mag als je iets opvraagt van een ander domein. Een oplossing hiervoor (ook hier ingebouwd) is om dit middels php dan op te halen.</p>
<p><span id="more-327"></span><br />
[javascript]<br />
function Ajax(params)<br />
	{<br />
		this.requestType = &#8216;GET&#8217;;<br />
		this.xmlhttp = null;<br />
		this.params = params;<br />
		this.success = false;<br />
		this.timer = false;<br />
		this.aborted = false;</p>
<p>		if (window.XMLHttpRequest)<br />
		{<br />
			// for not so crappy browser<br />
			this.xmlhttp = new XMLHttpRequest();<br />
		} else {<br />
			// ie5, 6, crap browser support<br />
			this.xmlhttp = new ActiveXObject(&#8220;Microsoft.XMLHTTP&#8221;);<br />
		}</p>
<p>		if (typeof params.requestType != &#8216;undefined&#8217;)<br />
		{<br />
			// make them uppercase so we dont have to jiggle around with user input<br />
			this.requestType = this.params.requestType.toUpperCase();<br />
		}</p>
<p>		// bind the constructor of the class to the xmlhttp object<br />
		this.xmlhttp.Constructor = this;</p>
<p>		this.xmlhttp.onreadystatechange = function()<br />
		{<br />
			switch (this.readyState)<br />
			{<br />
				case 4:<br />
					this.Constructor.success = true;<br />
					if (this.status == 200)<br />
					{<br />
						if (typeof this.Constructor.params.success == &#8216;function&#8217;) this.Constructor.params.success(this.responseText);<br />
					} else {<br />
						// check aborted parameter, if aborted there is no need for an additional error<br />
						if (!this.Constructor.aborted)<br />
						{<br />
							if (typeof this.Constructor.params.error == &#8216;function&#8217;) this.Constructor.params.error(&#8217;404&#8242;);<br />
						}<br />
					}<br />
					break;<br />
			}<br />
		}	</p>
<p>		// send the package<br />
		this.send = function()<br />
		{<br />
			if (this.params.crossdomain)<br />
			{<br />
				this.xmlhttp.open(this.requestType, &#8216;/ajax.php?method=&#8217;+this.requestType+&#8217;&#038;url=&#8217; + this.params.url, this.params.async);<br />
			} else {<br />
				this.xmlhttp.open(this.requestType, this.params.url, this.params.async);<br />
			}</p>
<p>			if (typeof this.params.timeout != &#8216;undefined&#8217;)<br />
			{<br />
				this.timeout(this.params.timeout);<br />
			}</p>
<p>			if (this.requestType == &#8216;POST&#8217;)<br />
			{<br />
				this.xmlhttp.setRequestHeader(&#8220;Content-type&#8221;, &#8220;application/x-www-form-urlencoded&#8221;);<br />
				this.xmlhttp.send(this.requestParams);<br />
			}</p>
<p>			if (this.requestType == &#8216;GET&#8217;)<br />
			{<br />
				this.xmlhttp.send(null);<br />
			}<br />
		}</p>
<p>		// set a timer if necessary<br />
		this.timeout = function(timer)<br />
		{<br />
			var Constructor = this;<br />
			if (!this.timer)<br />
			{<br />
				this.timer = true;</p>
<p>				setTimeout(function() {<br />
					Constructor.timeout()<br />
				}, timer);<br />
				return;<br />
			}</p>
<p>			// if request not succeeded in the given time<br />
			if (!this.success)<br />
			{<br />
				this.aborted = true;<br />
				this.cancel();</p>
<p>				if (typeof this.params.onTimeout == &#8216;function&#8217;)<br />
				{<br />
					this.params.onTimeout();<br />
				}<br />
			}<br />
		}</p>
<p>		// the cancel function<br />
		this.cancel = function()<br />
		{<br />
			this.xmlhttp.abort();<br />
		}</p>
<p>		// set the auto sender<br />
		//if (params.autoSend) this.send();<br />
		this.send();</p>
<p>	}</p>
<p>        ajax = new Ajax({<br />
            url: url,<br />
            async: true,<br />
            requestType: &#8216;GET&#8217;,<br />
            timeout: 5000,<br />
            crossdomain: true,<br />
            success: function(data)<br />
            {<br />
	          alert(&#8216;success&#8217;);<br />
            },<br />
            onTimeout: function()<br />
            {<br />
                alert(&#8216;timeout&#8217;);<br />
            }<br />
        });<br />
    [/javascript]</p>
<p>Het php script</p>
<p>[php]<br />
<?php<br />
	if ($_GET['method'] == 'GET')<br />
	{<br />
		echo file_get_contents($_GET['url']);<br />
	} else {<br />
		// todo, post with cUrl<br />
	}<br />
?><br />
[/php]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thinksheep.nl/javascript/ajaxxmlhttptequest-als-object-zonder-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Resultaten van eergister of gister of &#8230;</title>
		<link>http://www.thinksheep.nl/mysql/resultaten-van-eergister-of-gister-of/</link>
		<comments>http://www.thinksheep.nl/mysql/resultaten-van-eergister-of-gister-of/#comments</comments>
		<pubDate>Mon, 01 Aug 2011 11:37:25 +0000</pubDate>
		<dc:creator>Willem</dc:creator>
				<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.thinksheep.nl/?p=322</guid>
		<description><![CDATA[MySQL is perfect voor datum berekeningen. Kijk maar naar de eerdere post voor verjaardagen bijvoorbeeld. Nu ook een simpele manier om de resultaten terug te krijgen van gister, eergister of morgen. Hou er rekening mee dat je CURDATE() gebruikt en niet NOW(). NOW() gaat incl. timestamp zoeken voor je dus die moet dan wel heel [...]]]></description>
			<content:encoded><![CDATA[<p>MySQL is perfect voor datum berekeningen. Kijk maar naar de eerdere post voor <a href="http://www.thinksheep.nl/mysql/leeftijd-direct-uitrekenen/">verjaardagen </a>bijvoorbeeld.<br />
Nu ook een simpele manier om de resultaten terug te krijgen van gister, eergister of morgen.<br />
<span id="more-322"></span><br />
Hou er rekening mee dat je CURDATE() gebruikt en niet NOW(). NOW() gaat incl. timestamp zoeken voor je dus die moet dan wel heel specifiek zijn.<br />
Hier is het echt de bedoeling dat hij zoekt naar alles van 1 dag.</p>
<p>[SQL]<br />
SELECT * FROM table WHERE DATE( date_field) = CURDATE( ) &#8211; INTERVAL 2 DAY<br />
[/SQL]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thinksheep.nl/mysql/resultaten-van-eergister-of-gister-of/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Facebook share afbeelding</title>
		<link>http://www.thinksheep.nl/html-css/facebook-share-afbeelding/</link>
		<comments>http://www.thinksheep.nl/html-css/facebook-share-afbeelding/#comments</comments>
		<pubDate>Mon, 25 Jul 2011 13:32:48 +0000</pubDate>
		<dc:creator>Willem</dc:creator>
				<category><![CDATA[HTML en CSS]]></category>

		<guid isPermaLink="false">http://www.thinksheep.nl/?p=311</guid>
		<description><![CDATA[Leuk, facebook, delen enzo&#8230; mooi dat alles geautomatiseerd is, of niet? Ik ga meestal voor de &#8220;of niet&#8221; categorie omdat ik zoveel mogelijk controle wil behouden over hetgeen wat gebeurd. Facebook kan afbeeldingen voor je zoeken op het moment dat je op je like button klikt et voila, je hebt niks zelf in hoeven vullen. [...]]]></description>
			<content:encoded><![CDATA[<p>Leuk, facebook, delen enzo&#8230; mooi dat alles geautomatiseerd is, of niet?<br />
Ik ga meestal voor de &#8220;of niet&#8221; categorie omdat ik zoveel mogelijk controle wil behouden over<br />
hetgeen wat gebeurd.</p>
<p>Facebook kan afbeeldingen voor je zoeken op het moment dat je op je like button klikt et voila, je hebt niks zelf in hoeven vullen. Dit vind ik dus irritant.. ik wil zelf mijn afbeelding bepalen!</p>
<p><span id="more-311"></span></p>
<p>Ziehier:</p>
<p>[html]<br />
<meta property="og:image" content="http://www.jouwdomein.nl/plaatje.jpg" /><br />
[/html]</p>
<p>Weet wel dat dit ook even moet doordringen bij facebook. Dus als het niet meteen werkt: heb even geduld.<br />
Met dank aan deze site:</p>
<p>http://am22tech.com/s/22/Blogs/post/2010/06/03/Add-your-web-pages-best-image-in-meta-tag-for-thumbnail-by-facebook-share-links.aspx</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thinksheep.nl/html-css/facebook-share-afbeelding/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Log bijhouden zodra een tabel wordt geupdate met mysql trigger</title>
		<link>http://www.thinksheep.nl/mysql/log-bijhouden-zodra-een-tabel-wordt-geupdate-met-mysql-trigger/</link>
		<comments>http://www.thinksheep.nl/mysql/log-bijhouden-zodra-een-tabel-wordt-geupdate-met-mysql-trigger/#comments</comments>
		<pubDate>Mon, 21 Feb 2011 16:32:13 +0000</pubDate>
		<dc:creator>Willem</dc:creator>
				<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.thinksheep.nl/?p=292</guid>
		<description><![CDATA[In een content editor zijn er altijd wel bepaalde roles te vinden. Elke user zal zijn functie daarin ook uitvoeren, maar we kunnen er vanuit gaan dat meerdere users dezelfde content kunnen bewerken. Dan is het handig om te loggen wie wat heeft gedaan. Ook als het gaat om een soort van revision history bij [...]]]></description>
			<content:encoded><![CDATA[<p>In een content editor zijn er altijd wel bepaalde roles te vinden. Elke user zal zijn functie daarin ook uitvoeren, maar we kunnen er vanuit gaan dat<br />
meerdere users dezelfde content kunnen bewerken. Dan is het handig om te loggen wie wat heeft gedaan.</p>
<p>Ook als het gaat om een soort van revision history bij te houden zullen logs van pas komen. Maar je wilt dit niet zelf gaan bijhouden door omslachtig zelf alles na te kijken<br />
wat er is veranderd. Gelukkig worden we weer verwend door MySQL.</p>
<p><span id="more-292"></span></p>
<p>Laten we uit gaan van een &#8216;posts&#8217; en een &#8216;posts_log&#8217; tabel. De kolommen mag je er zelf bij fantaseren, dat is nu niet waar het om draait <img src='http://www.thinksheep.nl/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
De trigger:</p>
<p>[SQL]<br />
DELIMITER //<br />
DROP TRIGGER IF EXISTS `postTrigger`//<br />
CREATE TRIGGER `postTrigger` AFTER UPDATE ON `posts`<br />
 FOR EACH ROW BEGIN<br />
INSERT DELAYED INTO posts_log<br />
(userId,`log`,`date`)VALUES (<br />
	NEW.modifiedByUser,<br />
	CONCAT(&#8216;Post met id : &#8216;,NEW.id,&#8217; is veranderd van &#8216;,OLD.post, &#8216; naar &#8216;, NEW.post),<br />
        NOW()<br />
);<br />
END<br />
[/SQL]</p>
<p>Als je deze invoert als SQL dan zal er een nieuwe trigger bij de tabel zelf verschijnen. Wat deze nu doet is voor elke update op de tabel &#8216;posts&#8217; een insert doen op de tabel &#8216;posts_log&#8217;.<br />
Je kan zelf hierin de velden aangeven die je gelogd wilt hebben. </p>
<p>Wat betreft de optimalisaties: voor log tabellen is het verstandig om i.p.v. InnoDB of MyISAM het ARCHIVE type te gebruiken.<br />
Dit kan een tienvoud schelen in opslag!</p>
<p>Let ook op de INSERT DELAYED, dit kan een enorme performance slag zijn. Delayed queries moeten namelijk wachten totdat alle selects uitgevoerd zijn.<br />
Logs hebben naar mijn idee toch nooit voorrang.</p>
<p><strong>Tip:</strong> als je verschillen wilt zien die gemaakt zijn in teksten is <a href="http://pear.php.net/package/Text_Diff/redirected" target="_blank">http://pear.php.net/package/Text_Diff/redirecte</a> echt geniaal.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thinksheep.nl/mysql/log-bijhouden-zodra-een-tabel-wordt-geupdate-met-mysql-trigger/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Subdomein doorsturen naar hoofddomein met ip controle</title>
		<link>http://www.thinksheep.nl/apache-htaccess/subdomein-doorsturen-naar-hoofddomein-met-ip-controle/</link>
		<comments>http://www.thinksheep.nl/apache-htaccess/subdomein-doorsturen-naar-hoofddomein-met-ip-controle/#comments</comments>
		<pubDate>Wed, 16 Feb 2011 16:09:37 +0000</pubDate>
		<dc:creator>Willem</dc:creator>
				<category><![CDATA[Apache en .htaccess]]></category>

		<guid isPermaLink="false">http://www.thinksheep.nl/?p=286</guid>
		<description><![CDATA[Stuur iedereen vanaf een bepaald subdomein door naar je hoofd domein. Met uitzondering van een aantal ip adressen. [bash] RewriteEngine on RewriteCond %{REMOTE_HOST} !^100\.100\.100\.100 RewriteCond %{REMOTE_HOST} !^200\.200\.200\.200 RewriteCond %{HTTP_HOST} !^www\.domain\.com$ RewriteRule (.*) http://www.domain.com/$1 [R=302,L] [/bash]]]></description>
			<content:encoded><![CDATA[<p>Stuur iedereen vanaf een bepaald subdomein door naar je hoofd domein.<br />
Met uitzondering van een aantal ip adressen.<br />
<span id="more-286"></span><br />
<!--more--></p>
<p>[bash]<br />
RewriteEngine on</p>
<p>RewriteCond %{REMOTE_HOST} !^100\.100\.100\.100<br />
RewriteCond %{REMOTE_HOST} !^200\.200\.200\.200<br />
RewriteCond %{HTTP_HOST} !^www\.domain\.com$<br />
RewriteRule (.*) http://www.domain.com/$1 [R=302,L]<br />
[/bash]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thinksheep.nl/apache-htaccess/subdomein-doorsturen-naar-hoofddomein-met-ip-controle/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Live counter, maar dan efficient</title>
		<link>http://www.thinksheep.nl/mysql/live-counter-maar-dan-efficient/</link>
		<comments>http://www.thinksheep.nl/mysql/live-counter-maar-dan-efficient/#comments</comments>
		<pubDate>Wed, 16 Feb 2011 08:19:59 +0000</pubDate>
		<dc:creator>Willem</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.thinksheep.nl/?p=276</guid>
		<description><![CDATA[Counters die het aantal bezoekers, berichten, etc bijhouden. Altijd heel mooi als dat goed loopt maar als het directe database opdrachten zijn dan zal je webserver daar iets minder gelukkig mee zijn. Stel je voor dat je iedere seconde een database opdracht moet doen op een steeds maar groeiende tabel. Dit kan redelijk funest worden [...]]]></description>
			<content:encoded><![CDATA[<p>Counters die het aantal bezoekers, berichten, etc bijhouden. Altijd heel mooi als dat goed loopt maar als het directe database opdrachten zijn dan zal je webserver<br />
daar iets minder gelukkig mee zijn. Stel je voor dat je iedere seconde een database opdracht moet doen op een steeds maar groeiende tabel. Dit kan redelijk funest<br />
worden voor je performance. Helemaal als je geen InnoDB hebt (er vanuit gaande dat je mysql zou hebben). InnoDB zorgt voor row locking in plaats van table locking.<br />
Hoe kunnen we dan dit efficiënt krijgen?</p>
<p><span id="more-276"></span><br />
Laten we beginnen met een idee wat performance gaat schelen en wat een realistisch beeld schept over hetgeen wat we als live counter willen zetten:</p>
<p><strong>Haal 1x per uur op wat het gemiddelde is van het afgelopen uur.</strong></p>
<p>[SQL]<br />
     SELECT COUNT(*) FROM visitors WHERE last_login > NOW() &#8211; INTERVAL 1 HOUR<br />
[/SQL]</p>
<p>Met dit resultaat haal je de bezoekers op die het afgelopen uur hebben ingelogd. Maar dan zijn we er nog niet. We moeten nu weten om de hoeveel seconden we de live counter moeten verversen.<br />
Stel er komen 400 bezoekers uit je result. Dat houd in dat je (400 / 60) hebt, dus per seconde er 6 bijgeteld moeten worden.</p>
<p>[javascript]</p>
<p>&lt;script type=&#8221;text/javascript&#8221;&gt;</p>
<p>	var visits 		= 400;<br />
	var interval 	= (3600 / 400) * 1000;</p>
<p>	setInterval(function() {<br />
		var counter 	= parseInt(document.getElementById(&#8216;counter&#8217;).innerHTML);<br />
		counter++;<br />
		document.getElementById(&#8216;counter&#8217;).innerHTML = counter;<br />
	}, interval);</p>
<p>&lt;/script&#038;gt</p>
<p>&lt;div id=&#8221;counter&#8221;&gt; 0 &lt;/div&gt;</p>
<p>[/javascript]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thinksheep.nl/mysql/live-counter-maar-dan-efficient/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

