<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wikidot="http://www.wikidot.com/rss-namespace">

	<channel>
		<title>Piotr Gabryjeluk blog:wikidot</title>
		<link>http://piotr.gabryjeluk.pl</link>
		<description>Blog, photos and developer notes of Piotr Gabryjeluk, one of Wikidot.com developers.</description>
				<copyright></copyright>
		<lastBuildDate></lastBuildDate>
		
					<item>
				<guid>http://piotr.gabryjeluk.pl/dev:changes-not-really</guid>
				<title>Changes? Not Really</title>
				<link>http://piotr.gabryjeluk.pl/dev:changes-not-really</link>
				<description>

&lt;p&gt;As announced on &lt;a href=&quot;http://blog.wikidot.com/blog:good-morning-wikidot&quot;&gt;Wikidot blog&lt;/a&gt;, CEO of Wikidot.com is changing. The position of CEO of Wikidot has been hold by Pieter Hintjens, now changed by Michał Frąckowiak, the founder of Wikidot service.&lt;/p&gt;
&lt;p&gt;Pieter was the Wikidot front-man for its community and organized good workflow for many community and internal projects. We learned how to talk to the community, how to solve problems and how to concentrate on important things. And we&#039;re going to keep being good at it.&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;&lt;!--[if gte IE 7]&gt;&lt;!--&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common--images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=2462)&quot; /&gt;&lt;!--&lt;![endif]--&gt;&lt;!--[if lt IE 7]&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common&amp;#45;&amp;#45;images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod=&#039;scale&#039;)&quot;/&gt;&lt;![endif]--&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;Gabrys&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Sun, 28 Feb 2010 17:36:28 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>As announced on <a href="http://blog.wikidot.com/blog:good-morning-wikidot">Wikidot blog</a>, CEO of Wikidot.com is changing. The position of CEO of Wikidot has been hold by Pieter Hintjens, now changed by Michał Frąckowiak, the founder of Wikidot service.</p> <p>Pieter was the Wikidot front-man for its community and organized good workflow for many community and internal projects. We learned how to talk to the community, how to solve problems and how to concentrate on important things. And we're going to keep being good at it.</p> <div class="content-separator" style="display: none:"></div> <p>With the addition of data forms Wikidot becomes one of the most interesting wiki platfarms (platform + farm) on the Earth. Using ListPages, _templates and forms we allow (almost) regular folks to create applications like CMS for their co-workers, clients or friends. Things usually done by programmers are now available for smart guys without need to find proper hosting, web framework or writing a line of computer code.</p> <p>What I find most interesting in building applications on Wikidot is that the platform itself is quite bullet-proof. I mean when you forget to put semicolon at the end of some line, you don't get your application crashing because of syntax error. Moreover when making application you get storage with history and e-mail notifications about changes for free, which makes your data quite safe. In case someone destroys your site (which you are informed by e-mail), you can just revert the right version).</p> <p>But Wikidot applications is not the most important thing Wikidot is used for. Many sites on Wikidot are just plain wiki sites with links to store and share knowledge of certain groups. They don't use advanced features like modules, includes, templates. They usually edit and save :-) from time to time uploading some file or image. What we want to do is to review all common operations people do most often and (really really) simplify them. Sophisticated applications are worth nothing if basic usage of service is not easy.</p> <p>We want to introduce features people will appreciate, like [[html]] blocks for embedding completely custom HTML, like this:</p> <div class="code"> <pre> <code>[[html]] &lt;h1&gt;Custom HTML&lt;/h1&gt; &lt;p&gt;Something else&lt;/p&gt; &lt;img src="anything.png" alt="hello ;-)"/&gt; [[/html]]</code> </pre></div> <p>This code will just inject the HTML (including JavaScript) into the page in that place. Seems easy to do, but in fact, to make it safe for your site, we needed to implement this as a frame, that autoresizes to keep the content fit inside.</p> <p>We also want to introduce [[block]] syntax for sandboxing wiki texts, for example:</p> <div class="code"> <pre> <code>[[block]] What put inside is parsed and rendered independently, so even if you put some random [[/div]]s or other nasty things, the page outside will be rendered nicely. [[/block]]</code> </pre></div> <p>This will be useful for site designers to use in template pages, like this:</p> <div class="code"> <pre> <code>[[table]] [[row]] [[cell]] [[block]] %%content%% [[/block]] [[/cell]] [[cell]] some other things. [[/cell]] [[/row]] [[/table]]</code> </pre></div> <p>Putting %%content%% in block tags you make sure user won't break the original layout (the table). Without block, user could put [[/cell]] inside of his text and thus break the layout.</p> <p>To let our users know what happens on their sites, we want to make live feeds of activity available for most common start-places on the web — iGoogle, NetVibes, Facebook and Twitter. Most important news from YOUR sites will be next to other things you start your day from.</p> <p>We have a bunch of other fresh ideas, which we'll be sharing on <a href="http://blog.wikidot.com/">blog.wikidot.com</a>.</p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/gabrys" ><!--[if gte IE 7]><!--><img class="small" src="http://www.wikidot.com/common--images/avatars/2/2462/a16.png" alt="Gabrys" style="background-image:url(http://www.wikidot.com/userkarma.php?u=2462)" /><!--<![endif]--><!--[if lt IE 7]><img class="small" src="http://www.wikidot.com/common&#45;&#45;images/avatars/2/2462/a16.png" alt="Gabrys" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod='scale')"/><![endif]--></a><a href="http://www.wikidot.com/user:info/gabrys" >Gabrys</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://piotr.gabryjeluk.pl/dev:nowa-strona-nowy-temat</guid>
				<title>Nowa Strona -- Nowy Temat</title>
				<link>http://piotr.gabryjeluk.pl/dev:nowa-strona-nowy-temat</link>
				<description>

&lt;p&gt;Stworzyłem dziś nowy temat do Wikidota będący modyfikacją Łukaszowego Orange-Black:&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;&lt;!--[if gte IE 7]&gt;&lt;!--&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common--images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=2462)&quot; /&gt;&lt;!--&lt;![endif]--&gt;&lt;!--[if lt IE 7]&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common&amp;#45;&amp;#45;images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod=&#039;scale&#039;)&quot;/&gt;&lt;![endif]--&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;Gabrys&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Thu, 10 Dec 2009 19:09:18 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>Stworzyłem dziś nowy temat do Wikidota będący modyfikacją Łukaszowego Orange-Black:</p> <div class="content-separator" style="display: none:"></div> <p style="text-align: center;"><img src="http://thumbnail.s.wdfiles.com/thumbnail/theme/orange-black/240.jpg" alt="240.jpg" class="image" /></p> <p>Oto wynik:</p> <p style="text-align: center;"><img src="http://thumbnail.s.wdfiles.com/thumbnail/theme/orange-black-improved/240.jpg" alt="240.jpg" class="image" /></p> <p>Poza tym co widać, zmiany dotyczą użytego fonta, wyglądu komentarzy i forum, uproszczenia okienka nowego komentarza, ustalenia pozycji tła (żeby przewijanie przewijało samą treść, a nie tło) i dodanie lekkiego prześwitywania tła, żeby było bardziej sexy.</p> <p>Temat jest hostowany pod adresem: <a href="http://themes.wikidot.com/orange-black-improved">http://themes.wikidot.com/orange-black-improved</a>.</p> <p>A wszystko po to, żeby nadać naszej nowej stronce: <a href="http://parapetowa.wikidot.com/">http://parapetowa.wikidot.com/</a> ładnego wyglądu. A na stronce oprócz informacji co można nam kupić z okazji zbliżającej się parapetówy (jeszcze dokładnie nie wiadomo kiedy) uruchomiliśmy też bloga, gdzie pisać będziemy (a przynajmniej ja) o trudzie przystosowania mieszkania do wymagających lokatorów (czyli nas). Link do bloga:</p> <p style="text-align: center;"><a href="http://parapetowa.wikidot.com/blog">http://parapetowa.wikidot.com/blog</a></p> <p>Serdecznie zapraszamy!</p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/gabrys" ><!--[if gte IE 7]><!--><img class="small" src="http://www.wikidot.com/common--images/avatars/2/2462/a16.png" alt="Gabrys" style="background-image:url(http://www.wikidot.com/userkarma.php?u=2462)" /><!--<![endif]--><!--[if lt IE 7]><img class="small" src="http://www.wikidot.com/common&#45;&#45;images/avatars/2/2462/a16.png" alt="Gabrys" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod='scale')"/><![endif]--></a><a href="http://www.wikidot.com/user:info/gabrys" >Gabrys</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://piotr.gabryjeluk.pl/dev:cleaning-up</guid>
				<title>Cleaning Up</title>
				<link>http://piotr.gabryjeluk.pl/dev:cleaning-up</link>
				<description>

&lt;p&gt;Some of you, following Wikidot code on &lt;a href=&quot;http://github.com/gabrys/wikidot&quot;&gt;GitHub&lt;/a&gt; may see it&#039;s nicely split into templates, php, web and conf directories. But this is the first impression.&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;&lt;!--[if gte IE 7]&gt;&lt;!--&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common--images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=2462)&quot; /&gt;&lt;!--&lt;![endif]--&gt;&lt;!--[if lt IE 7]&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common&amp;#45;&amp;#45;images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod=&#039;scale&#039;)&quot;/&gt;&lt;![endif]--&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;Gabrys&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Thu, 17 Sep 2009 16:42:53 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>Some of you, following Wikidot code on <a href="http://github.com/gabrys/wikidot">GitHub</a> may see it's nicely split into templates, php, web and conf directories. But this is the first impression.</p> <div class="content-separator" style="display: none:"></div> <p>Maintaining Wikidot is a bit more complex, because, files uploaded to sites are located in web, side to side with some static Wikidot php and javascript files. Also for historical reasons, there are web/files--common and web/files--local directories, which maps to /common--* and /local--* URLs and in fact, the files--local is never served directly by the web server (need to check permissions first).</p> <p>Also some time ago, we made static files versioned, so that we can apply more aggressive HTTP caching to them (reducing average page load time) and still be able to fix bugs on them without waiting a few days till the cache expire. In current model, URL to static file contains version hash, this may be for example: <a href="http://static.wikidot.com/v--b44e0ce810ee/common--javascript/WIKIDOT.js">http://static.wikidot.com/v--b44e0ce810ee/common--javascript/WIKIDOT.js</a> (notice the b44e0ce810ee). The whole static.wikidot.com is now hosted on Amazon's CloudFront, which means you get static Wikidot files from a server nearby your location and not always from USA.</p> <p>This all become quite complicated, so we decided to make things really clear and simple in the source code. The primary rule: make the source code (updatable from git) separate from files uploaded by users and generated by Wikidot. Second rule: make files that are automatically generated during installation (not in the runtime) separate from persistent files (like the uploaded by users) and from source code.</p> <p>And at the end there needs to be some place for logs and a place for temporary data (we need this to generate some random cool stuff, but after generating them, files are deleted).</p> <p>So we end up with something like this:</p> <ul> <li>WIKIDOT_ROOT <ul> <li><strong>data/</strong> <ul> <li>avatars/ — user avatars</li> <li>sites/ — site files (both generated thumbnails and uploaded files)</li> </ul> </li> <li><strong>generated/</strong> <ul> <li>static/ — generated static files. This dir can be server directly by a fast non-PHP webserver for static.wikidot.com in case we don't want CloudFront anymore</li> </ul> </li> <li><strong>tmp/</strong> — temporary files including Smarty compiled versions of templates. Content of this dir can be safely removed</li> <li><strong>logs/</strong> — Wikidot logs</li> <li>everything else — comes from git and is unchangeable by application</li> </ul> </li> </ul> <p>Application needs write-access to data, tmp and logs. Generated dir needs write access to one installing or upgrading application.</p> <p>Wikidot persistent data is now ONLY database and data/ directory, so it's easy to backup and restore the application (if you have enough time to make full backup of this).</p> <p>There is still one exception to this nice schema which is php/db/base directory, which is autogenerated during installation from XML database definition files, but the cleaning is not over, I still work on this.</p> <p>Nice thing about this work is that it does not need a lot of code changing, because directory paths are usually stored in one (max two) places in application, so this kind of totally reorganizing directory structure does not break things. As such, it is very very worth doing it. In the end we get clean internal structure of files and it's clear which files you can safely remove, which you can restore from git (and thus you can experiment a little on them — in case of crash, just re-download application), which are "state" of the Wikidot and where to look for logs.</p> <p>This all is also very important, because we aim to make current Wikidot.com source open and as such we want it to be a nice code.</p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/gabrys" ><!--[if gte IE 7]><!--><img class="small" src="http://www.wikidot.com/common--images/avatars/2/2462/a16.png" alt="Gabrys" style="background-image:url(http://www.wikidot.com/userkarma.php?u=2462)" /><!--<![endif]--><!--[if lt IE 7]><img class="small" src="http://www.wikidot.com/common&#45;&#45;images/avatars/2/2462/a16.png" alt="Gabrys" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod='scale')"/><![endif]--></a><a href="http://www.wikidot.com/user:info/gabrys" >Gabrys</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://piotr.gabryjeluk.pl/dev:wikidot-crashes</guid>
				<title>Wikidot Crashes</title>
				<link>http://piotr.gabryjeluk.pl/dev:wikidot-crashes</link>
				<description>

