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

<channel>
	<title>Cantina Consulting &#187; Productivity</title>
	<atom:link href="http://www.cantinaconsulting.com/category/productivity/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.cantinaconsulting.com</link>
	<description></description>
	<lastBuildDate>Tue, 27 Jul 2010 18:47:36 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Putting a Stranglehold on your GUI Applications with wxPython</title>
		<link>http://www.cantinaconsulting.com/2009/05/14/wxpython_first_impressions/</link>
		<comments>http://www.cantinaconsulting.com/2009/05/14/wxpython_first_impressions/#comments</comments>
		<pubDate>Thu, 14 May 2009 22:12:32 +0000</pubDate>
		<dc:creator>steve</dc:creator>
				<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[wxPython]]></category>

		<guid isPermaLink="false">http://www.cantinaconsulting.com/?p=152</guid>
		<description><![CDATA[It&#8217;s been a few weeks now since I signed up with the group here at Cantina, and so far I&#8217;ve had a great time. I&#8217;ve had the opportunity to learn quite a bit about online video distribution &#38; technologies, expand my knowledge of Flex / Flash, play around with Amazon&#8217;s Cloud solutions, and learn the [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been a few weeks now since I signed up with the group here at Cantina, and so far I&#8217;ve had a great time. I&#8217;ve had the opportunity to learn quite a bit about online video distribution &amp; technologies, expand my knowledge of Flex / Flash, play around with Amazon&#8217;s Cloud solutions, and learn the excellent framework <a title="Grails" href="http://www.grails.org/" target="_blank">Groovy on Grails</a>. If you are familiar with Rails and like Java, I suggest giving it a try. The rest of the guys here are big fans and we&#8217;re doing our part to expand the Grails community and develop some great plugins.</p>
<p>In turn, I hope to encourage the use of my current favorite language, Python (see <a href="http://www.diveintopython.org/" target="_blank">http://www.diveintopython.org/</a> for a good tutorial). For an interpreted language (it does compile to c byte code at runtime), its capabilities and community support are overwhelmingly substantial. I&#8217;m continually surprised as I discover more; its breadth is so great, that Python leaves itself open to <a title="Python - flying" href="http://xkcd.com/353/" target="_blank">satire</a> ( also: <a href="http://xkcd.com/409/" target="_blank">here</a> and <a href="http://xkcd.com/413/" target="_blank">here</a>). I could drone on,  evangelizing its advantages at some detail (and bore everyone to tears, I&#8217;m sure), but that&#8217;s not why I&#8217;m writing today. No, the point here is to give a quick presentation on a particular package I&#8217;ve just started using that amazes me, and it should get more use: <a title="wxPython.org" href="http://www.wxpython.org/" target="_blank">wxPython</a>.</p>
<p>WxPython is module for Python that is essentially a wrapper for an open source project called <a href="http://wxwidgets.org/" target="_blank">wxWidgets</a>, so most of the credit should go to them. WxWidgets is certainly widely used (link: <a href="http://wxwidgets.org/about/users.htm" target="_blank">http://wxwidgets.org/about/users.htm</a> ); it&#8217;s a package that allows developers to quickly and easily access the GUI components in Windows, OS X, and various flavors of Linux. This allows development of applications that look native to the OS. WxPython allows one to rapidly develop applications entirely in Python, that look native to the OS. Imagine writing an application in OS X, then moving the code to a Windows or Ubuntu machine and having it work and look perfectly without any modifications! No more dealing with .dlls or compiling on individual machines.. just &#8216;python &lt;appname&gt;.py&#8217;.</p>
<p>In practice, it&#8217;s surprisingly easily to generate an entire event-driven application. The basic order of implementation is (1) design layout of your buttons,menus, widgets, etc, (2) implement event handlers, (3) bind event listeners to buttons / actions. I&#8217;d post some of my code, but it&#8217;s almost all currently in an NDA&#8217;ed project, so instead here&#8217;s some sample code from <a href="http://wiki.wxpython.org/AnotherTutorial" target="_blank">http://wiki.wxpython.org/AnotherTutorial</a> that creates a program with a toolbar:<br />
<span style="color: #0000ff;"><br />
</span></p>
<p style="text-align: left; padding-left: 30px;"><span style="color: #0000ff;">#!/usr/bin/python</span></p>
<p style="text-align: left; padding-left: 30px;"><span style="color: #0000ff;"><br />
# toolbar.py</span></p>
<p style="text-align: left; padding-left: 30px;"><span style="color: #0000ff;"><br />
import wx</span></p>
<p style="text-align: left; padding-left: 30px;"><span style="color: #0000ff;"><br />
class MyToolBar(wx.Frame):</span></p>
<p style="text-align: left; padding-left: 30px;"><span style="color: #0000ff;"> def __init__(self, parent, id, title):</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(350, 250))</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"><br />
vbox = wx.BoxSizer(wx.VERTICAL)</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> toolbar = wx.ToolBar(self, -1, style=wx.TB_HORIZONTAL | wx.NO_BORDER)</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> toolbar.AddSimpleTool(1, wx.Image(&#8217;stock_new.png&#8217;, wx.BITMAP_TYPE_PNG).ConvertToBitmap(), &#8216;New&#8217;, &#8221;)</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> toolbar.AddSimpleTool(2, wx.Image(&#8217;stock_open.png&#8217;, wx.BITMAP_TYPE_PNG).ConvertToBitmap(), &#8216;Open&#8217;, &#8221;)</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> toolbar.AddSimpleTool(3, wx.Image(&#8217;stock_save.png&#8217;, wx.BITMAP_TYPE_PNG).ConvertToBitmap(), &#8216;Save&#8217;, &#8221;)</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> toolbar.AddSeparator()</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> toolbar.AddSimpleTool(4, wx.Image(&#8217;stock_exit.png&#8217;, wx.BITMAP_TYPE_PNG).ConvertToBitmap(), &#8216;Exit&#8217;, &#8221;)</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> toolbar.Realize()</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> vbox.Add(toolbar, 0, border=5)</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> self.SetSizer(vbox)</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> self.statusbar = self.CreateStatusBar()</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> self.Centre()</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"><br />
self.Bind(wx.EVT_TOOL, self.OnNew, id=1)</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> self.Bind(wx.EVT_TOOL, self.OnOpen, id=2)</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> self.Bind(wx.EVT_TOOL, self.OnSave, id=3)</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> self.Bind(wx.EVT_TOOL, self.OnExit, id=4)</span></p>
<p style="text-align: left; padding-left: 30px;"><span style="color: #0000ff;"><br />
def OnNew(self, event):</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> self.statusbar.SetStatusText(&#8216;New Command&#8217;)</span></p>
<p style="text-align: left; padding-left: 30px;"><span style="color: #0000ff;"><br />
def OnOpen(self, event):</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> self.statusbar.SetStatusText(&#8216;Open Command&#8217;)</span></p>
<p style="text-align: left; padding-left: 30px;"><span style="color: #0000ff;"><br />
def OnSave(self, event):</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> self.statusbar.SetStatusText(&#8216;Save Command&#8217;)</span></p>
<p style="text-align: left; padding-left: 30px;"><span style="color: #0000ff;"><br />
def OnExit(self, event):</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> self.Close()</span></p>
<p style="text-align: left; padding-left: 30px;"><span style="color: #0000ff;"><br />
class MyApp(wx.App):</span></p>
<p style="text-align: left; padding-left: 60px;"><span style="color: #0000ff;"> def OnInit(self):</span></p>
<p style="text-align: left; padding-left: 90px;"><span style="color: #0000ff;"> frame = MyToolBar(None, -1, &#8216;toolbar.py&#8217;)</span></p>
<p style="text-align: left; padding-left: 90px;"><span style="color: #0000ff;"> frame.Show(True)</span></p>
<p style="text-align: left; padding-left: 90px;"><span style="color: #0000ff;"> return True</span></p>
<p style="text-align: left; padding-left: 30px;"><span style="color: #0000ff;"><br />
app = MyApp(0)</span></p>
<p style="text-align: left; padding-left: 30px;"><span style="color: #0000ff;">app.MainLoop()</span></p>
<pre style="text-align: left;"><span style="color: #ff0000;">
</span></pre>
<p><span style="color: #000000;">results in this (on Ubuntu):</span></p>
<div id="attachment_153" class="wp-caption aligncenter" style="width: 363px"><a href="http://www.cantinaconsulting.com/wp-content/toolbar.png"><img class="size-full wp-image-153" title="Ubuntu_wxpython_app" src="http://www.cantinaconsulting.com/wp-content/toolbar.png" alt="Resulting application in Ubuntu" width="353" height="263" /></a><p class="wp-caption-text">Resulting application in Ubuntu</p></div>
<p>While not much to look at, certainly, briefly think about what&#8217;s going on here. In ~45 lines of code, we have a fully functional application. It doesn&#8217;t do much,  yet, but imagine what we could do if you started hooking up some of your existing Python code, or hooking in some other Python modules. There&#8217;s a lot of power in this; the mind can hardly grasp the possibilities of, say, Windows apps powered by Python (take that, Visual Studio). I feel strongly that it has the potential to handle some serious projects, if given the opportunity.</p>
<p>This would be intensive, but I&#8217;m still learning wxPython myself. So far, it&#8217;s been great fun, and I highly recommend others to check it out. I&#8217;d love to see some examples out there of anyone who&#8217;s developed apps in the framework (a quick search doesn&#8217;t reveal much), and perhaps I&#8217;ll post some of my own as I start using it more.</p>
<p>Until then, try taking a look at wxPython.org (link) and the wxPython wiki (link). Give it a shot; I&#8217;m sure you&#8217;ll love it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cantinaconsulting.com/2009/05/14/wxpython_first_impressions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sync Soup or another case for unified online identity</title>
		<link>http://www.cantinaconsulting.com/2008/12/10/sync-soup-or-another-case-for-unified-online-identity/</link>
		<comments>http://www.cantinaconsulting.com/2008/12/10/sync-soup-or-another-case-for-unified-online-identity/#comments</comments>
		<pubDate>Wed, 10 Dec 2008 19:12:52 +0000</pubDate>
		<dc:creator>adam</dc:creator>
				<category><![CDATA[Productivity]]></category>

		<guid isPermaLink="false">http://www.cantinaconsulting.com/2008/12/10/sync-soup-or-another-case-for-unified-online-identity/</guid>
		<description><![CDATA[As a software engineer, I find that I apply basic software engineering principles to all aspects of my life, and a big one is the &#8220;don&#8217;t repeat yourself&#8221; philosophy, or DRY.  Nowhere have I felt more pain on this lately than with trying to solve the problem of a unified email, calendar, and contact [...]]]></description>
			<content:encoded><![CDATA[<p>As a software engineer, I find that I apply basic software engineering principles to all aspects of my life, and a big one is the &#8220;don&#8217;t repeat yourself&#8221; philosophy, or DRY.  Nowhere have I felt more pain on this lately than with trying to solve the problem of a unified email, calendar, and contact solution that is available to me wherever I am.  Let me state the problem more clearly:</p>
<p>At Cantina, we make heavy use of all that Google Apps has to offer to provide a cost effective, yet extremely functional solution to email (both web-based and IMAP) and shared calendars.  This, for the most part, suits our needs adequately and with minimal cost and maintenance.  Now, throw into this scenario the fact that we are consultants, and as such end up making heavy use of our clients&#8217; respective email and shared calendar solutions, most if not all of which are handled via Microsoft Exchange Server.  There are a whole host of reasons why this is a good thing for our clients, however this presents a problem for someone like myself, who likes to keep everything in one place, depending on where I am:</p>
<ol>
<li>If I&#8217;m at my desk, I want it on my Mac laptop and want all of my email managed via Apple&#8217;s Mail application, and all of my calendar managed through iCal</li>
<li>If I&#8217;m out and about, I want it all on my iPhone (you can see my brand allegiance here &#8211; not a fanboy just like low maintenance and high integration)</li>
<li>If I&#8217;m really in a pickle and don&#8217;t have my laptop or my iPhone (this is rare), but still have internet, it would be ideal to have a unified web interface to get to all of this stuff, perhaps via Google Apps.  Again this is a rare case.</li>
</ol>
<p>Now, there are a myriad of synchronization technologies and solutions out there that attempt to bridge the gaps between these various components, such as:</p>
<ul>
<li>IMAP: Apple Mail &#8211; Google Apps Mail &amp; Gmail (works great apart from the lack of <a href="http://www.polaine.com/playpen/2008/05/26/apple-mail-folder-subscriptions-and-gmail-imap/" title="Playpen  &raquo; Blog Archive   &raquo; IMAP folder subscriptions with GMail and Apple Mail">Label/Folder IMAP subscription</a>)</li>
<li>Apple Mail&#8217;s Exchange Support: Apple Mail &#8211; Exchange (still requires IMAP to be enabled, which isn&#8217;t always the case)</li>
<li><a href="http://spanningsync.com/" title="Spanning Sync - Sync iCal and Google Calendar">Spanning Sync</a>: Google Calendar/Contacts &#8211; iCal/Address Book</li>
<li>Entourage with Sync Services: Exchange Calendar/Contacts &#8211; iCal/Address Book (issues with multiple exchange accounts)</li>
<li><a href="http://www.nuevasync.com/" title="NuevaSync - Over the Air Synchronization">NuevaSync</a>: Google Calendar &#8211; iPhone (over the air, doesn&#8217;t require cable, yet takes up your only Exchange account on the iPhone)</li>
<li>Active Sync on the iPhone: Exchange &#8211; iPhone (over the air, but only supports one Exchange account at a time)
<li>And so on&#8230;</li>
</ul>
<p>All of these little &#8220;bridges&#8221; spanning the gaps between various applications each have their own small set of problems and limitations which makes this whole sync ecosystem break down.  What&#8217;s worse, is that sometimes, attempting to make this work can have unintended or potentially disastrous consequences (Imagine all your calendar events from one client syncing onto another client&#8217;s Exchange server).</p>
<p>So there&#8217;s the problem, but what is the solution?  For many people, a single Exchange or <a href="http://www.apple.com/mobileme/" title="Apple - MobileMe">Mobile Me</a> account will do the trick, but for me (a consultant using multiple services), it does not.  Sure, there are some glimmers of hope.  Apple is <a href="http://www.apple.com/macosx/snowleopard/" title="Apple - Mac OS X Leopard - Snow Leopard">bolstering their Exchange support</a> in their applications following the introduction of Active Sync to the iPhone.  Sure, there might be a day soon when the iPhone supports multiple Exchange accounts and can subscribe to <a href="http://lifehacker.com/399366/google-calendar-adds-caldav-support-enabling-ical-sync" title="Google Calendar: Google Calendar Adds CalDAV Support, Enabling iCal Sync">CalDAV on Google</a>.  </p>
<p>These are all patches to a solution that lacks a holistic view of the problem.  Where have we seen this before?  How about a unified login?  <a href="http://openid.net/what/" title="OpenID   &raquo; What is OpenID?">OpenID</a> attempts to solve the real and very present problem of managing separate authentication credentials across the vast ocean of sites requiring registration on the web.  Though it&#8217;s not quite a homerun yet, there&#8217;s progress being made.  Any standard will run into this issue, even <a href="http://www.sitepoint.com/blogs/2008/01/23/ie8-standards-mode-is-opt-in/" title="SitePoint &raquo; IE8 Standards Mode Is Opt-in">HTML</a>.  </p>
<p>The questions here are these: Can we extend this concept of online identity beyond logging into sites?  Can we aggregate our various online presence (including email &amp; calendars) to our one true e-self?  I think the answer is yes, but in time, and I think Apple&#8217;s lowly Address Book application, the humble servant of contact management on the Mac may serve as an example.  You see, in Address Book, there is a particular contact card that is designated as &#8220;Me&#8221;, the current user.  In this contact card, I can add any number of phone numbers, fax numbers, etc., but more importantly I can add multiple email addresses and IM screen names, which all are identified as &#8220;Me&#8221;.  This means that no matter what email address in Apple Mail I use to send or receive email, if it&#8217;s in my &#8220;Me&#8221; card, the system knows it&#8217;s &#8220;Me&#8221;.  I think that this very basic approach can be extended to aggregate online identity at a much higher and more meaningful level, across the various services I might use as a result of my online existence.  Now we just have to agree on what that will look like, and if history has taught us anything, <a href="http://www.internetevolution.com/document.asp?doc_id=162411&amp;print=yes" title="Internet Evolution - The Big Report - One Web, One Web ID">it won&#8217;t happen fast</a>. </p>
<p>Thoughts?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cantinaconsulting.com/2008/12/10/sync-soup-or-another-case-for-unified-online-identity/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
