<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

	<title>Sannoise Blog</title>
	<link href="http://www.sannoise.be/"/>
	<link rel="self" href="http://www.sannoise.be/feed/blog_fulltext_atom.xml" type="application/atom+xml" />
	<updated>2012-04-04T12:10:28+02:00</updated>
	<author>
		<name>Koen De Vreeze</name>
	</author>
	<icon>http://www.sannoise.be/images/favicon.png</icon>
	<id>http://www.sannoise.be/</id>	<entry>
			<title>Maildir to Gmail with PHP</title>
			<link href="http://www.sannoise.be/blog.php?id=72"/>
			<id>http://www.sannoise.be/blog.php?id=72</id>
			<updated>2012-04-04T12:10:28+02:00</updated>
			<published>2012-04-04T12:08:36+02:00</published><content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Deze post gaat verder in het Engels.</p><div lang="en"><p>A few months ago our school migrated from a Postfix mail server to Google Apps for Education (Gmail). Because most of our teachers only used webmail (Horde) we had to migrate all messages from the old mail server to Google.</p><h2>Download script</h2><p>You may download the script <a href="http://sannoise.be/blog/2012/04/maildir2gmail.htm">maildir2gmail.php</a>. It is provided "as is" and use is at own risk. I advise you to run the script outside business hours and while monitoring it. You may alter the script and share it only if you keep the copyright notices.</p><h2>Features and requirements</h2><p>You need a server with PHP 5.3. Message should be stored in maildir format. A lot of mail servers use this format. See <a href="http://en.wikipedia.org/wiki/Maildir#Mail_servers">Wikipedia article on Maildir</a> for supported servers.