&lt;p&gt;Last night we made Wikidot online again after a great crash.&lt;/p&gt;
&lt;p&gt;Wikidot was down for about 12 hours and the time it was down was full of work for us. We got a few things that could be broken starting from recent changes of the Wikidot software, hardware failure, high load-related kernel bugs or limitations to connection number or maximum possible number or file descriptors.&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;&lt;!--[if gte IE 7]&gt;&lt;!--&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common--images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=2462)&quot; /&gt;&lt;!--&lt;![endif]--&gt;&lt;!--[if lt IE 7]&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common&amp;#45;&amp;#45;images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod=&#039;scale&#039;)&quot;/&gt;&lt;![endif]--&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;Gabrys&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Thu, 27 Aug 2009 13:03:23 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>Last night we made Wikidot online again after a great crash.</p> <p>Wikidot was down for about 12 hours and the time it was down was full of work for us. We got a few things that could be broken starting from recent changes of the Wikidot software, hardware failure, high load-related kernel bugs or limitations to connection number or maximum possible number or file descriptors.</p> <div class="content-separator" style="display: none:"></div> <p>The problem is Wikidot kind of worked, so some people had their sites loading, some other not and getting "500" errors. We didn't want to stop it, but at some point Wikidot was completely unusable. We switched the database to the other machine, but this was not the solution, then we switched all Wikidot traffic to the machine, still no good, we switched the software to some previous version, but this still seemed bad.</p> <p>Finally we worked out, there was a site, that had so big traffic, that it killed anything else (and itself as well). When we temporarily disabled it, the whole Wikidot started to work nicely again. Then Michał made some improvements for the high traffic site serving and the situation is stable again.</p> <p>In the middle of everything, we had huge problems with our hosting company and their service called Portable IP addresses. It seems that switching DNS is much more reliable that using Portable IPs that took hours to switch (and were supposed to take seconds to switch)! DNS switching time was 15 minutes.</p> <p>We learned a lot from the situation. Hardware upgrade postponed from really long time needs to be done quite quickly. We need more servers, to see which element breaks. For example if database server has high load, we know we need to tune database settings. If we have all on one massive server and one brick on it crashes, it usually causes all the server overloaded and this causes other bricks to crash as well, so it's hard too tell what the real problem is.</p> <p>Another thing is that we see our users want information on what happens. It's bad when Wikidot crashes, but it's even worse, when it crashes and they have no information about this.</p> <p>So, the next time a similar disaster happens we'll update on each technical detail possible, to let you know, that we know it's broken and we work hard to fix it. Other thing is, we plan having more fail-over servers in case something dies.</p> <p>Thank you all for using Wikidot, it's a great pleasure working (and fixing things) for you!</p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/gabrys" ><!--[if gte IE 7]><!--><img class="small" src="http://www.wikidot.com/common--images/avatars/2/2462/a16.png" alt="Gabrys" style="background-image:url(http://www.wikidot.com/userkarma.php?u=2462)" /><!--<![endif]--><!--[if lt IE 7]><img class="small" src="http://www.wikidot.com/common&#45;&#45;images/avatars/2/2462/a16.png" alt="Gabrys" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod='scale')"/><![endif]--></a><a href="http://www.wikidot.com/user:info/gabrys" >Gabrys</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://piotr.gabryjeluk.pl/dev:july-news</guid>
				<title>July News</title>
				<link>http://piotr.gabryjeluk.pl/dev:july-news</link>
				<description>

&lt;p&gt;Some of you may be more used to me posting more often, than in last time.&lt;br /&gt;
Some of you may wonder why I stopped blogging.&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;&lt;!--[if gte IE 7]&gt;&lt;!--&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common--images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=2462)&quot; /&gt;&lt;!--&lt;![endif]--&gt;&lt;!--[if lt IE 7]&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common&amp;#45;&amp;#45;images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod=&#039;scale&#039;)&quot;/&gt;&lt;![endif]--&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;Gabrys&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Tue, 28 Jul 2009 15:41:03 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>Some of you may be more used to me posting more often, than in last time.<br /> Some of you may wonder why I stopped blogging.</p> <div class="content-separator" style="display: none:"></div> <h2><span>Brussels</span></h2> <p>Last month was full of adventures. It started 1st of July with me going to Brussels meat our friend to talk about wikipedia-like site about art. We're going to help this man build the most complete site about art using Wikidot software!</p> <p>BTW, this was my first flight in lifetime. Quite a strange feeling, but generally fine.</p> <h2><span>Forms</span></h2> <p>I was working on some nice technical and UI improvements to Wikidot, that is crucial for the art site (but really really nice for Wikidot as well, like forms for editing, entering and viewing structured data to wiki pages).</p> <h2><span>Search issues</span></h2> <p>That week was also spent on some massive Wikidot.com search engine tweaks. A stupid one-line bug, which was <strong>not</strong> exporting proper LC_ALL environmental variable in indexing script, caused many sites that used Asian or East-European languages to be not indexed (most notably the great <a href="http://istorijska-biblioteka.wikidot.com/">ИСТОРИЈСКА БИБЛИОТЕКА</a>). At first we though that we can re-index the broken sites, but our re-indexing mechanism was way too slow (would last for weeks for all broken sites).</p> <p>Pieter then challenged me. He said he can index whole Wikidot in 6 hours. I thought it's not even possible, but then I started to work on that and I managed to index the whole Wikidot in less than 2 hours without indexing tags at first. Then with tags, it took 2 hours and 10 minutes or so. That was damn fast!</p> <p>Inspired by this and an accident of disk full error on /var partition of our webserver (but this is why we keep user-uploaded files and other important things on separate disks), I also rewrote the incremental indexer, to work in similar way to the whole-Wikidot-re-indexer.</p> <h2><span><tt>search-api reindex</tt></span></h2> <p>If you care about some technical details:</p> <ul> <li>all search operations are issued with use of search-api, a separate program that can: <ul> <li>re-index whole Wikidot</li> <li>queue indexing page/thread</li> <li>queue deleting page/thread</li> <li>queue re-indexing site</li> <li>flush queue</li> </ul> </li> <li>search-api is written in Python</li> <li>search-api uses PyLucene - a native Java Lucene library binded to CPython objects with PyJCC. Compiled with GNU Java Compiler to native code (like C programs), this binding has improved performance over using Lucene with Sun's Java.</li> <li>before rewriting it to only-Python, search-api was written in BASH and was a wrapper to: <ul> <li><tt>java -jar searchApiHelper.jar search "phrase-to-search"</tt></li> <li><tt>php search-api-helper.php flush</tt></li> </ul> </li> <li>search-api also takes care of file locking to assure that <ul> <li>only one process tries to modify the index</li> <li>items are added to queue one-after-another</li> <li>when doing some big index modification (read: full re-index) queue is not flushed (so that after the re-index all changes are applied to new index)</li> <li>when flushing queue takes more time, and cron tries to run more flushing processes, they simply end (so only one process flushes the queue at a time)</li> </ul> </li> </ul> <h2><span>Union of Rock Festival</span></h2> <p>Just after week spent in Brussels in nice hotel I went to Węgorzewo, Mazury (Poland biggest lakes distinct) to have fun on rock music festival. Unfortunately, the music level was not very impressive, so I mainly enjoyed the atmosphere on the camping area.</p> <p>The weather was not great. It was wet everywhere, the ground was covered in 20 centimeters of mud and it was hard to walk around without getting dirty. But during the first day of being there, I learned to do that.</p> <h2><span>Improved workflow at Wikidot</span></h2> <p>Some of you noticed, that recently we started to work more efficiently, but this is not quite true. In fact we work as efficiently as before, but we are better organized, and have better priorities on tasks. Also we keep track of what we do, so we can then tell what we've done. So for us, this is a little more work of "documenting" our work (so maybe we work even less efficiently than before?), but for the outside world, we make more noise (in a positive meaning) around that. So basically, people know what we do, what we are going to do, when they can expect changes and most importantly, they understand why some feature request is being postponed. This is (and was) because we have more important things to do, but before they couldn't tell it.</p> <p><span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/squark" ><!--[if gte IE 7]><!--><img class="small" src="http://www.wikidot.com/common--images/avatars/160/160264/a16.png" alt="Squark" style="background-image:url(http://www.wikidot.com/userkarma.php?u=160264)" /><!--<![endif]--><!--[if lt IE 7]><img class="small" src="http://www.wikidot.com/common&#45;&#45;images/avatars/160/160264/a16.png" alt="Squark" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=160264,sizingMethod='scale')"/><![endif]--></a><a href="http://www.wikidot.com/user:info/squark" >Squark</a></span> turned into a professional project manager, that manages our time. <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/pieterh" ><!--[if gte IE 7]><!--><img class="small" src="http://www.wikidot.com/common--images/avatars/0/99/a16.png" alt="pieterh" style="background-image:url(http://www.wikidot.com/userkarma.php?u=99)" /><!--<![endif]--><!--[if lt IE 7]><img class="small" src="http://www.wikidot.com/common&#45;&#45;images/avatars/0/99/a16.png" alt="pieterh" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=99,sizingMethod='scale')"/><![endif]--></a><a href="http://www.wikidot.com/user:info/pieterh" >pieterh</a></span> decided to <a href="http://blog.wikidot.com/">talk</a> to the Community and listen to their complaints (he reads or at least skims every post on Community forums). He tells Łukasz what needs to be done, Łukasz knows when we will have time to do this. This way communication inside Wikidot improved. Also we (<span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/michal-frackowiak" ><!--[if gte IE 7]><!--><img class="small" src="http://www.wikidot.com/common--images/avatars/0/1/a16.png" alt="michal frackowiak" style="background-image:url(http://www.wikidot.com/userkarma.php?u=1)" /><!--<![endif]--><!--[if lt IE 7]><img class="small" src="http://www.wikidot.com/common&#45;&#45;images/avatars/0/1/a16.png" alt="michal frackowiak" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=1,sizingMethod='scale')"/><![endif]--></a><a href="http://www.wikidot.com/user:info/michal-frackowiak" >michal frackowiak</a></span> and me) no longer look on Community forums (some of you may regret), but this allows us to concentrate on our work.</p> <h2><span>The work continues</span></h2> <p>As I mentioned before, we want to introduce a great feature to Wikidot, which is <em>forms</em>. But the implementation now concentrates on the <a href="http://www.wikidot.org/">open source version of Wikidot software</a> (once it's ready, working and tested we'll copy the feature to the Wikidot.com service).</p> <h2><span><tt>aptitude install wikidot</tt></span></h2> <p>As forms is a huge change, I started to prepare a good ground for it and closed most important bugs in Wikidot open source and I'm about to start making Ubuntu packages for it to allow even-simpler installation on Debian-based systems. Now the installation involves only <a href="http://www.wikidot.org/installation-guide">6 child-easy steps</a> and in fact can be done by copying&amp;pasting a few commands.</p> <h2><span>Yesterday's party</span></h2> <p>Yesterday I went to met some old-school-times friends in the heart of the city. It was meant to be a meeting for "a beer or two" but evolved into beer and dancing till morning. That was first time I get a morning bus (not even the first) to my home just after partying.</p> <p>It was such a great fun and great folks I met.</p> <h2><span>Summary</span></h2> <p>I hope with this long blog post (but divided into friendly sections ;) ) I recompensed long period of not-posting anything here.</p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/gabrys" ><!--[if gte IE 7]><!--><img class="small" src="http://www.wikidot.com/common--images/avatars/2/2462/a16.png" alt="Gabrys" style="background-image:url(http://www.wikidot.com/userkarma.php?u=2462)" /><!--<![endif]--><!--[if lt IE 7]><img class="small" src="http://www.wikidot.com/common&#45;&#45;images/avatars/2/2462/a16.png" alt="Gabrys" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod='scale')"/><![endif]--></a><a href="http://www.wikidot.com/user:info/gabrys" >Gabrys</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://piotr.gabryjeluk.pl/dev:lucene-replaces-local-searches</guid>
				<title>Lucene Replaces Local Searches</title>
				<link>http://piotr.gabryjeluk.pl/dev:lucene-replaces-local-searches</link>
				<description>

&lt;p&gt;As some of you know, some time ago I worked on a new &lt;a href=&quot;http://piotr.gabryjeluk.pl/dev:wikidot-search-launched&quot;&gt;Wikidot search&lt;/a&gt;. It is used for the &lt;a href=&quot;http://www.wikidot.com/search:all&quot;&gt;Search all sites&lt;/a&gt; page.&lt;/p&gt;
&lt;p&gt;This work was done, because searching the whole Wikidot database was far from being fast. At first we used Google Custom Search Engine to solve the problem, but we wanted to be independent from it. Also we wanted to include search results that are accessible by the person that searches but not by search engines (like private sites).&lt;/p&gt;
&lt;p&gt;This worked really good. The only problem was long time spent to display the results. It was like 20 seconds, which was far better than when using previous search, but much worse than Google. This was strange, because from previous tests, we calculated the average search time should be about a second or two.&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;&lt;!--[if gte IE 7]&gt;&lt;!--&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common--images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=2462)&quot; /&gt;&lt;!--&lt;![endif]--&gt;&lt;!--[if lt IE 7]&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common&amp;#45;&amp;#45;images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod=&#039;scale&#039;)&quot;/&gt;&lt;![endif]--&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;Gabrys&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Tue, 23 Jun 2009 18:25:58 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>As some of you know, some time ago I worked on a new <a href="http://piotr.gabryjeluk.pl/dev:wikidot-search-launched">Wikidot search</a>. It is used for the <a href="http://www.wikidot.com/search:all">Search all sites</a> page.</p> <p>This work was done, because searching the whole Wikidot database was far from being fast. At first we used Google Custom Search Engine to solve the problem, but we wanted to be independent from it. Also we wanted to include search results that are accessible by the person that searches but not by search engines (like private sites).</p> <p>This worked really good. The only problem was long time spent to display the results. It was like 20 seconds, which was far better than when using previous search, but much worse than Google. This was strange, because from previous tests, we calculated the average search time should be about a second or two.</p> <div class="content-separator" style="display: none:"></div> <p>It started to be clear, when we noticed that only 20-30 searches per day are performed. The index is quite big, and it needs to be cached in RAM to work with sufficient performance.</p> <p>Today I did more tests under heavy load and it seams Lucene can handle big number of queries. When users search often, the index is partially or even fully cached by the filesystem and searches are really quick!</p> <p>But our main problem to solve today was slow local search a.k.a. "search this site". Moreover many concurrent queries were degrading database performance (not only for searching), so we decided to enable Lucene for local searches as well.</p> <p>I must say it works really nice, fast and has a nice set of syntax tricks you can do with it, for example you can search for pages with something in tags. Just search for <em>youtube tags:embed</em>. This would search for pages matching <em>youtube</em> (in tags, title or content) and with <em>embed</em> in tags. If no such pages are found, partial matches are also returned, like: pages matching <em>youtube</em> (but with no <em>embed</em> in tags) or pages with <em>embed</em> in tags, (but not matching <em>youtube</em>).</p> <p>To sum up, new search is faster, gives more accurate results, saves the database performance (which was the main goal) and allows nicer syntax than the old one.</p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/gabrys" ><!--[if gte IE 7]><!--><img class="small" src="http://www.wikidot.com/common--images/avatars/2/2462/a16.png" alt="Gabrys" style="background-image:url(http://www.wikidot.com/userkarma.php?u=2462)" /><!--<![endif]--><!--[if lt IE 7]><img class="small" src="http://www.wikidot.com/common&#45;&#45;images/avatars/2/2462/a16.png" alt="Gabrys" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod='scale')"/><![endif]--></a><a href="http://www.wikidot.com/user:info/gabrys" >Gabrys</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://piotr.gabryjeluk.pl/dev:php-as-fastcgi-backend</guid>
				<title>PHP as FastCGI backend and Lighttpd</title>
				<link>http://piotr.gabryjeluk.pl/dev:php-as-fastcgi-backend</link>
				<description>

