<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
<channel>
    <title>Armin's personal Blog - Gobby</title>
    <link>http://arbur.net/serendipity/</link>
    <description>Open source programming</description>
    <dc:language>en</dc:language>
    <generator>Serendipity 1.1.3 - http://www.s9y.org/</generator>
    <pubDate>Thu, 23 Oct 2008 02:36:03 GMT</pubDate>

    <image>
        <url>http://arbur.net/serendipity/templates/default/img/s9y_banner_small.png</url>
        <title>RSS: Armin's personal Blog - Gobby - Open source programming</title>
        <link>http://arbur.net/serendipity/</link>
        <width>100</width>
        <height>21</height>
    </image>

<item>
    <title>Gobby 0.4.90</title>
    <link>http://arbur.net/serendipity/archives/41-Gobby-0.4.90.html</link>
            <category>Gobby</category>
    
    <comments>http://arbur.net/serendipity/archives/41-Gobby-0.4.90.html#comments</comments>
    <wfw:comment>http://arbur.net/serendipity/wfwcomment.php?cid=41</wfw:comment>

    <slash:comments>9</slash:comments>
    <wfw:commentRss>http://arbur.net/serendipity/rss.php?version=2.0&amp;type=comments&amp;cid=41</wfw:commentRss>
    

    <author>nospam@example.com (Armin Burgmeier)</author>
    <content:encoded>
    &lt;a class=&#039;serendipity_image_link&#039; href=&#039;http://arbur.net/serendipity/uploads/gobby/gobby-0.4.90.png&#039;&gt;&lt;!-- s9ymdb:37 --&gt;&lt;img width=&#039;110&#039; height=&#039;64&#039; style=&quot;float: left; border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://arbur.net/serendipity/uploads/gobby/gobby-0.4.90.serendipityThumb.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;

&lt;p&gt;Look at this screenshot of the recently &lt;a href=&quot;http://releases.0x539.de/gobby/&quot;  title=&quot;Gobby releases&quot;&gt;released&lt;/a&gt; Gobby 0.4.90. See that nice yellow arrow in the toolbar? Yes, this means we finally have Undo/Redo support. It was a really good feeling having closed bug &lt;a href=&quot;http://gobby.0x539.de/trac/ticket/39&quot;  title=&quot;Undo/Redo bug in Gobby&#039;s trac&quot;&gt;#39&lt;/a&gt; &lt;img src=&quot;http://arbur.net/serendipity/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Gobby 0.4.90 is the first release in the 0.5 series, and 99% of the code have been rewritten from scratch. It is not yet 0.5.0 since it does not yet contain all the features that previous versions had (for example, it does not yet support self-hosting or password protection). However, removing the integrated chat was a design decision, since there are so many other possibilities for communication, including VoIP. As it supports removing documents, only use it with people you trust enough not to delete all your data.&lt;/p&gt;

&lt;p&gt;Gobby 0.4.90 does no longer use obby or net6 as backend libraries doing the hard work, but &lt;a href=&quot;http://gobby.0x539.de/trac/wiki/Infinote/Libinfinity&quot;  title=&quot;Libinfinity on the Gobby trac&quot;&gt;libinfinity&lt;/a&gt;, implementing the &lt;a href=&quot;http://gobby.0x539.de/trac/wiki/Infinote&quot;  title=&quot;The network protocol behind Gobby&quot;&gt;Infinote&lt;/a&gt; protocol. libinfinity is not yet stable API and ABI wise, and probably will not be for still some time. libinfinity contains a dedicated server, called &lt;a href=&quot;http://gobby.0x539.de/trac/wiki/Infinote/Infinoted&quot;  title=&quot;Description of the infinoted server&quot;&gt;infinoted&lt;/a&gt; that Gobby 0.4.90 can connect to.&lt;/p&gt;

&lt;p&gt;You can safely install the new version since it is parallel-installable to previous Gobby versions. But please consider everything as very experimental. Things may crash or otherwise behave badly. &lt;a href=&quot;http://gobby.0x539.de/trac/newticket&quot;  title=&quot;Page for reporting Gobby bugs&quot;&gt;Report bugs&lt;/a&gt; if they do. We set up a playground server on dalaran.0x539.de if you want to test the new version without having to install server yourself.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Sun, 19 Oct 2008 02:49:00 +0200</pubDate>
    <guid isPermaLink="false">http://arbur.net/serendipity/archives/41-guid.html</guid>
    