</p><ul><li>Keeps all files on the old mail server.</li><li>Marks read/unread information.</li></ul><h2>Possible issues</h2><ul><li>Some messages can't be migrated but normally this gives a clear error in the log file (too big, malformed, wrong date notation).</li><li>Issues with multithreaded PHP script.</li></ul></div></div></content></entry>	<entry>
			<title>Het Pukkelpopdrama zoals ik het ervaren heb</title>
			<link href="http://www.sannoise.be/blog.php?id=71"/>
			<id>http://www.sannoise.be/blog.php?id=71</id>
			<updated>2011-08-21T21:56:45+02:00</updated>
			<published>2011-08-21T20:52:02+02:00</published><content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Iedereen die Pukkelpop 2011 bezocht heeft heeft zo zijn verhaal. Ik heb ook even genoteerd hoe ik de ramp ervaren heb.</p><p>Het was goed weer en we hadden net een mexicano gegeten. Omdat het wat begon te regenen zijn we onder de luifel naast de boiler gaan staan. Even later zagen we het onweer op ons afkomen. De lucht sloeg geelgroen uit en we zagen een hele donkere wolk die tot de grond reikte op ons afkomen. De wind zette op en de regen was enorm. Omdat we aan de rand van de tent stonden kregen we regelmatig een slag water in onze rug. Niet veel later kwam daar ook hagel bij. Mensen gingen hurken en gebruikten ons als schild tegen de hagel. Ik vervloekte het nog dat we aan de rand stonden en zo de regen pal op ons kregen.</p><p>De muziek van Netsky bleef spelen wat ik eigenaardig vond. Iedereen was zijn best aan het doen om zich te beschermen tegen de hagel. De wind zette steeds meer op en de speakers begonnen te kraken en lieten het met momenten afweten. Plots merkte ik dat er iets gebeurd moest zijn. Sommigen hadden een krak gehoord. Dit kan ik me niet herinneren. Ik weet alleen dat ik naar boven moest kijken. Daar zag ik dat een balk doormidden was gebroken en nog in de lucht hing. Onmiddellijk schoten me de beelden van het instorten van het podium op de Indiana State Fair te binnen. We moesten daar weg en wel meteen. Olivier begon ook te lopen richting Vlaams Kruis. De hagel sloeg van rechts aan. Het was ondraaglijk en het was moeilijk om iets voor je te zien. Plots zag ik Olivier naar links lopen en onmiddellijk daarna deed ik dat ook. Daardoor gingen Jens en ik een andere kant uit dan Oliver. Onderweg besefte ik dat ik Olivier niet meer zag. Maar teruglopen pal in die hagel was geen optie. Een aantal Heras hekken aan de Dance Hall waren omgewaaid en verschillende mensen liepen die richting uit. Rechts van me zag ik een omgevallen hek met een jongen onder die aan het schuilen was. Daar ben ik ook onder gekropen. Jens had me niet zien stoppen en was verder gelopen en is in de regen en hagel blijven staan. Ik had de moed niet om hem te gaan zoeken omdat de hagel te vreselijk was. Met mijn rug probeerde ik het hek omhoog te duwen zodat er meer mensen onder konden kruipen. De hagelbollen sloegen hard op mijn rug door het doek dat aan het hek gebonden was. Uiteindelijk kwamen er steeds meer mensen onder het hek gekropen. Het verwonderde me wel dat ik niet weggedrumd werd en dat er sommige gewoon voor het hek bleven staan in de hagel. Ondertussen bibberde ik zowat de botten uit mijn lijf maar ik was niet de enige. Zachtjesaan begon de hagel te minderen. Tot mijn vreugde zag ik plots Jens passeren en ben hem achternagehold. Aan de andere kant van de opening in de afrastering stonden mensen die een hek boven hun hoofd hielden. Daar zijn we bij gaan staan.&#160;</p><p>De hagel stopte en de regen minderde hevigheid. Zachtjes aan begon het terug licht te worden. Mijn GSM was doornat maar werkte nog. Omdat ik dat zo wilde houden heb ik hem uitgeschakeld. We konden ondertussen zien dat de luifel was gebroken en op de grond neergekomen. Het verwonderde me enerzijds dat de constructie er nog stond. Mijn gedacht was dat het zeer traag naar beneden gekomen was en dat er niemand gewond zou geraakt zijn. Later bleek dat er een koppeltje het leven heeft gelaten omdat ze op die plaats stonden.</p><p>Het water stond overal tot aan ons enkels. Een muis had de zondvloed overleefd en sprong over de weide. Enkele vrolijke festivalgangers maakten de weg vrij voor de muis zodat die in veiligheid kon komen.</p><p>Aan het Vlaams Kruis vonden we Olivier niet terug. We zijn nog wat blijven staan om op hem te wachten.</p><p>De crew van Pukkelpop spande ondertussen de volledige plaats onder de luifel af met een lint. </p><p>Omdat we Olivier niet zagen besloten we naar de camping te gaan. De enige unieke plaats die we gemeenschappelijk deelden. Het GSM netwerk was verzadigd. Jens nam ondertussen foto's van de beschadigde bomen en tenten. Hoe verder we de uitgang naderden hoe groter de ravage werd. De ingang naar de Marquee en Main stage was omgewaaid, omgewaaide bomen leunden tegen elkaar. Overal mensen die het water probeerden door te komen. Overal crew die verslagen rondkeek op het gebeuren, maar alles wel in goede banen probeerde te leiden. Door de ingang gekomen zagen we dat een tent van Petit basar gescheurd was. Ik zocht de Chateau tent maar vond het niet. Enkel het onderste zeil van de tent verraadde waar Chateaux had gestaan. De speakers hingen nog recht maar de middelste constructie die het zeil omhoog hield was weg. De Kempische steenweg was volledig afgezet voor autoverkeer. De camping was één modderpoel en het dakzeil van de ingang was weggeblazen. Omdat iedereen naar zijn tent wou waren de toegangswegen volledig verzadigd. We beslisten uiteindelijk om toch aan te schuiven in de rij. Overal zagen we mensen die hun tent opkraamden, mensen die hun tent aan het hozen waren en mensen die nog een stevig feestje aan het vieren waren. De referentiepunten om onze tent terug te vinden zoals partytentjes waren verdwenen. Toch vonden we onze tent snel terug en godzijdank Olivier stond bij de tent. Hij had de tent samen met een campinggenoot terug op poten gezet omdat ze gedeeltelijk was ingezakt. De tent was nat maar al ons gerief lag op een matras waardoor alle kleren en slaapzakken droog waren.</p><p>Onze buren hadden minder geluk. Heel veel tenten waren gewoon weg of ingezakt.</p><p>We wisten niet wat we moesten doen en het GSM-netwerk was nog steeds verzadigd. Twee meisjes uit West-Vlaanderen die een eindje verder van ons stonden vroegen om te helpen om hun tent op te vouwen. Ze hadden dezelfde tent als ons en hoopten dat we zouden kunnen helpen. We wisten niet hoe het moest maar hebben het toch met wat geluk in orde gekregen.</p><p>We bleven proberen te bellen maar het lukte niet. We kregen geen informatie. Er waren geruchten dat er zes doden gevallen waren en dat de Marquee volledig ingestort zou zijn. Een scherm dat op de camping stond werd terug hersteld maar er verscheen geen nuttige informatie. Enkel dat we moesten opletten voor dieven. Zelfde melding als die morgen.</p><p>Gelukkig had ik de oortjes van mijn gsm meegebracht. Hierdoor konden we naar FM-radio luisteren. Rond 21u hoorden we dat Chokri een persconferentie ging geven. Dat er doden gevallen waren was nu officieel. Het festival was afgelast voor de rest van de dag. Dat vonden we niet meer dan logisch. Men ging alles doen om het festivalterrein terug veilig te krijgen om de volgende twee dagen verder te kunnen doen. Dit leek me een onmogelijke taak. Maar gaf ons een reden meer om toch te blijven. De volgende dag hoorden we telefonisch dat de organistoren hadden beslist Pukkelpop 2011 af te gelasten.</p><p>De organisatie stuurde ondertussen mensen over het terrein om de kampeerders te vragen zo snel mogelijk het terrein te verlaten. Dat deden we dan ook.</p><ul><li><a href="http://www.noxa.net/forum/87440/2/_Jouw_Pukkelpopverhaal" title="Jouw Pukkelpopverhaal">Meer Pukkelpopverhalen op Noxa.net</a></li></ul></div></content></entry>	<entry>
			<title>Move user to OU in Google Apps with PHP</title>
			<link href="http://www.sannoise.be/blog.php?id=70"/>
			<id>http://www.sannoise.be/blog.php?id=70</id>
			<updated>2011-08-08T12:25:00+02:00</updated>
			<published>2011-08-07T21:14:07+02:00</published><content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Omdat het nog niet mogelijk is om met <a href="http://framework.zend.com/manual/en/zend.gdata.html">Zend_Gdata</a> gebruikers in Organisation Units te plaatsen heb ik zelf snel een script geschreven. Snel, dus het script is niet schitterend, maar het doet wel zijn ding. Omdat anderen het ook kunnen gebruiken deel ik het met de wereld.</p>