&lt;h1&gt;&lt;span&gt;Wikidot + Lighttpd + PHP5&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;At Wikidot we use PHP5 as FastCGI backend to Lighttpd light-and-fast webserver. It works like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;there are a few hundreds of php5-cgi processes (name is cgi, but they also support FastCGI mode) running and waiting to be used&lt;/li&gt;
&lt;li&gt;lighttpd (only one needed!) process manages the network connections to all the clients and once the request is ready serves a static file or forwards the request to one of PHP backends processes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;&lt;!--[if gte IE 7]&gt;&lt;!--&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common--images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=2462)&quot; /&gt;&lt;!--&lt;![endif]--&gt;&lt;!--[if lt IE 7]&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common&amp;#45;&amp;#45;images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod=&#039;scale&#039;)&quot;/&gt;&lt;![endif]--&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;Gabrys&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Mon, 15 Jun 2009 20:59:29 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <h1><span>Wikidot + Lighttpd + PHP5</span></h1> <p>At Wikidot we use PHP5 as FastCGI backend to Lighttpd light-and-fast webserver. It works like this:</p> <ul> <li>there are a few hundreds of php5-cgi processes (name is cgi, but they also support FastCGI mode) running and waiting to be used</li> <li>lighttpd (only one needed!) process manages the network connections to all the clients and once the request is ready serves a static file or forwards the request to one of PHP backends processes.</li> </ul> <div class="content-separator" style="display: none:"></div> <p>We used to use internal Lighttpd FastCGI process manager, meaning the lighttpd processes actually used to start the PHPs.</p> <h1><span>Problems</span></h1> <p>We encountered some known problems of 500 (server side) errors appearing after some random time, especially under a high traffic. The typical message appearing at the Lighttpd's error.log was:</p> <div class="code"> <pre> <code>&lt;some date&gt;: (mod_fastcgi.c.2494) unexpected end-of-file (perhaps the fastcgi process died): pid: ...</code> </pre></div> <p>There are plenty of reports on this in both <a href="http://forum.lighttpd.net/topic/93190">Lighttpd</a>'s and <a href="http://bugs.php.net/bug.php?id=43295">PHP</a>'s <a href="http://forum.lighttpd.net/topic/93190">forums</a>, <a href="http://pecl.php.net/bugs/bug.php?id=12608">bug</a> <a href="http://redmine.lighttpd.net/issues/1466">trackers</a> and even <a href="http://www.rooftopsolutions.nl/article/201">some</a> <a href="http://jcj.net/?p=24">blogs</a>.</p> <h1><span>Workarounds</span></h1> <p>We managed to write some hacky scripts that detected the situation and restarted the backends when needed. The reaction was so quick, that almost no-one noticed the error, but damn, this is not how WE solve problems.</p> <h1><span>A blind try</span></h1> <p>We decided to give spawn-fcgi a shot. What is it? It is a program that spawns FastCGI backends (independently from Lighttpd server). Why trying it? I've read somewhere, that it works more reliably than the internal Lighttpd spawner. What's interesting is that this program comes from lighttpd package, so we're in family anyway. It's mainly intended to run the FastCGI backends from different user than the webserver user or to run them on different machine(s) than the webserver machine. This can be used naturally for some smart load-balancing.</p> <p>The only problem of this solution we encountered was internal limit of number of processes to spawn by a single process which was 256 (hardcoded, fixed in next versions). But at the same time, we decided to build a few FastCGI bridges (each spawning ~200 PHPs) anyway so that was no longer a problem for us.</p> <p>What was quite surprising (but honestly, I deeply believed in this), our problems with 500 server errors and PHP disappeared. This configuration works for about 2 weeks now with absolutely no hacky scripts involved and no restarting needed. Cool.</p> <h1><span>Why I wrote this</span></h1> <p>I wrote this short note just for the record and to let other people know, that using spawn-fcgi instead of the internal Lighttpd's FastCGI spawner might solve their problems with PHP (FastCGI) and 500 internal server errors.</p> <p>Hope this helps someone.</p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/gabrys" ><!--[if gte IE 7]><!--><img class="small" src="http://www.wikidot.com/common--images/avatars/2/2462/a16.png" alt="Gabrys" style="background-image:url(http://www.wikidot.com/userkarma.php?u=2462)" /><!--<![endif]--><!--[if lt IE 7]><img class="small" src="http://www.wikidot.com/common&#45;&#45;images/avatars/2/2462/a16.png" alt="Gabrys" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod='scale')"/><![endif]--></a><a href="http://www.wikidot.com/user:info/gabrys" >Gabrys</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://piotr.gabryjeluk.pl/dev:wikidot-org-refresh</guid>
				<title>Refreshing www.wikidot.org</title>
				<link>http://piotr.gabryjeluk.pl/dev:wikidot-org-refresh</link>
				<description>

&lt;p&gt;Yesterday I started refreshing &lt;a href=&quot;http://www.wikidot.org/&quot;&gt;www.wikidot.org&lt;/a&gt; website — the home of Wikidot open source software.&lt;/p&gt;
&lt;p&gt;Also we decided to move from managing our code in SVN to Git — more precisely to www.github.com. Our project page at GitHub is the following: &lt;a href=&quot;http://github.com/gabrys/wikidot&quot;&gt;http://github.com/gabrys/wikidot&lt;/a&gt;. Feel free to just follow it or even fork!&lt;/p&gt;
&lt;p&gt;Last times, I made Wikidot insanely easy to install (check out the &lt;a href=&quot;http://www.wikidot.org/installation-guide&quot;&gt;installation guide&lt;/a&gt;). It totally rocks (you can install Wikidot within 10 commands and no file editing).&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;&lt;!--[if gte IE 7]&gt;&lt;!--&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common--images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=2462)&quot; /&gt;&lt;!--&lt;![endif]--&gt;&lt;!--[if lt IE 7]&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common&amp;#45;&amp;#45;images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod=&#039;scale&#039;)&quot;/&gt;&lt;![endif]--&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;Gabrys&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Thu, 21 May 2009 18:11:17 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>Yesterday I started refreshing <a href="http://www.wikidot.org/">www.wikidot.org</a> website — the home of Wikidot open source software.</p> <p>Also we decided to move from managing our code in SVN to Git — more precisely to www.github.com. Our project page at GitHub is the following: <a href="http://github.com/gabrys/wikidot">http://github.com/gabrys/wikidot</a>. Feel free to just follow it or even fork!</p> <p>Last times, I made Wikidot insanely easy to install (check out the <a href="http://www.wikidot.org/installation-guide">installation guide</a>). It totally rocks (you can install Wikidot within 10 commands and no file editing).</p> <div class="content-separator" style="display: none:"></div> <p>I want to state, that this post is the last about the Wikidot open source software on this blog, as I'm running a new blog just about the Wikidot software at <a href="http://www.wikidot.org/blog">wikidot.org</a>. This will be more practical to filter the posts and will push some life into that site.</p> <p>At the end I want to invite you to the <a href="http://www.wikidot.org/irc-channel">Wikidot IRC channel</a> #wikidot at irc.freenode.org. That would be probably the easiest way to contact the Wikidot team without much formalism.</p> <p>(As many posts here were about Wikidot software, this blog will be less regularly updated, but if really care about Wikidot software news, just follow the new one and you won't be spammed about posts about Python, BASH or other things. I hope that blog-split will really help everyone.)</p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/gabrys" ><!--[if gte IE 7]><!--><img class="small" src="http://www.wikidot.com/common--images/avatars/2/2462/a16.png" alt="Gabrys" style="background-image:url(http://www.wikidot.com/userkarma.php?u=2462)" /><!--<![endif]--><!--[if lt IE 7]><img class="small" src="http://www.wikidot.com/common&#45;&#45;images/avatars/2/2462/a16.png" alt="Gabrys" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod='scale')"/><![endif]--></a><a href="http://www.wikidot.com/user:info/gabrys" >Gabrys</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://piotr.gabryjeluk.pl/dev:wikidot-opensource-changes-in-trunk</guid>
				<title>Wikidot OpenSource Changes In Trunk</title>
				<link>http://piotr.gabryjeluk.pl/dev:wikidot-opensource-changes-in-trunk</link>
				<description>

&lt;p&gt;I decided to wait no more and share what I&#039;ve kept at my local disk. I committed the changes &lt;a href=&quot;http://piotr.gabryjeluk.pl/dev:wikidot-opensource-direction&quot;&gt;I&#039;ve been working on&lt;/a&gt; to the repository.&lt;/p&gt;
&lt;p&gt;The biggest change is Wikidot is now single wiki engine by default (you need additional configuration for the wiki farm mode).&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;&lt;!--[if gte IE 7]&gt;&lt;!--&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common--images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=2462)&quot; /&gt;&lt;!--&lt;![endif]--&gt;&lt;!--[if lt IE 7]&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common&amp;#45;&amp;#45;images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod=&#039;scale&#039;)&quot;/&gt;&lt;![endif]--&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;Gabrys&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Sat, 16 May 2009 11:38:27 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>I decided to wait no more and share what I've kept at my local disk. I committed the changes <a href="http://piotr.gabryjeluk.pl/dev:wikidot-opensource-direction">I've been working on</a> to the repository.</p> <p>The biggest change is Wikidot is now single wiki engine by default (you need additional configuration for the wiki farm mode).</p> <div class="content-separator" style="display: none:"></div> <p>What demonstrates the change is the simplified installation process.</p> <p>Now it's as simple as installing any other software or service:</p> <ol> <li>install the dependencies <ul> <li>for Ubuntu: <tt>sudo aptitude install lighttpd php5 php5-cli tetex-bin tetex-extra gs-gpl imagemagick libmagic1 subversion postgresql-8.3 php5-tidy php5-pgsql php5-gd zip make</tt></li> </ul> </li> <li>get the code <ul> <li><tt>svn co <a href="http://svn.wikidot.org/repos/wikidot1/trunk/">http://svn.wikidot.org/repos/wikidot1/trunk/</a> wikidot-install-dir</tt></li> <li><tt>cd wikidot-install-dir</tt></li> </ul> </li> <li>if on Ubuntu: configure conf/wikidot.ini and set user at [db] section to your login name</li> <li>prepare database (create role and database) <ul> <li>as user postgres: <tt>make prepare_db</tt></li> </ul> </li> <li>build Wikidot: configure files and make initial dabatase <ul> <li>as you: <tt>make</tt></li> <li>this prints a secret URL at the end, you'll use it to configure Admin password</li> </ul> </li> <li>start Wikidot <ul> <li>./wikidotctl start</li> </ul> </li> <li>set Admin password <ul> <li>use your browser and navigate to the secret URL make prints at the end</li> </ul> </li> </ol> <p>We would like to finally create Debian/Ubuntu packages for that (once it gets more stable and have some bug fixed). So keep tuned!</p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/gabrys" ><!--[if gte IE 7]><!--><img class="small" src="http://www.wikidot.com/common--images/avatars/2/2462/a16.png" alt="Gabrys" style="background-image:url(http://www.wikidot.com/userkarma.php?u=2462)" /><!--<![endif]--><!--[if lt IE 7]><img class="small" src="http://www.wikidot.com/common&#45;&#45;images/avatars/2/2462/a16.png" alt="Gabrys" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod='scale')"/><![endif]--></a><a href="http://www.wikidot.com/user:info/gabrys" >Gabrys</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://piotr.gabryjeluk.pl/dev:wikidot-opensource-direction</guid>
				<title>Wikidot OpenSource Development Direction</title>
				<link>http://piotr.gabryjeluk.pl/dev:wikidot-opensource-direction</link>
				<description>

&lt;p&gt;Today we though that we might completely change the direction for Wikidot OpenSource. This would deprecate the previous &lt;a href=&quot;http://piotr.gabryjeluk.pl/dev:wikidot-1-0-roadmap&quot;&gt;Wikidot 1.0 Roadmap&lt;/a&gt;. Also this solution deprecates &lt;a href=&quot;http://piotr.gabryjeluk.pl/dev:wdlite-ready-for-testing&quot;&gt;wdLite&lt;/a&gt; (which was a big dirty hack).&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;&lt;!--[if gte IE 7]&gt;&lt;!--&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common--images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=2462)&quot; /&gt;&lt;!--&lt;![endif]--&gt;&lt;!--[if lt IE 7]&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common&amp;#45;&amp;#45;images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod=&#039;scale&#039;)&quot;/&gt;&lt;![endif]--&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;Gabrys&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Mon, 11 May 2009 20:01:25 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>Today we though that we might completely change the direction for Wikidot OpenSource. This would deprecate the previous <a href="http://piotr.gabryjeluk.pl/dev:wikidot-1-0-roadmap">Wikidot 1.0 Roadmap</a>. Also this solution deprecates <a href="http://piotr.gabryjeluk.pl/dev:wdlite-ready-for-testing">wdLite</a> (which was a big dirty hack).</p> <div class="content-separator" style="display: none:"></div> <h1><span>Single wiki mode</span></h1> <p>The main difference is introducing a new Wikidot installation mode: "sigle wiki mode" and setting it as the default instead of "wiki farm mode".</p> <p>What does it mean?</p> <ul> <li>you don't have to bother about: <ul> <li>domains (DNS)</li> <li>mail configuration</li> <li>root access (you can start Wikidot on custom port — default 8080)</li> </ul> </li> <li>you get direct administration panel for managing users</li> </ul> <p>But:</p> <ul> <li>you get only ONE single wiki</li> <li>you cannot create more wikis</li> <li>every IP/DNS address pointing to the started server (and corresponding port) displays THE wiki</li> <li>no mail invitations or password recovery</li> <li>no HTTPS</li> </ul> <h1><span>Lighttpd</span></h1> <p>Our main webserver is now <a href="http://lighttpd.net/">Lighttpd</a>, we forget about Apache. We can do this, because now you can run your regular Apache server on :80 port and Lighttpd serving Wikidot on :8080 (or other). They don't overlap, so there's no need to keep the compatibility.</p> <p>Wikidot is a full web service with its dedicated web server running on separate port. This is the philosophy.</p> <h1><span>Scripts</span></h1> <p>To make Wikidot easily installable, we're going to create a script (possibly a Makefile) that will simplify the whole process. It would be 4 steps:</p> <ul> <li>install dependencies</li> <li>setup the database</li> <li>edit ini file (supply database credentials)</li> <li>make</li> </ul> <p>Dependencies are Lighttpd, PHP, PostgreSQL, ImageMagick and maybe a few other things. Each of them can be installed without root access, but with root access it would be just as easy as</p> <ul> <li>aptitude install lighttpd php5-cgi postgresql-8.3 ImageMagick</li> </ul> <p>(or so)</p> <p>Running/stopping Wikidot:</p> <ul> <li>./wikidotctl start</li> <li>./wikidotctl stop</li> </ul> <h1><span>Next steps</span></h1> <p>Once all this is done (which isn't too much work BTW), we could make a *.deb package, that would take care of dependencies, database, creating a special user for wikidot, setting the root directory by convention and installing init script in proper place. Then you would just:</p> <ul> <li>/etc/init.d/wikidot start/stop/restart</li> </ul> <p>This should kill all Wikidot-is-to-hard-to-install issues.</p> <h1><span>… upgrade to wiki farm</span></h1> <p>Once you have your single-wiki Wikidot up and running you may want to upgrade to full featured wiki farm solution. The one-wiki would become the main wiki (as is www.wikidot.com for the Wikidot.com service), other wikis would be able to be created. On the other hand, as your getting more powerful, you need to configure your DNS (have a domain-class just for your wiki farm), mail service and move the service to the main HTTP port (80).</p> <h1><span>The hardest thing</span></h1> <p>Q: What is the hardest thing to do in that plan?<br /> A: The hardest thing is to create a module to manage wiki users.</p> <p>This should not be too hard, so in the overall, this should work!</p> <p>I'm waiting for your opinions.</p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/gabrys" ><!--[if gte IE 7]><!--><img class="small" src="http://www.wikidot.com/common--images/avatars/2/2462/a16.png" alt="Gabrys" style="background-image:url(http://www.wikidot.com/userkarma.php?u=2462)" /><!--<![endif]--><!--[if lt IE 7]><img class="small" src="http://www.wikidot.com/common&#45;&#45;images/avatars/2/2462/a16.png" alt="Gabrys" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod='scale')"/><![endif]--></a><a href="http://www.wikidot.com/user:info/gabrys" >Gabrys</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://piotr.gabryjeluk.pl/dev:api-save</guid>
				<title>API page.save</title>
				<link>http://piotr.gabryjeluk.pl/dev:api-save</link>
				<description>