</item>
<item>
    <title>g_type_instance_get_private performance costs</title>
    <link>http://arbur.net/serendipity/archives/40-g_type_instance_get_private-performance-costs.html</link>
            <category>Gobby</category>
    
    <comments>http://arbur.net/serendipity/archives/40-g_type_instance_get_private-performance-costs.html#comments</comments>
    <wfw:comment>http://arbur.net/serendipity/wfwcomment.php?cid=40</wfw:comment>

    <slash:comments>2</slash:comments>
    <wfw:commentRss>http://arbur.net/serendipity/rss.php?version=2.0&amp;type=comments&amp;cid=40</wfw:commentRss>
    

    <author>nospam@example.com (Armin Burgmeier)</author>
    <content:encoded>
    &lt;p&gt;I was curious where most time in &lt;a href=&quot;http://gobby.0x539.de/trac/wiki/Infinote/Libinfinity&quot;  title=&quot;Libinfinity page on Gobby&#039;s Wiki&quot;&gt;libinfinity&lt;/a&gt;, &lt;a href=&quot;http://gobby.0x539.de&quot;  title=&quot;Gobby, a collaborative text editor&quot;&gt;Gobby&lt;/a&gt;&#039;s &lt;a href=&quot;http://gobby.0x539.de/trac/wiki/Infinote&quot;  title=&quot;Gobby&#039;s next-generation collaboration protocol&quot;&gt;infinote&lt;/a&gt; implementation, is spent. Not because it was too slow or something, but just because I wanted to know. So I used &lt;a href=&quot;http://valgrind.org/&quot;  title=&quot;Valgrind Debugging tools for Linux&quot;&gt;valgrind&lt;/a&gt;&#039;s &lt;a href=&quot;http://valgrind.org/info/tools.html#callgrind&quot;  title=&quot;A valgrind tool for profiling applications&quot;&gt;callgrind&lt;/a&gt; tool to gain some profile data while running libinfinity&#039;s main test for the concurrncy control algorithm. When I displayed the result in &lt;a href=&quot;http://kcachegrind.sourceforge.net&quot;  title=&quot;KCachegrind on Sourceforge&quot;&gt;kcachegrind&lt;/a&gt; (there is still no GNOME equivalent, no?) everything looked as I would have expected, until I noticed this line:&lt;/p&gt;

&lt;div class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 642px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;!-- s9ymdb:36 --&gt;&lt;img width=&#039;642&#039; height=&#039;168&#039;  src=&quot;http://arbur.net/serendipity/uploads/gobby/infinote_private_cost.png&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This means that 14.5% of the overall program time is spent in &lt;a href=&quot;http://library.gnome.org/devel/gobject/stable/gobject-Type-Information.html#G-TYPE-INSTANCE-GET-PRIVATE:CAPS&quot;  title=&quot;G_TYPE_INSTANCE_GET_PRIVATE in gobject&#039;s API reference&quot;&gt;g_type_instance_get_private&lt;/a&gt;(). This is because libinfinity uses &lt;a href=&quot;http://library.gnome.org/devel/gobject/stable/gobject-Type-Information.html#g-type-class-add-private&quot;  title=&quot;g_type_class_add_private in gobject&#039;s API reference&quot;&gt;g_type_class_add_private&lt;/a&gt; for every class to store its members into, so it is easy to extend functionality later without breaking ABI. However, this also means that for every function that needs to access a member, g_type_instance_get_private() is called. I didn&#039;t expect such a huge impact, though.&lt;/p&gt;

&lt;p&gt;To fix this, I added a simple gpointer to the public instance struct, and let it point to the private field in the instance_init function. So this means one call to g_type_instance_get_private() per instance, instead of roughly one per call to a function operating on an instance of the class in question. After doing this for the five classes suffering most from this, g_type_instance_get_private does no longer show up anywhere near relevant in kcachegrind.&lt;/p&gt;

&lt;p&gt;I&#039;d like it if improving performance was always as easy as this.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Thu, 09 Oct 2008 18:50:00 +0200</pubDate>
    <guid isPermaLink="false">http://arbur.net/serendipity/archives/40-guid.html</guid>
    
</item>
<item>
    <title>Kobby coming along</title>
    <link>http://arbur.net/serendipity/archives/38-Kobby-coming-along.html</link>
            <category>Gobby</category>
    
    <comments>http://arbur.net/serendipity/archives/38-Kobby-coming-along.html#comments</comments>
    <wfw:comment>http://arbur.net/serendipity/wfwcomment.php?cid=38</wfw:comment>

    <slash:comments>2</slash:comments>
    <wfw:commentRss>http://arbur.net/serendipity/rss.php?version=2.0&amp;type=comments&amp;cid=38</wfw:commentRss>
    

    <author>nospam@example.com (Armin Burgmeier)</author>
    <content:encoded>
    &lt;p&gt;&lt;a href=&quot;http://gregarei.com/&quot;  title=&quot;Gregory Haynes Weblog&quot;&gt;Gregory Haynes&lt;/a&gt; is working on Kobby featuring collaborative text editing in your favourite KDE text editor as a GSoC project. He started to &lt;a href=&quot;http://gregarei.com/2008/06/introducing-libinfinitymm/&quot; &gt;wrap&lt;/a&gt; the (still unreleased!) libinfinity (my infinote implementation) API for C++ for this task. I&#039;m really excited to see other collaborative text editors coming up that work together with Gobby, since this is exactly one of the reasons why I took the burden to write the library in GObject-based C.&lt;/p&gt;

&lt;p&gt;Speaking of which; I didn&#039;t blog on it for a long time. We have moved to &lt;a href=&quot;http://git.0x539.de/&quot;  title=&quot;The 0x539 git repositories&quot;&gt;git&lt;/a&gt; in the meantime. I&#039;m currently working on porting &lt;a href=&quot;git://git.0x539.de/git/gobby.git&quot;  title=&quot;The Gobby git repository&quot;&gt;Gobby&lt;/a&gt; to use &lt;a href=&quot;git://git.0x539.de/git/infinote.git&quot;  title=&quot;The infinote git repository&quot;&gt;libinfinity&lt;/a&gt; instead of obby, heading towards a first usable release, so that the hard work pays off. There are still some things in libinfinity that need to be fixed (performance issues, a few known bugs and way more testing) which are probably easier to fix when a usable Gobby version using it exists. I hope to have these done in a few months, though the most difficult part is always to get the little details right, which is probably why I&#039;m not good at meeting (self-set) deadlines.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Tue, 17 Jun 2008 22:28:00 +0200</pubDate>
    <guid isPermaLink="false">http://arbur.net/serendipity/archives/38-guid.html</guid>
    
