<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<feed xmlns="http://www.w3.org/2005/Atom">

	<title>Planet INdT</title>
	<link rel="self" href="http://rsalveti.net/planet/atom.xml"/>
	<link href="http://rsalveti.net/planet/"/>
	<id>http://rsalveti.net/planet/atom.xml</id>
	<updated>2012-05-19T05:15:37+00:00</updated>
	<generator uri="http://www.planetplanet.org/">Planet/2.0 +http://www.planetplanet.org</generator>

	<entry xml:lang="en">
		<title type="html">Great start at Ubuntu Developer Summit (Q or 12.10) for ARM</title>
		<link href="http://rsalveti.wordpress.com/2012/05/10/great-start-at-ubuntu-developer-summit-q-or-12-10-for-arm/"/>
		<id>http://rsalveti.wordpress.com/?p=475</id>
		<updated>2012-05-10T08:13:46+00:00</updated>
		<content type="html">&lt;p&gt;This week I&amp;#8217;m proudly participating at the &lt;a href=&quot;http://uds.ubuntu.com/event/&quot;&gt;Ubuntu Developer Summit&lt;/a&gt; to help planning and defining what will the Quantal Quetzal (12.10) release be in the next following months.&lt;/p&gt;
&lt;p&gt;As usual I&amp;#8217;m wearing not only the Linaro hat, but also my Ubuntu and Canonical ones, interested and participating actively at most topics that are related with ARM in general.&lt;/p&gt;
&lt;p&gt;And what can I say after the first 3 days at UDS-Q? Well, busy as never before and with great opportunities to help getting Ubuntu to rock even more at ARM, with current devices/platforms and with the exciting new ones that will be coming in the next few months.&lt;/p&gt;
&lt;p&gt;Here are a few highlights from the first days:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Monday &amp;#8211; May 7th&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://summit.ubuntu.com/uds-q/meeting/20633/introduction-and-keynote/&quot;&gt;Introduction and Keynote&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Great start as usual by Mark, showing the great opportunities for both Canonical and Ubuntu, describing the new target and use cases, and also showing how important Cloud is now for Ubuntu. After that we had, finally, the announcement of a real hardware availability from &lt;a href=&quot;http://www.eweek.com/c/a/IT-Infrastructure/Calxeda-Demo-of-ARMBased-Server-Ups-Ante-in-Intel-Competition-581529/&quot;&gt;Calxeda&lt;/a&gt;, proving that ARM server are indeed real! (which is a quite important accomplishment)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://twitter.com/#!/rsalveti/status/200493680073785344/photo/1&quot;&gt;Schedule displays all working with our member&amp;#8217;s boards&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;This was the first time that all the schedule displays available at UDS were all covered by the ARM boards provided by Linaro. This time we got Pandaboard, Origen and also Snowball constantly showing the schedule through all the day. Low power and powerful devices all around &lt;img src=&quot;http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://summit.ubuntu.com/uds-q/meeting/20498/foundations-q-embedded-rootfs/&quot;&gt;Plans for a minimum filesystem for embedded devices&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Discussion to cover all the possible embedded related use cases for Ubuntu, and trying to understand the real requirements for a minimum filesystem (rootfs) for those devices. While we didn&amp;#8217;t decide to generate the smallest-still-apt/dpkg-compatible rootfs for our users (as ubuntu-core is already covering most of the cases), we&amp;#8217;ll provide enough tools and documentation on how to easily generate them. At Linaro side the Ubuntu Nano image should probably reflect such suggestions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://summit.ubuntu.com/uds-q/meeting/20741/foundations-q-drop-preinst-images/&quot;&gt;Identify impact of the switch to pure live images for ARM platforms&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Here the focus was basically to review and understand if we would really continue providing pre-installed based images instead of just supporting live based ones. Having the images provided only at the SD cards are very useful to make the bootstrap and install quite easy, but it hurts badly the performance. As we&amp;#8217;re now getting ARM boards that are very powerful in many ways, the I/O bound shouldn&amp;#8217;t limit what the users would be able to get from them. The decision for Quantal is to drop support for the pre-installed images, and provide live based ones at the SD cards (think like the live-sd image as we have with CD on other archs), where the user would install Ubuntu the same way as done with x86, and using USB/Sata based devices as rootfs by default.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://summit.ubuntu.com/uds-q/meeting/20474/servercloud-q-openstack-deployment-on-arm/&quot;&gt;OpenStack Deployment on ARM Server&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;The focus of this session was basically to better understand what might be the missing pieces for a proper OpenStack support at ARM. Quite a few open questions still, but the missing pkgs enablement, LXC testing and support and KVM for a few platforms will help making sure the support is at least correctly in place. After initial support, continuous test and validation should happen to make sure the ARM platforms keeps well supported over the time (which will be better stressed and tested once MAAS/Juju is also supported properly at ARM).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tuesday &amp;#8211; May 8th&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://summit.ubuntu.com/uds-q/meeting/20330/foundations-q-aarch64-porting/&quot;&gt;Detail and begin the arm64/aarch64 port in Ubuntu&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Clearly the most important session of the day for ARM. Great discussion on how to prepare and start the ARMv8 port at Ubuntu and Debian, by starting with cross-build support with multiarch and later support with Fast Models and Qemu. A lot is still to be covered once ARM is able to publish the ARMv8 support for Toolchain and Kernel, and session will be reviewed again at &lt;a href=&quot;http://connect.linaro.org/events/event/linaro-connect-q2-12/&quot;&gt;Linaro Connect&lt;/a&gt; at the end of this month.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://summit.ubuntu.com/uds-q/meeting/20341/hardware-q-kernel-delta-review/&quot;&gt;Ubuntu Kernel Delta Review&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Usual review of the patches the Ubuntu Kernel team is maintaining at the Ubuntu Kernel tree. At Linaro this is important as we also enable the Ubuntu specific patch-set at the packages provided by the LEB, for proper kernel and user-space support. Luckily this time it seems the delta is really minimum, which should probably also start to be part of Linux Linaro in the following month.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://summit.ubuntu.com/uds-q/meeting/20499/foundations-q-hwpack-integration/&quot;&gt;Integrate Linaro hwpacks for ARM with the Ubuntu image build infrastructure&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Usual discussion about trying to avoid replicated work that is strictly related with each ARM board we support at both Ubuntu and Linaro. Decision is to finally sync with the latest flash-kernel available at Debian and try to get the common project/package with the hardware specific bits in place, so it can be used by linaro-image-tools, flash-kernel and debian-cd.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Wednesday &amp;#8211; May 9th&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://summit.ubuntu.com/uds-q/meeting/20394/servercloud-q-maas-next-steps/&quot;&gt;MAAS Next Steps&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Session to review and plan what are the next steps for the MAAS project, which is also missing proper ARM support for now. Great discussions on understanding all the requirements, as they will not necessarily match entirely with the usual ARM devices we have at the moment. Here the goal for ARM is to continue improving the PXE support at U-Boot (even with UEFI chainload later), and understanding what might be missing to also have IPMI support (even if not entirely provided by the hardware).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://summit.ubuntu.com/uds-q/meeting/20429/desktop-q-system-compositor/&quot;&gt;System Compositor&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Great session covering what might be the improvements and development on the graphics side for next release. Goal is to use a system compositor that would be started right at the beginning at the boot, which will then be controlled and used properly once lightdm is up (with X11). This will improve a lot the user experience on normal x86 based desktops, and luckily on ARM we&amp;#8217;re also in a quite nice situation with the work done by Linaro helping getting the proper DRM/KMS support for the boards we support, so I hope ARM will be in a great shape here &lt;img src=&quot;http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://summit.ubuntu.com/uds-q/meeting/20410/servercloud-q-arm-server/&quot;&gt;ARM Server general enhancements (for ARMv7 and perhaps v8)&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;At this session we could cover what seems to be the most recurrent and problematically thing at supporting ARM servers, which is the lack of a single and supported boot method and boot loader. UEFI should be able to help on this front soon, but until then the focus will be to keep checking and making sure the current PXE implementation at u-boot works as expected (chainloading UEFI on u-boot is also another possibility Linaro is investigating). There is also the request for IPMI support, which is still unclear in general how it&amp;#8217;ll be done generically speaking.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://summit.ubuntu.com/uds-q/meeting/20295/foundations-q-grub-integration-testing/&quot;&gt;Integration testing for the bootloader&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;As Ubuntu is also moving to the direction of continuous validating and testing all important components available, there&amp;#8217;s the need for a proper validation of the bootloader, and the effect at the user experience while booting the system. For ARM it&amp;#8217;s also a special case, as U-Boot is still the main bootloader used across the boards. Test case descriptions in place, and discussion will probably continue at Linaro Connect as this is also an area where we also want to help validating/testing.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://summit.ubuntu.com/uds-q/meeting/20524/servercloud-q-server-benchmark-and-performance/&quot;&gt;ARM Server Benchmarking and Performance&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Here the Ubuntu Server Team presented how they are benchmarking and checking performance at the server level at x86, and covering what might still be needed to run and validate the ARM boards the same way. For ARM the plan is to run the same test cases on the available scenarios, and also try to get Linaro involved by making sure this is also part of the continuous validation and testing done with LAVA. Another important topic that will probably be extended at Linaro Connect is finding a way to get the power consumption data when running the test cases/benchmarks, so it can be further optimised later on.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://summit.ubuntu.com/uds-q/meeting/20806/desktop-compiz-gles2-handover/&quot;&gt;Compiz GLES2 Handover&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Last session of the day, trying to find the missing gaps to finally get the OpenGL ES2.0 support merged at the Compiz and Unity upstream branches used by the entire Ubuntu desktop (across all archs). Following work and actions will basically be to fix the remaining and important plugins after merging the changes, and also getting a few test cases to properly validate the support at Ubuntu. Once all done, it should be merged ASAP.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are just a few topics which I was able to participate. There are a lot of more exciting work coming on, which can all be found at &lt;a href=&quot;http://summit.ubuntu.com/uds-q/&quot;&gt;http://summit.ubuntu.com/uds-q/&lt;/a&gt;. Remember that you&amp;#8217;re still able to participate in a few of them tomorrow and friday, as remote access is provided for all the sessions we have.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m sure a lot of more exciting stuff will be discussed for ARM support until the end of this week, and at Linaro Connect, at the end of the month, we&amp;#8217;ll be able to review and get our hands dirty as well &lt;img src=&quot;http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Exciting times for ARM!&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/rsalveti.wordpress.com/475/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/rsalveti.wordpress.com/475/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/rsalveti.wordpress.com/475/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/rsalveti.wordpress.com/475/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gofacebook/rsalveti.wordpress.com/475/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/rsalveti.wordpress.com/475/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gotwitter/rsalveti.wordpress.com/475/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/rsalveti.wordpress.com/475/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/rsalveti.wordpress.com/475/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/rsalveti.wordpress.com/475/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/rsalveti.wordpress.com/475/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/rsalveti.wordpress.com/475/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/rsalveti.wordpress.com/475/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/rsalveti.wordpress.com/475/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=rsalveti.wordpress.com&amp;blog=905525&amp;post=475&amp;subd=rsalveti&amp;ref=&amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</content>
		<author>
			<name>rsalveti</name>
			<uri>http://rsalveti.wordpress.com</uri>
		</author>
		<source>
			<title type="html">rsalveti's random thoughts</title>
			<subtitle type="html">Just another geek's weblog</subtitle>
			<link rel="self" href="http://rsalveti.wordpress.com/feed/atom/"/>
			<id>http://rsalveti.wordpress.com/feed/atom/</id>
			<updated>2012-05-15T03:15:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Big changes!</title>
		<link href="http://blog.morpheuz.cc/08/05/2012/big-changes/"/>
		<id>http://blog.morpheuz.cc/?p=367</id>
		<updated>2012-05-08T15:05:09+00:00</updated>
		<content type="html">&lt;p&gt;After 5 wonderful years working with passionate and skilled people I am now moving to São Paulo to work at Facebook&amp;#8217;s office for Latin America. My official role will be &lt;a title=&quot;Partner Engineer @ Facebook&quot; href=&quot;http://www.quora.com/Facebook-1/What-is-the-role-of-a-partner-engineer-at-Facebook&quot;&gt;Partner Engineer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This doesn&amp;#8217;t mean that I will go away from KDE, neither from Qt. It just means that I will contribute more on my free time (as it was before Nokia acquired Trolltech) than during working hours.&lt;/p&gt;
&lt;p&gt;I am thrilled with this opportunity and I am sure that all of you who know me are also happy with this announcement.&lt;/p&gt;
&lt;p&gt;I will be a little bit offline the next days due to my move, but I will be checking emails regularly &lt;img src=&quot;http://blog.morpheuz.cc/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</content>
		<author>
			<name>Morpheuz</name>
			<uri>http://blog.morpheuz.cc</uri>
		</author>
		<source>
			<title type="html">MoRpHeUz's Blog</title>
			<subtitle type="html">Just stuff ;)</subtitle>
			<link rel="self" href="http://blog.morpheuz.cc/feed/"/>
			<id>http://blog.morpheuz.cc/feed/</id>
			<updated>2012-05-08T15:15:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Advances in mobile data collection: Nokia Data Gathering 4.04</title>
		<link href="http://ianlawrence.info/random-stuff/advances-in-mobile-data-collection-nokia-data-gathering-4.04"/>
		<id>http://ianlawrence.info/random-stuff/advances-in-mobile-data-collection-nokia-data-gathering-4.04</id>
		<updated>2012-05-07T21:02:35+00:00</updated>
		<content type="html">&lt;p&gt;We have been hard at work developing and improving the Nokia Data Gathering solution, and will be launching an exciting new version in May 2012. The Nokia Data Gathering 4.04 (Dazzling Dourado) release will include bug fixes and new features on the Java mobile client, as well as a brand new Nokia Data Gathering server and user interface. We will also be launching the first Windows Phone client of Nokia Data Gathering.&lt;/p&gt;
 
&lt;p&gt;Come discover and try out Nokia Data Gathering 4.04! On &lt;em&gt;16 May 2012, the Nokia Data Gathering team will be at Seton Hall University&lt;/em&gt; to tell you all about the new Nokia Data Gathering 4.04 server, the new Windows Phone mobile app, mobile data collection case studies from around the world, and to give you a chance to try out Nokia Data Gathering 4.04 for yourself.&lt;/p&gt;
&lt;p&gt;Please join us!&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
    &lt;td&gt;Event&lt;/td&gt;
    &lt;td&gt;Nokia Data Gathering 4.04 workshop&lt;td&gt;
&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;Date&lt;/td&gt;
  &lt;td&gt;Wednesday, 16 May 2012&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
 &lt;td&gt;Time&lt;/td&gt;
 &lt;td&gt;09:00-12:00 AM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;Place&lt;/td&gt;
  &lt;td&gt;Seton Hall University, 400 South Orange Avenue, South Orange, NJ 07079, USA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;Room&lt;/td&gt;
  &lt;td&gt;Beck Rooms A, B, and C (Ground Floor of Walsh Library)&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
 
&lt;p&gt;Nokia Data Gathering 4.04 is the result of a collaborative effort between &lt;a href=&quot;http://www.nokia.com/&quot;&gt;Nokia&lt;/a&gt;, the &lt;a href=&quot;http://cmri.shu.edu/&quot;&gt;Center for Mobile Research and Innovation&lt;/a&gt; at Seton Hall University and &lt;a href=&quot;http://www.microsoft.com/&quot;&gt;Microsoft&lt;/a&gt;. Learn more at &lt;a href=&quot;http://projects.developer.nokia.com/ndg/&quot;&gt;http://projects.developer.nokia.com/ndg/&lt;/a&gt;
&lt;p&gt;
For more information about the workshop and/or Nokia Data Gathering, please contact kulsoom.ally 'at' nokia.com&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Ian Lawrence</name>
			<uri>http://ianlawrence.info/random-stuff</uri>
		</author>
		<source>
			<title type="html">Ian Lawrence - Blog</title>
			<subtitle type="html">What is the digital equivalent of lovely? He wondered. What are the digits that encode beauty, the number-fingers that enclose, transform, transmit, decode, and somehow, in the process, fail to trap or choke the soul of it? Not because of the technology but in spite of it, beauty, that ghost, that treasure, passes undiminished through the new machines.</subtitle>
			<link rel="self" href="http://ianlawrence.info/random-stuff/RSS2"/>
			<id>http://ianlawrence.info/random-stuff/RSS2</id>
			<updated>2012-05-19T05:15:17+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Qt 5 UiHelpers</title>
		<link href="http://anselmolsm.org/blog/qt-5-uihelpers/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=qt-5-uihelpers"/>
		<id>http://anselmolsm.org/?p=1567</id>
		<updated>2012-04-13T18:10:37+00:00</updated>
		<content type="html">&lt;p&gt;In &lt;a href=&quot;http://anselmolsm.org/blog/working-in-the-open-again/&quot; target=&quot;_blank&quot;&gt;my previous post&lt;/a&gt; I mentioned one of the experiments &lt;a href=&quot;http://www.indt.org/?lang=en&quot; target=&quot;_blank&quot;&gt;we&lt;/a&gt; are currently working on.&lt;br /&gt;
Now it is time to introduce the Qt 5 playground project called UiHelpers &amp;#8211; Fortunately, this name will change ;)&lt;br /&gt;
Those who follow the &lt;a href=&quot;http://lists.qt-project.org/pipermail/development&quot; target=&quot;_blank&quot;&gt;Qt development mailing list&lt;/a&gt; already read about it, the idea about this post is to reach more people from the community in general.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Context&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you are already familiar with the structure of Qt 5 code, feel free to jump to the next section.&lt;/p&gt;
&lt;p&gt;In Qt 4, the whole source code is in the same git repository. The traditional widgets derived from QWidget are part of the QtGui module and represent a central piece for the GUI application development.&lt;/p&gt;
&lt;p&gt;In Qt 5, things changed. Qt code were splitted in many repositories which group Qt libraries depending on their functionalities.&lt;br /&gt;
Examples of repositories are qtbase, qtdeclarative, qtjsbackend, qtxmlpatterns, qtsvg, qttools, etc.&lt;br /&gt;
As you may know, QtQuick 2 became a first class citizen in Qt 5, which means qtdeclarative is one of the main repositories, house of QtQuick and QtQml classes.&lt;/p&gt;
&lt;p&gt;But, there are classes that provide the base for QtQuick 2 work properly &amp;#8211; they are part of the qtbase repo. There you find QtCore,&lt;br /&gt;
QtGui, QtNetwork, QtOpenGL, QtPlatformSupport, QtXml, QtWidgets, etc.&lt;/p&gt;
&lt;p&gt;Wait: What&amp;#8217;s the difference between QtGui and QtWidgets?&lt;/p&gt;
&lt;p&gt;As part of the changes of Qt 5, QtGui is now focused in the basic infrastructure for GUI work on different platforms. For example, it is the place for the platform abstraction layer, window management, image handling, etc.&lt;/p&gt;
&lt;p&gt;QtWidgets, as you can conclude based on its name, contains the children of QWidget: QPushButton, QSpinBox, QMainWindow, etc. Also, there are non-widgets classes in QtWidgets, some of them because they are internally too coupled to QWidget classes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Origins&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In this &lt;a href=&quot;http://lists.qt-project.org/pipermail/development/2011-December/000932.html&quot; target=&quot;_blank&quot;&gt;thread&lt;/a&gt; it was mentioned the case of QUndoStack, QUndoCommand that are in QtWidgets but can be useful in other contexts where developers do not want to link against QtWidgets just because of this kind of helper classes.&lt;br /&gt;
Later, in the &lt;a href=&quot;http://codereview.qt-project.org/#change,15857&quot; target=&quot;_blank&quot;&gt;change 15857&lt;/a&gt; (with the help of ogoffart), we discussed about moving QUndo* out of QtWidgets. First, we moved these classes to QtGui what as not considered correct given the new motivation of this lib. Then, another idea was to move the classes to a new lib, inside qtbase. It was not considered ideal and the decision was to create a separated repo for these classes, leaving QtWidgets untouched (since the Qt community do not want to introduce new bugs in this lib).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Current status&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We set a &lt;a href=&quot;http://qt-project.org/wiki/Qt-5-Ui-Helpers&quot; target=&quot;_blank&quot;&gt;wiki page&lt;/a&gt; where it is possible to check the classes made available out of QtWidgets. Also, there are instructions about where to download the source code, build, test and contact us.&lt;/p&gt;
&lt;p&gt;Besides moving classes out of QtWidgets, some prototypes of convenience APIs were created for QtQuick 2 developers and we are very interested in receiving feedback about them. It&amp;#8217;s worth mentioning the QML API for UndoStack and the CompletionModel which is based on the internals of QCompleter and was made available in a QML friendly way.&lt;/p&gt;
&lt;p&gt;The following example shows a possible use case for the CompletionModel. Improving the models supported by &lt;em&gt;sourceModel&lt;/em&gt; is part of the ToDo list. The ListView is going to show the updated list that currently satisfies what is written in the TextInput.&lt;/p&gt;
&lt;pre class=&quot;brush:js&quot;&gt;TextInput {
    id: input
}

CompletionModel {
    id: completionModel
    sourceModel: [&quot;Ascension Island&quot;, &quot;Andorra&quot;, &quot;Afghanistan&quot;]
    completionPrefix: input.text
    caseSensitivity: Qt.CaseInsensitive
}

ListView {
    model: completionModel
    delegate: Text { text: modelData }
}&lt;/pre&gt;
&lt;p&gt;The two examples bellow show the UndoStack and two items that represent commands. The idea of UndoPropertyCommand is to enable track the changes of some properties. In the example, we are going to track x and y when myRect is moved.&lt;/p&gt;
&lt;pre class=&quot;brush:js&quot;&gt;UndoStack {
    id: stack
    undoLimit: 5
}

UndoPropertyCommand {
    id: moveCommand
    properties: [&quot;x&quot;, &quot;y&quot;]
}

Rectangle {
    id: myRect

    (...)

    MouseArea {
        (...)
        drag.target: parent
        onPressed: stack.push(moveCommand, myRect);
    }
}&lt;/pre&gt;
&lt;p&gt;UndoCommand is another element used to represent commands. The difference here is that it allows the customization of the actions onUndo and onRedo the command.&lt;/p&gt;
&lt;pre class=&quot;brush:js&quot;&gt;UndoCommand {
    id: aCommand

    onUndo: doAThing(target);
    onRedo: undoAThing(target);
}

Button {
    onClicked: stack.push(aCommand, target);
}&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Future&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Maybe one day this playground project gets promoted and become a Qt Add-on, but there is no expectation it will happen before 5.0. In the meanwhile, there is a ToDo list with some topics we consider important to handle, like better examples, more tests, docs, etc.&lt;/p&gt;
&lt;p&gt;We are looking forward receiving more opinions about this work and, as always, contributors are welcome!&lt;/p&gt;</content>
		<author>
			<name>Anselmo Lacerda S. de Melo</name>
			<uri>http://anselmolsm.org</uri>
		</author>
		<source>
			<title type="html">anselmolsm.org » INdT</title>
			<link rel="self" href="http://anselmolsm.org/blog/category/planet_indt/feed/"/>
			<id>http://anselmolsm.org/blog/category/planet_indt/feed/</id>
			<updated>2012-04-13T19:15:14+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Moving out! :)</title>
		<link href="http://brunoabinader.blogspot.com/2010/09/moving-out.html"/>
		<id>tag:blogger.com,1999:blog-8974121210221508485.post-69735282544240023</id>
		<updated>2012-04-11T11:12:21+00:00</updated>
		<content type="html">&lt;div&gt;Hello my fellow readers :)&lt;/div&gt;&lt;div&gt;First of all, this is not a &quot;goodbye&quot; message! It's time to move my blog to a cool domain, which is commonly used by me fellow colleagues Igor Oliveira and Adenilson Cavalcanti. All of my previous posts were moved to there, so don't worry (I mean the CMake tutorials!). So, the new blog link is below:&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;a href=&quot;http://bruno.abinader.com.br/&quot;&gt;http://bruno.abinader.com.br&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Thank you BlogSpot for hosting this blog for 3 years without problems, and I hope to see you there! :)&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/8974121210221508485-69735282544240023?l=brunoabinader.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Bruno de Oliveira Abinader</name>
			<email>noreply@blogger.com</email>
			<uri>http://brunoabinader.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Bruno Abinader's Blog</title>
			<subtitle type="html">A space for informations, tips, and news about the universe that surrounds me.</subtitle>
			<link rel="self" href="http://brunoabinader.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-8974121210221508485</id>
			<updated>2012-05-15T05:15:13+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Working in the open again</title>
		<link href="http://anselmolsm.org/blog/working-in-the-open-again/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=working-in-the-open-again"/>
		<id>http://anselmolsm.org/?p=1556</id>
		<updated>2012-03-27T12:40:01+00:00</updated>
		<content type="html">&lt;p&gt;Long time since my last post (it&amp;#8217;s sad to realize how often I start posts writing this).&lt;br /&gt;
Since last year&amp;#8217;s &lt;a href=&quot;http://qt-project.org/groups/qt-contributors-summit-2011&quot; target=&quot;_blank&quot;&gt;Qt Contributors&amp;#8217; Summit&lt;/a&gt;, our team at &lt;a href=&quot;http://www.indt.org/?lang=en&quot; target=&quot;_blank&quot;&gt;INdT&lt;/a&gt; worked on a closed source project &amp;#8211; the main reason of the low activity here. At least, I could write some posts for the &lt;a href=&quot;http://blog.qtlabs.org.br/&quot; target=&quot;_blank&quot;&gt;Qt Labs Blog Brazil&lt;/a&gt;, most of them introducing basic concepts about Qt programming and the Qt ecossystem (buzzword++).&lt;br /&gt;
The good part is: This project we were working on was developed using Qt and QML for a desktop application. Besides promoting Qt among Brazilian developers and companies, this project helped us to think about improvements for future releases of QtQuick aiming desktop applications. I am looking forward to see a release of this product soon! (However, when it is going to happen is a client decision).&lt;/p&gt;
&lt;p&gt;Then, after the end of this project, I &lt;strong&gt;finally&lt;/strong&gt; managed to contribute to Qt5! :-)&lt;/p&gt;
&lt;p&gt;Also, in the end of the last year some coworkers started a kind of pet project: It&amp;#8217;s called Iceberg, a fork of the Icecream Monitor.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;#8220;Why a fork?&amp;#8221;&lt;/strong&gt; Here we use &lt;a href=&quot;http://en.opensuse.org/Icecream&quot; target=&quot;_blank&quot;&gt;icecream&lt;/a&gt; for distributed compilation, many colleagues used to complain about icemon depending on kdelibs. In fact, the code did not use the additional features compared to the equivalent Qt classes. Then, after &lt;a href=&quot;http://hugoparente.blogspot.com.br/&quot; target=&quot;_blank&quot;&gt;hugopl&lt;/a&gt; &lt;a href=&quot;http://hugoparente.blogspot.com.br/2011/10/iceberg.html&quot; target=&quot;_blank&quot;&gt;started the project&lt;/a&gt;, we fixed some issues and added new stuff. The code is &lt;a href=&quot;https://github.com/hugopl/Iceberg&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I am writing another post to introduce one of our current research projects, which is also part of the proposal I sent to &lt;a href=&quot;http://akademy.kde.org/&quot;&gt;Akademy 2012&lt;/a&gt;.&lt;/p&gt;</content>
		<author>
			<name>Anselmo Lacerda S. de Melo</name>
			<uri>http://anselmolsm.org</uri>
		</author>
		<source>
			<title type="html">anselmolsm.org » INdT</title>
			<link rel="self" href="http://anselmolsm.org/blog/category/planet_indt/feed/"/>
			<id>http://anselmolsm.org/blog/category/planet_indt/feed/</id>
			<updated>2012-04-13T19:15:14+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">ARM Porting Jam this Friday!</title>
		<link href="http://rsalveti.wordpress.com/2012/03/02/arm-porting-jam-this-friday/"/>
		<id>http://rsalveti.wordpress.com/?p=450</id>
		<updated>2012-03-02T07:10:26+00:00</updated>
		<content type="html">&lt;p&gt;For those following the development of the next Ubuntu release (12.04 &amp;#8211; Precise Pangolin), you all know that we&amp;#8217;re quite close to the release date already, and to make sure Precise rocks since day 0, we all need to work hard to get most of the bugs sorted out during the next few weeks.&lt;/p&gt;
&lt;p&gt;At Linaro, the Linaro Developer Platform team will be organizing an ARM porting Jam this Friday, with the goal of getting all developers interested in fixing and working on bugs and portability issues related with the Ubuntu ARM port (mostly issues with ARMHF at the moment).&lt;/p&gt;
&lt;p&gt;The idea of having the Porting Jam at Friday is to have it as a joint effort with &lt;a href=&quot;http://daniel.holba.ch/blog/2012/02/hitting-the-ground-running/&quot;&gt;Ubuntu&amp;#8217;s Fix Friday&lt;/a&gt; and &lt;a href=&quot;http://rsalveti.wordpress.com/2012/03/02/arm-porting-jam-this-friday/loco.ubuntu.com/events/global/1443/detail/&quot;&gt;Ubuntu Global Jam&lt;/a&gt;, so expect quite a few other developers helping improving Ubuntu as well!&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s quite easy to participate:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Check the current bug list for ARM at &lt;a href=&quot;http://people.linaro.org/~rsalveti/arm-porting-queue/arm-porting-queue-report.html&quot;&gt;http://people.linaro.org/~rsalveti/arm-porting-queue/arm-porting-queue-report.html&lt;/a&gt; and FTBFS list from &lt;a href=&quot;http://qa.ubuntuwire.com/ftbfs/&quot;&gt;http://qa.ubuntuwire.com/ftbfs/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Look at &lt;a href=&quot;http://developer.ubuntu.com/packaging/html/&quot;&gt;http://developer.ubuntu.com/packaging/html/&lt;/a&gt; for more information about packaging, and how to provide patches and fixes for our current packages&lt;/li&gt;
&lt;li&gt;Join #linaro and/or #ubuntu-motu on irc.freenode.net&lt;/li&gt;
&lt;li&gt;Grab a bug, debug, ask questions and update the bug report with your findings&lt;/li&gt;
&lt;li&gt;Get involved with other developers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Remember that for ARM this release will be a quite huge milestone, as it&amp;#8217;ll be the first LTS release supporting ARM, besides delivering support for ARM servers and ARMHF as default, so let&amp;#8217;s make sure it rocks!&lt;/p&gt;
&lt;p&gt;Looking forward for a great porting Jam!&lt;/p&gt;
&lt;p&gt;Happy bug fixing!&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/rsalveti.wordpress.com/450/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/rsalveti.wordpress.com/450/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/rsalveti.wordpress.com/450/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/rsalveti.wordpress.com/450/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gofacebook/rsalveti.wordpress.com/450/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/rsalveti.wordpress.com/450/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gotwitter/rsalveti.wordpress.com/450/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/rsalveti.wordpress.com/450/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/rsalveti.wordpress.com/450/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/rsalveti.wordpress.com/450/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/rsalveti.wordpress.com/450/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/rsalveti.wordpress.com/450/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/rsalveti.wordpress.com/450/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/rsalveti.wordpress.com/450/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=rsalveti.wordpress.com&amp;blog=905525&amp;post=450&amp;subd=rsalveti&amp;ref=&amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</content>
		<author>
			<name>rsalveti</name>
			<uri>http://rsalveti.wordpress.com</uri>
		</author>
		<source>
			<title type="html">rsalveti's random thoughts</title>
			<subtitle type="html">Just another geek's weblog</subtitle>
			<link rel="self" href="http://rsalveti.wordpress.com/feed/atom/"/>
			<id>http://rsalveti.wordpress.com/feed/atom/</id>
			<updated>2012-05-15T03:15:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">SCRUM &amp;#8211; primeiros passos</title>
		<link href="http://franciscoalecrim.com/blog/2012/01/23/scrum-primeiros-passos/"/>
		<id>http://franciscoalecrim.com/blog/?p=338</id>
		<updated>2012-01-23T02:26:46+00:00</updated>
		<content type="html">&lt;p&gt;Esta semana recebi o e-mail de um amigo que está tentando implantar SCRUM no time que está liderando. Quando trabalhavamos juntos na BRISA tecnologia, fiz uma apresentação sobre o assunto e tentei implantar SCRUM em um dos times. Abaixo seguem alguns links e apresentações que recomendo.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.mountaingoatsoftware.com/topics/scrum&quot;&gt;Introduction to Scrum &amp;#8211; An Agile Process&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.slideshare.net/macaubas/seminario-scrum-presentation&quot;&gt;Gestao agil de projetos com Scrum&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.infoq.com/br/minibooks/scrum-xp-from-the-trenches&quot;&gt;InfoQ: Scrum e XP direto das Trincheiras&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;O link abaixo leva para a apresentação que modifiquei para o time do MegaRushing.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; &lt;a href=&quot;http://franciscoalecrim.com/down/tmp/seminario-scrum-1222222884379353-9_modificado_alecrim.pdf&quot;&gt;Introdução SCRUM &amp;#8211; modificado por Alecrim [ PDF ]&lt;/a&gt;  &lt;a href=&quot;http://franciscoalecrim.com/down/tmp/seminario-scrum-1222222884379353-9_modificado_alecrim.odp&quot;&gt;[ ODP ]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;Agora basta agendar o dia e fazer a apresentação.&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</content>
		<author>
			<name>Francisco Keppler Silva Alecrim</name>
			<uri>http://franciscoalecrim.com/blog</uri>
		</author>
		<source>
			<title type="html">franciscoalecrim.com</title>
			<subtitle type="html">developer</subtitle>
			<link rel="self" href="http://franciscoalecrim.com/blog/feed/atom/"/>
			<id>http://franciscoalecrim.com/blog/feed/atom/</id>
			<updated>2012-03-08T12:15:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Ubuntu TV UI at Pandaboard, and next steps</title>
		<link href="http://rsalveti.wordpress.com/2012/01/10/ubuntu-tv-ui-at-pandaboard-and-next-steps/"/>
		<id>http://rsalveti.wordpress.com/?p=390</id>
		<updated>2012-01-16T06:59:56+00:00</updated>
		<content type="html">&lt;p&gt;Yesterday Canonical &lt;a href=&quot;http://www.ubuntu.com/tv&quot;&gt;announced&lt;/a&gt; the first UI concept for the Ubuntu TV. Together with the announcement, the first code drop was released, so we could read and understand better the technologies used, and how this will behave on an ARM environment, mostly at a Pandaboard (that we already have OpenGL ES 2 and video decode working).&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Getting Ubuntu TV to work&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;If are still using Oneiric, you can just follow the guide presented at &lt;a href=&quot;https://wiki.ubuntu.com/UbuntuTV/Contributing&quot;&gt;https://wiki.ubuntu.com/UbuntuTV/Contributing&lt;/a&gt;, where you&amp;#8217;ll find all needed steps to try Ubuntu TV at your machine.&lt;/p&gt;
&lt;p&gt;As it&amp;#8217;s quite close with Unity 2D (similar code base), and also based on Qt, I decided to follow the steps described at wiki page and see if it should work correctly.&lt;/p&gt;
&lt;p&gt;First issue we found with Qt, was that it wasn&amp;#8217;t rendering at full screen when using with latest PowerVR SGX drivers, so any application you wanted to use with Qt Opengl would just show itself on a small part of the screen. Luckily TI (Nicolas Dechesne and Xavier Boudet) quickly provided me a new release of the driver, fixing this issue (version that should be around later today at the Linaro Overlay), so I could continue my journey &lt;img src=&quot;http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Next problem was that &lt;a href=&quot;http://qt.gitorious.org/qt/qt/commit/3fb5fce61b6f64534ad292a78250e4256a6514b6?format=diff&quot;&gt;Qt was enabling brokenTexSubImage and brokenFBOReadBack&lt;/a&gt; for the SGX drivers based on the old versions available for Beagle, and seems this is not needed anymore with the current version available at Pandaboard (still to be reviewed with TI, so a proper solution can be forwarded to Qt).&lt;/p&gt;
&lt;p&gt;Code removed, patch applied and package built (after many hours), and I was finally able to successfully open the Ubuntu TV interface at my Panda &lt;img src=&quot;http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;&lt;b&gt;UI Navigation on a Pandaboard, with Qt and OpenGL ES2.0&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Running Ubuntu TV is quite simple if you&amp;#8217;re already running the Unity 2D interface. All you need to do is to make sure you kill all unity-2d components and that you&amp;#8217;re running metacity without composite enabled. Other than that you just run &amp;#8221;unity-2d-shell -opengl&amp;#8221; and voilà &lt;img src=&quot;http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s a video of the current interface running on my Panda:&lt;br /&gt;
&lt;span&gt;&lt;a href=&quot;http://rsalveti.wordpress.com/2012/01/10/ubuntu-tv-ui-at-pandaboard-and-next-steps/&quot;&gt;&lt;img src=&quot;http://img.youtube.com/vi/WVv9fVeir9k/2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;As you can see from the video, I didn&amp;#8217;t actually play any video, and that&amp;#8217;s because currently we&amp;#8217;re lacking a generic texture handler for OpenGL ES with Gstreamer at &lt;a href=&quot;http://qt.gitorious.org/qt-mobility&quot;&gt;Qtmobility&lt;/a&gt; (there&amp;#8217;s only one available, but specifically for Meego). Once that&amp;#8217;s fixed, the video playback should behave similarly as with XBMC (but with less hacks, as it&amp;#8217;s a native GST backend).&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Next steps, enabling proper video decode&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Looking at what would be needed to finally be able to play the videos, and to make it something useful at your Pandaboard, the first thing is that we need to improve Qtmobility to have a more generic (but unfortunately still specific to Omap) way handle texture streaming with Gstreamer and OpenGL ES. Rob Clark added a similar functionality at XBMC, creating support for &amp;#8221;eglImage&amp;#8221;, so we just need to port the work and make sure it works properly with Qtmobility.&lt;/p&gt;
&lt;p&gt;Once that&amp;#8217;s ported, the video should be streamed as a texture at the video surface, making it also work transparently with QML (the way it&amp;#8217;s done with Ubuntu TV).&lt;/p&gt;
&lt;p&gt;If you know Qt and Gstreamer, and also want to help getting it to work properly on your panda, here follows a few resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rob&amp;#8217;s implementation of eglImage at XBMC: &lt;a href=&quot;https://github.com/robclark/xbmc/commits/gstreamer-eglimg&quot;&gt;https://github.com/robclark/xbmc/commits/gstreamer-eglimg&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Qtmobility support for Meego and OpenGLES: &lt;a href=&quot;http://qt.gitorious.org/qt-mobility/qt-mobility/blobs/master/plugins/multimedia/gstreamer/qgstreamergltexturerenderer.cpp&quot;&gt;http://qt.gitorious.org/qt-mobility/qt-mobility/blobs/master/plugins/multimedia/gstreamer/qgstreamergltexturerenderer.cpp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;IRC: #linaro and #ubuntu-tv at Freenode, look for robclark or rsalveti&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As soon video decoding is working properly, a new blog post should be around explaining the details and how to reproduce it at your own Panda with Ubuntu LEB &lt;img src=&quot;http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Cheers!&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/rsalveti.wordpress.com/390/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/rsalveti.wordpress.com/390/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/rsalveti.wordpress.com/390/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/rsalveti.wordpress.com/390/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gofacebook/rsalveti.wordpress.com/390/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/rsalveti.wordpress.com/390/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gotwitter/rsalveti.wordpress.com/390/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/rsalveti.wordpress.com/390/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/rsalveti.wordpress.com/390/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/rsalveti.wordpress.com/390/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/rsalveti.wordpress.com/390/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/rsalveti.wordpress.com/390/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/rsalveti.wordpress.com/390/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/rsalveti.wordpress.com/390/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=rsalveti.wordpress.com&amp;blog=905525&amp;post=390&amp;subd=rsalveti&amp;ref=&amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</content>
		<author>
			<name>rsalveti</name>
			<uri>http://rsalveti.wordpress.com</uri>
		</author>
		<source>
			<title type="html">rsalveti's random thoughts</title>
			<subtitle type="html">Just another geek's weblog</subtitle>
			<link rel="self" href="http://rsalveti.wordpress.com/feed/atom/"/>
			<id>http://rsalveti.wordpress.com/feed/atom/</id>
			<updated>2012-05-15T03:15:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Ubuntu TV fully accelerated on a Pandaboard with Ubuntu LEB</title>
		<link href="http://rsalveti.wordpress.com/2012/01/16/ubuntu-tv-fully-accelerated-on-a-pandaboard-with-ubuntu-leb/"/>
		<id>http://rsalveti.wordpress.com/?p=421</id>
		<updated>2012-01-16T06:56:11+00:00</updated>
		<content type="html">&lt;p&gt;As described on my previous post about &lt;a href=&quot;http://rsalveti.wordpress.com/2012/01/10/ubuntu-tv-ui-at-pandaboard-and-next-steps/&quot;&gt;Ubuntu TV support on a Pandaboard&lt;/a&gt;, we were still missing proper support for texture streaming on a Pandaboard, to have the video playback also working and fully accelerated.&lt;/p&gt;
&lt;p&gt;This weekend &lt;a href=&quot;http://bloggingthemonkey.blogspot.com/&quot;&gt;Rob Clark&lt;/a&gt; managed to create the first version of the TI&amp;#8217;s specific &lt;i&gt;eglImage&lt;/i&gt; support at &lt;a href=&quot;http://qt.nokia.com/products/qt-addons/mobility/&quot;&gt;Qtmobility&lt;/a&gt;, posting the code at &lt;a href=&quot;https://github.com/robclark/qtmobility-1.1.0&quot;&gt;his gitorious account&lt;/a&gt;, and for the first time we&amp;#8217;re fully able to use Ubuntu TV on a ARM device, using a Pandaboard.&lt;/p&gt;
&lt;p&gt;Demo video with the Ubuntu TV UI (accelerated with Qt and OpenGL ES 2.0) and with video decode support of 720p and 1080p:&lt;br /&gt;
&lt;span&gt;&lt;a href=&quot;http://rsalveti.wordpress.com/2012/01/16/ubuntu-tv-fully-accelerated-on-a-pandaboard-with-ubuntu-leb/&quot;&gt;&lt;img src=&quot;http://img.youtube.com/vi/uQMOETMZA5Y/2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The code support for TI&amp;#8217;s &lt;i&gt;eglImage&lt;/i&gt; still needs a few clean-ups, but we hope to be able to push the support at Ubuntu in the following weeks (make it good enough to try at least a package patch).&lt;/p&gt;
&lt;p&gt;For people wanting to try it out, a few packages are already available at &lt;a href=&quot;https://launchpad.net/~linaro-maintainers/+archive/overlay/&quot;&gt;Linaro&amp;#8217;s Overlay PPA&lt;/a&gt;, and the remaining ones should be available later today (Qt and Qtmobility), so people can easily run it with our images.&lt;/p&gt;
&lt;p&gt;Hope you enjoy, and we&amp;#8217;ll make sure we&amp;#8217;re always working on keeping and improving the current support, so Ubuntu TV also rocks with ARM &lt;img src=&quot;http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Cheers!&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/rsalveti.wordpress.com/421/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/rsalveti.wordpress.com/421/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/rsalveti.wordpress.com/421/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/rsalveti.wordpress.com/421/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gofacebook/rsalveti.wordpress.com/421/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/rsalveti.wordpress.com/421/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gotwitter/rsalveti.wordpress.com/421/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/rsalveti.wordpress.com/421/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/rsalveti.wordpress.com/421/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/rsalveti.wordpress.com/421/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/rsalveti.wordpress.com/421/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/rsalveti.wordpress.com/421/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/rsalveti.wordpress.com/421/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/rsalveti.wordpress.com/421/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=rsalveti.wordpress.com&amp;blog=905525&amp;post=421&amp;subd=rsalveti&amp;ref=&amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</content>
		<author>
			<name>rsalveti</name>
			<uri>http://rsalveti.wordpress.com</uri>
		</author>
		<source>
			<title type="html">rsalveti's random thoughts</title>
			<subtitle type="html">Just another geek's weblog</subtitle>
			<link rel="self" href="http://rsalveti.wordpress.com/feed/atom/"/>
			<id>http://rsalveti.wordpress.com/feed/atom/</id>
			<updated>2012-05-15T03:15:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">HW video decode and XBMC support on a Pandaboard with Ubuntu LEB</title>
		<link href="http://rsalveti.wordpress.com/2012/01/06/hw-video-decode-and-xbmc-ubuntu-linaro/"/>
		<id>http://rsalveti.wordpress.com/?p=343</id>
		<updated>2012-01-16T02:11:41+00:00</updated>
		<content type="html">&lt;p&gt;Part of the effort we spent during the Linaro 11.12 cycle was to try to enable at Pandaboard not only hardware graphics support (GLES with PVR SGX), but also hardware accelerated video decode, as TI had released all needed userspace to be used at Ubuntu Oneiric (11.10) release.&lt;/p&gt;
&lt;p&gt;Unfortunately it didn&amp;#8217;t just work with our images because at that time we were using a newer kernel already, based on the 3.1 series that is maintained by the Linaro TI Landing Team. Bug &lt;a href=&quot;https://bugs.launchpad.net/linaro-ubuntu/+bug/880840&quot;&gt;880840&lt;/a&gt; has all the details.&lt;/p&gt;
&lt;p&gt;Luckily Sebastien Jan (from TI) was able to find the root cause of the problem, that was causing so much frame drops that was making the video playback basically unusable. The problem was related with PM support at omap&amp;#8217;s hwspinlock implementation, as you can check at this &lt;a href=&quot;http://git.linaro.org/gitweb?p=landing-teams/working/ti/kernel.git;a=commitdiff;h=c75ef57170f5886fd35d96fd4d2253e0fb5838cb;hp=0cf04c4265ae69c39e44fadafa1b811c002b0a09&quot;&gt;link&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Kernel fix properly integrated and available at the Overlay PPA used by our Linaro Ubuntu Evaluation Build images, and finally able to have a similar user experience as was expected when TI delivered the user space components at their own PPA.&lt;/p&gt;
&lt;p&gt;If you want to try it by yourself, just be sure you&amp;#8217;re using at least linux-image-3.1.1-6-linaro-lt-omap at your board (all hwpacks &amp;gt;= 20110105 should have it included by default).&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Playing videos with HW decode acceleration&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Since today you&amp;#8217;ll also easily find all the needed packages to enable HW video decode acceleration at our images (Pandaboard only at the moment, more boards coming soon). We just included and copied all needed packages from the TI PPA, so you don&amp;#8217;t even need to enable it when installing the additional packages.&lt;/p&gt;
&lt;p&gt;Installing the extra packages for video decode at your Pandaboard:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Grab the latest Pandaboard hwpack (lt-panda-x11-base-oneiric) and Ubuntu Desktop image from &lt;a href=&quot;http://snapshots.linaro.org/oneiric&quot;&gt;http://snapshots.linaro.org/oneiric&lt;/a&gt; (as example I used hwpack_linaro-lt-panda-x11-base_20120106-0_armel_supported.tar.gz and linaro-o-ubuntu-desktop-tar-20120105-0.tar.gz)&lt;/li&gt;
&lt;li&gt;Create a Ubuntu LEB pandaboard image on a SD card, following the instructions described at &lt;a href=&quot;https://wiki.linaro.org/Platform/DevPlatform/Ubuntu/ImageInstallation&quot;&gt;https://wiki.linaro.org/Platform/DevPlatform/Ubuntu/ImageInstallation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Boot the card and install the &lt;b&gt;ubuntu-omap4-extras-multimedia&lt;/b&gt; package: &lt;code&gt;$ sudo apt-get install ubuntu-omap4-extras-multimedia&lt;/code&gt;
&lt;li&gt;Reboot your pandaboard&lt;/li&gt;
&lt;li&gt;Play a video with any video player that&amp;#8217;s compatible with Gstreamer (e.g. Totem)&lt;/li&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;In the future we should also have this completely integrated at the hwpack itself, but unfortunately this is not possible at the moment without increasing the image size too much.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;XBMC support&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Another awesome thing we worked during previous cycle (11.12) was to make an XBMC version available that would use both GLES and Gstreamer, so it could also be used with a Pandaboard. Avik Sil did a great work making it all work with our images, and we were finally able to have XBMC 11 Beta (Eden) available at our Overlay PPA.&lt;/p&gt;
&lt;p&gt;For proper support for Gstreamer Rob Clark did an awesome work improving the current patches, and also improving the support quite a bit. At our package you&amp;#8217;ll find all latest patches available from Rob, from his current &lt;a href=&quot;https://github.com/robclark/xbmc/tree/gstreamer-eglimg&quot;&gt;development tree&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To start using XBMC with the Ubuntu LEB image at your Pandaboard, you just need to install the xbmc package, with &lt;code&gt;$ sudo apt-get install xbmc&lt;/code&gt;. For best user experience, please use the XBMC session available at LightDM (just log-out the default session and select XBMC instead). This will work a lot better because then there will be no other window manager or compositor taking extra resources from your board.&lt;/p&gt;
&lt;p&gt;We also hope to deliver a set-top box image by the end of the current cycle (12.01), that will have XBMC installed by default. Please check the blueprint &lt;a href=&quot;https://blueprints.launchpad.net/linaro-ubuntu/+spec/create-a-set-top-box-leb-image&quot;&gt;https://blueprints.launchpad.net/linaro-ubuntu/+spec/create-a-set-top-box-leb-image&lt;/a&gt; if you want to follow the progress of it.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Bugs and Issues&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Unfortunately not everything is working perfectly at the moment, and issues with the Gstreamer and hw video decode support on Pandaboard are expected. The most annoying one that&amp;#8217;s currently affecting XBMC is the issues with seek, as sometimes the video goes faster than the audio, and then it stops for a while until it&amp;#8217;s in sync again. We hope to get this fixed soon, but that depends a bit of how much time Rob can spend on it.&lt;/p&gt;
&lt;p&gt;In case of any other bug while trying to get video decode to work on your Pandaboard, don&amp;#8217;t hesitate to open a bug at &lt;a href=&quot;https://bugs.launchpad.net/linaro-ubuntu/+filebug&quot;&gt;https://bugs.launchpad.net/linaro-ubuntu/+filebug&lt;/a&gt; or ping aviksil, robclark or rsalveti at &lt;b&gt;#linaro&lt;/b&gt; on freenode.&lt;/p&gt;
&lt;p&gt;Cheers!&lt;/p&gt;
&lt;p&gt;Update: Check bug &lt;a href=&quot;https://bugs.launchpad.net/linaro-ubuntu/+bug/915456&quot;&gt;https://bugs.launchpad.net/linaro-ubuntu/+bug/915456&lt;/a&gt; for the video hanging issue. Without polling XBMC should now play most videos just fine.&lt;/p&gt;
&lt;p&gt;Update 2: XBMC-ready image already available at http://snapshots.linaro.org/oneiric/linaro-o-linarotv-xbmc/, just be sure to flash with http://snapshots.linaro.org/oneiric/lt-panda-x11-base-oneiric/.&lt;/p&gt;
&lt;p&gt;Update 3: There&amp;#8217;s a mem leak at the gst decode codec, check bug https://bugs.launchpad.net/ubuntu-omap4-extras-multimedia/+bug/915768 for progress on that.&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/rsalveti.wordpress.com/343/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/rsalveti.wordpress.com/343/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/rsalveti.wordpress.com/343/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/rsalveti.wordpress.com/343/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gofacebook/rsalveti.wordpress.com/343/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/rsalveti.wordpress.com/343/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gotwitter/rsalveti.wordpress.com/343/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/rsalveti.wordpress.com/343/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/rsalveti.wordpress.com/343/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/rsalveti.wordpress.com/343/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/rsalveti.wordpress.com/343/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/rsalveti.wordpress.com/343/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/rsalveti.wordpress.com/343/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/rsalveti.wordpress.com/343/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=rsalveti.wordpress.com&amp;blog=905525&amp;post=343&amp;subd=rsalveti&amp;ref=&amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</content>
		<author>
			<name>rsalveti</name>
			<uri>http://rsalveti.wordpress.com</uri>
		</author>
		<source>
			<title type="html">rsalveti's random thoughts</title>
			<subtitle type="html">Just another geek's weblog</subtitle>
			<link rel="self" href="http://rsalveti.wordpress.com/feed/atom/"/>
			<id>http://rsalveti.wordpress.com/feed/atom/</id>
			<updated>2012-05-15T03:15:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Retrospectiva 2011, planos pra 2012</title>
		<link href="http://blog.ademar.org/2011/retrospectiva-2011/"/>
		<id>http://blog.ademar.org/?p=1213</id>
		<updated>2011-12-31T21:36:29+00:00</updated>
		<content type="html">&lt;p&gt;Pra não perder a tradição (desde 2006), hora do post de fim de ano: relembrar 2011 e planejar um pouco 2012.&lt;/p&gt;
&lt;p&gt;2011 foi um ano excelente pra mim. Um ano pra ser lembrado. Começou com novidades ruins no trabalho no INdT/Nokia: &lt;a href=&quot;https://www.google.com/search?q=nokia+burning+platform+memo&quot;&gt;&amp;#8220;the burning platform&amp;#8221;&lt;/a&gt;, a aliança com a Microsoft e o futuro incerto. Pra aliviar um pouco, vieram as férias, uma excelente &lt;a href=&quot;http://blog.ademar.org/2011/ferias-2011-destino-europa/&quot;&gt;viagem à Europa&lt;/a&gt; com a Viviane: 35 dias intensos, 11 países (França, Inglaterra, Holanda, Alemanha, Russia, Polônia, República Checa, Áustria, Itália e Vaticano &amp;#8212; sim, o Vaticano conta!). Ótimas experiências com &lt;a href=&quot;http://blog.ademar.org/2007/couchsurfing/&quot;&gt;couchsurfing&lt;/a&gt;, muitos kms de estradas, trens, aeroportos&amp;#8230; Viagem intensa mas sem nenhum contratempo.&lt;/p&gt;
&lt;div id=&quot;attachment_1221&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;a href=&quot;http://blog.ademar.org/wp-content/uploads/2011/12/europa-2011.jpg&quot;&gt;&lt;img src=&quot;http://blog.ademar.org/wp-content/uploads/2011/12/europa-2011-420x280.jpg&quot; alt=&quot;Viagem à Europa 2011&quot; title=&quot;Viagem à Europa - Março/Abril 2011 (clique para ampliar)&quot; width=&quot;420&quot; height=&quot;280&quot; class=&quot;size-medium wp-image-1221&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Mosaico com algumas fotos da viagem à Europa&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Mais pro final do ano vieram duas grandes e excelentes novidades, quase que simultaneamente:&lt;/p&gt;
&lt;p&gt;Estávamos começando a fazer nossos planos pra ter um bebê quando veio a surpresa, mais do que bem vinda: a Viviane estava grávida. Estamos super empolgados e felizes. Em 2012 (abril/maio) deve chegar a Sofia, nossa primeira filha. Foi uma correria pela coincidência com as férias e aproveitamos pra visitar nossos pais (RS e PR). Também fizemos uma viagem rápida aos EUA pra aproveitar nossas últimas férias sozinhos e fazer o enxoval do bebê. Fomos pra Miami e Orlando, aliando compras com alguns passeios.&lt;/p&gt;
&lt;div id=&quot;attachment_1223&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;a href=&quot;http://blog.ademar.org/wp-content/uploads/2011/12/miami-2011.jpg&quot;&gt;&lt;img src=&quot;http://blog.ademar.org/wp-content/uploads/2011/12/miami-2011-420x280.jpg&quot; alt=&quot;Mosaico de fotos da viagem à Miami e Orlando em 2011&quot; title=&quot;Viagem à Miami e Orlando (clique para ampliar)&quot; width=&quot;420&quot; height=&quot;280&quot; class=&quot;size-medium wp-image-1223&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Mosaico de fotos da viagem à Miami e Orlando&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;A segunda grande novidade foi a mudança no trabalho: após um longo e criterioso processo de entrevistas (~3 meses), consegui uma vaga na empresa que mais admiro, pra trabalhar numa área na qual eu sempre tive muito entusiasmo mas pouca oportunidade: entrei pra &lt;a href=&quot;http://www.redhat.com&quot;&gt;Red Hat&lt;/a&gt; como gerente técnico no time de virtualização (&lt;a href=&quot;http://www.linux-kvm.org/&quot;&gt;kvm&lt;/a&gt; e &lt;a href=&quot;http://qemu.org&quot;&gt;qemu&lt;/a&gt; &amp;#8211; kernel e afins), um time cheio de grandes talentos com foco nos projetos &lt;em&gt;upstream&lt;/em&gt;, um grande desafio. Na Red Hat me senti em casa, como se eu tivesse voltado aos tempos de Conectiva: revi bons e velhos amigos e me identifiquei de imediato com os novos colegas. E no último mês do ano ainda veio mais uma novidade: consegui ser aprovado no processo de seleção do &lt;a href=&quot;http://www.cin.ufpe.br/&quot;&gt;Mestrado em Computação da UFPE/Cin&lt;/a&gt; com uma proposta na área de virtualização.&lt;/p&gt;
&lt;p&gt;A revisão dos objetivos de 2011 ficou assim:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strike&gt;Visitar dois países que eu ainda não conheça;&lt;/strike&gt; &lt;strong&gt;OK&lt;/strong&gt; &amp;#8211; o plano original era ir pra China e Índia, mas os 9 novos países europeus cumprem o objetivo com folga;&lt;/li&gt;
&lt;li&gt;Atualizar a &lt;a href=&quot;http://ademar.org/fotos/&quot;&gt;seção de fotos&lt;/a&gt; do site; &lt;strong&gt;FAIL&lt;/strong&gt; &amp;#8211; sem comentários;&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;Visitar nossos familiares e amigos no sul do Brasil;&lt;/strike&gt; &lt;strong&gt;OK&lt;/strong&gt; &amp;#8211; dava pra fazer melhor, mas Viviane foi pro RS e fomos juntos pra Umuarama &amp;#8211; PR;&lt;/li&gt;
&lt;li&gt;Começar a estudar um novo idioma, junto com a Viviane; &lt;strong&gt;FAIL&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;Estudar (formalmente ou não), pois evoluí menos do que esperava em 2010;&lt;/strike&gt; &lt;strong&gt;OK&lt;/strong&gt; &amp;#8211; foquei um pouco nos estudos no final do ano, 2012 com certeza será melhor;&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;Melhorar minha atividade nas &amp;#8220;redes sociais&amp;#8221;, reforçar antigas amizades;&lt;/strike&gt; &lt;strong&gt;OK&lt;/strong&gt; &amp;#8211; acho que posso melhorar, mas estou no caminho certo&amp;#8230;&lt;/li&gt;
&lt;li&gt;Comprar algum tipo de tablet, preferivelmente um que sirva como &lt;em&gt;ebook-reader&lt;/em&gt;; &lt;strong&gt;FAIL&lt;/strong&gt; &amp;#8211; ficou pra 2012, um Kindle está fazendo muita falta.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2012 será muito intenso e com desafios sem tamanho. Mas já começo realizando o tradicional objetivo de conhecer um novo país todo ano: em janeiro vou pra Israel a trabalho. Dessa vez não farei uma lista de planos específicos. Tenho apenas três grandes objetivos, em ordem de prioridade:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ser um bom pai pra Sofia e um bom marido pra Viviane nessa nova fase de nossas vidas;&lt;/li&gt;
&lt;li&gt;Ser um bom profissional na Red Hat, cumprindo com as expectativas e superando minhas limitações;&lt;/li&gt;
&lt;li&gt;Conseguir manter um bom ritmo no primeiro ano do mestrado na UFPE/Cin.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;É isso aí, um ótimo 2012 pra todos!&lt;/p&gt;
&lt;p&gt;Posts possivelmente relacionados:&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.ademar.org/2010/retrospectiva-2010-planos-pra-2011/&quot; rel=&quot;bookmark&quot; title=&quot;Retrospectiva 2010, planos pra 2011&quot;&gt;Retrospectiva 2010, planos pra 2011&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.ademar.org/2008/retrospectiva-2007-planos-2008/&quot; rel=&quot;bookmark&quot; title=&quot;Retrospectiva 2007, planos pra 2008&quot;&gt;Retrospectiva 2007, planos pra 2008&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.ademar.org/2008/retrospectiva-2008-planos-pra-2009/&quot; rel=&quot;bookmark&quot; title=&quot;Retrospectiva 2008, planos pra 2009&quot;&gt;Retrospectiva 2008, planos pra 2009&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;&lt;hr /&gt;
&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blog.ademar.org/2011/retrospectiva-2011/&quot;&gt;Link Permanente&lt;/a&gt; |
&lt;a href=&quot;http://blog.ademar.org/2011/retrospectiva-2011/#comments&quot;&gt;3 commentários&lt;/a&gt;&lt;br /&gt;
Post tags: &lt;a href=&quot;http://blog.ademar.org/tag/retrospectiva/&quot; rel=&quot;tag&quot;&gt;retrospectiva&lt;/a&gt;&lt;br /&gt;
&lt;/small&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogademar/~4/nA1rLmoPsRA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Ademar de Souza Reis Jr.</name>
			<uri>http://blog.ademar.org</uri>
		</author>
		<source>
			<title type="html">blog.ademar.org</title>
			<subtitle type="html">Blog pessoal de Ademar Reis</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/blogademar"/>
			<id>http://feeds.feedburner.com/blogademar</id>
			<updated>2012-05-08T21:15:06+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">UDS-P/Linaro Connect Q4.11 and 11.11 cycle</title>
		<link href="http://rsalveti.wordpress.com/2011/12/05/uds-plinaro-connect-q4-11-and-11-11-cycle/"/>
		<id>http://rsalveti.wordpress.com/?p=317</id>
		<updated>2011-12-05T16:54:33+00:00</updated>
		<content type="html">&lt;p&gt;During the end of October and beginning of November we had the last &lt;a href=&quot;http://connect.linaro.org/events/event/linaro-connect-q411/&quot;&gt;Linaro Connect&lt;/a&gt; for the year. This time we also had it together with the &lt;a href=&quot;http://uds.ubuntu.com/&quot;&gt;Ubuntu Developer Summit&lt;/a&gt;, giving us the opportunity to better discuss the roadmap with both Linaro and the Ubuntu team.&lt;/p&gt;
&lt;p&gt;From the Developer Platform team perspective, we had a quite nice week, with demos happening at Monday and Friday (showing people what we&amp;#8217;ve been working on), and also sharing some great news with the Ubuntu team, now that Mark Shuttleworth &lt;a href=&quot;http://www.markshuttleworth.com/archives/820&quot;&gt;announced&lt;/a&gt; that Ubuntu will go to Tablets, TVs and Phones (and ARM for sure will be a huge part of that).&lt;/p&gt;
&lt;p&gt;Some nice links and videos of what happened during that week (related with our team):&lt;br /&gt;
 * &lt;a href=&quot;http://summit.linaro.org/uds-p/track/linaro-platforms/&quot;&gt;Sessions related with the Developer Platform Team (Ubuntu)&lt;/a&gt;&lt;br /&gt;
 * &lt;a href=&quot;http://www.omgubuntu.co.uk/2011/11/unity-3d-ported-to-arm/&quot;&gt;Linaro Demo: Ubuntu Unity with OpenGL ES on Pandaboard&lt;/a&gt;&lt;br /&gt;
 * &lt;a href=&quot;http://www.youtube.com/watch?v=AD-me0RKsd8&quot;&gt;Linaro Developer Platform Tech Lead Ricardo Salveti Interview at Linaro Connect&lt;/a&gt;&lt;br /&gt;
 * &lt;a href=&quot;http://www.youtube.com/watch?v=829vTyKHrOg&quot;&gt;Linaro Connect Q4.11 &amp;#8211; Ubuntu LEB tutorial&lt;/a&gt;&lt;br /&gt;
 * &lt;a href=&quot;http://www.youtube.com/watch?v=ajNSrQfFcPA&quot;&gt;Linaro Connect Q4.11 &amp;#8211; Interview with Marcin Juszkiewicz&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Linaro 11.11 Release&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Another quite good achievement for us during November was the &lt;a href=&quot;http://www.linaro.org/linaro-blog/2011/11/25/linaro-11-11-released/&quot;&gt;11.11 release&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;During this release we had a quite a few great highlights, including some that we were planning for quite a while already:&lt;br /&gt;
 * &lt;a href=&quot;https://blueprints.launchpad.net/linaro-ubuntu/+spec/cross-build-firefox-chromium-multiarch&quot;&gt;Ability to cross build Firefox using Multiarch&lt;/a&gt;&lt;br /&gt;
 * &lt;a href=&quot;https://blueprints.launchpad.net/u-boot-linaro/+spec/omap4-spl-usb-booting&quot;&gt;OMAP4 SPL USB Booting&lt;/a&gt;, enabling USB boot at Pandaboard&lt;br /&gt;
 * &lt;a href=&quot;https://blueprints.launchpad.net/linaro-ubuntu/+spec/ds5.8-update&quot;&gt;ARM DS-5 support for the 5.8 release&lt;/a&gt;&lt;br /&gt;
 * CI Builds for Linaro GCC both for &lt;a href=&quot;https://blueprints.launchpad.net/linaro-ubuntu/+spec/ci-cross-linaro-gcc&quot;&gt;cross&lt;/a&gt; and &lt;a href=&quot;https://blueprints.launchpad.net/linaro-ubuntu/+spec/ci-native-linaro-gcc&quot;&gt;native&lt;/a&gt;&lt;br /&gt;
 * And a lot of &lt;a href=&quot;https://launchpad.net/linaro-dev-platform/+milestone/11.11&quot;&gt;bug fixes&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Now it&amp;#8217;s time to get ready to develop the blueprints we&amp;#8217;re planning for 11.12, to also make December another great and solid month &lt;img src=&quot;http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt;  (will do another post about the 11.12 planning later this one).&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/rsalveti.wordpress.com/317/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/rsalveti.wordpress.com/317/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/rsalveti.wordpress.com/317/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/rsalveti.wordpress.com/317/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gofacebook/rsalveti.wordpress.com/317/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/rsalveti.wordpress.com/317/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gotwitter/rsalveti.wordpress.com/317/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/rsalveti.wordpress.com/317/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/rsalveti.wordpress.com/317/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/rsalveti.wordpress.com/317/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/rsalveti.wordpress.com/317/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/rsalveti.wordpress.com/317/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/rsalveti.wordpress.com/317/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/rsalveti.wordpress.com/317/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=rsalveti.wordpress.com&amp;blog=905525&amp;post=317&amp;subd=rsalveti&amp;ref=&amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</content>
		<author>
			<name>rsalveti</name>
			<uri>http://rsalveti.wordpress.com</uri>
		</author>
		<source>
			<title type="html">rsalveti's random thoughts</title>
			<subtitle type="html">Just another geek's weblog</subtitle>
			<link rel="self" href="http://rsalveti.wordpress.com/feed/atom/"/>
			<id>http://rsalveti.wordpress.com/feed/atom/</id>
			<updated>2012-05-15T03:15:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Back to life!</title>
		<link href="http://blog.morpheuz.cc/21/11/2011/back-to-life/"/>
		<id>http://blog.morpheuz.cc/?p=349</id>
		<updated>2011-11-21T19:08:59+00:00</updated>
		<content type="html">&lt;p&gt;I am back from my honeymoon and I&amp;#8217;m starting to organize my life again!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.morpheuz.cc/wp-content/uploads/2011/11/bannersmall.jpg&quot;&gt;&lt;img class=&quot;aligncenter size-medium wp-image-350&quot; title=&quot;Incredible Circus&quot; src=&quot;http://blog.morpheuz.cc/wp-content/uploads/2011/11/bannersmall-300x98.jpg&quot; alt=&quot;Incredible Circus&quot; width=&quot;300&quot; height=&quot;98&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Meanwhile, we finally released a game that I&amp;#8217;m really proud that is called &amp;#8220;Incredible Circus&amp;#8221;. It&amp;#8217;s the kind of game that is really addictive &lt;img src=&quot;http://blog.morpheuz.cc/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; . In three weeks we achieved 200k downloads on Nokia Store and today is available for the N9. It&amp;#8217;s also a really good showcase for Qt. If you have a Symbian^3 or MeeGo device, just follow &lt;a title=&quot;Incredible Circus&quot; href=&quot;http://store.nokia.com/content/214283&quot;&gt;the link to try the game&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.morpheuz.cc/wp-content/uploads/2011/11/bannerbig.png&quot;&gt;&lt;img class=&quot;aligncenter size-medium wp-image-351&quot; title=&quot;Incredible Circus&quot; src=&quot;http://blog.morpheuz.cc/wp-content/uploads/2011/11/bannerbig-300x85.png&quot; alt=&quot;&quot; width=&quot;300&quot; height=&quot;85&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can also check it out on the video below.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Apart from that, I&amp;#8217;m updating my machine and as soon as I have a developer environment again I&amp;#8217;ll start hacking on Plasma again. Probably fixing some bugs, right Aaron? &lt;img src=&quot;http://blog.morpheuz.cc/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;</content>
		<author>
			<name>Morpheuz</name>
			<uri>http://blog.morpheuz.cc</uri>
		</author>
		<source>
			<title type="html">MoRpHeUz's Blog</title>
			<subtitle type="html">Just stuff ;)</subtitle>
			<link rel="self" href="http://blog.morpheuz.cc/feed/"/>
			<id>http://blog.morpheuz.cc/feed/</id>
			<updated>2012-05-08T15:15:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Prague, Telepathy and HTML5 IM Client</title>
		<link href="http://labs.danilocesar.com/blog/2011/11/03/prague-telepathy-and-html-5-im-client/"/>
		<id>http://labs.danilocesar.com/blog/?p=131</id>
		<updated>2011-11-03T12:37:40+00:00</updated>
		<content type="html">&lt;p&gt;Hey guys!&lt;/p&gt;
&lt;p&gt;Last week I&amp;#8217;ve attended to GStreamerConf and LinuxConf conferences in Prague, and Siraj and I had the honor of having our current project for Collabora exposed on Collabora&amp;#8217;s both. It shared space with two others amazing &lt;a href=&quot;http://www.collabora.co.uk&quot;&gt;Collabora&lt;/a&gt;&amp;#8216;s demos:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://media-explorer.org/&quot;&gt;Media Explorer&lt;/a&gt; running a Telepathy plug-in, which adds IM and Audio/Video capabilities to the system.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://mbatle.wordpress.com/2011/11/02/illusions-in-the-web-a-real-time-video-editor-built-in-html5/&quot;&gt;HTML 5 client of a video editor&lt;/a&gt;, using GStreamer Editing Services on top of GtkWebkit.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;A little bit about Telepathy Webkit Client&lt;/h3&gt;
&lt;p&gt;During the last few weeks I&amp;#8217;ve been working on a Telepathy client, a very special one, written almost only with HTML 5 and Javascript, on top of GTK WebKit and &lt;a href=&quot;http://live.gnome.org/Seed&quot;&gt;Seed&lt;/a&gt;.&lt;br /&gt;
The goal of this project was writing a Telepathy based IM client, to run on top of WebKit, and it should be able do make and receive audio and video calls.&lt;/p&gt;
&lt;h3&gt;GObject introspection magic&lt;/h3&gt;
&lt;p&gt;The first question to be answered was &amp;#8220;How access the Telepathy methods from Javascript?&amp;#8221;&lt;/p&gt;
&lt;p&gt;And the answer was: GIR and &lt;a href=&quot;http://live.gnome.org/Seed&quot;&gt;Seed&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As all Gnome developers knows, GObject introspection (GIR) allows us to access a GObject written in C  from a scriptable language, such as Javascript. So that&amp;#8217;s part of the answer.&lt;/p&gt;
&lt;p&gt;And Seed binds those introspected objects on WebKit JavascriptCore, which is pretty much what we wanted to do.&lt;/p&gt;
&lt;h3&gt;Following a few screen-shots&lt;/h3&gt;
&lt;h4&gt;Contact List&lt;/h4&gt;
&lt;p&gt;Our first goal was to show the Telepathy&amp;#8217;s roaster list on a HTML5 window. For the widgets, we choose to use &lt;a href=&quot;http://joapp.com&quot;&gt;joApp&lt;/a&gt;, which is a quite nice and stable UI library for HTML 5 applications.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://labs.danilocesar.com/blog/wp-content/uploads/2011/11/tp1.png&quot;&gt;&lt;img class=&quot;alignnone size-medium wp-image-139&quot; title=&quot;Telepathy contact list&quot; src=&quot;http://labs.danilocesar.com/blog/wp-content/uploads/2011/11/tp1-208x300.png&quot; alt=&quot;&quot; width=&quot;208&quot; height=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Chat Window&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;http://labs.danilocesar.com/blog/wp-content/uploads/2011/11/tp2.png&quot;&gt;&lt;img class=&quot;alignnone size-medium wp-image-138&quot; title=&quot;Telepathy chat window&quot; src=&quot;http://labs.danilocesar.com/blog/wp-content/uploads/2011/11/tp2-227x300.png&quot; alt=&quot;Telepathy chat window&quot; width=&quot;227&quot; height=&quot;300&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;em&gt;What&amp;#8217;s a IM client without a Chat window, right?!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The &amp;#8220;tpwebkit&amp;#8221; application with an opened text channel between two users.&lt;/p&gt;
&lt;h4&gt;Receiving a call&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;http://labs.danilocesar.com/blog/wp-content/uploads/2011/11/tp3.png&quot;&gt;&lt;img class=&quot;alignnone size-medium wp-image-137&quot; title=&quot;Receiving a call&quot; src=&quot;http://labs.danilocesar.com/blog/wp-content/uploads/2011/11/tp3-240x300.png&quot; alt=&quot;&quot; width=&quot;240&quot; height=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Telepathy WebKit application acting as a Telepathy approver for audio and video calls&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://labs.danilocesar.com/blog/wp-content/uploads/2011/11/tp4.png&quot;&gt;&lt;img class=&quot;alignnone size-medium wp-image-136&quot; title=&quot;That's me, from the point of view of a camera on another computer&quot; src=&quot;http://labs.danilocesar.com/blog/wp-content/uploads/2011/11/tp4-263x300.png&quot; alt=&quot;&quot; width=&quot;263&quot; height=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s me, from the point of view of my test machine&amp;#8230;&lt;/p&gt;
&lt;h3&gt;The real thing running&lt;/h3&gt;
&lt;p&gt;If you want to see the real thing running, you can watch this video showing the application during the early development state.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;Conclusions and future work&lt;/h3&gt;
&lt;p&gt;As we can see from now, Telepathy is ready to be use on native and HTML applications.&lt;br /&gt;
I really would like to see the current implementation integrated with the bleeding edge RTC API, which some guys are pushing to WebKit. That would be something really awesome.&lt;/p&gt;
&lt;p&gt;If you want to try it, you can get the &lt;a href=&quot;http://cgit.collabora.com/git/tpwebkit.git/&quot;&gt;code here&lt;/a&gt; and play with it. You&amp;#8217;re also going to need a few special changes on Seed package. Check the linuxconf branch &lt;a href=&quot;https://gitorious.org/~siraj/seed/sirajs-seed/commits/linuxconf&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;
Or, if you use Ubuntu, you can add &lt;a href=&quot;https://launchpad.net/~zdra/+archive/prague-demo&quot;&gt;Xavier&amp;#8217;s PPA&lt;/a&gt; and install the tpwebkit package.&lt;/p&gt;</content>
		<author>
			<name>Danilo Cesar</name>
			<uri>http://labs.danilocesar.com/blog</uri>
		</author>
		<source>
			<title type="html">Protected * Void</title>
			<subtitle type="html">Free your code, Free your mind!</subtitle>
			<link rel="self" href="http://labs.danilocesar.com/blog/feed/"/>
			<id>http://labs.danilocesar.com/blog/feed/</id>
			<updated>2011-11-03T18:15:08+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Tangaza or 'announce' in Swahili</title>
		<link href="http://ianlawrence.info/random-stuff/tangaza-or-announce-in-swahili"/>
		<id>http://ianlawrence.info/random-stuff/tangaza-or-announce-in-swahili</id>
		<updated>2011-10-14T18:54:30+00:00</updated>
		<content type="html">&lt;p&gt;Despite the rapid growth of mobile data and mobile internet, many (most) people in developing countries do not have access to mobile data. For example in Africa, there are around 45 basic mobile subscriptions but only 2 data subscriptions per 100 inhabitants. Peer to peer communication, voice calls, SMS and 'beeping' are the standard communication tools and techniques currently in use.&lt;/p&gt;
&lt;p&gt;The success of Twitter and other group communication tools has been undeniable and the development and introduction of &lt;a href=&quot;http://groupme.com/&quot;&gt;mobile app&lt;/a&gt; based messaging systems remains active. But would it be possible to design a group messaging system for people who only have access to a basic feature phone with standard GSM features available on every mobile phone?&lt;/p&gt;
&lt;p&gt;Tangaza is a mobile phone based group messaging system targeted at moderately low income users. Through the use of missed calls, a basic SMS command set and concise touch tone menu, Tangaza is designed to enable affordable spoken communication among flexible groups of users. Developed in collaboration between Nokia US and African research units, Nokia Tangaza was piloted in Kenya in 2009 and a research paper (.pdf) on this pilot and on Tangaza's design decisions was presented at the &lt;a href=&quot;http://people.csail.mit.edu/ledlie/papers/dev10-billyodero.pdf&quot;&gt;1st Annual Symposium on Computing for Development&lt;/a&gt; in 2010. The software has now been open sourced under the AGPL and I have just submitted an &lt;a href=&quot;http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=645236&quot;&gt;ITP&lt;/a&gt; to the Debian Bug Tracker. We aim to have Tangaza in the next Debian release and the &lt;a href=&quot;http://pkg-voip.alioth.debian.org/&quot;&gt;Debian VOIP team&lt;/a&gt; are helping with this effort.&lt;/p&gt;
&lt;p&gt;Tangaza runs on Linux and you will need to have&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Perl 5&lt;/li&gt;
&lt;li&gt;Python 2.6&lt;/li&gt;
&lt;li&gt;MySQL 5.0&lt;/li&gt;
&lt;li&gt;Django 1.2&lt;/li&gt;
&lt;li&gt;Kannel 1.4.3&lt;/li&gt;
&lt;li&gt;Asterisk 1.6.2&lt;/li&gt;&lt;/ul&gt;
installed on your Debian based system if you want to build Tangaza before it reaches the main repositories . You need to
&lt;pre&gt;git clone https://github.com/tangaza/Tangaza

git checkout -b upstream --track origin/master

(The '--track' option alters your .git/config file and adds a [branch &quot;upstream&quot;] section telling Git where you fetched it from. That means you can later just say &quot;git pull&quot; and you will get both the 'master' and the 'upstream' repository merged into your repository automatically.)

git checkout master

git-buildpackage --git-ignore-new --git-builder=debuild -i.git -I.git -us -uc&lt;/pre&gt;
and install the resulting .deb package
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;During the last development cycle we built Tangaza a web enabled administrative interface in Django where the groups, members and organization information can be modified
&lt;img src=&quot;http://ianlawrence.info/random-stuff/images/groups&quot; /&gt; and the messages (called Tangazo's) can be listened to &lt;img src=&quot;http://ianlawrence.info/random-stuff/images/messages&quot; /&gt; We also wrote some &lt;a href=&quot;http://nora04.nrcc.noklab.com/docs/&quot;&gt;documentation&lt;/a&gt; about the API calls we make available through RPC for developers who want to build applications on top of Tangaza.&lt;/p&gt;
&lt;p&gt;There is some interest in using Tangaza as an agricultural early warning system in East Africa. A  &lt;a href=&quot;http://www.humanitarianinnovation.org/&quot;&gt;Humanitarian Innovation Fund&lt;/a&gt; expression of interest passed through to a call for a full proposal which is pretty exciting both in terms of potential impact and also for the new features which can be developed with increased funding &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content>
		<author>
			<name>Ian Lawrence</name>
			<uri>http://ianlawrence.info/random-stuff</uri>
		</author>
		<source>
			<title type="html">Ian Lawrence - Blog</title>
			<subtitle type="html">What is the digital equivalent of lovely? He wondered. What are the digits that encode beauty, the number-fingers that enclose, transform, transmit, decode, and somehow, in the process, fail to trap or choke the soul of it? Not because of the technology but in spite of it, beauty, that ghost, that treasure, passes undiminished through the new machines.</subtitle>
			<link rel="self" href="http://ianlawrence.info/random-stuff/RSS2"/>
			<id>http://ianlawrence.info/random-stuff/RSS2</id>
			<updated>2012-05-19T05:15:17+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">It has been a while</title>
		<link href="http://blog.morpheuz.cc/14/09/2011/it-has-been-a-while/"/>
		<id>http://blog.morpheuz.cc/?p=336</id>
		<updated>2011-09-14T12:24:44+00:00</updated>
		<content type="html">&lt;p&gt;It has been a while since my &lt;a title=&quot;kdeplasma-addons is on git too&quot; href=&quot;http://blog.morpheuz.cc/01/02/2011/kdeplasma-addons-is-on-git-too/&quot;&gt;last post&lt;/a&gt; and a lot happened in the meantime. Just to point a few (in no special order):&lt;/p&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;11th February for Nokia;&lt;/li&gt;
&lt;li&gt;Tokamak;&lt;/li&gt;
&lt;li&gt;GSoC;&lt;/li&gt;
&lt;li&gt;Qt Contributor Summit;&lt;/li&gt;
&lt;li&gt;Qt Open Governance announced;&lt;/li&gt;
&lt;li&gt;Desktop Summit;&lt;/li&gt;
&lt;li&gt;Release of N9;&lt;/li&gt;
&lt;li&gt;Google acquired Motorola;&lt;/li&gt;
&lt;li&gt;Plasma Active;&lt;/li&gt;
&lt;li&gt;Netflix in Brazil;&lt;/li&gt;
&lt;li&gt;Use of Tiny Tiny RSS (&lt;a href=&quot;http://rss.morpheuz.cc//backend.php?op=rss&amp;id=-2&amp;view-mode=all_articles&amp;key=a79a73fd84b22edd0dfc33e5c9298276524a39d2&quot;&gt;my share feed&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&amp;#8230;(many other stuff!)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The sad part though is that I haven&amp;#8217;t been able to contribute much code to KDE lately. Next month I&amp;#8217;m getting married and as you can probably guess, there is a lot of planning going on (and we can&amp;#8217;t forget the famous &amp;#8220;bridezilla&amp;#8221; effect that usually happens with girls before weddings &lt;img src=&quot;http://blog.morpheuz.cc/wp-includes/images/smilies/icon_razz.gif&quot; alt=&quot;:P&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;On the bright side I&amp;#8217;ve been working on awesome projects, trying to eat our own dog food (mainly QML). With these projects we are feeling the pieces of Qt/QML that needs some love and we plan that for the next year we will be able to help the &lt;a title=&quot;Qt Project&quot; href=&quot;http://labs.qt.nokia.com/2011/09/12/qt-project/&quot;&gt;Qt Project&lt;/a&gt; to solve these &lt;del&gt;small&lt;/del&gt; issues that you can only find when you develop real world applications and not developer/designer-wanna-be demos &lt;img src=&quot;http://blog.morpheuz.cc/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;IMHO that&amp;#8217;s one of the skills that is hard to find today on framework developers: most of them didn&amp;#8217;t contribute much to KDE in the last years nor developed real applications. Because of this sometimes it gets harder for them to understand a use case or a &amp;#8220;complain&amp;#8221; about the technology they develop. I hope that with open governance we can get more help about this (and also use more the rule of the &amp;#8220;3 examples&amp;#8221; before adding new APIs).&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve been following closely the development of Plasma Active and the rest of KDE. I still have one item on my TODO list (related to one of our scripts that get the content of qml files that need translation) that I promised to tsdgeos that I would fix ASAP but I just didn&amp;#8217;t have the time unfortunately &lt;img src=&quot;http://blog.morpheuz.cc/wp-includes/images/smilies/icon_sad.gif&quot; alt=&quot;:(&quot; class=&quot;wp-smiley&quot; /&gt;  . November seems the month that I will be able to get back to KDE development (after the honeymoon!!).&lt;/p&gt;
&lt;p&gt;Well, I think that&amp;#8217;s it. I just wanted to make a simple blog post and update my KDE friends &lt;img src=&quot;http://blog.morpheuz.cc/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;/div&gt;</content>
		<author>
			<name>Morpheuz</name>
			<uri>http://blog.morpheuz.cc</uri>
		</author>
		<source>
			<title type="html">MoRpHeUz's Blog</title>
			<subtitle type="html">Just stuff ;)</subtitle>
			<link rel="self" href="http://blog.morpheuz.cc/feed/"/>
			<id>http://blog.morpheuz.cc/feed/</id>
			<updated>2012-05-08T15:15:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">CellarDoor in German plus Debian package</title>
		<link href="http://savago.wordpress.com/2011/08/17/cellardoor-in-german-plus-debian-package/"/>
		<id>http://savago.wordpress.com/?p=444</id>
		<updated>2011-08-17T01:23:10+00:00</updated>
		<content type="html">&lt;p&gt;Dear friends&lt;/p&gt;
&lt;p&gt;Some quick updates on CellarDoor are due. Since last week, it has debian packaging support in the buildsystem, contributed by Milton Soares.&lt;/p&gt;
&lt;p&gt;Simply run &amp;#8216;make deb&amp;#8217; and you are set: a nice debian package is generated at end.&lt;/p&gt;
&lt;p&gt;Next, Adriano Cavalcanti contributed another translation to CellarDoor, German:&lt;br /&gt;
&lt;a href=&quot;http://savago.files.wordpress.com/2011/08/cellar_de.png&quot;&gt;&lt;img class=&quot;aligncenter size-medium wp-image-451&quot; title=&quot;cellar_de&quot; src=&quot;http://savago.files.wordpress.com/2011/08/cellar_de.png?w=169&amp;h=300&quot; alt=&quot;&quot; width=&quot;169&quot; height=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thanks to the fact that German has some bigger than average words, it will require some adjustment in some parts of the UI, but so far so good! As soon I finish some missing features, I&amp;#8217;m planning to make a &amp;#8216;non-hackers&amp;#8217; release.&lt;/p&gt;
&lt;p&gt;Currently CellarDoor is available in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;English&lt;/li&gt;
&lt;li&gt;Brazilian Portuguese&lt;/li&gt;
&lt;li&gt;Italian&lt;/li&gt;
&lt;li&gt;German&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Do you known French or Spanish?&lt;br /&gt;
 &lt;img src=&quot;http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/savago.wordpress.com/444/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/savago.wordpress.com/444/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/savago.wordpress.com/444/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/savago.wordpress.com/444/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gofacebook/savago.wordpress.com/444/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/savago.wordpress.com/444/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gotwitter/savago.wordpress.com/444/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/savago.wordpress.com/444/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/savago.wordpress.com/444/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/savago.wordpress.com/444/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/savago.wordpress.com/444/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/savago.wordpress.com/444/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/savago.wordpress.com/444/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/savago.wordpress.com/444/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=savago.wordpress.com&amp;blog=8919535&amp;post=444&amp;subd=savago&amp;ref=&amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;&lt;div class=&quot;sharedaddy&quot;&gt;&lt;/div&gt;</content>
		<author>
			<name>savago</name>
			<uri>http://savago.wordpress.com</uri>
		</author>
		<source>
			<title type="html">Savago's Blog</title>
			<subtitle type="html">Just another WordPress.com weblog</subtitle>
			<link rel="self" href="http://savago.wordpress.com/feed/atom/"/>
			<id>http://savago.wordpress.com/feed/atom/</id>
			<updated>2011-08-17T21:15:18+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">CellarDoor got its second translation: Italian!</title>
		<link href="http://savago.wordpress.com/2011/08/08/cellardoor-got-its-second-translation-italian/"/>
		<id>http://savago.wordpress.com/?p=414</id>
		<updated>2011-08-08T14:16:35+00:00</updated>
		<content type="html">&lt;p&gt;Friends&lt;/p&gt;
&lt;p&gt;Just 1 day after blogging about my pet project CellarDoor, I was contacted by Francesco Frassinelli asking about how to make translations.&lt;/p&gt;
&lt;p&gt;The result in the next day can be checked below:&lt;br /&gt;
&lt;a href=&quot;http://savago.files.wordpress.com/2011/08/cellar_italian2.png&quot;&gt;&lt;img src=&quot;http://savago.files.wordpress.com/2011/08/cellar_italian2.png?w=169&amp;h=300&quot; alt=&quot;&quot; title=&quot;cellar_italian2&quot; width=&quot;169&quot; height=&quot;300&quot; class=&quot;aligncenter size-medium wp-image-442&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Of course there are some places in the UI that we will need to make minor adjustments, but it certainly is progressing really fast (except for minor UI code glitches, the Italian translation is done).&lt;/p&gt;
&lt;p&gt;Do you speak German or French? Want to contribute to OSS/Freesoftware? Let me known.&lt;br /&gt;
 &lt;img src=&quot;http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/savago.wordpress.com/414/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/savago.wordpress.com/414/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/savago.wordpress.com/414/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/savago.wordpress.com/414/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gofacebook/savago.wordpress.com/414/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/savago.wordpress.com/414/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gotwitter/savago.wordpress.com/414/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/savago.wordpress.com/414/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/savago.wordpress.com/414/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/savago.wordpress.com/414/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/savago.wordpress.com/414/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/savago.wordpress.com/414/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/savago.wordpress.com/414/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/savago.wordpress.com/414/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=savago.wordpress.com&amp;blog=8919535&amp;post=414&amp;subd=savago&amp;ref=&amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;&lt;div class=&quot;sharedaddy&quot;&gt;&lt;/div&gt;</content>
		<author>
			<name>savago</name>
			<uri>http://savago.wordpress.com</uri>
		</author>
		<source>
			<title type="html">Savago's Blog</title>
			<subtitle type="html">Just another WordPress.com weblog</subtitle>
			<link rel="self" href="http://savago.wordpress.com/feed/atom/"/>
			<id>http://savago.wordpress.com/feed/atom/</id>
			<updated>2011-08-17T21:15:18+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Presenting CellarDoor</title>
		<link href="http://savago.wordpress.com/2011/08/06/presenting-cellardoor/"/>
		<id>http://savago.wordpress.com/?p=415</id>
		<updated>2011-08-06T14:01:43+00:00</updated>
		<content type="html">&lt;p&gt;Last January I was talking with my friend Wilson Prata about applications. We have partnered a couple of years ago when creating &lt;a href=&quot;http://amora.googlecode.com&quot;&gt;amora&lt;/a&gt; (which by the way needs some care urgently, but this is another matter) and he presented to me a concept for a nice and cool new app: CellarDoor.&lt;/p&gt;
&lt;p&gt;What is CellaDoor? Well, it is a wine app. Have you ever started a conversation with someone that also appreciate wines and then failed when trying to remember the name of a good wine you tasted a couple of months ago?&lt;/p&gt;
&lt;p&gt;Or what about easily exchanging a wine recommendation? Trying to keep notes in a restaurant napkin is not really much effective.&lt;/p&gt;
&lt;p&gt;Trying to address this and other user cases, I started to work in the mockups that he had at time. A great UX designer once taught me the value of close cooperation between programmers X designers to create something that looks good and performs well (and I honestly believe that the best way to create an app is to have at least one designer aboard since the very beginning). This is a different approach than the traditional hack-hack-hack then later ask a designer for some cute icons which is, with some exceptions, the rule in OSS/Freesoftware world.&lt;/p&gt;
&lt;p&gt;Unfortunately, I lacked enough free time to progress quickly, but I believe that the app has progressed well enough for a public release. You can checkout the &lt;a title=&quot;CellaDoor's project page&quot; href=&quot;http://cellardoor.googlecode.com&quot; target=&quot;_blank&quot;&gt;project&amp;#8217;s webpage&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So, what are the current features? Here they are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;good looking UI with nice usability&lt;/li&gt;
&lt;li&gt;create a wine card with basic information (year, name, vineyard, etc)&lt;/li&gt;
&lt;li&gt;filter by wine type (e.g. red, white, other)&lt;/li&gt;
&lt;li&gt;persistence of data in a sqlite database (which by the way you can edit in the desktop)&lt;/li&gt;
&lt;li&gt;Supported platforms: Linux, OSX, Windows 7, Symbian 5th and 3 (e.g N8, N5800, etc)&lt;/li&gt;
&lt;li&gt;snap a photo of the bottle/cork in supported platforms (Linux, Symbian). Persistence of this photo is my todo list (hey, I didn&amp;#8217;t say that the app is completely done!).&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;How it looks like? Check it (running in OSX 10.6):&lt;/div&gt;
&lt;div&gt;&lt;a href=&quot;http://savago.files.wordpress.com/2011/08/osx.png&quot;&gt;&lt;img class=&quot;aligncenter size-full wp-image-421&quot; title=&quot;osx&quot; src=&quot;http://savago.files.wordpress.com/2011/08/osx.png?w=411&amp;h=719&quot; alt=&quot;&quot; width=&quot;411&quot; height=&quot;719&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div&gt;== What about the technology? ==&lt;/div&gt;
&lt;p&gt;The magic to support such varying OSes (Linux, Window, OSX, Symbian), form factors (Mobile, Netbook, Desktop) and resolutions (from 360&amp;#215;640, ranging in 1024&amp;#215;800 and up) is that I used Qt/QML for the UI. At time that I started, Qt Components were not ready yet, so I got to implement my own (probably buggy) widgets like a combobox (based in joint work with my other friend Ricardo Sato) and a calendar widget (coded together with my friend Igor Trindade), this last widget deserves to be pictured bellow:&lt;/p&gt;
&lt;div&gt;&lt;a href=&quot;http://savago.files.wordpress.com/2011/08/calendar_win7.png&quot;&gt;&lt;img class=&quot;aligncenter size-full wp-image-423&quot; title=&quot;calendar_win7&quot; src=&quot;http://savago.files.wordpress.com/2011/08/calendar_win7.png?w=382&amp;h=680&quot; alt=&quot;&quot; width=&quot;382&quot; height=&quot;680&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div&gt;== What is next? ==&lt;/div&gt;
&lt;p&gt;A long backlog indeed waits in the issue tracker of the project. Between those, I believe that next steps should be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Packaging: for symbian I have it done (self signed), Window7 I played with WiX to create an installer but I need help for testing. OSX packaging (.dmg) and rpm/deb help would be greatly appreciated;&lt;/li&gt;
&lt;li&gt;Translation: it currently supports English and Brazilian Portuguese. I believe it would be cool to support other languages (French, Italian, German);&lt;/li&gt;
&lt;li&gt;Coding: there are several features that would be awesome to have, if you are interested, let me known.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, since ATM there aren&amp;#8217;t public packages yet, I guess this is a &amp;#8216;hacker&amp;#8217;s only release&amp;#8217;. What you need to compile it is Qt 4.7.x and if in Linux, Qt Mobility 1.1.&lt;/p&gt;
&lt;p&gt;Concerning the license, it is good and old GPL v2 code with CC non-commercial for the artwork.&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/savago.wordpress.com/415/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/savago.wordpress.com/415/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/savago.wordpress.com/415/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/savago.wordpress.com/415/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gofacebook/savago.wordpress.com/415/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/savago.wordpress.com/415/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gotwitter/savago.wordpress.com/415/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/savago.wordpress.com/415/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/savago.wordpress.com/415/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/savago.wordpress.com/415/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/savago.wordpress.com/415/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/savago.wordpress.com/415/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/savago.wordpress.com/415/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/savago.wordpress.com/415/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=savago.wordpress.com&amp;blog=8919535&amp;post=415&amp;subd=savago&amp;ref=&amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;&lt;div class=&quot;sharedaddy&quot;&gt;&lt;/div&gt;</content>
		<author>
			<name>savago</name>
			<uri>http://savago.wordpress.com</uri>
		</author>
		<source>
			<title type="html">Savago's Blog</title>
			<subtitle type="html">Just another WordPress.com weblog</subtitle>
			<link rel="self" href="http://savago.wordpress.com/feed/atom/"/>
			<id>http://savago.wordpress.com/feed/atom/</id>
			<updated>2011-08-17T21:15:18+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Long time no see you</title>
		<link href="http://savago.wordpress.com/2011/08/05/long-time-no-see-you/"/>
		<id>http://savago.wordpress.com/?p=372</id>
		<updated>2011-08-05T22:44:29+00:00</updated>
		<content type="html">&lt;p&gt;It is being almost one year without posting in my blog&amp;#8230; What else to say, besides I have being busy? Since my last post, I have:&lt;/p&gt;
&lt;p&gt;a) Trying to be a not so &lt;a href=&quot;http://savago.files.wordpress.com/2011/08/father1.jpg&quot;&gt;lousy&lt;/a&gt; father;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://savago.files.wordpress.com/2011/08/father2.jpg&quot;&gt;&lt;img class=&quot;aligncenter size-full wp-image-376&quot; title=&quot;father2&quot; src=&quot;http://savago.files.wordpress.com/2011/08/father2.jpg?w=455&amp;h=341&quot; alt=&quot;&quot; width=&quot;455&quot; height=&quot;341&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;b) Led 2 teams in 2 different projects at same time at OpenBossa (both non-oss, targeting Symbian and Maemo respectively);&lt;/p&gt;
&lt;p&gt;c) Visited Boston, Brussels, &lt;a href=&quot;http://savago.files.wordpress.com/2011/08/miami.jpg&quot;&gt;Miami&lt;/a&gt;, &lt;a href=&quot;http://savago.files.wordpress.com/2011/08/london.jpg&quot;&gt;London&lt;/a&gt;,  Bristol, Jericoacoara;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://savago.files.wordpress.com/2011/08/jeri1.jpg&quot;&gt;&lt;img class=&quot;aligncenter size-full wp-image-382&quot; title=&quot;jeri1&quot; src=&quot;http://savago.files.wordpress.com/2011/08/jeri1.jpg?w=455&amp;h=341&quot; alt=&quot;&quot; width=&quot;455&quot; height=&quot;341&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;d) Improving my old motorcycle with new accessories;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://savago.files.wordpress.com/2011/08/motorcycle.jpg&quot;&gt;&lt;img class=&quot;aligncenter size-full wp-image-386&quot; title=&quot;motorcycle&quot; src=&quot;http://savago.files.wordpress.com/2011/08/motorcycle.jpg?w=455&amp;h=341&quot; alt=&quot;&quot; width=&quot;455&quot; height=&quot;341&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;e) Bought a Brazilian off road &amp;#8220;car&amp;#8221; and travelled through the &lt;a href=&quot;http://savago.files.wordpress.com/2011/08/travel_big.png&quot;&gt;country side&lt;/a&gt;;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://savago.files.wordpress.com/2011/08/troller.jpg&quot;&gt;&lt;img class=&quot;aligncenter size-full wp-image-389&quot; title=&quot;troller&quot; src=&quot;http://savago.files.wordpress.com/2011/08/troller.jpg?w=455&amp;h=341&quot; alt=&quot;&quot; width=&quot;455&quot; height=&quot;341&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;f) Moved to a new apartment, with space for a &lt;a href=&quot;http://savago.files.wordpress.com/2011/08/office.jpg&quot;&gt;small office&lt;/a&gt;;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://savago.files.wordpress.com/2011/08/office_new.jpg&quot;&gt;&lt;img class=&quot;aligncenter size-full wp-image-395&quot; title=&quot;office_new&quot; src=&quot;http://savago.files.wordpress.com/2011/08/office_new.jpg?w=455&amp;h=606&quot; alt=&quot;&quot; width=&quot;455&quot; height=&quot;606&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;g) Since just motorcycling is not enough, tried some &lt;a href=&quot;http://savago.files.wordpress.com/2011/08/hanglider.jpg&quot;&gt;new things&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://savago.files.wordpress.com/2011/08/hafting.jpg&quot;&gt;&lt;img class=&quot;aligncenter size-full wp-image-401&quot; title=&quot;hafting&quot; src=&quot;http://savago.files.wordpress.com/2011/08/hafting.jpg?w=455&amp;h=303&quot; alt=&quot;&quot; width=&quot;455&quot; height=&quot;303&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;h) After learning QML, decided to write a new pet project (details in the next post!)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://savago.files.wordpress.com/2011/08/splash.png&quot;&gt;&lt;img class=&quot;aligncenter size-full wp-image-407&quot; title=&quot;splash&quot; src=&quot;http://savago.files.wordpress.com/2011/08/splash.png?w=362&amp;h=642&quot; alt=&quot;&quot; width=&quot;362&quot; height=&quot;642&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;i) Reviewing and merging several patches in libgcal (news soon!)&lt;/p&gt;
&lt;p&gt;And probably some other stuff that I plainly forgot. Now, I&amp;#8217;m planning to post once in a while to not let my blog to collect dust&amp;#8230; after all, like I said way back in September 2009: &amp;#8220;&amp;#8230; having a half-alive, half-dead, zoombie-like blog is worst than having no blog at all.&amp;#8221;.&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/savago.wordpress.com/372/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/savago.wordpress.com/372/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/savago.wordpress.com/372/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/savago.wordpress.com/372/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gofacebook/savago.wordpress.com/372/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/savago.wordpress.com/372/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gotwitter/savago.wordpress.com/372/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/savago.wordpress.com/372/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/savago.wordpress.com/372/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/savago.wordpress.com/372/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/savago.wordpress.com/372/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/savago.wordpress.com/372/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/savago.wordpress.com/372/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/savago.wordpress.com/372/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=savago.wordpress.com&amp;blog=8919535&amp;post=372&amp;subd=savago&amp;ref=&amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;&lt;div class=&quot;sharedaddy&quot;&gt;&lt;/div&gt;</content>
		<author>
			<name>savago</name>
			<uri>http://savago.wordpress.com</uri>
		</author>
		<source>
			<title type="html">Savago's Blog</title>
			<subtitle type="html">Just another WordPress.com weblog</subtitle>
			<link rel="self" href="http://savago.wordpress.com/feed/atom/"/>
			<id>http://savago.wordpress.com/feed/atom/</id>
			<updated>2011-08-17T21:15:18+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">launchpadlib: creating a changelog for a PPA</title>
		<link href="http://rsalveti.wordpress.com/2011/07/19/launchpadlib-creating-a-changelog-for-a-ppa/"/>
		<id>http://rsalveti.wordpress.com/?p=300</id>
		<updated>2011-07-19T03:34:58+00:00</updated>
		<content type="html">&lt;p&gt;As at Linaro we usually work with many PPAs over the releases, there was a need to generate a proper changelog for a PPA, in a way we could know what packages got changed before doing the release.&lt;/p&gt;
&lt;p&gt;At first I thought I could just parse the repository metadata (as a PPA is nothing more than a debian repository), but then I realized I could just use the awesome (yes, &lt;strong&gt;*awesome*&lt;/strong&gt;) launchpadlib, if it had a way to get the data I needed.&lt;/p&gt;
&lt;p&gt;So I called the launchpadlib master I know (&lt;a href=&quot;http://ursinha.net/&quot; title=&quot;Ursinha&quot;&gt;Ursinha&lt;/a&gt;), and in 15 minutes we saw that we could use it to parse the &amp;#8220;.changes&amp;#8221; file, and from there get the data I needed. As Launchpad stores the PPA packages publishing history, it&amp;#8217;s quite easy to get all the changes over period of time.&lt;/p&gt;
&lt;p&gt;A few minutes later (after also noticing that there&amp;#8217;s a python-debian module to parse the changes file), I created the first version of the &lt;strong&gt;generate-ppa-changelog.py&lt;/strong&gt; script, that does exactly what I needed, and with just a few python lines &lt;img src=&quot;http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s the link: &lt;a href=&quot;http://bazaar.launchpad.net/~rsalveti/+junk/launchpad/view/head:/generate-ppa-changelog.py&quot; title=&quot;http://bazaar.launchpad.net/~rsalveti/+junk/launchpad/view/head:/generate-ppa-changelog.py&quot;&gt;http://bazaar.launchpad.net/~rsalveti/+junk/launchpad/view/head:/generate-ppa-changelog.py&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Usage:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
rsalveti@evatp:~/projects/launchpad/scripts$ python generate-ppa-changelog.py -h&lt;br /&gt;
usage: generate-ppa-changelog.py [-h] [-d YYYYMMDD] [-s SERIES] -t TEAM&lt;br /&gt;
                                 [-p PPA] [--version]&lt;/p&gt;
&lt;p&gt;Print Changelog for a PPA&lt;/p&gt;
&lt;p&gt;optional arguments:&lt;br /&gt;
  -h, &amp;#8211;help            show this help message and exit&lt;br /&gt;
  -d YYYYMMDD, &amp;#8211;date YYYYMMDD&lt;br /&gt;
                        start date to probe for changes&lt;br /&gt;
  -s SERIES, &amp;#8211;series SERIES&lt;br /&gt;
                        ubuntu series to look for changes (default: natty)&lt;br /&gt;
  -t TEAM, &amp;#8211;team TEAM  launchpad team that owns the PPA&lt;br /&gt;
  -p PPA, &amp;#8211;ppa PPA     ppa name to probe the changelog (default: first PPA)&lt;br /&gt;
  &amp;#8211;version             show program&amp;#8217;s version number and exit&lt;/p&gt;
&lt;p&gt;If no argument is given, it will probe all the changes for the default series.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Output Example:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
rsalveti@evatp:~/projects/launchpad/scripts$ python generate-ppa-changelog.py -t linaro-maintainers -p overlay -s natty -d 20110701&lt;br /&gt;
Changelog for linaro-maintainers&amp;#8217;s overlay PPA (series natty) since 2011-07-01 00:00:00&lt;/p&gt;
&lt;p&gt; base-files (5.0.0ubuntu28linaro3) natty; urgency=low&lt;/p&gt;
&lt;p&gt;   * Updating Linaro LEB version to 11.07 (development branch)&lt;/p&gt;
&lt;p&gt;  &amp;#8212; Ricardo Salveti de Araujo   Fri, 15 Jul 2011 04:19:40 -0300&lt;/p&gt;
&lt;p&gt; libjpeg-turbo (1.1.1-1inaro2) natty; urgency=low&lt;/p&gt;
&lt;p&gt;   * release&lt;br /&gt;
   * add timestamp code to cjpeg.c&lt;br /&gt;
   * default cjpeg.c and djpeg.c timestamp code to off&lt;/p&gt;
&lt;p&gt;  &amp;#8212; Tom Gall   Mon, 11 Jul 2011 20:32:23 +0000&lt;/p&gt;
&lt;p&gt; linaro-meta (017) natty; urgency=low&lt;/p&gt;
&lt;p&gt;   * Refreshed dependencies&lt;br /&gt;
   * Added libjpeg-turbo62 to linaro-alip, linaro-graphical-engineering,&lt;br /&gt;
     linaro-multimedia-engineering, linaro-ubuntu-desktop&lt;/p&gt;
&lt;p&gt;  &amp;#8212; Tom Gall   Wed, 13 Jul 2011 15:41:29 +0000&lt;/p&gt;
&lt;p&gt; u-boot-linaro (2011.07.1-0ubuntu1~natty1) natty; urgency=low&lt;/p&gt;
&lt;p&gt;   * New upstream 2011.07.1 which includes&lt;br /&gt;
      &amp;#8211; PXE FDT fix from previous ubuntu release so patch has been removed&lt;br /&gt;
      &amp;#8211; Added missing PXE env vars (LP: #808815)&lt;br /&gt;
      &amp;#8211; Generated unique usbethaddr (LP: #809015)&lt;br /&gt;
      &amp;#8211; Modify pxe command to look for usbethaddr if ethaddr is NULL&lt;/p&gt;
&lt;p&gt;  &amp;#8212; John Rigby   Wed, 13 Jul 2011 23:31:39 -0600&lt;/p&gt;
&lt;p&gt; x-loader (1.5.1+git20110715+fca7cd2-1ubuntu1~natty1) natty; urgency=low&lt;/p&gt;
&lt;p&gt;   * New upstream release&lt;br /&gt;
     &amp;#8211; several fixes for panda and igep&lt;br /&gt;
     &amp;#8211; OMAP3 code cleanup&lt;br /&gt;
     &amp;#8211; Beagle Rev C5 support&lt;br /&gt;
     &amp;#8211; Support for IGEPv3 board&lt;/p&gt;
&lt;p&gt;  &amp;#8212; Ricardo Salveti de Araujo   Fri, 15 Jul 2011 05:55:09 -0300&lt;/p&gt;
&lt;p&gt; x-loader (1.5.0+git20110714+cdc887b-1ubuntu1~natty1) natty; urgency=low&lt;/p&gt;
&lt;p&gt;   * New upstream release&lt;br /&gt;
     &amp;#8211; Adding support for IGEPv3 board&lt;br /&gt;
   * debian/patches/01-Beagle-Rev-C5-support.patch:&lt;br /&gt;
     &amp;#8211; Adding support for the new Beagle C5&lt;/p&gt;
&lt;p&gt;  &amp;#8212; Ricardo Salveti de Araujo   Fri, 15 Jul 2011 02:36:58 -0300
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;And now we can just generate the proper changelog anytime we want to do a call for testing or a Linaro Ubuntu release &lt;img src=&quot;http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/rsalveti.wordpress.com/300/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/rsalveti.wordpress.com/300/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/rsalveti.wordpress.com/300/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/rsalveti.wordpress.com/300/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gofacebook/rsalveti.wordpress.com/300/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/rsalveti.wordpress.com/300/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gotwitter/rsalveti.wordpress.com/300/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/rsalveti.wordpress.com/300/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/rsalveti.wordpress.com/300/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/rsalveti.wordpress.com/300/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/rsalveti.wordpress.com/300/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/rsalveti.wordpress.com/300/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/rsalveti.wordpress.com/300/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/rsalveti.wordpress.com/300/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=rsalveti.wordpress.com&amp;blog=905525&amp;post=300&amp;subd=rsalveti&amp;ref=&amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</content>
		<author>
			<name>rsalveti</name>
			<uri>http://rsalveti.wordpress.com</uri>
		</author>
		<source>
			<title type="html">rsalveti's random thoughts</title>
			<subtitle type="html">Just another geek's weblog</subtitle>
			<link rel="self" href="http://rsalveti.wordpress.com/feed/atom/"/>
			<id>http://rsalveti.wordpress.com/feed/atom/</id>
			<updated>2012-05-15T03:15:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Net booting with TFTP and PXE with Pandaboard</title>
		<link href="http://rsalveti.wordpress.com/2011/07/11/net-booting-with-tftp-and-pxe-with-pandaboard/"/>
		<id>http://rsalveti.wordpress.com/?p=266</id>
		<updated>2011-07-11T09:38:44+00:00</updated>
		<content type="html">&lt;p&gt;Over the past month I&amp;#8217;ve being working with John Rigby to integrate the SMSC95XX and OMAP4 EHCI patches into Linaro U-Boot, so we could deliver the network booting feature for people using Pandaboards.&lt;/p&gt;
&lt;p&gt;Those patches are published at the U-Boot mailing list, but still as a working in progress. While we work helping the original developers to get the patches accepted upstream, we also want to deliver the functionality for our users, so all those patches are now integrated at the Linaro U-Boot tree.&lt;/p&gt;
&lt;p&gt;You can check the patches by going at &lt;a href=&quot;http://git.linaro.org/gitweb?p=boot/u-boot-linaro-stable.git;a=shortlog&quot;&gt;http://git.linaro.org/gitweb?p=boot/u-boot-linaro-stable.git;a=shortlog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Testing with Pandaboard&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To make it work properly, besides using Linaro U-Boot you&amp;#8217;ll also need to use the upstream X-Loader tree, with one additional patch that&amp;#8217;s not yet merged. You can clone the upstream tree from &lt;a href=&quot;http://gitorious.org/x-loader/x-loader&quot;&gt;http://gitorious.org/x-loader/x-loader&lt;/a&gt;, then just apply the patch &lt;a href=&quot;http://people.canonical.com/~rsalveti/pxe/0001-omap4-pandaboard-ehci-fref_clkout-per-board-revision.patch&quot;&gt;http://people.canonical.com/~rsalveti/pxe/0001-omap4-pandaboard-ehci-fref_clkout-per-board-revision.patch&lt;/a&gt; and build for the Pandaboard target.&lt;/p&gt;
&lt;p&gt;If you just want to test without building your own X-Loader and U-Boot, you can just grab both files from  http://people.canonical.com/~rsalveti:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;X-Loader: &lt;a href=&quot;http://people.canonical.com/~rsalveti/pxe/MLO&quot;&gt;http://people.canonical.com/~rsalveti/pxe/MLO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;U-Boot: &lt;a href=&quot;http://people.canonical.com/~rsalveti/pxe/3/u-boot.bin&quot;&gt;http://people.canonical.com/~rsalveti/pxe/3/u-boot.bin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Building your TFTP + DHCP server for PXE&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To build your TFTP + DCHP server just follow the instructions described at &lt;a href=&quot;https://help.ubuntu.com/community/Desktop/PXE&quot;&gt;https://help.ubuntu.com/community/Desktop/PXE&lt;/a&gt;. Don&amp;#8217;t worry about the &amp;#8216;filename &amp;#8220;pxelinux.0&amp;#8243;;&amp;#8217; line at the dhcpd.conf file, you can remove it.&lt;/p&gt;
&lt;p&gt;Then just create your PXE config file at the right place:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
$ cat /tftpboot/pxelinux.cfg/0A2A2B0A&lt;br /&gt;
default panda-natty&lt;br /&gt;
prompt 0&lt;br /&gt;
timeout 3&lt;/p&gt;
&lt;p&gt;label panda-natty&lt;br /&gt;
kernel panda/uImage&lt;br /&gt;
append console=ttyO2,115200n8 root=/dev/mmcblk0p2 ro fixrtc vram=48M omapfb.vram=0:24M mem=1G@0&amp;#215;80000000 text earlyprintk=ttyO2&lt;br /&gt;
initrd panda/uInitrd
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;PXE Booting&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;With the proper X-Loader and U-Boot files in place (at your first SD card partition), and with the TFTP + DHCP server also properly installed, you can just jump and try TFTP/PXE boot.&lt;/p&gt;
&lt;p&gt;Stop the U-Boot autoload and call the following commands:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;setenv pxecfg_ram 0&amp;#215;88000000: location in RAM to load the pxecfg file&lt;/li&gt;
&lt;li&gt;setenv kernel_ram 0&amp;#215;80000000: location in RAM to load the kernel&lt;/li&gt;
&lt;li&gt;setenv initrd_ram 0&amp;#215;81600000: location in RAM to load the initrd&lt;/li&gt;
&lt;li&gt;setenv autoload no: disable autoload while calling bootp (so you can just set up your network without autoboot)&lt;/li&gt;
&lt;li&gt;usb start: start USB and enables the SMSC95xx ethernet interface&lt;/li&gt;
&lt;li&gt;bootp: initialize the network, probing the ip address settings from your DHCP server&lt;/li&gt;
&lt;li&gt;pxecfg get: probe the pxecfg config file&lt;/li&gt;
&lt;li&gt;pxecfg boot: boot &lt;img src=&quot;http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You should get a similar output as:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
Texas Instruments X-Loader 1.5.0 (Jul 11 2011 &amp;#8211; 07:52:49)&lt;br /&gt;
Reading boot sector&lt;br /&gt;
Loading u-boot.bin from mmc&lt;/p&gt;
&lt;p&gt;U-Boot 2011.06 (Jul 11 2011 &amp;#8211; 02:49:51)&lt;/p&gt;
&lt;p&gt;CPU  : OMAP4430&lt;br /&gt;
Board: OMAP4 Panda&lt;br /&gt;
I2C:   ready&lt;br /&gt;
DRAM:  1 GiB&lt;br /&gt;
MMC:   OMAP SD/MMC: 0&lt;br /&gt;
Using default environment&lt;/p&gt;
&lt;p&gt;In:    serial&lt;br /&gt;
Out:   serial&lt;br /&gt;
Err:   serial&lt;br /&gt;
Net:   No ethernet found.&lt;br /&gt;
Hit any key to stop autoboot:  0&lt;br /&gt;
Panda # setenv pxecfg_ram 0&amp;#215;88000000&lt;br /&gt;
Panda # setenv kernel_ram 0&amp;#215;80000000&lt;br /&gt;
Panda # setenv initrd_ram 0&amp;#215;81600000&lt;br /&gt;
Panda # setenv autoload no&lt;br /&gt;
Panda # usb start&lt;br /&gt;
(Re)start USB&amp;#8230;&lt;br /&gt;
USB:   Register 1313 NbrPorts 3&lt;br /&gt;
USB EHCI 1.00&lt;br /&gt;
scanning bus for devices&amp;#8230; The request port(2) is not configured&lt;br /&gt;
EHCI timed out on TD &amp;#8211; token=0x80008c80&lt;br /&gt;
The request port(2) is not configured&lt;br /&gt;
4 USB Device(s) found&lt;br /&gt;
       scanning bus for storage devices&amp;#8230; 0 Storage Device(s) found&lt;br /&gt;
       scanning bus for ethernet devices&amp;#8230; 1 Ethernet Device(s) found&lt;br /&gt;
Panda # bootp&lt;br /&gt;
Waiting for Ethernet connection&amp;#8230; done.&lt;br /&gt;
BOOTP broadcast 1&lt;br /&gt;
DHCP client bound to address 10.42.43.10&lt;br /&gt;
Panda # pxecfg get&lt;br /&gt;
missing environment variable: pxeuuid&lt;br /&gt;
missing environment variable: ethaddr&lt;br /&gt;
Retreiving file: pxelinux.cfg/0A2A2B0A&lt;br /&gt;
Waiting for Ethernet connection&amp;#8230; done.&lt;br /&gt;
Using sms0 device&lt;br /&gt;
TFTP from server 10.42.43.1; our IP address is 10.42.43.10&lt;br /&gt;
Filename &amp;#8216;pxelinux.cfg/0A2A2B0A&amp;#8217;.&lt;br /&gt;
Load address: 0&amp;#215;88000000&lt;br /&gt;
Loading: #&lt;br /&gt;
done&lt;br /&gt;
Bytes transferred = 239 (ef hex)&lt;br /&gt;
Config file found&lt;br /&gt;
Panda # pxecfg boot&lt;br /&gt;
Hit any key to stop autoboot:  0&lt;br /&gt;
Label: panda-natty&lt;br /&gt;
        kernel: panda/uImage&lt;br /&gt;
        append: console=ttyO2,115200n8 root=/dev/mmcblk0p2 ro fixrtc vram=48M omapfb.vram=0:24M mem=1G@0&amp;#215;80000000 text earlyprintk=ttyO2&lt;br /&gt;
        initrd: panda/uInitrd&lt;br /&gt;
Retreiving file: panda/uInitrd&lt;br /&gt;
Waiting for Ethernet connection&amp;#8230; done.&lt;br /&gt;
Using sms0 device&lt;br /&gt;
TFTP from server 10.42.43.1; our IP address is 10.42.43.10&lt;br /&gt;
Filename &amp;#8216;panda/uInitrd&amp;#8217;.&lt;br /&gt;
Load address: 0&amp;#215;81600000&lt;br /&gt;
Loading: #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         ############&lt;br /&gt;
done&lt;br /&gt;
Bytes transferred = 3982715 (3cc57b hex)&lt;br /&gt;
Retreiving file: panda/uImage&lt;br /&gt;
Waiting for Ethernet connection&amp;#8230; done.&lt;br /&gt;
Using sms0 device&lt;br /&gt;
TFTP from server 10.42.43.1; our IP address is 10.42.43.10&lt;br /&gt;
Filename &amp;#8216;panda/uImage&amp;#8217;.&lt;br /&gt;
Load address: 0&amp;#215;80000000&lt;br /&gt;
Loading: #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #########################&lt;br /&gt;
done&lt;br /&gt;
Bytes transferred = 4174480 (3fb290 hex)&lt;br /&gt;
## Booting kernel from Legacy Image at 80000000 &amp;#8230;&lt;br /&gt;
   Image Name:   Ubuntu Kernel&lt;br /&gt;
   Image Type:   ARM Linux Kernel Image (uncompressed)&lt;br /&gt;
   Data Size:    4174416 Bytes = 4 MiB&lt;br /&gt;
   Load Address: 80008000&lt;br /&gt;
   Entry Point:  80008000&lt;br /&gt;
   Verifying Checksum &amp;#8230; OK&lt;br /&gt;
## Loading init Ramdisk from Legacy Image at 81600000 &amp;#8230;&lt;br /&gt;
   Image Name:   Ubuntu Initrd&lt;br /&gt;
   Image Type:   ARM Linux RAMDisk Image (uncompressed)&lt;br /&gt;
   Data Size:    3982651 Bytes = 3.8 MiB&lt;br /&gt;
   Load Address: 00000000&lt;br /&gt;
   Entry Point:  00000000&lt;br /&gt;
   Verifying Checksum &amp;#8230; OK&lt;br /&gt;
   Loading Kernel Image &amp;#8230; OK&lt;br /&gt;
OK&lt;/p&gt;
&lt;p&gt;Starting kernel &amp;#8230;&lt;/p&gt;
&lt;p&gt;Uncompressing Linux&amp;#8230; done, booting the kernel.&lt;br /&gt;
[    0.000000] Initializing cgroup subsys cpuset&lt;br /&gt;
[    0.000000] Initializing cgroup subsys cpu&lt;br /&gt;
&amp;#8230;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;This should be enough for you to get your Pandaboard booting with PXE. You can also script these commands at your boot.scr file that U-Boot loads automatically from your SD card, so you don&amp;#8217;t have to call them by hand every time you reboot your board.&lt;/p&gt;
&lt;p&gt;In case it doesn&amp;#8217;t work for you, just ping me (rsalveti) at #linaro on freenode &lt;img src=&quot;http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/rsalveti.wordpress.com/266/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/rsalveti.wordpress.com/266/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/rsalveti.wordpress.com/266/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/rsalveti.wordpress.com/266/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gofacebook/rsalveti.wordpress.com/266/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/rsalveti.wordpress.com/266/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gotwitter/rsalveti.wordpress.com/266/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/rsalveti.wordpress.com/266/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/rsalveti.wordpress.com/266/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/rsalveti.wordpress.com/266/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/rsalveti.wordpress.com/266/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/rsalveti.wordpress.com/266/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/rsalveti.wordpress.com/266/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/rsalveti.wordpress.com/266/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=rsalveti.wordpress.com&amp;blog=905525&amp;post=266&amp;subd=rsalveti&amp;ref=&amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</content>
		<author>
			<name>rsalveti</name>
			<uri>http://rsalveti.wordpress.com</uri>
		</author>
		<source>
			<title type="html">rsalveti's random thoughts</title>
			<subtitle type="html">Just another geek's weblog</subtitle>
			<link rel="self" href="http://rsalveti.wordpress.com/feed/atom/"/>
			<id>http://rsalveti.wordpress.com/feed/atom/</id>
			<updated>2012-05-15T03:15:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Qt Contributors’ Summit</title>
		<link href="http://anselmolsm.org/blog/qt-contributors-summit/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=qt-contributors-summit"/>
		<id>http://www.anselmolsm.org/blog/?p=1346</id>
		<updated>2011-06-17T12:22:07+00:00</updated>
		<content type="html">&lt;div class=&quot;wp-caption aligncenter&quot;&gt;&lt;a href=&quot;http://developer.qt.nokia.com/groups/qt_contributors_summit/wiki&quot;&gt;&lt;img title=&quot;Qt Contributors' Summit&quot; src=&quot;http://get.qt.nokia.com/marketing/summit_01.png&quot; alt=&quot;I'm going to the Qt Contributors' Summit&quot; width=&quot;196&quot; height=&quot;121&quot; /&gt;&lt;/a&gt;&lt;/div&gt;


&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;We are in Berlin, attending the Qt Contributor&amp;#8217;s Summit. 265 people are discussing very important (and interesting) topics for Qt 5 and the open governance. You can follow what&amp;#8217;s happening here using the hash code #qtcs on several social networks. And of course, you can check the &lt;a href=&quot;http://developer.qt.nokia.com/groups/qt_contributors_summit/wiki&quot; target=&quot;_blank&quot;&gt;wiki page of the event&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Personally, I am attending sessions related with QML, Qt-Components, &lt;a href=&quot;http://developer.qt.nokia.com&quot;&gt;DevNet&lt;/a&gt; and open governance.&lt;/p&gt;
&lt;p&gt;And yesterday was Thursday, also known as the &amp;#8220;Yellow Day&amp;#8221;:&lt;/p&gt;
&lt;div class=&quot;mceTemp mceIEcenter&quot;&gt;
&lt;dl id=&quot;attachment_1358&quot; class=&quot;wp-caption aligncenter&quot;&gt;
&lt;dt class=&quot;wp-caption-dt&quot;&gt;&lt;a href=&quot;http://anselmolsm.org/wp-content/uploads/2011/06/diaamarelo.jpg&quot;&gt;&lt;img class=&quot;size-full wp-image-1358&quot; title=&quot;Dia do amarelo&quot; src=&quot;http://anselmolsm.org/wp-content/uploads/2011/06/diaamarelo.jpg&quot; alt=&quot;&quot; width=&quot;640&quot; height=&quot;480&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Ok, Ademar was not wearing yellow t-shirt. Well, imagine him as the goalkeeper of the team ;)&lt;/p&gt;&lt;/dt&gt;&lt;/dl&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</content>
		<author>
			<name>Anselmo Lacerda S. de Melo</name>
			<uri>http://anselmolsm.org</uri>
		</author>
		<source>
			<title type="html">anselmolsm.org » INdT</title>
			<link rel="self" href="http://anselmolsm.org/blog/category/planet_indt/feed/"/>
			<id>http://anselmolsm.org/blog/category/planet_indt/feed/</id>
			<updated>2012-04-13T19:15:14+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Managing multiple network profiles using upstart</title>
		<link href="http://blog.aloisiojr.com/?p=33"/>
		<id>http://blog.aloisiojr.com/?p=33</id>
		<updated>2011-06-07T03:26:16+00:00</updated>
		<content type="html">&lt;p&gt;One of the purposes of buying the Jetway mini-top HBJC600C99-352-BW was using it as wireless router. I installed Ubuntu 11.04 on it. As NetworkManager does not handle wireless interfaces in access point (AP) mode, I decided to design my own network management. The idea is simple: use the required daemons/application and create upstart jobs to handle the activation logic.  These are the network profiles I want to support:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WIFI&lt;/strong&gt;: The htpc will connect to any known AP available.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ADSL&lt;/strong&gt;: The htpc will connect to Internet via ADSL and act as a &lt;strong&gt;wireless router&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;3G&lt;/strong&gt;: The htpc will connect to the Internet via 3G and act as a &lt;strong&gt;wireless router&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;List of applications I need to use:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;upstart;&lt;/li&gt;
&lt;li&gt;wpa_supplicant;&lt;/li&gt;
&lt;li&gt;dhclient;&lt;/li&gt;
&lt;li&gt;brctl;&lt;/li&gt;
&lt;li&gt;ifconfig;&lt;/li&gt;
&lt;li&gt;hostapd;&lt;/li&gt;
&lt;li&gt;dhcpd;&lt;/li&gt;
&lt;li&gt;pppd;&lt;/li&gt;
&lt;li&gt;iptables;&lt;/li&gt;
&lt;li&gt;dnsmasq.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To install the needed packages, type the application name in the terminal. Ubuntu will help you with package&amp;#8217;s name.&lt;/p&gt;
&lt;p&gt;There are thousand ways to do that using upstart, so let me list some constraints I kept in mind when designing the system:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Customized solution.&lt;/strong&gt; I believe that generic solutions must be used only when you really need them. Every time you make something more generic you end up adding more logic, creating more corner cases and spending more time with use cases that you will NEVER face. Example of assumptions: my built-in ethernet port is eth0, my wireless interface wlan0 is NOT hotplug.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Always have a maintenance channel available.&lt;/strong&gt; Shit happens, all the time. So independent of the network profile I choose I want some way to get a secure shell connection without connect a keyboard (that I don&amp;#8217;t have) to the htpc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;One upstart job per long lived process.&lt;/strong&gt; Among the applications listed above, some have short lifetime, i.e. they set some configuration and/or perform some action and finish. Others keep running until some orderly finish action. I decided that the formers don&amp;#8217;t need to be a job, they can be run as pre or post scripts of other jobs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1st step: Get rid of Ubuntu networking jobs.&lt;/h3&gt;
&lt;p&gt;I will manage my network stuff using only upstart jobs, so I don&amp;#8217;t need network-manager and ifupdown utilities. So lets disable them:&lt;/p&gt;
&lt;pre&gt;root$ echo manual &amp;gt;&amp;gt; /etc/init/networking.conf
root$ echo manual &amp;gt;&amp;gt; /etc/init/network-interfaces.conf
root$ echo manual &amp;gt;&amp;gt; /etc/init/network-manager.conf
root$ echo manual &amp;gt;&amp;gt; /etc/init/networking.conf
root$ echo manual &amp;gt;&amp;gt; /etc/init/bridge-network-interface.conf&lt;/pre&gt;
&lt;p&gt;Now, we need a job to raise the loopback interface. The following job is completely based on the Ubuntu&amp;#8217;s network-interface job:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;/etc/init/loopback.conf&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;start on net-device-added INTERFACE=lo
stop on net-device-removed INTERFACE=lo

pre-start script
    mkdir -p /var/run/network
    ifconfig lo 127.0.0.1 up
    initctl emit -n net-device-up IFACE=lo LOGICAL=lo
                                  ADDRFAM=inet METHOD=loopback
end script

post-stop exec initctl emit -n net-device-down IFACE=lo LOGICAL=lo
                                               ADDRFAM=inet METHOD=loopback&lt;/pre&gt;
&lt;p&gt;As upstart will run and take care of all daemons listed above, we must disable the sysinit scripts that start/stop them (that ones in /etc/init.d).&lt;/p&gt;
&lt;pre&gt;root$ update-rc.d -f hostapd remove
root$ update-rc.d -f isc-dhcp-server remove
root$ update-rc.d -f dnsmasq remove&lt;/pre&gt;
&lt;h3&gt;2nd step: create mutually exclusive jobs to set the network profile.&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;/etc/init/net-profile-adsl.conf&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;stop on (starting net-profile-adsl
         or starting net-profile-wifi)
# the 'start on' below means &quot;i'm the default profile&quot;
start on (local-filesystems
          and net-device-added INTERFACE=wlan0
	  and net-device-added INTERFACE=eth0)&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;etc/init/net-profile-3g.conf&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;stop on (starting net-profile-3g
         or starting net-profile-wifi)&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;/etc/init/net-profile-wifi.conf&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;stop on (starting net-profile-3g
         or starting net-profile-adsl)&lt;/pre&gt;
&lt;p&gt;The main ideia of this arrangement is to change the profile using a single command. For instance, if somehow my adsl connection become unavailable I just need to connect my cell phone to the htpc and run the following command:&lt;/p&gt;
&lt;pre&gt;root$ start net-profile-3g&lt;/pre&gt;
&lt;p&gt;To reach this goal, all the following jobs will depend on this set of &amp;#8220;fake&amp;#8221; jobs as you can see in the next steps.&lt;/p&gt;
&lt;h3&gt;3rd step: set-up the bridge&lt;/h3&gt;
&lt;p&gt;First, the question. Why do I need a bridge? It&amp;#8217;s because I have a printer connected to the htpc via ethernet. As I only have one built-in ethernet port I bought a usb-ethernet adapter (eth1). So, every time the htpc is running the 3g or adsl profile, I want wlan0 and eth1 in a bridge to route the connection to them. I can even say that everytime I plug-in the usb-ethernet adapter, I want dhcpd sending valid IP addresses to it (do you remember that I want a ssh access anytime?). The solution that I chose:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The bridge (br0) will be set up at startup time and dhcpd will be configured to manage this interface&lt;/li&gt;
&lt;li&gt;Whenever the usb-ethernet is plugged in, its interface will be added to the bridge&lt;/li&gt;
&lt;li&gt;Every time ADSL or 3G profiles are chosen, wlan0 will also be added to the bridge&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;em&gt;/etc/init/bridge.conf&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;start on started loopback
stop on stopping loopback

pre-start script
    brctl addbr br0
    ifconfig br0 10.0.1.1 netmask 255.255.255.0 broadcast 10.0.1.255
end script

post-stop script
    ifconfig br0 down
    brctl delbr br0
end script&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;/etc/init/usb-ethernet.conf&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;start on net-device-added INTERFACE=eth1
stop on net-device-removed INTERFACE=eth1

pre-start script
    ifconfig eth1 up
    brctl addif br0 eth1
end script
post-stop exec brctl delif br0 eth1&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;/etc/init/dhcpd.conf&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;start on started bridge
stop on stopping bridge

exec dhcpd -f&lt;/pre&gt;
&lt;p&gt;Note that the configurations above do not show when the wlan0 interface is added to the bridge. It will be covered in the next steps.  Do not forget to change /etc/default/isc-dhcp-server in order to make dhcpd manage the br0 interface. Also, you need a valid configuration in the /etc/dhcp/dhcpd.conf. I will show my config below:&lt;/p&gt;
&lt;pre&gt;ddns-update-style none;

option domain-name-servers 10.0.1.1;

default-lease-time 600;
max-lease-time 7200;

authoritative;

log-facility local7;

subnet 10.0.1.0 netmask 255.255.255.0 {
  range 10.0.1.10 10.0.1.254;
  option routers 10.0.1.1;
}&lt;/pre&gt;
&lt;h3&gt;4th step: managing wlan0 when the WIFI profile is chosen&lt;/h3&gt;
&lt;p&gt;Basically I need wpa_supplicant and dhclient running on wlan0 interface. Also, I need to keep wlan0 out of the bridge. Dumping the config:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;/etc/init/wpa_supplicant.conf&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;start on started net-profile-wifi
stop on stopping net-profile-wifi

exec wpa_supplicant -iwlan0 -Dnl80211 -c/etc/wpa_supplicant.conf&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;/etc/init/dhclient.conf&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;start on started wpa_supplicant
stop on stopping wpa_supplicant

exec dhclient -d wlan0

emits net-device-up
emits net-device-down

post-start exec initctl emit -n net-device-up IFACE=wlan0 LOGICAL=wlan0
                                              ADDRFAM=inet METHOD=dhcp
pre-stop script
    ifconfig wlan0 0.0.0.0
    initctl emit -n net-device-down IFACE=wlan0 LOGICAL=wlan0
                                    ADDRFAM=inet METHOD=dhcp
end script&lt;/pre&gt;
&lt;p&gt;Note that you need a valid /etc/wpa_supplicant.conf file in order to be able to connect to a known AP. I don&amp;#8217;t think I need to paste my config here. If you have any doubts run &amp;#8216;man wpa_supplicant.conf&amp;#8217;.&lt;/p&gt;
&lt;h3&gt;5th step: managing wlan0 when either 3G or ADSL profiles are chosen&lt;/h3&gt;
&lt;p&gt;I only need to launch hostpad and to add wlan0 to the bridge (br0). The job configuration:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;/etc/init/hostapd.conf&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;start on (started net-profile-3g
          or started net-profile-adsl)
stop on (stopping net-profile-3g
         or stopping net-profile-adsl)

exec hostapd /etc/hostapd.conf

post-start script
    while [ &quot;`iw wlan0 info | grep type | cut -d ' ' -f 2`&quot; != &quot;AP&quot; ]; do
        sleep 0.5
    done
    brctl addif br0 wlan0
end script
pre-stop exec brctl delif br0 wlan0&lt;/pre&gt;
&lt;p&gt;Note how wlan0 is added to the bridge. The current solution is a ugly hack that I&amp;#8217;m planning to improve further&amp;#8230; The problem is that a wireless interface in &amp;#8216;managed mode&amp;#8217; cannot be added to a bridge. So when I move from WIFI profile (the wlan0 is in managed mode) to 3G or ADSL profile (wlan0 is in master mode), the brctl addif command fails. The reason is that hostapd daemon does not have enough time to set the master mode before its own post-start script runs.&lt;/p&gt;
&lt;p&gt;Lets remind you again about valid configuration files&amp;#8230; My wireless device uses ath9k kernel driver and below I&amp;#8217;m pasting my hostapd.conf&lt;/p&gt;
&lt;p&gt;&lt;em&gt;/etc/hostapd.conf&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;interface=wlan0
bridge=br0
driver=nl80211

ssid=myssid
hw_mode=g
channel=1

wme_enabled=1
ieee80211n=1
ht_capab=[HT40+][SHORT-GI-40][TX-STBC][RX-STBC1][DSSS_CCK-40]

macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=come_on
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP&lt;/pre&gt;
&lt;h3&gt;6th step: managing ppp0 interface when either ADSL or 3G profiles are chosen&lt;/h3&gt;
&lt;p&gt;I only need to call pppd with the desired profile and create a NAT using iptables. There are bare differences between 3g and adsl pppd jobs as you can notice below:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;/etc/init/pppd-gvt.conf&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;start on started net-profile-adsl
stop on stopping net-profile-adsl

emits net-device-up
emits net-device-down

pre-start exec ifconfig eth0 0.0.0.0 up

exec pppd call gvt

post-start script
    iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -o ppp0 -j MASQUERADE
    iptables -A FORWARD -s 10.0.1.0/24 -o ppp0 -j ACCEPT
    iptables -A FORWARD -d 10.0.1.0/24 -m conntrack
                --cstate ESTABLISHED,RELATED -i ppp0 -j ACCEPT
    initctl emit -n net-device-up IFACE=ppp0 LOGICAL=ppp0
                                  ADDRFAM=inet METHOD=ppp
end script

pre-stop script
    iptables -F
    initctl emit -n net-device-down IFACE=ppp0 LOGICAL=ppp0
                                    ADDRFAM=inet METHOD=ppp
end script

pre-start exec ifconfig eth0 down&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;/etc/init/pppd-vivo3g.conf&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;start on started net-profile-3g
stop on stopping net-profile-3g

emits net-device-up
emits net-device-down

exec pppd call vivo3g

post-start script
    iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -o ppp0 -j MASQUERADE
    iptables -A FORWARD -s 10.0.1.0/24 -o ppp0 -j ACCEPT
    iptables -A FORWARD -d 10.0.1.0/24 -m conntrack
                --cstate ESTABLISHED,RELATED -i ppp0 -j ACCEPT
    initctl emit -n net-device-up IFACE=ppp0 LOGICAL=ppp0
                                  ADDRFAM=inet METHOD=ppp
end script

pre-stop script
    iptables -F
    initctl emit -n net-device-down IFACE=ppp0 LOGICAL=ppp0
                                    ADDRFAM=inet METHOD=ppp
end script&lt;/pre&gt;
&lt;p&gt;Important notes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;My adsl modem is in bridge mode and connected to eth0 port.&lt;/li&gt;
&lt;li&gt;GVT is my adsl provider name and Vivo3G is my 3G operator name &lt;img src=&quot;http://blog.aloisiojr.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Configs to adsl connection:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;/etc/ppp/peers/gvt&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;noipdefault
defaultroute
hide-password
noauth
usepeerdns
user &quot;turbonet@turbonet&quot;
plugin rp-pppoe.so eth0
remotename gvt
ipparam gvt&lt;/pre&gt;
&lt;p&gt;Add the following line to /etc/ppp/pap-secrets&lt;/p&gt;
&lt;pre&gt;&quot;turbonet@turbonet&quot; gvt &quot;gvt25&quot;&lt;/pre&gt;
&lt;p&gt;Configs to 3G connection:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;/etc/ppp/peers/vivo3g&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;hide-password
noauth
connect &quot;/usr/sbin/chat -v -f /etc/chatscripts/vivo3g&quot;
/dev/ttyACM0
115200
defaultroute
noipdefault
user &quot;vivo&quot;
remotename vivo3g
ipparam vivo3g
usepeerdns&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;/etc/chatscripts/vivo3g&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;ABORT BUSY ABORT 'NO CARRIER' ABORT VOICE ABORT 'NO DIALTONE' ABORT 'NO DIAL TONE' ABORT 'NO ANSWER' ABORT DELAYED
'' ATZ
OK AT+CGDCONT=1,&quot;IP&quot;,&quot;zap.vivo.com.br&quot;
OK &quot;ATDT*99#&quot;
CONNECT ''&lt;/pre&gt;
&lt;p&gt;Add the following line to /etc/ppp/pap-secrets&lt;/p&gt;
&lt;pre&gt;&quot;vivo&quot; vivo3g &quot;vivo&quot;&lt;/pre&gt;
&lt;h3&gt;7th (and last) step: Setup local dns server&lt;/h3&gt;
&lt;p&gt;To configure the htpc to run as a name server, I&amp;#8217;m using dnsmasq:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;/etc/init/dnsmasq.conf&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;start on started loopback
stop on stopping loopback

exec dnsmasq -k -u dnsmasq -7 /etc/dnsmasq.d,.dpkg-dist,.dpkg-old,.dpkg-new&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;/etc/dnsmasq.conf&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;interface=br0
no-dhcp-interface=br0&lt;/pre&gt;
&lt;p&gt;If you want to use dnsmasq locally, add this line to your /etc/dhcp/dhclient.conf&lt;/p&gt;
&lt;pre&gt;prepend domain-name-servers 127.0.0.1;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;That&amp;#8217;s all. This setup is not fully tested (stressed). If you read/applied this and have some suggestions, please reply here &lt;img src=&quot;http://blog.aloisiojr.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;</content>
		<author>
			<name>Aloisio</name>
			<uri>http://blog.aloisiojr.com</uri>
		</author>
		<source>
			<title type="html">Aloisio's blog site</title>
			<link rel="self" href="http://blog.aloisiojr.com/?feed=atom"/>
			<id>http://blog.aloisiojr.com/?feed=atom</id>
			<updated>2011-06-15T03:15:04+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">New gadget!</title>
		<link href="http://blog.aloisiojr.com/?p=32"/>
		<id>http://blog.aloisiojr.com/?p=32</id>
		<updated>2011-05-31T01:44:19+00:00</updated>
		<content type="html">&lt;p&gt;I was looking for a computer with following features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Act as a wireless router&lt;/li&gt;
&lt;li&gt;Act as a multimedia center (1080p)&lt;/li&gt;
&lt;li&gt;Quiet&lt;/li&gt;
&lt;li&gt;Low power consumption&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After some research, I chose the Jetway Mini-Top &lt;a href=&quot;http://www.jetwaycomputer.com/ITX-JBC600C99352W.html&quot;&gt;HBJC600C99-352W-BW&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Software solution: Ubuntu 11.04 + XBMC. The installation has worked out of the box, no main issues. XBMC standalone is launched by default. Nice job xmbc team!!! The software is awesome.&lt;/p&gt;
&lt;p&gt;In the following posts I will show how I customized Ubuntu to make it fit my requirements &lt;img src=&quot;http://blog.aloisiojr.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;</content>
		<author>
			<name>Aloisio</name>
			<uri>http://blog.aloisiojr.com</uri>
		</author>
		<source>
			<title type="html">Aloisio's blog site</title>
			<link rel="self" href="http://blog.aloisiojr.com/?feed=atom"/>
			<id>http://blog.aloisiojr.com/?feed=atom</id>
			<updated>2011-06-15T03:15:04+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Meego Conf 2011 – San Francisco</title>
		<link href="http://anselmolsm.org/blog/meego-conf-2011-san-francisco/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=meego-conf-2011-san-francisco"/>
		<id>http://www.anselmolsm.org/blog/?p=1338</id>
		<updated>2011-05-23T13:00:25+00:00</updated>
		<content type="html">&lt;p&gt;I am in San Francisco (&lt;a href=&quot;http://www.anselmolsm.org/blog/if-youre-going-to-san-francisco/&quot; target=&quot;_blank&quot;&gt;again&lt;/a&gt;! =), now for the MeeGo Conference 2011.&lt;/p&gt;
&lt;p&gt;The event is about to begin with the keynote &amp;#8220;The Future of MeeGo Starts Now&amp;#8221; presented by the president of Linux Foundation, Jim Zemlin.&lt;/p&gt;
&lt;p&gt;This time, I&amp;#8217;m going to present a talk in the event too! The talk is today and the topic is &amp;#8220;Writing applications for multiple MeeGo devices&amp;#8221;.&lt;/p&gt;
&lt;p&gt;There are other talks by openBossa/INdT guys, &lt;a href=&quot;http://sf2011.meego.com/program/session-schedule&quot;&gt;check the schedule&lt;/a&gt;!&lt;/p&gt;</content>
		<author>
			<name>Anselmo Lacerda S. de Melo</name>
			<uri>http://anselmolsm.org</uri>
		</author>
		<source>
			<title type="html">anselmolsm.org » INdT</title>
			<link rel="self" href="http://anselmolsm.org/blog/category/planet_indt/feed/"/>
			<id>http://anselmolsm.org/blog/category/planet_indt/feed/</id>
			<updated>2012-04-13T19:15:14+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Evaluating projects for their return on social investment</title>
		<link href="http://ianlawrence.info/random-stuff/evaluating-projects-for-their-return-on-social-investment"/>
		<id>http://ianlawrence.info/random-stuff/evaluating-projects-for-their-return-on-social-investment</id>
		<updated>2011-04-25T17:23:01+00:00</updated>
		<content type="html">&lt;p&gt;I have just &lt;a href=&quot;https://github.com/IanLawrence/InnovationManagement&quot;&gt;published the software&lt;/a&gt; I wrote for my &lt;a href=&quot;http://www.extecamp.unicamp.br/gestaodainovacao/index.asp&quot;&gt;MBA in Strategic Management of Technology Innovation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A slightly customized version of the software is currently in use as a innovation funnel at &lt;a href=&quot;http://www.indt.org/&quot;&gt;INdT&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It is a commonly accepted fact in business that social projects bring some 
tangible beneﬁts to an organization. Unfortunately, even if the project is 
very successful this often does not impact directly on the ﬁnancial bottom line. And, in a world of razor-thin margins, a set of activities that drive up corporate cost without any directly identiﬁable return is a tough sell, no matter how worthwhile and noble the project might be. The business case for social projects is therefore contingent on ﬁnding a suitable method for 
valuation — one that allows managers to understand the implications of an 
indirect beneﬁt and then make ’intelligent’ decisions about which projects to 
choose and the most feasible level of resources to commit.&lt;p&gt;
&lt;p&gt;I approached the problem using techniques from agile development. &lt;a href=&quot;http://en.wikipedia.org/wiki/Scrum_(development)&quot;&gt;Scrum sizings&lt;/a&gt; were run with stakeholders experienced in the type of project under evaluation which estimated the intangible values present in the social project.The values were then
passed into an algorithm which ran an economic analysis of the project with its associated series of estimates as projected 'cash-flows'. The economic indicators calculated are net present value, internal rate of return and eﬃciency of investment&lt;/p&gt;
&lt;p&gt;Projects are then ranked on their &lt;b&gt;efficiency of social investment&lt;/b&gt; score.&lt;/p&gt;
&lt;p&gt;The customization used at INdT is that instead of using scrum estimates the software has values assigned by answering questions. This makes the software then useful for all kinds of projects.The following questions were used
&lt;ul&gt;
&lt;li&gt;What is the quality of information presented.?&lt;/li&gt;
&lt;li&gt;How much does this project align with  strategy?&lt;/li&gt;
&lt;li&gt;What is the probability that the project will build competencies?&lt;/li&gt;
&lt;li&gt;The project opens new, significant markets for  customers (What is the potential for market and revenue creation?)&lt;/li&gt;
&lt;li&gt;What is the project's capacity to leverage  competitive position (Impact on competition)&lt;/li&gt;
&lt;li&gt;If the project is approved what is the span of possible applications that the resulting product might be applied to?&lt;/li&gt;
&lt;li&gt;Are there any IPR implications?&lt;/li&gt;
&lt;li&gt;What is the technological feasibility of the project?&lt;/li&gt;
&lt;li&gt;Assuming the project is implemented the set up costs of it are likely to be?&lt;/li&gt;
&lt;li&gt;What are the technological risks?&lt;/li&gt;
&lt;/ul&gt;
 and the software also has a 'stage-gate' built in now so that projects can be eliminated early on if some basic requirements are not met. Things like the project conflicting with the current portfolio or not adding value fit this description.&lt;/p&gt;
&lt;p&gt;The software is published under the &lt;a href=&quot;http://ianlawrence.info/random-stuff/www.gnu.org/licenses/agpl.html&quot;&gt;AGPL&lt;/a&gt; and it uses a standard Django set up. It should be relatively bug free but YMMV depending on what you want to do with it. The full thesis - 
&lt;b&gt;How to choose social investment projects by calculating their eﬃciency of investment using agile software development techniques&lt;/b&gt; - is available to download &lt;a href=&quot;http://ianlawrence.info/downloads/MBA/monografia.pdf&quot;&gt;here&lt;/a&gt;. Enjoy!&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Ian Lawrence</name>
			<uri>http://ianlawrence.info/random-stuff</uri>
		</author>
		<source>
			<title type="html">Ian Lawrence - Blog</title>
			<subtitle type="html">What is the digital equivalent of lovely? He wondered. What are the digits that encode beauty, the number-fingers that enclose, transform, transmit, decode, and somehow, in the process, fail to trap or choke the soul of it? Not because of the technology but in spite of it, beauty, that ghost, that treasure, passes undiminished through the new machines.</subtitle>
			<link rel="self" href="http://ianlawrence.info/random-stuff/RSS2"/>
			<id>http://ianlawrence.info/random-stuff/RSS2</id>
			<updated>2012-05-19T05:15:17+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Google Summer of Code: PySide under PSF umbrella</title>
		<link href="http://tuxrecife.blogspot.com/2011/03/google-summer-of-code-pyside-under-psf.html"/>
		<id>tag:blogger.com,1999:blog-13725649.post-892456867409260350</id>
		<updated>2011-03-29T16:49:04+00:00</updated>
		<content type="html">PySide was accepted as a project under PSF umbrella. Any student who want to submit ideas related with PySide can contact us, or any PySide mentor, to discuss the ideas and prepare some proposals. Feel free to propose new ideas, do not get stuck only in the current ones be creative and good luck.  You can get more information on &lt;a href=&quot;http://wiki.python.org/moin/SummerOfCode/2011&quot;&gt;Python GSoC wiki&lt;/a&gt;, &lt;a href=&quot;http://developer.qt.nokia.com/wiki/PySide_GSoc_Ideas&quot;&gt;PySide GSoC wiki&lt;/a&gt;, and #pyside on freenode.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/13725649-892456867409260350?l=tuxrecife.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Renato Araujo</name>
			<email>noreply@blogger.com</email>
			<uri>http://tuxrecife.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Tux em Recife</title>
			<link rel="self" href="http://tuxrecife.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-13725649</id>
			<updated>2012-05-18T19:15:08+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Software shortlisted for sustainability award</title>
		<link href="http://ianlawrence.info/random-stuff/software-shortlisted-for-sustainability-award"/>
		<id>http://ianlawrence.info/random-stuff/software-shortlisted-for-sustainability-award</id>
		<updated>2011-03-11T15:32:11+00:00</updated>
		<content type="html">&lt;p&gt;NDG has been shortlisted for the Just Means 2011 – Social Innovation Awards, an important program which recognizes  innovative software in the social and environmental areas. The result will be published during the event “2011 Redefining Value”, which will occur on the 25th of March, in London.&lt;/p&gt;
&lt;p&gt;The software is competing in the category ‘Most Strategic Use of Philanthropic Funds’, disputing the prize with other three companies – Nature’s Path Foods, Oracle Corporation and Barclays PLC.&lt;/p&gt;
&lt;p&gt;“The initiative to submit NDG to the prize came from Nokia's Corporate Social Investment team. Those involved believe that the work done recently with the software has brought many positive effects to communities in need worldwide and for this reason we have the potential to compete,” explains Ian Lawrence, a software developer at INdT, whom along with Rodrigo Ramos – also an INdT developer – works on the NDG project in Manaus, developing new features and offering support to NGOs and companies which wish to use the tool.&lt;/p&gt;
&lt;p&gt;NDG was launched in 2008, and it is used for the collection of field data, substituting the use of paper survey forms and allowing the secure transfer of this information to a server, in real time. In 2009, the State of Amazonas’ Secretary of Health (SUSAM) adopted the software to conduct a campaign to fight Dengue Fever in Amazonas.&lt;/p&gt;
&lt;img src=&quot;http://ianlawrence.info/random-stuff/images/just-means&quot; /&gt;
&lt;p&gt;The results were so significant that NDG was adopted worldwide by many different organizations. Examples are the Philippines’ Government who along with the WWF use the tool to map the agricultural sector in the country and the Kenyan Government who run child birth registration programs in rural areas.&lt;/p&gt;</content>
		<author>
			<name>Ian Lawrence</name>
			<uri>http://ianlawrence.info/random-stuff</uri>
		</author>
		<source>
			<title type="html">Ian Lawrence - Blog</title>
			<subtitle type="html">What is the digital equivalent of lovely? He wondered. What are the digits that encode beauty, the number-fingers that enclose, transform, transmit, decode, and somehow, in the process, fail to trap or choke the soul of it? Not because of the technology but in spite of it, beauty, that ghost, that treasure, passes undiminished through the new machines.</subtitle>
			<link rel="self" href="http://ianlawrence.info/random-stuff/RSS2"/>
			<id>http://ianlawrence.info/random-stuff/RSS2</id>
			<updated>2012-05-19T05:15:17+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Python bindings para libepub usando Shiboken</title>
		<link href="http://www.setantas.net/blog/2011/03/09/python-bindings-para-libepub-usando-shiboken/"/>
		<id>http://www.setantas.net/blog/?p=517</id>
		<updated>2011-03-09T03:10:12+00:00</updated>
		<content type="html">&lt;p&gt;Tenho um &lt;a href=&quot;http://twitpic.com/3ucxtj&quot;&gt;Kindle&lt;/a&gt;, gosto muito dele, mas infelizmente não posso dizer o mesmo sobre o formato usado para os livros. Não que eu tenha feito um estudo detalhado do formato mobi e chegado a conclusão que ele é tecnicamente inferior. Não. O problema é que &lt;a title=&quot;Wikipedia: ePub&quot; href=&quot;http://en.wikipedia.org/wiki/EPUB&quot;&gt;ePub&lt;/a&gt; é tão mais popular, o que significa mais livros, e mais ferramentas com as quais brincar. &lt;a href=&quot;http://calibre-ebook.com/&quot;&gt;Calibre&lt;/a&gt; é ótimo para converter formatos de eBooks, mas eu prefiro a simplicidade de baixar um livro, copiar pro dispositivo e já sair lendo.&lt;/p&gt;
&lt;p&gt;Quando meu Kindle não está à mão, meu leitor substituto é um N900 com &lt;a title=&quot;eBook reader for Maemo 5&quot; href=&quot;http://juhanagsoc.wordpress.com/&quot;&gt;MeBook&lt;/a&gt;, um dos meus aplicativos preferidos &amp;#8211; ele procura por livros (no formato ePub) no &lt;a title=&quot;Feedbooks&quot; href=&quot;http://www.feedbooks.com/&quot;&gt;Feedbooks&lt;/a&gt;, baixa pro dispositivo e os mostra numa lista bem bacana, com capas e tudo. Examinando o código fonte do MeBook aprendi que ele usa a &lt;a title=&quot;eBook tools&quot; href=&quot;http://sourceforge.net/projects/ebook-tools/&quot;&gt;libepub&lt;/a&gt; para ler eBooks ePub, então pensei que seria interessante fazer bindings Python para &lt;strong&gt;libepub&lt;/strong&gt;. E aqui estamos.&lt;/p&gt;
&lt;p&gt;Ah, e mais uma coisa antes de começarmos, encontrei um projeto Python no github chamado &lt;a href=&quot;https://github.com/jharjono/libepub&quot;&gt;libepub&lt;/a&gt;. Não verifiquei ainda, mas o menciono aqui pelo bem da informação.&lt;/p&gt;
&lt;h2&gt;Shiboken&lt;/h2&gt;
&lt;p&gt;&lt;a title=&quot;Shiboken&quot; href=&quot;http://www.setantas.net/blog/2009/08/31/shiboken/&quot; target=&quot;_self&quot;&gt;Shiboken&lt;/a&gt; é a ferramenta de renome mundial usada para gerar o mundialmente famoso &lt;a title=&quot;PySide&quot; href=&quot;http://pyside.org&quot;&gt;PySide&lt;/a&gt; (que ocore ter alcançado a versão &lt;a title=&quot;PySide: Python for Qt 1.0 released!&quot; href=&quot;http://www.pyside.org/2011/03/pyside-python-for-qt-1-0-released/&quot;&gt;1.0&lt;/a&gt; semana passada &amp;#8211; viva!) Ela é uma das melhores ferramentas disponíveis para gerar bindings Python para bibliotecas C++. Mas isso sou eu falando &amp;#8211; eu nela. Contudo, &lt;strong&gt;libepub&lt;/strong&gt; é escrita em C, e mesmo que Shiboken possa gerar bindings para um punhado de funções globais e juntá-las num módulo Python, fica uma porcaria. De forma que terei de fazer algumas preparações para que a &lt;strong&gt;libepub&lt;/strong&gt; apareça bela em Python.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Pré-requisitos:&lt;/strong&gt; arquivos de desenvolvimento (i.e. os cabeçalhos) para &lt;a title=&quot;API Extractor&quot; href=&quot;http://www.pyside.org/home-binding/api-extractor/&quot;&gt;ApiExtractor&lt;/a&gt;, &lt;a title=&quot;GeneratorRunner 0.6&quot; href=&quot;http://pyside.org/docs/generatorrunner/&quot;&gt;GeneratorRunner&lt;/a&gt;, &lt;a title=&quot;Shiboken&quot; href=&quot;http://pyside.org/docs/shiboken/&quot;&gt;Shiboken&lt;/a&gt;, e &lt;strong&gt;libepub&lt;/strong&gt;. (Para usuários de Debian/Ubuntu isto significa: &lt;strong&gt;libapiextractor-dev&lt;/strong&gt;, &lt;strong&gt;libgenrunner-dev&lt;/strong&gt;, &lt;strong&gt;libshiboken-dev&lt;/strong&gt;, and &lt;strong&gt;libepub-dev&lt;/strong&gt;.) E o compilador C++ mais o CMake, é claro.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Lembrete:&lt;/strong&gt; ApiExtractor, GeneratorRunner e Shiboken são feitos com Qt (somente módulos principais, nenhuma delas tem ui), mas os bindings gerados não dependem da Qt de forma alguma. Exceto, obviamente, se a biblioteca para qual os bindings serão gerados já a use.&lt;/p&gt;
&lt;h3&gt;libepub&lt;/h3&gt;
&lt;p&gt;Primeiro, vamos dar uma olhada na &lt;strong&gt;libepub&lt;/strong&gt;. Ela tem três estruturas usadas como ponteiros opacos:&lt;/p&gt;
&lt;div class=&quot;codecolorer-container cpp geshi&quot;&gt;&lt;div class=&quot;cpp codecolorer&quot;&gt;&lt;span&gt;// Contem informacao sobre o arquivo ePub.&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;struct&lt;/span&gt; epub&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;// Objeto iterador para o indice.&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;struct&lt;/span&gt; titerator&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;// Objeto iterador para o conteudo do livro.&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;struct&lt;/span&gt; eiterator&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Se você quiser ler o conteúdo de um arquivo ePub, chame a função que irá criar uma estrutura epub, itere por seu índice com um titerator, e depois pelos conteúdos mesmos usando um eiterator.&lt;/p&gt;
&lt;p&gt;A maioria das funções seguem aquele formato &amp;#8220;C orientado a objetos&amp;#8221; visto em outras bibliotecas, com o primeiro argumento sendo um ponteiro para a estrutura que representa o &lt;em&gt;&amp;#8220;this&amp;#8221;&lt;/em&gt; ou &lt;em&gt;&amp;#8220;self&amp;#8221;&lt;/em&gt; em linguagens OO. Exemplos:&lt;/p&gt;
&lt;div class=&quot;codecolorer-container cpp geshi&quot;&gt;&lt;div class=&quot;cpp codecolorer&quot;&gt;&lt;span&gt;void&lt;/span&gt;&lt;br /&gt;
epub_dump&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;struct&lt;/span&gt; epub&lt;span&gt;*&lt;/span&gt; epub&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt;&lt;span&gt;**&lt;/span&gt;&lt;br /&gt;
epub_get_metadata&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;struct&lt;/span&gt; epub&lt;span&gt;*&lt;/span&gt; epub,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;enum&lt;/span&gt; epub_metadata type,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; size&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;int&lt;/span&gt;&lt;br /&gt;
epub_get_data&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;struct&lt;/span&gt; epub&lt;span&gt;*&lt;/span&gt; epub,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;char&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; name,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;char&lt;/span&gt;&lt;span&gt;**&lt;/span&gt; data&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3&gt;CMake&lt;/h3&gt;
&lt;p&gt;Usarei CMake como o sistema de compilação dos bindings pois me sinto confortável com ele &amp;#8211; é o mesmo usado no PySide e no conjunto de ferramentas de geração do Shiboken. Não darei muita atenção à esta parte do processo, apenas veja os arquivos &lt;strong&gt;CMakeLists.txt&lt;/strong&gt;; explicação mais detalhada sobre o processo de compilar um binding pode ser encontrada em &lt;a title=&quot;PySide Binding Generation Tutorial&quot; href=&quot;http://developer.qt.nokia.com/wiki/Category:LanguageBindings::PySide::Shiboken::PySide_Binding_Generation_Tutorial&quot;&gt;PySide Binding Generation Tutorial&lt;/a&gt;. Para informação realmente básica, veja &lt;a title=&quot;PySide CMake Primer&quot; href=&quot;http://developer.qt.nokia.com/wiki/PySide_CMake_Primer&quot;&gt;PySide CMake Primer&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;C++ Wrapper feito à mão para uma biblioteca em C&lt;/h2&gt;
&lt;p&gt;Para gerar bindings Python para uma biblioteca C++, o sujeito precisa escrever uma descrição XML chamada type system, que declarará o quê precisa ser exposto para Python, e o quê sofrerá modificação: funções globais, classes, namespaces, enums. Por exemplo, se em C++ temos a classe &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;Rectangle&lt;/span&gt;&lt;/code&gt;, eu a declararia no type system dessa forma:&lt;/p&gt;
&lt;div class=&quot;codecolorer-container xml geshi&quot;&gt;&lt;div class=&quot;xml codecolorer&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;lt;value-type&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;'Rectangle'&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Todos os métodos pertencentes à &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;Rectangle&lt;/span&gt;&lt;/code&gt; serão expostos em Python automaticamente. O mesmo não vale para as funções em C que representam os métodos para a estrutura epub. Infelizmente não há modo de dizer para o gerador Shiboken que quero a estrutura epub e suas funções representadas como uma classe com métodos, sendo assim precisamos escrever um fino envoltório C++ ao redor das estruturas C. Isto seria um bocado de trabalho para uma grande biblioteca C, mas mesmo com uma minúscula sinto o desconforto de precisar recorrer a este tipo de gambiarra. O type system deveria ser expressivo o bastante para gerar bindings para estruturas e funções em C como se elas fossem objetos e métodos apropriados. Vou marcar isto para futuras melhorias comunitárias/fora-do-trabalho no Shiboken.&lt;/p&gt;
&lt;p&gt;Vejamos um pedaço de código do arquivo&lt;a title=&quot;epub_cpp_wrappers.h @ 757d8dc&quot; href=&quot;https://github.com/setanta/python-epub/blob/757d8dcd34943dd71495959a81fb15ce07896898/epub_cpp_wrappers.h&quot;&gt;epub_cpp_wrapper.h&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&quot;codecolorer-container cpp geshi&quot;&gt;&lt;div class=&quot;cpp codecolorer&quot;&gt;&lt;span&gt;class&lt;/span&gt; EPub &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;public&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ~EPub&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt; epub_close&lt;span&gt;&amp;#40;&lt;/span&gt;m_epub&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;static&lt;/span&gt; &lt;span&gt;inline&lt;/span&gt; EPub&lt;span&gt;*&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; open&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;const&lt;/span&gt; &lt;span&gt;char&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; filename, &lt;span&gt;int&lt;/span&gt; debug &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;struct&lt;/span&gt; epub&lt;span&gt;*&lt;/span&gt; book &lt;span&gt;=&lt;/span&gt; epub_open&lt;span&gt;&amp;#40;&lt;/span&gt;filename, debug&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;if&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;book&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; EPub&lt;span&gt;&amp;#40;&lt;/span&gt;book&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;inline&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; dump&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt; epub_dump&lt;span&gt;&amp;#40;&lt;/span&gt;m_epub&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;inline&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; get_data&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;const&lt;/span&gt; &lt;span&gt;char&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; name, &lt;span&gt;char&lt;/span&gt;&lt;span&gt;**&lt;/span&gt; data&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; epub_get_data&lt;span&gt;&amp;#40;&lt;/span&gt;m_epub, name, data&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;private&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;explicit&lt;/span&gt; EPub&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;struct&lt;/span&gt; epub&lt;span&gt;*&lt;/span&gt; ptr&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;:&lt;/span&gt; m_epub&lt;span&gt;&amp;#40;&lt;/span&gt;ptr&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; EPub&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;const&lt;/span&gt; EPub&lt;span&gt;&amp;amp;&lt;/span&gt;amp&lt;span&gt;;&lt;/span&gt; other&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; EPub&lt;span&gt;&amp;amp;&lt;/span&gt;amp&lt;span&gt;;&lt;/span&gt; operator&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;const&lt;/span&gt; EPub&lt;span&gt;&amp;amp;&lt;/span&gt;amp&lt;span&gt;;&lt;/span&gt; other&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;struct&lt;/span&gt; epub&lt;span&gt;*&lt;/span&gt; m_epub&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Note que todos os métodos são marcados como &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;&lt;span&gt;inline&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; para fazer este envoltório o mais fino possível. (GCC, estou olhando pra você!)&lt;/p&gt;
&lt;h3&gt;Epub::open&lt;/h3&gt;
&lt;p&gt;A função &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;epub_open&lt;/span&gt;&lt;/code&gt; se torna o método estático &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;EPub&lt;span&gt;::&lt;/span&gt;&lt;span&gt;open&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; que retornará um novo objeto &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;EPub&lt;/span&gt;&lt;/code&gt; para o arquivo ePub dado pelo parâmetro &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;filename&lt;/span&gt;&lt;/code&gt;, ou um null pointer se o arquivo for inválido ou não existir.&lt;br /&gt;
O construtor para esta classe foi feito privado de forma que o único modo de criar objetos EPub é via &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;EPub&lt;span&gt;::&lt;/span&gt;&lt;span&gt;open&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;, que nunca criará um objeto &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;EPub&lt;/span&gt;&lt;/code&gt; inválido.&lt;/p&gt;
&lt;h3&gt;~Epub&lt;/h3&gt;
&lt;p&gt;Em C o responsável por liberar a estrutura epub é &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;epub_close&lt;/span&gt;&lt;/code&gt;, mas não criarei um método &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;EPub&lt;span&gt;::&lt;/span&gt;&lt;span&gt;close&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;, pois o equivalente C++ para ele é o destrutor da classe.&lt;/p&gt;
&lt;p&gt;Um binding Python gerado para o que temos até agora seria mais ou menos assim:&lt;/p&gt;
&lt;div class=&quot;codecolorer-container python geshi&quot;&gt;&lt;div class=&quot;python codecolorer&quot;&gt;&lt;span&gt;import&lt;/span&gt; epub&lt;br /&gt;
book = epub.&lt;span&gt;EPub&lt;/span&gt;.&lt;span&gt;open&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;'sample.epub'&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
title = book.&lt;span&gt;get_metadata&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;epub.&lt;span&gt;EPUB_TITLE&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Claro que não expliquei como isto seria gerado, que o módulo se chamaria &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;epub&lt;/span&gt;&lt;/code&gt;, o que é &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;epub.&lt;span&gt;EPUB_TITLE&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;, e como Python saberia o que fazer com &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt;&lt;span&gt;**&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;, mas tenhamos paciência.&lt;/p&gt;
&lt;h3&gt;Movendo enums por aí&lt;/h3&gt;
&lt;p&gt;&lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;EPUB_TITLE&lt;/span&gt;&lt;/code&gt; é um valor vindo do enum &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;epub_metadata&lt;/span&gt;&lt;/code&gt;, se ambos forem exportados para Python conforme estão, eles terão esta aparência:&lt;/p&gt;
&lt;div class=&quot;codecolorer-container python geshi&quot;&gt;&lt;div class=&quot;python codecolorer&quot;&gt;&lt;span&gt;import&lt;/span&gt; epub&lt;br /&gt;
epub.&lt;span&gt;epub_metadata&lt;/span&gt;&lt;br /&gt;
epub.&lt;span&gt;EPUB_TITLE&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Assim fica bem feio e fuleiro. Já que &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;epub_metadata&lt;/span&gt;&lt;/code&gt; é um enum relacionado ao objeto epub (como nos informa o prefixo &lt;strong&gt;epub_&lt;/strong&gt;), será natural que ele seja movido para dentro da class EPub. No meu mundo de fantasia, a tag do type system que descreve um enum C++ para Python teria a opção de movê-lo para dentro de outro objeto, e também de ser renomeado. Algo desse tipo:&lt;/p&gt;
&lt;div class=&quot;codecolorer-container xml geshi&quot;&gt;&lt;div class=&quot;xml codecolorer&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;lt;enum-type&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;'epub_metadata'&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;rename&lt;/span&gt;=&lt;span&gt;'metatada'&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;move-into&lt;/span&gt;=&lt;span&gt;'EPub'&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;remove-enum-value-prefix&lt;/span&gt;=&lt;span&gt;'EPUB_'&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;E aqui temos outro item para a lista de &amp;#8220;por fazer&amp;#8221; do Shiboken. Enquanto esta funcionalidade não é implementada, terei de fazê-lo manualmente.&lt;/p&gt;
&lt;div class=&quot;codecolorer-container cpp geshi&quot;&gt;&lt;div class=&quot;cpp codecolorer&quot;&gt;&lt;span&gt;class&lt;/span&gt; EPub &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;public&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;enum&lt;/span&gt; metadata &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ID &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EPUB_ID&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; TITLE &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EPUB_TITLE&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CREATOR &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EPUB_CREATOR&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CONTRIB &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EPUB_CONTRIB&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SUBJECT &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EPUB_SUBJECT&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; PUBLISHER &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EPUB_PUBLISHER&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DESCRIPTION &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EPUB_DESCRIPTION&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DATE &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EPUB_DATE&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; TYPE &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EPUB_TYPE&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; FORMAT &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EPUB_FORMAT&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SOURCE &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EPUB_SOURCE&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; LANG &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EPUB_LANG&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; RELATION &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EPUB_RELATION&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; COVERAGE &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EPUB_COVERAGE&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; RIGHTS &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EPUB_RIGHTS&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; META &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EPUB_META&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;inline&lt;/span&gt; &lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt;&lt;span&gt;**&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; get_metadata&lt;span&gt;&amp;#40;&lt;/span&gt;metadata type, &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; size&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; epub_get_metadata&lt;span&gt;&amp;#40;&lt;/span&gt;m_epub,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;epub_metadata&lt;span&gt;&amp;#40;&lt;/span&gt;type&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;size&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Os valores do enum &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;epub_metadata&lt;/span&gt;&lt;/code&gt; foram convertidos para &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;&lt;span&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; para impedir o &lt;strong&gt;ApiExtractor&lt;/strong&gt; de emitir toda sorte de warnings dizendo que ele não sabe quem são esses caras.&lt;/p&gt;
&lt;p&gt;De qualquer modo, é terrível&amp;#8230; ter esse gerador incrementado, e ter de escrever tudo isso&amp;#8230; nãããão!&lt;/p&gt;
&lt;h3&gt;TIterator e EIterator&lt;/h3&gt;
&lt;p&gt;As estruturas C &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;titerator&lt;/span&gt;&lt;/code&gt; e &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;eiterator&lt;/span&gt;&lt;/code&gt; serão envolvidas pelas class C++ &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;TIterator&lt;/span&gt;&lt;/code&gt; e &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;EIterator&lt;/span&gt;&lt;/code&gt;, respectivamente, e como a classe &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;EPub&lt;/span&gt;&lt;/code&gt; seus construtores serão privados.&lt;/p&gt;
&lt;div class=&quot;codecolorer-container cpp geshi&quot;&gt;&lt;div class=&quot;cpp codecolorer&quot;&gt;&lt;span&gt;class&lt;/span&gt; TIterator &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;public&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;enum&lt;/span&gt; type &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; NAVMAP &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;TITERATOR_NAVMAP&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; GUIDE &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;TITERATOR_GUIDE&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; PAGES &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;TITERATOR_PAGES&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ~TIterator&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt; epub_free_titerator&lt;span&gt;&amp;#40;&lt;/span&gt;m_iter&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;inline&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; isValid&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; epub_tit_curr_valid&lt;span&gt;&amp;#40;&lt;/span&gt;m_iter&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&lt;span&gt;private&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;friend&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; EPub&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;explicit&lt;/span&gt; TIterator&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;struct&lt;/span&gt; titerator&lt;span&gt;*&lt;/span&gt; iter&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;:&lt;/span&gt; m_iter&lt;span&gt;&amp;#40;&lt;/span&gt;iter&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;struct&lt;/span&gt; titerator&lt;span&gt;*&lt;/span&gt; m_iter&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Novas instâncias de &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;TIterator&lt;/span&gt;&lt;/code&gt; e &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;EIterator&lt;/span&gt;&lt;/code&gt; são criadas por métodos de &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;EPub&lt;/span&gt;&lt;/code&gt;, por isso ela deve ser feita amiga (&lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;&lt;span&gt;friend&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;) das classes iteradoras.&lt;/p&gt;
&lt;div class=&quot;codecolorer-container cpp geshi&quot;&gt;&lt;div class=&quot;cpp codecolorer&quot;&gt;&lt;span&gt;class&lt;/span&gt; EPub &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;public&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;inline&lt;/span&gt; EIterator&lt;span&gt;*&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; get_iterator&lt;span&gt;&amp;#40;&lt;/span&gt;EIterator&lt;span&gt;::&lt;/span&gt;&lt;span&gt;type&lt;/span&gt; type, &lt;span&gt;int&lt;/span&gt; opt &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;struct&lt;/span&gt; eiterator&lt;span&gt;*&lt;/span&gt; it &lt;span&gt;=&lt;/span&gt; epub_get_iterator&lt;span&gt;&amp;#40;&lt;/span&gt;m_epub, eiterator_type&lt;span&gt;&amp;#40;&lt;/span&gt;type&lt;span&gt;&amp;#41;&lt;/span&gt;, opt&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;if&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;it&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; EIterator&lt;span&gt;&amp;#40;&lt;/span&gt;it&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;inline&lt;/span&gt; TIterator&lt;span&gt;*&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; get_titerator&lt;span&gt;&amp;#40;&lt;/span&gt;TIterator&lt;span&gt;::&lt;/span&gt;&lt;span&gt;type&lt;/span&gt; type, &lt;span&gt;int&lt;/span&gt; opt &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;struct&lt;/span&gt; titerator&lt;span&gt;*&lt;/span&gt; it &lt;span&gt;=&lt;/span&gt; epub_get_titerator&lt;span&gt;&amp;#40;&lt;/span&gt;m_epub, titerator_type&lt;span&gt;&amp;#40;&lt;/span&gt;type&lt;span&gt;&amp;#41;&lt;/span&gt;, opt&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;if&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;it&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; TIterator&lt;span&gt;&amp;#40;&lt;/span&gt;it&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;python-epub&lt;/h2&gt;
&lt;p&gt;Agora é hora de dizer ao gerador o quê entra e o quê será modificado nos bindings.&lt;/p&gt;
&lt;h3&gt;O cabeçalho global&lt;/h3&gt;
&lt;p&gt;O cabeçalho global é um arquivo que inclui todos os outros cabeçalhos da biblioteca que será analizada. No cabeçalho global o desenvolvedor de bindings pode também adicionar algumas cláusulas, como um &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;&lt;span&gt;#define&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; que irá causar alguma condição de mudança nos cabeçalhos da biblioteca alvo, que irá afetar o binding gerado.&lt;/p&gt;
&lt;p&gt;O arquivo &lt;a href=&quot;https://github.com/setanta/python-epub/blob/master/epub_global.h&quot;&gt;epub_global.h&lt;/a&gt; que uso aqui é muito simples:&lt;/p&gt;
&lt;div class=&quot;codecolorer-container cpp geshi&quot;&gt;&lt;div class=&quot;cpp codecolorer&quot;&gt;&lt;span&gt;#ifndef EPUB_GLOBAL_H&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;#define EPUB_GLOBAL_H&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;#include &amp;amp;lt;epub.h&amp;amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;#include &amp;amp;lt;epub_shared.h&amp;amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;#include &amp;amp;lt;epub_version.h&amp;amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;#include &amp;quot;epub_cpp_wrappers.h&amp;quot;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;// ApiExtractor reclamara' se&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;// encontrar apenas pre-definicoes.&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;struct&lt;/span&gt; titerator &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;struct&lt;/span&gt; eiterator &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;#endif&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Como o comentário nos diz, ApiExtractor não gosta quando encontra pré-declarações sem definições. Escolhi adicionar estas definições falsas para &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;&lt;span&gt;struct&lt;/span&gt; titerator&lt;/span&gt;&lt;/code&gt; e &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;&lt;span&gt;struct&lt;/span&gt; eiterator&lt;/span&gt;&lt;/code&gt;. (Por alguma razão o gerador nada diz sobre &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;&lt;span&gt;struct&lt;/span&gt; epub&lt;/span&gt;&lt;/code&gt;.) Outra opção seria não usar estas definições falsas, mas adicionar uma linha ao arquivo type system dizendo ao gerador para ignorar avisos relativos à estas estruturas.&lt;/p&gt;
&lt;h3&gt;A descrição do Type System&lt;/h3&gt;
&lt;p&gt;Aqui segue um pedaço de código do arquivo &lt;a title=&quot;typesystem_epub.xml @ 78de928&quot; href=&quot;https://github.com/setanta/python-epub/blob/78de92867f668d92a7610515eaeebe34487ebf03/typesystem_epub.xml&quot;&gt;typesystem_epub.xml&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;codecolorer-container xml geshi&quot;&gt;&lt;div class=&quot;xml codecolorer&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;lt;?xml&lt;/span&gt; &lt;span&gt;version&lt;/span&gt;=&lt;span&gt;'1.0'&lt;/span&gt;&lt;span&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;typesystem&lt;/span&gt; &lt;span&gt;package&lt;/span&gt;=&lt;span&gt;'epub'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;rejection&lt;/span&gt; &lt;span&gt;enum-name&lt;/span&gt;=&lt;span&gt;'epub_metadata'&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;object-type&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;'EPub'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;enum-type&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;'metadata'&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/object-type&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;/typesystem&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;O enum &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;epub_metadata&lt;/span&gt;&lt;/code&gt; não é exportado para Python (ao menos não diretamente) e para evitar que o gerador emita seus alertas, ele precisa ser explicitamente rejeitado; seu substituto C++ é adicionado depois dentro do object-type EPub. O mesmo acontece com os outros enums.&lt;/p&gt;
&lt;p&gt;Na notação do type system &lt;code class=&quot;codecolorer xml default&quot;&gt;&lt;span class=&quot;xml&quot;&gt;object-type&lt;/span&gt;&lt;/code&gt; se refere aos objetos que são passados somente como ponteiros (como &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;EPub&lt;/span&gt;&lt;/code&gt;, cujos construtor e operador de cópia são privados). Se, de outro modo, o objeto pode ser passado como valor, ele deve ser declarado como &lt;code class=&quot;codecolorer xml default&quot;&gt;&lt;span class=&quot;xml&quot;&gt;value-type&lt;/span&gt;&lt;/code&gt;, conforme nosso exemplo de &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;Rectangle&lt;/span&gt;&lt;/code&gt; mencionado anteriormente.&lt;/p&gt;
&lt;h3&gt;O Protocolo de Iterador de Python&lt;/h3&gt;
&lt;p&gt;Em Python, se um objeto suporta o &lt;a href=&quot;http://docs.python.org/library/stdtypes.html#iterator-types&quot;&gt;Protocolo de Iterador&lt;/a&gt;, poderei usar em comandos &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;&lt;span&gt;for&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;, desta forma:&lt;/p&gt;
&lt;div class=&quot;codecolorer-container python geshi&quot;&gt;&lt;div class=&quot;python codecolorer&quot;&gt;&lt;span&gt;from&lt;/span&gt; epub &lt;span&gt;import&lt;/span&gt; EPub, TIterator&lt;br /&gt;
book = EPub.&lt;span&gt;open&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;.&lt;span&gt;epub_file&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;for&lt;/span&gt; toc_it &lt;span&gt;in&lt;/span&gt; book.&lt;span&gt;get_titerator&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;TIterator.&lt;span&gt;NAVMAP&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;if&lt;/span&gt; &lt;span&gt;not&lt;/span&gt; toc_it.&lt;span&gt;isValid&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;continue&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;print&lt;/span&gt; &lt;span&gt;'link : '&lt;/span&gt; + toc_it.&lt;span&gt;link&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;print&lt;/span&gt; &lt;span&gt;'label: '&lt;/span&gt; + toc_it.&lt;span&gt;label&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Seguir o Protocolo de Iterador de Python consiste tão somente de um objeto implementar os métodos &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;&lt;span&gt;__iter__&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; e &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;__next__&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; o nome correto para o método é &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;next&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; e não &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;__next__&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;. Este é apenas um bug menor no gerador, que acabei de encontrar.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;O XML para adicionar as funcionalidades do protocolo de iterador à classe &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;TIterator&lt;/span&gt;&lt;/code&gt; será extenso, de forma que o partirei em duas partes, a primeira lidando com &lt;a href=&quot;http://www.pyside.org/docs/apiextractor/typesystem_templates.html&quot;&gt;templates de código do type system&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Os templates do Type System&lt;/h4&gt;
&lt;div class=&quot;codecolorer-container xml geshi&quot;&gt;&lt;div class=&quot;xml codecolorer&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;lt;?xml&lt;/span&gt; &lt;span&gt;version&lt;/span&gt;=&lt;span&gt;'1.0'&lt;/span&gt;&lt;span&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;typesystem&lt;/span&gt; &lt;span&gt;package&lt;/span&gt;=&lt;span&gt;'epub'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;template&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;'iterator.__iter__'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Py_INCREF(%PYSELF);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; %PYARG_0 = %PYSELF;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/template&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;template&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;'iterator.__next__'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (%CPPSELF.next()) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;insert-template&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;'iterator.__iter__'&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; PyErr_SetNone(PyExc_StopIteration);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/template&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ...&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Os métodos de iterador para &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;TIterator&lt;/span&gt;&lt;/code&gt; e &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;EIterator&lt;/span&gt;&lt;/code&gt; terão exatamente a mesma implementação, então é esperto usar os &lt;a href=&quot;http://www.pyside.org/docs/apiextractor/typesystem_templates.html&quot;&gt;templates&lt;/a&gt; do type system, e ter o código, e seus eventuais bugs, num único lugar.&lt;/p&gt;
&lt;p&gt;O &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;iterator.&lt;span&gt;__iter__&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; método precisa apenas returnar o próprio objeto com seu contador de referências incrementado em um. &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;iterator.__next__&lt;/span&gt;&lt;/code&gt; chama o &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;next&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; do objeto C++ subjacente (e também retorna a si próprio, e incrementa o refcounter), e sobe uma exceção Python &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;&lt;span&gt;StopIteration&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; quando chega ao fim.&lt;/p&gt;
&lt;p&gt;As &lt;a href=&quot;http://www.pyside.org/docs/shiboken/typesystemvariables.html&quot;&gt;variáveis do type system&lt;/a&gt; &lt;code class=&quot;codecolorer xml default&quot;&gt;&lt;span class=&quot;xml&quot;&gt;%PYSELF&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;codecolorer xml default&quot;&gt;&lt;span class=&quot;xml&quot;&gt;%PYARG_0&lt;/span&gt;&lt;/code&gt; e &lt;code class=&quot;codecolorer xml default&quot;&gt;&lt;span class=&quot;xml&quot;&gt;%CPPSELF&lt;/span&gt;&lt;/code&gt; são substituídas por valores dependentes do contexto onde são usados (e.g. as classes &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;TIterator&lt;/span&gt;&lt;/code&gt; ou &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;EIteration&lt;/span&gt;&lt;/code&gt;). Verifique a &lt;a href=&quot;http://www.pyside.org/docs/shiboken/typesystemvariables.html&quot;&gt;documentation&lt;/a&gt; para saber seus significados.&lt;/p&gt;
&lt;h4&gt;Adicionando os métodos de iteração&lt;/h4&gt;
&lt;div class=&quot;codecolorer-container xml geshi&quot;&gt;&lt;div class=&quot;xml codecolorer&quot;&gt;&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;object-type&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;'TIterator'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;modify-function&lt;/span&gt; &lt;span&gt;signature&lt;/span&gt;=&lt;span&gt;'next()'&lt;/span&gt; &lt;span&gt;remove&lt;/span&gt;=&lt;span&gt;'all'&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;add-function&lt;/span&gt; &lt;span&gt;signature&lt;/span&gt;=&lt;span&gt;'__iter__'&lt;/span&gt; &lt;span&gt;return-type&lt;/span&gt;=&lt;span&gt;'PyObject*'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;inject-code&lt;/span&gt; &lt;span&gt;class&lt;/span&gt;=&lt;span&gt;'target'&lt;/span&gt; &lt;span&gt;position&lt;/span&gt;=&lt;span&gt;'beginning'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;insert-template&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;'iterator.__iter__'&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/inject-code&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/add-function&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;add-function&lt;/span&gt; &lt;span&gt;signature&lt;/span&gt;=&lt;span&gt;'__next__'&lt;/span&gt; &lt;span&gt;return-type&lt;/span&gt;=&lt;span&gt;'PyObject*'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;inject-code&lt;/span&gt; &lt;span&gt;class&lt;/span&gt;=&lt;span&gt;'target'&lt;/span&gt; &lt;span&gt;position&lt;/span&gt;=&lt;span&gt;'beginning'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;insert-template&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;'iterator.__next__'&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/inject-code&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/add-function&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/object-type&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;...&lt;br /&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;/typesystem&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Primeiro o &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;next&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; original do C++ é removido, então aqueles para o protocolo de iterador do Python são adicionados, usando a tag &lt;code class=&quot;codecolorer xml default&quot;&gt;&lt;span class=&quot;xml&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;lt;insert-template&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; para inserir o código personalizado definido anteriormente. A exatas mesmas linhas serão adicionadas à classe &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;EIterator&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;h4&gt;Só mais um pouco de gambiarras&lt;/h4&gt;
&lt;p&gt;Apenas um obstáculo permanece no caminho de ter iteradores Python apropriados. Quando o comando &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;&lt;span&gt;for&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; de Python for usado para iterar sobre um objeto iterável, na primeira rodada ele chama o método &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;&lt;span&gt;__iter__&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; do objeto, e imediatamente após ele chama &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;next&lt;/span&gt;&lt;/code&gt;, e continua chamando &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;next&lt;/span&gt;&lt;/code&gt; para cada nova iteração.&lt;/p&gt;
&lt;p&gt;O problema aqui é que o iterador C subjacente retorna um objeto levando conteúdo apropriado quando &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;&lt;span&gt;__iter__&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; é chamado, então a forma como a iteração do &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;&lt;span&gt;for&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; Python funciona fará o primeiro item válido ser pulado. Uma gambiarra para este caso é usar uma flag no wrapper C++ que verificará se o iterador acabou de ser criado, de forma que ele não pulará para o iterador seguinte quando &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;next&lt;/span&gt;&lt;/code&gt; for chamada pela primeira vez.&lt;/p&gt;
&lt;div class=&quot;codecolorer-container cpp geshi&quot;&gt;&lt;div class=&quot;cpp codecolorer&quot;&gt;&lt;span&gt;class&lt;/span&gt; TIterator &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;public&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;inline&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; next&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;if&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;m_isFirst&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; m_isFirst &lt;span&gt;=&lt;/span&gt; &lt;span&gt;false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;true&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; epub_tit_next&lt;span&gt;&amp;#40;&lt;/span&gt;m_iter&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;private&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;friend&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; EPub&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;explicit&lt;/span&gt; TIterator&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;struct&lt;/span&gt; titerator&lt;span&gt;*&lt;/span&gt; iter&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;:&lt;/span&gt; m_iter&lt;span&gt;&amp;#40;&lt;/span&gt;iter&lt;span&gt;&amp;#41;&lt;/span&gt;, m_isFirst&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;struct&lt;/span&gt; titerator&lt;span&gt;*&lt;/span&gt; m_iter&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;bool&lt;/span&gt; m_isFirst&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Pude ter esta liberdade porque &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;TIterator&lt;/span&gt;&lt;/code&gt; é uma classe completamente sob meu (eu, o desenvolvedor do binding) controle. Se &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;&lt;span&gt;struct&lt;/span&gt; titerator&lt;/span&gt;&lt;/code&gt; fosse uma classe C++ desde o começo, esta solução não seria a melhor. Talvez se a &lt;strong&gt;libshiboken&lt;/strong&gt; (a biblioteca de apoio usada por todos os bindings gerados pelo Shiboken) fornecesse uma classe iteradora base para lidar com essa diferença particular entre iteradores Python e C++. Ou talvez as classes geradas, quando identificadas como iteráveis pela presença dos métodos do protocolo de iteração adicionados pelo desenvolvedor do binding, poderiam ter tal funcionalidade. A última opção me parece a melhor, e esse é mais um item pra minha lista de melhorias futuras.&lt;/p&gt;
&lt;h3&gt;Conversões Personalizadas&lt;/h3&gt;
&lt;h4&gt;Retornando valores unicode&lt;/h4&gt;
&lt;p&gt;Os métodos &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;EIterator&lt;span&gt;::&lt;/span&gt;&lt;span&gt;curr&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; e &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;EIterator&lt;span&gt;::&lt;/span&gt;&lt;span&gt;curr_url&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; returnam valores do tipo &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;&lt;span&gt;char&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;, que não tem um conversor (&lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;&lt;span&gt;const&lt;/span&gt; &lt;span&gt;char&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; é que tem), por isso escrevi um código específico para converter isto para unicode do Python.&lt;/p&gt;
&lt;div class=&quot;codecolorer-container xml geshi&quot;&gt;&lt;div class=&quot;xml codecolorer&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;lt;?xml&lt;/span&gt; &lt;span&gt;version&lt;/span&gt;=&lt;span&gt;'1.0'&lt;/span&gt;&lt;span&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;typesystem&lt;/span&gt; &lt;span&gt;package&lt;/span&gt;=&lt;span&gt;'epub'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;template&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;'return_char_pointer'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char* %0 = %CPPSELF.%FUNCTION_NAME();&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (%0) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; %PYARG_0 = PyUnicode_DecodeUTF8(%0, strlen(%0), &amp;quot;strict&amp;quot;);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Py_INCREF(Py_None);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; %PYARG_0 = Py_None;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/template&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;object-type&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;'EIterator'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;modify-function&lt;/span&gt; &lt;span&gt;signature&lt;/span&gt;=&lt;span&gt;'curr()'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;inject-code&lt;/span&gt; &lt;span&gt;class&lt;/span&gt;=&lt;span&gt;'target'&lt;/span&gt; &lt;span&gt;position&lt;/span&gt;=&lt;span&gt;'beginning'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;insert-template&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;'return_char_pointer'&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/inject-code&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/modify-function&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;modify-function&lt;/span&gt; &lt;span&gt;signature&lt;/span&gt;=&lt;span&gt;'curr_url()'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;inject-code&lt;/span&gt; &lt;span&gt;class&lt;/span&gt;=&lt;span&gt;'target'&lt;/span&gt; &lt;span&gt;position&lt;/span&gt;=&lt;span&gt;'beginning'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;insert-template&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;'return_char_pointer'&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/inject-code&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/modify-function&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/object-type&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;/typesystem&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h4&gt;Modificando a assinatura de um método&lt;/h4&gt;
&lt;p&gt;As assinaturas de alguns métodos C++ não podem ser automaticamente convertidas para código Python que faça sentido, então adicionei mais um pouco de código feito sob medida para tratar das situações caso a caso. Por exemplo, o método&lt;/p&gt;
&lt;div class=&quot;codecolorer-container cpp geshi&quot;&gt;&lt;div class=&quot;cpp codecolorer&quot;&gt;&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt;&lt;span&gt;**&lt;/span&gt;&lt;br /&gt;
EPub&lt;span&gt;::&lt;/span&gt;&lt;span&gt;get_metadata&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;metadata type, &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; size&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;O argumento &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; size&lt;/span&gt;&lt;/code&gt; recebe um ponteiro para um int, que conterá o tamanho da lista de strings unicode retornada como &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt;&lt;span&gt;**&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;. Em Python ele meramente retornará uma lista de objetos unicode, e a chamada à &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;get_metadata&lt;/span&gt;&lt;/code&gt; não precisa do argumento &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;size&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Creio que a descrição do type system será o bastante para ver como o sistema de modificação funciona.&lt;/p&gt;
&lt;div class=&quot;codecolorer-container xml geshi&quot;&gt;&lt;div class=&quot;xml codecolorer&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;lt;object-type&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;'EPub'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;enum-type&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;'metadata'&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;modify-function&lt;/span&gt; &lt;span&gt;signature&lt;/span&gt;=&lt;span&gt;'get_metadata(EPub::metadata,int*)'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;modify-argument&lt;/span&gt; &lt;span&gt;index&lt;/span&gt;=&lt;span&gt;'2'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;remove-argument&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/modify-argument&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;modify-argument&lt;/span&gt; &lt;span&gt;index&lt;/span&gt;=&lt;span&gt;'return'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;replace-type&lt;/span&gt; &lt;span&gt;modified-type&lt;/span&gt;=&lt;span&gt;'PyTuple'&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/modify-argument&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;inject-code&lt;/span&gt; &lt;span&gt;class&lt;/span&gt;=&lt;span&gt;'target'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; unsigned char** data = 0;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; int size;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; data = %CPPSELF.%FUNCTION_NAME(%1, &lt;span&gt;&amp;amp;size);&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; if (data) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; %PYARG_0 = PyTuple_New(size);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; PyObject* uni = 0;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for (int i = 0; i &lt;span&gt;&amp;lt; size; ++i&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;uni = PyUnicode_DecodeUTF8&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;const char*&lt;span&gt;&amp;#41;&lt;/span&gt;data&lt;span&gt;&amp;#91;&lt;/span&gt;i&lt;span&gt;&amp;#93;&lt;/span&gt;,&lt;/span&gt;&lt;br /&gt;
&lt;span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; strlen&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;const char*&lt;span&gt;&amp;#41;&lt;/span&gt;data&lt;span&gt;&amp;#91;&lt;/span&gt;i&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;/span&gt;&lt;br /&gt;
&lt;span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;quot;strict&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PyTuple_SetItem&lt;span&gt;&amp;#40;&lt;/span&gt;%PYARG_0, i, uni&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for &lt;span&gt;&amp;#40;&lt;/span&gt;int i = 0; i &amp;lt; size; ++i&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;free&lt;span&gt;&amp;#40;&lt;/span&gt;data&lt;span&gt;&amp;#91;&lt;/span&gt;i&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;free&lt;span&gt;&amp;#40;&lt;/span&gt;data&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;#125;&lt;/span&gt; else &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Py_INCREF&lt;span&gt;&amp;#40;&lt;/span&gt;Py_None&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;%PYARG_0 = Py_None;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;lt;/inject-code&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/modify-function&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; ...&lt;br /&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;/object-type&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Baixando, compilando, etc.&lt;/h2&gt;
&lt;p&gt;Chega de explicações, agora vamos experimentar o código. Lembre-se que precisará também dos arquivos de desenvolvimento que mencionei muito tempo atrás&lt;/p&gt;
&lt;p&gt;Clone a versão mais recente do repositório git:&lt;/p&gt;
&lt;div class=&quot;codecolorer-container bash geshi&quot;&gt;&lt;div class=&quot;bash codecolorer&quot;&gt;&lt;span&gt;git&lt;/span&gt; clone &lt;span&gt;git&lt;/span&gt;:&lt;span&gt;//&lt;/span&gt;github.com&lt;span&gt;/&lt;/span&gt;setanta&lt;span&gt;/&lt;/span&gt;python-epub.git&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;ou baixe o tarball: &lt;a href=&quot;http://setantas.net/files/python-epub.tar.bz2&quot;&gt;python-epub.tar.bz2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;No diretório do código fonte crie um diretório &lt;code class=&quot;codecolorer bash default&quot;&gt;&lt;span class=&quot;bash&quot;&gt;build&lt;/span&gt;&lt;/code&gt; e&amp;#8230;&lt;/p&gt;
&lt;div class=&quot;codecolorer-container bash geshi&quot;&gt;&lt;div class=&quot;bash codecolorer&quot;&gt;&lt;span&gt;cd&lt;/span&gt; python-epub&lt;br /&gt;
&lt;span&gt;mkdir&lt;/span&gt; build&lt;br /&gt;
&lt;span&gt;cd&lt;/span&gt; build&lt;br /&gt;
cmake ..&lt;br /&gt;
&lt;span&gt;make&lt;/span&gt;&lt;br /&gt;
ctest&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;O último comando merece uma conversa à respeito.&lt;/p&gt;
&lt;h3&gt;Testar, Testar, Testar&lt;/h3&gt;
&lt;p&gt;Quando trabalhando com desenvolvimento de bindings há uma miríade de coisas que podem dar errado, e muitas delas dão errado em completo silêncio. Tendo isto em mente, eu digo-lhe que ter testes de unidade torna a vida do desenvolvedor de bindings suportável.&lt;/p&gt;
&lt;p&gt;Veja o &lt;a href=&quot;https://github.com/setanta/python-epub/tree/master/tests&quot;&gt;diretório de testes&lt;/a&gt; para exemplos de como usar o bingind python-epub.&lt;/p&gt;
&lt;p&gt;Para resultados detalhados dos testes, rode ctest com a opção &lt;code class=&quot;codecolorer bash default&quot;&gt;&lt;span class=&quot;bash&quot;&gt;&lt;span&gt;-V&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; (verboso).&lt;/p&gt;
&lt;h2&gt;Exemplo de UI (senão seria tedioso)&lt;/h2&gt;
&lt;p&gt;Mas a própria UI é bem tediosa, embora feita com o espetacular &lt;a href=&quot;http://www.pyside.org&quot;&gt;PySide&lt;/a&gt;, ela nem sequer mostra imagens. Por outro lado, com um pouco de código agora posso ver o conteúdo de um ebook ePub.&lt;/p&gt;
&lt;p&gt;De dentro do diretório &lt;code class=&quot;codecolorer bash default&quot;&gt;&lt;span class=&quot;bash&quot;&gt;python-epub&lt;span&gt;/&lt;/span&gt;build&lt;/span&gt;&lt;/code&gt; chame o visualizador de ePub dessa forma:&lt;/p&gt;
&lt;div class=&quot;codecolorer-container bash geshi&quot;&gt;&lt;div class=&quot;bash codecolorer&quot;&gt;python ..&lt;span&gt;/&lt;/span&gt;simple-ui&lt;span&gt;/&lt;/span&gt;bookviewer.py ..&lt;span&gt;/&lt;/span&gt;tests&lt;span&gt;/&lt;/span&gt;beyond-the-wall-of-sleep.epub&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Ele sempre espera um parâmetro com o caminho para um arquivo ePub, neste caso &lt;a href=&quot;http://www.feedbooks.com/book/237/beyond-the-wall-of-sleep&quot;&gt;&amp;#8220;Beyond the Wall of Sleep&amp;#8221;&lt;/a&gt; de &lt;a href=&quot;http://www.feedbooks.com/author/12&quot;&gt;Lovecraft&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Screenshots:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.setantas.net/blog/wp-content/uploads/2011/03/epubviewer_screenshots.png&quot; alt=&quot;Simplest ePub viewer (made with PySide)&quot; width=&quot;580&quot; height=&quot;480&quot; class=&quot;size-full wp-image-516&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;map name=&quot;google_ad_map_517_74ab9b1e764918ae&quot;&gt;
&lt;area shape=&quot;rect&quot; href=&quot;http://imageads.googleadservices.com/pagead/imgclick/517?pos=0&quot; coords=&quot;1,2,367,28&quot; /&gt;
&lt;area shape=&quot;rect&quot; href=&quot;http://services.google.com/feedback/abg&quot; coords=&quot;384,10,453,23&quot; /&gt;&lt;/map&gt;
&lt;img usemap=&quot;http://www.setantas.net/blog/feed/#google_ad_map_517_74ab9b1e764918ae&quot; border=&quot;0&quot; src=&quot;http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=517&amp;url= http%3A%2F%2Fwww.setantas.net%2Fblog%2F2011%2F03%2F09%2Fpython-bindings-para-libepub-usando-shiboken%2F&quot; /&gt;&lt;/p&gt;&lt;div&gt;&lt;a href=&quot;http://twitter.com/share?url=http://www.setantas.net/blog/2011/03/09/python-bindings-para-libepub-usando-shiboken/&amp;via=&amp;text=Python bindings para libepub usando Shiboken&amp;related=:&amp;lang=en&amp;count=horizontal&quot; class=&quot;twitter-share-button&quot;&gt;Tweet&lt;/a&gt;&lt;/div&gt;</content>
		<author>
			<name>Marcelo Lira</name>
			<uri>http://www.setantas.net/blog</uri>
		</author>
		<source>
			<title type="html">Head Like a Hole</title>
			<link rel="self" href="http://www.setantas.net/blog/feed/"/>
			<id>http://www.setantas.net/blog/feed/</id>
			<updated>2012-04-06T09:15:03+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Python bindings for libepub using Shiboken</title>
		<link href="http://www.setantas.net/blog/2011/03/08/python-bindings-for-libepub-using-shiboken/"/>
		<id>http://www.setantas.net/blog/?p=512</id>
		<updated>2011-03-09T00:31:54+00:00</updated>
		<content type="html">&lt;p&gt;I have a &lt;a href=&quot;http://twitpic.com/3ucxtj&quot;&gt;Kindle&lt;/a&gt;, I like it very much, but unfortunately I can&amp;#8217;t say the same about the format it used for books. Not that I have made a detailed study of the mobi format and came to the conclusion that it is technically inferior. No. The problem is that &lt;a title=&quot;Wikipedia: ePub&quot; href=&quot;http://en.wikipedia.org/wiki/EPUB&quot;&gt;ePub&lt;/a&gt; is so much more popular, which mean more books, and more tools to play with. &lt;a href=&quot;http://calibre-ebook.com/&quot;&gt;Calibre&lt;/a&gt; is awesome to convert between eBook formats, but I prefer the simplicity of downloading a book, copying it to the device and reading right away.&lt;/p&gt;
&lt;p&gt;When my Kindle is not at hand, my replacement reader is a N900 with &lt;a title=&quot;eBook reader for Maemo 5&quot; href=&quot;http://juhanagsoc.wordpress.com/&quot;&gt;MeBook&lt;/a&gt;, one of my favorite apps &amp;#8211; it looks for books (in ePub format) on &lt;a title=&quot;Feedbooks&quot; href=&quot;http://www.feedbooks.com/&quot;&gt;Feedbooks&lt;/a&gt;, downloads to device and show them in a nice list with covers and all. Looking at MeBook source code I learned that it uses &lt;a title=&quot;eBook tools&quot; href=&quot;http://sourceforge.net/projects/ebook-tools/&quot;&gt;libepub&lt;/a&gt; to read the ePub eBooks, so I thought it would be interesting to make a Python binding to &lt;strong&gt;libepub&lt;/strong&gt;. And here we are.&lt;/p&gt;
&lt;p&gt;Ah, and one more thing before we start, I found a related Python project on github called &lt;a href=&quot;https://github.com/jharjono/libepub&quot;&gt;libepub&lt;/a&gt;. Hadn&amp;#8217;t checked it yet, but I mention it here for information&amp;#8217;s sake.&lt;/p&gt;
&lt;h2&gt;Shiboken&lt;/h2&gt;
&lt;p&gt;&lt;a title=&quot;Shiboken&quot; href=&quot;http://www.setantas.net/blog/2009/08/31/shiboken/&quot; target=&quot;_self&quot;&gt;Shiboken&lt;/a&gt; is the world famous tool used to generate the world famous &lt;a title=&quot;PySide&quot; href=&quot;http://pyside.org&quot;&gt;PySide&lt;/a&gt; bindings (that happen to have reached &lt;a title=&quot;PySide: Python for Qt 1.0 released!&quot; href=&quot;http://www.pyside.org/2011/03/pyside-python-for-qt-1-0-released/&quot;&gt;1.0&lt;/a&gt; last week &amp;#8211; yay!) It is one of the best tools around to generate Python bindings for C++ libraries. But that&amp;#8217;s me talking &amp;#8211; I work on it. But &lt;strong&gt;libepub&lt;/strong&gt; is written in C, and even though Shiboken can generate bindings for a bunch of global functions and put them together in a Python module, that&amp;#8217;s crappy. So I&amp;#8217;ll have to make some preparations to make &lt;strong&gt;libepub&lt;/strong&gt; appear beautiful in Python.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Pre-requisites:&lt;/strong&gt; development files (i.e. the headers) for &lt;a title=&quot;API Extractor&quot; href=&quot;http://www.pyside.org/home-binding/api-extractor/&quot;&gt;ApiExtractor&lt;/a&gt;, &lt;a title=&quot;GeneratorRunner 0.6&quot; href=&quot;http://pyside.org/docs/generatorrunner/&quot;&gt;GeneratorRunner&lt;/a&gt;, &lt;a title=&quot;Shiboken&quot; href=&quot;http://pyside.org/docs/shiboken/&quot;&gt;Shiboken&lt;/a&gt;, and &lt;strong&gt;libepub&lt;/strong&gt;. (For Debian/Ubuntu users this means: &lt;strong&gt;libapiextractor-dev&lt;/strong&gt;, &lt;strong&gt;libgenrunner-dev&lt;/strong&gt;, &lt;strong&gt;libshiboken-dev&lt;/strong&gt;, and &lt;strong&gt;libepub-dev&lt;/strong&gt;.) And the C++ compiler plus CMake, of course.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Remainder:&lt;/strong&gt; ApiExtractor, GeneratorRunner and Shiboken are made with Qt (only the core libs, no ui for them), but the bindings generated do not depend on Qt at all. Except, obviously, if the library being wrapped already does.&lt;/p&gt;
&lt;h3&gt;libepub&lt;/h3&gt;
&lt;p&gt;First let&amp;#8217;s have an overview of &lt;strong&gt;libepub&lt;/strong&gt;. It has three structures used as opaque pointers:&lt;/p&gt;
&lt;div class=&quot;codecolorer-container cpp geshi&quot;&gt;&lt;div class=&quot;cpp codecolorer&quot;&gt;&lt;span&gt;// Contains information about the ePub file.&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;struct&lt;/span&gt; epub&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;// Iterator object for the Table of Contents.&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;struct&lt;/span&gt; titerator&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;// Iterator object for the book contents.&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;struct&lt;/span&gt; eiterator&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;If you want to read the contents of an ePub file, call the function that will create an epub structure, iterate through its table of contents with a titerator, and then the contents themselves with an eiterator.&lt;/p&gt;
&lt;p&gt;Most functions follow that &amp;#8220;object oriented C&amp;#8221; format seen in other libraries, with the first argument being a pointer to the structure that represents the &lt;em&gt;&amp;#8220;this&amp;#8221;&lt;/em&gt; or &lt;em&gt;&amp;#8220;self&amp;#8221;&lt;/em&gt; in OO languages. Examples:&lt;/p&gt;
&lt;div class=&quot;codecolorer-container cpp geshi&quot;&gt;&lt;div class=&quot;cpp codecolorer&quot;&gt;&lt;span&gt;void&lt;/span&gt;&lt;br /&gt;
epub_dump&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;struct&lt;/span&gt; epub&lt;span&gt;*&lt;/span&gt; epub&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt;&lt;span&gt;**&lt;/span&gt;&lt;br /&gt;
epub_get_metadata&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;struct&lt;/span&gt; epub&lt;span&gt;*&lt;/span&gt; epub,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;enum&lt;/span&gt; epub_metadata type,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; size&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;int&lt;/span&gt;&lt;br /&gt;
epub_get_data&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;struct&lt;/span&gt; epub&lt;span&gt;*&lt;/span&gt; epub,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;const&lt;/span&gt; &lt;span&gt;char&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; name,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;char&lt;/span&gt;&lt;span&gt;**&lt;/span&gt; data&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3&gt;CMake&lt;/h3&gt;
&lt;p&gt;I&amp;#8217;ll use CMake as the build system for the bindings because I feel comfortable with it &amp;#8211; it is the same used in PySide and all the Shiboken generator tool chain. I&amp;#8217;ll not give too much attention to this part of the process, just check the &lt;strong&gt;CMakeLists.txt&lt;/strong&gt; files; more detailed explanation on the process of building a binding can be found in the &lt;a title=&quot;PySide Binding Generation Tutorial&quot; href=&quot;http://developer.qt.nokia.com/wiki/Category:LanguageBindings::PySide::Shiboken::PySide_Binding_Generation_Tutorial&quot;&gt;PySide Binding Generation Tutorial&lt;/a&gt;. For really really basic information check &lt;a title=&quot;PySide CMake Primer&quot; href=&quot;http://developer.qt.nokia.com/wiki/PySide_CMake_Primer&quot;&gt;PySide CMake Primer&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Handmade C++ Wrapper for a C library&lt;/h2&gt;
&lt;p&gt;To generate Python bindings for a C++ library one must write a XML description called type system, which will declare what must be exposed on Python land, and if any of this needs modification: global functions, classes, namespaces, enums. For example, if in C++ I have the class &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;Rectangle&lt;/span&gt;&lt;/code&gt;, I would declare it in the type system this way:&lt;/p&gt;
&lt;div class=&quot;codecolorer-container xml geshi&quot;&gt;&lt;div class=&quot;xml codecolorer&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;lt;value-type&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;'Rectangle'&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;All the methods belonging to &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;Rectangle&lt;/span&gt;&lt;/code&gt; would be exposed to Python automatically. The same is not true for the C functions that representing the methods for the epub struct. Unfortunately there&amp;#8217;s no way to tell the Shiboken generator that I want to have the epub structure and functions represented as a class with methods, so we have to make a thin C++ wrapper around the C structures. That would be a lot of work for a huge C library, but even with a tiny one I feel uncomfortable having to resort for this kind of hackery. The type system should be expressive enough to bind C structs and functions as if they were proper objects with methods. I&amp;#8217;ll mark this for future community/out-of-work improvements on Shiboken.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s see a snippet from &lt;a title=&quot;epub_cpp_wrappers.h @ 757d8dc&quot; href=&quot;https://github.com/setanta/python-epub/blob/757d8dcd34943dd71495959a81fb15ce07896898/epub_cpp_wrappers.h&quot;&gt;epub_cpp_wrapper.h&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&quot;codecolorer-container cpp geshi&quot;&gt;&lt;div class=&quot;cpp codecolorer&quot;&gt;&lt;span&gt;class&lt;/span&gt; EPub &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;public&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ~EPub&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt; epub_close&lt;span&gt;&amp;#40;&lt;/span&gt;m_epub&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;static&lt;/span&gt; &lt;span&gt;inline&lt;/span&gt; EPub&lt;span&gt;*&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; open&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;const&lt;/span&gt; &lt;span&gt;char&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; filename, &lt;span&gt;int&lt;/span&gt; debug &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;struct&lt;/span&gt; epub&lt;span&gt;*&lt;/span&gt; book &lt;span&gt;=&lt;/span&gt; epub_open&lt;span&gt;&amp;#40;&lt;/span&gt;filename, debug&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;if&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;book&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; EPub&lt;span&gt;&amp;#40;&lt;/span&gt;book&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;inline&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; dump&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt; epub_dump&lt;span&gt;&amp;#40;&lt;/span&gt;m_epub&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;inline&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; get_data&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;const&lt;/span&gt; &lt;span&gt;char&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; name, &lt;span&gt;char&lt;/span&gt;&lt;span&gt;**&lt;/span&gt; data&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; epub_get_data&lt;span&gt;&amp;#40;&lt;/span&gt;m_epub, name, data&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;private&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;explicit&lt;/span&gt; EPub&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;struct&lt;/span&gt; epub&lt;span&gt;*&lt;/span&gt; ptr&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;:&lt;/span&gt; m_epub&lt;span&gt;&amp;#40;&lt;/span&gt;ptr&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; EPub&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;const&lt;/span&gt; EPub&lt;span&gt;&amp;amp;&lt;/span&gt;amp&lt;span&gt;;&lt;/span&gt; other&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; EPub&lt;span&gt;&amp;amp;&lt;/span&gt;amp&lt;span&gt;;&lt;/span&gt; operator&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;const&lt;/span&gt; EPub&lt;span&gt;&amp;amp;&lt;/span&gt;amp&lt;span&gt;;&lt;/span&gt; other&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;struct&lt;/span&gt; epub&lt;span&gt;*&lt;/span&gt; m_epub&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Notice that all methods were marked as &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;&lt;span&gt;inline&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; to make this wrapper as thinner as possible. (GCC, I&amp;#8217;m looking at you!)&lt;/p&gt;
&lt;h3&gt;Epub::open&lt;/h3&gt;
&lt;p&gt;The &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;epub_open&lt;/span&gt;&lt;/code&gt; function becomes the static method &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;EPub&lt;span&gt;::&lt;/span&gt;&lt;span&gt;open&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; that will return a new &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;EPub&lt;/span&gt;&lt;/code&gt; object for the ePub file given by &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;filename&lt;/span&gt;&lt;/code&gt; parameter, or a null pointer if the file is invalid or doesn&amp;#8217;t exist.&lt;br /&gt;
The constructor for this class was made private so the only way to create EPub objects is via &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;EPub&lt;span&gt;::&lt;/span&gt;&lt;span&gt;open&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;, that&amp;#8217;ll never create an invalid &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;EPub&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;~Epub&lt;/h3&gt;
&lt;p&gt;In C the responsible for freeing the epub structure is &lt;strong&gt;epub_close&lt;/strong&gt;, but I&amp;#8217;ll not make it &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;EPub&lt;span&gt;::&lt;/span&gt;&lt;span&gt;close&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; because the C++ equivalent for it is the class&amp;#8217; destructor.&lt;/p&gt;
&lt;p&gt;A generated Python binding for what we have until now would look roughly like this:&lt;/p&gt;
&lt;div class=&quot;codecolorer-container python geshi&quot;&gt;&lt;div class=&quot;python codecolorer&quot;&gt;&lt;span&gt;import&lt;/span&gt; epub&lt;br /&gt;
book = epub.&lt;span&gt;EPub&lt;/span&gt;.&lt;span&gt;open&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;'sample.epub'&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
title = book.&lt;span&gt;get_metadata&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;epub.&lt;span&gt;EPUB_TITLE&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Of course I didn&amp;#8217;t explained how this would be generated, that the module would be called &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;epub&lt;/span&gt;&lt;/code&gt;, what is &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;epub.&lt;span&gt;EPUB_TITLE&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;, and how Python would know what to do with &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt;&lt;span&gt;**&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;, but bear with me.&lt;/p&gt;
&lt;h3&gt;Moving enums around&lt;/h3&gt;
&lt;p&gt;&lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;EPUB_TITLE&lt;/span&gt;&lt;/code&gt; is a value from the &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;epub_metadata&lt;/span&gt;&lt;/code&gt; enum, if exposed to Python as they are, they&amp;#8217;ll look like this:&lt;/p&gt;
&lt;div class=&quot;codecolorer-container python geshi&quot;&gt;&lt;div class=&quot;python codecolorer&quot;&gt;&lt;span&gt;import&lt;/span&gt; epub&lt;br /&gt;
epub.&lt;span&gt;epub_metadata&lt;/span&gt;&lt;br /&gt;
epub.&lt;span&gt;EPUB_TITLE&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Which is pretty ugly and lame. Since &lt;strong&gt;epub_metadata&lt;/strong&gt; is an enum related to the epub object (as the &lt;strong&gt;epub_&lt;/strong&gt; prefix tells us), it would be natural that it was moved inside the EPub class. In my fantasy world, the type system tag that describes a C++ enum to Python would have the option to move it inside another object, and also to be renamed. Something along these lines:&lt;/p&gt;
&lt;div class=&quot;codecolorer-container xml geshi&quot;&gt;&lt;div class=&quot;xml codecolorer&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;lt;enum-type&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;'epub_metadata'&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;rename&lt;/span&gt;=&lt;span&gt;'metatada'&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;move-into&lt;/span&gt;=&lt;span&gt;'EPub'&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;remove-enum-value-prefix&lt;/span&gt;=&lt;span&gt;'EPUB_'&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;And here I have another thing for a Shiboken TODO list. While this feature is not implemented, I&amp;#8217;ll have to do it manually.&lt;/p&gt;
&lt;div class=&quot;codecolorer-container cpp geshi&quot;&gt;&lt;div class=&quot;cpp codecolorer&quot;&gt;&lt;span&gt;class&lt;/span&gt; EPub &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;public&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;enum&lt;/span&gt; metadata &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ID &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EPUB_ID&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; TITLE &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EPUB_TITLE&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CREATOR &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EPUB_CREATOR&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CONTRIB &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EPUB_CONTRIB&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SUBJECT &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EPUB_SUBJECT&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; PUBLISHER &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EPUB_PUBLISHER&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DESCRIPTION &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EPUB_DESCRIPTION&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DATE &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EPUB_DATE&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; TYPE &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EPUB_TYPE&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; FORMAT &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EPUB_FORMAT&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SOURCE &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EPUB_SOURCE&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; LANG &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EPUB_LANG&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; RELATION &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EPUB_RELATION&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; COVERAGE &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EPUB_COVERAGE&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; RIGHTS &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EPUB_RIGHTS&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; META &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;EPUB_META&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;inline&lt;/span&gt; &lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt;&lt;span&gt;**&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; get_metadata&lt;span&gt;&amp;#40;&lt;/span&gt;metadata type, &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; size&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; epub_get_metadata&lt;span&gt;&amp;#40;&lt;/span&gt;m_epub,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;epub_metadata&lt;span&gt;&amp;#40;&lt;/span&gt;type&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;size&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;epub_metadata&lt;/span&gt;&lt;/code&gt; enum values were cast to &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;&lt;span&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; to prevent the &lt;strong&gt;ApiExtractor&lt;/strong&gt; to emitting a bunch of warnings saying that it cannot tell who these guys are.&lt;/p&gt;
&lt;p&gt;Anyways, it&amp;#8217;s so awful&amp;#8230; to have a fancy generator, and having to write all this&amp;#8230; noooo!&lt;/p&gt;
&lt;h3&gt;TIterator and EIterator&lt;/h3&gt;
&lt;p&gt;The C structures &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;titerator&lt;/span&gt;&lt;/code&gt; and &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;eiterator&lt;/span&gt;&lt;/code&gt; will be wrapped by the C++ classes &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;TIterator&lt;/span&gt;&lt;/code&gt; and &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;EIterator&lt;/span&gt;&lt;/code&gt;, respectively, and like the &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;EPub&lt;/span&gt;&lt;/code&gt; class their constructors are private.&lt;/p&gt;
&lt;div class=&quot;codecolorer-container cpp geshi&quot;&gt;&lt;div class=&quot;cpp codecolorer&quot;&gt;&lt;span&gt;class&lt;/span&gt; TIterator &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;public&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;enum&lt;/span&gt; type &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; NAVMAP &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;TITERATOR_NAVMAP&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; GUIDE &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;TITERATOR_GUIDE&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; PAGES &lt;span&gt;=&lt;/span&gt; &lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;TITERATOR_PAGES&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ~TIterator&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt; epub_free_titerator&lt;span&gt;&amp;#40;&lt;/span&gt;m_iter&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;inline&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; isValid&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; epub_tit_curr_valid&lt;span&gt;&amp;#40;&lt;/span&gt;m_iter&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&lt;span&gt;private&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;friend&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; EPub&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;explicit&lt;/span&gt; TIterator&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;struct&lt;/span&gt; titerator&lt;span&gt;*&lt;/span&gt; iter&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;:&lt;/span&gt; m_iter&lt;span&gt;&amp;#40;&lt;/span&gt;iter&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;struct&lt;/span&gt; titerator&lt;span&gt;*&lt;/span&gt; m_iter&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;New instances of &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;TIterator&lt;/span&gt;&lt;/code&gt; and &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;EIterator&lt;/span&gt;&lt;/code&gt; are created by &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;EPub&lt;/span&gt;&lt;/code&gt; methods, because of that it must be a &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;&lt;span&gt;friend&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; of the iterator classes.&lt;/p&gt;
&lt;div class=&quot;codecolorer-container cpp geshi&quot;&gt;&lt;div class=&quot;cpp codecolorer&quot;&gt;&lt;span&gt;class&lt;/span&gt; EPub &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;public&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;inline&lt;/span&gt; EIterator&lt;span&gt;*&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; get_iterator&lt;span&gt;&amp;#40;&lt;/span&gt;EIterator&lt;span&gt;::&lt;/span&gt;&lt;span&gt;type&lt;/span&gt; type, &lt;span&gt;int&lt;/span&gt; opt &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;struct&lt;/span&gt; eiterator&lt;span&gt;*&lt;/span&gt; it &lt;span&gt;=&lt;/span&gt; epub_get_iterator&lt;span&gt;&amp;#40;&lt;/span&gt;m_epub, eiterator_type&lt;span&gt;&amp;#40;&lt;/span&gt;type&lt;span&gt;&amp;#41;&lt;/span&gt;, opt&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;if&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;it&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; EIterator&lt;span&gt;&amp;#40;&lt;/span&gt;it&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;inline&lt;/span&gt; TIterator&lt;span&gt;*&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; get_titerator&lt;span&gt;&amp;#40;&lt;/span&gt;TIterator&lt;span&gt;::&lt;/span&gt;&lt;span&gt;type&lt;/span&gt; type, &lt;span&gt;int&lt;/span&gt; opt &lt;span&gt;=&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;struct&lt;/span&gt; titerator&lt;span&gt;*&lt;/span&gt; it &lt;span&gt;=&lt;/span&gt; epub_get_titerator&lt;span&gt;&amp;#40;&lt;/span&gt;m_epub, titerator_type&lt;span&gt;&amp;#40;&lt;/span&gt;type&lt;span&gt;&amp;#41;&lt;/span&gt;, opt&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;if&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;it&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;new&lt;/span&gt; TIterator&lt;span&gt;&amp;#40;&lt;/span&gt;it&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;python-epub&lt;/h2&gt;
&lt;p&gt;Now it&amp;#8217;s time to say to the generator which goes in and which must change in the bindings.&lt;/p&gt;
&lt;h3&gt;The global header&lt;/h3&gt;
&lt;p&gt;The global header is a file that includes all other headers of the library that will be analyzed. In the global header the binding developer may also add some tweaks, like a &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;&lt;span&gt;#define&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; that will trigger some condition in the target library headers, that will affect the generated binding.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/setanta/python-epub/blob/master/epub_global.h&quot;&gt;epub_global.h&lt;/a&gt; that I use here is very simple:&lt;/p&gt;
&lt;div class=&quot;codecolorer-container cpp geshi&quot;&gt;&lt;div class=&quot;cpp codecolorer&quot;&gt;&lt;span&gt;#ifndef EPUB_GLOBAL_H&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;#define EPUB_GLOBAL_H&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;#include &amp;amp;lt;epub.h&amp;amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;#include &amp;amp;lt;epub_shared.h&amp;amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;#include &amp;amp;lt;epub_version.h&amp;amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;#include &amp;quot;epub_cpp_wrappers.h&amp;quot;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;// ApiExtractor complains if it finds only pre-definitions.&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;struct&lt;/span&gt; titerator &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;struct&lt;/span&gt; eiterator &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;#endif&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;As the commentary tells us, ApiExtractor doesn&amp;#8217;t like when it finds forward declarations without definitions. I choose to add these two bogus definitions for &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;&lt;span&gt;struct&lt;/span&gt; titerator&lt;/span&gt;&lt;/code&gt; and &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;&lt;span&gt;struct&lt;/span&gt; eiterator&lt;/span&gt;&lt;/code&gt;. (For some reason the generator said nothing about &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;&lt;span&gt;struct&lt;/span&gt; epub&lt;/span&gt;&lt;/code&gt;.) Other option would be not to add those bogus definitions, but add a line to the type system file telling the generator to ignore warnings relative to those structures.&lt;/p&gt;
&lt;h3&gt;The Type System description&lt;/h3&gt;
&lt;p&gt;Here follows a snippet from &lt;a title=&quot;typesystem_epub.xml @ 78de928&quot; href=&quot;https://github.com/setanta/python-epub/blob/78de92867f668d92a7610515eaeebe34487ebf03/typesystem_epub.xml&quot;&gt;typesystem_epub.xml&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;codecolorer-container xml geshi&quot;&gt;&lt;div class=&quot;xml codecolorer&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;lt;?xml&lt;/span&gt; &lt;span&gt;version&lt;/span&gt;=&lt;span&gt;'1.0'&lt;/span&gt;&lt;span&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;typesystem&lt;/span&gt; &lt;span&gt;package&lt;/span&gt;=&lt;span&gt;'epub'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;rejection&lt;/span&gt; &lt;span&gt;enum-name&lt;/span&gt;=&lt;span&gt;'epub_metadata'&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;object-type&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;'EPub'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;enum-type&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;'metadata'&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/object-type&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;/typesystem&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;epub_metadata&lt;/span&gt;&lt;/code&gt; enum is not exported to Python (at least not as it is) and to avoid the generator emitting his warnings, it must be explicitly rejected; its C++ substitute is added afterwards inside the EPub object type. The same happens to the other enums.&lt;/p&gt;
&lt;p&gt;In the type system notation &lt;code class=&quot;codecolorer xml default&quot;&gt;&lt;span class=&quot;xml&quot;&gt;object-type&lt;/span&gt;&lt;/code&gt; refers to objects that are passed around solely as pointers (like &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;EPub&lt;/span&gt;&lt;/code&gt;, whose copy constructor and operator are private). If, otherwise, the object can be passed as value, it should be declared as an &lt;code class=&quot;codecolorer xml default&quot;&gt;&lt;span class=&quot;xml&quot;&gt;value-type&lt;/span&gt;&lt;/code&gt;, as our &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;Rectangle&lt;/span&gt;&lt;/code&gt; example mentioned before.&lt;/p&gt;
&lt;h3&gt;Python&amp;#8217;s Iterator Protocol&lt;/h3&gt;
&lt;p&gt;In Python, if an object supports the &lt;a href=&quot;http://docs.python.org/library/stdtypes.html#iterator-types&quot;&gt;Iterator Protocol&lt;/a&gt; I can use it on &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;&lt;span&gt;for&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; statements, like this:&lt;/p&gt;
&lt;div class=&quot;codecolorer-container python geshi&quot;&gt;&lt;div class=&quot;python codecolorer&quot;&gt;&lt;span&gt;from&lt;/span&gt; epub &lt;span&gt;import&lt;/span&gt; EPub, TIterator&lt;br /&gt;
book = EPub.&lt;span&gt;open&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;.&lt;span&gt;epub_file&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;for&lt;/span&gt; toc_it &lt;span&gt;in&lt;/span&gt; book.&lt;span&gt;get_titerator&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;TIterator.&lt;span&gt;NAVMAP&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;if&lt;/span&gt; &lt;span&gt;not&lt;/span&gt; toc_it.&lt;span&gt;isValid&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;continue&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;print&lt;/span&gt; &lt;span&gt;'link : '&lt;/span&gt; + toc_it.&lt;span&gt;link&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;print&lt;/span&gt; &lt;span&gt;'label: '&lt;/span&gt; + toc_it.&lt;span&gt;label&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Following the Python Iterator Protocol consists solely of an object implementing the methods &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;&lt;span&gt;__iter__&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; and &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;__next__&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; the correct name for the method is &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;next&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; and not &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;__next__&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;. That's a minor bug in the generator that I just found.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;The XML to add iterator protocol features into &lt;code class=&quot;codecolorer text default&quot;&gt;&lt;span class=&quot;text&quot;&gt;TIterator&lt;/span&gt;&lt;/code&gt; class will be lengthy, so I'll split it into two parts, the first dealing with &lt;a href=&quot;http://www.pyside.org/docs/apiextractor/typesystem_templates.html&quot;&gt;type system code templates&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Type System templates&lt;/h4&gt;
&lt;div class=&quot;codecolorer-container xml geshi&quot;&gt;&lt;div class=&quot;xml codecolorer&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;lt;?xml&lt;/span&gt; &lt;span&gt;version&lt;/span&gt;=&lt;span&gt;'1.0'&lt;/span&gt;&lt;span&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;typesystem&lt;/span&gt; &lt;span&gt;package&lt;/span&gt;=&lt;span&gt;'epub'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;template&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;'iterator.__iter__'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Py_INCREF(%PYSELF);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; %PYARG_0 = %PYSELF;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/template&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;template&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;'iterator.__next__'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (%CPPSELF.next()) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;insert-template&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;'iterator.__iter__'&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; PyErr_SetNone(PyExc_StopIteration);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/template&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ...&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The iterator methods for &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;TIterator&lt;/span&gt;&lt;/code&gt; and &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;EIterator&lt;/span&gt;&lt;/code&gt; have exactly the same implementation, so it&amp;#8217;ll be smart to use type system &lt;a href=&quot;http://www.pyside.org/docs/apiextractor/typesystem_templates.html&quot;&gt;templates&lt;/a&gt; and have the code, and its eventual bugs, in a single place.&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;iterator.&lt;span&gt;__iter__&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; method just need to return the object itself with its reference counter incremented by one. &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;iterator.__next__&lt;/span&gt;&lt;/code&gt; calls the underlying C++ object&amp;#8217;s &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;next&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; (it also returns itself, and increments the refcounter), and raises a Python &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;&lt;span&gt;StopIteration&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; exception when it reaches the end.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;http://www.pyside.org/docs/shiboken/typesystemvariables.html&quot;&gt;type system variables&lt;/a&gt; &lt;code class=&quot;codecolorer xml default&quot;&gt;&lt;span class=&quot;xml&quot;&gt;%PYSELF&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;codecolorer xml default&quot;&gt;&lt;span class=&quot;xml&quot;&gt;%PYARG_0&lt;/span&gt;&lt;/code&gt; and &lt;code class=&quot;codecolorer xml default&quot;&gt;&lt;span class=&quot;xml&quot;&gt;%CPPSELF&lt;/span&gt;&lt;/code&gt; are replaced by values dependent on the context where they are used (e.g. &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;TIterator&lt;/span&gt;&lt;/code&gt; or &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;EIteration&lt;/span&gt;&lt;/code&gt; classes). Check the &lt;a href=&quot;http://www.pyside.org/docs/shiboken/typesystemvariables.html&quot;&gt;documentation&lt;/a&gt; for their meaning·&lt;/p&gt;
&lt;h4&gt;Adding the iterator methods&lt;/h4&gt;
&lt;div class=&quot;codecolorer-container xml geshi&quot;&gt;&lt;div class=&quot;xml codecolorer&quot;&gt;&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;object-type&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;'TIterator'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;modify-function&lt;/span&gt; &lt;span&gt;signature&lt;/span&gt;=&lt;span&gt;'next()'&lt;/span&gt; &lt;span&gt;remove&lt;/span&gt;=&lt;span&gt;'all'&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;add-function&lt;/span&gt; &lt;span&gt;signature&lt;/span&gt;=&lt;span&gt;'__iter__'&lt;/span&gt; &lt;span&gt;return-type&lt;/span&gt;=&lt;span&gt;'PyObject*'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;inject-code&lt;/span&gt; &lt;span&gt;class&lt;/span&gt;=&lt;span&gt;'target'&lt;/span&gt; &lt;span&gt;position&lt;/span&gt;=&lt;span&gt;'beginning'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;insert-template&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;'iterator.__iter__'&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/inject-code&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/add-function&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;add-function&lt;/span&gt; &lt;span&gt;signature&lt;/span&gt;=&lt;span&gt;'__next__'&lt;/span&gt; &lt;span&gt;return-type&lt;/span&gt;=&lt;span&gt;'PyObject*'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;inject-code&lt;/span&gt; &lt;span&gt;class&lt;/span&gt;=&lt;span&gt;'target'&lt;/span&gt; &lt;span&gt;position&lt;/span&gt;=&lt;span&gt;'beginning'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;insert-template&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;'iterator.__next__'&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/inject-code&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/add-function&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/object-type&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;...&lt;br /&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;/typesystem&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;First the original C++ &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;next&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; is removed, then the ones for the Python iterator protocol are added, using &lt;code class=&quot;codecolorer xml default&quot;&gt;&lt;span class=&quot;xml&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;lt;insert-template&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; tag to insert the previously defined custom code. Exactly the same lines will be added to &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;EIterator&lt;/span&gt;&lt;/code&gt; class.&lt;/p&gt;
&lt;h4&gt;Just one more bit of hackery&lt;/h4&gt;
&lt;p&gt;Only one obstacle remains on the way of having proper Python iterators. When Python&amp;#8217;s &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;&lt;span&gt;for&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; statement is used to iterate through an iterable object, in the first round it calls the object&amp;#8217;s &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;&lt;span&gt;__iter__&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; method, and immediately after it calls &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;next&lt;/span&gt;&lt;/code&gt;, and keeps calling &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;next&lt;/span&gt;&lt;/code&gt; for each new iteration.&lt;/p&gt;
&lt;p&gt;The problem here is that our underlying C iterator returns an object loaded with proper content when &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;&lt;span&gt;__iter__&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; is called, then the way that Python&amp;#8217;s &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;&lt;span&gt;for&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; iteration works will cause the first item to be bypassed. A workaround for this case is to use a flag on the C++ wrapper that checks if the iterator has just been created, so that it will not move forward when &lt;code class=&quot;codecolorer python default&quot;&gt;&lt;span class=&quot;python&quot;&gt;next&lt;/span&gt;&lt;/code&gt; is called on it for the first time.&lt;/p&gt;
&lt;div class=&quot;codecolorer-container cpp geshi&quot;&gt;&lt;div class=&quot;cpp codecolorer&quot;&gt;&lt;span&gt;class&lt;/span&gt; TIterator &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;public&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;inline&lt;/span&gt; &lt;span&gt;bool&lt;/span&gt; next&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;if&lt;/span&gt; &lt;span&gt;&amp;#40;&lt;/span&gt;m_isFirst&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; m_isFirst &lt;span&gt;=&lt;/span&gt; &lt;span&gt;false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; &lt;span&gt;true&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;return&lt;/span&gt; epub_tit_next&lt;span&gt;&amp;#40;&lt;/span&gt;m_iter&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;private&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;friend&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; EPub&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;explicit&lt;/span&gt; TIterator&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;struct&lt;/span&gt; titerator&lt;span&gt;*&lt;/span&gt; iter&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;:&lt;/span&gt; m_iter&lt;span&gt;&amp;#40;&lt;/span&gt;iter&lt;span&gt;&amp;#41;&lt;/span&gt;, m_isFirst&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;struct&lt;/span&gt; titerator&lt;span&gt;*&lt;/span&gt; m_iter&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;bool&lt;/span&gt; m_isFirst&lt;span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;I had this freedom because &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;TIterator&lt;/span&gt;&lt;/code&gt; is a class completely under my (me, the binding developer) control. If &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;&lt;span&gt;struct&lt;/span&gt; titerator&lt;/span&gt;&lt;/code&gt; were a C++ class from the beginning that approach would not be the best. Perhaps &lt;strong&gt;libshiboken&lt;/strong&gt; (the supporting library used by all Shiboken generated bindings) should provide a base iterator class to handle this particular difference between Python and C++ iterators. Or perhaps the generated class, when identified as an iterable by the presence of iterator protocol methods added by the binding developer, should have such provisions. The latter options seems best, and that&amp;#8217;s one more item for my list of future improvements.&lt;/p&gt;
&lt;h3&gt;Custom Conversions&lt;/h3&gt;
&lt;h4&gt;Returning unicode values&lt;/h4&gt;
&lt;p&gt;The &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;EIterator&lt;span&gt;::&lt;/span&gt;&lt;span&gt;curr&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; methods &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;EIterator&lt;span&gt;::&lt;/span&gt;&lt;span&gt;curr_url&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; returns values of &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;&lt;span&gt;char&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; type, which doesn&amp;#8217;t have a converter (&lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;&lt;span&gt;const&lt;/span&gt; &lt;span&gt;char&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; does have), so I&amp;#8217;ve written a custom piece of code to convert it to Python&amp;#8217;s unicode.&lt;/p&gt;
&lt;div class=&quot;codecolorer-container xml geshi&quot;&gt;&lt;div class=&quot;xml codecolorer&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;lt;?xml&lt;/span&gt; &lt;span&gt;version&lt;/span&gt;=&lt;span&gt;'1.0'&lt;/span&gt;&lt;span&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;typesystem&lt;/span&gt; &lt;span&gt;package&lt;/span&gt;=&lt;span&gt;'epub'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;template&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;'return_char_pointer'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char* %0 = %CPPSELF.%FUNCTION_NAME();&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (%0) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; %PYARG_0 = PyUnicode_DecodeUTF8(%0, strlen(%0), &amp;quot;strict&amp;quot;);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Py_INCREF(Py_None);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; %PYARG_0 = Py_None;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/template&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;object-type&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;'EIterator'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;modify-function&lt;/span&gt; &lt;span&gt;signature&lt;/span&gt;=&lt;span&gt;'curr()'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;inject-code&lt;/span&gt; &lt;span&gt;class&lt;/span&gt;=&lt;span&gt;'target'&lt;/span&gt; &lt;span&gt;position&lt;/span&gt;=&lt;span&gt;'beginning'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;insert-template&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;'return_char_pointer'&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/inject-code&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/modify-function&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;modify-function&lt;/span&gt; &lt;span&gt;signature&lt;/span&gt;=&lt;span&gt;'curr_url()'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;inject-code&lt;/span&gt; &lt;span&gt;class&lt;/span&gt;=&lt;span&gt;'target'&lt;/span&gt; &lt;span&gt;position&lt;/span&gt;=&lt;span&gt;'beginning'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;insert-template&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;'return_char_pointer'&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/inject-code&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/modify-function&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/object-type&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;/typesystem&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h4&gt;Modifying a method&amp;#8217;s signature&lt;/h4&gt;
&lt;p&gt;Some C++ method signatures couldn&amp;#8217;t automatically be converted to meaningful Python code, so I added more custom code to handle the situation on a case by case basis. For example, the method&lt;/p&gt;
&lt;div class=&quot;codecolorer-container cpp geshi&quot;&gt;&lt;div class=&quot;cpp codecolorer&quot;&gt;&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt;&lt;span&gt;**&lt;/span&gt;&lt;br /&gt;
EPub&lt;span&gt;::&lt;/span&gt;&lt;span&gt;get_metadata&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;metadata type, &lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; size&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;*&lt;/span&gt; size&lt;/span&gt;&lt;/code&gt; argument receives a pointer to an int, which will contain the size of the list of unicode strings returned as &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;&lt;span&gt;unsigned&lt;/span&gt; &lt;span&gt;char&lt;/span&gt;&lt;span&gt;**&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;. In Python it would merely return a list of unicode objects, and the call to &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;get_metadata&lt;/span&gt;&lt;/code&gt; doesn&amp;#8217;t need the &lt;code class=&quot;codecolorer cpp default&quot;&gt;&lt;span class=&quot;cpp&quot;&gt;size&lt;/span&gt;&lt;/code&gt; argument.&lt;/p&gt;
&lt;p&gt;I believe the type system description is enough to see how the modification system works.&lt;/p&gt;
&lt;div class=&quot;codecolorer-container xml geshi&quot;&gt;&lt;div class=&quot;xml codecolorer&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;lt;object-type&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;'EPub'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;enum-type&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;'metadata'&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;modify-function&lt;/span&gt; &lt;span&gt;signature&lt;/span&gt;=&lt;span&gt;'get_metadata(EPub::metadata,int*)'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;modify-argument&lt;/span&gt; &lt;span&gt;index&lt;/span&gt;=&lt;span&gt;'2'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;remove-argument&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/modify-argument&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;modify-argument&lt;/span&gt; &lt;span&gt;index&lt;/span&gt;=&lt;span&gt;'return'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;replace-type&lt;/span&gt; &lt;span&gt;modified-type&lt;/span&gt;=&lt;span&gt;'PyTuple'&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/modify-argument&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;inject-code&lt;/span&gt; &lt;span&gt;class&lt;/span&gt;=&lt;span&gt;'target'&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; unsigned char** data = 0;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; int size;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; data = %CPPSELF.%FUNCTION_NAME(%1, &lt;span&gt;&amp;amp;size);&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; if (data) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; %PYARG_0 = PyTuple_New(size);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; PyObject* uni = 0;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for (int i = 0; i &lt;span&gt;&amp;lt; size; ++i&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;uni = PyUnicode_DecodeUTF8&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;const char*&lt;span&gt;&amp;#41;&lt;/span&gt;data&lt;span&gt;&amp;#91;&lt;/span&gt;i&lt;span&gt;&amp;#93;&lt;/span&gt;,&lt;/span&gt;&lt;br /&gt;
&lt;span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; strlen&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;const char*&lt;span&gt;&amp;#41;&lt;/span&gt;data&lt;span&gt;&amp;#91;&lt;/span&gt;i&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;,&lt;/span&gt;&lt;br /&gt;
&lt;span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span&gt;&amp;quot;strict&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PyTuple_SetItem&lt;span&gt;&amp;#40;&lt;/span&gt;%PYARG_0, i, uni&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for &lt;span&gt;&amp;#40;&lt;/span&gt;int i = 0; i &amp;lt; size; ++i&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;free&lt;span&gt;&amp;#40;&lt;/span&gt;data&lt;span&gt;&amp;#91;&lt;/span&gt;i&lt;span&gt;&amp;#93;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;free&lt;span&gt;&amp;#40;&lt;/span&gt;data&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;#125;&lt;/span&gt; else &lt;span&gt;&amp;#123;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Py_INCREF&lt;span&gt;&amp;#40;&lt;/span&gt;Py_None&lt;span&gt;&amp;#41;&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;%PYARG_0 = Py_None;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span&gt; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;lt;/inject-code&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;span&gt;&lt;span&gt;&amp;lt;/modify-function&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; ...&lt;br /&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;/object-type&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Downloading, building, etc.&lt;/h2&gt;
&lt;p&gt;Enough with the explanations, now let&amp;#8217;s try the code. Remember that you&amp;#8217;ll need also development files that I mentioned long time ago.&lt;/p&gt;
&lt;p&gt;Clone the latest version from the git repository:&lt;/p&gt;
&lt;div class=&quot;codecolorer-container bash geshi&quot;&gt;&lt;div class=&quot;bash codecolorer&quot;&gt;&lt;span&gt;git&lt;/span&gt; clone &lt;span&gt;git&lt;/span&gt;:&lt;span&gt;//&lt;/span&gt;github.com&lt;span&gt;/&lt;/span&gt;setanta&lt;span&gt;/&lt;/span&gt;python-epub.git&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;or download the tarball: &lt;a href=&quot;http://setantas.net/files/python-epub.tar.bz2&quot;&gt;python-epub.tar.bz2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Inside the source code directory create a &lt;code class=&quot;codecolorer bash default&quot;&gt;&lt;span class=&quot;bash&quot;&gt;build&lt;/span&gt;&lt;/code&gt; directory and &amp;#8230;&lt;/p&gt;
&lt;div class=&quot;codecolorer-container bash geshi&quot;&gt;&lt;div class=&quot;bash codecolorer&quot;&gt;&lt;span&gt;cd&lt;/span&gt; python-epub&lt;br /&gt;
&lt;span&gt;mkdir&lt;/span&gt; build&lt;br /&gt;
&lt;span&gt;cd&lt;/span&gt; build&lt;br /&gt;
cmake ..&lt;br /&gt;
&lt;span&gt;make&lt;/span&gt;&lt;br /&gt;
ctest&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The last command deserves some talking about.&lt;/p&gt;
&lt;h3&gt;Testing, Testing, Testing&lt;/h3&gt;
&lt;p&gt;When working with binding development there&amp;#8217;s a myriad of things that can go wrong, and a number of them go wrong in complete silence. With this in mind, I tell you that having unit tests makes the binding developer life bearable.&lt;/p&gt;
&lt;p&gt;To see detailed results from the tests, run ctest with &lt;code class=&quot;codecolorer bash default&quot;&gt;&lt;span class=&quot;bash&quot;&gt;&lt;span&gt;-V&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; (verbose) option.&lt;/p&gt;
&lt;p&gt;Check the &lt;a href=&quot;https://github.com/setanta/python-epub/tree/master/tests&quot;&gt;tests directory&lt;/a&gt; for examples on how to use the python-epub bindings.&lt;/p&gt;
&lt;h2&gt;UI Example (or else it would be boring)&lt;/h2&gt;
&lt;p&gt;But the UI itself is very boring, although it was made with the amazing &lt;a href=&quot;http://www.pyside.org&quot;&gt;PySide&lt;/a&gt; I did it as simple as possible, it doesn&amp;#8217;t even show images. On the other hand, with very little code I can now see what&amp;#8217;s inside an ePub ebook.&lt;/p&gt;
&lt;p&gt;From &lt;code class=&quot;codecolorer bash default&quot;&gt;&lt;span class=&quot;bash&quot;&gt;python-epub&lt;span&gt;/&lt;/span&gt;build&lt;/span&gt;&lt;/code&gt; directory call the ePub viewer like this:&lt;/p&gt;
&lt;div class=&quot;codecolorer-container bash geshi&quot;&gt;&lt;div class=&quot;bash codecolorer&quot;&gt;python ..&lt;span&gt;/&lt;/span&gt;simple-ui&lt;span&gt;/&lt;/span&gt;bookviewer.py ..&lt;span&gt;/&lt;/span&gt;tests&lt;span&gt;/&lt;/span&gt;beyond-the-wall-of-sleep.epub&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;It always expects a parameter with the path to an ePub file, in this case &lt;a href=&quot;http://www.feedbooks.com/book/237/beyond-the-wall-of-sleep&quot;&gt;&amp;#8220;Beyond the Wall of Sleep&amp;#8221;&lt;/a&gt; by &lt;a href=&quot;http://www.feedbooks.com/author/12&quot;&gt;Lovecraft&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Screenshots:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.setantas.net/blog/wp-content/uploads/2011/03/epubviewer_screenshots.png&quot; alt=&quot;Simplest ePub viewer (made with PySide)&quot; width=&quot;580&quot; height=&quot;480&quot; class=&quot;size-full wp-image-516&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;map name=&quot;google_ad_map_512_74ab9b1e764918ae&quot;&gt;
&lt;area shape=&quot;rect&quot; href=&quot;http://imageads.googleadservices.com/pagead/imgclick/512?pos=0&quot; coords=&quot;1,2,367,28&quot; /&gt;
&lt;area shape=&quot;rect&quot; href=&quot;http://services.google.com/feedback/abg&quot; coords=&quot;384,10,453,23&quot; /&gt;&lt;/map&gt;
&lt;img usemap=&quot;http://www.setantas.net/blog/feed/#google_ad_map_512_74ab9b1e764918ae&quot; border=&quot;0&quot; src=&quot;http://imageads.googleadservices.com/pagead/ads?format=468x30_aff_img&amp;client=&amp;channel=&amp;output=png&amp;cuid=512&amp;url= http%3A%2F%2Fwww.setantas.net%2Fblog%2F2011%2F03%2F08%2Fpython-bindings-for-libepub-using-shiboken%2F&quot; /&gt;&lt;/p&gt;&lt;div&gt;&lt;a href=&quot;http://twitter.com/share?url=http://www.setantas.net/blog/2011/03/08/python-bindings-for-libepub-using-shiboken/&amp;via=&amp;text=Python bindings for libepub using Shiboken&amp;related=:&amp;lang=en&amp;count=horizontal&quot; class=&quot;twitter-share-button&quot;&gt;Tweet&lt;/a&gt;&lt;/div&gt;</content>
		<author>
			<name>Marcelo Lira</name>
			<uri>http://www.setantas.net/blog</uri>
		</author>
		<source>
			<title type="html">Head Like a Hole</title>
			<link rel="self" href="http://www.setantas.net/blog/feed/"/>
			<id>http://www.setantas.net/blog/feed/</id>
			<updated>2012-04-06T09:15:03+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Férias 2011! Destino: Europa</title>
		<link href="http://blog.ademar.org/2011/ferias-2011-destino-europa/"/>
		<id>http://blog.ademar.org/?p=1187</id>
		<updated>2011-03-05T13:25:14+00:00</updated>
		<content type="html">&lt;p&gt;Depois de quase 2 anos sem férias e sem nenhuma viagem de &amp;#8220;grande porte&amp;#8221;, finalmente é chegada a hora de um merecido descanso do trabalho e de ir pra algum lugar ainda desconhecido, desbravar novas fronteiras.&lt;/p&gt;
&lt;p&gt;O destino original que haviamos planejado ainda no ano passado era a Ásia, mais precisamente Índia e China com potencial de chegar até o Japão. Ir pra esses destinos por conta própria e com pouco tempo exige um consideravel esforço de planejamento e logística (vistos, idioma, grandes distâncias e altos custos em alguns lugares), então após alguns estudos, decidimos optar por um destino mais tranquilo e com melhor relação custo-benefício nesses aspectos: Europa.&lt;/p&gt;
&lt;p&gt;Serão 35 dias no total (valeu Carnaval!), chegando por Paris e voltando por Milão. Com excessão das passagens de ida e volta, o roteiro está quase todo em aberto, pois como estamos em baixa temporada (final do inverno por lá), os riscos de problemas com hospedagem e transporte são mínimos.&lt;/p&gt;
&lt;p&gt;O roteiro planejado, por enquanto, é esse:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Paris;&lt;/li&gt;
&lt;li&gt;Londres;&lt;/li&gt;
&lt;li&gt;Amsterdam e Rotterdam;&lt;/li&gt;
&lt;li&gt;Berlin;&lt;/li&gt;
&lt;li&gt;Moscow (ida e volta à Berlin);&lt;/li&gt;
&lt;li&gt;Cidades diversas nos países do Leste Europeu (Polônia, República Checa, Eslovênia, Hungria?);&lt;/li&gt;
&lt;li&gt;Viena;&lt;/li&gt;
&lt;li&gt;Munique;&lt;/li&gt;
&lt;li&gt;Zurique e região dos Alpes;&lt;/li&gt;
&lt;li&gt;De Veneza até Roma;&lt;/li&gt;
&lt;li&gt;Milão.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No mapa:&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;small&gt;Visualizar &lt;a href=&quot;http://maps.google.com.br/maps/ms?ie=UTF8&amp;hq=&amp;hnear=Krak%C3%B3w,+Poland&amp;gl=br&amp;hl=pt-BR&amp;msa=0&amp;msid=214397880831996858742.00049db6037d32d1e54b5&amp;ll=50.680797,19.335938&amp;spn=17.854688,42.099609&amp;z=4&amp;source=embed&quot;&gt;Viagem Europa 2011&lt;/a&gt; em um mapa maior&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;&lt;small&gt;(suficiente pra cumprir o &lt;a href=&quot;http://blog.ademar.org/2010/retrospectiva-2010-planos-pra-2011/&quot;&gt;objetivo de 2 novos países em 2011&lt;/a&gt;) ;-)&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;Provavelmente não haverá tempo pra todos os destinos e o plano é alugar um carro em alguns desses trajetos, o que nos dará a oportunidade de conhecer cidades e vilas menores. Também existe a possibilidade de embarcarmos em voos baratos como os de EUR 7 da &lt;a href=&quot;http://www.ryanair.com/&quot;&gt;Ryan Air&lt;/a&gt; pra chegar em cidades mais remotas, ou mesmo mudar completamente a parte final da viagem.&lt;/p&gt;
&lt;p&gt;Como sempre, será uma viagem sem exageros nos custos, com apoio de &lt;a href=&quot;http://blog.ademar.org/tag/couchsurfing/&quot;&gt;couchsurfers&lt;/a&gt; ao longo do caminho e muitas fotos. Pequenos relatos e fotos mais descompromissadas devem aparecer nos perfis do twitter &lt;a href=&quot;http://twitter.com/adebr&quot;&gt;@adebr&lt;/a&gt; e &lt;a href=&quot;http://twitter.com/tudocasa&quot;&gt;@tudocasa&lt;/a&gt; (Viviane) e em meu facebook. &lt;/p&gt;
&lt;p&gt;Espero dessa vez pré-selecionar as fotos no caminho pra evitar o problema que tive com a viagem de 2009 à Patagônia, que não teve suas fotos publicadas até hoje (&lt;em&gt;shame on me!&lt;/em&gt;). :-P&lt;/p&gt;
&lt;p&gt;Em tempo, muito obrigado a todos os que nos ajudaram com dicas de roteiro e aos couchsurfers que nos ajudarão ainda mais durante o trajeto. :-)&lt;/p&gt;
&lt;p&gt;Posts possivelmente relacionados:&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.ademar.org/2005/ferias-em-curitiba/&quot; rel=&quot;bookmark&quot; title=&quot;&amp;#8220;Férias&amp;#8221; em Curitiba&quot;&gt;&amp;#8220;Férias&amp;#8221; em Curitiba&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.ademar.org/2005/ferias-de-verdade-dessa-vez/&quot; rel=&quot;bookmark&quot; title=&quot;Férias (de verdade dessa vez)&quot;&gt;Férias (de verdade dessa vez)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.ademar.org/2010/retrospectiva-2010-planos-pra-2011/&quot; rel=&quot;bookmark&quot; title=&quot;Retrospectiva 2010, planos pra 2011&quot;&gt;Retrospectiva 2010, planos pra 2011&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;&lt;hr /&gt;
&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blog.ademar.org/2011/ferias-2011-destino-europa/&quot;&gt;Link Permanente&lt;/a&gt; |
&lt;a href=&quot;http://blog.ademar.org/2011/ferias-2011-destino-europa/#comments&quot;&gt;2 commentários&lt;/a&gt;&lt;br /&gt;
Post tags: &lt;a href=&quot;http://blog.ademar.org/tag/europa/&quot; rel=&quot;tag&quot;&gt;europa&lt;/a&gt;, &lt;a href=&quot;http://blog.ademar.org/tag/viagem/&quot; rel=&quot;tag&quot;&gt;viagem&lt;/a&gt;&lt;br /&gt;
&lt;/small&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogademar/~4/53SnwDJZ-E0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Ademar de Souza Reis Jr.</name>
			<uri>http://blog.ademar.org</uri>
		</author>
		<source>
			<title type="html">blog.ademar.org</title>
			<subtitle type="html">Blog pessoal de Ademar Reis</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/blogademar"/>
			<id>http://feeds.feedburner.com/blogademar</id>
			<updated>2012-05-08T21:15:06+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">FOSDEM talk</title>
		<link href="http://codeposts.blogspot.com/2011/02/fosdem-talk.html"/>
		<id>tag:blogger.com,1999:blog-36235783.post-368400671338074215</id>
		<updated>2011-02-22T11:23:12+00:00</updated>
		<content type="html">&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I will upload the slides soon.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;[Update] &lt;/b&gt;Slides are up &lt;a href=&quot;http://www.slideshare.net/kchristi/qt-webkit-going-mobile-7016102&quot;&gt;here at slideshare.net&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/36235783-368400671338074215?l=codeposts.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Kenneth Rohde Christiansen</name>
			<email>noreply@blogger.com</email>
			<uri>http://codeposts.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Kenneth Christiansen's code posts</title>
			<link rel="self" href="http://codeposts.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-36235783</id>
			<updated>2012-05-16T16:15:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Mandriva 2010 : rodando sua aplicação como administrador(root)</title>
		<link href="http://franciscoalecrim.com/blog/2011/02/21/mandriva-2010-rodando-sua-aplicacao-como-administradorroot/"/>
		<id>http://franciscoalecrim.com/blog/?p=329</id>
		<updated>2011-02-21T18:16:37+00:00</updated>
		<content type="html">&lt;p&gt;Imagine que você desenvolveu uma aplicação que precisa de permissão de root. Agora você quer que o Mandriva chame sua aplicação como usuário administrador(root).&lt;/p&gt;
&lt;p&gt;0 &amp;#8211; Minha aplicação simples é um Hello world&lt;/p&gt;
&lt;pre&gt;echo -e '#include \nint main(){printf(&quot;hello mandriva world\\n&quot;);}' &amp;gt; hello.c
gcc hello.c -o hello&lt;/pre&gt;
&lt;p&gt;1 &amp;#8211; Chamar o console-helper ao invés de chamar sua aplicação:&lt;/p&gt;
&lt;pre&gt;su - root
cd /usr/bin
ln -s /usb/bin/console-helper hello&lt;/pre&gt;
&lt;p&gt;2 &amp;#8211; Criar arquivo PAM /etc/pam.d/hello&lt;/p&gt;
&lt;pre&gt;
#%PAM-1.0
auth            include         config-util
account         include         config-util
session         include         config-util&lt;/pre&gt;
&lt;p&gt;3 &amp;#8211; Criar arquivo com PATH em /etc/security/console.apps/hello&lt;/p&gt;
&lt;pre&gt;USER=root
PROGRAM=/home/alecrim/hello
SESSION=true
FALLBACK=true&lt;/pre&gt;</content>
		<author>
			<name>Francisco Keppler Silva Alecrim</name>
			<uri>http://franciscoalecrim.com/blog</uri>
		</author>
		<source>
			<title type="html">franciscoalecrim.com</title>
			<subtitle type="html">developer</subtitle>
			<link rel="self" href="http://franciscoalecrim.com/blog/feed/atom/"/>
			<id>http://franciscoalecrim.com/blog/feed/atom/</id>
			<updated>2012-03-08T12:15:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">N810 + HD 1.5 TB + SAMBA = media server</title>
		<link href="http://franciscoalecrim.com/blog/2010/10/05/n810-hd-1-5-tb-samba-media-server/"/>
		<id>http://franciscoalecrim.com/blog/?p=319</id>
		<updated>2011-02-05T13:27:07+00:00</updated>
		<content type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Aproveitando estes dias em que estou em casa de folga. Resolvi mexer um pouco com os equipamentos por aqui. O N810 andava meio solitário, depois que passei a utilizar mais o Nokia5800 para acessar a internet.&lt;/p&gt;
&lt;p&gt;Outro problema é o fato de não gostar de ficar ligando os cabos do meu HD externo no netbook para acessar músicas e filmes.&lt;/p&gt;
&lt;p&gt;Decidi compartilhar os arquivos meu HD externo via SMB usando meu N810. As principais passos seguem abaixo:&lt;/p&gt;
&lt;p&gt;1 &amp;#8211; N810 + HD&lt;/p&gt;
&lt;p&gt;Gostaria de lembrar que o N810 possui um limite de energia que pode suprir para o equipamento plugado. Estou usando um HD externo com alimentação de energia. Instalei o aplicativo &amp;#8220;usbmode&amp;#8221; ou ative o modo &amp;#8220;host&amp;#8221; executando o comando abaixo:&lt;br /&gt;
echo host &amp;gt; /sys/devices/platform/musb_hdrc/mode&lt;/p&gt;
&lt;p&gt;2 &amp;#8211; Instalar Samba&lt;/p&gt;
&lt;p&gt;sudo gainroot&lt;br /&gt;
apt-get install samba&lt;/p&gt;
&lt;p&gt;3 &amp;#8211; Configurar samba&lt;/p&gt;
&lt;p&gt;cat /etc/passwd | mksmbpasswd &amp;gt; /etc/samba/smbpasswd&lt;br /&gt;
chmod 600 /etc/samba/smbpasswd&lt;br /&gt;
smbpasswd user&lt;br /&gt;
vi /etc/samba/smb.conf &lt;a href=&quot;http://franciscoalecrim.com/down/tmp/smb.conf.txt&quot;&gt;# download smb.conf HERE&lt;/a&gt;&lt;br /&gt;
sudo /etc/init.d/samba restart&lt;/p&gt;
&lt;p&gt;Depois disto, use Windows Explorer para acessar seus arquivos. Você pode executar videos e músicas diretamente. &lt;img src=&quot;http://franciscoalecrim.com/blog/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://share.ovi.com/album/alecrim.20101005_sam&quot;&gt;&lt;img class=&quot;alignnone&quot; src=&quot;http://media.share.ovi.com/m1/s/2480/faf9382f85ed4bb780aedd6379e1050f.jpg&quot; alt=&quot;&quot; width=&quot;533&quot; height=&quot;242&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;!--
google_ad_client = &quot;pub-4021098893703656&quot;;
/* 468x60, created 2/5/11 */
google_ad_slot = &quot;8025899007&quot;;
google_ad_width = 468;
google_ad_height = 60;
//--&gt;&lt;br /&gt;
&lt;/p&gt;</content>
		<author>
			<name>Francisco Keppler Silva Alecrim</name>
			<uri>http://franciscoalecrim.com/blog</uri>
		</author>
		<source>
			<title type="html">franciscoalecrim.com</title>
			<subtitle type="html">developer</subtitle>
			<link rel="self" href="http://franciscoalecrim.com/blog/feed/atom/"/>
			<id>http://franciscoalecrim.com/blog/feed/atom/</id>
			<updated>2012-03-08T12:15:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">kdeplasma-addons is on git too</title>
		<link href="http://blog.morpheuz.cc/01/02/2011/kdeplasma-addons-is-on-git-too/"/>
		<id>http://blog.morpheuz.cc/?p=330</id>
		<updated>2011-02-01T20:15:04+00:00</updated>
		<content type="html">&lt;p&gt;Today we finally converted kdeplasma-addons to git &lt;img src=&quot;http://blog.morpheuz.cc/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt;  The rules itself were written some time ago and we waited for the conversion of kdelibs and kdebase. Thanks to eean I found a last minute problem on the rules and today we fixed that!&lt;/p&gt;
&lt;p&gt;
&lt;div id=&quot;attachment_331&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;a href=&quot;http://blog.morpheuz.cc/wp-content/uploads/2011/02/git.jpg&quot;&gt;&lt;img class=&quot;size-medium wp-image-331&quot; title=&quot;Git&quot; src=&quot;http://blog.morpheuz.cc/wp-content/uploads/2011/02/git-300x258.jpg&quot; alt=&quot;Picture by The Rocketeer&quot; width=&quot;300&quot; height=&quot;258&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Picture by The Rocketeer&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;You can find kdeplasma-addons on &lt;a href=&quot;https://projects.kde.org/projects/kde/kdeplasma-addons&quot;&gt;https://projects.kde.org/projects/kde/kdeplasma-addons&lt;/a&gt; and you can easily clone the repo using:&lt;/p&gt;
&lt;p&gt;git clone kde:kdeplasma-addons&lt;/p&gt;
&lt;p&gt;Assuming that you did the trick below in your ~/.gitconfig file:&lt;/p&gt;
&lt;p&gt;[url &quot;git://anongit.kde.org/&quot;]&lt;br /&gt;
insteadOf = kde:&lt;br /&gt;
[url &quot;ssh://git@git.kde.org/&quot;]&lt;br /&gt;
pushInsteadOf = kde:&lt;/p&gt;
&lt;p&gt;I have been working with git for almost four years now and I used a lot of tools to create projects and help with visualizing repositories. With ReviewBoard and RedMine all integrated, the commit mails, integration with BKO and other features (a lot of them were already present with svn) I can say that KDE&amp;#8217;s git infrastructure is one of the most complete and professional that I&amp;#8217;ve ever seen. It&amp;#8217;s really very &amp;#8220;PRO&amp;#8221; and I would love to have any of our sysadmins working on my IT department. Guys, you really rock! (besides doing an amazing work).&lt;/p&gt;
&lt;p&gt;I think that it&amp;#8217;s fair also to thank KO that sponsored Ian to work and do the conversions of kdelibs and kdebase. This was not an easy job and it&amp;#8217;s really a pain to do the conversion *right*. Of course we may find some rough edges right now as we still need to get used to new workflows and new tools but IMHO we will overcome that and soon we will feel the benefits of git &lt;img src=&quot;http://blog.morpheuz.cc/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Morpheuz</name>
			<uri>http://blog.morpheuz.cc</uri>
		</author>
		<source>
			<title type="html">MoRpHeUz's Blog</title>
			<subtitle type="html">Just stuff ;)</subtitle>
			<link rel="self" href="http://blog.morpheuz.cc/feed/"/>
			<id>http://blog.morpheuz.cc/feed/</id>
			<updated>2012-05-08T15:15:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Beat Maker – call for testers</title>
		<link href="http://labs.danilocesar.com/blog/2011/01/18/beat-maker-call-for-testers/"/>
		<id>http://labs.danilocesar.com/blog/?p=121</id>
		<updated>2011-01-18T02:00:40+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a href=&quot;http://labs.danilocesar.com/blog/wp-content/uploads/2011/01/splash.jpg&quot;&gt;&lt;img class=&quot;alignnone size-medium wp-image-124&quot; title=&quot;beat maker&quot; src=&quot;http://labs.danilocesar.com/blog/wp-content/uploads/2011/01/splash-300x180.jpg&quot; alt=&quot;&quot; width=&quot;300&quot; height=&quot;180&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hello all!&lt;/p&gt;
&lt;p&gt;I promised this new release for the end of the last year, but I delayed it a bit due some changes in my professional and personal life.&lt;/p&gt;
&lt;p&gt;Anyway, basically this release is about bug fixing and performance improvement. It&amp;#8217;s using less power now, and playing faster.&lt;/p&gt;
&lt;p&gt;If you want to try this version, you can get the package &lt;a href=&quot;http://labs.danilocesar.com/qt/maemo/beat-maker_0.1-1_armel.deb&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And bugs reports are always welcome, and needed ;)&lt;/p&gt;
&lt;p&gt;&lt;em&gt;ps.: I&amp;#8217;m still trying to upload it to OVI, lets see&amp;#8230;&lt;/em&gt;&lt;/p&gt;</content>
		<author>
			<name>Danilo Cesar</name>
			<uri>http://labs.danilocesar.com/blog</uri>
		</author>
		<source>
			<title type="html">Protected * Void</title>
			<subtitle type="html">Free your code, Free your mind!</subtitle>
			<link rel="self" href="http://labs.danilocesar.com/blog/feed/"/>
			<id>http://labs.danilocesar.com/blog/feed/</id>
			<updated>2011-11-03T18:15:08+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Small update for ‘share’ dataengine</title>
		<link href="http://blog.morpheuz.cc/08/01/2011/small-update-for-share-dataengine/"/>
		<id>http://blog.morpheuz.cc/?p=326</id>
		<updated>2011-01-08T18:37:52+00:00</updated>
		<content type="html">&lt;p&gt;
&lt;div id=&quot;attachment_327&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/tobanblack/3773116901/sizes/o/&quot;&gt;&lt;img class=&quot;size-medium wp-image-327&quot; title=&quot;Invest in sharing! by Toban Black&quot; src=&quot;http://blog.morpheuz.cc/wp-content/uploads/2011/01/sharing-296x300.jpg&quot; alt=&quot;Invest in sharing! by Toban Black&quot; width=&quot;296&quot; height=&quot;300&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Invest in sharing! by Toban Black&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Following the &lt;a href=&quot;http://neverendingo.blogspot.com/2010/12/news-from-kde-www-pastebin.html&quot;&gt;awesome work done by our sysadmins&lt;/a&gt;, I &lt;a href=&quot;http://websvn.kde.org/?view=revision&amp;revision=1211570&quot;&gt;implemented&lt;/a&gt; a backend for the share data engine that supports the use of KDE&amp;#8217;s official pastebin service: &lt;a href=&quot;http://paste.kde.org&quot;&gt;http://paste.kde.org&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;This way people using trunk will already have this support upstream and people using earlier versions (which includes 4.6 !) can also use the &lt;a href=&quot;http://opendesktop.org/content/show.php/paste.kde.org?content=137035&quot;&gt;script&lt;/a&gt; provided by &lt;a href=&quot;http://andreascarpino.it/&quot;&gt;Andrea Scarpino&lt;/a&gt; thanks to the brand new &lt;strong&gt;Get Hot New Stuff&lt;/strong&gt; support that I integrated into the Pastebin applet for 4.6 &lt;img src=&quot;http://blog.morpheuz.cc/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;
&lt;div class=&quot;mceTemp mceIEcenter&quot;&gt;
&lt;dl id=&quot;attachment_328&quot; class=&quot;wp-caption aligncenter&quot;&gt;
&lt;dt class=&quot;wp-caption-dt&quot;&gt;&lt;a href=&quot;http://www.flattr.com&quot;&gt;&lt;img class=&quot;size-full wp-image-328&quot; title=&quot;Flattr&quot; src=&quot;http://blog.morpheuz.cc/wp-content/uploads/2011/01/flattr-logo-beta-small.png&quot; alt=&quot;Flattr&quot; width=&quot;147&quot; height=&quot;28&quot; /&gt;&lt;/a&gt;&lt;/dt&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;p&gt;Today I also signed up to &lt;a href=&quot;http://www.flattr.com&quot;&gt;Flattr&lt;/a&gt;, in order to test this micropayment service that sounds like a great idea to donate small amounts to people that do great work and create awesome content. I must say that I signed up after wanting to Flattr the work done by &lt;a href=&quot;http://blog.lydiapintscher.de/&quot;&gt;Lydia&lt;/a&gt; (aka Nightrose) and &lt;a href=&quot;http://www.omat.nl/&quot;&gt;Tom Albers&lt;/a&gt; (aka toma).&lt;/p&gt;
&lt;p&gt;Of course I don&amp;#8217;t expect to earn a lot of money this way, but It&amp;#8217;s awesome to be able to help some great workers and also add the possibility of earning a little bit of money, specially in the year of your wedding &lt;img src=&quot;http://blog.morpheuz.cc/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Morpheuz</name>
			<uri>http://blog.morpheuz.cc</uri>
		</author>
		<source>
			<title type="html">MoRpHeUz's Blog</title>
			<subtitle type="html">Just stuff ;)</subtitle>
			<link rel="self" href="http://blog.morpheuz.cc/feed/"/>
			<id>http://blog.morpheuz.cc/feed/</id>
			<updated>2012-05-08T15:15:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Install Kubuntu Mobile on the N900</title>
		<link href="http://ianlawrence.info/random-stuff/install-kubuntu-mobile-on-the-n900"/>
		<id>http://ianlawrence.info/random-stuff/install-kubuntu-mobile-on-the-n900</id>
		<updated>2011-01-07T20:05:19+00:00</updated>
		<content type="html">&lt;p&gt;Some time ago I wrote a post about a project we were working on called &lt;a href=&quot;http://ianlawrence.info/liquid-update&quot;&gt;Ubuntu Liquid&lt;/a&gt;. Well since then a lot has happened.The &lt;a href=&quot;http://ianlawrence.info/ubuntu-mobile-development-at-the-bossa-conference-2010&quot;&gt;Bossa Conference&lt;/a&gt; came to Manaus with &lt;a href=&quot;http://labs.qt.nokia.com/2010/03/16/bossa-conference10-and-plasma-mobile/&quot;&gt;a great plasma mobile talk&lt;/a&gt;, the project changed its name to Kubuntu Mobile, the awesome KDE and Kubuntu communities became involved and we managed to finally get a &lt;a href=&quot;http://cdimage.ubuntu.com/kubuntu-mobile/&quot;&gt;Technology Preview release&lt;/a&gt; out of the door for Ubuntu Maverick!.&lt;/p&gt;
&lt;p&gt;I remember promising some instructions on how to install the release onto a device. There are already some canonical &lt;a href=&quot;https://wiki.kubuntu.org/ARM/n900/&quot;&gt;instructions available on the Kubuntu wiki&lt;/a&gt; to get started so I will updated this with the things I discovered as I was playing around with this install.&lt;/p&gt;
&lt;p&gt;The N900 has a Texas Instruments OMAP3 microprocessor with an ARM Cortex-A8 core. Unlike all of the Nokia models which preceded it - 770, N800 and N810 - the N900 has full phone functionality (quad-band GSM and 3G UMTS/HSDPA). It is quite interesting therefore to get Ubuntu running on it. Be aware though that Kubuntu Mobile is *not* yet ready to replace Maemo on an N900. Unless of course you really know what you are doing or even better you really know what you are doing and want to help out - either upstream or with the actual distro itself. Our current target is to have Kubuntu Mobile fully working on the N900 in time for the 11.04 Natty release.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Requirements&lt;/h2&gt;
&lt;ol&gt;
 &lt;li&gt;An N900 with Maemo5 pr1.3 installed&lt;/li&gt;
 &lt;li&gt;A MicroSD 8GB, at least, class 6 or better - a lesser class will run but then Kubuntu Mobile runs very slowly.&lt;/li&gt;&lt;/ol&gt;
First make a directory and download the image. &lt;br /&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre&gt;ian@lawrence:/media/80GB$ mkdir Liquid;cd Liquid
ian@lawrence:/media/80GB/Liquid$ wget -c http://cdimage.ubuntu.com/kubuntu-mobile/ports/daily-preinstalled/current/maverick-preinstalled-mobile-armel+omap.img.gz&lt;/pre&gt;
&lt;em&gt; The above link is not working, it seems the image is not building on cdimage - whilst we debug what is happening please try this one&lt;/em&gt; &lt;pre&gt;http://cdimage.ubuntu.com/kubuntu-mobile/ports/releases/10.10/release/&lt;/pre&gt;
&lt;p&gt;Partition the MicroSD card. I used gparted (apt-get install gparted). The three partitions on the card are&lt;/p&gt;
&lt;ol&gt;
 &lt;li&gt;An ext3 partition (using the most part of the MicroSD)&lt;/li&gt;
 &lt;li&gt;A linux swap partition&lt;/li&gt;  
 &lt;li&gt;A small VFAT partition&lt;/li&gt;&lt;/ol&gt;
&lt;img src=&quot;http://ianlawrence.info/random-stuff/images/gparted&quot; /&gt;

Next extract the kubuntu-mobile image and dd it to the ext3 partition - mine is mounted on /dev/sdd1. You need to be root to do this as sudo will not work.
&lt;pre&gt;ian@lawrence:/media/80GB/Liquid$ gunzip maverick-preinstalled-mobile-armel+omap.img.gz
ian@lawrence:/media/80GB/Liquid$ sudo dd bs=4096 if=maverick-preinstalled-mobile-armel+omap.raw of=/dev/sdd1&lt;/pre&gt;
then check that everything is ok.
&lt;pre&gt;root@lawrence:/media/80GB/Liquid# sudo fsck.ext3 -cy /dev/sdd1

e2fsck 1.41.12 (17-May-2010)
Checking for bad blocks (read-only test):  14.18% done, 0:15 elapsed&lt;/pre&gt;
I did this check twice (just to make sure). Now mount the MicroSD card (just unplug it).Install qemu-arm-static if it is not already on your machine and then copy it from the system /usr/bin to the partition /usr/bin
&lt;pre&gt;ian@lawrence:/media/80GB/Liquid$ sudo apt-get install qemu-arm-static                          
ian@lawrence:/media/80GB/Liquid$ sudo cp /usr/bin/qemu-arm-static /media/a6c5c4e9-555c-4565-ba1d-ceea8d5a953f/usr/bin/&lt;/pre&gt;
Make sure that any data buffered in memory is written out
&lt;pre&gt;ian@lawrence:/media/80GB/Liquid$ sync&lt;/pre&gt;
Download the latest meego image
&lt;pre&gt;ian@lawrence:/media/80GB/Liquid$ wget -c http://repo.meego.com/MeeGo/builds/trunk/1.1.80.11.20101221.1/handset/images/meego-handset-armv7l-n900/meego-handset-armv7l-n900-1.1.80.11.20101221.1-mmcblk0p.raw.bz2&lt;/pre&gt;
unzip the raw image
&lt;pre&gt;ian@lawrence:/media/80GB/Liquid$ bzip2 -d meego-handset-armv7l-n900-1.1.80.11.20101221.1-mmcblk0p.raw.bz2&lt;/pre&gt;
next run fdisk (notice the three partitions in this image)
&lt;pre&gt;ian@lawrence:/media/80GB/Liquid$ sudo fdisk -l -u meego-handset-armv7l-n900-1.1.80.11.20101221.1-mmcblk0p.raw


meego-handset-armv7l-n900-1.1.80.11.20101221.1-mmcblk0p.raw1               1     3515625     1757812+  83  Linux
Partition 1 has different physical/logical endings:
     phys=(1023, 3, 32) logical=(27465, 3, 10)
meego-handset-armv7l-n900-1.1.80.11.20101221.1-mmcblk0p.raw2         3516416     3891199      187392   83  Linux
Partition 2 has different physical/logical beginnings (non-Linux?):
     phys=(1023, 3, 32) logical=(27472, 0, 1)
Partition 2 has different physical/logical endings:
     phys=(1023, 3, 32) logical=(30399, 3, 32)
meego-handset-armv7l-n900-1.1.80.11.20101221.1-mmcblk0p.raw3         3891200     4016127       62464   83  Linux
Partition 3 has different physical/logical beginnings (non-Linux?):
     phys=(1023, 3, 32) logical=(30400, 0, 1)
Partition 3 has different physical/logical endings:
     phys=(1023, 3, 32) logical=(31375, 3, 32)&lt;/pre&gt;
now mount the image
&lt;pre&gt;ian@lawrence:/media/80GB/Liquid$ sudo mount -o loop,offset=512 -t auto meego-handset-armv7l-n900-1.1.80.11.20101221.1-mmcblk0p.raw /mnt/&lt;/pre&gt;
copy the kernel modules and firmware to the first partition of the MicroSD card
&lt;pre&gt;ian@lawrence:/media/80GB/Liquid$ sudo cp -a /mnt/lib/modules/2.6.35.3-13.10-n900/ /media/a6c5c4e9-555c-4565-ba1d-ceea8d5a953f/lib/modules/ -a
ian@lawrence:/media/80GB/Liquid$ sudo cp /mnt/lib/firmware/* /media/a6c5c4e9-555c-4565-ba1d-ceea8d5a953f/lib/firmware/&lt;/pre&gt;
now we need to mount the third partition of the .raw meego image (which contains the bootable kernel - vmlinuz) and copy that to the vfat partition of the MicroSD card. To do this we need to work out where the third partition starts. The end of the second partition is
&lt;pre&gt;meego-handset-armv7l-n900-1.1.80.11.20101221.1-mmcblk0p.raw2         3516416     3891199      187392   83  Linux&lt;/pre&gt;
so we need to multiply 3891199 by 512 to find the offset
&lt;pre&gt;3891199*512=1992294400&lt;/pre&gt;
make a temporary mount point then
&lt;pre&gt;ian@lawrence:/media/80GB/Liquid$ sudo mkdir /media/teste1
ian@lawrence:/media/80GB/Liquid$ sudo mount -o loop,offset=1992294400 -t auto meego-handset-armv7l-n900-1.1.80.11.20101221.1-mmcblk0p.raw /media/teste1/
ian@lawrence:/media/80GB/Liquid$ cp /media/teste1/* /media/B68E-53AB&lt;/pre&gt;
run sync
&lt;pre&gt;ian@lawrence:/media/80GB/Liquid$ sync&lt;/pre&gt;
and then unmount
&lt;pre&gt;ian@lawrence:/media/80GB/Liquid$ sudo umount /mnt
ian@lawrence:/media/80GB/Liquid$ sudo umount /media/teste1&lt;/pre&gt;
Enter the chroot on the partition
&lt;pre&gt;ian@lawrence:/media/80GB/Liquid$ sudo chroot /media/a6c5c4e9-555c-4565-ba1d-ceea8d5a953f/
root@lawrence:/#&lt;/pre&gt;
Make sure that the chroot can get a network
&lt;pre&gt;root@lawrence:/# echo &quot;nameserver 8.8.8.8&quot; &amp;gt;&amp;gt; /etc/resolv.conf&lt;/pre&gt;
exit the chroot
&lt;pre&gt;root@lawrence:/home# exit&lt;/pre&gt;
Check out some meego configurations from the git repositories. These are needed for the essential-kubuntu-mobile.sh script below
&lt;pre&gt;ian@lawrence:/media/80GB/Liquid$ mkdir meego;cd meego
ian@lawrence:/media/80GB/Liquid/meego$ git clone git://gitorious.org/meego-device-adaptation/n900_nokia-n900-configs.git
ian@lawrence:/media/80GB/Liquid/meego$ git clone git://gitorious.org/meego-device-adaptation/n900_udev-rules-nokia-n900.git
ian@lawrence:/media/80GB/Liquid/meego$ cd ..&lt;/pre&gt;
We have a script to make the next part of the Kubuntu Mobile install easier - I put it on my server for convenience
&lt;pre&gt;ian@lawrence:/media/80GB/Liquid$ wget -c http://ianlawrence.info/downloads/liquid/essential-kubuntu-mobile.sh&lt;/pre&gt;
and make it executable
&lt;pre&gt;ian@lawrence:/media/80GB/Liquid$ chmod +x essential-kubuntu-mobile.sh&lt;/pre&gt;
change the variables in the script
&lt;pre&gt;MPATH=&quot;/media/a6c5c4e9-555c-4565-ba1d-ceea8d5a953f&quot;
GITPATH=&quot;/media/80GB/Liquid/meego/&quot;&lt;/pre&gt;
to the correct ones for your install. Also change the user name ian
&lt;pre&gt;chroot $MPATH adduser ian&lt;/pre&gt;
for something you will remember.Next run the script.
&lt;pre&gt;ian@lawrence:/media/80GB/Liquid$ sudo ./essential-kubuntu-mobile.sh&lt;/pre&gt;
and answer the questions for the new user.


That is everything completed on the MicroSD card and we can now try to boot it!. &lt;br /&gt;
 First check that the software on the N900 is the correct version (pr1.3) on the device going to Settings -&amp;gt; About product. The version number should read 20.2010.36-2.002. Next check that Extras-devel is enabled in the Application Manager.
&lt;ol&gt;
&lt;li&gt;Navigate to the application menu (tap the title bar)&lt;/li&gt;
&lt;li&gt;Select ‘Application catalogs’&lt;/li&gt; 
&lt;li&gt;Enter a catalog name of ‘Maemo extras-devel’&lt;/li&gt;
&lt;li&gt;Enter a web address of http://repository.maemo.org/extras-devel&lt;/li&gt;
&lt;li&gt;Enter a distribution of ‘fremantle’&lt;/li&gt;
&lt;li&gt;Enter components of ‘free non-free’&lt;/li&gt;
&lt;li&gt;Select ‘Save’&lt;/li&gt;&lt;/ol&gt;
after the repositories are updated open an X Terminal on the device and type
&lt;pre&gt;~ $ sudo gainroot&lt;/pre&gt;
which gives a root shell on the device. Then install uboot-pr13 using apt
&lt;pre&gt;/home/user # apt-get install uboot-pr13&lt;/pre&gt;
uboot-pr13 installs u-boot to the kernel area, along with PR1.3 kernel and it means we can dual boot a device. Verify it's installed by restarting your N900. A penguin should show up at startup and U-boot will be mentioned, let it time out and boot into Maemo. Now take the MicroSD card we prepared and put it into the N900 and reboot. It takes a long time to boot but the end result is worth it 
&lt;img class=&quot;image-left&quot; src=&quot;http://ianlawrence.info/../images/n900/image_preview&quot; alt=&quot;N900&quot; /&gt; &lt;br /&gt;
not because it really works too well yet but because of what it might be one day.&lt;br /&gt; If you want to help #kubuntu-mobile on irc.freenode.net.
&lt;br /&gt;</content>
		<author>
			<name>Ian Lawrence</name>
			<uri>http://ianlawrence.info/random-stuff</uri>
		</author>
		<source>
			<title type="html">Ian Lawrence - Blog</title>
			<subtitle type="html">What is the digital equivalent of lovely? He wondered. What are the digits that encode beauty, the number-fingers that enclose, transform, transmit, decode, and somehow, in the process, fail to trap or choke the soul of it? Not because of the technology but in spite of it, beauty, that ghost, that treasure, passes undiminished through the new machines.</subtitle>
			<link rel="self" href="http://ianlawrence.info/random-stuff/RSS2"/>
			<id>http://ianlawrence.info/random-stuff/RSS2</id>
			<updated>2012-05-19T05:15:17+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">My blog in 2010</title>
		<link href="http://lizardo.wordpress.com/2011/01/02/my-blog-in-2010/"/>
		<id>http://lizardo.wordpress.com/?p=258</id>
		<updated>2011-01-02T13:44:01+00:00</updated>
		<content type="html">&lt;p&gt;The stats helper monkeys at WordPress.com mulled over how this blog did in 2010, and here&amp;#8217;s a high level summary of its overall blog health:&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://s0.wp.com/i/annual-recap/meter-healthy5.gif&quot; width=&quot;250&quot; height=&quot;183&quot; alt=&quot;Healthy blog!&quot; /&gt;&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;The &lt;em&gt;Blog-Health-o-Meter™&lt;/em&gt; reads Wow.&lt;/p&gt;
&lt;h2&gt;Crunchy numbers&lt;/h2&gt;
&lt;div&gt;
&lt;p&gt;				&lt;img src=&quot;http://s0.wp.com/i/annual-recap/abstract-stats-4.png&quot; alt=&quot;Featured image&quot; /&gt;&lt;br /&gt;
				&lt;br /&gt;&lt;em&gt;A helper monkey made this abstract painting, inspired by your stats.&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;About 3 million people visit the Taj Mahal every year.  This blog was viewed about &lt;strong&gt;30,000&lt;/strong&gt; times in 2010.  If it were the Taj Mahal, it would take about 4 days for that many people to see it.&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;In 2010, there were &lt;strong&gt;8&lt;/strong&gt; new posts, growing the total archive of this blog to 27 posts.&lt;/p&gt;
&lt;p&gt;The busiest day of the year was August 27th with &lt;strong&gt;328&lt;/strong&gt; views. The most popular post that day was &lt;a href=&quot;http://lizardo.wordpress.com/2010/08/26/running-pyside-applications-on-qt-simulator/&quot;&gt;Running PySide applications on Qt Simulator&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Where did they come from?&lt;/h2&gt;
&lt;p&gt;The top referring sites in 2010 were &lt;strong&gt;developer.symbian.org&lt;/strong&gt;, &lt;strong&gt;maemo.org&lt;/strong&gt;, &lt;strong&gt;labs.trolltech.com&lt;/strong&gt;, &lt;strong&gt;labs.qt.nokia.com&lt;/strong&gt;, and &lt;strong&gt;thezeroth.net&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Some visitors came searching, mostly for &lt;strong&gt;undefined reference to `vtable for&lt;/strong&gt;, &lt;strong&gt;undefined reference to vtable&lt;/strong&gt;, &lt;strong&gt;qt symbian linux&lt;/strong&gt;, &lt;strong&gt;undefined reference to vtable for&lt;/strong&gt;, and &lt;strong&gt;undefined reference to `vtable&lt;/strong&gt;.&lt;/p&gt;
&lt;div&gt;&lt;/div&gt;
&lt;h2&gt;Attractions in 2010&lt;/h2&gt;
&lt;p&gt;These are the posts and pages that got the most views in 2010.&lt;/p&gt;
&lt;div&gt;1&lt;/div&gt;
&lt;p&gt;					&lt;a href=&quot;http://lizardo.wordpress.com/2010/08/26/running-pyside-applications-on-qt-simulator/&quot;&gt;Running PySide applications on Qt Simulator&lt;/a&gt; &lt;span&gt;August 2010&lt;/span&gt;&lt;br /&gt;2 comments											&lt;/p&gt;
&lt;div&gt;2&lt;/div&gt;
&lt;p&gt;					&lt;a href=&quot;http://lizardo.wordpress.com/2010/02/18/installing-qt-for-symbian-sdk-4-6-2-on-linux/&quot;&gt;Installing Qt for Symbian SDK 4.6.2 on Linux&lt;/a&gt; &lt;span&gt;February 2010&lt;/span&gt;&lt;br /&gt;44 comments and 1 Like on WordPress.com,											&lt;/p&gt;
&lt;div&gt;3&lt;/div&gt;
&lt;p&gt;					&lt;a href=&quot;http://lizardo.wordpress.com/2009/04/24/undefined-reference-to-vtable-for-errors-in-qt-derived-classes/&quot;&gt;&amp;#8220;undefined reference to `vtable for &amp;#8230;&amp;#8217; errors&amp;#8221; in Qt derived classes&lt;/a&gt; &lt;span&gt;April 2009&lt;/span&gt;&lt;br /&gt;8 comments											&lt;/p&gt;
&lt;div&gt;4&lt;/div&gt;
&lt;p&gt;					&lt;a href=&quot;http://lizardo.wordpress.com/2010/01/21/installing-qt-for-symbian-sdk-4-6-1-on-linux/&quot;&gt;Installing Qt for Symbian SDK 4.6.1 on Linux&lt;/a&gt; &lt;span&gt;January 2010&lt;/span&gt;&lt;br /&gt;43 comments											&lt;/p&gt;
&lt;div&gt;5&lt;/div&gt;
&lt;p&gt;					&lt;a href=&quot;http://lizardo.wordpress.com/2009/07/29/running-qt-for-s60-sdk-on-linux/&quot;&gt;Running Qt for S60 SDK on Linux&lt;/a&gt; &lt;span&gt;July 2009&lt;/span&gt;&lt;br /&gt;12 comments											&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/lizardo.wordpress.com/258/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/lizardo.wordpress.com/258/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/lizardo.wordpress.com/258/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/lizardo.wordpress.com/258/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gofacebook/lizardo.wordpress.com/258/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/lizardo.wordpress.com/258/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gotwitter/lizardo.wordpress.com/258/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/lizardo.wordpress.com/258/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/lizardo.wordpress.com/258/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/lizardo.wordpress.com/258/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/lizardo.wordpress.com/258/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/lizardo.wordpress.com/258/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/lizardo.wordpress.com/258/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/lizardo.wordpress.com/258/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=lizardo.wordpress.com&amp;blog=166274&amp;post=258&amp;subd=lizardo&amp;ref=&amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;&lt;/p&gt;</content>
		<author>
			<name>lizardo</name>
			<uri>http://lizardo.wordpress.com</uri>
		</author>
		<source>
			<title type="html">Anderson Lizardo's Blog</title>
			<subtitle type="html">My Free/Open Source Software activity log, and random bits</subtitle>
			<link rel="self" href="http://lizardo.wordpress.com/feed/atom/"/>
			<id>http://lizardo.wordpress.com/feed/atom/</id>
			<updated>2012-02-06T10:15:05+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Retrospectiva 2010, planos pra 2011</title>
		<link href="http://blog.ademar.org/2010/retrospectiva-2010-planos-pra-2011/"/>
		<id>http://blog.ademar.org/?p=1166</id>
		<updated>2010-12-31T03:00:03+00:00</updated>
		<content type="html">&lt;p&gt;Esse foi um ano de pouca atividade nesse blog, mas eu não poderia deixar de fazer meu já tradicional (desde 2006) post de retrospectiva e de planos pro próximo ano.&lt;/p&gt;
&lt;p&gt;2010 foi um ano sem grandes acontecimentos pra mim mas grandes mudanças pra Viviane. Vamos ao resumo (como esse blog é meu, ela só vai ganhar um item):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Viviane concluiu o curso de Design de Interiores, &lt;a href=&quot;http://www.tudo-casa.com/2010/11/casa-cor-pernambuco-2010.html&quot;&gt;expôs na CasaCor-PE 2010&lt;/a&gt; &amp;#8211; ganhou até prêmio &amp;#8211; e está bem resolvida na nova profissão até agora. Ela também tirou carteira de motorista, criou um &lt;a href=&quot;http://www.tudo-casa.com&quot;&gt;blog&lt;/a&gt;, virou fã do google-reader e deu passos largos na sua evolução do uso de tecnologia &amp;#8211; pra grande orgulho de seu marido nerd; :-)&lt;/li&gt;
&lt;li&gt;Mesmo morando no litoral, fomos apenas &lt;strong&gt;uma&lt;/strong&gt; vez pra &lt;a href=&quot;http://pi.pe/-hv0i48&quot;&gt;praia&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;Não tirei férias;&lt;/li&gt;
&lt;li&gt;Comprei mais livros do que li;&lt;/li&gt;
&lt;li&gt;Viajei a trabalho pra vários lugares interessantes: Manaus, Boston, Nova York, Pittsburgh, Oslo e Munique;&lt;/li&gt;
&lt;li&gt;Comprei um Wii, com Guitar Hero (guitarra e bateria), Wii fit e outros jogos;&lt;/li&gt;
&lt;li&gt;Fiz o &lt;a href=&quot;http://twitpic.com/1uxjdz&quot;&gt;upgrade do meu desktop&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;Joguei bastante StarCraft2;&lt;/li&gt;
&lt;li&gt;Recebemos visitas de minha sogra e de dois casais de couchsurfers;&lt;/li&gt;
&lt;li&gt;No &lt;a href=&quot;http://twitter.com/#!/adebr&quot;&gt;twitter&lt;/a&gt; eu postei 331 mensagens (240 status, 80 replies e 11 RTs);&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dos 7 objetivos traçados ao final de 2009, dois falharam vergonhosamente e um foi cancelado:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strike&gt;Fazer pelo menos um passeio em Maragogi &amp;#8211; AL.&lt;/strike&gt; &lt;strong&gt;OK&lt;/strong&gt;: passamos um &lt;a href=&quot;http://pi.pe/-hv0i48&quot;&gt;ótimo feriado de Natal em Japaratinga&lt;/a&gt; (cidade na região);&lt;/li&gt;
&lt;li&gt;Ir de carro até Petrolina, no interior de Pernambuco (734km de Recife). &lt;strong&gt;CANCELADO&lt;/strong&gt;: desisti da viagem de carnaval após me convencerem de que a estrada era insegura e que não valia a pena. Chegar ao &lt;a href=&quot;http://pt.wikipedia.org/wiki/Rio_S%C3%A3o_Francisco#Geografia&quot;&gt;cânion do &amp;#8220;Velho Chico&amp;#8221;&lt;/a&gt; via Aracaju parece ser bem mais negócio;&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;Visitar um país que ainda não conheça&lt;/strike&gt;. &lt;strong&gt;OK&lt;/strong&gt;: Noruega em setembro (viagem a trabalho);&lt;/li&gt;
&lt;li&gt;Publicar os relatos e fotos da &lt;a href=&quot;http://blog.ademar.org/tag/patagonia/&quot;&gt;viagem à Patagônia&lt;/a&gt;.&lt;strong&gt; NOT OK&lt;/strong&gt; (vergonhoso, nem as fotos eu publiquei);&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;Ter um celular com bom acesso à Internet e teclado qwerty&lt;/strike&gt;. &lt;strong&gt;OK&lt;/strong&gt;: usei um n900 por vários meses e agora estou com um N8;&lt;/li&gt;
&lt;li&gt;Começar a estudar um novo idioma. &lt;strong&gt;NOT OK&lt;/strong&gt; (vergonhoso);&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;Fazer um upgrade do meu &lt;a href=&quot;http://blog.ademar.org/2005/micro-novo/&quot;&gt;velho desktop&lt;/a&gt;, deixando-o pronto pra &lt;a href=&quot;http://www.starcraft2.com/&quot;&gt;StarCraft II&lt;/a&gt; que vem aí&lt;/strike&gt;. &lt;strong&gt;OK&lt;/strong&gt;: &lt;a href=&quot;http://twitpic.com/1uxjdz&quot;&gt;atualizei o micro&lt;/a&gt; e SC2 virou o vício das horas vagas :-).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Pra 2011 tracei objetivos um pouco mais ambiciosos. Em ordem arbitrária:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Visitar dois países que eu ainda não conheça (também conhecido como &amp;#8220;tirar férias e viajar pra uma terra desconhecida&amp;#8221;);&lt;/li&gt;
&lt;li&gt;Atualizar a &lt;a href=&quot;http://ademar.org/fotos/&quot;&gt;seção de fotos&lt;/a&gt; do site (Patagônia, Recife, Oslo, Nova York, Boston e férias 2011);&lt;/li&gt;
&lt;li&gt;Visitar nossos familiares e amigos no sul do Brasil (no mínimo Rio Grande &amp;#8211; RS e Umuarama &amp;#8211; PR. Curitiba será uma tentativa);&lt;/li&gt;
&lt;li&gt;Começar a estudar um novo idioma, junto com a Viviane;&lt;/li&gt;
&lt;li&gt;Estudar (formalmente ou não), pois evoluí menos do que esperava em 2010 (também pudera: Wii, Modern Warfare 1 e 2, StarCraft 2, etc);&lt;/li&gt;
&lt;li&gt;Melhorar minha atividade nas &amp;#8220;redes sociais&amp;#8221;, reforçar antigas amizades;&lt;/li&gt;
&lt;li&gt;Comprar algum tipo de tablet, preferivelmente um que sirva como &lt;em&gt;ebook-reader&lt;/em&gt;;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Filho? Hmmm, isso fica como possível surpresa pra 2011/2012, vamos ver&amp;#8230; :-)&lt;/p&gt;
&lt;p&gt;Um ótimo 2011 a todos!&lt;/p&gt;
&lt;p&gt;Posts possivelmente relacionados:&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.ademar.org/2009/retrospectiva-2009-planos-pra-2010/&quot; rel=&quot;bookmark&quot; title=&quot;Retrospectiva 2009, planos pra 2010&quot;&gt;Retrospectiva 2009, planos pra 2010&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.ademar.org/2011/retrospectiva-2011/&quot; rel=&quot;bookmark&quot; title=&quot;Retrospectiva 2011, planos pra 2012&quot;&gt;Retrospectiva 2011, planos pra 2012&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.ademar.org/2008/retrospectiva-2007-planos-2008/&quot; rel=&quot;bookmark&quot; title=&quot;Retrospectiva 2007, planos pra 2008&quot;&gt;Retrospectiva 2007, planos pra 2008&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;&lt;hr /&gt;
&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blog.ademar.org/2010/retrospectiva-2010-planos-pra-2011/&quot;&gt;Link Permanente&lt;/a&gt; |
&lt;a href=&quot;http://blog.ademar.org/2010/retrospectiva-2010-planos-pra-2011/#comments&quot;&gt;5 commentários&lt;/a&gt;&lt;br /&gt;
Post tags: &lt;a href=&quot;http://blog.ademar.org/tag/retrospectiva/&quot; rel=&quot;tag&quot;&gt;retrospectiva&lt;/a&gt;&lt;br /&gt;
&lt;/small&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogademar/~4/JWKxbs3vpx0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Ademar de Souza Reis Jr.</name>
			<uri>http://blog.ademar.org</uri>
		</author>
		<source>
			<title type="html">blog.ademar.org</title>
			<subtitle type="html">Blog pessoal de Ademar Reis</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/blogademar"/>
			<id>http://feeds.feedburner.com/blogademar</id>
			<updated>2012-05-08T21:15:06+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">mpp.py v1.2</title>
		<link href="http://blog.ademar.org/2010/mpp-py-v12/"/>
		<id>http://blog.ademar.org/?p=1147</id>
		<updated>2010-12-18T03:32:51+00:00</updated>
		<content type="html">&lt;p&gt;O &lt;a href=&quot;http://ademar.org/make-photo-pages/&quot;&gt;mpp.py&lt;/a&gt; é um pequeno utilitário que criei pra manter em sync minha &lt;a href=&quot;http://ademar.org/fotos/&quot;&gt;página de fotos (estática)&lt;/a&gt; com meus álbuns gerenciados localmente no &lt;a href=&quot;http://picasa.google.com/linux/&quot;&gt;Picasa&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A última versão (&lt;a href=&quot;http://blog.ademar.org/2008/make-photo-pages-v11/&quot;&gt;v1.1&lt;/a&gt;) foi lançada em julho de 2008, então resolvi que era hora de lançar uma atualização. Não há grandes mudanças na &lt;a href=&quot;http://ademar.org/make-photo-pages/#download&quot;&gt;versão 1.2&lt;/a&gt;, apenas a evolução do script conforme bugs e necessidades foram surgindo ao longo desses últimos 2 anos.&lt;/p&gt;
&lt;p&gt;Se você é um dos 2 ou 3 usuários do mpp.py, a atualização é fortemente recomendada. ;-)&lt;/p&gt;
&lt;p&gt;Mais detalhes na &lt;a href=&quot;http://ademar.org/make-photo-pages/&quot;&gt;página do projeto&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Posts possivelmente relacionados:&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.ademar.org/2007/make-photo-pages/&quot; rel=&quot;bookmark&quot; title=&quot;make-photo-pages (mpp.py)&quot;&gt;make-photo-pages (mpp.py)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.ademar.org/2007/make-photo-pages-v10/&quot; rel=&quot;bookmark&quot; title=&quot;make-photo-pages (mpp.py) 1.0&quot;&gt;make-photo-pages (mpp.py) 1.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.ademar.org/2008/make-photo-pages-v11/&quot; rel=&quot;bookmark&quot; title=&quot;make-photo-pages (mpp.py) 1.1&quot;&gt;make-photo-pages (mpp.py) 1.1&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;&lt;hr /&gt;
&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blog.ademar.org/2010/mpp-py-v12/&quot;&gt;Link Permanente&lt;/a&gt; |
&lt;a href=&quot;http://blog.ademar.org/2010/mpp-py-v12/#comments&quot;&gt;Nenhum comentário&lt;/a&gt;&lt;br /&gt;
Post tags: &lt;a href=&quot;http://blog.ademar.org/tag/code/&quot; rel=&quot;tag&quot;&gt;code&lt;/a&gt;, &lt;a href=&quot;http://blog.ademar.org/tag/computacao/&quot; rel=&quot;tag&quot;&gt;computação&lt;/a&gt;, &lt;a href=&quot;http://blog.ademar.org/tag/python/&quot; rel=&quot;tag&quot;&gt;python&lt;/a&gt;&lt;br /&gt;
&lt;/small&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/blogademar/~4/kEsmx_l5eWA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Ademar de Souza Reis Jr.</name>
			<uri>http://blog.ademar.org</uri>
		</author>
		<source>
			<title type="html">blog.ademar.org</title>
			<subtitle type="html">Blog pessoal de Ademar Reis</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/blogademar"/>
			<id>http://feeds.feedburner.com/blogademar</id>
			<updated>2012-05-08T21:15:06+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">The bad side of “The Cloud”</title>
		<link href="http://blog.morpheuz.cc/15/12/2010/the-bad-side-of-the-cloud/"/>
		<id>http://blog.morpheuz.cc/?p=317</id>
		<updated>2010-12-15T12:45:21+00:00</updated>
		<content type="html">&lt;div id=&quot;attachment_318&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;a href=&quot;http://blog.morpheuz.cc/wp-content/uploads/2010/12/thecloud.jpg&quot;&gt;&lt;img class=&quot;size-medium wp-image-318&quot; title=&quot;The Cloud&quot; src=&quot;http://blog.morpheuz.cc/wp-content/uploads/2010/12/thecloud-300x225.jpg&quot; alt=&quot;The Cloud&quot; width=&quot;300&quot; height=&quot;225&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;The Cloud - by web@kstp.com&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Since some time ago I started to worry that some &amp;#8220;vital&amp;#8221; information for me was on the &amp;#8220;The Cloud&amp;#8221; and that most of the service providers didn&amp;#8217;t provide a way to retrieve my stuff or a support line.&lt;/p&gt;
&lt;p&gt;I started to worry also about privacy for the first time in my life: what if companies suddenly becomes evil? Hmm. That could be bad. The &amp;#8220;big players&amp;#8221; are able to know everything about me: the email I read, the news I read, who are my friends, my family, my pictures&amp;#8230;.and much more! They could relate all this information to know what I like, what I dislike and so on.&lt;/p&gt;
&lt;p&gt;Of course there are benefits. By knowing me more, they can offer better services that could be refined search, special advertisement or even make it easier to find that friend from kinder garden that I&amp;#8217;ve never met after I was 4 (?)&amp;#8230;&lt;/p&gt;
&lt;p&gt;But what is the problem if they turn evil or decide that I do not deserve anymore these goods?&lt;/p&gt;
&lt;p&gt;Some months ago I started to &amp;#8220;migrate&amp;#8221; at least some of my important stuff to open source and &amp;#8220;controlled by me&amp;#8221; services. I&amp;#8217;m now sharing a server with one of my friends where I have my own email service for instance. I also contributed some patches to Akregator to let me share my news with my friends. I started to just use identi.ca and let Twitter &amp;#8220;replicate&amp;#8221; that, so my friends from Twitter get my thoughts. But in worst case I can just install Status.net on my server and voilà. I&amp;#8217;m also looking forward ownCloud.&lt;/p&gt;
&lt;p&gt;Yesterday and today I had the proof that I&amp;#8217;m not (completely) paranoid (and trust me, I&amp;#8217;m one of the last ones to be paranoid about subjects &lt;img src=&quot;http://blog.morpheuz.cc/wp-includes/images/smilies/icon_razz.gif&quot; alt=&quot;:P&quot; class=&quot;wp-smiley&quot; /&gt; ).&lt;/p&gt;
&lt;p&gt;Starting from yesterday: after getting an invitation to try Diaspora (thanks Lydia!), and linking my twitter account there I discovered that my Twitter account was &amp;#8220;suspended&amp;#8221;. Ow great. I was supposed to get an email when this happens and there was nothing on my inbox neither on spam. I tried filling a support request and I always get the &amp;#8220;Could not perform the task. Wait a few minutes&amp;#8221; message.&lt;/p&gt;
&lt;p&gt;I don&amp;#8217;t know how but I finally received an automatic email from one of this support tickets that actually managed to be sent (all the time I tried I received an error&amp;#8230;). I followed all the guidelines and answered the email asking for my account back. Tom pointed out that twitter had some security issues&amp;#8230;but it has been already 24 hours that they disabled my account without sending even an email. If it wasn&amp;#8217;t Diaspora I would never discover that it was suspended.&lt;/p&gt;
&lt;p&gt;Today, while reading my morning news, I discover that Richard had a &lt;a href=&quot;http://blog.nixternal.com/2010.12.15/promise-me-you-wont-fail-like-this/&quot;&gt;problem with Google&lt;/a&gt; and can&amp;#8217;t solve that. He tried email, forums and everything else he could. Ah, great! He even has an Android phone that is pretty useless without a Google account. I&amp;#8217;m sorry Rich &lt;img src=&quot;http://blog.morpheuz.cc/wp-includes/images/smilies/icon_sad.gif&quot; alt=&quot;:(&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;&amp;#8220;The Cloud&amp;#8221; is awesome, isn&amp;#8217;t it? &lt;img src=&quot;http://blog.morpheuz.cc/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt;  That&amp;#8217;s why we need projects like &lt;a href=&quot;http://status.net/&quot;&gt;StatusNet&lt;/a&gt;, &lt;a href=&quot;https://joindiaspora.com/&quot;&gt;Diaspora&lt;/a&gt;, &lt;a href=&quot;http://owncloud.org&quot;&gt;ownCloud&lt;/a&gt; and &lt;span&gt;Open Desktop&lt;/span&gt; (&lt;strong&gt;UPDATE&lt;/strong&gt;: thanks to the ones that pointed out that open desktop isn&amp;#8217;t actually open source).&lt;/p&gt;</content>
		<author>
			<name>Morpheuz</name>
			<uri>http://blog.morpheuz.cc</uri>
		</author>
		<source>
			<title type="html">MoRpHeUz's Blog</title>
			<subtitle type="html">Just stuff ;)</subtitle>
			<link rel="self" href="http://blog.morpheuz.cc/feed/"/>
			<id>http://blog.morpheuz.cc/feed/</id>
			<updated>2012-05-08T15:15:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Roadmapping at the University of Nairobi, Kenya</title>
		<link href="http://ianlawrence.info/random-stuff/roadmapping-at-the-university-of-nairobi-kenya"/>
		<id>http://ianlawrence.info/random-stuff/roadmapping-at-the-university-of-nairobi-kenya</id>
		<updated>2010-12-13T20:56:24+00:00</updated>
		<content type="html">&lt;p&gt;&lt;br /&gt;
&lt;a href=&quot;https://projects.forum.nokia.com/ndg/wiki/&quot;&gt;Nokia Data Gathering&lt;/a&gt; is released on a six monthly cycle. At the beginning of a new development cycle, community developers, NGO's and interested users gather to help shape and scope the next release of NDG (3.04).&lt;/p&gt;
&lt;p&gt;The road mapping meetings are open to the public, but they are not conferences, exhibitions or other audience-oriented events. Rather, they provide an opportunity for software developers -- who usually collaborate online -- and technically orientated system integrators to work together in person on specific tasks related to the planning of the next Nokia Data Gathering release.&lt;/p&gt;
&lt;img src=&quot;http://ianlawrence.info/random-stuff/images/nairobi&quot; /&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;We were really fortunate for 3.04  that the University of Nairobi allowed us to hold the meeting at the Computer Science Department and that so many  passionate staff, students and users came along and made the meeting so special. I think we all (well I am sure I did anyway) learned a powerful lesson about software development. &lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p class=&quot;callout&quot;&gt;&lt;em&gt;Build features which people want, need and will actually use rather than what we think people want.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We came with many &lt;a href=&quot;https://projects.forum.nokia.com/ndg/wiki/3.04&quot;&gt;great shiny new ideas&lt;/a&gt; for data gathering but it was simplicity, accessibility and security which were requested.&lt;/p&gt;
&lt;p&gt;When that new feature I wanted to build (to scratch my own itch in all reality) falls over and a field worker in Liberia for example cannot send a Birth Registration Form no-one recognizes that child as a member of society able to receive medical treatment, go to school or find legal work. I can sleep well hungry, penniless, lonely or cold but I cannot sleep well knowing that is because of me. &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Maybe itch scratching is an easy trap to fall into after working for so long on free software projects but it nearly bit me here and I am eternally grateful to Africa and to our community for the heads up and guidance. A big shout also must go out to Peter Wagacha and the rest of the team at the University for giving us this chance to learn and finally special congratulations and new mobile phone go to Bryann for the winning proposal for the release name. The next release will be called &lt;a href=&quot;https://projects.forum.nokia.com/ndg/wiki/Brave&quot;&gt;Brave Batian&lt;/a&gt; and it promises greatness!&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://ianlawrence.info/random-stuff/images/roadmapping&quot; /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;The peak of Batian (17,057 feet) is the highest peak on Mount Kenya, the second highest mountain in Africa. Mount Kenya has a girth of about 95 miles at 8,000 feet, from which it rises boldly to its restricted summit zone. Mount Kenya is the source of the name of the Republic of Kenya.&lt;/p&gt;</content>
		<author>
			<name>Ian Lawrence</name>
			<uri>http://ianlawrence.info/random-stuff</uri>
		</author>
		<source>
			<title type="html">Ian Lawrence - Blog</title>
			<subtitle type="html">What is the digital equivalent of lovely? He wondered. What are the digits that encode beauty, the number-fingers that enclose, transform, transmit, decode, and somehow, in the process, fail to trap or choke the soul of it? Not because of the technology but in spite of it, beauty, that ghost, that treasure, passes undiminished through the new machines.</subtitle>
			<link rel="self" href="http://ianlawrence.info/random-stuff/RSS2"/>
			<id>http://ianlawrence.info/random-stuff/RSS2</id>
			<updated>2012-05-19T05:15:17+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">PySide 1.0.0~beta1 binaries released for Ubuntu</title>
		<link href="http://lizardo.wordpress.com/2010/12/07/pyside-1-0-0beta1-binaries-released-for-ubuntu/"/>
		<id>http://lizardo.wordpress.com/?p=254</id>
		<updated>2010-12-07T15:36:28+00:00</updated>
		<content type="html">&lt;p&gt;Didier &amp;#8216;OdyX&amp;#8217; Raboud once again borrowed his great Debian packaging/integration skills to the PySide project, and created packages for the latest Ubuntu releases (including the development one, codenamed &amp;#8220;natty&amp;#8221;). They are available on the &lt;a href=&quot;https://launchpad.net/~pyside/+archive/ppa&quot;&gt;official repository&lt;/a&gt;. See the &lt;a href=&quot;http://developer.qt.nokia.com/wiki/PySideBinariesLinux&quot;&gt;download instructions page&lt;/a&gt; for more details. See also the &lt;a href=&quot;http://lists.openbossa.org/pipermail/pyside/2010-December/001562.html&quot;&gt;original announcement&lt;/a&gt;.&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/lizardo.wordpress.com/254/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/lizardo.wordpress.com/254/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/lizardo.wordpress.com/254/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/lizardo.wordpress.com/254/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gofacebook/lizardo.wordpress.com/254/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/lizardo.wordpress.com/254/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gotwitter/lizardo.wordpress.com/254/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/lizardo.wordpress.com/254/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/lizardo.wordpress.com/254/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/lizardo.wordpress.com/254/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/lizardo.wordpress.com/254/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/lizardo.wordpress.com/254/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/lizardo.wordpress.com/254/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/lizardo.wordpress.com/254/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=lizardo.wordpress.com&amp;blog=166274&amp;post=254&amp;subd=lizardo&amp;ref=&amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</content>
		<author>
			<name>lizardo</name>
			<uri>http://lizardo.wordpress.com</uri>
		</author>
		<source>
			<title type="html">Anderson Lizardo's Blog</title>
			<subtitle type="html">My Free/Open Source Software activity log, and random bits</subtitle>
			<link rel="self" href="http://lizardo.wordpress.com/feed/atom/"/>
			<id>http://lizardo.wordpress.com/feed/atom/</id>
			<updated>2012-02-06T10:15:05+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">MeeGo Conference and the Mobile Sprint</title>
		<link href="http://anselmolsm.org/blog/meego-conference-and-the-mobile-sprint/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=meego-conference-and-the-mobile-sprint"/>
		<id>http://www.anselmolsm.org/blog/?p=1310</id>
		<updated>2010-11-22T14:41:46+00:00</updated>
		<content type="html">&lt;p&gt;Then November became a very busy month.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.anselmolsm.org/blog/if-youre-going-to-san-francisco/&quot; target=&quot;_blank&quot;&gt;After the Qt Dev Days San Francisco&lt;/a&gt;, I went quickly to &lt;a href=&quot;http://en.wikipedia.org/wiki/Natal,_Rio_Grande_do_Norte&quot; target=&quot;_blank&quot;&gt;Natal&lt;/a&gt; to present a talk about Qt and KDE on mobile devices. It&amp;#8217;s time to say thank you for the &lt;a href=&quot;http://ensl.org.br/2010/&quot; target=&quot;_blank&quot;&gt;ENSL&lt;/a&gt; organizers &amp;#8211; As always, I am late with my posts&amp;#8230;&lt;/p&gt;
&lt;p&gt;So, last week we went to &lt;a href=&quot;http://en.wikipedia.org/wiki/Dublin&quot; target=&quot;_blank&quot;&gt;Dublin&lt;/a&gt;, for the &lt;a href=&quot;http://conference2010.meego.com/&quot; target=&quot;_blank&quot;&gt;MeeGo Conference 2010&lt;/a&gt;. As more people already posted, it was a really nice event. The good surprise was the limit of the number of Intel and Nokia people, leaving space for the growing community meet &amp;#8211; more than a thousand people attended, very well accommodated in the place chosen (the conference rooms in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Aviva_Stadium&quot; target=&quot;_blank&quot;&gt;Aviva Stadium&lt;/a&gt;) with a good work of the organization which managed to keep things working nicely.&lt;/p&gt;
&lt;p&gt;Although the short time of the presentations, it was good to have a whole ideaof how the project is being conduced, and it looks promising. Unfortunately I left Dublin on Wednesday morning, so I lost the last day which was reserved for the &amp;#8216;&lt;a href=&quot;http://wiki.meego.com/MeeGo_Conference_2010/Unconference&quot; target=&quot;_blank&quot;&gt;unconference&lt;/a&gt;&amp;#8216; sections and the &lt;a href=&quot;http://www.fifa.com/worldfootball/news/newsid=1265722.html?cid=rssfeed&amp;att=&quot; target=&quot;_blank&quot;&gt;football match&lt;/a&gt;, but I managed to go to the &lt;a href=&quot;http://www.guinness-storehouse.com/en/Index.aspx&quot; target=&quot;_blank&quot;&gt;Guinness Storehouse&lt;/a&gt; in Tuesday night, a really good choice for the conference after hours.&lt;/p&gt;
&lt;p&gt;With the &lt;a href=&quot;http://en.wikipedia.org/wiki/IdeaPad&quot; target=&quot;_blank&quot;&gt;Lenovo ideapad&lt;/a&gt; received from the MeeGo Conference guys (thanks! :-)) in my backpack, I traveled to &lt;a href=&quot;http://en.wikipedia.org/wiki/Berlin&quot; target=&quot;_blank&quot;&gt;Berlin&lt;/a&gt; for the &lt;a href=&quot;http://community.kde.org/KDE_Mobile/Sprints/November2010-Planning&quot; target=&quot;_blank&quot;&gt;KDE Mobile Sprint&lt;/a&gt;, kindly hosted by &lt;a href=&quot;http://www.kdab.net&quot; target=&quot;_blank&quot;&gt;KDAB&lt;/a&gt; in its office.&lt;/p&gt;
&lt;p&gt;I must say, we had fun with the new devices. :-)&lt;br /&gt;
During the sprint, interesting discussions about MeeGo, new opportunities, QML and Qt-components. Some of the guys dedicated their time to KDE packaging for MeeGo while in parallel other ones worked in QML based widgets for plasma, tested how some applications work on the ideapad&amp;#8217;s touchscreen, and tested plasma-mobile and plasma-tablet shells on it. The results of this sprint are being listed in &lt;a href=&quot;http://community.kde.org/KDE_Mobile/Sprints/November2010-Results&quot; target=&quot;_blank&quot;&gt;this wiki page&lt;/a&gt;.&lt;/p&gt;
&lt;div id=&quot;attachment_1325&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;a href=&quot;http://anselmolsm.org/wp-content/uploads/2010/11/plasma-netbook.jpg&quot;&gt;&lt;img class=&quot;size-full wp-image-1325 &quot; title=&quot;plasma-netbook&quot; src=&quot;http://anselmolsm.org/wp-content/uploads/2010/11/plasma-netbook.jpg&quot; alt=&quot;&quot; width=&quot;480&quot; height=&quot;360&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;The first steps :-)&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Check the videos in &lt;a href=&quot;http://www.notmart.org/index.php/BlaBla/Meego_summit_and_Mobile_sprint_&quot; target=&quot;_blank&quot;&gt;Marco&amp;#8217;s&lt;/a&gt; and &lt;a href=&quot;http://blog.morpheuz.cc/21/11/2010/kde-mobile-sprint-and-meego/&quot; target=&quot;_blank&quot;&gt;Artur&amp;#8217;s&lt;/a&gt; posts about the sprint. Also, Till Adam showing &lt;a href=&quot;http://www.youtube.com/watch?v=SsWnfny61oI&quot; target=&quot;_blank&quot;&gt;Kontact Mobile on MeeGo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Of course there is more work to do, but considering how things worked without special attention to this device (and for MeeGo), we can expect good news in the future.&lt;/p&gt;
&lt;p&gt;And here a screenshot of the gallery to test the Plasma QML widgets, with a FlashingLabel, some BusyWidgets and a PushButton. It&amp;#8217;s just the beginning.&lt;/p&gt;
&lt;div id=&quot;attachment_1324&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;a href=&quot;http://anselmolsm.org/wp-content/uploads/2010/11/gallery.png&quot;&gt;&lt;img class=&quot;size-full wp-image-1324&quot; title=&quot;gallery&quot; src=&quot;http://anselmolsm.org/wp-content/uploads/2010/11/gallery.png&quot; alt=&quot;&quot; width=&quot;339&quot; height=&quot;372&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;I know, the gallery is, let's say, weird... :-P&lt;/p&gt;&lt;/div&gt;</content>
		<author>
			<name>Anselmo Lacerda S. de Melo</name>
			<uri>http://anselmolsm.org</uri>
		</author>
		<source>
			<title type="html">anselmolsm.org » INdT</title>
			<link rel="self" href="http://anselmolsm.org/blog/category/planet_indt/feed/"/>
			<id>http://anselmolsm.org/blog/category/planet_indt/feed/</id>
			<updated>2012-04-13T19:15:14+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">KDE Mobile Sprint and MeeGo</title>
		<link href="http://blog.morpheuz.cc/21/11/2010/kde-mobile-sprint-and-meego/"/>
		<id>http://blog.morpheuz.cc/?p=311</id>
		<updated>2010-11-21T17:09:46+00:00</updated>
		<content type="html">&lt;p&gt;Yep, I didn&amp;#8217;t blog about MeeGo Conference yet. But come on, a lot happened during the last few days &lt;img src=&quot;http://blog.morpheuz.cc/wp-includes/images/smilies/icon_razz.gif&quot; alt=&quot;:P&quot; class=&quot;wp-smiley&quot; /&gt;  I barely had time to sleep really well (those that know me can tell histories about my sleep-walking and sleep-talking hehe).&lt;/p&gt;
&lt;p&gt;However, just to keep everybody updated before I do a full post or read an article on &lt;a title=&quot;The dot&quot; href=&quot;http://dot.kde.org&quot; target=&quot;_self&quot;&gt;the dot&lt;/a&gt; here it is a simple video that means a lot!&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=UKdLCGCTu8w&quot;&gt;http://www.youtube.com/watch?v=UKdLCGCTu8w&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Basically we put Plasma mobile to run on top of &lt;a href=&quot;http://www.meego.com&quot;&gt;MeeGo&lt;/a&gt; and thanks to a lot of Marco&amp;#8217;s work we already supported screen rotation! Besides the &amp;#8220;fail&amp;#8221; that drivers don&amp;#8217;t properly report that the screen is being rotated on this device, pressing some keys we can make the view rotate and then comes the magic &lt;img src=&quot;http://blog.morpheuz.cc/wp-includes/images/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Of course we also put the Plasma netbook to run on the device but the mobile one was really nice to play with our hands &lt;img src=&quot;http://blog.morpheuz.cc/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt;  Keep your eyes on &lt;a href=&quot;http://planet.kde.org&quot;&gt;the Planet&lt;/a&gt; as I think more people have news to share &lt;img src=&quot;http://blog.morpheuz.cc/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;More about the sprint and the conference after the break &lt;img src=&quot;http://blog.morpheuz.cc/wp-includes/images/smilies/icon_razz.gif&quot; alt=&quot;:P&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;</content>
		<author>
			<name>Morpheuz</name>
			<uri>http://blog.morpheuz.cc</uri>
		</author>
		<source>
			<title type="html">MoRpHeUz's Blog</title>
			<subtitle type="html">Just stuff ;)</subtitle>
			<link rel="self" href="http://blog.morpheuz.cc/feed/"/>
			<id>http://blog.morpheuz.cc/feed/</id>
			<updated>2012-05-08T15:15:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">“If you’re going to San Francisco…”</title>
		<link href="http://anselmolsm.org/blog/if-youre-going-to-san-francisco/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=if-youre-going-to-san-francisco"/>
		<id>http://www.anselmolsm.org/blog/?p=1285</id>
		<updated>2010-11-02T11:44:57+00:00</updated>
		<content type="html">&lt;div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;&amp;#8220;&amp;#8230;You&amp;#8217;re gonna meet some gentle people there&amp;#8221;&lt;/div&gt;
&lt;div&gt;This part of the Scott Mackenzie&amp;#8217;s famous song is definitely true. I&amp;#8217;m in &lt;a href=&quot;http://en.wikipedia.org/wiki/San_Francisco&quot; target=&quot;_blank&quot;&gt;San Francisco&lt;/a&gt; since last Friday and I&amp;#8217;m enjoying the city.&lt;/div&gt;
&lt;div&gt;The true reason for this trip is the &lt;a href=&quot;http://qt.nokia.com/qtdevdays2010&quot; target=&quot;_blank&quot;&gt;Qt Developer Days&lt;/a&gt;, which started yesterday with the training sections and the demo area, where I could see different kind of applications, products and ideas using &lt;a href=&quot;http://qt.nokia.com&quot; target=&quot;_blank&quot;&gt;Qt&lt;/a&gt; or created to ease the development with Qt.&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;It&amp;#8217;s just a short post, in a few minutes there will be the first keynote and I have to go downstairs. :-)&lt;/div&gt;
&lt;div&gt;This is my first DevDays, special thanks to the &lt;a href=&quot;http://developer.qt.nokia.com/&quot;&gt;Qt Developer Network&lt;/a&gt; guys who decided to &lt;a href=&quot;http://developer.qt.nokia.com/blog/view/qt_devnet_at_qt_devdays&quot; target=&quot;_blank&quot;&gt;bring some of the contributors&lt;/a&gt;!&lt;/div&gt;
&lt;div&gt;&lt;a href=&quot;http://anselmolsm.org/wp-content/uploads/2010/11/gondengate.jpg&quot;&gt;&lt;img class=&quot;aligncenter size-full wp-image-1303&quot; title=&quot;The Golden Gate Bridge&quot; src=&quot;http://anselmolsm.org/wp-content/uploads/2010/11/gondengate.jpg&quot; alt=&quot;The Golden Gate Bridge&quot; width=&quot;449&quot; height=&quot;337&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;</content>
		<author>
			<name>Anselmo Lacerda S. de Melo</name>
			<uri>http://anselmolsm.org</uri>
		</author>
		<source>
			<title type="html">anselmolsm.org » INdT</title>
			<link rel="self" href="http://anselmolsm.org/blog/category/planet_indt/feed/"/>
			<id>http://anselmolsm.org/blog/category/planet_indt/feed/</id>
			<updated>2012-04-13T19:15:14+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">Open Innovation Africa Summit</title>
		<link href="http://ianlawrence.info/random-stuff/open-innovation-africa-summit"/>
		<id>http://ianlawrence.info/random-stuff/open-innovation-africa-summit</id>
		<updated>2010-10-29T13:22:07+00:00</updated>
		<content type="html">&lt;p&gt;This is a nice initiative that Nokia is spearheading with &lt;a href=&quot;http://www.capgemini.com/&quot;&gt;Capgemini&lt;/a&gt;
and &lt;a href=&quot;http://www.infodev.org/en/Article.592.html&quot;&gt;The World Bank&lt;/a&gt; to explore and foster the innovation eco-system in
Africa.&lt;/p&gt;

&lt;p&gt;It's called the Open Innovation Africa Summit and it's happening the
week of November 29th 2010 in Nairobi, Kenya!&lt;/p&gt;

&lt;p&gt;The summit aims &lt;em&gt;to promote creation of new innovation services and
collaboration models, which ensure continuous alignment between
different players of the innovation ecosystem as well as to embed
end-user driven co-creation and open innovation as critical elements
to African innovation systems.&lt;/em&gt;&lt;/p&gt;

&lt;img src=&quot;http://ianlawrence.info/random-stuff/images/open-innovation-africa&quot; /&gt;

&lt;p&gt;They've launched a great ideation platform as part of it that revolves
around the four main streams for the event:
&lt;ul&gt;
&lt;li&gt;Ecosystem for Innovation&lt;/li&gt;
&lt;li&gt;Emerging Market Business Models&lt;/li&gt;
&lt;li&gt;Mobile Services Revolution&lt;/li&gt;
&lt;li&gt;Human Capital - Education for All&lt;/li&gt;
&lt;/ul&gt;
You can check out the website and find more information here:
&lt;a href=&quot;http://www.innovateafrique.com&quot;&gt;www.innovateafrique.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We're launching official communication about the event next week but
I wanted to let readers of this blog know about this extraordinary initiative and to get your help providing insights and
ideas  (there are also 8 seats dedicated to the top contributors and readers here could for sure contribute greatly at the event itself, so I thought I'd give you all a heads up :)&lt;/p&gt;
&lt;p&gt;The road mapping meeting for the &lt;a href=&quot;https://projects.forum.nokia.com/ndg/wiki/3.04&quot;&gt;3.04&lt;/a&gt; Nokia Data Gathering release takes place directly after this event at the &lt;a href=&quot;http://www.uonbi.ac.ke/faculties/?fac_code=52&quot;&gt;School Of Computing And Informatics&lt;/a&gt;, University of Nairobi.&lt;/p&gt;</content>
		<author>
			<name>Ian Lawrence</name>
			<uri>http://ianlawrence.info/random-stuff</uri>
		</author>
		<source>
			<title type="html">Ian Lawrence - Blog</title>
			<subtitle type="html">What is the digital equivalent of lovely? He wondered. What are the digits that encode beauty, the number-fingers that enclose, transform, transmit, decode, and somehow, in the process, fail to trap or choke the soul of it? Not because of the technology but in spite of it, beauty, that ghost, that treasure, passes undiminished through the new machines.</subtitle>
			<link rel="self" href="http://ianlawrence.info/random-stuff/RSS2"/>
			<id>http://ianlawrence.info/random-stuff/RSS2</id>
			<updated>2012-05-19T05:15:17+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Sharing articles using Akregator</title>
		<link href="http://blog.morpheuz.cc/22/10/2010/sharing-articles-using-akregator/"/>
		<id>http://blog.morpheuz.cc/?p=306</id>
		<updated>2010-10-22T17:07:47+00:00</updated>
		<content type="html">&lt;p&gt;A month ago I integrated into Akregator the &amp;#8220;share&amp;#8221; feature that uses Plasma&amp;#8217;s microblog service to help you to share news with your friends using the microblog services (&lt;a href=&quot;http://identi.ca&quot;&gt;identi.ca&lt;/a&gt; and &lt;a href=&quot;http://twitter.com&quot;&gt;twitter&lt;/a&gt;). The good thing about using identi.ca is that all your data belong to you &lt;img src=&quot;http://blog.morpheuz.cc/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt;  and you can easily replicate your posts to twitter too. Another place where identi.ca is better than twitter is that it provides RSS feeds for all kind of information.&lt;/p&gt;
&lt;p&gt;You may be asking yourself: &amp;#8220;why the heck is this useful?&amp;#8221;. The answer is: everytime you share some article on Akregator it publishes the title of the article, the link to the article and put&amp;#8217;s a tag &amp;#8220;#share&amp;#8221;. This way you can use the tag feed to retrieve the news that your friends are sharing: just add the RSS feed to your feed reader and voilà &lt;img src=&quot;http://blog.morpheuz.cc/wp-includes/images/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;wp-smiley&quot; /&gt;  This provides a feature that looks like the one that Google Reader provides, but in completely open environment!&lt;/p&gt;
&lt;p&gt;If you are interested in reading my shares, just add this to your reader: &lt;a href=&quot;http://identi.ca/morpheuz/tag/share/rss&quot;&gt;http://identi.ca/morpheuz/tag/share/rss&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m on vacations so it has been hard to keep doing any development as I&amp;#8217;m busy traveling with my fiance &lt;img src=&quot;http://blog.morpheuz.cc/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt;  but I can post about some stuff that I&amp;#8217;ve been developing before my vacations!&lt;/p&gt;
&lt;p&gt;See you!&lt;/p&gt;</content>
		<author>
			<name>Morpheuz</name>
			<uri>http://blog.morpheuz.cc</uri>
		</author>
		<source>
			<title type="html">MoRpHeUz's Blog</title>
			<subtitle type="html">Just stuff ;)</subtitle>
			<link rel="self" href="http://blog.morpheuz.cc/feed/"/>
			<id>http://blog.morpheuz.cc/feed/</id>
			<updated>2012-05-08T15:15:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Using Nokia N8 to make SIP calls over 3G and WiFI</title>
		<link href="http://blog.eduardofleury.com/archives/2010/10/123/"/>
		<id>http://blog.eduardofleury.com/?p=123</id>
		<updated>2010-10-17T20:39:18+00:00</updated>
		<content type="html">&lt;p&gt;Hi there,&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve been playing with the new Nokia N8 (Symbianˆ3) and was able to use it as a softphone to make and receive VoIP calls using my default SIP provider. As the setup is not that straightforward, I&amp;#8217;m sharing the steps here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Installing SIP VoIP Settings&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The first non-obvious thing is that the N8, as well as other S60 v5 and v3 devices like 5800 and N85, doesn&amp;#8217;t come with the settings applications pre-installed. Without that, the built-in SIP settings is pretty much useless for our purpose.&lt;/p&gt;
&lt;p&gt;So, rush to &lt;a href=&quot;http://www.forum.nokia.com/info/sw.nokia.com/id/d476061e-90ca-42e9-b3ea-1a852f3808ec/SIP_VoIP_Settings.html&quot; target=&quot;_blank&quot;&gt;Forum Nokia&lt;/a&gt; and get / install the settings application. The new version is compatible with Symbianˆ3 devices so it fits nicely the Nokia N8.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Creating a SIP profile&lt;br /&gt;
&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To actually use your VoIP provider account you will need to setup SIP proxies, user name, password, codecs, etc. Nokia has split this rigmarole of settings into two separate things which it calls &lt;em&gt;SIP Settings&lt;/em&gt; and &lt;em&gt;VoIP services&lt;/em&gt;. So you&amp;#8217;ll need to create both. Let&amp;#8217;s start with the former.&lt;/p&gt;
&lt;p&gt;Start by opening the Menu and going into:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Settings &amp;gt; Connectivity &amp;gt; Admin Settings &amp;gt; Net Settings &amp;gt; Advanced VoIP settings &amp;gt; SIP settings&lt;br /&gt;
&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.eduardofleury.com/wp-content/uploads/2010/10/DSC_5121.jpg&quot;&gt;&lt;img class=&quot;alignnone size-full wp-image-126&quot; title=&quot;DSC_5121&quot; src=&quot;http://blog.eduardofleury.com/wp-content/uploads/2010/10/DSC_5121.jpg&quot; alt=&quot;&quot; width=&quot;320&quot; height=&quot;482&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If the above settings page is not available, then check the previous step.&lt;/p&gt;
&lt;p&gt;Now create a new profile by going into &lt;em&gt;Options &amp;gt; New SIP profile&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Here you&amp;#8217;ll need to fill in the connection details as the SIP proxy address and login information. In my case I use Inphonex and they provide &lt;a href=&quot;http://www.inphonex.com/support/mobile-nokia-e61-configuration.php&quot; target=&quot;_blank&quot;&gt;detailed information&lt;/a&gt; on how to do that. Your experience may vary but your provider should require similar settings, basically is to set Proxy and Registrar servers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Creating VoIP service&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Once the previous is done, go up one level and then go into &lt;em&gt;VoIP services&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Create a new service &lt;em&gt;Options &amp;gt; New service&lt;/em&gt; and point it to the SIP profile you just created.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[Optional] Enabling use of VoIP over 3G&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you only intent to use WiFi to make VoIP calls, then skip this step, otherwise click the name of the VoIP service you just created and go into &lt;em&gt;Profile settings&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Now search one configuration flag called &amp;#8220;AWCDMA&amp;#8221; (Allow WCDMA), change that to On.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.eduardofleury.com/wp-content/uploads/2010/10/DSC_5122.jpg&quot;&gt;&lt;img title=&quot;DSC_5122&quot; src=&quot;http://blog.eduardofleury.com/wp-content/uploads/2010/10/DSC_5122.jpg&quot; alt=&quot;&quot; width=&quot;320&quot; height=&quot;482&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Testing&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;Find more about how to make &lt;a href=&quot;http://phone-cards.olnevhost.net/&quot;&gt;&lt;b&gt;cheap calls to india&lt;/b&gt;&lt;/a&gt;.&lt;/div&gt;
&lt;p&gt;Go to your phonebook, there should be a new tab on the top. Between Contacts and Groups, a tab with the globe and a phone. Click it and you should be able to click a Sign-in option (if it&amp;#8217;s not signed-in already). To confirm that, check whether this phone+world icon is shown at the top-right corner of the status-bar, close to the Bluetooth and WiFi icons (see Image).&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.eduardofleury.com/wp-content/uploads/2010/10/DSC_5120.jpg&quot;&gt;&lt;img class=&quot;alignnone size-full wp-image-130&quot; title=&quot;DSC_5120&quot; src=&quot;http://blog.eduardofleury.com/wp-content/uploads/2010/10/DSC_5120.jpg&quot; alt=&quot;&quot; width=&quot;320&quot; height=&quot;482&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.eduardofleury.com/wp-content/uploads/2010/10/DSC_5125.jpg&quot;&gt;&lt;img class=&quot;alignnone size-full wp-image-128&quot; title=&quot;DSC_5125&quot; src=&quot;http://blog.eduardofleury.com/wp-content/uploads/2010/10/DSC_5125.jpg&quot; alt=&quot;&quot; width=&quot;320&quot; height=&quot;482&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Now open the dialer, dial something and click &lt;em&gt;Options -&amp;gt; Call -&amp;gt; Your_SIP_Service_name&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Should be that &lt;img src=&quot;http://blog.eduardofleury.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Hopefully this post if useful for you, comments are always appreciated. Enjoy!&lt;/p&gt;</content>
		<author>
			<name>Eduardo Fleury</name>
			<uri>http://blog.eduardofleury.com</uri>
		</author>
		<source>
			<title type="html">eduardofleury.com</title>
			<subtitle type="html">Thoughts, shuffled...</subtitle>
			<link rel="self" href="http://blog.eduardofleury.com/feed/"/>
			<id>http://blog.eduardofleury.com/feed/</id>
			<updated>2011-12-12T04:15:19+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Updates</title>
		<link href="http://anselmolsm.org/blog/updates/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=updates"/>
		<id>http://www.anselmolsm.org/blog/?p=1282</id>
		<updated>2010-10-17T05:06:56+00:00</updated>
		<content type="html">&lt;div id=&quot;_mcePaste&quot;&gt;Looooong time since my last post. Before writing about new things, an overview of what happened since June:&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;
&lt;ul&gt;
&lt;li&gt;In August, I went to the &lt;a href=&quot;http://fslbh.org/&quot; target=&quot;_blank&quot;&gt;Belo Horizonte Free Software Festival&lt;/a&gt; (in &lt;a href=&quot;http://en.wikipedia.org/wiki/Betim&quot; target=&quot;_blank&quot;&gt;Betim&lt;/a&gt; =), where I presented an introductory talk about F/OSS and KDE. It was a nice opportunity to explain some basic concepts to a beginner but very interested public. Thanks &lt;a href=&quot;http://ev.kde.org&quot;&gt;e.V.&lt;/a&gt; for the support and to the FSLBH organizers!&lt;/li&gt;
&lt;li&gt;I moved to another apartment (second time this year).&lt;/li&gt;
&lt;li&gt;I did &lt;strong&gt;not&lt;/strong&gt; go to Akademy =(&lt;/li&gt;
&lt;li&gt;Our interns developed a simple, but nice, comics-reader as part of their studies to learn Qt. The source code is &lt;a href=&quot;http://github.com/dakerfp/comics-reader&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt; and there is a Maemo 5 package &lt;a href=&quot;http://maemo.org/packages/package_instance/view/fremantle_extras-devel_free_armel/comics-reader/1.0.0-1/&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Two of our cute &lt;a href=&quot;http://blog.morpheuz.cc/01/12/2009/qt-4-6-ow/&quot;&gt;demos from the last year&lt;/a&gt; grew up and became applications. The updated sources are available &lt;a href=&quot;http://qt.gitorious.org/qt-labs/mobile-demos/commits/shoppinglist-app&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt; and &lt;a href=&quot;http://gitorious.org/mobile-weather&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;. Kudos to the guys who made it possible!&lt;/li&gt;
&lt;li&gt;I&amp;#8217;ve been working in the development of &lt;a href=&quot;http://dot.kde.org/2010/06/10/kde-pim-goes-mobile&quot; target=&quot;_blank&quot;&gt;kdepim-mobile&lt;/a&gt; and, in parallel, I&amp;#8217;m following the development of &lt;a href=&quot;http://qt.gitorious.org/qt-components&quot; target=&quot;_blank&quot;&gt;Qt-Components&lt;/a&gt;. It is interesting because kdepim-mobile is trying to to use QML as much as possible for the UI, what provides interesting feedback to Qt-Components.&lt;/li&gt;
&lt;li&gt;Patches for the widgets explorer. Since I started using a vertical panel on the right, I found some bugs and things to improve.&lt;/li&gt;
&lt;li&gt;I&amp;#8217;m enjoying the &lt;a href=&quot;http://developer.qt.nokia.com/&quot; target=&quot;_blank&quot;&gt;Qt Developer Network&lt;/a&gt; &amp;#8211; More about it in a future post :-)&lt;/li&gt;
&lt;li&gt;Some airport and flight minutes were dedicated to do a first translation of &lt;a href=&quot;http://enzyme.commit-digest.org/&quot; target=&quot;_blank&quot;&gt;Enzyme&lt;/a&gt; and &lt;a href=&quot;http://commit-digest.org/&quot; target=&quot;_blank&quot;&gt;Commit-digest&lt;/a&gt; to pt_BR. As I am not a translator, it&amp;#8217;s time to request help for the pt_BR translation team =)&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;Someone said a few weeks ago that a good post must have a picture. Here is a picture of the Municipal Park and the  &amp;#8221;&lt;a href=&quot;http://www.tripadvisor.com.br/ShowUserReviews-g303374-d1523606-r38551748-Hippie_Fair-Belo_Horizonte_State_of_Minas_Gerais.html&quot; target=&quot;_blank&quot;&gt;Hippie Fair&lt;/a&gt;&amp;#8220;, in &lt;a href=&quot;http://en.wikipedia.org/wiki/Belo_Horizonte&quot; target=&quot;_blank&quot;&gt;Belo Horizonte&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://anselmolsm.org/wp-content/uploads/2010/10/bh.jpg&quot;&gt;&lt;img class=&quot;aligncenter size-full wp-image-1288&quot; title=&quot;Belo Horizonte&quot; src=&quot;http://anselmolsm.org/wp-content/uploads/2010/10/bh.jpg&quot; alt=&quot;&quot; width=&quot;640&quot; height=&quot;360&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Anselmo Lacerda S. de Melo</name>
			<uri>http://anselmolsm.org</uri>
		</author>
		<source>
			<title type="html">anselmolsm.org » INdT</title>
			<link rel="self" href="http://anselmolsm.org/blog/category/planet_indt/feed/"/>
			<id>http://anselmolsm.org/blog/category/planet_indt/feed/</id>
			<updated>2012-04-13T19:15:14+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Bluetooth Low Energy on BlueZ</title>
		<link href="http://cktakahasi.wordpress.com/2010/10/15/bluetooth-low-energy-on-bluez/"/>
		<id>http://cktakahasi.wordpress.com/?p=32</id>
		<updated>2010-10-15T21:53:20+00:00</updated>
		<content type="html">&lt;p&gt;If you are searching for technology details of Bluetooth 4.0 or if you need the answer for &amp;#8220;why Low Energy&amp;#8221;: wrong post! The SPEC is public, anyone can open an account in the Bluetooth SIG and download the adopted specs.&lt;/p&gt;
&lt;p&gt;My objective is to provide an initial directions of how Bluetooth Low Energy(BLE) will work on BlueZ. The implementation is still under development, but we already have a clear picture of how we will support BLE and GATT/ATT.&lt;/p&gt;
&lt;p&gt;In a couple of years it will be common to find dual mode Bluetooth capable devices: supporting Basic Rate and Low Energy. BlueZ will run on dual mode devices: devices that doesn&amp;#8217;t have strict power consumption constraints. The most common cases for BlueZ devices will be the BLE Central role: managing and collecting data from Peripherals(coin cell devices).&lt;/p&gt;
&lt;p&gt;For this project, there are two major pieces: BLE controller abstraction and the attribute protocol.&lt;/p&gt;
&lt;p&gt;Our goal is to hide BLE technology details from the applications. BlueZ  will  expose the same interface for device discovery operations, meaning  that  the applications doesn&amp;#8217;t need to know the hardware   capabilities/features. BlueZ will use the same abstraction(D-Bus   signals/messages) to report found devices and services. Internally,  BlueZ will manage the interleaved scanning/inquiry and the  characteristics discovery.&lt;/p&gt;
&lt;p&gt;ATT(Attribute Protocol) will be the core of the future profiles over BLE, ATT is a very simple protocol to exchange characteristics. It can be considered transport agnostic. We decided to implement GATT/ATT first over BR/EDR due the BLE hardware availability, extend to BLE is just a minor surgery in the BlueZ code.&lt;/p&gt;
&lt;p&gt;For more information access BlueZ source tree: doc/attribute-api.txt&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/cktakahasi.wordpress.com/32/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/cktakahasi.wordpress.com/32/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/cktakahasi.wordpress.com/32/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/cktakahasi.wordpress.com/32/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gofacebook/cktakahasi.wordpress.com/32/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/cktakahasi.wordpress.com/32/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gotwitter/cktakahasi.wordpress.com/32/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/cktakahasi.wordpress.com/32/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/cktakahasi.wordpress.com/32/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/cktakahasi.wordpress.com/32/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/cktakahasi.wordpress.com/32/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/cktakahasi.wordpress.com/32/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/cktakahasi.wordpress.com/32/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/cktakahasi.wordpress.com/32/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=cktakahasi.wordpress.com&amp;blog=9938613&amp;post=32&amp;subd=cktakahasi&amp;ref=&amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</content>
		<author>
			<name>Claudio Takahasi</name>
			<uri>http://cktakahasi.wordpress.com</uri>
		</author>
		<source>
			<title type="html">Claudio Takahasi</title>
			<subtitle type="html">(krau)</subtitle>
			<link rel="self" href="http://cktakahasi.wordpress.com/feed/atom/"/>
			<id>http://cktakahasi.wordpress.com/feed/atom/</id>
			<updated>2011-09-22T19:15:19+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Beat Maker: The drum loop maker written with Qt</title>
		<link href="http://labs.danilocesar.com/blog/2010/10/14/beat-maker-a-drum-loop-application-written-with-qt/"/>
		<id>http://labs.danilocesar.com/blog/?p=86</id>
		<updated>2010-10-14T23:37:11+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=Ke0zBk73_Zc&quot;&gt;&lt;img title=&quot;BeatMaker&quot; src=&quot;http://labs.danilocesar.com/blog/wp-content/uploads/2010/10/bm.png&quot; width=&quot;400&quot; height=&quot;213&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Beat Maker&lt;/strong&gt; is my &amp;#8220;pet project&amp;#8221; with Allyson Soares at INdT.&lt;/p&gt;
&lt;p&gt;It is, basically, a drum loop emulator to be used by musicians during practicing sessions.&lt;/p&gt;
&lt;p&gt;You just need to select the samples, define a BPM value and listen to the rhythm ;)&lt;/p&gt;
&lt;p&gt;If you can&amp;#8217;t wait for the official release at Ovi Store, you can try the &lt;a href=&quot;http://labs.danilocesar.com/qt/maemo/beat-maker_0.1-1_armel.deb&quot;&gt;beta version&lt;/a&gt; for n900 devices.&lt;/p&gt;
&lt;p&gt;Remember: it&amp;#8217;s a &lt;strong&gt;beta&lt;/strong&gt; version of an open source software. The code can be found linked to my &lt;a href=&quot;http://gitorious.org/beat-maker&quot;&gt;gitorious&lt;/a&gt; account.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The technical point of view:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m a little bit disappointed with phonon. After a &lt;a href=&quot;http://lists-archives.org/kde-devel/24844-multiple-sounds-with-phonon.html&quot;&gt;long discussion&lt;/a&gt; I&amp;#8217;ve realized that phonon could not be used on Beat Maker.&lt;/p&gt;
&lt;p&gt;At this time I&amp;#8217;m using an approach suggested by &lt;a href=&quot;http://atdrez.wordpress.com/&quot;&gt;Adriano Rezende&lt;/a&gt;: play the sound using pulseaudio&amp;#8217;s API. I know, it&amp;#8217;s not portable. But hey, my target is N900 devices and it worked pretty well at the time.&lt;br /&gt;
However, it doesn&amp;#8217;t scale. So, now, I&amp;#8217;m working on a kind of &amp;#8220;in-app-mixer&amp;#8221;, which should solve this problem.&lt;/p&gt;
&lt;p&gt;There is another problem, related to QTimer. Qt can&amp;#8217;t guarantee the timing between the beats using QTimer events. Especially when you generate mouse events.  Anyway, the mixer controller loop should solve this as well.&lt;/p&gt;
&lt;p&gt;Big thanks to Adriano for the tips, and Allyson who made the excellent UI design.&lt;/p&gt;
&lt;p&gt;I hope you enjoy it.&lt;br /&gt;
Suggestions are welcome =)&lt;/p&gt;
&lt;p&gt;ps.: youtube video bellow&lt;br /&gt;
&lt;/p&gt;</content>
		<author>
			<name>Danilo Cesar</name>
			<uri>http://labs.danilocesar.com/blog</uri>
		</author>
		<source>
			<title type="html">Protected * Void</title>
			<subtitle type="html">Free your code, Free your mind!</subtitle>
			<link rel="self" href="http://labs.danilocesar.com/blog/feed/"/>
			<id>http://labs.danilocesar.com/blog/feed/</id>
			<updated>2011-11-03T18:15:08+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Qt 4.7.0 for Symbian on Linux (now with Qt Creator support!)</title>
		<link href="http://lizardo.wordpress.com/2010/10/11/qt-4-7-0-for-symbian-on-linux-now-with-qt-creator-support/"/>
		<id>http://lizardo.wordpress.com/?p=240</id>
		<updated>2010-10-11T16:08:16+00:00</updated>
		<content type="html">&lt;p&gt;It&amp;#8217;s been some time since my last update on the Qt for Symbian Linux installer. My colleague Bruno Abinader did a great job in the meantime, by releasing his own &lt;a href=&quot;http://cabledogs.org/abinader/2010/08/18/updated-unofficial-qt-for-symbian-4-6-3-all-in-one-linux-installer-script/&quot;&gt;modified &amp;#8220;all-in-one&amp;#8221; script&lt;/a&gt; that installed gnupoc, Qt, Qt Mobility and Smart Installer &lt;img src=&quot;http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;wp-smiley&quot; /&gt; .&lt;/p&gt;
&lt;p&gt;From now on, I&amp;#8217;ll follow Bruno&amp;#8217;s idea and provide a single script that installs everything you need for Qt for Symbian development on Linux. This version will install just gnupoc and Qt, but next ones should support Qt Mobility and Smart Installer as well. I also temporarily disabled support for S60 3.1 SDK, so for now there is only S60 5.0 SDK support.&lt;/p&gt;
&lt;p&gt;Some of you might have noticed that the official Qt 4.7.0 documentation has some experimental &lt;a href=&quot;http://doc.qt.nokia.com/4.7/install-symbian-linux.html&quot;&gt;installation instructions&lt;/a&gt; for Linux. Unfortunately, it requires compiling Qt from sources, which might take  long time and currently requires the non-free ARM RVCT compiler. The instructions on this post are my attempt on creating a usable setup in a user-friendly way.&lt;/p&gt;
&lt;p&gt;So, enough explanations, let&amp;#8217;s go to the instructions!&lt;/p&gt;
&lt;h1&gt;Preparation&lt;/h1&gt;
&lt;p&gt;Download all required files to a single directory (e.g. &amp;#8220;~/downloads&amp;#8221;):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.codesourcery.com/public/gnu_toolchain/arm-none-symbianelf/gnu-csl-arm-2005Q1C-arm-none-symbianelf-i686-pc-linux-gnu.tar.bz2&quot;&gt;gnu-csl-arm-2005Q1C-arm-none-symbianelf-i686-pc-linux-gnu.tar.bz2&lt;/a&gt; (11MB): CodeSourcery’s ARM toolchain for Symbian&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.martin.st/symbian/gnupoc-package-1.17.tar.gz&quot;&gt;gnupoc-package-1.17.tar.gz&lt;/a&gt; (8.6 MB): tools and patches to run Symbian SDK on Linux&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://get.qt.nokia.com/qt/source/qt-symbian-opensource-4.7.0-s60.exe&quot;&gt;qt-symbian-opensource-4.7.0-s60.exe&lt;/a&gt; (262 MB): Qt for Open Source C++ development on Symbian&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.forum.nokia.com/Library/Tools_and_downloads/Other/Symbian_SDKs/&quot;&gt;S60_5th_Edition_SDK_v1_0_en.zip&lt;/a&gt; (622MB): S60 SDK for Symbian OS (click on the “Download S60 and Symbian SDKs” button)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.forum.nokia.com/Develop/Other_Technologies/Symbian_C++/Tools/&quot;&gt;s60_open_c_cpp_plug_in_v1_7_en.zip&lt;/a&gt; (31 MB): Open C/C++ Plug-ins (under &amp;#8220;Plug-ins for the Symbian SDKs&amp;#8221; section)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://franciscoalecrim.com/lizardo/qt_for_symbian_4.7.0_linux_installer_v4.sh&quot;&gt;qt_for_symbian_4.7.0_linux_installer_v4.sh&lt;/a&gt;: Unofficial Qt for Symbian installer for Linux&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For building the native tools from gnupoc, you will need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the GCC C/C++ compilers&lt;/li&gt;
&lt;li&gt;development files for zlib&lt;/li&gt;
&lt;li&gt;development files for openssl&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On Ubuntu, you can install these using the following command:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo apt-get install build-essential zlib1g-dev libssl-dev&lt;/code&gt;&lt;/p&gt;
&lt;h1&gt;Installation&lt;/h1&gt;
&lt;p&gt;Install everything using a single command:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;./qt_for_symbian_4.7.0_linux_installer_v4.sh \&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;download-dir&amp;gt; \&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;install-dir&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Replace &amp;lt;download-dir&amp;gt; with the location of all files downloaded in previous section (e.g. &amp;#8220;~/downloads&amp;#8221;), and &amp;lt;install-dir&amp;gt; with the destination directory (e.g. &amp;#8220;~/gnupoc&amp;#8221;). Note that both directories must have absolute paths.&lt;/p&gt;
&lt;p&gt;If installation was successful, you should see the message &amp;#8220;Installation has finished!&amp;#8221; followed by some instructions. Follow those to setup Qt Creator and/or command line.&lt;/p&gt;
&lt;h1&gt;Device setup&lt;/h1&gt;
&lt;p&gt;Install Qt on the phone, by copying and installing the &amp;lt;install-dir&amp;gt;/qt_4.7.0/qt_installer.sis package. This single SIS file has all necessary dependencies for running Qt applications.&lt;/p&gt;
&lt;p&gt;Additionally, if you plan to use Qt Creator, I suggest installing &lt;a href=&quot;http://tools.ext.nokia.com/trk/s60_5_0_app_trk_3_2_7.sisx&quot;&gt;s60_5_0_app_trk_3_2_7.sisx&lt;/a&gt;. It will allow quickly testing your application directly on the device through bluetooth. Also make sure your desktop and phone are paired, then run these commands:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sdptool browse local | grep -q &quot;Service Name: Serial Port&quot; \&lt;br /&gt;
&amp;nbsp;&amp;nbsp;|| sdptool add SP&lt;br /&gt;
sudo rfcomm listen rfcomm0&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The first command makes sure the Serial Port service is only added once, and the second one creates the /dev/rfcomm0 device. You should see output like:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Serial Port service registered&lt;br /&gt;
Waiting for connection on channel 1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;On the phone, open App TRK (It should be under the &amp;#8220;RnD Tools&amp;#8221; directory). It will show &amp;#8220;Status: Not connected&amp;#8221;. Go to Options -&amp;gt; Settings, and make sure &amp;#8220;Connection&amp;#8221; is set to &amp;#8220;Bluetooth&amp;#8221;. Next, go to Options -&amp;gt; Connect and select your desktop from the Bluetooth devices shown. On the phone, you should see:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Status: Connected&lt;br /&gt;
BT Dev Name: &amp;lt;your_computer_name&amp;gt;&lt;br /&gt;
BT Port number: 1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;While on your desktop console:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;...&lt;br /&gt;
Connection from XX:XX:XX:XX:XX:XX to /dev/rfcomm0&lt;br /&gt;
Press CTRL-C for hangup&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Now, when you click &amp;#8220;Run&amp;#8221; on Qt Creator, you should see something like this on its &amp;#8220;Console Window&amp;#8221;:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Executable file:  /home/lizardo/gnupoc/sdk_5.0/epoc32/release/$(PLATFORM)/$(TARGET)/animatedtiles.exe&lt;br /&gt;
Package: 117288 2010-10-11T11:43:23 /home/lizardo/NokiaQtSDK/Examples/4.6/animation/animatedtiles/animatedtiles.sis&lt;br /&gt;
Deploying application to 'Bluetooth device (/dev/rfcomm0)'...&lt;br /&gt;
Copying installation file...&lt;br /&gt;
Installing application...&lt;br /&gt;
Starting application...&lt;br /&gt;
Application running with pid 1134.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And the application should install and open directly on your phone &lt;img src=&quot;http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt;  Enjoy!&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/lizardo.wordpress.com/240/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/lizardo.wordpress.com/240/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/lizardo.wordpress.com/240/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/lizardo.wordpress.com/240/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gofacebook/lizardo.wordpress.com/240/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/lizardo.wordpress.com/240/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gotwitter/lizardo.wordpress.com/240/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/lizardo.wordpress.com/240/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/lizardo.wordpress.com/240/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/lizardo.wordpress.com/240/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/lizardo.wordpress.com/240/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/lizardo.wordpress.com/240/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/lizardo.wordpress.com/240/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/lizardo.wordpress.com/240/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=lizardo.wordpress.com&amp;blog=166274&amp;post=240&amp;subd=lizardo&amp;ref=&amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</content>
		<author>
			<name>lizardo</name>
			<uri>http://lizardo.wordpress.com</uri>
		</author>
		<source>
			<title type="html">Anderson Lizardo's Blog</title>
			<subtitle type="html">My Free/Open Source Software activity log, and random bits</subtitle>
			<link rel="self" href="http://lizardo.wordpress.com/feed/atom/"/>
			<id>http://lizardo.wordpress.com/feed/atom/</id>
			<updated>2012-02-06T10:15:05+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">And there I go: Qt Dev Days Munich!</title>
		<link href="http://wouwlabs.com/blogs/jeez/?p=218"/>
		<id>http://wouwlabs.com/blogs/jeez/?p=218</id>
		<updated>2010-10-10T20:30:51+00:00</updated>
		<content type="html">&lt;p&gt;Hey! From this Monday to Thursday I&amp;#8217;ll be at Unterschleissheim, Germany, attending the Qt Dev Days Munich. Meeting all Qt hackers again will be awesome, as always, but the best thing about this trip will be meeting my INdT&amp;#8217;s fellows! ;)&lt;/p&gt;
&lt;p&gt;So, if you are aroud:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://wouwlabs.com/blogs/jeez/wp-content/uploads/2010/10/blog_banner.png&quot;&gt;&lt;img class=&quot;alignnone size-medium wp-image-219&quot; title=&quot;blog_banner&quot; src=&quot;http://wouwlabs.com/blogs/jeez/wp-content/uploads/2010/10/blog_banner-300x80.png&quot; alt=&quot;&quot; width=&quot;300&quot; height=&quot;80&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;(*not sure where I took this picture from =/)&lt;/p&gt;
&lt;p&gt;Cheers!&lt;/p&gt;</content>
		<author>
			<name>jeez</name>
			<uri>http://wouwlabs.com/blogs/jeez</uri>
		</author>
		<source>
			<title type="html">Shuffle Life</title>
			<subtitle type="html">&lt;h1&gt;Account Suspended&lt;/h1&gt;
&lt;div id=&quot;wrap&quot;&gt;
  &lt;div class=&quot;msg&quot;&gt;
    &lt;h2&gt;&lt;strong&gt;This Account Has Been Suspended&lt;/strong&gt;&lt;/h2&gt;
  &lt;/div&gt;
&lt;/div&gt;</subtitle>
			<link rel="self" href="http://wouwlabs.com/blogs/jeez/?feed=atom"/>
			<id>http://wouwlabs.com/blogs/jeez/?feed=atom</id>
			<updated>2011-09-19T02:15:10+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Partindo para novos desafios &amp;#8211; Obrigado BRISA</title>
		<link href="http://franciscoalecrim.com/blog/2010/10/05/partindo-para-novos-desafios-obrigado-brisa/"/>
		<id>http://franciscoalecrim.com/blog/?p=312</id>
		<updated>2010-10-05T18:49:41+00:00</updated>
		<content type="html">&lt;p&gt;Depois das constantes quedas da LGE, tivemos baixas significas na BRISA Tecnologia. Agora, estou mudando novamente de empresa. Obrigado BRISA pela oportunidade e desafios que tivemos neste período de 4 meses.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Dentro de alguns dias, inicio uma nova busca por desafios no Instituto Eldorado, que possui excelentes parceiros como Motorola, DELL, HP e Positivo. Estou bem ansioso para ver os projetos que terei por lá.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Espero poder trazer excelentes novidades nas próximas semanas! \o/&lt;/p&gt;</content>
		<author>
			<name>Francisco Keppler Silva Alecrim</name>
			<uri>http://franciscoalecrim.com/blog</uri>
		</author>
		<source>
			<title type="html">franciscoalecrim.com</title>
			<subtitle type="html">developer</subtitle>
			<link rel="self" href="http://franciscoalecrim.com/blog/feed/atom/"/>
			<id>http://franciscoalecrim.com/blog/feed/atom/</id>
			<updated>2012-03-08T12:15:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Styles for Qt and KDE: A new approach</title>
		<link href="http://blog.eduardofleury.com/archives/2010/10/116/"/>
		<id>http://blog.eduardofleury.com/?p=116</id>
		<updated>2010-10-01T18:32:46+00:00</updated>
		<content type="html">&lt;p&gt;At this year&amp;#8217;s Akademy I&amp;#8217;ve presented a talk that summarizes a new way of styling C++ widgets in Qt and KDE. Now checkout the companion paper with in deep explanations of the ideas proposed there.&lt;/p&gt;
&lt;p&gt;Get it &lt;a title=&quot;Download paper&quot; href=&quot;http://blog.eduardofleury.com/wp-content/uploads/2010/10/EduardoFleury_StylesForQtAndKDE.pdf&quot;&gt;HERE&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Eduardo Fleury</name>
			<uri>http://blog.eduardofleury.com</uri>
		</author>
		<source>
			<title type="html">eduardofleury.com</title>
			<subtitle type="html">Thoughts, shuffled...</subtitle>
			<link rel="self" href="http://blog.eduardofleury.com/feed/"/>
			<id>http://blog.eduardofleury.com/feed/</id>
			<updated>2011-12-12T04:15:19+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">PandaBoard.org and Early Adopter Program</title>
		<link href="http://rsalveti.wordpress.com/2010/09/29/pandaboard-org-and-early-adopter-program/"/>
		<id>http://rsalveti.wordpress.com/?p=242</id>
		<updated>2010-09-30T00:12:20+00:00</updated>
		<content type="html">&lt;p&gt;Today it was finally released the new &lt;a href=&quot;http://pandaboard.org/&quot;&gt;PandaBoard&lt;/a&gt; website, showing everything you wanted to know about the new community oriented OMAP 4 board.&lt;/p&gt;
&lt;p&gt;If you are already used with BeagleBoard, Panda should be similar in some way, but now deploying the latest OMAP 4 SoC and tons of new stuff.&lt;/p&gt;
&lt;p&gt;What you can find at the PandaBoard:&lt;br /&gt;
 &amp;#8211; Dual Core ARM Cortex™ A9 powered by &lt;a href=&quot;http://focus.ti.com/general/docs/wtbu/wtbuproductcontent.tsp?contentId=53243&amp;navigationId=12843&amp;templateId=6123&quot;&gt;OMAP4430&lt;/a&gt;&lt;br /&gt;
 &amp;#8211; 1GB LPDDR2 SDRAM&lt;br /&gt;
 &amp;#8211; PowerVR SGX 2D/3D Graphic Accelerator&lt;br /&gt;
 &amp;#8211; WLAN, BT and FM by &lt;a href=&quot;http://www.lsr.com/downloads/tiwi/datasheet/TIWI_Datasheet.pdf&quot;&gt;WL1271&lt;/a&gt;&lt;br /&gt;
 &amp;#8211; DVI-D and HDMI support&lt;br /&gt;
 &amp;#8211; 2x USB Host + Ethernet by &lt;a href=&quot;http://rsalveti.wordpress.com/2010/09/29/pandaboard-org-and-early-adopter-program/www.smsc.com/media/Downloads_Public/Data_Sheets/9514.pdf&quot;&gt;LAN 9514&lt;/a&gt;&lt;br /&gt;
 &amp;#8211; Mini USB with OTG support&lt;br /&gt;
 &amp;#8211; SD/MMC&lt;br /&gt;
 &amp;#8211; JTAG&lt;br /&gt;
 &amp;#8211; RS-232 UART&lt;br /&gt;
 &amp;#8211; LCD and Generic Expansion and more&lt;/p&gt;
&lt;p&gt;Software Support:&lt;/p&gt;
&lt;p&gt;Another good thing is that much of the software support is already available at &lt;a href=&quot;http://dev.omapzoom.org&quot;&gt;omapzoom&lt;/a&gt;, like Kernel, X-Loader and U-Boot. Upstream kernel is still missing some patches, but there&amp;#8217;s a lot of work going on linux-omap, so expect at least basic support from upstream soon. For bootloader you can already use U-Boot from upstream, as &lt;a href=&quot;http://sakoman.com/cgi-bin/gitweb.cgi?p=u-boot.git&quot;&gt;Sakoman&lt;/a&gt; did an awesome work doing the Pandaboard and OMAP 4 support.&lt;/p&gt;
&lt;p&gt;Early Adopter Program:&lt;/p&gt;
&lt;p&gt;While PandaBoard is still not out for general public you can already participate at the Early Adopter Program and luckly get a board for free (and first than everyone else)! All you need to do is go to &lt;a href=&quot;http://www.omappedia.org/wiki/PandaBoard_Early_Adopter_Program&quot;&gt;http://www.omappedia.org/wiki/PandaBoard_Early_Adopter_Program&lt;/a&gt; and propose a cool open source project that could take use of it. The board is really small and powerful, think about running Ubuntu, MeeGo or any other distro and getting 3D support, 1080p video decode and more! Lots of ideas, for sure.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re interested don&amp;#8217;t waste your time and join the still small PandaBoard community, joining the &lt;a href=&quot;http://groups.google.com/group/pandaboard?email=&amp;sub=Subscribe&quot;&gt;mailing list&lt;/a&gt; and   IRC channel #pandaboard at FreeNode.&lt;/p&gt;
&lt;p&gt;Happy hacking!&lt;/p&gt;
&lt;br /&gt;  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/rsalveti.wordpress.com/242/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/rsalveti.wordpress.com/242/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/rsalveti.wordpress.com/242/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/rsalveti.wordpress.com/242/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gofacebook/rsalveti.wordpress.com/242/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/rsalveti.wordpress.com/242/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gotwitter/rsalveti.wordpress.com/242/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/rsalveti.wordpress.com/242/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/rsalveti.wordpress.com/242/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/rsalveti.wordpress.com/242/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/rsalveti.wordpress.com/242/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/rsalveti.wordpress.com/242/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/rsalveti.wordpress.com/242/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/rsalveti.wordpress.com/242/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=rsalveti.wordpress.com&amp;blog=905525&amp;post=242&amp;subd=rsalveti&amp;ref=&amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</content>
		<author>
			<name>rsalveti</name>
			<uri>http://rsalveti.wordpress.com</uri>
		</author>
		<source>
			<title type="html">rsalveti's random thoughts</title>
			<subtitle type="html">Just another geek's weblog</subtitle>
			<link rel="self" href="http://rsalveti.wordpress.com/feed/atom/"/>
			<id>http://rsalveti.wordpress.com/feed/atom/</id>
			<updated>2012-05-15T03:15:15+00:00</updated>
		</source>
	</entry>

</feed>