&lt;p&gt;The &lt;a href=&quot;http://www.wikidot.com/doc:api&quot;&gt;Wikidot API&lt;/a&gt; &lt;strong&gt;page.save&lt;/strong&gt; method is one of the things we&#039;ve been holding over for weeks, just because there were so many other important things to do.&lt;/p&gt;
&lt;p&gt;But the API is also important, because it can enable developers (which are big fraction of our users) to create applications that use Wikidot.com as a service. This can be useful in many ways, the best example I can think of is creating an application, that get some photos from your disk, uploads them to Wikidot, creates a page for each of them and saves some metadata from them into it.&lt;/p&gt;
&lt;p&gt;Today, I finally managed to start working on one of the most important API method which is page.save. This method obviously is for saving a page. The page saving mechanism in Wikidot is quite complex, because of advanced site permissions, various performance optimizations, caches and many scenarios of updating a page.&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;&lt;!--[if gte IE 7]&gt;&lt;!--&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common--images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=2462)&quot; /&gt;&lt;!--&lt;![endif]--&gt;&lt;!--[if lt IE 7]&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common&amp;#45;&amp;#45;images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod=&#039;scale&#039;)&quot;/&gt;&lt;![endif]--&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;Gabrys&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Thu, 07 May 2009 20:32:23 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>The <a href="http://www.wikidot.com/doc:api">Wikidot API</a> <strong>page.save</strong> method is one of the things we've been holding over for weeks, just because there were so many other important things to do.</p> <p>But the API is also important, because it can enable developers (which are big fraction of our users) to create applications that use Wikidot.com as a service. This can be useful in many ways, the best example I can think of is creating an application, that get some photos from your disk, uploads them to Wikidot, creates a page for each of them and saves some metadata from them into it.</p> <p>Today, I finally managed to start working on one of the most important API method which is page.save. This method obviously is for saving a page. The page saving mechanism in Wikidot is quite complex, because of advanced site permissions, various performance optimizations, caches and many scenarios of updating a page.</p> <div class="content-separator" style="display: none:"></div> <p>Also, we wanted to make page.save to be one method to update and create pages, which involves other permission checking, because in some cases you have permission to create a page, but not to edit. This is especially true if you have a site category with everybody-can-create-but-only-author-can-edit policy.</p> <p>I started from dealing with updating already existing pages, so for now page.save can't yet create pages. We have more or less working page.save for the following activities:</p> <table class="wiki-content-table"> <tr> <th></th> <th>code in Python syntax</th> </tr> <tr> <th>set title</th> <td><strong>page.save</strong>({ 'site': 'quake', 'page': 'dev:api-save', <strong>'title': 'Other title'</strong> })</td> </tr> <tr> <th>update page source</th> <td><strong>page.save</strong>({ 'site': 'quake', 'page': 'dev:api-save', <strong>'source': '+ Come back later'</strong> })</td> </tr> <tr> <th>set tags</th> <td><strong>page.save</strong>({ 'site': 'quake', 'page': 'dev:api-save', <strong>'tags': ['wikidot', 'api']</strong> })</td> </tr> <tr> <th>all at once</th> <td><strong>page.save</strong>({ 'site': 'quake', 'page': 'dev:api-save', <strong>'title': 'Other title', 'source': '+ Come back later', 'tags': ['wikidot', 'api']</strong> })</td> </tr> </table> <p>Notes:</p> <ul> <li>the API service is XML-RPC based, so the syntax of calls is syntax of the programming language you use (Python used as an example syntax)</li> <li>site: quake and page: dev:api-save means http://<strong>quake</strong>.wikidot.com/<strong>dev:api-save</strong> page</li> <li>setting tags as a single string (comma- or space-separated) is also supported</li> <li>setting of parent page is also supported in similar way to setting the title</li> </ul> <p>Now we're going to review the code, ensure there is no more caching mechanism I forgot about and make final polishing. This includes generating notifications to be send to page-watchers and saving revision comments.</p> <p>This method is crucial for the API. Once it gets fully working (including creating pages), applications will be able to:</p> <ul> <li>create pages</li> <li>read pages</li> <li>modify pages</li> </ul> <p>and this the <strong>core functionality we want to provide with the Wikidot API</strong>.</p> <p>Check out the <a href="http://www.wikidot.com/doc:api-methods">API methods</a> to see if page.save is already out.</p> <p>If you want to test the (beta) API, drop a comment at the <a href="http://www.wikidot.com/doc:api">Wikidot API page</a>.</p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/gabrys" ><!--[if gte IE 7]><!--><img class="small" src="http://www.wikidot.com/common--images/avatars/2/2462/a16.png" alt="Gabrys" style="background-image:url(http://www.wikidot.com/userkarma.php?u=2462)" /><!--<![endif]--><!--[if lt IE 7]><img class="small" src="http://www.wikidot.com/common&#45;&#45;images/avatars/2/2462/a16.png" alt="Gabrys" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod='scale')"/><![endif]--></a><a href="http://www.wikidot.com/user:info/gabrys" >Gabrys</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://piotr.gabryjeluk.pl/dev:wikidot-outage</guid>
				<title>Wikidot Outage</title>
				<link>http://piotr.gabryjeluk.pl/dev:wikidot-outage</link>
				<description>

&lt;p&gt;Today Wikidot encountered a small break in its operation. After over an hour, we managed to get everything back to normal. The part that took the longest time was (who would guess?) filesystem check (after 280 days without check).&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;&lt;!--[if gte IE 7]&gt;&lt;!--&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common--images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=2462)&quot; /&gt;&lt;!--&lt;![endif]--&gt;&lt;!--[if lt IE 7]&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common&amp;#45;&amp;#45;images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod=&#039;scale&#039;)&quot;/&gt;&lt;![endif]--&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;Gabrys&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Wed, 04 Mar 2009 22:22:45 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>Today Wikidot encountered a small break in its operation. After over an hour, we managed to get everything back to normal. The part that took the longest time was (who would guess?) filesystem check (after 280 days without check).</p> <div class="content-separator" style="display: none:"></div> <p>Normally starting up a machine takes a minute or two and is almost indistinguishable from a network outage or some other temporary failures. But with Wikidot having as many files that our users upload the operation of checking the filesystem takes long time.</p> <p>Not even because of today's crash, I must confess, we have plans of decentralizing the service and moving it to more distributed environment to let it be (even) more reliable. Even including the crash we have still very high uptime, that would satisfy just everyone. But not us. We aim at having 100% (or more ;-) ) uptime, and make things totally fault-tolerant.</p> <p>I must say we are really really sorry for what happened today but in the same time I must ensure that we really care about you — the Users — as many of you have noticed for sure. I hope you still believe in us :).</p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/gabrys" ><!--[if gte IE 7]><!--><img class="small" src="http://www.wikidot.com/common--images/avatars/2/2462/a16.png" alt="Gabrys" style="background-image:url(http://www.wikidot.com/userkarma.php?u=2462)" /><!--<![endif]--><!--[if lt IE 7]><img class="small" src="http://www.wikidot.com/common&#45;&#45;images/avatars/2/2462/a16.png" alt="Gabrys" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod='scale')"/><![endif]--></a><a href="http://www.wikidot.com/user:info/gabrys" >Gabrys</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://piotr.gabryjeluk.pl/dev:wikidot-search-launched</guid>
				<title>Wikidot Search Launched</title>
				<link>http://piotr.gabryjeluk.pl/dev:wikidot-search-launched</link>
				<description>

&lt;p&gt;After about three months of indexing (because &lt;a href=&quot;http://piotr.gabryjeluk.pl/dev:wikidot-is-big&quot;&gt;Wikidot is BIG&lt;/a&gt;) all content that&#039;s hosted on Wikidot, the time came to launch the new search system.&lt;/p&gt;
&lt;p&gt;I described the system extensively in blog post titled &lt;a href=&quot;http://piotr.gabryjeluk.pl/dev:new-search-for-wikidot-s-gonna-rock&quot;&gt;New search for Wikidot&#039;s gonna rock&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.wikidot.com/search:all&quot;&gt;The new search system&lt;/a&gt; replaced the old Google-powered one.&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;&lt;!--[if gte IE 7]&gt;&lt;!--&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common--images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=2462)&quot; /&gt;&lt;!--&lt;![endif]--&gt;&lt;!--[if lt IE 7]&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common&amp;#45;&amp;#45;images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod=&#039;scale&#039;)&quot;/&gt;&lt;![endif]--&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;Gabrys&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Mon, 02 Mar 2009 21:28:30 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>After about three months of indexing (because <a href="http://piotr.gabryjeluk.pl/dev:wikidot-is-big">Wikidot is BIG</a>) all content that's hosted on Wikidot, the time came to launch the new search system.</p> <p>I described the system extensively in blog post titled <a href="http://piotr.gabryjeluk.pl/dev:new-search-for-wikidot-s-gonna-rock">New search for Wikidot's gonna rock</a>.</p> <p><a href="http://www.wikidot.com/search:all">The new search system</a> replaced the old Google-powered one.</p> <div class="content-separator" style="display: none:"></div> <p>The main advantages over Google Search Engine that has been used till now are:</p> <ul> <li>search in public sites + those you are a member of</li> <li>semantic search: tags, title are more important when searching</li> <li>simple to sophisticated queries <ul> <li>"blog site:community" — search for anything with "blog" in it but only on site community.wikidot.com</li> <li>"tags:wikidot site:quake" — search for pages tagged "wikidot" on my site (quake.wikidot.com)</li> </ul> </li> <li>poor quality content filtered</li> </ul> <p>Things left to do:</p> <div class="image-container floatright"><img src="http://piotr.gabryjeluk.pl/local--thumbnail/small.jpg" alt="small.jpg" class="image" /></div> <ul> <li>add site preview (thumbnail) like the one on right to the search results</li> <li>explain in simple words the <a href="http://piotr.gabryjeluk.pl/search-syntax">search syntax</a></li> <li>promote good and/or active sites (give them higher rank)</li> <li>decrease delay from editing to updating search index (should be max 5 minutes)</li> <li>create custom search module searching in a bunch of (related) sites — this would be nice if you keep separate sites for different areas of a project like private site for project members and public one for project users. The search is intelligent enough to filter restricted items from search results if someone is not member of the private site the items come from.</li> </ul> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/gabrys" ><!--[if gte IE 7]><!--><img class="small" src="http://www.wikidot.com/common--images/avatars/2/2462/a16.png" alt="Gabrys" style="background-image:url(http://www.wikidot.com/userkarma.php?u=2462)" /><!--<![endif]--><!--[if lt IE 7]><img class="small" src="http://www.wikidot.com/common&#45;&#45;images/avatars/2/2462/a16.png" alt="Gabrys" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod='scale')"/><![endif]--></a><a href="http://www.wikidot.com/user:info/gabrys" >Gabrys</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://piotr.gabryjeluk.pl/dev:wikidot-jako-hosting-dla-stron</guid>
				<title>Wikidot Jako Hosting Dla Stron</title>
				<link>http://piotr.gabryjeluk.pl/dev:wikidot-jako-hosting-dla-stron</link>
				<description>

&lt;p&gt;Wikidot stał się przez ostatnie kilka miesięcy idealnym środowiskiem do tworzenia i utrzymywania małych, średnich i dużych witryn internetowych takich jak:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;blogi&lt;/li&gt;
&lt;li&gt;wizytówki firm&lt;/li&gt;
&lt;li&gt;prezentacje wyrobów i produktów&lt;/li&gt;
&lt;li&gt;bazy wiedzy (najbardziej naturalne dotąd zastosowanie technologii wiki)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;&lt;!--[if gte IE 7]&gt;&lt;!--&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common--images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=2462)&quot; /&gt;&lt;!--&lt;![endif]--&gt;&lt;!--[if lt IE 7]&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common&amp;#45;&amp;#45;images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod=&#039;scale&#039;)&quot;/&gt;&lt;![endif]--&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;Gabrys&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Fri, 27 Feb 2009 21:09:55 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>Wikidot stał się przez ostatnie kilka miesięcy idealnym środowiskiem do tworzenia i utrzymywania małych, średnich i dużych witryn internetowych takich jak:</p> <ul> <li>blogi</li> <li>wizytówki firm</li> <li>prezentacje wyrobów i produktów</li> <li>bazy wiedzy (najbardziej naturalne dotąd zastosowanie technologii wiki)</li> </ul> <div class="content-separator" style="display: none:"></div> <h1><span>Od szczegółu do ogółu</span></h1> <p>Korzystając z Wikidota skupiamy się na tworzeniu pojedynczych treści, takich jak:</p> <ul> <li>aktualność</li> <li>wpis na blogu</li> <li>opis produktu</li> </ul> <p>Każda taka treść otrzymuje swój adres (URL) i możemy do niej przypisać takie właściwości jak:</p> <ul> <li>kategoria</li> <li>etykiety (tagi)</li> <li>dodatkowe pliki (np. zdjęcia)</li> </ul> <p>Strony wyświetlające podsumowanie generują się automatycznie dzięki użyciu modułu ListPages. Przykłady użycia modułu:</p> <ul> <li>wyświetlenie ostatnich 3 aktualności</li> <li>wyświetlenie wpisów z bloga z ostatnich 30 dni</li> <li>wyświetlenie stron z kategorii blog z etykietą osobiste</li> </ul> <h1><span>Kategorie</span></h1> <p>Kategorie grupują strony. Każda kategoria może mieć następujące własności:</p> <ul> <li>własny temat graficzny</li> <li>własny szablon (np. wyświetlający datę i autora wpisu nad treścią strony a pod nią moduł komentarzy i oceniania)</li> <li>własne uprawnienia (np. możliwość dodawania plików przez niezalogowanych użytkowników plików do stron)</li> <li>własne elementy nawigacyjne (menu górne i boczne)</li> </ul> <h1><span>Galerie zdjęć</span></h1> <p>Wystarczy dodać pliki graficzne do strony a w jej treści wpisać <tt>[[gallery]]</tt>, aby stworzyć estetyczny pokaz zdjęć.</p> <h1><span>Automatyczna mapa witryny</span></h1> <p>Wikidot pozwala ustalić dla każdej strony jej stronę nadrzędną. Sprawia to, że łatwo jest wyświetlić drzewo stron obrazujące ich hierarchię np.</p> <ul> <li>Strona główna <ul> <li>O firmie</li> <li>Aktualności</li> <li>Nagrody i historia firmy</li> </ul> </li> <li>Produkty <ul> <li>Rośliny doniczkowe <ul> <li>Paprocie</li> <li>Kaktusy</li> </ul> </li> <li>Sadzonki <ul> <li>Zioła</li> <li>Krzewy owocowe</li> </ul> </li> </ul> </li> <li>Kontakt <ul> <li>Biuro w Szczecinie</li> <li>Oddział w Gdańsku</li> </ul> </li> </ul> <p>Umożliwia to łatwą nawigację nie tylko użytkownikom ale i wyszukiwarkom internetowym, dzięki którym łatwo będzie można odnaleźć witrynę w Internecie.</p> <h1><span>Standardy sieciowe i nowoczesne technologie</span></h1> <p>Wikidot generuje bardzo dobry kod XHTML oraz kanały RSS dla wszystkich istotnych treści prezentowanych na stronie co zapewnia idealny kanał komunikacji z zewnętrznymi serwisami, które mogą wyświetlać aktualności z witryny w innym serwisie.</p> <h1><span>Zaawansowane statystyki</span></h1> <p>Dla użytkowników konta Pro+ dostępne są statystyki witryny, które działając w oparciu o program <a href="http://awstats.sourceforce.net/">awstats</a> pokazują ilość odwiedzin o danej porze czy w danych dniach tygodnia. Dostajemy również listę najczęściej odwiedzanych w ramach witryny adresów, używanych przeglądarek internetowych i wykres szacowanego czasu spędzonego w witrynie.</p> <p>Można uzyskać jeszcze bardziej szczegółowe statystyki podłączając usługę <a href="http://www.google.com/analytics/">Google Analytics</a> w panelu administracyjnym strony.</p> <h1><span>Własna domena i stopka</span></h1> <p>W pewnych zastosowaniach przydatna może być opcja ustawienia własnej stopki (i usunięcie odwołań do Wikidota) oraz domeny, która nie kończy się na wikidot.com.</p> <h1><span>Wygląd</span></h1> <p>To co dla niektórych jest najważniejsze, to nadanie odpowiedniego wyglądu stronie, ponieważ w przeglądaniu stron internetowych wzrok jest najczęściej wykorzystywanym zmysłem.</p> <p>Wygląd stron na Wikidocie można w ogromnej mierze dostosować dzięki użyciu arkuszy CSS, które są standardowym sposobem opisywania wyglądu treści w sieci Web (więc potrafi je przygotować każdy grafik internetowy).</p> <p>Co więcej wygląd może się zmieniać z kategorii na kategorię, co pozwala na tematycznie wyróżnienie pewnych sekcji w obrębie całej witryny.</p> <h1><span>Przykłady</span></h1> <p>Przykładowe strony umiesczone w Wikidot.com:</p> <ul> <li><a href="http://imatix.com/">strona belgijskiej firmy iMatix</a></li> <li><a href="http://fretsonfire.wikidot.com/">wiki gry Frets On Fire</a></li> <li><a href="http://chaber.art.pl/">prezentacja biżuterii</a></li> <li><a href="http://piotr.gabryjeluk.pl/">mój blog</a></li> </ul> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/gabrys" ><!--[if gte IE 7]><!--><img class="small" src="http://www.wikidot.com/common--images/avatars/2/2462/a16.png" alt="Gabrys" style="background-image:url(http://www.wikidot.com/userkarma.php?u=2462)" /><!--<![endif]--><!--[if lt IE 7]><img class="small" src="http://www.wikidot.com/common&#45;&#45;images/avatars/2/2462/a16.png" alt="Gabrys" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod='scale')"/><![endif]--></a><a href="http://www.wikidot.com/user:info/gabrys" >Gabrys</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://piotr.gabryjeluk.pl/dev:wdlite-ready-for-testing</guid>
				<title>wdLite Ready For Testing</title>
				<link>http://piotr.gabryjeluk.pl/dev:wdlite-ready-for-testing</link>
				<description>