</item>
<item>
    <title>Collaborative Undo done right</title>
    <link>http://arbur.net/serendipity/archives/30-Collaborative-Undo-done-right.html</link>
            <category>Gobby</category>
    
    <comments>http://arbur.net/serendipity/archives/30-Collaborative-Undo-done-right.html#comments</comments>
    <wfw:comment>http://arbur.net/serendipity/wfwcomment.php?cid=30</wfw:comment>

    <slash:comments>2</slash:comments>
    <wfw:commentRss>http://arbur.net/serendipity/rss.php?version=2.0&amp;type=comments&amp;cid=30</wfw:commentRss>
    

    <author>nospam@example.com (Armin Burgmeier)</author>
    <content:encoded>
    &lt;p&gt;Many people using gobby complain that it does not support Undo, and some do not even use it therefore. Of course, they are right. It is not only convenient but may also save you lots of data in case you accidentally delete it. However, it is not easy to implement it in a collaborative editor because between your own do and undo operation pairs others might have altered the document. It is thus not reverted to a previous state as with a single user editor. We got suggestions to add some sort of &quot;primitive&quot; Undo like just undoing the last operation, no matter from whom it was. I didn&#039;t like that, though, because I prefer to either do things correctly or not at all.&lt;/p&gt;

&lt;p&gt;Fortunately, other people also thought about how to achieve collaborative Undo. I read some papers &lt;a href=&quot;#collundo_papers&quot;&gt;[1]&lt;/a&gt; describing an algorithm (adOPTed) that not only achieves convergence, meaning that two users don&#039;t end up with a different document after having applied some operations concurrently (which the obby algorithm (called Jupiter) obviously also achieves), but also allows Undo/Redo (which Jupiter does not when more than two users are involved). This is however not the one-and-only solution. There are other approaches to collaborative Undo (or resolving collisions in general), like the &lt;a href=&quot;http://uwog.net/news/?p=85&quot;  title=&quot;Marc Maurer&#039;s blog entry about AbiCollab collision handling&quot;&gt;AbiCollab&lt;/a&gt; one. adOPTed has some nice properties though:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;It has enough information to not only undo your own but also any other&#039;s operation. Actually, when a user wants to Undo something, it just says &quot;I am doing an Undo now&quot; and the others calculate the required operation. This especially allows to easily restore user colors when a deletion is being undone (without allowing arbitrary insertion of text colored with another user&#039;s color). It could also be used to undo vandalism issued by another user.&lt;/li&gt;
 &lt;li&gt;You can always undo and redo your operations, independent of what others have done in between. However, it might happen that an undo has no effect (for example, if you type something, another one deletes it and you press undo then). I wonder by the way what a user expects in that case: Imagine you are typing two letters, and another user deletes the second one. When you press Undo now, would you expect nothing to happen (because another one already &quot;manually&quot; undid your latest operation) or would you expect that the first letter also disappears (because of exactly the same reason)?&lt;/li&gt;
 &lt;li&gt;It doesn&#039;t need a server to make some final decisions or to keep things in order. You just have to make the other participants receive your requests somehow. Also, there are no conflict situations or something requiring additional round-trips.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, as always, everything has its price:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;My implementation requires already a lot of CPU power in my simple test cases to calculate the required transformations, especially when there are lots of operations between a do/undo pair.&lt;/li&gt;
 &lt;li&gt;As every user calculates the undo operation by itself, every user needs to keep track of every request made by any user. This also requires to send the whole request log to a joining user. Of course, this can be limited to the latest N operations, but it is still a considerable amount of data (especially when many users are working together) and restricts the number of operations people can undo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My proof of concept featuring Undo and Redo is &lt;a href=&quot;http://arbur.net/code/adopted.cpp&quot;  title=&quot;Adopted implementation&quot;&gt;here&lt;/a&gt;. However, you probably won&#039;t understand the interesting part of that code without having read the papers referenced above (which you should do as well if you are interested in more details, by the way). There a still a couple of issues before that can be used in a real-world environment, though. I think the performance problems mentioned above can be fixed by caching transformed requests, so that it does not have to compute the same requests all over again. Another problem that needs to be solved is a dynamic amount of users. My test code only works for a fixed number of users. The difficulty is to find out when it is safe to forget about operations from a user that has left the editing session, to save memory and bandwidth.&lt;/p&gt;

&lt;p&gt;I hope to get that done really soon now so that it can be used in Infinote and perhaps even Gobby (I have not yet decided whether I want to implement that in Gobby because it is still a considerable amount of work).&lt;/p&gt;