<div><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php
<br /></span><span style="color: #FF8000">/**
<br />&#160;*&#160;Move&#160;a&#160;user&#160;to&#160;an&#160;Organisation&#160;Unit.
<br />&#160;*&#160;@author&#160;Koen&#160;De&#160;Vreeze
<br />&#160;*&#160;Tested&#160;on&#160;2011-08-07&#160;on&#160;Debian&#160;5&#160;with&#160;php&#160;5.3.6
<br />&#160;*&#160;Google&#160;environment:&#160;Google&#160;Apps&#160;for&#160;Education.
<br />&#160;*/
<br />//&#160;Initialize
<br /></span><span style="color: #0000BB">error_reporting</span><span style="color: #007700">(</span><span style="color: #0000BB">E_ALL</span><span style="color: #007700">);
<br /></span><span style="color: #0000BB">ini_set</span><span style="color: #007700">(</span><span style="color: #DD0000">"display_errors"</span><span style="color: #007700">,&#160;</span><span style="color: #DD0000">"1"</span><span style="color: #007700">);
<br /></span><span style="color: #0000BB">ini_set</span><span style="color: #007700">(</span><span style="color: #DD0000">"max_execution_time"</span><span style="color: #007700">,&#160;</span><span style="color: #DD0000">"0"</span><span style="color: #007700">);
<br /></span><span style="color: #0000BB">ini_set</span><span style="color: #007700">(</span><span style="color: #DD0000">"max_input_time"</span><span style="color: #007700">,&#160;</span><span style="color: #DD0000">"0"</span><span style="color: #007700">);
<br /></span><span style="color: #0000BB">set_time_limit</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">);
<br /></span><span style="color: #0000BB">date_default_timezone_set</span><span style="color: #007700">(</span><span style="color: #DD0000">'Europe/Brussels'</span><span style="color: #007700">);
<br />
<br /></span><span style="color: #FF8000">//&#160;Config
<br />
<br /></span><span style="color: #0000BB">$domain&#160;</span><span style="color: #007700">=&#160;</span><span style="color: #DD0000">'domain.tld'</span><span style="color: #007700">;
<br /></span><span style="color: #0000BB">$domainadmin&#160;</span><span style="color: #007700">=&#160;</span><span style="color: #DD0000">'userwithpriveleges'</span><span style="color: #007700">;
<br /></span><span style="color: #0000BB">$domainadminpwd&#160;</span><span style="color: #007700">=&#160;</span><span style="color: #DD0000">'secret'</span><span style="color: #007700">;
<br />
<br /></span><span style="color: #FF8000">//&#160;end&#160;Config
<br /></span><span style="color: #0000BB">GoogleApps</span><span style="color: #007700">::</span><span style="color: #0000BB">$domain&#160;</span><span style="color: #007700">=&#160;</span><span style="color: #0000BB">$domain</span><span style="color: #007700">;
<br /></span><span style="color: #0000BB">GoogleApps</span><span style="color: #007700">::</span><span style="color: #0000BB">retrieveAuthToken</span><span style="color: #007700">(</span><span style="color: #DD0000">"</span><span style="color: #0000BB">$domainadmin</span><span style="color: #DD0000">@</span><span style="color: #0000BB">$domain</span><span style="color: #DD0000">"</span><span style="color: #007700">,&#160;</span><span style="color: #0000BB">$domainadminpwd</span><span style="color: #007700">);
<br /></span><span style="color: #0000BB">GoogleApps</span><span style="color: #007700">::</span><span style="color: #0000BB">retrieveCustomerId</span><span style="color: #007700">();
<br />
<br /></span><span style="color: #FF8000">//&#160;do&#160;your&#160;magic
<br /></span><span style="color: #007700">echo&#160;</span><span style="color: #0000BB">GoogleApps</span><span style="color: #007700">::</span><span style="color: #0000BB">moveUsersToOrganizationUnit</span><span style="color: #007700">(</span><span style="color: #DD0000">'username@domain.tld'</span><span style="color: #007700">,&#160;</span><span style="color: #DD0000">'myOU'</span><span style="color: #007700">);
<br />
<br />class&#160;</span><span style="color: #0000BB">GoogleApps
<br /></span><span style="color: #007700">{
<br />&#160;&#160;&#160;&#160;private&#160;static&#160;</span><span style="color: #0000BB">$last_error&#160;</span><span style="color: #007700">=&#160;</span><span style="color: #DD0000">''</span><span style="color: #007700">;
<br />&#160;&#160;&#160;&#160;public&#160;static&#160;</span><span style="color: #0000BB">$authToken</span><span style="color: #007700">;
<br />&#160;&#160;&#160;&#160;public&#160;static&#160;</span><span style="color: #0000BB">$customerId</span><span style="color: #007700">;
<br />&#160;&#160;&#160;&#160;public&#160;static&#160;</span><span style="color: #0000BB">$domain</span><span style="color: #007700">;
<br />&#160;&#160;&#160;&#160;</span><span style="color: #FF8000">/**
<br />&#160;&#160;&#160;&#160;&#160;*&#160;Get&#160;authToken&#160;for&#160;user.
<br />&#160;&#160;&#160;&#160;&#160;*&#160;This&#160;should&#160;be&#160;a&#160;domain&#160;admin.
<br />&#160;&#160;&#160;&#160;&#160;*/
<br />&#160;&#160;&#160;&#160;</span><span style="color: #007700">static&#160;function&#160;</span><span style="color: #0000BB">retrieveAuthToken</span><span style="color: #007700">(</span><span style="color: #0000BB">$email</span><span style="color: #007700">,&#160;</span><span style="color: #0000BB">$passwd</span><span style="color: #007700">)
<br />&#160;&#160;&#160;&#160;{
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">$email&#160;</span><span style="color: #007700">=&#160;</span><span style="color: #0000BB">urlencode</span><span style="color: #007700">(</span><span style="color: #0000BB">$email</span><span style="color: #007700">);
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">$passwd&#160;</span><span style="color: #007700">=&#160;</span><span style="color: #0000BB">urlencode</span><span style="color: #007700">(</span><span style="color: #0000BB">$passwd</span><span style="color: #007700">);
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">$post_data&#160;</span><span style="color: #007700">=&#160;</span><span style="color: #DD0000">"Email=</span><span style="color: #0000BB">$email</span><span style="color: #DD0000">&amp;Passwd=</span><span style="color: #0000BB">$passwd</span><span style="color: #DD0000">&amp;accountType=HOSTED&amp;service=apps"</span><span style="color: #007700">;
<br />
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #FF8000">//&#160;create&#160;curl&#160;resource&#160;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">$ch&#160;</span><span style="color: #007700">=&#160;</span><span style="color: #0000BB">curl_init</span><span style="color: #007700">();&#160;
<br />
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #FF8000">//&#160;set&#160;url&#160;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">curl_setopt</span><span style="color: #007700">(</span><span style="color: #0000BB">$ch</span><span style="color: #007700">,&#160;</span><span style="color: #0000BB">CURLOPT_URL</span><span style="color: #007700">,&#160;</span><span style="color: #DD0000">"https://www.google.com/accounts/ClientLogin"</span><span style="color: #007700">);&#160;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">curl_setopt</span><span style="color: #007700">(</span><span style="color: #0000BB">$ch</span><span style="color: #007700">,&#160;</span><span style="color: #0000BB">CURLOPT_PORT</span><span style="color: #007700">,&#160;</span><span style="color: #0000BB">443</span><span style="color: #007700">);
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">curl_setopt</span><span style="color: #007700">(</span><span style="color: #0000BB">$ch</span><span style="color: #007700">,&#160;</span><span style="color: #0000BB">CURLOPT_POST</span><span style="color: #007700">,&#160;</span><span style="color: #0000BB">1</span><span style="color: #007700">);
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">curl_setopt</span><span style="color: #007700">(</span><span style="color: #0000BB">$ch</span><span style="color: #007700">,&#160;</span><span style="color: #0000BB">CURLOPT_POSTFIELDS</span><span style="color: #007700">,&#160;</span><span style="color: #0000BB">$post_data</span><span style="color: #007700">);
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">curl_setopt</span><span style="color: #007700">(</span><span style="color: #0000BB">$ch</span><span style="color: #007700">,&#160;</span><span style="color: #0000BB">CURLINFO_CONTENT_LENGTH_UPLOAD</span><span style="color: #007700">,&#160;</span><span style="color: #0000BB">strlen</span><span style="color: #007700">(</span><span style="color: #0000BB">$post_data</span><span style="color: #007700">));
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">curl_setopt</span><span style="color: #007700">(</span><span style="color: #0000BB">$ch</span><span style="color: #007700">,&#160;</span><span style="color: #0000BB">CURLINFO_CONTENT_TYPE</span><span style="color: #007700">,&#160;</span><span style="color: #DD0000">"application/x-www-form-urlencoded"</span><span style="color: #007700">);
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #FF8000">//return&#160;the&#160;transfer&#160;as&#160;a&#160;string&#160;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">curl_setopt</span><span style="color: #007700">(</span><span style="color: #0000BB">$ch</span><span style="color: #007700">,&#160;</span><span style="color: #0000BB">CURLOPT_RETURNTRANSFER</span><span style="color: #007700">,&#160;</span><span style="color: #0000BB">1</span><span style="color: #007700">);&#160;
<br />
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">$token&#160;</span><span style="color: #007700">=&#160;</span><span style="color: #0000BB">curl_exec</span><span style="color: #007700">(</span><span style="color: #0000BB">$ch</span><span style="color: #007700">);&#160;
<br />
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #FF8000">//&#160;close&#160;curl&#160;resource&#160;to&#160;free&#160;up&#160;system&#160;resources&#160;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">curl_close</span><span style="color: #007700">(</span><span style="color: #0000BB">$ch</span><span style="color: #007700">);
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #FF8000">//&#160;Extract&#160;authToken
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">$pattern&#160;</span><span style="color: #007700">=&#160;</span><span style="color: #DD0000">'/Auth=(.*)/'</span><span style="color: #007700">;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">preg_match</span><span style="color: #007700">(</span><span style="color: #0000BB">$pattern</span><span style="color: #007700">,&#160;</span><span style="color: #0000BB">$token</span><span style="color: #007700">,&#160;</span><span style="color: #0000BB">$matches</span><span style="color: #007700">);
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">$auth&#160;</span><span style="color: #007700">=&#160;</span><span style="color: #0000BB">substr</span><span style="color: #007700">(</span><span style="color: #0000BB">$matches</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">],&#160;</span><span style="color: #0000BB">5</span><span style="color: #007700">);
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">$authToken&#160;</span><span style="color: #007700">=&#160;</span><span style="color: #0000BB">$auth</span><span style="color: #007700">;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;</span><span style="color: #0000BB">$auth</span><span style="color: #007700">;
<br />&#160;&#160;&#160;&#160;}&#160;</span><span style="color: #FF8000">//&#160;end&#160;retrieveAuthToken()
<br />&#160;&#160;&#160;&#160;
<br />&#160;&#160;&#160;&#160;</span><span style="color: #007700">static&#160;function&#160;</span><span style="color: #0000BB">retrieveCustomerId</span><span style="color: #007700">()
<br />&#160;&#160;&#160;&#160;{
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">$response&#160;</span><span style="color: #007700">=&#160;</span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">send</span><span style="color: #007700">(</span><span style="color: #DD0000">'GET'</span><span style="color: #007700">,&#160;</span><span style="color: #DD0000">'/a/feeds/customer/2.0/customerId'</span><span style="color: #007700">);
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">$body&#160;</span><span style="color: #007700">=&#160;</span><span style="color: #DD0000">''</span><span style="color: #007700">;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if&#160;((</span><span style="color: #0000BB">$pos&#160;</span><span style="color: #007700">=&#160;</span><span style="color: #0000BB">strpos</span><span style="color: #007700">(</span><span style="color: #0000BB">$response</span><span style="color: #007700">,&#160;</span><span style="color: #DD0000">"&lt;"</span><span style="color: #007700">))&#160;!==&#160;</span><span style="color: #0000BB">false</span><span style="color: #007700">)&#160;{&#160;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">$body&#160;</span><span style="color: #007700">=&#160;</span><span style="color: #0000BB">substr</span><span style="color: #007700">(</span><span style="color: #0000BB">$response</span><span style="color: #007700">,&#160;</span><span style="color: #0000BB">$pos</span><span style="color: #007700">);&#160;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">$responseXML&#160;</span><span style="color: #007700">=&#160;new&#160;</span><span style="color: #0000BB">SimpleXMLElement</span><span style="color: #007700">(</span><span style="color: #0000BB">$body</span><span style="color: #007700">);
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">$customerIdXML&#160;</span><span style="color: #007700">=&#160;</span><span style="color: #0000BB">$responseXML</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">xpath</span><span style="color: #007700">(</span><span style="color: #DD0000">'//apps:property[@name="customerId"]/@value'</span><span style="color: #007700">);
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #FF8000">//echo&#160;$customerIdXML[0]-&gt;value;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">$customerId&#160;</span><span style="color: #007700">=&#160;</span><span style="color: #0000BB">$customerIdXML</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">]-&gt;</span><span style="color: #0000BB">value</span><span style="color: #007700">;
<br />&#160;&#160;&#160;&#160;}
<br />&#160;&#160;&#160;&#160;</span><span style="color: #FF8000">/**
<br />&#160;&#160;&#160;&#160;&#160;*&#160;Send&#160;a&#160;Message&#160;to&#160;the&#160;Google&#160;mail&#160;servers.
<br />&#160;&#160;&#160;&#160;&#160;*/
<br />&#160;&#160;&#160;&#160;</span><span style="color: #007700">static&#160;function&#160;</span><span style="color: #0000BB">send</span><span style="color: #007700">(</span><span style="color: #0000BB">$method</span><span style="color: #007700">,&#160;</span><span style="color: #0000BB">$uri</span><span style="color: #007700">,&#160;</span><span style="color: #0000BB">$httpbody</span><span style="color: #007700">=</span><span style="color: #DD0000">''</span><span style="color: #007700">)
<br />&#160;&#160;&#160;&#160;{
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">$authToken&#160;</span><span style="color: #007700">=&#160;</span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">$authToken</span><span style="color: #007700">;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">$fp&#160;</span><span style="color: #007700">=&#160;</span><span style="color: #0000BB">fsockopen</span><span style="color: #007700">(</span><span style="color: #DD0000">"ssl://apps-apis.google.com"</span><span style="color: #007700">,&#160;</span><span style="color: #0000BB">443</span><span style="color: #007700">,&#160;</span><span style="color: #0000BB">$errno</span><span style="color: #007700">,&#160;</span><span style="color: #0000BB">$errstr</span><span style="color: #007700">,&#160;</span><span style="color: #0000BB">30</span><span style="color: #007700">);
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if&#160;(!</span><span style="color: #0000BB">$fp</span><span style="color: #007700">)&#160;{
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;echo&#160;</span><span style="color: #DD0000">"</span><span style="color: #0000BB">$errstr</span><span style="color: #DD0000">&#160;(</span><span style="color: #0000BB">$errno</span><span style="color: #DD0000">)\n"</span><span style="color: #007700">;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;else&#160;{
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #FF8000">//$out&#160;=&#160;$method&#160;.&#160;"&#160;/a/feeds/orgunit/2.0/"&#160;.&#160;User::$domain&#160;.&#160;"/{$msg-&gt;user-&gt;name}/mail\r\n";
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">$out&#160;</span><span style="color: #007700">=&#160;</span><span style="color: #0000BB">$method&#160;</span><span style="color: #007700">.&#160;</span><span style="color: #DD0000">'&#160;'&#160;</span><span style="color: #007700">.&#160;</span><span style="color: #0000BB">$uri&#160;</span><span style="color: #007700">.&#160;</span><span style="color: #DD0000">"&#160;HTTP/1.1\r\n"</span><span style="color: #007700">;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">$out&#160;</span><span style="color: #007700">.=&#160;</span><span style="color: #DD0000">"Host:&#160;apps-apis.google.com\r\n"</span><span style="color: #007700">;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">$out&#160;</span><span style="color: #007700">.=&#160;</span><span style="color: #DD0000">'Content-Type:&#160;application/atom+xml'</span><span style="color: #007700">.</span><span style="color: #DD0000">"\r\n"</span><span style="color: #007700">;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">$out&#160;</span><span style="color: #007700">.=&#160;</span><span style="color: #DD0000">"Authorization:&#160;GoogleLogin&#160;auth=</span><span style="color: #0000BB">$authToken</span><span style="color: #DD0000">\r\n"</span><span style="color: #007700">;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">$out&#160;</span><span style="color: #007700">.=&#160;</span><span style="color: #DD0000">"Content-length:&#160;"&#160;</span><span style="color: #007700">.&#160;</span><span style="color: #0000BB">strlen</span><span style="color: #007700">(</span><span style="color: #0000BB">$httpbody</span><span style="color: #007700">)&#160;.&#160;</span><span style="color: #DD0000">"\r\n"</span><span style="color: #007700">;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">$out&#160;</span><span style="color: #007700">.=&#160;</span><span style="color: #DD0000">"Connection:&#160;Close\r\n\r\n"</span><span style="color: #007700">;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">$out&#160;</span><span style="color: #007700">.=&#160;</span><span style="color: #0000BB">$httpbody</span><span style="color: #007700">;
<br />
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">fwrite</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">,&#160;</span><span style="color: #0000BB">$out</span><span style="color: #007700">);
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">$response&#160;</span><span style="color: #007700">=&#160;</span><span style="color: #DD0000">''</span><span style="color: #007700">;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;while&#160;(!</span><span style="color: #0000BB">feof</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">))&#160;{
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">$response&#160;</span><span style="color: #007700">.=&#160;</span><span style="color: #0000BB">fgets</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">,&#160;</span><span style="color: #0000BB">128</span><span style="color: #007700">);
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">fclose</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">);
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;</span><span style="color: #0000BB">$response</span><span style="color: #007700">;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
<br />&#160;&#160;&#160;&#160;}&#160;</span><span style="color: #FF8000">//&#160;end&#160;send()
<br />&#160;&#160;&#160;&#160;/**
<br />&#160;&#160;&#160;&#160;&#160;*
<br />&#160;&#160;&#160;&#160;&#160;*&#160;@param&#160;$users&#160;liz@example.com,&#160;namrata@example.com,&#160;jake@example.com
<br />&#160;&#160;&#160;&#160;&#160;*&#160;@param&#160;$newOU&#160;new
<br />&#160;&#160;&#160;&#160;&#160;*&#160;@param&#160;$parentOU&#160;first/second
<br />&#160;&#160;&#160;&#160;&#160;*/
<br />&#160;&#160;&#160;&#160;</span><span style="color: #007700">static&#160;function&#160;</span><span style="color: #0000BB">moveUsersToOrganizationUnit</span><span style="color: #007700">(</span><span style="color: #0000BB">$users</span><span style="color: #007700">,&#160;</span><span style="color: #0000BB">$newOU</span><span style="color: #007700">,&#160;</span><span style="color: #0000BB">$parentOU</span><span style="color: #007700">=</span><span style="color: #DD0000">''</span><span style="color: #007700">)
<br />&#160;&#160;&#160;&#160;{
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">$url&#160;</span><span style="color: #007700">=&#160;</span><span style="color: #DD0000">'https://apps-apis.google.com/a/feeds/orgunit/2.0/'&#160;</span><span style="color: #007700">.&#160;</span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">$customerId&#160;</span><span style="color: #007700">.&#160;</span><span style="color: #DD0000">'/'&#160;</span><span style="color: #007700">.&#160;(</span><span style="color: #0000BB">$parentOU&#160;</span><span style="color: #007700">==&#160;</span><span style="color: #DD0000">''&#160;</span><span style="color: #007700">?&#160;</span><span style="color: #DD0000">''&#160;</span><span style="color: #007700">:&#160;</span><span style="color: #0000BB">$parentOU&#160;</span><span style="color: #007700">.&#160;</span><span style="color: #DD0000">'/'</span><span style="color: #007700">)&#160;.&#160;</span><span style="color: #0000BB">$newOU</span><span style="color: #007700">;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">$body&#160;</span><span style="color: #007700">=&#160;</span><span style="color: #DD0000">"&lt;atom:entry&#160;xmlns:atom='http://www.w3.org/2005/Atom'&#160;xmlns:apps='http://schemas.google.com/apps/2006'&gt;\r\n"</span><span style="color: #007700">;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">$body&#160;</span><span style="color: #007700">.=&#160;</span><span style="color: #DD0000">'&#160;&#160;&#160;&#160;&lt;apps:property&#160;name="name"&#160;value="'&#160;</span><span style="color: #007700">.&#160;</span><span style="color: #0000BB">$newOU&#160;</span><span style="color: #007700">.&#160;</span><span style="color: #DD0000">'"&#160;/&gt;'&#160;</span><span style="color: #007700">.&#160;</span><span style="color: #DD0000">"\r\n"</span><span style="color: #007700">;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">$body&#160;</span><span style="color: #007700">.=&#160;</span><span style="color: #DD0000">'&#160;&#160;&#160;&#160;&lt;apps:property&#160;name="description"&#160;value=""&#160;/&gt;'&#160;</span><span style="color: #007700">.&#160;</span><span style="color: #DD0000">"\r\n"</span><span style="color: #007700">;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">$body&#160;</span><span style="color: #007700">.=&#160;</span><span style="color: #DD0000">'&#160;&#160;&#160;&#160;&lt;apps:property&#160;name="parentOrgUnitPath"&#160;value="'&#160;</span><span style="color: #007700">.&#160;(</span><span style="color: #0000BB">$parentOU&#160;</span><span style="color: #007700">==&#160;</span><span style="color: #DD0000">''&#160;</span><span style="color: #007700">?&#160;</span><span style="color: #DD0000">'/'&#160;</span><span style="color: #007700">:&#160;</span><span style="color: #0000BB">$parentOU</span><span style="color: #007700">)&#160;.&#160;</span><span style="color: #DD0000">'"&#160;/&gt;'&#160;</span><span style="color: #007700">.&#160;</span><span style="color: #DD0000">"\r\n"</span><span style="color: #007700">;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">$body&#160;</span><span style="color: #007700">.=&#160;</span><span style="color: #DD0000">'&#160;&#160;&#160;&#160;&lt;apps:property&#160;name="blockInheritance"&#160;value="false"&#160;/&gt;'&#160;</span><span style="color: #007700">.&#160;</span><span style="color: #DD0000">"\r\n"</span><span style="color: #007700">;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">$body&#160;</span><span style="color: #007700">.=&#160;</span><span style="color: #DD0000">'&#160;&#160;&#160;&#160;&lt;apps:property&#160;name="usersToMove"&#160;value="'&#160;</span><span style="color: #007700">.&#160;</span><span style="color: #0000BB">$users&#160;</span><span style="color: #007700">.&#160;</span><span style="color: #DD0000">'"&#160;/&gt;'&#160;</span><span style="color: #007700">.&#160;</span><span style="color: #DD0000">"\r\n"</span><span style="color: #007700">;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000BB">$body&#160;</span><span style="color: #007700">.=&#160;</span><span style="color: #DD0000">'&lt;/atom:entry&gt;'&#160;</span><span style="color: #007700">.&#160;</span><span style="color: #DD0000">"\r\n"</span><span style="color: #007700">;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;</span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">send</span><span style="color: #007700">(</span><span style="color: #DD0000">'PUT'</span><span style="color: #007700">,&#160;</span><span style="color: #0000BB">$url&#160;</span><span style="color: #007700">,&#160;</span><span style="color: #0000BB">$body</span><span style="color: #007700">);
<br />&#160;&#160;&#160;&#160;}
<br />&#160;&#160;&#160;&#160;
<br />}</span>
</span>
</code></div></div></content></entry>	<entry>
			<title>VRT Radio now on air extension</title>
			<link href="http://www.sannoise.be/blog.php?id=69"/>
			<id>http://www.sannoise.be/blog.php?id=69</id>
			<updated>2011-08-07T21:49:06+02:00</updated>
			<published>2011-07-05T02:29:22+02:00</published><content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>In de laatste nieuwe versie van de Opera browser is er gewerkt aan de Speed Dial. Nu kunnen er kleine applicaties draaien in een speed dial, een zogenaamde live speed dial.</p>
<div class="image center"><a href="https://addons.opera.com/addons/extensions/details/vrt-radio-now-on-air-speed-dial-extension/"><img src="/blog/2011/07/vrt-noa.png" alt="" /></a></div>
<p>Al een tijdje terug maakte ik een widget dat de recente nummers van de VRT radiostations weergeeft. Een widget is een programma dat je moet starten vanuit het start menu. Met de live speed dials kan je dit ook makkelijk integreren. Het <a href="https://addons.opera.com/addons/extensions/details/vrt-radio-now-on-air-speed-dial-extension/">VRT Radio now on air extension</a> werd vandaag goedgekeurd en kan nu gedownload worden. Je kan het gebruiken voor volgende radiostations: Radio 1, Radio 2, Klara, Klara continuo, Studio Brussel, MNM, MNM Hits, RVI, Ketnet.</p></div></content></entry>	<entry>
			<title>Pukkelpop 2010 planner</title>
			<link href="http://www.sannoise.be/blog.php?id=68"/>
			<id>http://www.sannoise.be/blog.php?id=68</id>
			<updated>2011-07-04T20:59:56+02:00</updated>
			<published>2010-07-23T01:58:40+02:00</published><content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Pukkelpop 2010 is voor het eerst in zijn geschiedenis uitverkocht. Dat gaat een drukte vanjewelste worden! Het begint bijna traditie te worden dat ik een favorietenlijstje maak en deel met de wereld.</p>

<div class="image center"><img src="/blog/2010/07/pkp2010.png" alt="Pukkelpop 2010" /></div>

<p><del>Op de officiële site staan de uren nog niet.</del> Via Trunk kreeg ik de link naar <a href="http://www.gigo.be/nieuws/tijdschema-pukkelpop.html">de voorlopige programmatie</a>.</p>

<p><a href="/blog/2010/07/voorkeurKoen-v1.txt">Dit zijn mijn voorkeuren</a>.</p>

<ul>
<li><a href="/blog/2010/07/pkp2010_dag1.htm">donderdag 19 augustus</a></li>
<li><a href="/blog/2010/07/pkp2010_dag2.htm">vrijdag 20 augustus</a></li>
<li><a href="/blog/2010/07/pkp2010_dag3.htm">zaterdag 21 augustus</a></li>
<li>Officiële line-up op: <a href="http://www.pukkelpop.be">www.pukkelpop.be</a></li>
</ul></div></content></entry>	<entry>
			<title>Web++</title>
			<link href="http://www.sannoise.be/blog.php?id=67"/>
			<id>http://www.sannoise.be/blog.php?id=67</id>
			<updated>2010-08-04T11:47:30+02:00</updated>
			<published>2009-06-16T22:17:38+02:00</published><content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Da voorbije twee weken zijn er héél interessante technologieën voorgesteld door Google en Opera. Respectievelijk <a href="http://wave.google.com/">Google Wave</a> en <a href="http://unite.opera.com/">Opera Unite</a> hebben mijn aandacht enorm aangegrepen.</p>

<p>Google Wave is zowat mail 2.0. Het is een chat, mail en document collaboration in één webapplicatie. Wat vooral beloftevol is is dat het open source is. Technisch is het niet zo ingewikkeld zelfs want het lijkt me te bouwen op huidige standaarden (en html5).</p>

<p>Maar nog meer ondersteboven ben ik van Opera Unite. Het client - server model wordt geheel op zijn kop gezet. Clientserver - clientserver is de toekomst volgens Opera. Met de opkomende Opera&#160;10 versie krijg je geen browserclient meer maar ook een server component. Het is als het ware een Flickr, Last.fm, Facebook ineen gehost op je eigen pc (en gecentraliseerd op de Opera Unite server). Geen nodeloos uploaden naar 20 verschillende website het draait gewoon bij je thuis. Het concept klinkt simpel maar je moet het gewoon eens uittesten.</p>

<p>Ik ben voorlopig te enthousiast en moet het even laten bezinken alvorens ik verdere uitspraken doe. Het is sinds het begin van html5 geleden dat ik nog zo enthousiast ben geweest over het hele web gebeuren!</p></div></content></entry></feed>