&lt;p&gt;During last days, I&#039;ve been working on &lt;a href=&quot;http://piotr.gabryjeluk.pl/dev:wdlite-installer&quot;&gt;wdLite Installer&lt;/a&gt; (a light single-wiki version of Wikidot).&lt;/p&gt;
&lt;p&gt;The main purpose of this, was to make installation of this pretty piece of software as easy as possible.&lt;/p&gt;
&lt;p&gt;Having this said, I&#039;ll prove it is really simple on the example of Ubuntu Linux.&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;&lt;!--[if gte IE 7]&gt;&lt;!--&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common--images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=2462)&quot; /&gt;&lt;!--&lt;![endif]--&gt;&lt;!--[if lt IE 7]&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common&amp;#45;&amp;#45;images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod=&#039;scale&#039;)&quot;/&gt;&lt;![endif]--&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;Gabrys&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Fri, 06 Feb 2009 12:30:17 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>During last days, I've been working on <a href="http://piotr.gabryjeluk.pl/dev:wdlite-installer">wdLite Installer</a> (a light single-wiki version of Wikidot).</p> <p>The main purpose of this, was to make installation of this pretty piece of software as easy as possible.</p> <p>Having this said, I'll prove it is really simple on the example of Ubuntu Linux.</p> <div class="content-separator" style="display: none:"></div> <h1><span>Overview</span></h1> <ul> <li>Step one: Install required packages</li> <li>Step two: Configure database</li> <li>Step three: Choose a proper place for wdLite and download it</li> <li>Step four: Launch web-based installer</li> <li>Step five: Your wiki is ready</li> </ul> <h1><span>Step one: Install required packages</span></h1> <p>Issue the following command:</p> <div class="code"> <pre> <code>sudo apt-get install apache2 php5 imagemagick subversion postgresql postgresql-contrib php5-tidy php5-pgsql php5-gd zip</code> </pre></div> <h1><span>Step two: Configure database</span></h1> <p>Use your user name instead of piotr. Use some (not yours) password instead of strong-password.</p> <div class="code"> <pre> <code>sudo su postgres psql --command "CREATE USER piotr PASSWORD 'strong-password'" createdb --owner piotr piotr</code> </pre></div> <h1><span>Step three: Choose a proper place for wdLite and download it</span></h1> <h2><span>Version a</span></h2> <p>The best place for Wikidot would be probably somewhere under /var/www</p> <p>(replace piotr with your user name)</p> <div class="code"> <pre> <code>sudo mkdir /var/www/wiki sudo chown piotr /var/www/wiki cd /var/www/wiki svn checkout http://svn.wikidot.org/repos/wdlite/trunk . chmod a+rwX . -R</code> </pre></div> <p>Having wdLite copied there, it'll be accessible at: <a href="http://localhost/wiki/">http://localhost/wiki/</a></p> <h2><span>Version b</span></h2> <p>You can also locate wdLite to your public_html directory.</p> <div class="code"> <pre> <code>cd ~/public_html sudo svn checkout http://svn.wikidot.org/repos/wdlite/trunk . sudo chmod a+rwX . -R</code> </pre></div> <p>In order for this to work, you would need to issue the following commands:</p> <div class="code"> <pre> <code>sudo ln -s ../mods-available/userdir* /etc/apache2/mods-enabled sudo /etc/init.d/apache2 restart</code> </pre></div> <p>wdLite will be accessible at: <a href="http://localhost/~piotr/">http://localhost/~piotr/</a> (replace piotr with your user name).</p> <h1><span>Step four: Launch web-based installer</span></h1> <p>Go to <a href="http://localhost/wiki">http://localhost/wiki</a> (version a) or <a href="http://localhost/~piotr">http://localhost/~piotr</a> (version b), click the "Click and install a wiki here!" link.</p> <p style="text-align: center;"><a href="http://piotr.gabryjeluk.pl/local--files/dev:wdlite-ready-for-testing/wdlite-installation.png"><img src="http://piotr.gabryjeluk.pl/local--resized-images/dev:wdlite-ready-for-testing/wdlite-installation.png/small.jpg" alt="wdlite-installation.png" class="image" /></a></p> <p>Fill ALL the fields. If you followed this howto, the values would be as follows:</p> <ul> <li>PostgreSQL settings <ul> <li><strong>user</strong>: piotr</li> <li><strong>password</strong>: strong-password</li> <li><strong>database</strong>: piotr</li> </ul> </li> <li>GMail settings <ul> <li>you have to create a GMail account for sending verification emails from it</li> <li>supply the GMail login and password in the fields</li> </ul> </li> <li>Wiki settings <ul> <li>it's totally up to you what to include there</li> <li>the values will be accordingly the wiki title and subtitle (shown at the very top of wiki)</li> </ul> </li> <li>Wiki administrator — it's you! <ul> <li><strong>e-mail</strong>: e-mail address you will use to log in</li> <li><strong>password</strong>: password you will user to log in</li> </ul> </li> <li>Members <ul> <li>if you have friend you would like to invite to the new wiki, just enter their e-mail addresses separated with spaces. You can leave this single field empty</li> </ul> </li> <li>Confirm and save <ul> <li>click <strong>save</strong> and wait while the wiki is installing the database and sending invitation e-mails. This should take no more than 5 minutes (usually less than 1 minute)</li> </ul> </li> </ul> <h1><span>Step five: Your wiki is ready</span></h1> <p style="text-align: center;"><a href="http://piotr.gabryjeluk.pl/local--files/dev:wdlite-ready-for-testing/wdlite-installed.png"><img src="http://piotr.gabryjeluk.pl/local--resized-images/dev:wdlite-ready-for-testing/wdlite-installed.png/small.jpg" alt="wdlite-installed.png" class="image" /></a></p> <p>Log in using the e-mail address and password that you supplied in the previous step.</p> <p>Enjoy your wiki!</p> <p style="text-align: center;"><a href="http://piotr.gabryjeluk.pl/local--files/dev:wdlite-ready-for-testing/wdlite-login.png"><img src="http://piotr.gabryjeluk.pl/local--resized-images/dev:wdlite-ready-for-testing/wdlite-login.png/small.jpg" alt="wdlite-login.png" class="image" /></a></p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/gabrys" ><!--[if gte IE 7]><!--><img class="small" src="http://www.wikidot.com/common--images/avatars/2/2462/a16.png" alt="Gabrys" style="background-image:url(http://www.wikidot.com/userkarma.php?u=2462)" /><!--<![endif]--><!--[if lt IE 7]><img class="small" src="http://www.wikidot.com/common&#45;&#45;images/avatars/2/2462/a16.png" alt="Gabrys" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod='scale')"/><![endif]--></a><a href="http://www.wikidot.com/user:info/gabrys" >Gabrys</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://piotr.gabryjeluk.pl/dev:wdlite-installer</guid>
				<title>wdLite Installer</title>
				<link>http://piotr.gabryjeluk.pl/dev:wdlite-installer</link>
				<description>

&lt;p&gt;Today I&#039;ve worked on an installer for &lt;a href=&quot;http://piotr.gabryjeluk.pl/dev:working-on-wdlite&quot;&gt;wdLite&lt;/a&gt;. It&#039;s a little too late to write about, I&#039;ll give it a short presentation on my blog tomorrow.&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;&lt;!--[if gte IE 7]&gt;&lt;!--&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common--images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=2462)&quot; /&gt;&lt;!--&lt;![endif]--&gt;&lt;!--[if lt IE 7]&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common&amp;#45;&amp;#45;images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod=&#039;scale&#039;)&quot;/&gt;&lt;![endif]--&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;Gabrys&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Thu, 05 Feb 2009 02:56:16 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>Today I've worked on an installer for <a href="http://piotr.gabryjeluk.pl/dev:working-on-wdlite">wdLite</a>. It's a little too late to write about, I'll give it a short presentation on my blog tomorrow.</p> <p>Good night</p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/gabrys" ><!--[if gte IE 7]><!--><img class="small" src="http://www.wikidot.com/common--images/avatars/2/2462/a16.png" alt="Gabrys" style="background-image:url(http://www.wikidot.com/userkarma.php?u=2462)" /><!--<![endif]--><!--[if lt IE 7]><img class="small" src="http://www.wikidot.com/common&#45;&#45;images/avatars/2/2462/a16.png" alt="Gabrys" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod='scale')"/><![endif]--></a><a href="http://www.wikidot.com/user:info/gabrys" >Gabrys</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://piotr.gabryjeluk.pl/dev:working-on-wdlite</guid>
				<title>Working On wdLite</title>
				<link>http://piotr.gabryjeluk.pl/dev:working-on-wdlite</link>
				<description>