&lt;p&gt;I am off to Ireland at the 23th of July and am visiting some friends near &lt;a href=&quot;http://en.wikipedia.org/wiki/Osnabr%C3%BCck&quot;  title=&quot;Wikipedia article on Osnabr&amp;uuml;ck&quot;&gt;Osnabr&amp;uuml;ck&lt;/a&gt; right after that, but when I am back home (presumably at 12th of August) I really hope to get something usable (read: a gedit plugin) before my third semester at university begins in October. Unfortunately, I cannot make it to GUADEC this year because I have to be at university that week, but I really look forward to finally get there next year.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;
 &lt;a id=&quot;collundo_papers&quot;&gt;&lt;/a&gt;[1] &lt;a href=&quot;http://hal.inria.fr/action/open_file.php?url=http://hal.inria.fr/docs/00/07/13/98/PDF/RR-5188.pdf&amp;amp;docid=71398&quot;&gt;Achieving Convergence with Operational Transformation in Distributed Groupware Systems&lt;/a&gt; (by Abdessamad Imine et al.)&lt;br /&gt;
 &lt;a href=&quot;http://citeseer.ist.psu.edu/rd/10822314%2C428837%2C1%2C0.25%2CDownload/http://coblitz.codeen.org:3125/citeseer.ist.psu.edu/cache/papers/cs/20920/http:zSzzSzwww.cit.gu.edu.auzSz%7EsczzSzsigcezSzpaperszSzcscw96.pdf/ressel96integrating.pdf&quot;&gt;An Integrating, Transformation-Oriented Approach to Concurrency Control and Undo in Group Editors&lt;/a&gt; (by Matthias Ressel, Rul Gunzenh&amp;auml;user and Doris Nitsche-Ruhland)&lt;br /&gt;
 &lt;a href=&quot;http://www.welie.com/eelke/literature/p131-ressel.pdf&quot;&gt;Reducing the problems of group undo&lt;/a&gt; (by Matthias Ressel and Rul Gunzenh&amp;auml;user)
&lt;/small&gt;&lt;/p&gt; 
    </content:encoded>

    <pubDate>Mon, 16 Jul 2007 13:27:00 +0200</pubDate>
    <guid isPermaLink="false">http://arbur.net/serendipity/archives/30-guid.html</guid>
    
</item>
<item>
    <title>GtkSourceView2 in Gobby</title>
    <link>http://arbur.net/serendipity/archives/29-GtkSourceView2-in-Gobby.html</link>
            <category>Gobby</category>
    
    <comments>http://arbur.net/serendipity/archives/29-GtkSourceView2-in-Gobby.html#comments</comments>
    <wfw:comment>http://arbur.net/serendipity/wfwcomment.php?cid=29</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://arbur.net/serendipity/rss.php?version=2.0&amp;type=comments&amp;cid=29</wfw:commentRss>
    

    <author>nospam@example.com (Armin Burgmeier)</author>
    <content:encoded>
    &lt;p&gt;Today, I read the &lt;a href=&quot;http://mail.gnome.org/archives/gedit-list/2007-May/msg00028.html&quot;  title=&quot;GtkSourceView 1.90 release announcement on gedit-list&quot;&gt;GtkSourceview 1.90 release announcement&lt;/a&gt; on &lt;a href=&quot;http://mail.gnome.org/mailman/listinfo/gedit-list&quot;  title=&quot;gedit-list mailing list information&quot;&gt;gedit-list&lt;/a&gt;. After having finished my math excerises much earlier then expected I decided to hack GtkSourceview2 support into Gobby. I committed it a few minutes ago into SVN, after having received some advice from &lt;a href=&quot;http://www.math.tamu.edu/~yevgen.muntyan/&quot;  title=&quot;Yevgen Muntyan&#039;s web page&quot;&gt;Yevgen Muntyan&lt;/a&gt; to get it to work (You have to associate a style theme by hand to get highlighting, which will hopefully be changed in the future so that a default theme is used if none is given).&lt;/p&gt;

&lt;p&gt;&lt;a class=&#039;serendipity_image_link&#039; href=&#039;http://arbur.net/serendipity/uploads/gobby/gobby-gsv2.png&#039;&gt;&lt;!-- s9ymdb:28 --&gt;&lt;img width=&#039;110&#039; height=&#039;87&#039; style=&quot;float: left; border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://arbur.net/serendipity/uploads/gobby/gobby-gsv2.serendipityThumb.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;GtkSourceView2 basically comes with a new syntax highlighting engine that allows embedding languages into others (such as JavaScript into HTML, as shown on the screenshot). It also has theming support and mapping between filename patterns and language definitions, which Gobby had to implement before (and it still does since GtkSourceView1 is still supported).&lt;/p&gt; 
    </content:encoded>

    <pubDate>Sun, 27 May 2007 02:30:10 +0200</pubDate>
    <guid isPermaLink="false">http://arbur.net/serendipity/archives/29-guid.html</guid>
    
</item>
<item>
    <title>Gobby status</title>
    <link>http://arbur.net/serendipity/archives/28-Gobby-status.html</link>
            <category>Gobby</category>
    
    <comments>http://arbur.net/serendipity/archives/28-Gobby-status.html#comments</comments>
    <wfw:comment>http://arbur.net/serendipity/wfwcomment.php?cid=28</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://arbur.net/serendipity/rss.php?version=2.0&amp;type=comments&amp;cid=28</wfw:commentRss>
    

    <author>nospam@example.com (Armin Burgmeier)</author>
    <content:encoded>
    &lt;p&gt;&lt;a href=&quot;http://gobby.0x539.de&quot;  title=&quot;Gobby Collaborative editor&quot;&gt;Gobby&lt;/a&gt; development has not stalled. We released 0.4.3 with native &lt;a href=&quot;http://avahi.org/&quot;  title=&quot;Avahi Service Discovery&quot;&gt;Avahi&lt;/a&gt; support a few weeks ago. However, it is not planned to add any great new features in favor of the sequel I already &lt;a href=&quot;http://arbur.net/serendipity/archives/3-The-future-of-Gobby.html&quot;  title=&quot;The future of (G)obby&quot;&gt;announced&lt;/a&gt; half a year ago. Unfortunately, it does not make as much progress as one could expect it to do, and especially not as much as I would like it to do. My second semester at university began three weeks ago, so I also don&#039;t think I get too much done in the following two to three months, either.&lt;/p&gt;

