<?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>DoneBySimon</title>
	<atom:link href="https://www.donebysimon.be/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.donebysimon.be</link>
	<description>Binnen en buiten de lijntjes code</description>
	<lastBuildDate>Tue, 18 Jun 2019 19:47:28 +0000</lastBuildDate>
	<language>nl-BE</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.2.6</generator>
	<item>
		<title>Buda Kitchen Bot</title>
		<link>https://www.donebysimon.be/2019/06/18/buda-kitchen-bot/</link>
				<pubDate>Tue, 18 Jun 2019 19:47:28 +0000</pubDate>
		<dc:creator><![CDATA[donebysimon]]></dc:creator>
				<category><![CDATA[Project]]></category>

		<guid isPermaLink="false">https://www.donebysimon.be/?p=1025</guid>
				<description><![CDATA[Een Google Assistant action waaraan je kan vragen wat er vandaag op het menu staat in Buda Kitchen Kortrijk.]]></description>
								<content:encoded><![CDATA[
<p>Een <a href="https://assistant.google.com/services/a/uid/0000004f817c7aef?hl=nl">Google Assistant action</a> waaraan je kan vragen wat er vandaag op het menu staat in <a href="http://budakitchen.be">Buda Kitchen Kortrijk.</a></p>



<iframe
    allow="microphone;"
    width="350"
    height="430"
    src="https://console.dialogflow.com/api-client/demo/embedded/a2012c12-6920-4cfc-8195-36bc20429188">
</iframe>



<p></p>
]]></content:encoded>
										</item>
		<item>
		<title>TabCyclist</title>
		<link>https://www.donebysimon.be/2019/02/20/tabcyclist/</link>
				<pubDate>Wed, 20 Feb 2019 05:50:16 +0000</pubDate>
		<dc:creator><![CDATA[donebysimon]]></dc:creator>
				<category><![CDATA[Project]]></category>

		<guid isPermaLink="false">https://www.donebysimon.be/?p=1018</guid>
				<description><![CDATA[Extensie voor VS Code om automatisch andere tabbladen weer te geven, net zoals een slideshow.]]></description>
								<content:encoded><![CDATA[
<p><a href="https://marketplace.visualstudio.com/items?itemName=donebysimon.tabcyclist">Extensie voor VS Code</a> om automatisch andere tabbladen weer te geven, net zoals een slideshow.</p>



<div class="wp-block-image"><figure class="aligncenter"><img src="https://github.com/SimonVanherweghe/TabCyclist/raw/master/images/cyclistdemo.gif" alt=""/></figure></div>
]]></content:encoded>
										</item>
		<item>
		<title>Everywhere I go it&#8217;s disco</title>
		<link>https://www.donebysimon.be/2018/01/27/everywhere-i-go-its-disco/</link>
				<pubDate>Sat, 27 Jan 2018 05:54:24 +0000</pubDate>
		<dc:creator><![CDATA[donebysimon]]></dc:creator>
				<category><![CDATA[Project]]></category>

		<guid isPermaLink="false">https://www.donebysimon.be/?p=1020</guid>
				<description><![CDATA[]]></description>
								<content:encoded><![CDATA[
<figure class="wp-block-embed-instagram wp-block-embed is-type-rich is-provider-instagram"><div class="wp-block-embed__wrapper">
<blockquote class="instagram-media" data-instgrm-captioned data-instgrm-permalink="https://www.instagram.com/p/BecZ-DjhC58/?utm_source=ig_embed&amp;utm_medium=loading" data-instgrm-version="12" style=" background:#FFF; border:0; border-radius:3px; box-shadow:0 0 1px 0 rgba(0,0,0,0.5),0 1px 10px 0 rgba(0,0,0,0.15); margin: 1px; max-width:658px; min-width:326px; padding:0; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);"><div style="padding:16px;"> <a href="https://www.instagram.com/p/BecZ-DjhC58/?utm_source=ig_embed&amp;utm_medium=loading" style=" background:#FFFFFF; line-height:0; padding:0 0; text-align:center; text-decoration:none; width:100%;" target="_blank"> <div style=" display: flex; flex-direction: row; align-items: center;"> <div style="background-color: #F4F4F4; border-radius: 50%; flex-grow: 0; height: 40px; margin-right: 14px; width: 40px;"></div> <div style="display: flex; flex-direction: column; flex-grow: 1; justify-content: center;"> <div style=" background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; margin-bottom: 6px; width: 100px;"></div> <div style=" background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; width: 60px;"></div></div></div><div style="padding: 19% 0;"></div><div style="display:block; height:50px; margin:0 auto 12px; width:50px;"><svg width="50px" height="50px" viewBox="0 0 60 60" version="1.1" xmlns="https://www.w3.org/2000/svg" xmlns:xlink="https://www.w3.org/1999/xlink"><g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g transform="translate(-511.000000, -20.000000)" fill="#000000"><g><path d="M556.869,30.41 C554.814,30.41 553.148,32.076 553.148,34.131 C553.148,36.186 554.814,37.852 556.869,37.852 C558.924,37.852 560.59,36.186 560.59,34.131 C560.59,32.076 558.924,30.41 556.869,30.41 M541,60.657 C535.114,60.657 530.342,55.887 530.342,50 C530.342,44.114 535.114,39.342 541,39.342 C546.887,39.342 551.658,44.114 551.658,50 C551.658,55.887 546.887,60.657 541,60.657 M541,33.886 C532.1,33.886 524.886,41.1 524.886,50 C524.886,58.899 532.1,66.113 541,66.113 C549.9,66.113 557.115,58.899 557.115,50 C557.115,41.1 549.9,33.886 541,33.886 M565.378,62.101 C565.244,65.022 564.756,66.606 564.346,67.663 C563.803,69.06 563.154,70.057 562.106,71.106 C561.058,72.155 560.06,72.803 558.662,73.347 C557.607,73.757 556.021,74.244 553.102,74.378 C549.944,74.521 548.997,74.552 541,74.552 C533.003,74.552 532.056,74.521 528.898,74.378 C525.979,74.244 524.393,73.757 523.338,73.347 C521.94,72.803 520.942,72.155 519.894,71.106 C518.846,70.057 518.197,69.06 517.654,67.663 C517.244,66.606 516.755,65.022 516.623,62.101 C516.479,58.943 516.448,57.996 516.448,50 C516.448,42.003 516.479,41.056 516.623,37.899 C516.755,34.978 517.244,33.391 517.654,32.338 C518.197,30.938 518.846,29.942 519.894,28.894 C520.942,27.846 521.94,27.196 523.338,26.654 C524.393,26.244 525.979,25.756 528.898,25.623 C532.057,25.479 533.004,25.448 541,25.448 C548.997,25.448 549.943,25.479 553.102,25.623 C556.021,25.756 557.607,26.244 558.662,26.654 C560.06,27.196 561.058,27.846 562.106,28.894 C563.154,29.942 563.803,30.938 564.346,32.338 C564.756,33.391 565.244,34.978 565.378,37.899 C565.522,41.056 565.552,42.003 565.552,50 C565.552,57.996 565.522,58.943 565.378,62.101 M570.82,37.631 C570.674,34.438 570.167,32.258 569.425,30.349 C568.659,28.377 567.633,26.702 565.965,25.035 C564.297,23.368 562.623,22.342 560.652,21.575 C558.743,20.834 556.562,20.326 553.369,20.18 C550.169,20.033 549.148,20 541,20 C532.853,20 531.831,20.033 528.631,20.18 C525.438,20.326 523.257,20.834 521.349,21.575 C519.376,22.342 517.703,23.368 516.035,25.035 C514.368,26.702 513.342,28.377 512.574,30.349 C511.834,32.258 511.326,34.438 511.181,37.631 C511.035,40.831 511,41.851 511,50 C511,58.147 511.035,59.17 511.181,62.369 C511.326,65.562 511.834,67.743 512.574,69.651 C513.342,71.625 514.368,73.296 516.035,74.965 C517.703,76.634 519.376,77.658 521.349,78.425 C523.257,79.167 525.438,79.673 528.631,79.82 C531.831,79.965 532.853,80.001 541,80.001 C549.148,80.001 550.169,79.965 553.369,79.82 C556.562,79.673 558.743,79.167 560.652,78.425 C562.623,77.658 564.297,76.634 565.965,74.965 C567.633,73.296 568.659,71.625 569.425,69.651 C570.167,67.743 570.674,65.562 570.82,62.369 C570.966,59.17 571,58.147 571,50 C571,41.851 570.966,40.831 570.82,37.631"></path></g></g></g></svg></div><div style="padding-top: 8px;"> <div style=" color:#3897f0; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:550; line-height:18px;"> View this post on Instagram</div></div><div style="padding: 12.5% 0;"></div> <div style="display: flex; flex-direction: row; margin-bottom: 14px; align-items: center;"><div> <div style="background-color: #F4F4F4; border-radius: 50%; height: 12.5px; width: 12.5px; transform: translateX(0px) translateY(7px);"></div> <div style="background-color: #F4F4F4; height: 12.5px; transform: rotate(-45deg) translateX(3px) translateY(1px); width: 12.5px; flex-grow: 0; margin-right: 14px; margin-left: 2px;"></div> <div style="background-color: #F4F4F4; border-radius: 50%; height: 12.5px; width: 12.5px; transform: translateX(9px) translateY(-18px);"></div></div><div style="margin-left: 8px;"> <div style=" background-color: #F4F4F4; border-radius: 50%; flex-grow: 0; height: 20px; width: 20px;"></div> <div style=" width: 0; height: 0; border-top: 2px solid transparent; border-left: 6px solid #f4f4f4; border-bottom: 2px solid transparent; transform: translateX(16px) translateY(-4px) rotate(30deg)"></div></div><div style="margin-left: auto;"> <div style=" width: 0px; border-top: 8px solid #F4F4F4; border-right: 8px solid transparent; transform: translateY(16px);"></div> <div style=" background-color: #F4F4F4; flex-grow: 0; height: 12px; width: 16px; transform: translateY(-4px);"></div> <div style=" width: 0; height: 0; border-top: 8px solid #F4F4F4; border-left: 8px solid transparent; transform: translateY(-4px) translateX(8px);"></div></div></div></a> <p style=" margin:8px 0 0 0; padding:0 4px;"> <a href="https://www.instagram.com/p/BecZ-DjhC58/?utm_source=ig_embed&amp;utm_medium=loading" style=" color:#000; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px; text-decoration:none; word-wrap:break-word;" target="_blank">Everywhere I go it&#39;s disco &#8211; @donebysimon &#8211; 2018 &#8211; scrapwood and other leftovers.</a></p> <p style=" color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; line-height:17px; margin-bottom:0; margin-top:8px; overflow:hidden; padding:8px 0 7px; text-align:center; text-overflow:ellipsis; white-space:nowrap;">A post shared by <a href="https://www.instagram.com/donebysimon/?utm_source=ig_embed&amp;utm_medium=loading" style=" color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px;" target="_blank"> Simon Vanherweghe</a> (@donebysimon) on <time style=" font-family:Arial,sans-serif; font-size:14px; line-height:17px;" datetime="2018-01-27T07:03:44+00:00">Jan 26, 2018 at 11:03pm PST</time></p></div></blockquote><script async src="//www.instagram.com/embed.js"></script>
</div></figure>
]]></content:encoded>
										</item>
		<item>
		<title>Een Tesla voor Simon</title>
		<link>https://www.donebysimon.be/2017/09/19/een-tesla-voor-simon/</link>
				<pubDate>Tue, 19 Sep 2017 05:34:35 +0000</pubDate>
		<dc:creator><![CDATA[donebysimon]]></dc:creator>
				<category><![CDATA[Project]]></category>

		<guid isPermaLink="false">https://www.donebysimon.be/?p=1014</guid>
				<description><![CDATA[Door te surfen naar eenteslavoorsimon.be helpt de bezoeker mee in z&#8217;n browser Monero&#8217;s cryptocurrency minen. De Morgen Krant van West-Vlaanderen]]></description>
								<content:encoded><![CDATA[
<p>Door te surfen naar <a href="https://eenteslavoorsimon.be/">eenteslavoorsimon.be</a> helpt de bezoeker mee in z&#8217;n browser Monero&#8217;s cryptocurrency minen.</p>



<figure class="wp-block-image"><a href=" eenteslavoorsimon.be"><img src="https://www.donebysimon.be/wp-content/uploads/2019/03/Screenshot-2019-03-01-at-06.44.28.png" alt="" class="wp-image-1015" srcset="https://www.donebysimon.be/wp-content/uploads/2019/03/Screenshot-2019-03-01-at-06.44.28.png 1011w, https://www.donebysimon.be/wp-content/uploads/2019/03/Screenshot-2019-03-01-at-06.44.28-300x221.png 300w, https://www.donebysimon.be/wp-content/uploads/2019/03/Screenshot-2019-03-01-at-06.44.28-768x565.png 768w" sizes="(max-width: 1011px) 100vw, 1011px" /></a></figure>



<ul><li><a href="https://www.demorgen.be/economie/simon-wil-graag-een-tesla-en-u-kunt-hem-daarbij-helpen-b123f36e/">De Morgen</a></li><li><a href="https://kw.knack.be/west-vlaanderen/nieuws/onderwijs-en-jeugd/docent-howest-wil-tesla-verdienen-met-jouw-computer/article-normal-279253.html">Krant van West-Vlaanderen</a></li></ul>



<figure class="wp-block-embed-twitter wp-block-embed is-type-rich is-provider-twitter"><div class="wp-block-embed__wrapper">
<blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="nl" dir="ltr">Coinhive (de dienst achter <a href="https://t.co/AFeBrQJXSB">https://t.co/AFeBrQJXSB</a>) is gestopt. We kloppen of op 197 226 752 hashes (<a href="https://twitter.com/hashtag/merci?src=hash&amp;ref_src=twsrc%5Etfw">#merci</a>) goed voor 0,02561 XMR. Met een transaction fee van 0,005 XMR heeft dit 0,02060 XMR opgebracht. 1 XMR is op dit moment €44,12<br>Still, totally worth it <img src="https://s.w.org/images/core/emoji/12.0.0-1/72x72/1f911.png" alt="🤑" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>&mdash; Simon Vanherweghe (@donebysimon) <a href="https://twitter.com/donebysimon/status/1106099705237393408?ref_src=twsrc%5Etfw">March 14, 2019</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</div></figure>
]]></content:encoded>
										</item>
		<item>
		<title>BudaBeachBot</title>
		<link>https://www.donebysimon.be/2017/05/01/budabeachbot/</link>
				<pubDate>Mon, 01 May 2017 05:18:43 +0000</pubDate>
		<dc:creator><![CDATA[donebysimon]]></dc:creator>
				<category><![CDATA[Project]]></category>

		<guid isPermaLink="false">https://www.donebysimon.be/?p=1008</guid>
				<description><![CDATA[Boten aan Buda Beach, Kortrijk https://twitter.com/budabeachbot]]></description>
								<content:encoded><![CDATA[
<p>Boten aan Buda Beach, Kortrijk <br><br><a href="https://twitter.com/budabeachbot">https://twitter.com/budabeachbot</a></p>



<figure class="wp-block-embed-twitter wp-block-embed is-type-rich is-provider-twitter"><div class="wp-block-embed__wrapper">
<blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">boat <a href="https://t.co/AtX5MbwLIC">pic.twitter.com/AtX5MbwLIC</a></p>&mdash; BudaBeachBot (@budabeachbot) <a href="https://twitter.com/budabeachbot/status/1101166241908178944?ref_src=twsrc%5Etfw">February 28, 2019</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</div></figure>
]]></content:encoded>
										</item>
		<item>
		<title>Kortrijk 14-18</title>
		<link>https://www.donebysimon.be/2013/11/01/kortrijk-14-18/</link>
				<pubDate>Fri, 01 Nov 2013 05:23:41 +0000</pubDate>
		<dc:creator><![CDATA[donebysimon]]></dc:creator>
				<category><![CDATA[Project]]></category>

		<guid isPermaLink="false">https://www.donebysimon.be/?p=1012</guid>
				<description><![CDATA[Kortrijk in de eerste wereldoorlog, dag op dag, 100 jaar geleden. https://twitter.com/Kortrijk1418/]]></description>
								<content:encoded><![CDATA[
<p>Kortrijk in de eerste wereldoorlog, dag op dag, 100 jaar geleden.</p>



<p><a href="https://twitter.com/Kortrijk1418/">https://twitter.com/Kortrijk1418/</a></p>



<figure class="wp-block-embed-twitter wp-block-embed is-type-rich is-provider-twitter"><div class="wp-block-embed__wrapper">
<blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="nl" dir="ltr">Het station en stationsplein worden door bommen beschadigd, alle ruiten op het plein zijn kapot. 2 soldaten en een burger overlijden. <a href="https://t.co/gRri6vyl5f">pic.twitter.com/gRri6vyl5f</a></p>&mdash; Kortrijk 14-18 (@Kortrijk1418) <a href="https://twitter.com/Kortrijk1418/status/924176431608889344?ref_src=twsrc%5Etfw">October 28, 2017</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</div></figure>
]]></content:encoded>
										</item>
		<item>
		<title>Retrieving single cell values from a Google Spreadsheet XML/JSON feed</title>
		<link>https://www.donebysimon.be/2013/04/18/retrieving-single-cell-values-from-a-google-spreadsheet-xmljson-feed/</link>
				<pubDate>Thu, 18 Apr 2013 19:43:56 +0000</pubDate>
		<dc:creator><![CDATA[donebysimon]]></dc:creator>
				<category><![CDATA[Tech stuff]]></category>

		<guid isPermaLink="false">http://www.donebysimon.be/?p=922</guid>
				<description><![CDATA[Je kan een Google Docs/Drive spreadsheet publiceren als rss feed via &#8216;bestand&#8217; -&#62; &#8216;publiceren op internet&#8217; en dan voor RSS kiezen. Lijkt handig, maar in de praktijk maakt Google hier een feed van met per rij 2 items: een titel en een description. Dit staat ook zo in de docs: Each entry represents a row [&#8230;]]]></description>
								<content:encoded><![CDATA[<p>Je kan een Google Docs/Drive spreadsheet publiceren als rss feed via &#8216;bestand&#8217; -&gt; &#8216;publiceren op internet&#8217; en dan voor RSS kiezen.</p>
<p>Lijkt handig, maar in de praktijk maakt Google hier een feed van met per rij 2 items: een titel en een description.<br />
Dit staat ook zo in de <a title="https://developers.google.com/google-apps/spreadsheets/#working_with_list-based_feeds" href="https://developers.google.com/google-apps/spreadsheets/#working_with_list-based_feeds" target="_blank">docs</a>:</p>
<blockquote><p>Each entry represents a row in the worksheet. The <code>title</code> element contains the contents of the first cell in the row, and the <code>content</code> element contains a textual representation of the data from all the other cells in the row.</p></blockquote>
<p>Redelijk ambetant dus</p>
<p>Wat ze er niet meteen bijzeggen is dat je de waardes ook apart kan verkrijgen. Het is een kwestie van de parameters in de url wat aan te passen:</p>
<p>Standaard ziet het er zo uit:<br />
<code>https://spreadsheets.google.com/feeds/list/[spreadsheet-id]/od6/public/basic?alt=rss</code><br />
Het enige wat je hoeft te doen is die &#8216;basic&#8217; door &#8216;values&#8217; te vervangen:<br />
<code>https://spreadsheets.google.com/feeds/list/[spreadsheet-id]/od6/public/values?alt=rss</code><br />
En voor als je een json string wil:<br />
<code>https://spreadsheets.google.com/feeds/list/[spreadsheet-id]/od6/public/values?alt=json</code></p>
<p>Alle cellen in een rij zijn nu apart aanspreekbaar. Ze zijn voorzien van een prefix &#8216;gsx&#8217;, dit komt door de namespace die ze gebruiken om de xml valid te houden.</p>
<p>Je moet er ook wel voor zorgen dat de eerste rij in jouw spreadsheet de kolomkoppen bevat.</p>
<p>&nbsp;</p>
<p>English version:</p>
<p>Just use &#8216;values&#8217; instead of &#8216;basic&#8217; in the url</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
										</item>
		<item>
		<title>iPhone internet access in Rwanda and Congo</title>
		<link>https://www.donebysimon.be/2010/08/04/iphone-internet-access-in-rwanda-and-congo/</link>
				<pubDate>Wed, 04 Aug 2010 14:07:31 +0000</pubDate>
		<dc:creator><![CDATA[donebysimon]]></dc:creator>
				<category><![CDATA[Buiten categorie]]></category>

		<guid isPermaLink="false">http://www.donebysimon.be/?p=913</guid>
				<description><![CDATA[It works, but you have to know how. Rwanda Buy a MTN sim card, insert it into an other phone and call 455 to have an internet activated sim card. (For some reason this didn&#8217;t work by activating it on my iPhone itself) The apn you need is: &#8216;internet.mtn&#8217; cost: 30 Rwf per Mb (0,052 [&#8230;]]]></description>
								<content:encoded><![CDATA[<p>It works, but you have to know how.</p>
<p><strong>Rwanda<br />
<span style="font-weight: normal;">Buy a MTN sim card, insert it into an other phone and call 455 to have an internet activated sim card. (For some reason this didn&#8217;t work by activating it on my iPhone itself)<br />
The apn you need is: &#8216;internet.mtn&#8217;<br />
cost: 30 Rwf per Mb (0,052 $/Mb) (see the <a href="http://www.mtn.co.rw/index/pinternet-mtninternet">mtn website</a>)</span></strong></p>
<p><strong>Congo<br />
<span style="font-weight: normal;">Buy a Vodacom sim card, insert it into your iPhone and just set your apn to: &#8216;vodanet&#8217; (I went to a vodacom shop to activate it, but I think that&#8217;s all they did&#8230;)<br />
cost: 0,40 $/Mb (says the <a href="http://www.vodacom.cd/vodanet.htm">Vodacom site</a>, but I think it was less expensive)</span></strong></p>
]]></content:encoded>
										</item>
		<item>
		<title>Nifty caching</title>
		<link>https://www.donebysimon.be/2010/02/18/nifty-caching/</link>
				<pubDate>Thu, 18 Feb 2010 21:27:31 +0000</pubDate>
		<dc:creator><![CDATA[donebysimon]]></dc:creator>
				<category><![CDATA[Tech stuff]]></category>

		<guid isPermaLink="false">http://www.donebysimon.be/?p=898</guid>
				<description><![CDATA[De beginpagina bestaat uit content die van op verschillende plaatsten komt. Die telkens te gaan ophalen en verwerken zou te veel tijd in beslag nemen en de server onnodig bezig houden. Ik moest dus wel wat aandacht aan de performantie wijden, gewoon voor jullie, dat jullie niet telkens te lang moeten wachten. Ik heb dit [&#8230;]]]></description>
								<content:encoded><![CDATA[<p>De beginpagina bestaat uit content die van op verschillende plaatsten komt. Die telkens te gaan ophalen en verwerken zou te veel tijd in beslag nemen en de server onnodig bezig houden. Ik moest dus wel wat aandacht aan de performantie wijden, gewoon voor jullie, dat jullie niet telkens te lang moeten wachten. Ik heb dit op verschillende niveau&#8217;s aangepakt:</p>
<p><span id="more-898"></span><strong>Alles in één<br />
<span style="font-weight: normal;">Er staat een script op de server dat alle content ophaalt en dit dan wegschrijft in een bestandje. Bij een bezoek is het gewoon een kwestie van die weggeschreven content uit te lezen. Die content moet natuurlijk zo nu en dan een update krijgen, maar straks meer daar over.</span></strong></p>
<p><strong>Minder http requests<br />
<span style="font-weight: normal;">Een webpagina bestaat uit vele bestanden (javascripts, stylesheets&#8230;) Voor ieder bestand is er een http request nodig om dit te gaan ophalen. Dit brengt op zich al een vertraging met zich mee. Een oplossing kan zijn om alles in één groot bestand te stoppen, maar dat is verre van praktisch. Ik ben op <a title="http://rakaz.nl/2006/12/make-your-pages-load-faster-by-combining-and-compressing-javascript-and-css-files.html" href="http://rakaz.nl/2006/12/make-your-pages-load-faster-by-combining-and-compressing-javascript-and-css-files.html">een handig script</a> uitgekomen dat dit oplost. Alle losse bestanden worden onderschept en in één groot bestand gestopt én als surplus gecached.</span></strong></p>
<p><strong>Cachen<br />
<span style="font-weight: normal;">De beginpagina is php, kortweg haalt die de inhoud uit het contentbestand, zet alles op de juiste plaats en maakt de WordPress blog aan. Alles gaat naar de gebruiker in de vorm van een html pagina, zoals alle php pagina&#8217;s. Met het cachen sla ik die gegenereerde pagina op. Bij een volgend bezoek geef ik gewoon die gecachte pagina weer. Als er niks veranderd is, dan moet er ook niks opnieuw gegenereerd worden. Ik heb <a title="http://www.developertutorials.com/tutorials/php/php-caching/page1.html" href="http://www.developertutorials.com/tutorials/php/php-caching/page1.html">die mosterd hier</a> gehaald.</span></strong></p>
<p>Nu moet je ooit wel eens opnieuw je pagina laten genereren. Je kan dat bijvoorbeeld na een bepaalde tijd doen of door eerst te kijken of er wel iets aangepast is. Ik heb voor dit laatste gekozen: als het contentbestand recenter is dan de gecachte pagina, dan moet de pagina opnieuw gegenereerd worden.</p>
<p><strong>Content updaten<br />
<span style="font-weight: normal;">Het contentbestand moet zo nu en dan ge-update worden. Dit zou kunnen met een zogenaamde cronjob, waarbij de server een script om-de-zoveel-tijd gaat uitvoeren. Maar dit is niet ideaal: wacht ik te lang met updaten, dan is de content hier niet up-to-date. Laat ik het te vaak runnen, dan zorgt dit voor onnodige belasting van de server.<br />
Het interval van updaten zal bepaald worden door de content die het snelst aangepast is, dit is -hier zeker- Twitter.<br />
Bij het posten van een blog item kan je pingen, laten weten aan een of andere service dat er een nieuwe post is. Bij Twitter kan dit niet, (of toch niet dat ik weet) dus moet ik het anders doen.<br />
Eenmaal de pagina volledig is ingeladen stuur ik een <a title="http://nl.wikipedia.org/wiki/Asynchronous_JavaScript_and_XML" href="http://nl.wikipedia.org/wiki/Asynchronous_JavaScript_and_XML">Ajax</a> request naar de server met daarin de id van de laatste tweet die op die pagina staat. Hier heeft de gebruiker geen last van, de pagina is al compleet ingeladen. De server gaat kijken of er een tweets zijn met id&#8217;s die groter zijn dan deze die op de pagina staan. Als dit het geval is worden deze terug gezonden naar de gebruiker en in de lijst met tweets geplaatst. Op dit punt ziet de gebruiker een up-to-date lijst met tweets. Als er nieuwe tweets gevonden zijn (en alleen dan) vertrekt er opnieuw een Ajax request naar de server, maar dan om het content bestand opnieuw te genereren. Bij de volgende pagina weergave zal blijken dat het content bestand recenter is dan de cache, en krijgt men meteen de up-to-date lijst met tweets (én al de rest)</span></strong></p>
<p><span style="font-weight: normal;"><strong>Resultaten<br />
<span style="font-weight: normal;"><strong><span style="font-weight: normal;">Ophalen, verwerken en wegschrijven van content naar contenbestand: 4.28s<br />
Inladen beginpagina in Firefox, browsercache uitgeschakeld:</span></strong></span></strong></span></p>
<table>
<tbody>
<tr>
<td>Firebug</td>
<td>Html</td>
<td>CSS</td>
<td>Javascript</td>
</tr>
<tr>
<td>Meerdere requests<br />
Geen caching</td>
<td>1.82 s</td>
<td>392 ms</td>
<td>859 ms</td>
</tr>
<tr>
<td>Gebundelde requests<br />
Geen caching</td>
<td>1.63 s</td>
<td>254 ms</td>
<td>571 ms</td>
</tr>
<tr>
<td>Gebundelde requests<br />
Caching</td>
<td>157 ms</td>
<td>170 ms</td>
<td>568 ms</td>
</tr>
</tbody>
</table>
<p><span style="font-weight: normal;"><strong> </strong></span></p>
<p>Vooral bij het cachen is het resultaat erg zichtbaar. De rest valt nog mee.<br />
Zonder dit alles zou elke weergave van de beginpagina meer dan 5 seconden duren&#8230;</p>
<p><strong>Maar&#8230;<br />
<span style="font-weight: normal;">Er zijn wel wat kanttekeningen bij: bij elke homepagina weergave vertrekt er achteraf nog een request naar de server. Deze moet dan telkens Twitter gaan aanspreken, dat is overkill. Qua bezoekers zal het hier wel nog meevallen, maar echt fijn is het niet. Er zou op z&#8217;n minst een soort tijdslimiet mogen inzitten, dat hij maar 1 keer per minuut gaat controleren of zo&#8230;<br />
Alles is wat experimenteel, 2-3 manieren samen gesmeten, hmm. Maar alles lijkt goed te werken, we zien wel.</span></strong></p>
<p><strong>Update</strong><br />
Met @ikbenmartijn wat over-en-weer zitten tweeten, en tot de volgende inzicht gekomen:</p>
<ul>
<li>Ik heb de datum nodig van de laatste zijn-er-nog tweets request</li>
<li>M&#8217;n eerste idee was om die datum ook bij te houden in het content bestand. Telkens als een request binnen komt voor nieuwe tweets, dan de datum daar gaan aanpassen.</li>
<li>Met het aanmaken van de index pagina, gewoon die datum in de javascript zetten, en die kan dan gaan kijken of er genoeg tijd tussen de requests zou zitten.</li>
<li>Enigste probleem hierbij: die index pagina is gecached natuurlijk, en dat wil zeggen dat die geen recente datum info kan hebben staan <img src="https://s.w.org/images/core/emoji/12.0.0-1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></li>
</ul>
]]></content:encoded>
										</item>
		<item>
		<title>Fijne webwaren!</title>
		<link>https://www.donebysimon.be/2010/02/17/fijne-webwaren/</link>
				<comments>https://www.donebysimon.be/2010/02/17/fijne-webwaren/#comments</comments>
				<pubDate>Wed, 17 Feb 2010 22:13:53 +0000</pubDate>
		<dc:creator><![CDATA[donebysimon]]></dc:creator>
				<category><![CDATA[Het leven zoals het is]]></category>

		<guid isPermaLink="false">http://www.donebysimon.be/?p=598</guid>
				<description><![CDATA[Dit is het dan: mijn comeback! De laatste post is van april 2009, het gaat snel. Klein woordje uitleg misschien? Eerst op de vraag: wat is dat hier? Het bleek dat de frequentie van m&#8217;n tweets omgekeerd evenredig was met die van m&#8217;n blog posts. Eigenlijk is bloggen slechts een deel van m&#8217;n activiteit op [&#8230;]]]></description>
								<content:encoded><![CDATA[<p>Dit is het dan: mijn comeback! De laatste post is van april 2009, het gaat snel.</p>
<p>Klein woordje uitleg misschien?</p>
<p>Eerst op de vraag: wat is dat hier?</p>
<ul>
<li>Het bleek dat de frequentie van m&#8217;n tweets omgekeerd evenredig was met die van m&#8217;n blog posts.</li>
<li>Eigenlijk is bloggen slechts een deel van m&#8217;n activiteit op het web. Daarnaast tweet ik, zet ik foto&#8217;s en filmpkes online, scrobble ik muziek, check ik in, en wie weet wat er nog allemaal zal bijkomen.</li>
<li>Bedoeling is om hier gewoon al die zaken te bundelen.</li>
<li>&#8216;100% vet&#8217; om in het thema van de fijne webwaren te blijven, dat typisch beenhouwerpapier mag zeker niet ontbreken.</li>
<li>Er is wel nog wat werk aan, zo ben ik niet content van die header. Als er iemand een beter voorstel heeft: please, shoot!</li>
<li>Het zal nog wat finetunen worden, her en der marcheren er dingen nog niet. Maar we zijn nu op z&#8217;n minst terug vertrokken.</li>
</ul>
<p>Op de vraag: Wat is er eigenlijk gebeurd?</p>
<ul>
<li>Plots kreeg ik de vraag wat er met m&#8217;n blog aan de hand was, ik had het zelf nog niet eens opgemerkt.</li>
<li>Blijkbaar had m&#8217;n vroegere host te veel security problemen met WordPress en heeft dan besloten om geen installaties meer toe te laten. In mijn geval zelfs te wissen.</li>
<li>Soit, geen probleem, verhuizen naar een andere host dan maar, ik had nog wel ergens een backup staan.</li>
<li>Hmm, strange</li>
<li>Blijkbaar had ik de backup overschreven met de blog van de scouts, merde</li>
<li>Nog een paar keer gepolst bij m&#8217;n vorige host, helaas, die konden me ook geen backup van de database bezorgen.</li>
<li>Eigenlijk is dat wel jammer, al die gegenereerde content, zo maar weg?</li>
<li>Bleek dat er nog redelijk wat terug te vinden is op <a title="http://web.archive.org/web/20061130201527/http://www.donebysimon.be/" href="http://web.archive.org/web/20061130201527/http://www.donebysimon.be/">The Wayback Machine</a> Ik vermoed dat ik hiermee 70% kan recoveren.</li>
<li><a title="http://web.archive.org/web/20061130201527/http://www.donebysimon.be/" href="http://web.archive.org/web/20061130201527/http://www.donebysimon.be/"></a>Copy-pasten dan maar&#8230;</li>
<li>Voor de een of andere reden waren er geen items meer te bespeuren na juni 2008&#8230;</li>
<li>Na wat googlen bleek dat ik als <a title="http://www.nieuws.be/bron/donebysimon.aspx" href="http://www.nieuws.be/bron/donebysimon.aspx">een bron op nieuws.be</a> aanzien was.</li>
<li>Slechts een korte inleiding op de artikels, maar enfin, het is al iets. Merci <a title="www.nieuws.be" href="http://www.nieuws.be">Nieuws.be</a></li>
</ul>
]]></content:encoded>
							<wfw:commentRss>https://www.donebysimon.be/2010/02/17/fijne-webwaren/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
							</item>
	</channel>
</rss>