&lt;p&gt;A few days ago I started working on wdLite — a lite version of Wikidot.&lt;/p&gt;
&lt;p&gt;The primary aim of this project is to make installation dead simple and server requirements really small.&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;&lt;!--[if gte IE 7]&gt;&lt;!--&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common--images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=2462)&quot; /&gt;&lt;!--&lt;![endif]--&gt;&lt;!--[if lt IE 7]&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common&amp;#45;&amp;#45;images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod=&#039;scale&#039;)&quot;/&gt;&lt;![endif]--&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;Gabrys&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Tue, 03 Feb 2009 00:54:15 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>A few days ago I started working on wdLite — a lite version of Wikidot.</p> <p>The primary aim of this project is to make installation dead simple and server requirements really small.</p> <div class="content-separator" style="display: none:"></div> <h1><span>Server requirements</span></h1> <p>wdLite should be installable on:</p> <ul> <li>Apache with PHP5 (no safe mode or other limitations) and PostgreSQL on Linux boxes</li> </ul> <p>PHP and PostgreSQL should be already configured to work with each other. You should have a PostgreSQL database and "user/password/database"-based access to it. Wikidot will create tables, but won't create a database. You should either create it as root or have root created it for you before (this process might be automatic on webhosting services with PHP/PostgreSQL).</p> <p>This configuration should include a whole bunch of virtual hosting providers.</p> <h1><span>Installation</span></h1> <p>The installation process should be no harder than this:</p> <ul> <li>Get a zip or checkout the newest version from repository</li> <li>Upload the directory to the server</li> <li>Adjust directory permissions</li> <li>Go to install.php script with your browser</li> <li>Supply mail and PostgreSQL credentials</li> <li>Choose your wiki name and create users</li> <li>Enjoy your new wiki</li> </ul> <h1><span>What are the differences between "full" Wikidot installation and wdLite</span></h1> <h2><span>Limitations</span></h2> <ul> <li>only one wiki</li> <li>no page revision diffs</li> <li>more limited page size</li> <li>lower security (especially for IE users)</li> <li>works only with Apache</li> <li>some features disabled or non-working</li> <li>memcached disabled</li> <li>karma disabled</li> <li>notifications disabled</li> </ul> <h2><span>Better than full version, because</span></h2> <ul> <li>works with Apache</li> <li>works on any HTTP port (not only 80)</li> <li>works within any directory (also in user directory accessible like <a href="http://myserver.com/~quake/something/really/deep/wikidot">http://myserver.com/~quake/something/really/deep/wikidot</a>)</li> <li>easier installation with a web interface</li> <li>no root-access needed</li> <li>works well with GMail to send mails from the service</li> <li>easily installable on Ubuntu</li> <li>the easiest method to start developing with Wikidot</li> <li>no need to manually compile additional software</li> </ul> <h1><span>Current work progress</span></h1> <p>I'm about to pre-release this software, to let you test it.</p> <p>I have to:</p> <ul> <li>create a list of things that need to work before a final 1.0 release.</li> <li>redirect / to /?/</li> <li>create install.php</li> </ul> <p>Things that work already:</p> <ul> <li>logging in/out</li> <li>displaying pages</li> <li>editing pages</li> <li>saving pages</li> <li>some basic modules</li> <li>uploading and displaying files</li> <li>navigation (links are rewritten from absolute to relative)</li> </ul> <h1><span>How does it work</span></h1> <p>The wdLite is based on Wikidot OpenSource. It contains wikidot, index.php and a bunch of helpers scripts. The index.php file is a hacky PHP script that</p> <ul> <li>converts URL-s like <a href="http://some.server.com/some/url/?/front:page">http://some.server.com/some/url/?/front:page</a> to <a href="http://www.some.server.com/front:page">http://www.some.server.com/front:page</a></li> <li>tricks Wikidot software to think that the Wikidot domain is some.server.com and the main wiki is www.some.server.com</li> <li>sets a bunch of system variables Wikidot relies on, like $_SERVER['REQUEST_URI'], $_SERVER['QUERY_STRING']</li> <li>runs a proper one from Wikidot scripts</li> <li>… or serves (more like redirects to) a static file</li> <li>catches the script output</li> <li>runs some transformation on caught output (like converting the links from <a href="http://www.some-server.com/some:other-page">http://www.some-server.com/some:other-page</a> to ?/some:other-page)</li> <li>sends the data back to browser</li> </ul> <p><strong>WARNING, ACHTUNG</strong><br /> The script is more a dirty hack than a version of Wikidot, but this is intentional. We don't want to mantain to many versions of Wikidot. Having this dirty script "only using without modyfing" Wikidot software makes it quite independent from changes in Wikidot. This means the same wdLite script will work for a newer version of Wikidot (=less maintaining work).<br /> <strong>WARNING, ACHTUNG</strong></p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/gabrys" ><!--[if gte IE 7]><!--><img class="small" src="http://www.wikidot.com/common--images/avatars/2/2462/a16.png" alt="Gabrys" style="background-image:url(http://www.wikidot.com/userkarma.php?u=2462)" /><!--<![endif]--><!--[if lt IE 7]><img class="small" src="http://www.wikidot.com/common&#45;&#45;images/avatars/2/2462/a16.png" alt="Gabrys" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod='scale')"/><![endif]--></a><a href="http://www.wikidot.com/user:info/gabrys" >Gabrys</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://piotr.gabryjeluk.pl/dev:wikidot-api</guid>
				<title>Wikidot API</title>
				<link>http://piotr.gabryjeluk.pl/dev:wikidot-api</link>
				<description>