&lt;p&gt;The successor of Gobby is going to be called Infinote. It will offer some (long-requested) features the current Gobby architecture does not support, such as different document types, XMPP-based messaging and showing remote cursors/selections. However, the fundamental change is that I want to provide a kind of framework rather than an editor, and to get people to implement Infinote support into their editors so that ideally you can just continue to use your favorite editor for collaborative work. For this to work, I need to properly document the API and network protocol which is also one of the points Gobby is rather weak in currently.&lt;/p&gt;

&lt;p&gt;A propos protocol: More and more collaborative editing efforts pop up lately, like &lt;a href=&quot;http://xmppcollaborate.wordpress.com/&quot;  title=&quot;Pisara - An XMPP based collaborative text editor&quot;&gt;Pisara Editor&lt;/a&gt;, &lt;a href=&quot;http://www.abisource.com/twiki/bin/view/Abiword/AbiCollab&quot;  title=&quot;AbiWord collaboration&quot;&gt;AbiCollab&lt;/a&gt; (which I should really try out in the near feature...) seems to be mature and a GUADEC session description mentions some &lt;a href=&quot;http://guadec.org/node/521&quot;  title=&quot;
Collaboration within GNOME&quot;&gt;gedit/collab&lt;/a&gt; (over which I did not find out any further details, though). Then, there are of course &lt;a href=&quot;http://ace.iserver.ch/&quot;  title=&quot;ACE - A collaborative editor&quot;&gt;ACE&lt;/a&gt; and &lt;a href=&quot;http://mateedit.sourceforge.net/&quot;  title=&quot;MateEdit collaborative editor&quot;&gt;MateEdit&lt;/a&gt; which I am already aware of. All of these (including Gobby) use different protocols, and are therefore unable to interoperate with each other. Most seem to agree that XMPP is a good base, but there is still the application-specific stuff on top of it that needs to be compatible. It would be great if there was some project like freedesktop.org to agree on a standard for collaborative (text) editing.&lt;/p&gt;

&lt;p&gt;The current Infinote code is available in a public SVN at &lt;a href=&quot;svn://svn.0x539.de/inifinote&quot;  title=&quot;Infinote SVN repository&quot;&gt;svn://svn.0x539.de/inifinote&lt;/a&gt; for those who want to have a look at it. However, most of the ideas do only exist in my head by now and are not written down somewhere in there.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Mon, 07 May 2007 23:49:00 +0200</pubDate>
    <guid isPermaLink="false">http://arbur.net/serendipity/archives/28-guid.html</guid>
    
</item>
<item>
    <title>Installer++</title>
    <link>http://arbur.net/serendipity/archives/27-Installer++.html</link>
            <category>Gobby</category>
    
    <comments>http://arbur.net/serendipity/archives/27-Installer++.html#comments</comments>
    <wfw:comment>http://arbur.net/serendipity/wfwcomment.php?cid=27</wfw:comment>

    <slash:comments>3</slash:comments>
    <wfw:commentRss>http://arbur.net/serendipity/rss.php?version=2.0&amp;type=comments&amp;cid=27</wfw:commentRss>
    

    <author>nospam@example.com (Armin Burgmeier)</author>
    <content:encoded>
    &lt;p&gt;Do you remember back in school when you learned stuff you certainly would not need anymore in your future life? I thought the same thing when we programmed things in Delphi (those things actually were quite interesting, though). After Phil poked me once again yesterday, I finally decided to fix long-standing &lt;a href=&quot;http://gobby.0x539.de/trac/ticket/145&quot;  title=&quot;Gobby Bug #145 - Have installer verify the presence of GTK+, and gtkmm&quot;&gt;bug #145&lt;/a&gt;. So, guess what, the setup system we use (&lt;a href=&quot;http://www.jrsoftware.org/isinfo.php&quot;  title=&quot;Free installer for Windows&quot;&gt;InnoSetup&lt;/a&gt;) is not only written in Delphi but also allows custom Pascal Code to be executed during setup. So &lt;a href=&quot;http://gobby.0x539.de/trac/changeset/1552&quot;  title=&quot;Gobby ChangeSet 1552&quot;&gt;this&lt;/a&gt; is what I came up with, and it would certainly have taken me some more hours if I did not know Delphi before.&lt;/p&gt;

&lt;p&gt;I wonder however whether I will have to use Java for some real-world application one day. I would be nearly as good prepared as I was for the Delphi task.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Tue, 10 Apr 2007 15:22:00 +0200</pubDate>
    <guid isPermaLink="false">http://arbur.net/serendipity/archives/27-guid.html</guid>
    
</item>
<item>
    <title>Gobby 0.4.2 released</title>
    <link>http://arbur.net/serendipity/archives/23-Gobby-0.4.2-released.html</link>
            <category>Gobby</category>
    
    <comments>http://arbur.net/serendipity/archives/23-Gobby-0.4.2-released.html#comments</comments>
    <wfw:comment>http://arbur.net/serendipity/wfwcomment.php?cid=23</wfw:comment>

    <slash:comments>5</slash:comments>
    <wfw:commentRss>http://arbur.net/serendipity/rss.php?version=2.0&amp;type=comments&amp;cid=23</wfw:commentRss>
    

    <author>nospam@example.com (Armin Burgmeier)</author>
    <content:encoded>
    &lt;p&gt;We released &lt;a href=&quot;http://gobby.0x539.de&quot;  title=&quot;The Gobby collaborative editor&quot;&gt;Gobby&lt;/a&gt; 0.4.2 today. It does not support that much new features, but fixes some annoyances people have complained about: The urgency hint (the window flashing when a user wrote something in the chat) is configurable, documents can be subscribed to by double-clicking them in the user list and the editor tries to keep the line you are currently editing at the same position within the viewport if others add or remove lines elsewhere.&lt;/p&gt;

