<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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" version="2.0">

<channel>
	<title>Fresh gale of bits</title>
	
	<link>http://blog.bilinski.it</link>
	<description>Mateusz Biliński's quasi-blog</description>
	<pubDate>Wed, 30 Jun 2010 09:26:06 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.1</generator>
	<language>en</language>
	<image>
  <link>http://blog.bilinski.it</link>
  <url>http://blog.bilinski.it/favicon.ico</url>
  <title>Fresh gale of bits</title>
</image>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/FreshGaleOfBits" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="freshgaleofbits" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2FFreshGaleOfBits" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FFreshGaleOfBits" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2FFreshGaleOfBits" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bloglines.com/sub/http://feeds.feedburner.com/FreshGaleOfBits" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FFreshGaleOfBits" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FFreshGaleOfBits" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FFreshGaleOfBits" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><item>
		<title>Hacking Vim 7.2 (book review)</title>
		<link>http://blog.bilinski.it/2010/06/23/hacking-vim-72-book-review/</link>
		<comments>http://blog.bilinski.it/2010/06/23/hacking-vim-72-book-review/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 15:48:30 +0000</pubDate>
		<dc:creator>Mateusz Biliński</dc:creator>
		
		<category><![CDATA[Post]]></category>

		<category><![CDATA[Apps]]></category>

		<category><![CDATA[Books]]></category>

		<category><![CDATA[Hacking]]></category>

		<category><![CDATA[IT]]></category>

		<category><![CDATA[Reviews]]></category>

		<category><![CDATA[Vim]]></category>

		<guid isPermaLink="false">http://blog.bilinski.it/?p=22</guid>
		<description><![CDATA[<div class="postavatar"><img class="post-avatar-img" src="http://blog.bilinski.it/wp-content/uploads/icons/apps/vim95.png" style="width:95px;height:95px;float:left; margin: 0.1em 2em 0.1em 0.5em;" alt="hacking-vim-72-book-review" border="0" /></div>
Recently I got my hands on newly published  &#8220;Hacking Vim 7.2&#8243; which is a refreshed edition of the most up-to-date book about Vim on the market.

This review is mostly comparison-based. If you&#8217;re interested in more detailed analysis of book take a look at my content review, published some time ago.



First of all, if you&#8217;re [...]]]></description>
			<content:encoded><![CDATA[<div class="postavatar"><img class="post-avatar-img" src="http://blog.bilinski.it/wp-content/uploads/icons/apps/vim95.png" style="width:95px;height:95px;float:left; margin: 0.1em 2em 0.1em 0.5em;" alt="hacking-vim-72-book-review" border="0" /></div>
<p><strong>Recently I got my hands on newly published  <a href="http://www.packtpub.com/hacking-vim-7-2/book?utm_source=bilinski.it&amp;utm_medium=bookrev&amp;utm_content=blog&amp;utm_campaign=mdb_003226" >&#8220;Hacking Vim 7.2&#8243;</a> which is a refreshed edition of the most up-to-date <a href="https://www.packtpub.com/Vim/book" >book about Vim</a> on the market.</strong></p>

<p>This review is mostly comparison-based. If you&#8217;re interested in more detailed analysis of book take a look at my <a href="http://blog.bilinski.it/2007/10/16/time-hacking-with-vim-book-review/" >content review</a>, published some time ago.</p>

<p><span id="more-22" ></span></p>

<p>First of all, if you&#8217;re wondering how much the book has changed - well, not much. This is still a <strong>good piece of writing</strong>, with some minor tweaks. I think that lack of any introduction to this new version (compared to previous) in the book itself, clearly shows that it should be treated as <strong>retargeted content</strong>  (with focus on <em>Vim 7.2</em> users), not as new edition<sup id="fnref:1" ><a href="#fn:1"  rel="footnote" >1</a></sup>. Below you can find differences I&#8217;ve spotted and how these affect general perception of this title.</p>

<h4>Content added</h4>

<p>Throughout the whole book there are <strong>multiple small additions</strong>, like (beginning with <em>Chapter 1.</em>) list of topics to be discussed at the beginning of the chapter or common terminology paragraph. Also some infos that are widely used in other IT texts showed up, for example <em>&#8220;Who this book is for?&#8221;</em> and <em>&#8220;Getting Vim&#8221;</em>. Titles were added to examples (making them visible in <em>Table of Contents</em>), however not to all of them.</p>

<p>Biggest new parts of text are <strong>two new subchapters</strong>. The one discussing how to handle snippets with <a href="http://www.vim.org/scripts/script.php?script_id=2540" >snipMate script</a> - especially useful for people creating new content on large scale. The second one showing that it&#8217;s possible to use Vim as microblogging client, making <a href="http://www.vim.org/scripts/script.php?script_id=2204" >TwitVim script</a> a starting point.</p>

<h4>Content modified</h4>

<p>There are also some modifications in book, of which the most important one is <strong>bigger index</strong>, extend by almost 100% percent (but bare in mind, that previously it was only 3 pages long) - this will be probably much appreciated by readers.</p>

<p>Formatting changes and reorganization tweaks took place, too. <em>&#8220;Vim Scripting&#8221;</em> <strong>chapter was split into two</strong> separate <em>&#8220;Basic Vim Scripting&#8221;</em> and <em>&#8220;Extended Vim Scripting&#8221;</em>, although I haven&#8217;t spotted any additions here. The <strong>screenshots are wider</strong> now making them more readable. Lists (of parameters for example) were <strong>replaced by tables</strong> which created a more reference-like layout.</p>

<p>Also, in some places language was simplified, to make statements more clear and concise.</p>

<h4>Content removed</h4>

<p>Some elements in book were removed, too. For example, in first chapter unnecessary graphic with vi clones was deleted. Fortunately, I haven&#8217;t found such removals disturbing and affecting overall feeling about the book - except for one component.</p>

<p>Due to retargeting book to address only <em>Vim 7.2</em>, it was decided to remove <strong>all info about versions</strong> in which each feature was introduction (a.k.a &#8220;since when given tips are applicable&#8221;). In my opinion such <strong>info was pretty much unique</strong>, as there&#8217;s no other place when you can follow <em>Vim</em> history so easily. However, this is not a crucial part of the book and, as such, should not affect your preception of text in a big way.</p>

<h4>Summary</h4>

<p>Overally, the book hasn&#8217;t changed that much - it is still a <strong>really good piece of writing</strong>, although some may consider it too shallow. Be advised: it is not a huge cookbook, but <strong>if you&#8217;re seeking some advancement</strong> in editing skills and don&#8217;t know where to start, this book is a <strong>great starting point</strong> with very good collection of tips and tricks. From time to time a look into this book as reference or when I seek inspiration in reduction my code editing time, so it is not  a one-time read.</p>

<p>Below you can find small mindmap that summarizes this review.</p>

<iframe width="600"  height="400"  frameborder="0"  src="http://www.mindmeister.com/maps/public_map_shell/54687220/hacking-vim-7-2-review?width=600&#038;height=400&#038;zoom=0"  scrolling="no"  style="overflow:hidden" ></iframe>

<p><em>Thanks to Packt Publishing for letting me review this new book.</em></p>

<div class="footnotes" >
<hr/>
<ol>

<li id="fn:1" >
<p>In fact, this is indeed first edition of the book.&#160;<a href="#fnref:1"  rev="footnote" >&#8617;</a></p>
</li>

</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.bilinski.it/2010/06/23/hacking-vim-72-book-review/feed/</wfw:commentRss>
		</item>
		<item>
		<title>GSoC 2008 - Configs, refactoring and more examples. Report #3</title>
		<link>http://blog.bilinski.it/2008/08/06/gsoc-2008-configs-refactoring-and-more-examples-report-3/</link>
		<comments>http://blog.bilinski.it/2008/08/06/gsoc-2008-configs-refactoring-and-more-examples-report-3/#comments</comments>
		<pubDate>Wed, 06 Aug 2008 15:14:37 +0000</pubDate>
		<dc:creator>Mateusz Biliński</dc:creator>
		
		<category><![CDATA[Post]]></category>

		<category><![CDATA[Apps]]></category>

		<category><![CDATA[Gajim]]></category>

		<category><![CDATA[Google]]></category>

		<category><![CDATA[GSoC]]></category>

		<category><![CDATA[GUI]]></category>

		<category><![CDATA[IT]]></category>

		<category><![CDATA[Open-Source]]></category>

		<category><![CDATA[Plugin]]></category>

		<category><![CDATA[Python]]></category>

		<category><![CDATA[Report]]></category>

		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://blog.bilinski.it/?p=21</guid>
		<description><![CDATA[<div class="postavatar"><img class="post-avatar-img" src="http://blog.bilinski.it/wp-content/uploads/icons/gajim/gajim-ipython-icon-smaller.png" style="width:96px;height:96px;float:left; margin: 0.1em 2em 0.1em 0.5em;" alt="gsoc-2008-configs-refactoring-and-more-examples-report-3" border="0" /></div>
A lot of code has been written since last report, while refactoring and creating new plugins. Details follow.

The goal of this part was to close elements related to GUI extending and, generally, plugin management. Some clean-ups have been made also to prepare code for events handling part.



First of all, a few changes have been made [...]]]></description>
			<content:encoded><![CDATA[<div class="postavatar"><img class="post-avatar-img" src="http://blog.bilinski.it/wp-content/uploads/icons/gajim/gajim-ipython-icon-smaller.png" style="width:96px;height:96px;float:left; margin: 0.1em 2em 0.1em 0.5em;" alt="gsoc-2008-configs-refactoring-and-more-examples-report-3" border="0" /></div>
<p><strong>A lot of code has been written since last report, while refactoring and creating new plugins. Details follow.</strong></p>

<p>The goal of this part was to close elements related to <strong>GUI extending</strong> and, generally, <strong>plugin management</strong>. Some clean-ups have been made also to prepare code for events handling part.</p>

<p><span id="more-21" ></span></p>

<p>First of all, a few changes have been made to <code>PluginManager</code> class - even if plugin is deactivated it is an <em>instance object, not class object</em>. This gave opportunity to add <code>init</code> method, where devs can put some base operations that does not depend on plugin current activation state (<strong>speeds up plugin activation</strong>).</p>

<p>The <strong>biggest change</strong> is connected with plugins configuration. It is now fully-featured, based on <code>shelve</code> and <code>UserDict</code> modules and transparent to plugin developer. Config files are not plain-text, as this is Python pickling, but you can easily save dicts, list, tuples. In future, this will be probably rewritten to some custom class and integrated with Gajim&#8217;s main config facility.</p>

<p><a href="http://blog.bilinski.it/wp-content/gallery/screenshots/gajim_banner_tweaks_plugin_config_dialog.png"  title="Banner Tweaks plugin configuration dialog."  class="thickbox"  rel="singlepic641" ><img class="ngg-singlepic ngg-right"  src="http://blog.bilinski.it/wp-content/plugins/nextgen-gallery/nggshow.php?pid=641&amp;width=300&amp;height=300&amp;mode="  alt="gajim_banner_tweaks_plugin_config_dialog.png"  title="gajim_banner_tweaks_plugin_config_dialog.png" /></a></p>

<p>I&#8217;ve written new plugin: <strong>Banner Tweaks</strong> (based on <a href="http://trac.gajim.org/ticket/4133" >patch by pb</a>), that allows people to easily achieve compact banner in chat windows (difference can be seen on screenshots). <a href="http://blog.bilinski.it/wp-content/gallery/screenshots/gajim_without_banner_tweaks_plugin.png"  title="Gajim chat window without Banner Tweaks plugin activated."  class="thickbox"  rel="singlepic644" ><img class="ngg-singlepic ngg-right"  src="http://blog.bilinski.it/wp-content/plugins/nextgen-gallery/nggshow.php?pid=644&amp;width=300&amp;height=300&amp;mode="  alt="gajim_without_banner_tweaks_plugin.png"  title="gajim_without_banner_tweaks_plugin.png" /></a> Old plugin <strong>Message Length Notifier</strong> has configuration window now, so it&#8217;s fully usable (see screenshots). I&#8217;ve also added JIDs filtering feature to it (for which JabberIDs notification should be used). To show roster extending possibility I&#8217;ve written small plugin, <strong>Roster Buttons</strong> that adds quick access buttons to it - one of them shows/hides offline contacts (idea taken from Psi). <a href="http://blog.bilinski.it/wp-content/gallery/screenshots/gajim_message_length_notifier_plugin_config_dialog.png"  title="Length Notifier plugin in action with configuration dialog."  class="thickbox"  rel="singlepic642" ><img class="ngg-singlepic ngg-right"  src="http://blog.bilinski.it/wp-content/plugins/nextgen-gallery/nggshow.php?pid=642&amp;width=300&amp;height=300&amp;mode="  alt="gajim_message_length_notifier_plugin_config_dialog.png"  title="gajim_message_length_notifier_plugin_config_dialog.png" /></a> <a href="http://blog.bilinski.it/wp-content/gallery/screenshots/gajim_roster_buttons_plugin.png"  title="Gajim&#039;s roster modification with Roster Buttons plugin."  class="thickbox"  rel="singlepic643" ><img class="ngg-singlepic ngg-right"  src="http://blog.bilinski.it/wp-content/plugins/nextgen-gallery/nggshow.php?pid=643&amp;width=300&amp;height=300&amp;mode="  alt="gajim_roster_buttons_plugin.png"  title="gajim_roster_buttons_plugin.png" /></a></p>

<p>Aparat from that, <strong>extension points cleanup mechanism</strong> has been added, so dead references are kept no more. In addition, needed modifications have been done to Gajim core and plugins.</p>

<h4>What&#8217;s keeping me busy</h4>

<p>I feel obliged to inform community about things that have influence on my time dedication to GSoC project. First of all, I&#8217;m very close to finishing my master&#8217;s thesis - delays were maybe mostly because I started (again) reviewing state-of-art of information retrieval and what impact can it have on my project. Great reading of a lot articles published by <em>Springer</em> and <em>IEEE</em>.</p>

<p>Second of all, and it this is more important, I gained the title of <strong>Certified Project Management Associate</strong>, after passing <a href="http://www.ipma.ch/certification/Requirements/Pages/LevelD.aspx" >IPMA lvl D exam</a>. <img src="http://blog.bilinski.it/wp-includes/images/smilies/icon_smile.gif"  alt=":)"  class="wp-smiley" /> Looking at <a href="http://www.spmp.org.pl/certyfikowane_osoby_na_poziom_d" >list of certicate holders</a>  in Poland. I&#8217;ve realized that I&#8217;m one of the youngest persons on that list (AFAIR second or third in row). <img src="http://blog.bilinski.it/wp-includes/images/smilies/icon_wink.gif"  alt=";)"  class="wp-smiley" /> </p>

<h4>Open-Source feelings</h4>

<p>At the end, I just wanted to write that <a href="http://xapek.org/" >Yvesf</a> wrote <a href="http://trac.gajim.org/ticket/4176" >LaTeX Plugin</a> using API in my branch (<del datetime="2008-08-06T17:16:10+00:00" >haven&#8217;t played with it much so far</del> checked it out and it works nicely). Great feeling to know that someone else starts to use your code <img src="http://blog.bilinski.it/wp-includes/images/smilies/icon_smile.gif"  alt=":)"  class="wp-smiley" /> Probably this is one of <strong>open-source rewards</strong>&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bilinski.it/2008/08/06/gsoc-2008-configs-refactoring-and-more-examples-report-3/feed/</wfw:commentRss>
		</item>
		<item>
		<title>GSoC 2008 - Gajim has GUI for plug-ins management. Report #2</title>
		<link>http://blog.bilinski.it/2008/06/10/gsoc-2008-gajim-has-gui-for-plug-ins-management-report-2/</link>
		<comments>http://blog.bilinski.it/2008/06/10/gsoc-2008-gajim-has-gui-for-plug-ins-management-report-2/#comments</comments>
		<pubDate>Tue, 10 Jun 2008 13:41:56 +0000</pubDate>
		<dc:creator>Mateusz Biliński</dc:creator>
		
		<category><![CDATA[Post]]></category>

		<category><![CDATA[Apps]]></category>

		<category><![CDATA[Gajim]]></category>

		<category><![CDATA[Google]]></category>

		<category><![CDATA[GSoC]]></category>

		<category><![CDATA[GUI]]></category>

		<category><![CDATA[IT]]></category>

		<category><![CDATA[Open-Source]]></category>

		<category><![CDATA[Plugin]]></category>

		<category><![CDATA[Python]]></category>

		<category><![CDATA[Report]]></category>

		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://blog.bilinski.it/?p=20</guid>
		<description><![CDATA[<div class="postavatar"><img class="post-avatar-img" src="http://blog.bilinski.it/wp-content/uploads/icons/gajim/gajim-ipython-icon-smaller.png" style="width:96px;height:96px;float:left; margin: 0.1em 2em 0.1em 0.5em;" alt="gsoc-2008-gajim-has-gui-for-plug-ins-management-report-2" border="0" /></div>
It seems that another week during GSoC has passed. This one was mostly GUI-related.

I&#8217;ve wanted to let people experiment with plug-in system ASAP. That is why I&#8217;ve created Plugins management window ([9762]), where they can (de)activate all detected plug-ins and read information about them.

I&#8217;ve committed another plug-in example (after Message Length Notifier) - Acronyms Expander [...]]]></description>
			<content:encoded><![CDATA[<div class="postavatar"><img class="post-avatar-img" src="http://blog.bilinski.it/wp-content/uploads/icons/gajim/gajim-ipython-icon-smaller.png" style="width:96px;height:96px;float:left; margin: 0.1em 2em 0.1em 0.5em;" alt="gsoc-2008-gajim-has-gui-for-plug-ins-management-report-2" border="0" /></div>
<p><strong>It seems that another week during GSoC has passed. This one was mostly GUI-related.</strong></p>

<p>I&#8217;ve wanted to <strong>let people experiment with plug-in system</strong> ASAP. That is why I&#8217;ve created <strong>Plugins management window</strong> (<a href="http://trac.gajim.org/changeset/9762" >[9762]</a>), where they can (de)<strong>activate all <em>detected plug-ins</em></strong> and <strong>read information</strong> about them.</p>

<p>I&#8217;ve committed <strong>another plug-in example</strong> (after <em>Message Length Notifier</em>) - <strong>Acronyms Expander</strong> (<a href="http://trac.gajim.org/changeset/9777" >[9777]</a>). Now, users have <em>more elements to play with</em> and I can test how Plugins window deals with <em>multiple real-life elements</em>.</p>

<p><span id="more-20" ></span></p>

<h4>Plugins management window</h4>

<p><a href="http://blog.bilinski.it/wp-content/gallery/screenshots/gajim-plugins-window1.png"  title="Plugins window in Gajim (first version). Allows plug-in (de)activation through GUI."  class="thickbox"  rel="singlepic7" ><img class="ngg-singlepic ngg-right"  src="http://blog.bilinski.it/wp-content/plugins/nextgen-gallery/nggshow.php?pid=7&amp;width=300&amp;height=300&amp;mode="  alt="gajim-plugins-window1.png"  title="gajim-plugins-window1.png" /></a></p>

<p><strong>Current version</strong> of <a href="http://trac.gajim.org/browser/branches/plugin-system/data/glade/plugins_window.glade?rev=9762" >Plugins window</a>, with it&#8217;s basic functionality, is a <strong>good base for further development</strong>. There are <strong>two tabs</strong>: <strong>&#8216;Installed&#8217;</strong> and <strong>&#8216;Available&#8217;</strong> (visible on screenshot).</p>

<p><em>First one</em> <strong>shows plug-ins detected locally</strong> (installed). Here you can easily (de)activate them by <em>toggling tick in table view</em> on the left. This seems like an obvious way to do that <img src="http://blog.bilinski.it/wp-includes/images/smilies/icon_wink.gif"  alt=";)"  class="wp-smiley" /> </p>

<p><strong>&#8216;Uninstall&#8217;</strong> and <strong>&#8216;Configure&#8217;</strong> buttons are mocks. The first one will simply <em>remove plug-in&#8217;s files locally</em>. The second one will invoke plug-in <strong>configuration dialog</strong>.</p>

<p><strong>&#8216;Available&#8217; tab</strong> will show <em>plug-ins available <strong>on-line</strong></em> for download. Maybe using <a href="http://capuchin.k-d-w.org/" >Capuchin</a>.</p>

<p><strong>Suggestions</strong> on this one are <em>really appreciated</em>, as <strong>this is what final user will mainly see</strong>.</p>

<p><strong>Plugins window is accessible</strong> through <code>Edit/Plugins</code> menu item in Gajim&#8217;s roster (just below <code>Preferences</code>) - visible on screenshot.</p>

<p><a href="http://blog.bilinski.it/wp-content/gallery/screenshots/gajim-roster-with-plugins-menuitem.png"  title="Roster &#039;Edit&#039; menu with &#039;Plugins&#039; item - used to open plugins management window."  class="thickbox"  rel="singlepic8" ><img class="ngg-singlepic ngg-right"  src="http://blog.bilinski.it/wp-content/plugins/nextgen-gallery/nggshow.php?pid=8&amp;width=&amp;height=&amp;mode="  alt="gajim-roster-with-plugins-menuitem.png"  title="gajim-roster-with-plugins-menuitem.png" /></a></p>

<p>GUI is built using <a href="http://glade.gnome.org/" >Glade 3</a> with some parts, like <a href="http://www.pygtk.org/docs/pygtk/class-gtktreemodel.html" >gtk.TreeModel</a> handling (used to store plug-ins list), in <a href="http://trac.gajim.org/browser/branches/plugin-system/src/plugins/gui.py?rev=9762#L37" >Python code</a>. This approach is <em>consistent with current Gajim code</em>.</p>

<h4>Acronyms Expander plugin</h4>

<p><strong>Message Length Notifier</strong> plug-in is useful but it&#8217;s <em>not much to play with</em>. So, I&#8217;ve implemented <em>another plug-in for users to test</em> - it&#8217;s a well-know (to many) <strong>Acronyms Expander</strong>.</p>

<p><strong>It works <em>&#8220;live&#8221;</em></strong>, so the substitution takes places <em>while typing message</em>. Below are <strong>hardcoded expansions of acronyms</strong>. This will be, of course, <strong>configurable</strong>, once I implement <em>settings saving for plug-ins</em>.</p>

<table>
<thead>
<tr>
  <th>Acronym</th>
  <th>Substitution</th>
</tr>
</thead>
<tbody>
<tr>
  <td>RTFM</td>
  <td>Read The Friendly Manual</td>
</tr>
<tr>
  <td>/slap</td>
  <td>/me slaps</td>
</tr>
<tr>
  <td>PS-</td>
  <td>plug-in system</td>
</tr>
<tr>
  <td>G-</td>
  <td>Gajim</td>
</tr>
<tr>
  <td>GNT-</td>
  <td>http://trac.gajim.org/newticket</td>
</tr>
<tr>
  <td>GW-</td>
  <td>http://trac.gajim.org/</td>
</tr>
<tr>
  <td>GTS-</td>
  <td>http://trac.gajim.org/report</td>
</tr>
</tbody>
</table>

<p>Currently the only <strong>invoker of expansion</strong> is <code>' '</code> <em>(space)</em>.</p>

<p>To implement this plug-in for <strong>both, chat and group chat, windows</strong> I&#8217;ve added <a href="http://trac.gajim.org/browser/branches/plugin-system/src/chat_control.py?rev=9777#L295" >new GUI extension point</a>. It&#8217;s called <code>'chat_control_base'</code> and is situated in <a href="http://trac.gajim.org/browser/branches/plugin-system/src/chat_control.py?rev=9777#L64" >ChatControlBase class</a>.</p>

<p><a href="http://trac.gajim.org/browser/branches/plugin-system/plugins/acronyms_expander.py?rev=9777" >Acronyms Expander plug-in</a> works well (<em>without conflicts</em>) with <a href="http://trac.gajim.org/browser/branches/plugin-system/plugins/length_notifier.py?rev=9777" >Message Length Notifier</a>.</p>

<h4>Unsolved cases and thoughts on upcoming challenges</h4>

<p><strong>Plug-in&#8217;s config</strong></p>

<p><em>Main issue</em> to solve now is <strong>configuration saving for plug-ins</strong>. We could <em>pickle data to plain-text</em> file, but it&#8217;s <strong>hard to read and modify</strong> - <em>not human-readable</em>, really. However, it&#8217;s <strong>fast and very general</strong> - plug-in could save anything.</p>

<p>Another approach would be to <em>extend</em> <a href="http://docs.python.org/lib/module-ConfigParser.html" >ConfigParser</a> and implement cases of list (<em>read from str</em>) and maybe other types. Here, <strong>format is easy to read/modify</strong> outside Gajim (<em>eg .using text editor</em>). Unfortunately, AFAIK <code>ConfigParser</code> (as mentioned) does <strong>not support lists storage</strong> by default. So, we would have to <strong>use</strong> <code>eval()</code> function, and we want to avoid that (due to security reasons).</p>

<p>We could also use <a href="http://www.voidspace.org.uk/python/configobj.html" >ConfigObj</a>, but it would be <strong>another dependency</strong> - not sure if it&#8217;s worth that.</p>

<p>Apart from problem called <strong>&#8216;how&#8217;</strong> there&#8217;s also a question of <strong>&#8216;where&#8217;</strong>. Probably, we&#8217;ll make <strong>separate config file for each plug-in</strong>. Sounds <em>really reasonable</em>, because one plug-in <strong>won&#8217;t mess up configuration file</strong> of another one.</p>

<p><strong>PluginManager refactoring</strong></p>

<p>I&#8217;ve, recently, realized that we might want to <strong>configure plug-in when it&#8217;s deactivated</strong>. In such case, I have to <em>reorganize <code>PluginManager</code></em> a little bit.</p>

<p><strong>Current version:</strong> keep <em>class object for plug-in</em> itself and <em>instance object for activated plug-in</em>.</p>

<p><strong>Future version:</strong> keep <em>instance object</em> and <em>call</em> <code>initialize()</code>, <code>destroy()</code> methods when plug-in is <em>activated/deactivated</em> - these would have to <strong>implemented by each plug-in</strong>.</p>

<p><strong>Automatic handlers (un)registration</strong> will be left <strong>untouched</strong>.</p>

<p>I could <em><strong>leave</strong> code as it is</em>. But <em>dealing with configuration at <strong>class object level</strong></em> would be a <strong>&#8216;programming abuse&#8217;</strong> IMHO.</p>

<p><strong>Extension points clean-up</strong></p>

<p><em>GUI extension point</em> <strong>clean-up</strong> is still <strong>unsolved</strong>. Extensions points called from objects that are <strong>not referenced by Gajim core anymore</strong>, should be removed. Currently, they are not deleted. Objects are still somewhere in memory, although not used, because they are on <em>GUI extension points list</em> in <code>PluginManager</code>).</p>

<p><strong>Further tasks:</strong></p>

<ul>
<li>start <strong>playing with network/xmpp events</strong>. Walk around code and think of <em>events hierarchy and implementation</em>.</li>
<li>work on <strong>events generated by Gajim</strong> itself (like <code>'AccountConnected'</code>) (proposed by <a href="http://xbright.codingteam.net" >xbright</a>). We would have to determine which <strong>events do we need</strong> and give plug-ins possibility to <strong>handle</strong> them. Signals are already <strong>generated for Gajim&#8217;s remote control</strong> - this looks like a <a href="http://trac.gajim.org/browser/branches/plugin-system/src/remote_control.py?rev=9777#L105" >good starting point</a>.</li>
</ul>


]]></content:encoded>
			<wfw:commentRss>http://blog.bilinski.it/2008/06/10/gsoc-2008-gajim-has-gui-for-plug-ins-management-report-2/feed/</wfw:commentRss>
		</item>
		<item>
		<title>GSoC 2008 - Gajim loads plug-ins. Report #1</title>
		<link>http://blog.bilinski.it/2008/06/04/gsoc-2008-gajim-loads-plug-ins-report-1/</link>
		<comments>http://blog.bilinski.it/2008/06/04/gsoc-2008-gajim-loads-plug-ins-report-1/#comments</comments>
		<pubDate>Wed, 04 Jun 2008 11:29:29 +0000</pubDate>
		<dc:creator>Mateusz Biliński</dc:creator>
		
		<category><![CDATA[Post]]></category>

		<category><![CDATA[Apps]]></category>

		<category><![CDATA[Gajim]]></category>

		<category><![CDATA[Google]]></category>

		<category><![CDATA[GSoC]]></category>

		<category><![CDATA[GTD]]></category>

		<category><![CDATA[IDE]]></category>

		<category><![CDATA[IT]]></category>

		<category><![CDATA[Open-Source]]></category>

		<category><![CDATA[Plugin]]></category>

		<category><![CDATA[PM]]></category>

		<category><![CDATA[Python]]></category>

		<category><![CDATA[Report]]></category>

		<category><![CDATA[Software]]></category>

		<category><![CDATA[WingIDE]]></category>

		<guid isPermaLink="false">http://blog.bilinski.it/?p=19</guid>
		<description><![CDATA[<div class="postavatar"><img class="post-avatar-img" src="http://blog.bilinski.it/wp-content/uploads/icons/gajim/gajim-ipython-icon-smaller.png" style="width:96px;height:96px;float:left; margin: 0.1em 2em 0.1em 0.5em;" alt="gsoc-2008-gajim-loads-plug-ins-report-1" border="0" /></div>
More than a week passed since GSoC kick-off meeting took place. So it&#8217;s time to summarize a little bit.

For those that don&#8217;t like reading longer posts - in short: Gajim (de)activates plug-ins
while running and first plug-in works pretty nice. Detailed
report follows.



At the beginning&#8230;

&#8230;there was creation of new branch in Gajim&#8217;s Subversion repository, dedicated to plug-in [...]]]></description>
			<content:encoded><![CDATA[<div class="postavatar"><img class="post-avatar-img" src="http://blog.bilinski.it/wp-content/uploads/icons/gajim/gajim-ipython-icon-smaller.png" style="width:96px;height:96px;float:left; margin: 0.1em 2em 0.1em 0.5em;" alt="gsoc-2008-gajim-loads-plug-ins-report-1" border="0" /></div>
<p><strong>More than a week passed since GSoC kick-off meeting took place. So it&#8217;s time to summarize a little bit.</strong></p>

<p>For those that <em>don&#8217;t like reading longer posts</em> - in short: Gajim (de)<strong>activates plug-ins</strong>
while running and <strong>first plug-in works</strong> pretty nice. Detailed
report follows.</p>

<p><span id="more-19" ></span></p>

<h5>At the beginning&#8230;</h5>

<p>&#8230;there was <strong>creation of <a href="http://trac.gajim.org/browser/branches/plugin-system" >new branch</a></strong> in <a href="http://trac.gajim.org/browser" >Gajim&#8217;s Subversion repository</a>, dedicated to plug-in system
(<a href="http://trac.gajim.org/changeset/9703" >[9703]</a>). Thanks to this, I&#8217;m independent from <em>trunk</em> and what is going on there (aka <em>I-won&#8217;t-break-trunk</em>). Main problem here is that merging branches in Subversion might be pretty painful.</p>

<p>But still (nevertheless <em>I&#8217;ve been warned</em> by <a href="http://www.kismith.co.uk/" >Kev</a>), I&#8217;ve <em>decided to use it instead of DVCS</em> like <a href="http://git.or.cz/" >Git</a> or <a href="http://www.selenic.com/mercurial/wiki/" >Mercurial</a>. Mostly because of two things:</p>

<ul>
<li>plug-in system <strong>won&#8217;t make many changes to current Gajim core</strong> (so it might not be so hard to merge branches at the end) and <em>Subversion</em> is already there, working.</li>
<li>I bought <a href="http://www.wingware.com/wingide" >Wing IDE Professional</a> about two weeks ago and I wanted to have support for <a href="http://en.wikipedia.org/wiki/Version_control_system" >VCS</a> within <a href="http://en.wikipedia.org/wiki/Integrated_Development_Environment" >IDE</a>. Unfortunately, <em>WingIDE</em> supports only <a href="http://subversion.tigris.org/" >SVN</a>, <a href="http://www.nongnu.org/cvs/" >CVS</a> na <a href="http://www.perforce.com/" >Perforce</a>.</li>
</ul>

<h4>Wing IDE - Python helper for project new-comers</h4>

<p><a href="http://blog.bilinski.it/wp-content/gallery/screenshots/gsoc-wingide-gajim-screenshot.png"  title="Debugging plug-in system for Gajim in Wing IDE Professional."  class="thickbox"  rel="singlepic6" ><img class="ngg-singlepic ngg-right"  src="http://blog.bilinski.it/wp-content/plugins/nextgen-gallery/nggshow.php?pid=6&amp;width=300&amp;height=300&amp;mode="  alt="gsoc-wingide-gajim-screenshot.png"  title="gsoc-wingide-gajim-screenshot.png" /></a></p>

<p>After some time, it occurred that the second statement (in the list above) is <em>not necessarily a good argument</em>. This is because, <em>SVN</em> support <em>Wing IDE</em> is <strong>not the best I&#8217;ve ever seen</strong>. To be honest - it&#8217;s pretty basic compared to <a href="http://www.netbeans.org/" >Netbeans</a> or <a href="http://www.eclipse.org/" >Eclipse</a>. I ended up using console to interact with SVN - it&#8217;s more handy. <img src="http://blog.bilinski.it/wp-includes/images/smilies/icon_smile.gif"  alt=":)"  class="wp-smiley" /> </p>

<p>However, <strong>Wing IDE is a great tool to explore Python code</strong>. It&#8217;s <strong>source code analysis</strong> is probably the best one available on the market. Whole <em>IDE</em> is pretty <strong>fast</strong>, has <strong>nice debugging facility</strong> and <strong>integration with PyLint</strong>. <strong>Automatic indentation checks</strong> are pretty handy to keep code consistent with <em>Gajim&#8217;s core</em>. In fact, there&#8217;s a <strong>small clean-up commit in trunk</strong> that is the effect of using this feature in <em>Wing IDE</em>: <a href="http://trac.gajim.org/changeset/9704" >[9704]</a></p>

<p>Some things that <strong>WingIDE <em>badly lacks</em></strong> (apart from <strong>DVCS support</strong>):</p>

<ul>
<li><strong>movable tabs</strong></li>
<li><strong>all-at-once highlighting</strong> when searching</li>
<li><strong>show-all-usages</strong> of function/class/variable (there&#8217;s only <em>&#8216;go to definition&#8217;</em>). Someone even posted <a href="http://wingware.com/pipermail/wingide-users/2008-June/005494.html" >feature request</a> for this today on <a href="http://wingware.com/lists/wingide" >wingide-users</a> mailing list.</li>
</ul>

<p>So much for the <em>IDE</em> I use during <a href="http://code.google.com/soc/2008/" >GSoC</a>. <strong>Going back to project</strong> itself.</p>

<h4>Few words about trials of Getting Things Done</h4>

<p>First of all, I&#8217;ve decided to use <a href="http://www.artima.com/intv/tracer.html" >tracer bullets</a> approach for my GSoC project. I think <strong>three things are important</strong> for me in this method:</p>

<ul>
<li>I <strong>meet problems</strong> that I wouldn&#8217;t imagine (<em>in finite time</em>), keeping all the ideas and code only in my <a href="http://www.thefreedictionary.com/gray+matter" >gray matter</a>. There are lots of things that you can miss or forget. However, Paper-And-Pencil(tm) application might slightly reduce this problem.</li>
<li>I can get <strong>feedback from people</strong> early, because some code begins to work pretty fast. Of course it&#8217;s not perfect. Many elements need polishing or modifications, but still - <strong>the code works</strong>.</li>
<li>Unfortunately I have other projects that I have to work on in parallel, so <em>thinking about project</em> only and <em>no coding</em> would probably end-up in <strong>freaking out</strong> (being overwhelmed by amount of work to be done)</li>
</ul>

<p>This way, <strong>I move forward</strong>. Sometimes making bigger steps, sometime smaller, but permanently towards building plug-in system for Gajim.</p>

<p>What I&#8217;ve noticed, is that using this approach I <strong>always know what to do next</strong>. Not only at general level of project by also at code level.</p>

<p>I&#8217;m lucky because I write my <em>GSoC project in Python</em> which simply <strong>makes prototyping fun</strong>.</p>

<p>I admit I <strong>feel inspired</strong> by <a href="http://www.amazon.co.uk/Getting-Things-Done-Stress-free-Productivity/dp/0749922648" >&#8220;Getting Things Done&#8221;</a> that I got from <a href="http://www.xmpp.org/" >XSF</a> (<strong><a href="https://stpeter.im/" >stpeter</a>, <a href="http://www.kismith.co.uk/" >Kev</a></strong>: Thanks, once again). I especially liked paragraphs about <a href="http://en.wikipedia.org/wiki/Procrastination" >procrastination</a> <img src="http://blog.bilinski.it/wp-includes/images/smilies/icon_wink.gif"  alt=";)"  class="wp-smiley" /> </p>

<h4>Initial commits and testing</h4>

<p>After creating own branch and doing some coding I&#8217;ve commited a few files (<a href="http://trac.gajim.org/changeset/9737" >[9737]</a>). Later, some improvements were made (<a href="http://trac.gajim.org/changeset/9745" >[9745]</a>,
<a href="http://trac.gajim.org/changeset/9754" >[9754]</a>). Resulting code has:</p>

<ul>
<li>new package called <a href="http://trac.gajim.org/browser/branches/plugin-system/src/plugins?rev=9754" >plugins</a> where I keep code related to plug-ins system</li>
<li><a href="http://trac.gajim.org/browser/branches/plugin-system/src/plugins/pluginmanager.py?rev=9745" >PluginManager</a> class where all plug-in management related actions are placed</li>
<li><a href="http://trac.gajim.org/browser/branches/plugin-system/src/plugins/plugin.py?rev=9754" >GajimPlugin</a> class that is supposed to be the base of of all plug-ins. All subclasses of it are treated as plug-ins.</li>
<li><a href="http://trac.gajim.org/browser/branches/plugin-system/src/plugins/helpers.py?rev=9754" >helpers</a> module that includes: Singleton class, customized logger and functions decorator that logs when function is enter and when left</li>
<li><a href="http://trac.gajim.org/browser/branches/plugin-system/test/test_pluginmanager.py?rev=9754" >test_pluginmanager.py</a> file that holds tests (or I should say: <em>one test</em>) of <em>PluginManager</em> class</li>
<li>additional variable <a href="http://trac.gajim.org/browser/branches/plugin-system/src/common/gajim.py?rev=9754#L89" >common.gajim.PLUGINS_DIRS</a> where directories to seek plugins are hardcoded. Maybe later we&#8217;ll decide to <em>move it to config file</em>.</li>
<li><a href="http://trac.gajim.org/browser/branches/plugin-system/src/chat_control.py?rev=9754#L1143" >first call</a> of <strong>GUI extension point</strong> in <a href="http://trac.gajim.org/browser/branches/plugin-system/src/chat_control.py?rev=9754#L1019" >ChatControl</a> class</li>
<li><strong>first plugin</strong> that makes use of this extension point was implemented. It&#8217;s called <a href="http://trac.gajim.org/browser/branches/plugin-system/plugins/length_notifier.py?rev=9754" >Length Notifier</a>. I mentioned it in previous post when in was in a form of <a href="http://en.wikipedia.org/wiki/Monkey_patch" >monkey patch</a>. It <strong>highlights message entry field</strong> when given length of text in exceeded. Pretty useful with <em>microblogging bots</em>, eg. <a href="http://twitter.com/" >Twitter</a>. </li>
</ul>

<p><strong>Notes on PluginManager:</strong> directories are scanned for <strong>&#8216;&#42;.py&#8217; files</strong> in which they search for <em>GajimPlugin</em> subclasses; <em>plugins</em> themvelves are held as <em>class objects</em> in list (maybe I&#8217;ll change it to <em>set</em>), while <em>activated plugins</em> are held as <em>instance objects</em> in separate (also) list;</p>

<p><strong>Notes on Singleton:</strong> this implementation calls <em>&#95;&#95;init&#95;&#95;</em> only once in contradiction to version that is in <a href="http://www.amazon.com/Python-Cookbook-Alex-Martelli/dp/0596001673" >&#8220;Python Cookbook&#8221;</a>; I&#8217;ve been warned by <a href="http://www.kismith.co.uk/" >Kev</a> that <em>singletons</em> might be deadly. So I&#8217;ll have to decide , whether I really want (need?) only one instance of <em>PluginManager</em>, before <em>releasing plug-in system</em> to the World.</p>

<p><strong>Notes on LengthNotifierPlugin:</strong> some data (i.e. handler IDs) needs to be <strong>stored per object</strong>, this is done by <em>assigning dictonary</em> to object <em>as new attribute</em>; this is a simple solution and <em>Python</em> allows such approach, so why don&#8217;t do it this way? Plug-in developer, of course, <strong>can modify object in any way he wants</strong>. One of such modifications is saving data to object.</p>

<p><strong>Notes on testing:</strong> I&#8217;ve copied some initial code from <strong>bct</strong>&#8217;s <a href="http://trac.gajim.org/browser/trunk/test/test_sessions.py?rev=9754" >tests on sessions</a>. Unfortunately, we have to make some dummy objects, to get tests run. Without that there are exception like <em>NameError</em> or <em>ImportError</em> - it&#8217;s mostly related to configuration. This <strong>init-hacking</strong> part will be probably <strong>extracted to separate module</strong><sup id="fnref:1" ><a href="#fn:1"  rel="footnote" >1</a></sup> as it seems, that all tests will need it.</p>

<h4>API docs and Epydoc</h4>

<p>Probably I could write even <em>more descriptions of code</em> here, but a better solution is to keep all this information closer to code - yes, <strong>in code documentation</strong> <img src="http://blog.bilinski.it/wp-includes/images/smilies/icon_wink.gif"  alt=";)"  class="wp-smiley" /> </p>

<p>I <a href="https://www.lagaule.org/pipermail/gajim-devel/2008-May/000407.html" >started discussion</a> about documentation standards last week, because I wanted to <em>create docs in format consistent</em> with the rest of Gajim&#8217;s code.</p>

<p>The result of discussion can be seen here: <a href="http://gajim.org/apidocs/" >http://gajim.org/apidocs/</a> .</p>

<p>The decision was made to use <a href="http://epydoc.sourceforge.net/manual-othermarkup.html" >reStructuredText syntax</a> for documenting and <a href="http://epydoc.sourceforge.net/" >Epydoc</a> for <strong>API docs generation</strong>. It was chosen because it&#8217;s <strong>Python dedicated</strong> and <strong>permanently under development</strong> with new features in each release.</p>

<p>The use of <a href="" >reStructeredText</a> seems to be a reasonable one, because, as mentioned by <a href="https://www.lagaule.org/pipermail/gajim-devel/2008-May/000415.html" >Torsten Bronger</a>, there&#8217;s a <a href="http://www.python.org/dev/peps/pep-0287/" >PEP</a> on using it in Python code documentation (this makes it, more less, a <em>standard</em>). Apart from that, <em>reST</em> syntax in <em>Epydoc</em> has <a href="http://epydoc.sourceforge.net/manual-othermarkup.html" >consolidated lists</a> which <strong>makes docstrings more readable</strong>, IMHO.</p>

<h4>Targets for (not so) near future</h4>

<p>Things that I <strong>plan to do next</strong>:</p>

<ul>
<li><strong>short-term</strong>: 

<ul>
<li>make <strong>erasing GUI extension points</strong> possible (currently: references stay on list in <em>PluginManager</em> even if <em>Gajim</em> doesn&#8217;t have interest in them anymore)</li>
<li>decide on how to <strong>store plug-ins config</strong> - first shot here would be to generate API for plug-in developers, implement some local  saving/loading with <a href="http://docs.python.org/lib/module-pickle.html" >pickle</a> and later integrate with current mechanism that Gajim use for configuration. All of this is because <strong>present <a href="http://trac.gajim.org/browser/branches/plugin-system/src/common/config.py?rev=9754" >Config</a> class is pretty restrictive</strong>. I&#8217;ve already had discussion about it with <em>Jim++</em>.</li>
</ul></li>
<li><strong>long(er)-term</strong>:

<ul>
<li><strong>GUI for plug-ins management</strong> - to get more feedback from users. If there&#8217;s GUI <em>more people may feel encouraged</em> to test the branch.</li>
<li><strong>scan for packages and zipped code</strong>, not only for module files</li>
<li>add <strong>GUI extension point for roster</strong> and for <strong>one of context menus in it</strong> - this will cover most of the GUI that potential plug-in developers are interested in</li>
<li>discuss about <strong>handling events</strong>, filtering them - generally, the network-related part of <em>GSoC</em></li>
</ul></li>
</ul>

<p>To see more <strong>TODO and BUGS</strong> info checkout docstrings in <a href="http://trac.gajim.org/browser/branches/plugin-system" >plugin-system branch</a>.</p>

<p><strong>Ending note:</strong> I don&#8217;t know whether such (more less) <em>detailed reports</em> make sense. It <em>took me some time</em> to write it. I&#8217;ve spotted that, especially, creating links consumed a lot of time. Maybe I&#8217;ll have to look for <em>abbreviations plug-in for Wordpress</em>. Another solution would be to <em>put only summary</em> here and point to detailed descriptions in <em>docstrings</em> or <em>changesets</em>.</p>

<p>Any <em>suggestions appreciated</em> - <strong>have you found all this info useful?</strong></p>

<div class="footnotes" >
<hr/>
<ol>

<li id="fn:1" >
<p>As <a href="http://blog.lagaule.org/" >Asterix</a> <a href="https://www.lagaule.org/pipermail/gajim-devel/2008-May/000411.html" >mentioned recently</a> on <em>gajim-devel</em> mailing list.&#160;<a href="#fnref:1"  rev="footnote" >&#8617;</a></p>
</li>

</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.bilinski.it/2008/06/04/gsoc-2008-gajim-loads-plug-ins-report-1/feed/</wfw:commentRss>
		</item>
		<item>
		<title>GSoC 2008 - So, I’m accepted. Quick report and initial thoughts.</title>
		<link>http://blog.bilinski.it/2008/04/26/gsoc-2008-so-im-accepted-quick-report-and-initial-thoughts/</link>
		<comments>http://blog.bilinski.it/2008/04/26/gsoc-2008-so-im-accepted-quick-report-and-initial-thoughts/#comments</comments>
		<pubDate>Fri, 25 Apr 2008 22:15:09 +0000</pubDate>
		<dc:creator>Mateusz Biliński</dc:creator>
		
		<category><![CDATA[Post]]></category>

		<category><![CDATA[Apps]]></category>

		<category><![CDATA[Gajim]]></category>

		<category><![CDATA[Google]]></category>

		<category><![CDATA[GSoC]]></category>

		<category><![CDATA[IT]]></category>

		<category><![CDATA[Open-Source]]></category>

		<category><![CDATA[Python]]></category>

		<category><![CDATA[Report]]></category>

		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://blog.bilinski.it/?p=18</guid>
		<description><![CDATA[<div class="postavatar"><img class="post-avatar-img" src="http://blog.bilinski.it/wp-content/uploads/icons/gsoc/soc08-198x128_black.jpg" style="width:198px;height:128px;float:left; margin: 0.1em 2em 0.1em 0.5em;" alt="gsoc-2008-so-im-accepted-quick-report-and-initial-thoughts" border="0" /></div>
Almost 4 days ago Google announced list of 1125 fortunate students that will be developing open-source projects this summer and get paid for it. Luckily, I&#8217;m within this group - here&#8217;s my quick report and initial thoughts.

I&#8217;ll probably end up with &#8220;initial report and quick thoughts&#8221;. Nevertheless, if you don&#8217;t know what Google Summer of [...]]]></description>
			<content:encoded><![CDATA[<div class="postavatar"><img class="post-avatar-img" src="http://blog.bilinski.it/wp-content/uploads/icons/gsoc/soc08-198x128_black.jpg" style="width:198px;height:128px;float:left; margin: 0.1em 2em 0.1em 0.5em;" alt="gsoc-2008-so-im-accepted-quick-report-and-initial-thoughts" border="0" /></div>
<p><strong>Almost 4 days ago <a href="http://google-opensource.blogspot.com/2008/04/announcing-accepted-student-proposals.html" >Google announced</a> list of <strong>1125</strong> fortunate students that will be developing open-source projects this summer and get paid for it. Luckily, I&#8217;m within this group - here&#8217;s my quick report and initial thoughts.</strong></p>

<p>I&#8217;ll probably end up with &#8220;initial report and quick thoughts&#8221;. Nevertheless, if you don&#8217;t know what Google Summer of Code is, check out <a href="http://code.google.com/soc/2008" >official program website</a> or <a href="http://en.wikipedia.org/wiki/Google_Summer_of_Code" >Wikipedia</a>. In short, one may compare it to normal <em>software development internship</em>, except two differences: you work on <strong><em>real</em> open-source projects</strong> and <strong>coding is done <em>remotely</em></strong> from where you reside currently (probably home, in most cases). This has a few consequences.</p>

<p><span id="more-18" ></span></p>

<p><a href="http://blog.bilinski.it/wp-content/gallery/charts/gsoc-accepted_proposals_statistics.png"  title="Google Summer of Code - approx. statistics on accepted student proposals (including 2008)."  class="thickbox"  rel="singlepic2" ><img class="ngg-singlepic ngg-right"  src="http://blog.bilinski.it/wp-content/plugins/nextgen-gallery/nggshow.php?pid=2&amp;width=300&amp;height=300&amp;mode="  alt="gsoc-accepted_proposals_statistics.png"  title="gsoc-accepted_proposals_statistics.png" /></a></p>

<p>First of all, your <strong>coding time is flexible</strong>. You can code in the morning, you can code after midnight. <strong>For US students</strong> this may not be such a big advantage, because they start summer holidays when GSoC starts (end of May). <strong>In Europe however</strong>, students end academic semester <em>at least a month later</em>. Yes, yes - you have to code during exam sessions, which is why flexible working time is so important.</p>

<p>Second of all, you get <strong>rich contact with leaders of open-source communities</strong>. If you have Linux box <em>you probably use software from at least one third of them</em>, if you&#8217;re a software developer, then from more than a half. This year there are <strong><em>175 organizations</em></strong> involved in program (although I&#8217;ve counted 177 on <a href="http://code.google.com/soc/2008" >official list</a> - duplicates?). Generally they divide into two categories: <em>umbrella orgs</em>, like <a href="http://code.google.com/soc/2008/psf/about.html" >Python Software Foundation</a> or <a href="http://code.google.com/soc/2008/xmpp/about.html" >XMPP Standards Foundation</a>, and <em>single-project</em> orgs, like <a href="http://code.google.com/soc/2008/wordpress/about.html" >Wordpress</a> and <a href="http://code.google.com/soc/2008/bzflag/about.html" >BZFlag</a>.</p>

<p>All of this is done to reduce <a href="http://en.wikipedia.org/wiki/Bus_factor" >bus factor</a> of valuable open-source projects. However, life shows<sup id="fnref:1" ><a href="#fn:1"  rel="footnote" >1</a></sup> that <em>only a small percentage of participants stays in communities</em> after GSoC, so probably it&#8217;s a subject for improvement.</p>

<p><a href="http://blog.bilinski.it/wp-content/gallery/charts/gsoc-money-given-out-by-google-to-students-and-orgs.png"  title="Google Summer of Code - approx. overall money given out by Google to students and orgs (including 2008)."  class="thickbox"  rel="singlepic3" ><img class="ngg-singlepic ngg-left"  src="http://blog.bilinski.it/wp-content/plugins/nextgen-gallery/nggshow.php?pid=3&amp;width=300&amp;height=300&amp;mode="  alt="gsoc-money-given-out-by-google-to-students-and-orgs.png"  title="gsoc-money-given-out-by-google-to-students-and-orgs.png" /></a></p>

<h5>GSoC evolution</h5>

<p>In 2008, GSoC has it&#8217;s 4th edition. And it is getting bigger each year. In 2005 there were <strong>416</strong> accepted proposals, this year there are <strong>1125</strong>. Basically at the end of this year, if everything goes as planned,  Google will have given out around 15,000,000$ to students and orgs overall (during 4 years).  I&#8217;ve prepared two charts to visualize this - one with <strong>stats about accepted proposals</strong> and the other one showing <strong>Google&#8217;s financial engagement</strong>. These should be floating somewhere around here. Generally &#8220;The Company&#8221; spends <strong>5000$ per proposal</strong> (4500$ for student and 500$ for mentoring org), if it&#8217;s fully successful (AFAIK success rate of GSoC is around 90-95%). Apart from this they&#8217;ve probably spent lots of money on administrative part.</p>

<p>In comparison: <a href="http://code.google.com/opensource/ghop/2007-8/" >GHOC</a> is much smaller and <a href="http://code.google.com/android/adc.html" >Android Challange</a> is a promotion event with $10 million for awards. I&#8217;m wondering when there will be similar contest for recently released <a href="http://code.google.com/appengine/" >Google App Engine</a>&#8230;</p>

<h1>Plug-in system for Gajim - my GSoC project</h1>

<p>So much for GSoC itself. This section is devoted to <strong>project I&#8217;m going to code</strong>.</p>

<p>First of all a <strong>proof</strong> that I&#8217;ve been really chosen - I&#8217;m listed at last position on the <a href="http://code.google.com/soc/2008/xmpp/about.html" >list of projects accepted by XMPP Standards Foundation</a>. I also attach small screenshot on how this looks in student&#8217;s panel, which may be considered a <em>semi-proof</em> <img src="http://blog.bilinski.it/wp-includes/images/smilies/icon_wink.gif"  alt=";)"  class="wp-smiley" /> </p>

<p><a href="http://blog.bilinski.it/wp-content/gallery/webshots/gsoc2008-application-accepted-in-students-panel.png"  title="Google Summer of Code 2008 - info about accepted proposal in student&#039;s panel."  class="thickbox"  rel="singlepic4" ><img class="ngg-singlepic ngg-right"  src="http://blog.bilinski.it/wp-content/plugins/nextgen-gallery/nggshow.php?pid=4&amp;width=300&amp;height=300&amp;mode="  alt="gsoc2008-application-accepted-in-students-panel.png"  title="gsoc2008-application-accepted-in-students-panel.png" /></a></p>

<p>Basically to get a feeling what it is all about you can read <a href="http://code.google.com/soc/2008/xmpp/appinfo.html?csaid=4DBB14A9D1CA8C7C" >abstract of my proposal</a>. If you want to get more details, jump into <a href="http://trac.gajim.org/wiki/PluginSystem?version=24" >my notes on Gajim&#8217;s wiki</a><sup id="fnref:5" ><a href="#fn:5"  rel="footnote" >2</a></sup>. These are the effect of discussions with Gajim developer&#8217;s and my thoughts on architecture. I think we&#8217;ve been able to point out each element of system that we should keep in mind while desgining and coding. During my internship at <a href="http://www.ibm.com/pl/" >IBM Polska</a> I&#8217;ve played a little bit with <a href="http://www.ibm.com/developerworks/lotus/downloads/toolkits.html#sametime" >Sametime Connect SDK</a>. This let me start concept work right ahead (about one month before proposals submit deadline).</p>

<p>Generally the target is to get <strong>basic plug-ins API working</strong> (hopefully, also stable) at the end summer. It should let developers <strong>hook into Gajim&#8217;s data flow</strong> and <strong>modify GUI</strong>. What we keep in mind all the time are possible <em>real-life plug-ins</em> that we should be able to implement based on this API. In example: XMPP over BOSH, LaTeX formula renderer, <em>server-side message archiving</em> or <a href="https://code.launchpad.net/~afflux/gajim/otr" >OTR support for Gajim</a>.</p>

<h2>What&#8217;s done so far</h2>

<p>One of <strong>Project Management principles</strong> is that <em>if you want to measure your progress precisely you have to know where you started</em> exactly. So here it goes.</p>

<p>During preparation to plug-in system coding I&#8217;ve <a href="http://trac.gajim.org/wiki/IPythonEmbeddedShell" >embedded IPython shell in Gajim</a> and it works pretty well (although there are a few issues to be solved <img src="http://blog.bilinski.it/wp-includes/images/smilies/icon_wink.gif"  alt=";)"  class="wp-smiley" /> ). It&#8217;s already in Gajim&#8217;s svn trunk and really accelerates learning source code structure. <strong>Asterix</strong> created <em>DBUS interface</em> for toggling it&#8217;s visibility, so it&#8217;s really <em>usable out-of-the-box</em> now. I&#8217;ve tuned my local version a little bit (see attached screenshot).</p>

<p><a href="http://blog.bilinski.it/wp-content/gallery/screenshots/customized-gajim-ipython-embedded-shell.png"  title="Customized Gajim&#039;s IPython embedded shell window."  class="thickbox"  rel="singlepic5" ><img class="ngg-singlepic ngg-left"  src="http://blog.bilinski.it/wp-content/plugins/nextgen-gallery/nggshow.php?pid=5&amp;width=300&amp;height=300&amp;mode="  alt="customized-gajim-ipython-embedded-shell.png"  title="customized-gajim-ipython-embedded-shell.png" /></a></p>

<p>I&#8217;ve been able to <a href="http://en.wikipedia.org/wiki/Monkey_patch" >duck punch</a> GUI in a few places in a similar way it will be extended using plug-in system. Some <strong>proof-of-concept modifications</strong> were made to roster (static GUI) and roster context menus (dynamically generated GUI).</p>

<p>As a more useful proof-of-concept I&#8217;ve written <strong>&#8220;live&#8221; acronyms expander</strong> that works pretty nicely, so I already have code to put within plug-in API. I&#8217;ve also made maximum length notifier<sup id="fnref:2" ><a href="#fn:2"  rel="footnote" >3</a></sup> which I find pretty useful when using Twitter <sup id="fnref:3" ><a href="#fn:3"  rel="footnote" >4</a></sup>. I&#8217;ve made some trips around source code too, learning a few things from <strong>Asterix</strong> and <strong>Steve-e</strong>.</p>

<p>In short, <strong>plans for nearest future:</strong> determine places (exact lines) where we could add <strong>GUI extension points</strong>, design and write some basic API and <strong>basic plug-in manager</strong> to load modifications on start-up. After getting this running, I&#8217;ll get back to <strong>events handling system</strong> and work there on fundamentals to make this element extensible<sup id="fnref:4" ><a href="#fn:4"  rel="footnote" >5</a></sup>.</p>

<p>We&#8217;ll probably <em>update schedule on-line</em> to make it reasonable. I think the key to success here is to <strong>keep in touch with mentor as much as possible</strong>.</p>

<h1>XSF GSoC 2008 Community</h1>

<p>Speaking of which, I think that I <strong>won&#8217;t have any mentor-student communication problems</strong>. The forementioned <strong>Asterix</strong> is <a href="http://blog.lagaule.org/" >Yann Leboulanger</a> - my project mentor. He&#8217;s a kind of person that&#8217;s really <em>opened for community and newcomers</em>, and as <strong>Gajim&#8217;s lead developer</strong> keeps development on track. I also regularly talk with <strong>Steve-e</strong> about plug-in system and source code structure. And there&#8217;s lots of other helpful community members - you can check it out by joining <a href="xmpp:gajim@conference.gajim.org?join" >Gajim conference room</a>.</p>

<p>Apart from Gajim society, I&#8217;m also part of <strong>XSF GSoC 2008 community</strong> - it counts <strong>6 students</strong> (3xPoland, Czech Republic, Russia, Turkey) and <strong>5 mentors</strong> (2xUSA, Belgium, France, UK). I&#8217;ve put them all on <em>Google Map</em> (shown at the bottom) to visualize what are our geographical relations.</p>

<p>We have our own <strong>secret mailing-list</strong> and even more <strong>secret conference room</strong> <img src="http://blog.bilinski.it/wp-includes/images/smilies/icon_wink.gif"  alt=";)"  class="wp-smiley" /> Generally the leaders here are <a href="https://stpeter.im/" >Peter Saint-Andre</a> and <a href="http://kismith.co.uk" >Kevin Smith</a>. The latter one came up with a great idea to keep us inspired all the time during GSoC - each of us is going to get two classic books: <a href="http://www.amazon.com/Getting-Things-Done-Stress-Free-Productivity/dp/0670899240/" >&#8220;Getting things done&#8221;</a> and <a href="http://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X/" >&#8220;The Pragmatic Programmer&#8221;</a>. We&#8217;ll also probably have a chance to <strong>put a few bullets in each others heads</strong>, in the name of <strong>&#8220;community bonding&#8221;</strong>, during MP FPP shooter session (title to be chosen). I&#8217;ll probably suck rock pretty badly but maybe <a href="http://gislan.utumno.pl/" >gislan</a> or <a href="http://senu.rootnode.eu/blog/" >senu</a> will be able to defend our national pride <img src="http://blog.bilinski.it/wp-includes/images/smilies/icon_wink.gif"  alt=";)"  class="wp-smiley" /> </p>

<p>Seems likes it&#8217;s the <em>end of initial report</em>. I&#8217;ll post updates on work progress when something significant happens.</p>

<p><strong>IMPORTANT NOTE:</strong> If you have any <em>comments on plug-in system in Gajim</em>, especially <em>plug-in ideas</em> and <em>thoughts on architecture</em> - <a href="mailto:mateusz@bilinski.it" >mail me</a>, <a href="xmpp:mateusz@bilinski.it" >Jabber me</a> or <em>leave a comment</em> below. Any discussion&#8217;s appreciated. <img src="http://blog.bilinski.it/wp-includes/images/smilies/icon_smile.gif"  alt=":)"  class="wp-smiley" /> </p>

<div><iframe width="530"  height="260"  frameborder="0"  scrolling="no"  marginheight="0"  marginwidth="0"  src="http://maps.google.com/maps/ms?ie=UTF8&amp;hl=en&amp;s=AARTsJq8dRECfgqmKpjZqPRaA-pnwN0F1Q&amp;msa=0&amp;msid=101996321145354304595.00044ba2ffb4ee5f13b11&amp;ll=52.05249,-42.890625&amp;spn=57.111521,175.78125&amp;z=2&amp;output=embed" ></iframe><br/><small><a href="http://maps.google.com/maps/ms?ie=UTF8&amp;hl=en&amp;msa=0&amp;msid=101996321145354304595.00044ba2ffb4ee5f13b11&amp;ll=52.05249,-42.890625&amp;spn=57.111521,175.78125&amp;z=2&amp;source=embed"  style="color:#0000FF;text-align:left"  onclick="javascript:pageTracker._trackPageview ('/outbound/maps.google.com');" >View Larger Map</a></small></div>

<div class="footnotes" >
<hr/>
<ol>

<li id="fn:1" >
<p>I&#8217;ve seen some stats (at least I think so <img src="http://blog.bilinski.it/wp-includes/images/smilies/icon_wink.gif"  alt=";)"  class="wp-smiley" /> ) about this on <a href="https://groups.google.com/group/google-summer-of-code-discuss" >GSoC discussion group</a>, but I can&#8217;t find it know ;/&#160;<a href="#fnref:1"  rev="footnote" >&#8617;</a></p>
</li>

<li id="fn:5" >
<p>Version of my notes as of proposal submission day.&#160;<a href="#fnref:5"  rev="footnote" >&#8617;</a></p>
</li>

<li id="fn:2" >
<p>After expanding defined length message textview changes color to my favourite warm orange ;)&#160;<a href="#fnref:2"  rev="footnote" >&#8617;</a></p>
</li>

<li id="fn:3" >
<p>Another idea for plug-in is to do <strong>Twitter-helper</strong> similiar to <a href="http://www.twhirl.org/" >twhirl</a> (although generally limited to usage of XMPP interface). Maybe make it a mutliple-account, all-twit-like-apps-in-one plug-in.&#160;<a href="#fnref:3"  rev="footnote" >&#8617;</a></p>
</li>

<li id="fn:4" >
<p>From current perspective it seems that it will require the greatest deal of work.&#160;<a href="#fnref:4"  rev="footnote" >&#8617;</a></p>
</li>

</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.bilinski.it/2008/04/26/gsoc-2008-so-im-accepted-quick-report-and-initial-thoughts/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Time hacking with Vim (book review)</title>
		<link>http://blog.bilinski.it/2007/10/16/time-hacking-with-vim-book-review/</link>
		<comments>http://blog.bilinski.it/2007/10/16/time-hacking-with-vim-book-review/#comments</comments>
		<pubDate>Tue, 16 Oct 2007 04:30:51 +0000</pubDate>
		<dc:creator>Mateusz Biliński</dc:creator>
		
		<category><![CDATA[Post]]></category>

		<category><![CDATA[Apps]]></category>

		<category><![CDATA[Books]]></category>

		<category><![CDATA[Hacking]]></category>

		<category><![CDATA[IT]]></category>

		<category><![CDATA[Reviews]]></category>

		<category><![CDATA[Vim]]></category>

		<guid isPermaLink="false">http://blog.bilinski.it/2007/10/16/time-hacking-with-vim-book-review/</guid>
		<description><![CDATA[<div class="postavatar"><img class="post-avatar-img" src="http://blog.bilinski.it/wp-content/uploads/icons/apps/vim95.png" style="width:95px;height:95px;float:left; margin: 0.1em 2em 0.1em 0.5em;" alt="time-hacking-with-vim-book-review" border="0" /></div>
Some time ago I committed a short, introductory lecture about Vim at popular LUMD series. This is the review of the book that starts exactly where that tutorial ends, leading to a fascinating world of Vim&#8217;s advanced features.

I&#8217;ve started with pointing out my tutorial not because it is unique, but because it is not - [...]]]></description>
			<content:encoded><![CDATA[<div class="postavatar"><img class="post-avatar-img" src="http://blog.bilinski.it/wp-content/uploads/icons/apps/vim95.png" style="width:95px;height:95px;float:left; margin: 0.1em 2em 0.1em 0.5em;" alt="time-hacking-with-vim-book-review" border="0" /></div>
<p><strong>Some time ago I committed a short, <a href="http://lumd.linux.pl/wyklady.php#wyk1"  onclick="javascript:pageTracker._trackPageview ('/outbound/lumd.linux.pl');" >introductory lecture about Vim</a> at popular <a href="http://lumd.linux.pl"  onclick="javascript:pageTracker._trackPageview ('/outbound/lumd.linux.pl');" >LUMD series</a>. This is the review of the book that starts exactly where that tutorial ends, leading to a fascinating world of Vim&#8217;s advanced features.</strong></p>

<p>I&#8217;ve started with pointing out my tutorial not because it is unique, but because it is not - as many on the web. <a href="http://www.packtpub.com/Vim/book"  onclick="javascript:pageTracker._trackPageview ('/outbound/www.packtpub.com');" >&#8220;Hacking Vim&#8221;</a> by <a href="http://www.packtpub.com/author_view_profile/id/142"  onclick="javascript:pageTracker._trackPageview ('/outbound/www.packtpub.com');" >Kim Schulz</a>, the book that is reviewed here, is a set of well selected hacks that help to deceive the time flow. A kind of set that rarely can be found printed.</p>

<p><span id="more-11" ></span></p>

<h1>What are you talking about, anyway?</h1>

<p><a href="http://www.vim.org"  onclick="javascript:pageTracker._trackPageview ('/outbound/www.vim.org');" >Vim</a> is well know for a few things from which two can be considered most popular: quitting issues after first running<sup id="fnref:1" ><a href="#fn:1"  rel="footnote" >1</a></sup>  and interesting policies of efficient text editing. If you haven&#8217;t heard of the second one check out classical <em>7 habits of effective text editing</em> by reading <a href="http://www.moolenaar.net/habits.html"  onclick="javascript:pageTracker._trackPageview ('/outbound/www.moolenaar.net');" >original text version</a> or by watching <a href="http://video.google.com/videoplay?docid=2538831956647446078"  onclick="javascript:pageTracker._trackPageview ('/outbound/video.google.com');" >video from lecture</a> by <a href="http://www.moolenaar.net/"  onclick="javascript:pageTracker._trackPageview ('/outbound/www.moolenaar.net');" >Bram Moolenaar</a> himself.</enter></esc></p>

<p>It is hard to edit text without <em>Vim</em> after getting deep into it (or even just making one step towards it). For example: I&#8217;m editing this post in <em>gVim</em> using <a href="https://addons.mozilla.org/en-US/firefox/addon/4125"  onclick="javascript:pageTracker._trackPageview ('/outbound/addons.mozilla.org');" >It&#8217;s All Text!</a> Firefox extension. Believe it or not but you can <u>steal time</u> with <em>Vim</em> and <strong>&#8220;HV&#8221;</strong> book it the easiest way to achieve it in my opinion.</p>

<h1>So, what do I get?</h1>

<p><strong>&#8220;HM&#8221;</strong> equals almost 200 well-written pages filled with good advices how to speed-up work with <em>Vim</em>. The adventure starts with short introduction that includes <u>origin</u> of the editor.</p>

<h2>I want pink background and huge fonts!</h2>

<p>Second chapter begins core text of the book. Here you can find how to easily <u>personalize highlights</u> in text or <u>add menus/toolbars</u> to your GUI. It is a good place to point out that a lot of the information placed in book can be found in manual (especially from chapter 2) but it is included in a <u>more descriptive way</u>, which makes it pleasure to learn new tips.</p>

<p><em>Vim manual</em> is a great source of information but it is <u>the ultimate</u> source which makes it hard to learn from. Personally, I&#8217;ve read almost whole <em>Vim6+</em> manual. Even though I tried most of elements mentioned there it was hard to place them in your every-day text editing. <strong>&#8220;HV&#8221;</strong> represents some small subset of manual + lots of author&#8217;s experience included in examples and explanatory notes, which is a much better way to get editing habits.</p>

<p>What I noticed is that I treat this book, as some kind o <u>diary/blog</u> (probably this common for mono-authored cookbooks) with some ideas I can confront with my every-day habits. This make this book sometime more thrilling than many narrative texts :]</p>

<p>Getting back to personalizing <em>Vim</em> author describes some <strong>version 7+ features</strong> that I have personally never used seem to be pretty useful (or at least nice-to-know): <strong>modifying tabs</strong> and <strong>tool tips</strong>.</p>

<h2>Let my fingers rest</h2>

<p>Chapters <strong>&#8220;Better Navigation&#8221;</strong> and <strong>&#8220;Production Boosters&#8221;</strong> seem to the <u>center of a book</u>, especially the second one which is packed with the newest <em>Vim7+</em> features.</p>

<p>First mentioned chapter should be a part of every-day editing of any Vim user. Mechanisms like <strong>marks</strong> or <strong>searching in multiple files</strong> really help your fingers rest. What I really liked about this part is that it includes tips about <strong>efficient searching the help system</strong>. This makes <u>readers more comfortable</u> in a Vim world after they finish reading the book.</p>

<p>As I already mention &#8220;Production Boosters&#8221; are a great selection of tips that make your <em>Vim</em> the tool more time-saving than most of the current IDE&#8217;s editors<sup id="fnref:2" ><a href="#fn:2"  rel="footnote" >2</a></sup>. If you haven&#8217;t heard about <strong>omni-completion</strong>, <strong>undo-branching</strong> or <strong>templates</strong> in <em>Vim</em> this is the chapter you should start reading with, as, in my opinion, these can be the biggest time hackers in book. Although it really depends on what you use <em>Vim</em> for.</p>

<p>If you still use handmade indentations every time, there&#8217;s a deep-in description of auto-indentation systems in <em>Vim</em> in chapter called <strong>&#8220;Advanced Formatting&#8221;</strong>. There also some solution for people that need formatting in plain text, i.e. headlines or lists. Personally I rarely need such functionality so it&#8217;s hard for me to judge how useful these tips are.</p>

<h2>Let the real hacking begin!</h2>

<p>For those that have noticed bad habits in their text editing, but haven&#8217;t found solution for them in the book, author included <strong>&#8220;Vim Scripting&#8221;</strong> chapter. After reading it one will be able to create, with full understanding, <strong>syntax-color schemes</strong>, <strong>Vim scripting</strong> and <strong>pack</strong> them to be installed by others. I must admit that this the best introduction to <em>Vim</em> scripting I&#8217;ve ever read. Mostly because it keeps constant level of complexity which makes it easily readable for everyone. This chapter takes up almost one third of a book - semi-proof that it is a comprehensive source of information at some level. If your priority is to understand codes presented in Vim <a href="http://www.vim.org/scripts/index.php"  onclick="javascript:pageTracker._trackPageview ('/outbound/www.vim.org');" >Scripts collection</a> you should start reading with this chapter.</p>

<h2>I don&#8217;t need that book - I&#8217;m a geeky, nerdy Vim h4ck3r !!!</h2>

<p>If you consider yourself a <u>real Vim hacker</u> maybe it is pointless for you to read this book. I personally think of myself as an <u>average Vim user</u> with few years experience who sometimes makes <strong>bad-habits-detection sessions</strong> and try to get rid of slow-downs. Keeping that in mind look at the pie chart below:</p>

<p align="center" > <a href="http://blog.bilinski.it/wp-content/gallery/charts/hacking_vim_vs_vardos_habits.png"  title="Comparison of tips included in &quot;Hacking Vim&quot; with review&#039;s author knowledge. "  class="thickbox"  rel="singlepic1" ><img class="ngg-singlepic"  src="http://blog.bilinski.it/wp-content/plugins/nextgen-gallery/nggshow.php?pid=1&amp;width=400&amp;height=400&amp;mode="  alt="hacking_vim_vs_vardos_habits.png"  title="hacking_vim_vs_vardos_habits.png" /></a></p>

<p>I&#8217;ve marked every tip with it&#8217;s own header with one of the three categories:</p>

<ul>
    <li>tips I <strong>know and use</strong> [<strong>37</strong> marked]</li>
    <li>tips I <strong>read about somewhere</strong> but used only once or never used [<strong>22</strong> marked]</li>
    <li>tips I have <strong>not heard of</strong> or heard very little [<strong>40</strong> marked]</li>
</ul>

<p>The results say one thing at least - if you&#8217;re a <u>typical Vim user</u> you will find at least one tip that you haven&#8217;t heard of <img src="http://blog.bilinski.it/wp-includes/images/smilies/icon_smile.gif"  alt=":)"  class="wp-smiley" /> Maybe it will be the one from <strong>life-changing</strong> category&#8230;</p>

<h1>Diamond without a scratch?!</h1>

<p>It&#8217;s always hard to find any defects of a book that one loves from the beginning. I&#8217;ve read every page of <strong>&#8220;Hacking Vim&#8221;</strong> and even though it was difficult to point about any disadvantages<sup id="fnref:3" ><a href="#fn:3"  rel="footnote" >3</a></sup>.</p>

<p>In fact there are only two things to correct: <strong>minor character errors</strong> - mainly in codes (I&#8217;ve found only a few) and <strong>used commands/settings index</strong>. This would be very helpful to get even better overview of what was mentioned in a book, but this time from scripting side. This is the only thing that made me a little bit uncomfortable during reading (just felt I miss something). However, <strong>Kim Schulz</strong> made added something more pleasant - <strong>Appendixes</strong>. With them I&#8217;ve <strong>cleaned up my configuration files</strong> and recalled that Vim can do everything - starting with games and ending with mail clients.</p>

<p>Some time ago I purchased two other books also originally published by <a href="http://www.packtpub.com/"  onclick="javascript:pageTracker._trackPageview ('/outbound/www.packtpub.com');" >Packt</a> (republished by <a href="http://helion.pl/"  onclick="javascript:pageTracker._trackPageview ('/outbound/helion.pl');" >Helion</a> in Polish language). I must admit that all three suits well to the meaning of <u>modern IT book</u>. Although, I didn&#8217;t really liked <a href="http://helion.pl/ksiazki/ajaphp.htm"  onclick="javascript:pageTracker._trackPageview ('/outbound/helion.pl');" >Ajax and PHP</a><sup id="fnref:4" ><a href="#fn:4"  rel="footnote" >4</a></sup> I was fascinated with <a href="http://helion.pl/ksiazki/umlakc.htm"  onclick="javascript:pageTracker._trackPageview ('/outbound/helion.pl');" >UML in Action</a> and loved <strong>&#8220;Hacking Vim&#8221;</strong> &#8212; all three books are <strong>well-though</strong>, <strong>creative</strong> and published with a really clean layout which makes it easier to read and find information. I point this out because it&#8217;s not so obvious to other publishers. Sometimes books are really <u>chaotic</u> and you should spend your money for something else, like roller coaster or a dinner with your girlfriend &#8212; more valuable and for sure more thrilling.</p>

<p><strong>Summarizing:</strong> I admire <a href="http://www.packtpub.com/"  onclick="javascript:pageTracker._trackPageview ('/outbound/www.packtpub.com');" >Packt</a> for publishing this book, as it is not a very popular subject<sup id="fnref:6" ><a href="#fn:6"  rel="footnote" >5</a></sup>, and thank them for making this book of a really high quality. I really had fun reading this and checking how it contradicts to my habits in something what every computer user does - text editing<sup id="fnref:5" ><a href="#fn:5"  rel="footnote" >6</a></sup>. If you&#8217;re an average Vim user - read this book, if not for knowledge then for <strong>inspiration in time hacking with Vim</strong>.</p>

<p><strong>At the end I would like to thank <a href="http://www.packtpub.com/"  onclick="javascript:pageTracker._trackPageview ('/outbound/www.packtpub.com');" >Packt Publishing</a> for letting me review this book and Kim Schulz for writing it.</strong></p>

<div class="footnotes" >
<hr/>
<ol>

<li id="fn:1" >
<p>Try <strong><esc>:q<enter></strong> for example if you still have problems while reading this review :)&#160;<a href="#fnref:1"  rev="footnote" >&#8617;</a></p>
</li>

<li id="fn:2" >
<p>Personally I don&#8217;t know any, even commercial one. If you want something more IDE-like without leaving Vim you should try <a href="http://pida.co.uk/"  onclick="javascript:pageTracker._trackPageview ('/outbound/pida.co.uk');" >PIDA</a>.&#160;<a href="#fnref:2"  rev="footnote" >&#8617;</a></p>
</li>

<li id="fn:3" >
<p>I can&#8217;t really remember any other IT book that I read from first page till last. Maybe it was so long ago, but probably this never happened before to me. :)&#160;<a href="#fnref:3"  rev="footnote" >&#8617;</a></p>
</li>

<li id="fn:4" >
<p>This is a possible topic for next review.&#160;<a href="#fnref:4"  rev="footnote" >&#8617;</a></p>
</li>

<li id="fn:6" >
<p>Look at <a href="http://iccf-holland.org/click5.html"  onclick="javascript:pageTracker._trackPageview ('/outbound/iccf-holland.org');" >books section</a> of official Vim website to see all the books related to Vim. There&#8217;s also a short review of <strong>&#8220;Hacking Vim&#8221;</strong> by <strong>Bram Moolenaar</strong>.&#160;<a href="#fnref:6"  rev="footnote" >&#8617;</a></p>
</li>

<li id="fn:5" >
<p>Yes, you correctly smell <strong>Vim evangelism</strong> here. I you are still not convinced just give it a chance and go through <a href="http://www.vim.org/htmldoc/usr_01.html#01.3"  onclick="javascript:pageTracker._trackPageview ('/outbound/www.vim.org');" >Vim tutor</a>.&#160;<a href="#fnref:5"  rev="footnote" >&#8617;</a></p>
</li>

</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.bilinski.it/2007/10/16/time-hacking-with-vim-book-review/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