&lt;p&gt;A few days ago I started working on Wikidot &lt;a href=&quot;http://en.wikipedia.org/wiki/API&quot;  &gt;API&lt;/a&gt;. The API will be a standardized way to access the Wikidot.com service in a programmable way (i.e. not using a browser) to retrieve, create and update information stored on Wikidot, including site browsing, page editing and commenting.&lt;/p&gt;
&lt;p&gt;In simple words this will allow people to write applications that connect to Wikidot.com and perform some actions for the user that runs the application.&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;&lt;!--[if gte IE 7]&gt;&lt;!--&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common--images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=2462)&quot; /&gt;&lt;!--&lt;![endif]--&gt;&lt;!--[if lt IE 7]&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common&amp;#45;&amp;#45;images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod=&#039;scale&#039;)&quot;/&gt;&lt;![endif]--&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;Gabrys&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Thu, 22 Jan 2009 18:57:07 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>A few days ago I started working on Wikidot <a href="http://en.wikipedia.org/wiki/API" >API</a>. The API will be a standardized way to access the Wikidot.com service in a programmable way (i.e. not using a browser) to retrieve, create and update information stored on Wikidot, including site browsing, page editing and commenting.</p> <p>In simple words this will allow people to write applications that connect to Wikidot.com and perform some actions for the user that runs the application.</p> <div class="content-separator" style="display: none:"></div> <p>Technically, the Wikidot.com API is an <a href="http://en.wikipedia.org/wiki/XML-RPC" >XML-RPC</a> service exporting methods from a few especially designed classes.</p> <p>To connect to an XML-RPC service, you must know its endpoint, which is a regular URL (http:// or https://) address. We decided to use <a href="http://en.wikipedia.org/wiki/HTTPS" >HTTPS</a> to secure the channel from the very start.</p> <p>The operations we are going to support are:</p> <h2><span>Browse</span></h2> <ul> <li>site.categories</li> <li>site.pages</li> <li>page.get</li> </ul> <p>Above ones are already implemented. Using the API calls you get retrieve almost all data you stored on the Wikidot.com sites!</p> <h2><span>Modify</span></h2> <ul> <li>page.save</li> </ul> <p>This will be the basic method to update the content on your site. We plan several other methods, but this is the one that is the most important.</p> <h2><span>Comments</span></h2> <ul> <li>page.comments</li> <li>page.comment</li> </ul> <p>They will be used to get and post comments on a given page. Using <tt>reply_to</tt> parameter, there is a possibility to reply to a particular comment.</p> <h2><span>Forum</span></h2> <ul> <li>forum.groups</li> <li>forum.categories</li> <li>forum.threads</li> <li>forum.post</li> </ul> <p>This bunch of methods are going to give you full access to the forums you have started on Wikidot.</p> <h1><span>How to use the API</span></h1> <p>We haven't yet enabled the API access to the main Wikidot.com server, but testing the API with Python XML-RPC library is as easy as this:</p> <div class="code"> <div class="hl-main"> <pre> <span class="hl-code">&gt;&gt;&gt; </span><span class="hl-reserved">from</span><span class="hl-code"> </span><span class="hl-identifier">xmlrpclib</span><span class="hl-code"> </span><span class="hl-reserved">import</span><span class="hl-code"> </span><span class="hl-identifier">ServerProxy</span><span class="hl-code"> &gt;&gt;&gt; </span><span class="hl-identifier">s</span><span class="hl-code"> = </span><span class="hl-identifier">ServerProxy</span><span class="hl-brackets">(</span><span class="hl-quotes">'</span><span class="hl-string">SOME-URL</span><span class="hl-quotes">'</span><span class="hl-brackets">)</span><span class="hl-code"> &gt;&gt;&gt; </span><span class="hl-identifier">s</span><span class="hl-code">.</span><span class="hl-identifier">system</span><span class="hl-code">.</span><span class="hl-identifier">listMethods</span><span class="hl-brackets">()</span><span class="hl-code"> </span><span class="hl-brackets">[</span><span class="hl-quotes">'</span><span class="hl-string">system.listMethods</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">system.methodHelp</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">system.methodSignature</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">system.multicall</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">site.pages</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">site.categories</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">page.get</span><span class="hl-quotes">'</span><span class="hl-brackets">]</span><span class="hl-code"> &gt;&gt;&gt; </span><span class="hl-reserved">print</span><span class="hl-code"> </span><span class="hl-identifier">s</span><span class="hl-code">.</span><span class="hl-identifier">system</span><span class="hl-code">.</span><span class="hl-identifier">methodHelp</span><span class="hl-brackets">(</span><span class="hl-quotes">'</span><span class="hl-string">site.pages</span><span class="hl-quotes">'</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-identifier">Get</span><span class="hl-code"> </span><span class="hl-identifier">pages</span><span class="hl-code"> </span><span class="hl-reserved">from</span><span class="hl-code"> </span><span class="hl-identifier">a</span><span class="hl-code"> </span><span class="hl-identifier">site</span><span class="hl-code"> </span><span class="hl-identifier">Argument</span><span class="hl-code"> </span><span class="hl-identifier">array</span><span class="hl-code"> </span><span class="hl-identifier">keys</span><span class="hl-code">: </span><span class="hl-identifier">site</span><span class="hl-code">: </span><span class="hl-identifier">site</span><span class="hl-code"> </span><span class="hl-identifier">to</span><span class="hl-code"> </span><span class="hl-identifier">get</span><span class="hl-code"> </span><span class="hl-identifier">pages</span><span class="hl-code"> </span><span class="hl-reserved">from</span><span class="hl-code"> </span><span class="hl-identifier">category</span><span class="hl-code">: </span><span class="hl-identifier">category</span><span class="hl-code"> </span><span class="hl-identifier">to</span><span class="hl-code"> </span><span class="hl-identifier">get</span><span class="hl-code"> </span><span class="hl-identifier">pages</span><span class="hl-code"> </span><span class="hl-identifier">from</span><span class="hl-code"> </span><span class="hl-brackets">(</span><span class="hl-identifier">optional</span><span class="hl-brackets">)</span><span class="hl-code"> &gt;&gt;&gt; </span><span class="hl-identifier">s</span><span class="hl-code">.</span><span class="hl-identifier">site</span><span class="hl-code">.</span><span class="hl-identifier">categories</span><span class="hl-brackets">(</span><span class="hl-code">{</span><span class="hl-quotes">'</span><span class="hl-string">site</span><span class="hl-quotes">'</span><span class="hl-code">: </span><span class="hl-quotes">'</span><span class="hl-string">gamemaker</span><span class="hl-quotes">'</span><span class="hl-code">}</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">[</span><span class="hl-quotes">'</span><span class="hl-string">project</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">rpg</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">_default</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">action</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">admin</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">badge</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">beginner</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">contests</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">error</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">event</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">example</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">forum</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">gamemaker</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">gml</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">gmlcode</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">gmupload</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">help</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">ide</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">include</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">mamber</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">member</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">nav</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">portal</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">resource</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">search</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">system</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">talk</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">template</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">tutorial</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">video-tutorial</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">wiki</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">challenge</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">howto</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">recent-changes</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">scratch-pad</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">helpdesk</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">helprequest</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">default</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">testimonial</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">testimonials</span><span class="hl-quotes">'</span><span class="hl-brackets">]</span><span class="hl-code"> &gt;&gt;&gt; </span><span class="hl-brackets">[</span><span class="hl-identifier">p</span><span class="hl-brackets">[</span><span class="hl-quotes">'</span><span class="hl-string">name</span><span class="hl-quotes">'</span><span class="hl-brackets">]</span><span class="hl-code"> </span><span class="hl-reserved">for</span><span class="hl-code"> </span><span class="hl-identifier">p</span><span class="hl-code"> </span><span class="hl-reserved">in</span><span class="hl-code"> </span><span class="hl-identifier">s</span><span class="hl-code">.</span><span class="hl-identifier">site</span><span class="hl-code">.</span><span class="hl-identifier">pages</span><span class="hl-brackets">(</span><span class="hl-code">{</span><span class="hl-quotes">'</span><span class="hl-string">site</span><span class="hl-quotes">'</span><span class="hl-code">: </span><span class="hl-quotes">'</span><span class="hl-string">gamemaker</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">category</span><span class="hl-quotes">'</span><span class="hl-code">: </span><span class="hl-quotes">'</span><span class="hl-string">badge</span><span class="hl-quotes">'</span><span class="hl-code">}</span><span class="hl-brackets">)]</span><span class="hl-code"> </span><span class="hl-brackets">[</span><span class="hl-quotes">'</span><span class="hl-string">cool</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">flux</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">c-team</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">gml</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">member</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">madman</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">not-a-noob</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">f-madman</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">start</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">break-it</span><span class="hl-quotes">'</span><span class="hl-brackets">]</span><span class="hl-code"> &gt;&gt;&gt; </span><span class="hl-reserved">print</span><span class="hl-code"> </span><span class="hl-identifier">s</span><span class="hl-code">.</span><span class="hl-identifier">page</span><span class="hl-code">.</span><span class="hl-identifier">get</span><span class="hl-brackets">(</span><span class="hl-code">{</span><span class="hl-quotes">'</span><span class="hl-string">site</span><span class="hl-quotes">'</span><span class="hl-code">: </span><span class="hl-quotes">'</span><span class="hl-string">gamemaker</span><span class="hl-quotes">'</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">page</span><span class="hl-quotes">'</span><span class="hl-code">: </span><span class="hl-quotes">'</span><span class="hl-string">badge:cool</span><span class="hl-quotes">'</span><span class="hl-code">}</span><span class="hl-brackets">)[</span><span class="hl-quotes">'</span><span class="hl-string">source</span><span class="hl-quotes">'</span><span class="hl-brackets">]</span><span class="hl-code"> </span><span class="hl-brackets">[[</span><span class="hl-identifier">table</span><span class="hl-code"> </span><span class="hl-identifier">style</span><span class="hl-code">=</span><span class="hl-quotes">"</span><span class="hl-string">width:98%;margin-right:auto;margin-left:auto;margin-bottom:1%;</span><span class="hl-quotes">"</span><span class="hl-brackets">]][[</span><span class="hl-identifier">row</span><span class="hl-brackets">]][[</span><span class="hl-identifier">cell</span><span class="hl-code"> </span><span class="hl-identifier">style</span><span class="hl-code">=</span><span class="hl-quotes">"</span><span class="hl-string">width:360px;</span><span class="hl-quotes">"</span><span class="hl-brackets">]]</span><span class="hl-code"> </span><span class="hl-brackets">[[</span><span class="hl-identifier">div</span><span class="hl-code"> </span><span class="hl-reserved">class</span><span class="hl-code">=</span><span class="hl-quotes">"</span><span class="hl-string">error-block</span><span class="hl-quotes">"</span><span class="hl-brackets">]]</span><span class="hl-code"> </span><span class="hl-identifier">Included</span><span class="hl-code"> </span><span class="hl-identifier">page</span><span class="hl-code"> </span><span class="hl-quotes">"</span><span class="hl-string">include:cool-badge</span><span class="hl-quotes">"</span><span class="hl-code"> </span><span class="hl-identifier">does</span><span class="hl-code"> </span><span class="hl-reserved">not</span><span class="hl-code"> </span><span class="hl-identifier">exist</span><span class="hl-code"> </span><span class="hl-brackets">([</span><span class="hl-code">/</span><span class="hl-identifier">include</span><span class="hl-code">:</span><span class="hl-identifier">cool</span><span class="hl-code">-</span><span class="hl-identifier">badge</span><span class="hl-code">/</span><span class="hl-identifier">edit</span><span class="hl-code">/</span><span class="hl-identifier">true</span><span class="hl-code"> </span><span class="hl-identifier">create</span><span class="hl-code"> </span><span class="hl-identifier">it</span><span class="hl-code"> </span><span class="hl-identifier">now</span><span class="hl-brackets">])</span><span class="hl-code"> </span><span class="hl-brackets">[[</span><span class="hl-code">/</span><span class="hl-identifier">div</span><span class="hl-brackets">]]</span><span class="hl-code"> </span><span class="hl-identifier">The</span><span class="hl-code"> </span><span class="hl-identifier">Cool</span><span class="hl-code"> </span><span class="hl-identifier">Badge</span><span class="hl-code"> </span><span class="hl-reserved">is</span><span class="hl-code"> </span><span class="hl-identifier">given</span><span class="hl-code"> </span><span class="hl-identifier">to</span><span class="hl-code"> </span><span class="hl-identifier">people</span><span class="hl-code"> </span><span class="hl-identifier">who</span><span class="hl-code"> </span><span class="hl-identifier">make</span><span class="hl-code"> </span><span class="hl-identifier">something</span><span class="hl-code"> </span><span class="hl-identifier">really</span><span class="hl-code"> </span><span class="hl-identifier">cool</span><span class="hl-code">. </span><span class="hl-brackets">[[</span><span class="hl-code">/</span><span class="hl-identifier">cell</span><span class="hl-brackets">]]</span><span class="hl-code"> </span><span class="hl-brackets">[[</span><span class="hl-identifier">cell</span><span class="hl-code"> </span><span class="hl-identifier">style</span><span class="hl-code">=</span><span class="hl-quotes">"</span><span class="hl-string">vertical-align:top;border:1px solid #ddd;padding:1%;</span><span class="hl-quotes">"</span><span class="hl-brackets">]]</span><span class="hl-code"> +++ </span><span class="hl-identifier">Display</span><span class="hl-code"> </span><span class="hl-identifier">Code</span><span class="hl-code"> </span><span class="hl-brackets">[[</span><span class="hl-identifier">table</span><span class="hl-code"> </span><span class="hl-reserved">class</span><span class="hl-code">=</span><span class="hl-quotes">"</span><span class="hl-string">code</span><span class="hl-quotes">"</span><span class="hl-brackets">]][[</span><span class="hl-identifier">row</span><span class="hl-brackets">]][[</span><span class="hl-identifier">cell</span><span class="hl-brackets">]]</span><span class="hl-code"> @@</span><span class="hl-brackets">[[</span><span class="hl-identifier">include</span><span class="hl-code"> </span><span class="hl-identifier">include</span><span class="hl-code">:</span><span class="hl-identifier">cool</span><span class="hl-code">-</span><span class="hl-identifier">badge</span><span class="hl-code"> </span><span class="hl-identifier">member</span><span class="hl-code">=</span><span class="hl-identifier">member</span><span class="hl-code"> </span><span class="hl-identifier">name</span><span class="hl-brackets">]]</span><span class="hl-code">@@ </span><span class="hl-brackets">[[</span><span class="hl-code">/</span><span class="hl-identifier">cell</span><span class="hl-brackets">]][[</span><span class="hl-code">/</span><span class="hl-identifier">row</span><span class="hl-brackets">]][[</span><span class="hl-code">/</span><span class="hl-identifier">table</span><span class="hl-brackets">]]</span><span class="hl-code"> +++ </span><span class="hl-identifier">Tag</span><span class="hl-code"> {{</span><span class="hl-identifier">cool</span><span class="hl-code">-</span><span class="hl-identifier">badge</span><span class="hl-code">}} </span><span class="hl-brackets">[[</span><span class="hl-code">/</span><span class="hl-identifier">cell</span><span class="hl-brackets">]][[</span><span class="hl-code">/</span><span class="hl-identifier">row</span><span class="hl-brackets">]][[</span><span class="hl-code">/</span><span class="hl-identifier">table</span><span class="hl-brackets">]]</span><span class="hl-code"> </span><span class="hl-brackets">[[</span><span class="hl-identifier">table</span><span class="hl-code"> </span><span class="hl-identifier">style</span><span class="hl-code">=</span><span class="hl-quotes">"</span><span class="hl-string">border:1px solid #ddd;padding:1%;margin-right:auto;margin-left:auto;margin-bottom:1%;width:98%;</span><span class="hl-quotes">"</span><span class="hl-brackets">]][[</span><span class="hl-identifier">row</span><span class="hl-brackets">]][[</span><span class="hl-identifier">cell</span><span class="hl-brackets">]]</span><span class="hl-code"> ++ </span><span class="hl-identifier">Earn</span><span class="hl-code"> </span><span class="hl-identifier">It</span><span class="hl-code"> * </span><span class="hl-identifier">Program</span><span class="hl-code"> </span><span class="hl-identifier">something</span><span class="hl-code"> </span><span class="hl-identifier">really</span><span class="hl-code"> </span><span class="hl-identifier">cool</span><span class="hl-code"> </span><span class="hl-identifier">using</span><span class="hl-code"> </span><span class="hl-identifier">gml</span><span class="hl-code"> * </span><span class="hl-identifier">Make</span><span class="hl-code"> </span><span class="hl-identifier">a</span><span class="hl-code"> </span><span class="hl-identifier">really</span><span class="hl-code"> </span><span class="hl-identifier">cool</span><span class="hl-code"> </span><span class="hl-identifier">game</span><span class="hl-code"> +++ </span><span class="hl-identifier">Tips</span><span class="hl-code"> * </span><span class="hl-identifier">Make</span><span class="hl-code"> </span><span class="hl-identifier">sure</span><span class="hl-code"> </span><span class="hl-identifier">you</span><span class="hl-code"> </span><span class="hl-identifier">post</span><span class="hl-code"> </span><span class="hl-identifier">your</span><span class="hl-code"> </span><span class="hl-identifier">examples</span><span class="hl-code"> </span><span class="hl-reserved">and</span><span class="hl-code"> </span><span class="hl-identifier">games</span><span class="hl-code"> </span><span class="hl-identifier">on</span><span class="hl-code"> </span><span class="hl-identifier">the</span><span class="hl-code"> </span><span class="hl-brackets">[[[</span><span class="hl-identifier">forum</span><span class="hl-code">:</span><span class="hl-identifier">start</span><span class="hl-code">|</span><span class="hl-identifier">forum</span><span class="hl-brackets">]]]</span><span class="hl-code">. </span><span class="hl-identifier">Otherwise</span><span class="hl-code"> </span><span class="hl-identifier">no</span><span class="hl-code"> </span><span class="hl-identifier">one</span><span class="hl-code"> </span><span class="hl-identifier">can</span><span class="hl-code"> </span><span class="hl-identifier">see</span><span class="hl-code"> </span><span class="hl-identifier">it</span><span class="hl-code"> </span><span class="hl-reserved">and</span><span class="hl-code"> </span><span class="hl-identifier">nominate</span><span class="hl-code"> </span><span class="hl-identifier">you</span><span class="hl-code"> </span><span class="hl-reserved">for</span><span class="hl-code"> </span><span class="hl-identifier">the</span><span class="hl-code"> </span><span class="hl-identifier">cool</span><span class="hl-code"> </span><span class="hl-identifier">badge</span><span class="hl-code">. </span><span class="hl-brackets">[[</span><span class="hl-code">/</span><span class="hl-identifier">cell</span><span class="hl-brackets">]][[</span><span class="hl-code">/</span><span class="hl-identifier">row</span><span class="hl-brackets">]][[</span><span class="hl-code">/</span><span class="hl-identifier">table</span><span class="hl-brackets">]]</span><span class="hl-code"> </span><span class="hl-brackets">[[</span><span class="hl-identifier">table</span><span class="hl-code"> </span><span class="hl-identifier">style</span><span class="hl-code">=</span><span class="hl-quotes">"</span><span class="hl-string">border:1px solid #ddd;padding:1%;margin-right:auto;margin-left:auto; width:98%;</span><span class="hl-quotes">"</span><span class="hl-brackets">]][[</span><span class="hl-identifier">row</span><span class="hl-brackets">]][[</span><span class="hl-identifier">cell</span><span class="hl-brackets">]]</span><span class="hl-code"> ++ </span><span class="hl-identifier">Members</span><span class="hl-code"> </span><span class="hl-identifier">Who</span><span class="hl-code"> </span><span class="hl-identifier">Have</span><span class="hl-code"> </span><span class="hl-identifier">Earned</span><span class="hl-code"> </span><span class="hl-identifier">the</span><span class="hl-code"> </span><span class="hl-identifier">Cool</span><span class="hl-code"> </span><span class="hl-identifier">Badge</span><span class="hl-code"> </span><span class="hl-brackets">[[</span><span class="hl-identifier">module</span><span class="hl-code"> </span><span class="hl-identifier">ListPages</span><span class="hl-code"> </span><span class="hl-identifier">category</span><span class="hl-code">=</span><span class="hl-quotes">"</span><span class="hl-string">member</span><span class="hl-quotes">"</span><span class="hl-code"> </span><span class="hl-identifier">order</span><span class="hl-code">=</span><span class="hl-quotes">"</span><span class="hl-string">titleAsc</span><span class="hl-quotes">"</span><span class="hl-code"> </span><span class="hl-identifier">tag</span><span class="hl-code">=</span><span class="hl-quotes">"</span><span class="hl-string">cool-badge</span><span class="hl-quotes">"</span><span class="hl-code"> </span><span class="hl-identifier">perPage</span><span class="hl-code">=</span><span class="hl-quotes">"</span><span class="hl-string">100</span><span class="hl-quotes">"</span><span class="hl-code"> </span><span class="hl-identifier">separate</span><span class="hl-code">=</span><span class="hl-quotes">"</span><span class="hl-string">false</span><span class="hl-quotes">"</span><span class="hl-brackets">]]</span><span class="hl-code"> * %%</span><span class="hl-identifier">linked_title</span><span class="hl-code">%% </span><span class="hl-brackets">[[</span><span class="hl-code">/</span><span class="hl-identifier">module</span><span class="hl-brackets">]]</span><span class="hl-code"> </span><span class="hl-brackets">[[</span><span class="hl-code">/</span><span class="hl-identifier">cell</span><span class="hl-brackets">]][[</span><span class="hl-code">/</span><span class="hl-identifier">row</span><span class="hl-brackets">]][[</span><span class="hl-code">/</span><span class="hl-identifier">table</span><span class="hl-brackets">]]</span><span class="hl-code"> &gt;&gt;&gt;</span> </pre></div> </div> <p>A few words of explanation:</p> <ul> <li>first we import ServerProxy class from XML-RPC library,</li> <li>then we construct the ServerProxy object s supplying the endpoint URL (SOME-URL in this case, as we don't have yet decided what the URL is going to be)</li> <li>we can see a list of methods by calling <tt>system.listMethods</tt> on the ServerProxy object</li> <li>we get a help message for a method by calling <tt>system.methodHelp</tt></li> <li>then we get categories of site gamemaker (yeah, it's a part of the wikicomplete.info)</li> <li>then we call <tt>site.pages</tt> method (specifying site and category parameters), but instead of displaying the whole list of structures that describe pages, we only display their names</li> <li>calling <tt>page.get</tt> returns an array with the information about a page, including: <ul> <li>wiki source, array key: source</li> <li>generated HTML, array key: html</li> <li>array with various meta-data, array key: meta</li> </ul> </li> <li>we call <tt>page.get</tt> passing as the argument array that specifies site and page name, get the page object, but displays only what's stored under the <tt>source</tt> array key</li> </ul> <p>As you see playing with this is really easy as is browsing the available methods and using them.</p> <h1><span>Why XML-RPC</span></h1> <p>We've chosen this protocol because it is an easy way to develop both server and client in almost any programming language. Also it gives some flexibility in passed arguments and return values.</p> <p>We use <tt>struct</tt> XML-RPC type as the argument and return value type, which is mapped to associative array or dictionary in client (and server) libraries. Each API method gets a bunch of required and optional parameters, that are basically values stored in the struct passed to API methods.</p> <p>For example <tt>site.pages</tt> gets a struct with the following keys:</p> <ul> <li>site (site name to get pages from) — required</li> <li>category (category to get pages from) — optional</li> </ul> <p>This means, you have to create an associative array (when using PHP) or a dictionary (using Python) and pass it as the method argument:</p> <div class="code"> <div class="hl-main"> <pre> <span class="hl-code"># PHP $pages = $server-&gt;site-&gt;pages(array("site" =&gt; "my-site", "category" =&gt; "my-category"));</span> </pre></div> </div> <div class="code"> <div class="hl-main"> <pre> <span class="hl-comment"># Python</span><span class="hl-code"> </span><span class="hl-identifier">pages</span><span class="hl-code"> = </span><span class="hl-identifier">server</span><span class="hl-code">.</span><span class="hl-identifier">site</span><span class="hl-code">.</span><span class="hl-identifier">pages</span><span class="hl-brackets">(</span><span class="hl-code">{</span><span class="hl-quotes">"</span><span class="hl-string">site</span><span class="hl-quotes">"</span><span class="hl-code">: </span><span class="hl-quotes">"</span><span class="hl-string">my-site</span><span class="hl-quotes">"</span><span class="hl-code">, </span><span class="hl-quotes">"</span><span class="hl-string">category</span><span class="hl-quotes">"</span><span class="hl-code">: </span><span class="hl-quotes">"</span><span class="hl-string">my-category</span><span class="hl-quotes">"</span><span class="hl-code">}</span><span class="hl-brackets">)</span> </pre></div> </div> <p>Using other programming languages, you'll end with something similar. You can almost always create the array/dictionary in-place, so having this convention is not a big deal.</p> <h1><span>Applications</span></h1> <p>I'm working on a filesystem based access to Wikidot site (using <a href="http://en.wikipedia.org/wiki/FUSE" >FUSE</a> and Python).</p> <p>We plan having a Wikidot application for iPhone.</p> <p>A save-it-directly-on-wikidot plugin would be a nice thing for various text editors (and probably other applications).</p> <p>And probably there are billions of other ways to use this API we're not even aware of. If you have any, feel free to leave a comment.</p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/gabrys" ><!--[if gte IE 7]><!--><img class="small" src="http://www.wikidot.com/common--images/avatars/2/2462/a16.png" alt="Gabrys" style="background-image:url(http://www.wikidot.com/userkarma.php?u=2462)" /><!--<![endif]--><!--[if lt IE 7]><img class="small" src="http://www.wikidot.com/common&#45;&#45;images/avatars/2/2462/a16.png" alt="Gabrys" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod='scale')"/><![endif]--></a><a href="http://www.wikidot.com/user:info/gabrys" >Gabrys</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://piotr.gabryjeluk.pl/dev:wikidot-is-big</guid>
				<title>Wikidot is BIG</title>
				<link>http://piotr.gabryjeluk.pl/dev:wikidot-is-big</link>
				<description>