&lt;p&gt;Sobby, the dedicated server, supports initial loading of regular documents instead of serialized obby sessions. Just pass them on the command line as with sessions, sobby will detect whether its a session, and if it is not, it will open it as a document. Sobby now also allows autosaving individual documents into a directory, via the &lt;code&gt;--autosave-directory&lt;/code&gt; command line option or the &lt;code&gt;autosave_directory&lt;/code&gt; entry in the configuration file, respectively.&lt;/p&gt;

&lt;p&gt;Grab them on the &lt;a href=&quot;http://gobby.0x539.de/trac/wiki/Download&quot;  title=&quot;Gobby download page&quot;&gt;Downloads&lt;/a&gt; page on our wiki.&lt;/p&gt;

&lt;p&gt;Furthermore, I will attend this year&#039;s &lt;a href=&quot;http://fostel2007.fostel.org&quot;  title=&quot;FOSTEL 2007 wiki&quot;&gt;FOSTEL&lt;/a&gt; on April 4-5 to represent Gobby there (Thanks to &lt;a href=&quot;http://www.openismus.com&quot;  title=&quot;Openismus GmbH - Software development using Open Source Software&quot;&gt;Openismus&lt;/a&gt; for making this possible). So if you ever wanted to talk to one of the Gobby developers, be sure to meet me there.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Thu, 08 Mar 2007 14:33:00 +0100</pubDate>
    <guid isPermaLink="false">http://arbur.net/serendipity/archives/23-guid.html</guid>
    
</item>
<item>
    <title>How much peer-to-peer should obby become?</title>
    <link>http://arbur.net/serendipity/archives/9-How-much-peer-to-peer-should-obby-become.html</link>
            <category>Gobby</category>
    
    <comments>http://arbur.net/serendipity/archives/9-How-much-peer-to-peer-should-obby-become.html#comments</comments>
    <wfw:comment>http://arbur.net/serendipity/wfwcomment.php?cid=9</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://arbur.net/serendipity/rss.php?version=2.0&amp;type=comments&amp;cid=9</wfw:commentRss>
    

    <author>nospam@example.com (Armin Burgmeier)</author>
    <content:encoded>
    &lt;p&gt;The current &lt;a href=&quot;http://www.arbur.net/stuff/obbyproto&quot; title=&quot;Draft for the obby protocol&quot;&gt;draft&lt;/a&gt; for the new obby protocol plans to use a peer-to-peer-like mechanism for transport via jabber, so every jabber participant talks to other jabber participants directly instead of tunnelung through the publisher. This should reduce bandwidth usage quite a lot but raises quite a few other questions regarding peer-to-peer: Could new users join the obby network via any peer instead of just the publisher? Could the session stay alive when the original publisher leaves? I met &lt;a href=&quot;http://blog.philkern.de&quot;  title=&quot;Philipp Kern&#039;s private playground&quot;&gt;Phil&lt;/a&gt; yesterday and we discussed these questions, and we even came up with some results. But first of all, what are the problems?&lt;/p&gt;

