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

<channel>
	<title>PKM with Kneaver</title>
	<atom:link href="http://www.kneaver.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.kneaver.com</link>
	<description>Software for Knowledge Management And vice-versa</description>
	<lastBuildDate>Fri, 18 May 2012 08:03:36 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>PHP iterators in c++</title>
		<link>http://www.kneaver.com/blog/2012/04/php-iterators-in-c/</link>
		<comments>http://www.kneaver.com/blog/2012/04/php-iterators-in-c/#comments</comments>
		<pubDate>Mon, 16 Apr 2012 12:55:11 +0000</pubDate>
		<dc:creator>Bruno Winck</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.kneaver.com/?p=339</guid>
		<description><![CDATA[PHP code is nicer with iterators. This is our experience of writing PHP iterators in c++ extensions. Sometimes simplicity of visible code hide intricacies. This is the case with iterators. I will try here to put the light on the &#8230; <a href="http://www.kneaver.com/blog/2012/04/php-iterators-in-c/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.kneaver.com%2Fblog%2F2012%2F04%2Fphp-iterators-in-c%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.kneaver.com%2Fblog%2F2012%2F04%2Fphp-iterators-in-c%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>PHP code is nicer with iterators. This is our experience of writing PHP iterators in c++ extensions. Sometimes simplicity of visible code hide intricacies. This is the case with iterators. I will try here to put the light on the simplicity of writing iterators in PHP extensions. This is also a typical lessons learned from leveraging new possibilities due to a change. Since we are in KM this is also a experiment on using our own methology of keeping track of what is done.</p>
<p>Context</p>
<p>Our port of Kneaver on LAMP is on progress. Side to porting c++ to PHP extensions we convert ASP to PHP. There are a lot of places where we iterate on result of queries. Usually results queries are XML chunks and we do select on them. This is what it looks like in VBScript</p>
<p><code>Set Items = Channel.SelectNodes( "item")<br />
Dim Item<br />
For Each Item in Items<br />
Dim TitleItem<br />
Set TitleItem = Item.Find0("title")<br />
Next</code></p>
<p>This is how it should be nice on PHP</p>
<p><code>$Select = $Channel-&gt;SelectNodes( "item" );<br />
foreach( $Select as $Item) {<br />
$TitleItem = $Item-&gt;Find0("title");<br />
}</code></p>
<p><code>This is the XML fragment we use</code></p>
<p><code>&lt;adress&gt;<code>&lt;adress2/&gt;<code>&lt;adress2/&gt;</code></code></code><code>&lt;/adress&gt;</code></p>
<p>Rational</p>
<p>We have many iterators like in our libraries. Libraries are all reachable via RSPHP a custom PHP extension ( we also have a similar extension for Python, Perl, Ruby). The object model of the semantic database and the meta process engine become brighter. Since we also embed PHP as alternative scripting engine it is important for our users that scripts are good looking. So a generic support for iterators has a good ROI. Unfortunately documentation is poor, old. So since I have a working example, actual (PHP 5.3.3, April 16th 2012) and ported I thought it can be beneficial to share it.  This is with my words, I am not an expert in PHP. Iterators are heavy duty objects, you test on 2 iterations, use it on millions, get only surprised when it fails on billions. This is why I took care in modularity and self testing code. This add a lot of lines and you should skip anything about states, precondition and postcondition at first.</p>
<p>My sources:</p>
<ul>
<li><a href="http://talks.somabo.de/200505_cancun_implementing_php5_oop_extensions.pdf">Implementing PHP 5 OOP Extensions by Marcus Bürger</a></li>
<li>util.c from <a href="http://somabo.de/php/ext/util/">http://somabo.de/php/ext/util/</a></li>
<li><a href="http://www.sitepoint.com/php-simple-object-iterators/">Simple Object Iterators in PHP</a> <strong>By</strong> <a title="Posts by Craig Buckler" href="http://www.sitepoint.com/author/craig-buckler/" rel="author">Craig Buckler</a></li>
<li>ext/date/php_date.c in PHP source code</li>
</ul>
<p>Iterators on PHP will be attached to a class. A call to get_iterator will be made behind the scene when using foreach. So it all starts with a class that can be iterated (there is also a concept of traversable so let&#8217;s stick to iterate). In our case this class is IRSXMLElements, a select of XML elements. Iterators can be implemented directly by the class or by a visitor lightweight class deriving from zend_object_iterator (available in Zend/zend_iterators.h).</p>
<p>This is the choice I prefered since it could be reused for several places. Also iterator are statefull objects, you need a place to keep the current position while IRSXMLElements are stateless. You acn imagine situations where several iterations are done simulatnously on the same object.</p>
<p>This is how the declaration of IRSXMLElements had to be altered to support iterators.</p>
<p><code>zend_class_entry class_entryLoc;<br />
INIT_CLASS_ENTRY( class_entryLoc,"irsxmlelements", IRSXMLElements_functions);<br />
IRSXMLElements_class_entry = zend_register_internal_class(&amp;class_entryLocTSRMLS_CC);<br />
<strong>// zend_class_implements( IRSXMLElements_class_entry TSRMLS_CC, 1, zend_ce_iterator);</strong><br />
<strong> IRSXMLElements_class_entry-&gt;get_iterator = irsxmlelements_get_iterator;</strong><br />
<strong>// IRSXMLElements_class_entry-&gt;iterator_funcs.funcs = &amp;Myzend_object_iterator_funcs;</strong></code></p>
<p><code></code><strong>irsxmlelements_get_iterator</strong> will be defined below</p>
<p>Note that only one line is necessary, it must be placed AFTER the class_entry was sent to PHP. The two other commented lines have no effect they can be commented or not.</p>
<p><strong>zend_ce_iterator</strong> is found in Zend/zend_interfaces.h</p>
<p>Just with this change the syntax foreach will now be accepted, subsequent errors will be internal errors.</p>
<p>Our code is splitted in very small procedures because some part of it is generic, some others will eventually be generated automatically and must stay limited (the class initialisation above and the get_iterator below).</p>
<p>The signature of this function is imposed by the framework but there are two genericity in it that can&#8217;t be exposed, hence the need of a procedure to fill the gap between the framework and the generic function.</p>
<ol>
<li>In most object models iterator on class A will return elements of class B. So class B must be introduced somewhere. In our example A = IRSXMLElements, B = IRSXMLElement. B will appear as the class_entry given to RSGenericIterator.</li>
<li>Iterators (use to be channels for us) are now called Enum (Windows era). How to obtain this enum from the object is dependant on the object. Even if the name of the function Get_NewEnum was imposed by OLE Automation you couldn&#8217;t call it by a simple casting in c++, it would require templating.</li>
</ol>
<p><code>zend_object_iterator *irsxmlelements_get_iterator(zend_class_entry *ce, zval *object, int by_ref TSRMLS_DC)<br />
{<br />
if (by_ref) {<br />
zend_error(E_ERROR,"An iterator cannot be used with foreach by reference");<br />
}<br />
RSXMLLib::IRSXMLElementsPtr LocalObj = getObjectIRSXMLElements( object TSRMLS_CC);<br />
return RSGenericIterator( RSXMLElement_class_entry, LocalObj-&gt;Get_NewEnum( ));<br />
}</code></p>
<p>and this is how we create the iterator itself:</p>
<p><code>zend_object_iterator* RSGenericIterator( zend_class_entry* Class, const IEnumVARIANTPtr&amp; Object)<br />
{<br />
RSEnumIt *iterator = new RSEnumIt( Class, Object);<br />
return static_cast(iterator);<br />
}</code></p>
<p>First thing to note here is that we will return to the framework a <code>zend_object_iterator</code>. This is a new beast in PHP. It is not a permanent object or a ZVAL. It is just a very lightweight object with 6 methods allocated and disposed by us. Nice.</p>
<p>As we use c++ the best is to derive from <code>zend_object_iterator and add our fields. Let's first see what is in <code>zend_object_iterator.</code></code></p>
<p><code>struct _zend_object_iterator {<br />
void *data;<br />
zend_object_iterator_funcs *funcs;<br />
ulong index; /* private to fe_reset/fe_fetch opcodes */<br />
};</code></p>
<p><code>funcs</code> Will be our array of 6 functions. It is like a Virtual Method table but it&#8217;s location after data, signatures and portability dissuade us to try to code it as an interface of 6 virtual methods.</p>
<p><code>data</code> . Seems to be used for PHP defined iterators. I suggest to set it to NULL and ignore it.</p>
<p><code>index</code>. same as for <code>data</code>, just initialize and forget.</p>
<p>This our class derived from <code>zend_object_iterator</code>:</p>
<p><code>class RSEnumIt<br />
: public zend_object_iterator<br />
{<br />
public:<br />
zval* m_Current;<br />
_variant_t m_LastFetch;<br />
IEnumVARIANTPtr m_Object;<br />
zend_class_entry* m_Class;<br />
bool m_Valid;<br />
int m_Index;<br />
RSEnumIt( zend_class_entry* m_Class, const IEnumVARIANTPtr&amp; m_Object);<br />
</code><code>... Code about state below should take place here</code><code><br />
};</code></p>
<p>m_Current will hold the current value. Getting the current value could occur several times depending on the framework implementation so it is beneficial to keep it inside the iterator and simply return it (not really what we do).<br />
m_Index will be returned as the key of the iterator. 0 is before records. We could have used -1 for end of iteration and save the boolean m_Valid.<br />
m_Valid indicate that current position is valid. Note that iterators are supposed to be positionned on the first element after creation or after rewind.<br />
m_Class will be used to construct m_Current<br />
m_Object is the underlying c++ object supporting the iteration. It is not the object we started from, this one is already the iteration on progress.<br />
m_LastFetch is the last internal object available for getcurrent but not already built as a PHP object. m_LasFetch could have been saved at the cost of moving the code inside getcurrent into moveforward.</p>
<p>if m_Valid is false m_LastFetch and m_Current should be empty.<br />
if m_Valid is true and m_Current is not empty it must be the PHP representation of m_lastFetch.</p>
<p>Hum, I should remember Betrand Meyer lessons better, let&#8217;s reread it first and explain correctly.</p>
<p>States of the iterator:</p>
<p>You can skip this paragraph on first reading.<br />
#ifdef _DEBUG<br />
<code>enum RSEnumItStates<br />
{<br />
    RSEnumItJustCreated = 1,<br />
    RSEnumItValid = 2,<br />
    RSEnumItAfterEnd = 3,<br />
    RSEnumItCurrentSet = 4,<br />
    RSEnumItBeforeFirst = 5,<br />
};<br />
#endif</code>
<ol>
<li>Before first fetch</li>
<li>After Successuful Next, or Valid Position</li>
<li>After End</li>
<li>Valid with Current created</li>
</ol>
<p><code>#ifdef _DEBUG<br />
    // States are here to verify the code potientially by<br />
    // testing more than necessary for it's logic, hence ifdefs<br />
    bool		m_JustCreated;<br />
    RSEnumItStates	GetState()<br />
    {<br />
	if ( m_Valid)<br />
	    if (m_Current)<br />
		return RSEnumItCurrentSet;<br />
	    else<br />
		return RSEnumItValid;<br />
	else<br />
	if ( m_JustCreated)<br />
		return RSEnumItJustCreated;<br />
	    else<br />
	    if (m_Index == 0)<br />
		return RSEnumItBeforeFirst;<br />
	    else<br />
		return RSEnumItAfterEnd;<br />
    }<br />
#endif</code></p>
<p>Rewind: Entry Any state, Output 2 or 3</p>
<p>Current: Entry 2 or 4, Ouput 4</p>
<p>Key: Entry 2 or 4, Output same</p>
<p>Next: Entry 2 or 4</p>
<p>HasMore: Entry 2, 3, 4, Output same</p>
<p>invalidate_current: Entry</p>
<p>dtor: Any</p>
<p>Here is the list of calls for the sample</p>
<p><code>get_iterator<br />
- constructor<br />
rewind<br />
- move<br />
-- invalidate<br />
hasmore<br />
currentdata (once per loop, not depending on how many times you use the variable)<br />
currentkey (if key was used in foreach)<br />
move<br />
- invalidate<br />
hasmore<br />
current<br />
currentkey (if key was used)<br />
move<br />
- invalidate<br />
hasmore<br />
dtor<br />
</code><br />
So rewind is called before anything, hasmore before entering the loop, moveforward at the end of the loop. hasmore really tests that current is valid.</p>
<p>The constructor of the iterator:</p>
<p><code>RSEnumIt::RSEnumIt(zend_class_entry* Class, const IEnumVARIANTPtr&amp; Object)<br />
{<br />
// inherited fields<br />
data = NULL;<br />
index = 0;<br />
funcs = &amp;Myzend_object_iterator_funcs;<br />
// declared<br />
m_Valid = false;<br />
m_Index = 0;<br />
m_Class = Class;<br />
m_Object = Object;<br />
m_Current = NULL;<br />
}</code></p>
<p>As expect data and index set to 0. funcs initialized with the data below, and the iterator is build in state &#8220;before first fetch&#8221;, a state requested by PHP and that will be changed by an initial rewind.</p>
<p>Next and to introduce the 6 methods this is a static object constructing the table of ethods and used above in the constructor</p>
<p><code>zend_object_iterator_funcs Myzend_object_iterator_funcs = {<br />
RSEnumIt_dtor,<br />
RSEnumIt_has_more,<br />
RSEnumIt_current_data,<br />
RSEnumIt_current_key,<br />
RSEnumIt_move_forward,<br />
RSEnumIt_rewind,<br />
RSEnumIt_invalidate_current<br />
};</code></p>
<p>each functions</p>
<p><code><br />
void RSEnumIt_invalidate_current(zend_object_iterator *iter TSRMLS_DC)<br />
{<br />
    RSEnumIt *iterator = static_cast<RSEnumIt *>(iter);<br />
    invariant( (iterator->GetState() == RSEnumItBeforeFirst) || (iterator->GetState() == RSEnumItValid) || (iterator->GetState() == RSEnumItCurrentSet));</p>
<p>    if (iterator->m_Current) {<br />
	    invariant( iterator->GetState() == RSEnumItCurrentSet);<br />
	    zval_ptr_dtor(&#038;iterator->m_Current);<br />
	    iterator->m_Current = NULL;<br />
    }<br />
    invariant( (iterator->GetState() == RSEnumItBeforeFirst) || (iterator->GetState() == RSEnumItValid));<br />
}<br />
</code><br />
aaa<br />
<code><br />
void RSEnumIt_dtor(zend_object_iterator *iter TSRMLS_DC)<br />
{<br />
    RSEnumIt *iterator = static_cast<RSEnumIt *>(iter);<br />
    if (iterator->m_Valid)<br />
	RSEnumIt_invalidate_current(iter TSRMLS_CC);<br />
    // destructor called by delete will clear m_LastFetch and m_Object;<br />
    delete iterator;<br />
}<br />
</code><br />
aa<br />
<code><br />
int RSEnumIt_has_more(zend_object_iterator *iter TSRMLS_DC)<br />
{<br />
    RSEnumIt *iterator = static_cast<RSEnumIt *>(iter);<br />
    invariant( (iterator->GetState() == RSEnumItAfterEnd) || (iterator->GetState() == RSEnumItValid) || (iterator->GetState() == RSEnumItCurrentSet));<br />
    return iterator->m_Valid ? SUCCESS : FAILURE;<br />
}<br />
</code><br />
zzz</p>
<p><code><br />
void RSEnumIt_current_data(zend_object_iterator *iter, zval ***data TSRMLS_DC)<br />
{<br />
    RSEnumIt *iterator = static_cast<RSEnumIt *>(iter);<br />
    precondition( (iterator->GetState() == RSEnumItValid) || (iterator->GetState() == RSEnumItCurrentSet));</p>
<p>    if (!iterator->m_Current)<br />
    {<br />
	// We create m_Current only on need<br />
	if (iterator->m_Valid)<br />
	{<br />
	    MAKE_STD_ZVAL(iterator->m_Current);<br />
	    RSMakeObjectGeneric( iterator->m_Current, iterator->m_LastFetch, iterator->m_Class );<br />
	    // This would be for an iterator returning strings<br />
	    // ZVAL_STRING(iterator->m_Current, "test", 1);<br />
	}<br />
	else<br />
	{<br />
	    // this is a macro, braces around are needed !<br />
	    ALLOC_INIT_ZVAL(iterator->m_Current);<br />
	}<br />
    }<br />
    *data = &#038;iterator->m_Current;<br />
    postcondition( (iterator->GetState() == RSEnumItCurrentSet));<br />
}<br />
</code><br />
aaa<br />
<code><br />
int RSEnumIt_current_key(zend_object_iterator *iter, char **str_key, uint *str_key_len, ulong *int_key TSRMLS_DC)<br />
{<br />
    RSEnumIt *iterator = static_cast<RSEnumIt *>(iter);<br />
    precondition( (iterator->GetState() == RSEnumItValid) || (iterator->GetState() == RSEnumItCurrentSet));</p>
<p>    *int_key = iterator->m_Index;<br />
    postcondition( (iterator->GetState() == RSEnumItValid) || (iterator->GetState() == RSEnumItCurrentSet));<br />
    return HASH_KEY_IS_LONG;<br />
}<br />
</code><br />
aaa</p>
<p><code><br />
void RSEnumIt_move_forward(zend_object_iterator *iter TSRMLS_DC)<br />
{<br />
    RSEnumIt_invalidate_current(iter TSRMLS_CC);<br />
    RSEnumIt *iterator = static_cast<RSEnumIt *>(iter);<br />
    precondition( (iterator->GetState() == RSEnumItBeforeFirst) || (iterator->GetState() == RSEnumItValid) || (iterator->GetState() == RSEnumItCurrentSet));</p>
<p>    ULONG _count = 1;<br />
    if (iterator->m_Object->Next(1,&#038;iterator->m_LastFetch,&#038;_count) == S_OK)<br />
	iterator->m_Valid = true;<br />
    else<br />
	iterator->m_Valid = false;</p>
<p>    // we increase Index is all cases, means this is also now the index that current would have if valid<br />
    iterator->m_Index++;<br />
    precondition( (iterator->GetState() == RSEnumItValid) || (iterator->GetState() == RSEnumItAfterEnd));<br />
}<br />
</code><br />
aaa</p>
<p><code><br />
void RSEnumIt_rewind(zend_object_iterator *iter TSRMLS_DC)<br />
{<br />
    RSEnumIt *iterator = static_cast<RSEnumIt *>(iter);<br />
    postcondition( true);<br />
#ifdef _DEBUG<br />
    iterator->m_JustCreated = false;<br />
#endif<br />
    iterator->m_Index = 0;<br />
    RSCheck( iterator->m_Object->Reset());<br />
    RSEnumIt_move_forward( iter TSRMLS_CC);<br />
    postcondition( (iterator->GetState() == RSEnumItValid) || (iterator->GetState() == RSEnumItAfterEnd));<br />
}<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.kneaver.com/blog/2012/04/php-iterators-in-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP extensions</title>
		<link>http://www.kneaver.com/blog/2011/10/php-extensions/</link>
		<comments>http://www.kneaver.com/blog/2011/10/php-extensions/#comments</comments>
		<pubDate>Thu, 27 Oct 2011 17:07:56 +0000</pubDate>
		<dc:creator>Bruno Winck</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.kneaver.com/?p=229</guid>
		<description><![CDATA[Several Kneaver software products are now available via RSPHP our generic PHP extension. All API are object oriented. Among the differences between c++ and php the order of destructors. Say you have     $DB = new RSDBConnection;     $DB-&#62;Open( $DSNName); &#8230; <a href="http://www.kneaver.com/blog/2011/10/php-extensions/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.kneaver.com%2Fblog%2F2011%2F10%2Fphp-extensions%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.kneaver.com%2Fblog%2F2011%2F10%2Fphp-extensions%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Several Kneaver software products are now available via RSPHP our generic PHP extension. All API are object oriented.</p>
<p>Among the differences between c++ and php the order of destructors. Say you have</p>
<p>    $DB = new RSDBConnection;<br />
    $DB-&gt;Open( $DSNName);<br />
    $Cmd = $DB-&gt;MakeCmd( $SQLRequest);<br />
    $Rec = $DB-&gt;Query( $Cmd);</p>
<p>$DB will be destroyed first, $Cmd after and then $Rec</p>
<p>while in c++ it would be just the opposite. So you have to make sure there are not issues hidden behind dismounting stuff in the wrong order.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kneaver.com/blog/2011/10/php-extensions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Binary XML and cache</title>
		<link>http://www.kneaver.com/blog/2011/10/binary-xml-and-cache/</link>
		<comments>http://www.kneaver.com/blog/2011/10/binary-xml-and-cache/#comments</comments>
		<pubDate>Wed, 26 Oct 2011 21:08:29 +0000</pubDate>
		<dc:creator>Bruno Winck</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.kneaver.com/?p=232</guid>
		<description><![CDATA[Since KNVHTML can now be used directly from a php script comes the problem of performance. Instead of having an object allocated once for all in a session it is created on every page. It took 1 sec before. That &#8230; <a href="http://www.kneaver.com/blog/2011/10/binary-xml-and-cache/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.kneaver.com%2Fblog%2F2011%2F10%2Fbinary-xml-and-cache%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.kneaver.com%2Fblog%2F2011%2F10%2Fbinary-xml-and-cache%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Since KNVHTML can now be used directly from a php script comes the problem of performance. Instead of having an object allocated once for all in a session it is created on every page. It took 1 sec before. That was too long.</p>
<p>I reviewed some discussions about optimizing wordpress before: <a href="http://www.arnebrachhold.de/2007/02/16/four-plus-one-ways-to-speed-up-the-performance-of-wordpress-with-caching/">http://www.arnebrachhold.de/2007/02/16/four-plus-one-ways-to-speed-up-the-performance-of-wordpress-with-caching/</a>, and here <a href="http://www.prelovac.com/vladimir/optimize-wordpress-page-loading-time-with-php-speedy-and-wp-super-cache">http://www.prelovac.com/vladimir/optimize-wordpress-page-loading-time-with-php-speedy-and-wp-super-cache</a>.</p>
<ul>
<li>A few template compilation are now done on demand. This saved 20% of time.</li>
<li>Instead of scanning and loading templates from html text files scattered in directories we build a cache file. It is fully transparent, the cache is rebuild automatically whenever a template is changed.</li>
<li>The cache will save XML data as binary. Saving as binary saves a lot of text processing. So this of a new feature of RSXML and our Btrees: binary save. A side benefit. It will also be used in RPC marshalling between clients and KNVSrv servers adding also performance there.</li>
</ul>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kneaver.com/blog/2011/10/binary-xml-and-cache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Desktop</title>
		<link>http://www.kneaver.com/blog/2011/10/google-desktop/</link>
		<comments>http://www.kneaver.com/blog/2011/10/google-desktop/#comments</comments>
		<pubDate>Wed, 26 Oct 2011 14:11:42 +0000</pubDate>
		<dc:creator>Bruno Winck</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.kneaver.com/?p=173</guid>
		<description><![CDATA[Google will stop updating Google Desktop. See http://googledesktop.blogspot.com/ . I will miss it because I could see several advantage to this solution. It could index many types of files, it was possible to do a search on both Internet and &#8230; <a href="http://www.kneaver.com/blog/2011/10/google-desktop/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.kneaver.com%2Fblog%2F2011%2F10%2Fgoogle-desktop%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.kneaver.com%2Fblog%2F2011%2F10%2Fgoogle-desktop%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Google will stop updating Google Desktop. See http://googledesktop.blogspot.com/ . I will miss it because I could see several advantage to this solution. It could index many types of files, it was possible to do a search on both Internet and you disk. Like this in one blink it is possible to see if anything new on the Interne could be more helpful than a past information, or the opposite avoid to search again something that was already validated.<br />
Now replacement for Google Desktop. Not much I am not willing to use Microsoft Search. It is slow, returns bulk of data, it will not search many file types.<br />
So use Kneaver ? Well Kneaver as a search engine itself and the aggregator offers interesting capabilities. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.kneaver.com/blog/2011/10/google-desktop/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DIKW, KM and Frank Zappa</title>
		<link>http://www.kneaver.com/blog/2011/10/dikw-km-and-frank-zappa/</link>
		<comments>http://www.kneaver.com/blog/2011/10/dikw-km-and-frank-zappa/#comments</comments>
		<pubDate>Fri, 14 Oct 2011 09:08:51 +0000</pubDate>
		<dc:creator>Bruno Winck</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.kneaver.com/?p=176</guid>
		<description><![CDATA[Listening to Frank Zappa, Joe&#8217;s Garage. Suddenly the succession of terms Knowledge, Information, Wisdom catch my attention. I was concentrating on debugging so I though it was an illusion. No it&#8217;s correct. Very early mention of DIKW in About DIKW &#8230; <a href="http://www.kneaver.com/blog/2011/10/dikw-km-and-frank-zappa/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.kneaver.com%2Fblog%2F2011%2F10%2Fdikw-km-and-frank-zappa%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.kneaver.com%2Fblog%2F2011%2F10%2Fdikw-km-and-frank-zappa%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Listening to Frank Zappa, Joe&#8217;s Garage. Suddenly the succession of terms Knowledge, Information, Wisdom catch my attention. I was concentrating on debugging so I though it was an illusion. No it&#8217;s correct. Very early mention of DIKW in About DIKW (http://en.wikipedia.org/wiki/DIKW) in Franck Zappa</p>
<p>Packard Goose, Joe&#8217;s Garage Acts 1-3</p>
<p>Listen to Mary&#8217;s (Girl in the bus) vision at 2.56 or read at http://frankzappa.lyrics.info/packardgoose.html</p>
<p>Now I know why this was so familar to me. I surely heard it many times, years before starting Kneaver.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kneaver.com/blog/2011/10/dikw-km-and-frank-zappa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using php and MySQL with Kneaver</title>
		<link>http://www.kneaver.com/blog/2011/10/using-php-and-mysql-with-kneaver/</link>
		<comments>http://www.kneaver.com/blog/2011/10/using-php-and-mysql-with-kneaver/#comments</comments>
		<pubDate>Thu, 13 Oct 2011 21:53:08 +0000</pubDate>
		<dc:creator>Bruno Winck</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.kneaver.com/?p=174</guid>
		<description><![CDATA[Tonight is my first tentative to run Kneaver directly with MySQL as database engine, and PHP as the script front end. This is the first step before being able to use Kneaver directly, inproc from WordPress. What started as an &#8230; <a href="http://www.kneaver.com/blog/2011/10/using-php-and-mysql-with-kneaver/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.kneaver.com%2Fblog%2F2011%2F10%2Fusing-php-and-mysql-with-kneaver%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.kneaver.com%2Fblog%2F2011%2F10%2Fusing-php-and-mysql-with-kneaver%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Tonight is my first tentative to run Kneaver directly with MySQL as database engine, and PHP as the script front end. This is the first step before being able to use Kneaver directly, inproc from WordPress.<br />
What started as an idea late this afternoon is not taking shape. Just switching from a very simple VBScript file to it&#8217;s equivalent in PHP 5, changing the connection string. This took 10 minutes and already here it goes: It Works !</p>
<p>This is really a benefit of having a long experience in porting software and making it modular from start. It works in 10 minutes just by a few lines added, a recompilation of one or two dlls and we have native integration to MySQL and PHP. No ODBC, COM involved. I try to compile it and run it on Linux tomorrow first thing.</p>
<p>This will not be the final setup because running Kneaver inproc is not going to be very efficient. Just after the next step is to use the object broker and run it as a service like a database. Connections will be persistent and the cache mechanisme build into it will make it very efficient to use it as a WordPress Addin.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kneaver.com/blog/2011/10/using-php-and-mysql-with-kneaver/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Time control software</title>
		<link>http://www.kneaver.com/blog/2010/12/time-control-software/</link>
		<comments>http://www.kneaver.com/blog/2010/12/time-control-software/#comments</comments>
		<pubDate>Tue, 14 Dec 2010 16:56:49 +0000</pubDate>
		<dc:creator>Bruno Winck</dc:creator>
				<category><![CDATA[Methodology]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.kneaver.com/blog/?p=56</guid>
		<description><![CDATA[In my search of productivity I am looking for solutions to help me stayed focused and keep track of how much time is dedicated to most important objectives. I describe here my requirements and me experiences. <a href="http://www.kneaver.com/blog/2010/12/time-control-software/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.kneaver.com%2Fblog%2F2010%2F12%2Ftime-control-software%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.kneaver.com%2Fblog%2F2010%2F12%2Ftime-control-software%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>In my search of productivity I am looking for solutions to help me stayed focused and keep track of how much time is dedicated to most important objectives. I describe here my requirements and me experiences.</p>
<p>It is a recurring question and I learned that there are no perfect solutions. Being my own boss and with so many aspects I can&#8217;t do just with timing my time at work or consider time spent on tiwtter as a pure loss. Even while walking in the countryside my mind keep working on issues and it is very common that ideas pop out my mind on the return faster than it would have staying in front my computer trying to evade the tentation to check news. What is the most productive time ?</p>
<p>For example I regularly remove from my desk applications like rss reader ( I use sharpreader), tweetdeck or even MS Outlook. So today I started Tweetdeck again and lurked to what other says.  Suddently i am attracted by a tweet from <a href="http://twitter.com/crid">@crid</a> :</p>
<blockquote><p>Instant Boss. Ce petit soft gratuit qui ne ressemble à rien est encore en train de sauver ma journée de travail <img src='http://www.kneaver.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  <a href="http://appsapps.info/instantboss.php">http://appsapps.info/instantboss.php</a></p></blockquote>
<blockquote><p>My translation: Little software not great looking is saving my day.</p></blockquote>
<p>Good I like this, let&#8217;s try. So I went, I tried, I write.</p>
<p>The really good thing is that it&#8217;s not taking space or too much attention. Small footprints. It starts from a postulate that you split your day in regular period of attention and distraction. Fair enough but nothing so regular. I tried for a few hours and realized it would be complex to tune it really to my rythm.</p>
<p>Distraction is part of human nature and I explained before it may end up in saving time. What is important is to keep it under some limits. See <a href="http://bassistance.de/2010/11/29/the-attention-span-myth">The Attention Span Myth</a>.  </p>
<p>That reminds me of a very simple tool I used for years and trained several people to use including my kids. Le minuteur (The timer) : this one is my favorite. I even bought a couple of them to bring them with me to our South India subsidiary. <a href="http://www.tati.fr/">http://www.tati.fr/cuisine-ustensiles/la-preparation/balance-minuteur-doseur/minuteur-de-cuisine/35273.html</a> . Costs 3 € = USD 4.</p>
<p>When planning tasks and specially at the level of a day it is important to have an objective idea of real time span for them. So using a timer next to you whatever you are doing (and this is a big benefit on software) you can estimate and measure. Say how long it takes to read the subject of your essay for an exam : 5 minutes, or 15 ? Wind up completely the timer and start. When you are finished see how long it takes.</p>
<p>Now that we gathered a typical duration for a set of tasks our estimation is really better. Instead of packing the day and being deceived by how little we can do we are more realistic.</p>
<p>So my typical time control software should have a learning mode based on a set of 100 typical tasks I do. One of them would &#8220;write a blog entry&#8221;, takes 2 hours. When I start the software i wish to say what I want to do today and it fetches automatically time estimates. It will then may be tell me if I am distracting or forgot to tell when i am done. Since there is a learning stage I could also tell which tools I will typically use and may be automatically hide those distracting me.</p>
<p>Las time I used a time control solution it was <a href="http://www.rescuetime.com/">TimeRescue</a>. This is a much more ambitious thing. I used it as an experiment after another blogger wrote about it. May be here <a href="http://blog.ernestsemerda.com/2010/04/03/3-great-tools-fine-tune-productivity/">http://blog.ernestsemerda.com/2010/04/03/3-great-tools-fine-tune-productivity/</a> . With Kneaver I am really interested in all experiments about using computers to achieve our goals. Still I am not for Total Recall type of things. See here <a href="http://guido.appenzeller.net/wordpress/">http://guido.appenzeller.net/wordpress/</a> . So RescueTime was ending up considering that using Internet Explorer while debugging code was a distraction. You have to tune it but here you get into the issue when you have different type of activities. You would need to have a profile for each and what about multitasking. Very often we will have a window on a long job and another to check our mail. Too automated, to systematic, not enough understanding of my goals, my purpose. </p>
<p>I had the same problem with Xobni for example. Not being able to make a difference with private sphere and professionnal is leading to absurdities. When I click on a mail sent by me I would expect the recipient to be displayed, not me. Again the issue is that all these software don&#8217;t know me, they have no background and are just piece of code leveraging a single idea. hence the need to have somewhere a set of informations on our basic commitments, our interests.</p>
<p>Before writing this I checked what other tools are on the market. I found <a href="http://blog.timedoctor.com/2010/07/25/how-is-time-doctor-different-than-rescue-time">TimeDoctor</a>.</p>
<p>It strickes me that time control and boss/employee relationships are so often concomittent. In the case of TimeDoctor it is definitely engaged in this niche fine but Instant Boss is for a single user. So at some stage I need to behave as if I was my own boss delegating to my computer the role of controlling me.</p>
<p>I didn&#8217;t try TimeDoctor but by reading the web site I felt it was not made for my case. TimeDoctor is more to monitor employees work and keep track of how much time is spent on target or not. I like the idea of definition targets first and not preventing distractions.</p>
<p>If you got his way be careful that in some countries legislation may prevent you to spy your employees. Say if the screen shot shows private data you violated their privacy and this is even more risky. I think this idea is leading to microcontrol and ending to loose more time reviewing how the others spend their time then what working in a team is really about : delegating and allowing you to do your own job. Controlling others time is really leading us 100 years back to <a href="http://en.wikipedia.org/wiki/Theory_X_and_theory_Y">Theory X</a> style of management.</p>
<p>If you are interested in time management and can read french I recommend <a href="http://time-coach.fr/">[Time Coach]</a>. It&#8217;s a combined mail based learning program with personalized interaction followed by a newsletter. And it&#8217;s free. I wishes a time management control starts with some of the ideas found here.</p>
<p>So end of the day ? I couldn&#8217;t find the perfect solution. I wish I can find something that assist me in some occasions, helps me keep track of some activities as discreetly as possible, linked to my tasks management and daily planning. Ability to relate tasks to objectives and goals, ability to label them as important and urgent, repeating. It will preferably use Kneaver API to gain knowledge of what I do and what it is related to. I am afraid I got one more item on my todo list.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kneaver.com/blog/2010/12/time-control-software/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New scheduling system for routine tasks</title>
		<link>http://www.kneaver.com/blog/2010/08/new-scheduling-system-for-routine-tasks/</link>
		<comments>http://www.kneaver.com/blog/2010/08/new-scheduling-system-for-routine-tasks/#comments</comments>
		<pubDate>Sun, 29 Aug 2010 08:35:15 +0000</pubDate>
		<dc:creator>Bruno Winck</dc:creator>
				<category><![CDATA[Business Strategy]]></category>
		<category><![CDATA[Kneaver]]></category>
		<category><![CDATA[Methodology]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.kneaver.com/blog/?p=51</guid>
		<description><![CDATA[I was so unhappy with outlook management of recurrent tasks I wrote a new scheduler I called KNVPlanner.  Several routines must be restarted every now and then. The more you become precise and add tasks, the more specific you become, &#8230; <a href="http://www.kneaver.com/blog/2010/08/new-scheduling-system-for-routine-tasks/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.kneaver.com%2Fblog%2F2010%2F08%2Fnew-scheduling-system-for-routine-tasks%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.kneaver.com%2Fblog%2F2010%2F08%2Fnew-scheduling-system-for-routine-tasks%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>I was so unhappy with outlook management of recurrent tasks I wrote a new scheduler I called KNVPlanner. </p>
<p>Several routines must be restarted every now and then. The more you become precise and add tasks, the more specific you become, the most impossible it is to deal with them all. Let say that if at any time you reached some balance between busy and free time as soon as you add one more you are done. The only solution is to re-plan completely by allowing relaxing some routines. Also if we miss too often a schedule and don’t measure any possible impact it means as well that the task can be rescheduled with no arm. My ultime goal was to make sure that routines are done while keeping as much as possible free time and flexibility. So what I needed really was a de-scheduler.</p>
<p>Due to limited time I didn’t reuse outlook tasks records. I could have Kneaver toolbox has all capability to do it. I just started a plain new database and a little coding for a planner object and a web page to display the list of tasks and mark them as completed.</p>
<p>Outside from periodicity adjustments I added extra features like :</p>
<ul>
<li>Collecting actual frequencies and durations and suggesting reasonable schedule based on measures.</li>
<li>Ordering tasks by duration on a given period. Very often we look for a small task to fit in a time hole. Waiting for a phone call in 10 minutes what can I do in 5 minutes.</li>
<li>I distinguish tasks totally manual requiring focused attention for the duration (like wiring a blog post) from tasks that will require waiting periods (like a backup for example).</li>
<li>Tasks are chunked as much as possible so that they can be placed in small slots and imply no waiting periods.</li>
<li>Some tasks are a really long task made piece by piece like reviewing a customer database. This means you must have a an extra information to track what is already done. Other tasks implies a counter (send 3 proposal per week) so it is not only period but also a count of action you want to measure over time.</li>
<li>Benefit of using a web based component is that it will naturally live accros multiple device and OS.</li>
</ul>
<p>I am finished with this small program and will try it for a while. I am very interested to see the impact of being able to deconstruct a plan. I have been hesitating to do this program a long time because I thought that personnal planing was too off track from PKM. Maybe I was wrong.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kneaver.com/blog/2010/08/new-scheduling-system-for-routine-tasks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My Cat, Spam, Guy Kawasaki and Chris Ware</title>
		<link>http://www.kneaver.com/blog/2009/08/my-cat-spam-guy-kawasaki-and-chris-ware/</link>
		<comments>http://www.kneaver.com/blog/2009/08/my-cat-spam-guy-kawasaki-and-chris-ware/#comments</comments>
		<pubDate>Thu, 06 Aug 2009 16:44:55 +0000</pubDate>
		<dc:creator>Bruno Winck</dc:creator>
				<category><![CDATA[Kneaver]]></category>
		<category><![CDATA[Knowledge Management]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[Valuating Text]]></category>

		<guid isPermaLink="false">http://kneaver.wordpress.com/?p=44</guid>
		<description><![CDATA[The title looks like a potpourri. It&#8217;s normal. When my cat is allowed to go out in the morning, the first thing it does is to scan the neighbourhoods from the terrace. It stands on a small pillar and turns its head, &#8230; <a href="http://www.kneaver.com/blog/2009/08/my-cat-spam-guy-kawasaki-and-chris-ware/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.kneaver.com%2Fblog%2F2009%2F08%2Fmy-cat-spam-guy-kawasaki-and-chris-ware%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.kneaver.com%2Fblog%2F2009%2F08%2Fmy-cat-spam-guy-kawasaki-and-chris-ware%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<div id="attachment_47" class="wp-caption alignright" style="width: 210px"><img class="size-full wp-image-47" title="Scanning_Cat" src="http://www.kneaver.com/wp-content/uploads/2009/08/scanning_cat.jpg" alt="My Cat Scanning the View" width="200" height="312" /><p class="wp-caption-text">My Cat Scanning the View</p></div>
<p><em>The title looks like a potpourri. It&#8217;s normal.</em></p>
<p>When my cat is allowed to go out in the morning, the first thing it does is to scan the neighbourhoods from the terrace. It stands on a small pillar and turns its head, slowly and zooms on the propitious spots. Mouse, lizards, cats are on the radar. Trees and high grass are hiding them. It takes 30 seconds and here it goes. It jumps into the garden to get a close eye on something.</p>
<p>I have about the same attitude when I check my mail or the RSS aggregator in the morning, a mug of coffee in my hand, looking to cat on the terrace.</p>
<p>The first thing that pops to my eyes and tries to capture my attention is spam. Obviously those behind this plague know that orders, banks, credit cards are high on our agenda. For this reason scanning the Inbox is usually very deceptive and useless. So the very first task is to run the spam filter(s). What the spam filter does (after obvious steps) is to take a suspicious look into the contents, scanning for outrageous hints. Any deceiving term would flag it as spam. Scarcity of terms in our field of business and abundance of engaging term (free, money) are impacting as well. The point is that scanning to remove spam is similar but different in the fact that we look for exaggerated proliferation or out of subject terms instead of informative messages.</p>
<p>It becomes more and more the same with RSS. RSS are not cluttered by spam but with 3 million and counting bloggers it is over abundant. Twitter started a new era and we get now from our friendfeed a continuous flow of messages about all and everything. I was not going to spend time looking for a pearl in this sea.</p>
<p>We have a nice tool in Kneaver which takes a text and evaluates it against our personal knowledge. Basically a natural language parser will take it, identify terms available in the corpus, compute their frequency. Up to here pretty common. Now what is less common is that we compute some sort of distance between the terms in the text but also in the corpus. For this we use graph distances and semantic vectors. What we are really looking at are texts mostly residing in our Knowledge Frontier. They are the most likely to bring us something new but still in the focus. This is really similar to the cat approach. Is this grey color likely to be a cat, if yes I should see another hint nearby: something moving or another grey patch.</p>
<p>Now we are testing an RSS valuator filter base on this feature. What you get is exactly the original feed but some styles are added so that your RSS newsreader will display it in colors depending on the foreseen interest. It is now easy for the relax reader to spot the most interesting news. Nice feature and very personal.</p>
<p>However what you will not get are the hidden pearls. The interesting piece of news, totally out of context, lost in the stream of professionally oriented streams. To illustrate this when I reviewed my daily delivery of news from Guy Kawasaki (I follow him for informations and hints in the perspective of his books) , filtered by Kneaaver, I could see, lost like a bottle in ocean, a piece about Chris Ware. I like his work and so do my son but this piece was completely outside of my job interest. Kneaver couldn&#8217;t catch it, I could. We, human, remain better than software. We can adapt at once any procedure and incorporate extraneous exceptions on the fly. Yes but without Kneaver raising the visibility of interesting pieces, I wouldn&#8217;t have the spare time to look for an out of band piece.</p>
<p>Wow! the cat was stung by a wasp while I was writing. She&#8217;s young and need also to enhance her scanning procedure.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kneaver.com/blog/2009/08/my-cat-spam-guy-kawasaki-and-chris-ware/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Blog a Day: Eric Blue</title>
		<link>http://www.kneaver.com/blog/2009/07/a-blog-a-day-eric-blue/</link>
		<comments>http://www.kneaver.com/blog/2009/07/a-blog-a-day-eric-blue/#comments</comments>
		<pubDate>Sun, 12 Jul 2009 09:44:10 +0000</pubDate>
		<dc:creator>Bruno Winck</dc:creator>
				<category><![CDATA[A Blog a Day]]></category>
		<category><![CDATA[Kneaver]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Memex]]></category>
		<category><![CDATA[Mindmap]]></category>

		<guid isPermaLink="false">http://kneaver.wordpress.com/?p=40</guid>
		<description><![CDATA[Location: http://eric-blue.com/ I came across this blog while looking for combined use of Wiki and MindMaps. Kneaver combines naturally both as being alternative displays of the same body of Knowledge. Presentations is yet another. Back to Eric Blue. Eric had &#8230; <a href="http://www.kneaver.com/blog/2009/07/a-blog-a-day-eric-blue/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.kneaver.com%2Fblog%2F2009%2F07%2Fa-blog-a-day-eric-blue%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.kneaver.com%2Fblog%2F2009%2F07%2Fa-blog-a-day-eric-blue%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Location: <a href="http://eric-blue.com/">http://eric-blue.com/</a></p>
<p>I came across this blog while looking for combined use of Wiki and MindMaps. Kneaver combines naturally both as being alternative displays of the same body of Knowledge. Presentations is yet another.</p>
<p>Back to Eric Blue. Eric had a post about visual Wiki. This is the link: <a href="http://eric-blue.com/2009/05/12/the-visual-wiki-a-new-metaphor-for-knowledge-access-and-management/">http://eric-blue.com/2009/05/12/the-visual-wiki-a-new-metaphor-for-knowledge-access-and-management/</a>. It was conference from John Hosking  (<a href="http://www.cs.auckland.ac.nz/~john/">http://www.cs.auckland.ac.nz/~john) about</a> Visual Wiki. IMO the video is a not very conclusive. May be the most interesting is the mention of thinkbase (see it directly at <a href="http://thinkbase.cs.auckland.ac.nz/">http://thinkbase.cs.auckland.ac.nz/</a>)</p>
<p>Eric has a goal of building his own Personal Memex from open source components. I fully agree with him on the necessity of graphical capabilities. Alas Kneaver is not open source so I can&#8217;t help otherwise Eric would be able to continue his mindmap directly on Kneaver <img src='http://www.kneaver.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p> Back on the question of open source and how much technology can be projected client side. This is a very complex issue since most path leads to dead ends.</p>
<ul>
<li>Anything based on Flash uses a proprietary software not uniformly supported (iPhone). Howver his mind map is running with Flash and freemind browser and it works.</li>
<li>Anything on java is likely to causes issues as well. Either browser not running java or performance. Thinkbase on top of java is hard to start (even with Chrome). We experienced this also in another project. The graphic was neat, interactive and all but most visitors just didn&#8217;t see that an applet was present <img src='http://www.kneaver.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li>HTML5 canevas has also a caveat: Internet Explorer don&#8217;t support it and still it is 70% of the market.</li>
<li>SVG had limited support via a plugins supported by Adobe. Adobe don&#8217;t support it anymore (normal in between they have flash and there are svg viewers based on Flash). </li>
<li>No client technology. Just plain jpeg files.</li>
</ul>
<p>Today we support SVG, jpeg (server side computed, will work everywhere including cell phones) and mm (can be visualized with Freemind viewer). Youcan swicth from one technology to another.</p>
<p>The truth is there are plenty of software for mind mapping (<a href="http://www.mind-mapping.org/full-list.php">http://www.mind-mapping.org/full-list.php) but</a> a lack of standardization. Most of them operates like powerpoint. You work on a single map at a time and end up wondering where is the best place to store your notes. This is one of the barriers we break. Maps are only a view among others of your thoughts.</p>
<p>Now what is the most exiting part of his blog is the Personal Memex. Taking the idea from Vannevar Bush and to start pick and add building blocks as they appear on the market. That&#8217;s very inspirational. <a href="http://eric-blue.com/my-projects/personal-memex/">http://eric-blue.com/my-projects/personal-memex/</a></p>
<p>It&#8217;s like a shopping list, we are waiting to see what the cook prepared with the ingredients.</p>
<ul>
<li>Core &#8211; Mediawiki (Content Management System, Wiki)</li>
<li>Document Management</li>
<li>MindMap</li>
<li>Semantic capability</li>
<li>Search</li>
<li>Bookmark</li>
<li>webpage capture</li>
<li>Timeline browsing, faceted browsing</li>
<li>Multimedia integration</li>
</ul>
<p>You can also see the requirements</p>
<ul>
<li>Capability to act as a “bit-bucket”. That&#8217;s really our KneaverTray and the Kneaver pipeline or Knowledge hose.</li>
<li>Ability to store &#8220;Notes&#8221;. Ok again.</li>
<li>Timeline access. goes back to facet browsing and mental frames.</li>
<li>Navigation beyond traditional hierarchy. for me it is the same as above.</li>
<li>Comprehensive search</li>
<li>Ability to store meta-data. I would add meta-linking.</li>
<li>Ability to import, export and share. I would share as much as possible or import and subscribe to stay current.</li>
<li>Integration with mind maps. I would add Powerpoints, texts, databases.</li>
</ul>
<p>What is missing IMO:</p>
<ul>
<li>Automated discovery system that will connect things together. My input is a text, a mindmap, a document but I want the system to automatically understand where it stands.</li>
<li>Continuation prompts: inductors are a generalization of pending wikilinks. This is a cumulative knowledge database and I want to be able to continue from any pending links, find them and kneave them together.</li>
<li>I need to be able to turn seamlessly some part of existing knowledge into meta data. For a recipe I need the ingredients, the time it takes for preparation and then a body of text or a video. Now go back to every recipe and check this is available.</li>
</ul>
<p>Eric Blue&#8217;s blog is very active. Since 2004 several posts per month. Real good work and plenty of interesting contents. I wish I have the occasion to return to read it often.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kneaver.com/blog/2009/07/a-blog-a-day-eric-blue/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