&lt;p&gt;As you may know I&#039;m implementing a new &lt;a href=&quot;http://piotr.gabryjeluk.pl/dev:new-search-for-wikidot-s-gonna-rock&quot;&gt;search engine for Wikidot&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This seemed quite easy at first having nice Lucene implementation in PHP — included in Zend Framework and indeed during tests it was fast, simple and powerful. But this was tested on about 100,000 documents (document is a Wikidot page or forum thread) and we have about 2,500,000 documents in Wikidot now. And this is where the problem begins.&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;&lt;!--[if gte IE 7]&gt;&lt;!--&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common--images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=2462)&quot; /&gt;&lt;!--&lt;![endif]--&gt;&lt;!--[if lt IE 7]&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common&amp;#45;&amp;#45;images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod=&#039;scale&#039;)&quot;/&gt;&lt;![endif]--&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;Gabrys&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Sat, 10 Jan 2009 12:48:15 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p>As you may know I'm implementing a new <a href="http://piotr.gabryjeluk.pl/dev:new-search-for-wikidot-s-gonna-rock">search engine for Wikidot</a>.</p> <p>This seemed quite easy at first having nice Lucene implementation in PHP — included in Zend Framework and indeed during tests it was fast, simple and powerful. But this was tested on about 100,000 documents (document is a Wikidot page or forum thread) and we have about 2,500,000 documents in Wikidot now. And this is where the problem begins.</p> <div class="content-separator" style="display: none:"></div> <p>After indexing roughly 1,800,000 documents there were some problems with memory consumed by the indexing process (500&nbsp;MB merory limit was not enough in SOME cases).</p> <p>Even earlier I realized that the search times weren't good enough. This is why I implemented the searching part in Java, which is the native platform for the Lucene indexer. This sped things up.</p> <p>Do you think indexing a document in just a second is fast? I though this is a good result. Indexing a document takes about 0.2&nbsp;s when having small amount of documents in the index already. But when you have 400,000 documents in index, adding another document to the index takes about 0.4&nbsp;s. And having even this "good" indexing time (below a second), indexing the whole Wikidot would take at least a few days.</p> <p>This leads me to a conclusion, that Wikidot is really <span style="font-size:large;"><strong>BIG</strong></span>.</p> <p>A similar situation also applied to the user uploaded files. There was a problem of a limit of filesystem reached, which was about 32,000 directories max in a single directory. Having all user-uploaded files in a directory structure of one-directory-per-wiki, this resulted in a problem when having more than 32,000 wikis.</p> <p>Replicating this structure to another machine (also known as live-backup of user-uploaded files) was also quite a challenge, because we've reached a limit of directory watches in the kernel-level filesystem-monitoring system (inotify).</p> <p>It all shows, that things that seem easy are not necessarily easy because of the high scale of the Wikidot, which touches some limits on nearly every piece of software we use. But this is also a great chance to really test those projects and how they react to such a high load.</p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/gabrys" ><!--[if gte IE 7]><!--><img class="small" src="http://www.wikidot.com/common--images/avatars/2/2462/a16.png" alt="Gabrys" style="background-image:url(http://www.wikidot.com/userkarma.php?u=2462)" /><!--<![endif]--><!--[if lt IE 7]><img class="small" src="http://www.wikidot.com/common&#45;&#45;images/avatars/2/2462/a16.png" alt="Gabrys" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod='scale')"/><![endif]--></a><a href="http://www.wikidot.com/user:info/gabrys" >Gabrys</a></span></p> 
				 	]]>
				</content:encoded>							</item>
					<item>
				<guid>http://piotr.gabryjeluk.pl/dev:wikidot-search-ready-to-test</guid>
				<title>Wikidot Search Ready To Test</title>
				<link>http://piotr.gabryjeluk.pl/dev:wikidot-search-ready-to-test</link>
				<description>

&lt;p&gt;&lt;a href=&quot;http://piotr.gabryjeluk.pl/dev:new-search-for-wikidot-s-gonna-rock&quot;&gt;Lucene-based search&lt;/a&gt; - a brand new feature has been being introduced to Wikidot code for quite a long time.&lt;/p&gt;
&lt;p&gt;After that time of developing and dealing with performance problems (searching the whole Wikidot in 3 seconds is too long!) it&#039;s time for test this thing!&lt;/p&gt;
&lt;p&gt;by &lt;span class=&quot;printuser avatarhover&quot;&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;&lt;!--[if gte IE 7]&gt;&lt;!--&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common--images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;background-image:url(http://www.wikidot.com/userkarma.php?u=2462)&quot; /&gt;&lt;!--&lt;![endif]--&gt;&lt;!--[if lt IE 7]&gt;&lt;img class=&quot;small&quot; src=&quot;http://www.wikidot.com/common&amp;#45;&amp;#45;images/avatars/2/2462/a16.png&quot; alt=&quot;Gabrys&quot; style=&quot;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod=&#039;scale&#039;)&quot;/&gt;&lt;![endif]--&gt;&lt;/a&gt;&lt;a href=&quot;http://www.wikidot.com/user:info/gabrys&quot;  &gt;Gabrys&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
</description>
				<pubDate>Thu, 18 Dec 2008 23:22:47 +0000</pubDate>
												<content:encoded>
					<![CDATA[
						 <p><a href="http://piotr.gabryjeluk.pl/dev:new-search-for-wikidot-s-gonna-rock">Lucene-based search</a> - a brand new feature has been being introduced to Wikidot code for quite a long time.</p> <p>After that time of developing and dealing with performance problems (searching the whole Wikidot in 3 seconds is too long!) it's time for test this thing!</p> <div class="content-separator" style="display: none:"></div> <table style="margin:0; padding:0"> <tr> <td style="margin:0; padding:0"> <div id="toc"> <div id="toc-action-bar"><a href="javascript:;" >Fold</a><a style="display: none" href="javascript:;" >Unfold</a></div> <div class="title">Table of Contents</div> <div id="toc-list"> <div style="margin-left: 1em;"><a href="#toc0">Introduction</a></div> <div style="margin-left: 2em;"><a href="#toc1">Fresh install</a></div> <div style="margin-left: 2em;"><a href="#toc2">Existing install</a></div> <div style="margin-left: 1em;"><a href="#toc3">Features</a></div> <div style="margin-left: 1em;"><a href="#toc4">Test it!</a></div> <div style="margin-left: 1em;"><a href="#toc5">Extras</a></div> <div style="margin-left: 2em;"><a href="#toc6">Highlighting</a></div> <div style="margin-left: 2em;"><a href="#toc7">Need more performance or memory limit exhausted</a></div> <div style="margin-left: 1em;"><a href="#toc8">Summary</a></div> </div> </div> </td> </tr> </table> <h1><span>Introduction</span></h1> <p>The whole thing is about Search All Sites module for Wikidot Open Source. This entry is mainly for those of you that run their own Wikidot services. More info on getting Wikidot software run can be found on <a href="http://my-wd-local.wikidot.com/guide:ubuntu-8-04-with-lighttpd-install">Ed's site</a>.</p> <h2><span>Fresh install</span></h2> <p>After installing Wikidot Open Source from current version, you can instantly test the new Search All Sites module. Just navigate to <strong>/search:all</strong> page of your main wiki. Example: if your wiki farm runs on the domain <strong>mydomain.com</strong> and your main wiki is <strong>www.mydomain.com</strong>, navigate to <a href="http://www.mydomain.com/search:all">http://www.mydomain.com/search:all</a>.</p> <h2><span>Existing install</span></h2> <p>Updating to the new search engine from already installed version is quite tricky, because you need to pre-populate the search index (which is the actual file that is searched by the index, when looking for term user entered).</p> <p>You can try the following commands:</p> <ul> <li>obtain root priviledges</li> </ul> <div class="code"> <pre> <code>sudo su</code> </pre></div> <ul> <li>navigate to your Wikidot directory (it is /var/www/wikidot by default), update the code and run the lucene_bootstrap.php script as your lighttpd user</li> </ul> <div class="code"> <pre> <code>cd /var/www/wikidot svn update cd tests sudo -u www-data php lucene_bootstrap.php</code> </pre></div> <p>This command adds every page to the index (normally located at /var/www/wikidot/tmp/lucene_index). Once indexed a page can be searched (if the site containing the page is public or you're a member of the site). The command prints a dot for each 10 indexed items (item is every page and forum/comments thread).</p> <p>If this runs smoothly (i.e. no error, Segmentation fault at the end is OK, but <strong>memory exhausted is not OK</strong>) you have all your sites indexed and ready to search through.</p> <p><strong>When it fails:</strong> you can increase the max_memory setting in the corresponding php.ini file and re-run the command. There is no bad thing in running this command more than once as indexing a page always deletes the page from index before adding it again.</p> <p>Just go to <strong>/search:all</strong> location at your main wiki and search for some content.</p> <p>Also you need to update your crontab file. Add:</p> <div class="code"> <pre> <code>* * * * * www-data /var/www/wikidot/bin/job.sh UpdateLuceneIndexJob</code> </pre></div> <br /> to your /etc/crontab (assuming you have wikidot in /var/www/wikidot/). This will add an every-minute job indexing pages and threads queued to index when saving or changing public/private site state. <h1><span>Features</span></h1> <ul> <li>First of all the new search applies only to the <strong>Search All Sites</strong> i.e. <strong>Search This Site</strong> works in the old way.</li> <li>Search uses titles and tags intelligently <ul> <li>pages with the exact search phrase in the title are placed higher in the result list</li> <li>pages with tags matching search phrase are quite high in the result list</li> <li>pages with title matching search phrase are quite high in the result list</li> <li>pages with content matching search phrase are somewhere low in result list</li> <li>pages with parts of search phrase matching titles and tags can be higher in the result list than the pages having content matching even the exact phrase</li> <li>this all means: <strong>tags and titles are more important than content for the search engine</strong></li> </ul> </li> <li>You can narrow your search to only selected wikis <ul> <li>append <strong>site:site1,site2,site3</strong> (no spaces between them) to your search query. Example: search for "<strong>gabrys site:www,community</strong>" searches for <strong>gabrys</strong> in titles, tags and contents of pages and threads inside of sites <strong>www</strong>.yourdomain.com and <strong>community</strong>.yourdomain.com (supposing your Wikidot installation runs on yourdomain.com)</li> </ul> </li> <li>The search includes public sites plus sites you are a member of. Also the results from your sites are generally more relevant to the search engine (i.e. they appear higher than the results from other sites)</li> <li>The search results for given phrase for given user are cached (if memcached is used) for a few minutes. This makes the search even more smooth (no need to search the index again when user only switches the result page from 2 to 3 for example)</li> </ul> <h1><span>Test it!</span></h1> <p>If you don't run and don't want to run your own Wikidot installation, you can try the new features on the following site:</p> <p style="text-align: center;"><a href="http://www.wikicomplete.info/search:all">http://www.wikicomplete.info/search:all</a></p> <h1><span>Extras</span></h1> <h2><span>Highlighting</span></h2> <p>Like Google's way to highlight the searched words in Google-cached versions of result pages? Now you can add this feature to your Wikidot installation as well.</p> <p>Open <strong>conf/wikidot.ini</strong> file and append those lines:</p> <div class="code"> <pre> <code>[search] ; enables highlighting of search phrase in the resulting documents highlight = true</code> </pre></div> <p>This will highlight the words user searched for using:</p> <ul> <li>Google Search</li> <li>Yahoo Search</li> <li>Your Wikidot installation search:all page</li> </ul> <h2><span>Need more performance or memory limit exhausted</span></h2> <p>We experienced some low performance when searching through 2 millions of pages and threads of Wikidot.com. The search results were generated in about 3 seconds. This was not enough for us, so we manage to speed things up using the native <a href="http://lucene.apache.com">Java Lucene implementation</a> for searching the index. This works because we use <a href="http://framework.zend.com/manual/en/zend.search.lucene.html">PHP Lucene implementation</a> that is compatible with the Java's one. This means we can index page with PHP and search with Java. And we do it! If you want do this too (experiencing low search performance of getting memory exhausted error messages), just add the following lines to your <strong>conf/wikidot.ini</strong> file:</p> <div class="code"> <pre> <code>[search] ; enables the use of Java for searching use_java = true</code> </pre></div> <p>Notes</p> <ul> <li>if you already have [search] section in the <strong>conf/wikidot.ini</strong> file, just add the <tt>use_java = true</tt> line in the search section</li> <li>enabling Java for searching requires you to install java executable for your system. You should know how to do this (try sudo aptitude install openjdk-6-jre).</li> <li>you don't need any Java libraries as we already bundled everything needed in the .jar file. The Java source and Ant build script is located normally at the <tt>/var/www/wikidot/java</tt> directory (assuming you installed the wikidot in <tt>/var/www/wikidot</tt>.</li> </ul> <h1><span>Summary</span></h1> <p>Once we assure the search is stable and gives relevant results, we'll introduce it to the Wikidot.com service. I calculated that indexing all the sites would take about 3 days! But searching is done in less than 1 second (using the Java program).</p> <p>I'm looking for your comment on the features. Especially if you've tried them yourself!</p> <p>by <span class="printuser avatarhover"><a href="http://www.wikidot.com/user:info/gabrys" ><!--[if gte IE 7]><!--><img class="small" src="http://www.wikidot.com/common--images/avatars/2/2462/a16.png" alt="Gabrys" style="background-image:url(http://www.wikidot.com/userkarma.php?u=2462)" /><!--<![endif]--><!--[if lt IE 7]><img class="small" src="http://www.wikidot.com/common&#45;&#45;images/avatars/2/2462/a16.png" alt="Gabrys" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://www.wikidot.com/userkarma.php?u=2462,sizingMethod='scale')"/><![endif]--></a><a href="http://www.wikidot.com/user:info/gabrys" >Gabrys</a></span></p> 
				 	]]>
				</content:encoded>							</item>
				</channel>
</rss>