&lt;p&gt;As soon as every peer in the network is allowed to accept new peers, we have to handle the case that two peers join the same network via two different nodes at the same time.&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;&lt;p&gt;This affects &lt;strong&gt;ID generation&lt;/strong&gt;. Currently, every user is assigned a unique user ID for the session. This is required because the protocol allows multiple users per connection (which is again required for the good old client/server model used by the TCP subsystem, but this option also allows another nice feature (republishing) I want to keep in mind for the future). An incoming request however is user-related rather than connection-related, so it must be clear which user generated it. It is still possible to produce unique IDs as soon as an ID is variable in length. When a peer has to generate a user ID, it just takes its own ID and appends something to it to generate a new one.&lt;/p&gt;&lt;/li&gt;
 &lt;li&gt;&lt;p&gt;We cannot catch &lt;strong&gt;name collision&lt;/strong&gt;. Two users with the same names could join the same network via two different peers at the same time. However, this does not matter at all since we could just allow duplicate names in the session. If we want to distinguish between them UI-wise we could suffix one client-side, maybe sorted by the user ID to keep it the same on all peers (but which would lead to renamings if a new user with the same name joins and gets an ID which is sorted before the ID of the existing user).&lt;/p&gt;&lt;/li&gt;
 &lt;li&gt;
  &lt;p&gt;How to do &lt;strong&gt;user authentication&lt;/strong&gt;? obby 0.4 allows each user to set a password which is stored on the server (respectively publisher) and recognizes users by name. So, if a user with the same name as a user which was in the session some time ago joins, the server looks whether a password has been set, and if the authentication was successful, the old user ID (with all text written by that user) is reassigned to the joining user. This is especially useful when the session has been serialized and should be continued later or when a user has lost the internet connection, perhaps by an automatically disconnection performed by the ISP (which is rather common at least in Germany, but that&#039;s another story).
  &lt;/p&gt;
  &lt;p&gt;So, let&#039;s assume we want to implement a similar feature into the new obby. Since we just said that names could appear twice, we would need another criteria to recognize a user after disconnection. The user ID comes to mind. So each client could store a table assigning a session to the user ID he had. But since the user ID is known to all participants this feature could easily be misused, so some form of authentication would still be required. The only solution I see here is that you tell the peer through which you have joined (or perhaps others that you trust) a password and if you want to be recognized lateron, you have to join through one of these trusted peers. If all of them have left the session, well, bad luck. I you have some suggestions concerning this point feel free to add a comment or drop me a mail.&lt;/p&gt;
 &lt;/li&gt;
 &lt;li&gt;
  &lt;p&gt;We cannot just assign a &lt;strong&gt;vector time index&lt;/strong&gt; to the new user because this could lead to conflicts as well. The solution would be an association between the user ID and the vector time component. This requires some more data to be stored in the state space and sent through the network.&lt;/p&gt;
 &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a last case, imagine the original publisher has left the session. In the flavour of a real peer-to-peer network the session would just go on as if nothing had happend. The only problem that could arise is that the publisher must not use the session ID that this session had for other sessions, because he cannot be sure that the old session with this ID might still be running somewhere. As sessions are identified by publisher and a session ID this could lead to conflicts. An easy approach would be to just generate a 32 bit random number as the session ID and assuming that we never generated this one before, but I do not like these approaches that only work in 99.999% of all cases and not in 100% (maybe just because I saw it too often that a mage in &lt;a href=&quot;http://www.wesnoth.org&quot;  title=&quot;Turn based strategy game&quot;&gt;Wesnoth&lt;/a&gt; missed three times...). Having an ID counter somewhere in the user&#039;s home directory is not enough as well because another user might publish a session on the same port and with the same ID as another user on the same host (or just use the same jabber account). As above, I am open to any suggestions regarding this point.&lt;/p&gt;

&lt;p&gt;Note however that these are just ideas and no final decisions and they only apply to the jabber communication level. All TCP communication is done as Server/Client as before because it is not guaranteed that all TCP participants can get direct connections to each others (think of NATs, different subnets and so on). This also means that Obby currently relies on all jabber users having direct connections (well, direct as in &quot;I just need to send it to the jabber server and the other one will get it eventually&quot;).&lt;/p&gt; 
    </content:encoded>

    <pubDate>Fri, 22 Sep 2006 15:14:00 +0200</pubDate>
    <guid isPermaLink="false">http://arbur.net/serendipity/archives/9-guid.html</guid>
    
</item>
<item>
    <title>The future of (G)obby</title>
    <link>http://arbur.net/serendipity/archives/3-The-future-of-Gobby.html</link>
            <category>Gobby</category>
    
    <comments>http://arbur.net/serendipity/archives/3-The-future-of-Gobby.html#comments</comments>
    <wfw:comment>http://arbur.net/serendipity/wfwcomment.php?cid=3</wfw:comment>

    <slash:comments>13</slash:comments>
    <wfw:commentRss>http://arbur.net/serendipity/rss.php?version=2.0&amp;type=comments&amp;cid=3</wfw:commentRss>
    

    <author>nospam@example.com (Armin Burgmeier)</author>
    <content:encoded>
    &lt;p&gt;The final release of Gobby 0.4.0 is now pretty close. &lt;a href=&quot;http://darcs.0x539.de/trac/obby/cgi-bin/trac.cgi/wiki/Download&quot;  title=&quot;Latest Gobby sources&quot;&gt;0.4.0rc3&lt;/a&gt; has been released just recently and fixed a nasty bug that caused desynchronization, meaning that data consistency between multiple users has been lost. Currently, &lt;a href=&quot;http://www.philkern.de&quot;  title=&quot;Philipp Kern&#039;s private playground&quot;&gt;Phil&lt;/a&gt; and I perform some minor tweaks like supporting IPv6 in obby (net6 had this capability since the beginning) which seems to work already as we had an &lt;a href=&quot;http://blog.philkern.de/archives/206-Dragndrop-for-Ruby-GTK2.html&quot;&gt;IPv6 session&lt;/a&gt; yesterday. Some other final fixes include still broken chat highlighting and UI stuff.&lt;/p&gt;

&lt;p&gt;The sequel to the current version (currently codenamed obby 0.5, but most likely this will change before a first release to prevent name conflicts with obby &lt;=0.4.0) will be developped in C, not C++. This has several reasons:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;C++ has a quite huge impact on &lt;strong&gt;code size&lt;/strong&gt;. The same program written in C makes the shared library and the executable much smaller. This might only apply to GCC and probably because it links half of the STL into each and every binary, but it hurts when I see that it is not necessary for a working library.&lt;/li&gt;
 &lt;li&gt;&lt;strong&gt;Binary compatibility&lt;/strong&gt; is easier to maintain. First of all, net6 and obby made extensive use of templates which caused them to be linked statically into gobby and sobby. With handsight this was not a good idea at all since one always had to recompile gobby when libobby was upraded. On the one hand, I am convinced that API/ABI stability can be achieved with C++ (as &lt;a href=&quot;http://www.gtkmm.org&quot;  title=&quot;GTK+ C++ wrapper&quot;&gt;gtkmm&lt;/a&gt; proves), but on the other hand one has to take very much care. Just adding another base class or a virtual function might break ABI (for example, this is why Gtk::ComboBox does still not derive from Gtk::CellEditable) whereas this would be no problem in C since there are not any virtual functions nor base classes.&lt;/li&gt;
 &lt;li&gt;C++ makes it hard to create &lt;strong&gt;language bindings&lt;/strong&gt;. There was already an attempt to create haskell bindings for obby, but it turned out that prior C bindings to the C++ library would have been required. I am however not an expert in this area, so I cannot say for sure whether there would have been other ways, but writing the library directly in C does not make it worse.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;First of all, this means a complete rewrite of the library. This is a great opportunity to change the complete architecture. We want to get rid of the classic strict client/server architecture and get more into the peer-to-peer direction. We now follow an approach that kind of mixes both variants. The networking shall be divided into two tasks: &lt;strong&gt;Discovery&lt;/strong&gt; and &lt;strong&gt;Transport&lt;/strong&gt;. Discovery means finding running obby sessions within the network and transport means actual communication during a session.&lt;/p&gt;

&lt;p&gt;A session now also only contains only one document instead of an arbitrary amount of documents. Instead, the library allows joining and creating multiple sessions using the same network connection. This reduces the concept of subscribing to a document to just joining another session.&lt;/p&gt;

&lt;p&gt;Apart from this, obby 0.5 shall support the following key features:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;&lt;strong&gt;Multidimensional state space collaboration algorithm&lt;/strong&gt;: Multiple two-dimensional state spaces (as currently used by obby) are easier to implement and maintain but cause a loss of data that makes it impossible to implement a proper Undo operation. It is however still very unsure whether Undo will be implemented in a first Version of obby 0.5 because some questions remain still open.&lt;/li&gt;
 &lt;li&gt;&lt;strong&gt;Enhanced networking&lt;/strong&gt;: obby 0.5 is going to offer the possibilty to use jabber for networking beyond a local area network. This allows easy NAT traversal with IPv4 and automatic session discovery in a WAN. &lt;a href=&quot;http://www.avahi.org&quot;  title=&quot;Avahi service discovery&quot;&gt;Avahi&lt;/a&gt; will be used for discovering sessions in the local area network, and it is still possible to establish TCP connections directly, as it is still the case in obby 0.4. The only requirement is that sessions discovered via TCP or Avahi must be joined using TCP as transport and sessions discovered via Jabber must be joined using Jabber as transport.&lt;/li&gt;
 &lt;li&gt;&lt;strong&gt;Display remote viewports, carets and selections&lt;/strong&gt;: This is one of the most requested features for obby (probably right after Undo...). Whenever the local cursor position, selection or viewport (viewport as in scrolling position) changes, the event is transmitted to others. However, this must be controlled to save bandwidth usage, so, say, only once every 500ms such a request may be sent. This number could also be made adjustible at runtime to reduce latency in a LAN.&lt;/li&gt;
 &lt;li&gt;&lt;strong&gt;Different character encodings per user&lt;/strong&gt;: In obby 0.4, an encoding is set for the whole session and all participants have to deal with this. This will not much change in obby 0.5 since Jabber requires text to be in UTF-8, so this will be the encoding used for transport. However, obby is going to perform possible character set conversions by itself when you tell it what encoding you expect. This also allows offsets of insertions and deletions to be given in characters rather than in bytes, avoiding unnecessary calculations from offsets to byte indices and vice versa.&lt;/li&gt;
 &lt;li&gt;&lt;strong&gt;Record and playback of sessions&lt;/strong&gt;: Everything that has to be done is to serialize every incoming and outgoing operation with a timestamp included. This allows to go back in a session&#039;s history and view earlier versions of the document.&lt;/li&gt;
 &lt;li&gt;&lt;strong&gt;Read-only users&lt;/strong&gt;: They would not need an extra dimension in the state space, so apart from a bit more network traffic there is almost no overhead.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Like obby 0.4.0, obby 0.5 should have not that much dependencies (avahi is optional, &lt;a href=&quot;http://iksemel.jabberstudio.org&quot;  title=&quot;Iksemel XML parser library&quot;&gt;iksemel&lt;/a&gt; is included since we had to apply one or two fixes to it and it seems not to be actively developed anymore). This allows it to be used on a variety of platforms and desktops without being required to use some uncommon dependency (like GTK+ on Mac OS X).&lt;/p&gt;

&lt;p&gt;So, these are our plans for obby, but what about Gobby? Well, I also have some changes in mind, although they are even more far away. As I am a convinced &lt;a href=&quot;http://www.gnome.org&quot; title=&quot;Free GNOME desktop&quot;&gt;GNOME&lt;/a&gt; user after all, I would like to integrate Gobby more into the GNOME desktop and become eventuelly even part of GNOME. This is why I am going to try to build an obby plugin for &lt;a href=&quot;http://www.gnome.org/projects/gedit/&quot; title=&quot;GNOME&#039;s text editor&quot;&gt;gedit&lt;/a&gt; after obby 0.5 has been released. Since we want to collaborate with non-GNOME-users as well, something is also going to replace Gobby as a stand-alone editor. I even consider using &lt;a href=&quot;http://www.wxwidgets.org&quot;  title=&quot;wxWidgets cross-platform toolkit&quot;&gt;wxWidgets&lt;/a&gt; to achieve a more native look and feel on the corresponding platform.&lt;/p&gt;

&lt;p&gt;However, this is very far away from now. The current obby 0.5 code has about something more than 10.000 lines of code and implements only most of the networking stuff including discovery via jabber and avahi. All those nice features mentioned above still have to be implemented and tested.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Wed, 16 Aug 2006 16:17:00 +0200</pubDate>
    <guid isPermaLink="false">http://arbur.net/serendipity/archives/3-guid.html</guid>
    
</item>

</channel>
</rss>