<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en-US" xml:base="http://opensourcehacker.com/wp-atom.php">
	<title type="text">Open Source Hacker</title>
	<subtitle type="text">Pushing the boundaries of free technology</subtitle>

	<updated>2013-05-16T06:56:25Z</updated>

	<link rel="alternate" type="text/html" href="http://opensourcehacker.com" />
	<id>http://opensourcehacker.com/feed/atom/</id>
	

	<generator uri="http://wordpress.org/" version="3.5.1">WordPress</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/OpenSourceHacker" /><feedburner:info uri="opensourcehacker" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:browserFriendly></feedburner:browserFriendly><entry>
		<author>
			<name>Mikko Ohtamaa</name>
						<uri>http://opensourcehacker.com</uri>
					</author>
		<title type="html"><![CDATA[Putting breakpoints to HTML templates in Python]]></title>
		<link rel="alternate" type="text/html" href="http://opensourcehacker.com/2013/05/16/putting-breakpoints-to-html-templates-in-python/" />
		<id>http://opensourcehacker.com/?p=2802</id>
		<updated>2013-05-16T06:56:25Z</updated>
		<published>2013-05-16T06:50:10Z</published>
		<category scheme="http://opensourcehacker.com" term="html5" /><category scheme="http://opensourcehacker.com" term="plone" /><category scheme="http://opensourcehacker.com" term="python" /><category scheme="http://opensourcehacker.com" term="chamelon" /><category scheme="http://opensourcehacker.com" term="django" /><category scheme="http://opensourcehacker.com" term="ipdb" /><category scheme="http://opensourcehacker.com" term="jinja2" /><category scheme="http://opensourcehacker.com" term="pdb" /><category scheme="http://opensourcehacker.com" term="pudb" /><category scheme="http://opensourcehacker.com" term="pydev" /><category scheme="http://opensourcehacker.com" term="tal" />		<summary type="html"><![CDATA[Python offers many different template engines for web application development to turn your view logic to HTML code on the server and then send the resulting HTML code to a web browser. When you are dealing with complex page templates, &#8230; <a href="http://opensourcehacker.com/2013/05/16/putting-breakpoints-to-html-templates-in-python/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></summary>
		<content type="html" xml:base="http://opensourcehacker.com/2013/05/16/putting-breakpoints-to-html-templates-in-python/"><![CDATA[<p>Python offers <a href="https://pypi.python.org/pypi/Chameleon/">many</a> <a href="https://pypi.python.org/pypi/Jinja2/">different</a> <a href="https://docs.djangoproject.com/en/dev/topics/templates/">template engines</a> for web application development to turn your view logic to HTML code on the server and then send the resulting HTML code to a web browser. When you are dealing with complex page templates, especially when using third party libraries, it often gets confusing what template context variables are available and what they have eaten.  In this case, the best method of debugging is to insert a breakpoint into your page template and inspect the variables in runtime context. This very useful &#8220;advanced&#8221; debugging method is not known to many people, especially if they come from the background where command-line debugging tools have not been the norm.</p>
<p></p><div class='toc tableofcontent'>
   <h2>Table Of Content</h2>
   <p style='font-size:14px; line-height:14px; padding-left:0px;'><a style='color:#000000 ;' href="#Python_debugging">1. Python debugging</a></p>
<p style='font-size:14px; line-height:14px; padding-left:0px;'><a style='color:#000000 ;' href="#Setting_a_breakpoint_in_Django_templates">2. Setting a breakpoint in Django templates</a></p>
<p style='font-size:14px; line-height:14px; padding-left:0px;'><a style='color:#000000 ;' href="#Other_templating_engines">3. Other templating engines</a></p>

</div><div class='tableofcontent-end'> </div><p></p>
<h2 id="Python_debugging">1. Python debugging</h2>
<p>Python offers <a href="http://stackoverflow.com/a/4228643/315168">pdb</a> command-line debugger out of the box. I recommend to use more advanced version <a href="http://pypi.python.org/pypi/ipdb">ipdb</a>, which comes with proper command history, colored tracebacks and tab completion / arrow key support (<a href="http://stackoverflow.com/q/16580234/315168">though there seems to be an issue using ipdb with multithreaded / autoreloading programs</a>). There also exist more GUIful, but still terminal based, <a href="https://pypi.python.org/pypi/pudb">pudb</a>. <a href="http://pydev.org/manual_adv_remote_debugger.html">Eclipse + PyDev offer remote debugging support with full GUI</a>.</p>
<p>Read some<a href="http://stackoverflow.com/a/4228643/315168"> command-line debugging tutorials</a> if you are not familiar with the concept. Especially how to inspect local variables with commands of <a href="http://developer.plone.org/testing_and_debugging/pdb.html#useful-pdb-snippets">locals(), dir(object), for i in dict.items(): print i come to hand</a>.</p>
<h2 id="Setting_a_breakpoint_in_Django_templates">2. Setting a breakpoint in Django templates</h2>
<p>Here is an example how to create a breakpoint tag for Django templates and then go around and debug your templates. In the example, I debug the field rendering look of <a href="https://pypi.python.org/pypi/django-crispy-forms">django-crispy-forms</a>.</p>
<p>First we need to create <a href="https://docs.djangoproject.com/en/dev/howto/custom-template-tags/">a custom Django template tag invoking pdb</a>, because you cannot run arbitrary Python snippets directly from Django templates. <a href="ttp://djangosnippets.org/snippets/1550/">The code here is based on the example on djangosnippets.org</a>.</p>
<p><em>templatetags/debug.py</em></p>
<pre># -*- coding: utf-8 -*-
#
# http://djangosnippets.org/snippets/1550/
#

import pdb as pdb_module

from django.template import Library, Node

register = Library()

class PdbNode(Node):

    def render(self, context):
        pdb_module.set_trace()
        return ''

@register.tag
def pdb(parser, token):
    return PdbNode()</pre>
<p>Then we use this tag our template:</p>
<pre>{% load crispy_forms_field %}
{% load debug %}

{% if field.is_hidden %}
    {{ field }}
{% else %}

    &lt;div&gt;
        &lt;div&gt;
            {{ field.long_help }}
            {% pdb %}
        &lt;/div&gt;
    &lt;/div&gt;
{% endif %}</pre>
<p>We run Django normally with <em>manage.py runserver</em> and encounter this breakpoint when rendering a template.</p>
<p><a href="http://opensourcehacker.com/wp-content/uploads/2013/05/Screen-Shot-2013-05-16-at-9.36.06-AM.png"><img class="alignnone size-full wp-image-2806" alt="Screen Shot 2013-05-16 at 9.36.06 AM" src="http://opensourcehacker.com/wp-content/uploads/2013/05/Screen-Shot-2013-05-16-at-9.36.06-AM.png" width="1300" height="212" /></a></p>
<p>Now we can go around and see what variables are avaialble in the template and what they have eaten.</p>
<pre>(Pdb) locals().keys()
['self', 'context']
(Pdb) context.__class__
&lt;class 'django.template.context.RequestContext'&gt;</pre>
<p>Ok, so we have available template variables in a local variable called context (makes sense, we are now in our <em>templatetag.py</em> code).</p>
<pre>(Pdb) for i in dir(context): print i
...
_reset_dicts
autoescape
current_app
dicts
get
has_key
new
pop
push
render_context
update
use_l10n
use_tz</pre>
<p>There seems to be a way to access all template variables:</p>
<pre>(Pdb) for d in context.dicts: print d.keys()
[]
['csrf_token']
['request']
['perms', 'user']
['debug', 'sql_queries']
['LANGUAGES', 'LANGUAGE_BIDI', 'LANGUAGE_CODE']
['MEDIA_URL']
['STATIC_URL']
['TIME_ZONE']
['messages']
['downtime']
['block']
['flat_attrs', 'inputs', 'csrf_token', 'form_id', 'form_error_title', 
'form_action', 'error_text_inline', 'html5_required', 'help_text_inline', 
'formset_error_title', 'form_style', 'form_method', 'form_show_errors', 
'is_formset', 'form_tag', 'attrs', 'form_attrs', 'form_class']</pre>
<p>Now we can see what come through to our template as the field and widget in the field rendering loop.</p>
<pre>(Pdb) context["field"]
&lt;django.forms.forms.BoundField object at 0x1038ae590&gt;

(Pdb) for i in context["field"].__dict__.items(): print i
('html_initial_name', u'initial-ad-xxx_type')
('form', &lt;xxx.Form object at 0x103064c10&gt;)
('html_name', 'ad-xxx_type')
('html_initial_id', u'initial-ad-id_ad-xxx_type')
('label', u'Foobar')
('field', &lt;django.forms.fields.TypedChoiceField object at 0x103062e50&gt;)
('help_text', '')
('name', 'xxx_type')</pre>
<p>And after you see this, you can figure out if your data is coming through the templating stack and is it coming through correctly and what you need to do in order to bend it to your will.</p>
<h2 id="Other_templating_engines">3. Other templating engines</h2>
<p><a href="http://stackoverflow.com/a/15933953/315168">See also an example for Chameleon templates</a>. Unfortunately <a href="http://stackoverflow.com/q/15922208/315168">Plone, out of the box, cannot support this debugging method due to the security</a>.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;
<p class="signature">
 <a href="http://feeds.feedburner.com/mFabrikWebAndMobileDevelopment" rel="alternate" type="application/rss+xml"><img valign="middle" src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="border:0"/></a> <a href="http://feeds.feedburner.com/OpenSourceHacker" rel="alternate" type="application/rss+xml">Subscribe to this blog in a reader</a> <a href="http://twitter.com/moo9000"> <img valign="middle"  style="border:0" src="http://opensourcehacker.com/wp-content/uploads/twitter-24.png"></a> <a href="http://twitter.com/moo9000">Follow me on Twitter</a> 
 <a href="https://www.facebook.com/pages/Open-Source-Hacker/181710458567630"> <img valign="middle"  style="border:0" src="http://opensourcehacker.com/wp-content/uploads/facebook-24.png"></a> <a href="https://www.facebook.com/pages/Open-Source-Hacker/181710458567630">Follow me on Facebook</a> <a href="https://plus.google.com/103323677227728078543/"><img valign="middle"  style="border:0" src="http://opensourcehacker.com/wp-content/uploads/googleplus.png"></a> <a href="https://plus.google.com/103323677227728078543/">Follow me Google+</a></p>
]]></content>
		<link rel="replies" type="text/html" href="http://opensourcehacker.com/2013/05/16/putting-breakpoints-to-html-templates-in-python/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://opensourcehacker.com/2013/05/16/putting-breakpoints-to-html-templates-in-python/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>Mikko Ohtamaa</name>
						<uri>http://opensourcehacker.com</uri>
					</author>
		<title type="html"><![CDATA[Exporting and sharing Sublime Text configuration]]></title>
		<link rel="alternate" type="text/html" href="http://opensourcehacker.com/2013/05/09/exporting-and-sharing-sublime-text-configuration/" />
		<id>http://opensourcehacker.com/?p=2789</id>
		<updated>2013-05-08T23:06:16Z</updated>
		<published>2013-05-08T22:57:01Z</published>
		<category scheme="http://opensourcehacker.com" term="osx" /><category scheme="http://opensourcehacker.com" term="plone" /><category scheme="http://opensourcehacker.com" term="python" /><category scheme="http://opensourcehacker.com" term="Sublime Text 2" /><category scheme="http://opensourcehacker.com" term="ubuntu" /><category scheme="http://opensourcehacker.com" term="dropbox" /><category scheme="http://opensourcehacker.com" term="eclipse" /><category scheme="http://opensourcehacker.com" term="github" /><category scheme="http://opensourcehacker.com" term="jshint" /><category scheme="http://opensourcehacker.com" term="linux" /><category scheme="http://opensourcehacker.com" term="sublime text 2" />		<summary type="html"><![CDATA[Sublime Text is a very powerful and popular text editor. But it&#8217;s more than a text editor&#8230; it&#8217;s an ecosystem of programmer&#8217;s tools where you can go to armory and choose the winning set for every code you&#8217;ll face. However, &#8230; <a href="http://opensourcehacker.com/2013/05/09/exporting-and-sharing-sublime-text-configuration/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></summary>
		<content type="html" xml:base="http://opensourcehacker.com/2013/05/09/exporting-and-sharing-sublime-text-configuration/"><![CDATA[<p><a href="http://sublimetext.com/">Sublime Text</a> is a very powerful and popular text editor. But it&#8217;s more than a text editor&#8230; it&#8217;s an ecosystem of programmer&#8217;s tools where you can go to armory and choose the winning set for every code you&#8217;ll face. However, entering this ecosystem is long walk; learning all the plugins, tricks and such will take time. In this blog post I&#8217;ll show how more experienced Sublime Text user can share his/her setup with fellow peers still learning Sublime Text. Also, <a href="https://github.com/miohtama/sublime-helper/">I have created a shell script collection which helps copying configurations into a fresh Sublime Text installation</a>.</p>
<p><a href="http://opensourcehacker.com/wp-content/uploads/2013/05/Screen-Shot-2013-05-09-at-1.21.35-AM.png"><img class="alignnone size-full wp-image-2791" alt="Screen Shot 2013-05-09 at 1.21.35 AM" src="http://opensourcehacker.com/wp-content/uploads/2013/05/Screen-Shot-2013-05-09-at-1.21.35-AM.png" width="1204" height="990" /></a></p>
<p><a href="http://opensourcehacker.com/2012/05/11/sublime-text-2-tips-for-python-and-web-developers/">If you are new to Sublime Text 2 read my crash course article</a>. Instructions in this blog post have been tested with Sublime Text 2. Sublime Text 3 is in beta, but it is not recommended yet for every day usage yet as some of the workflow critical plugins have not yet been ported for this version.</p>
<p>Sublime Text configuration mainly consists of following</p>
<ul>
<li><em>Packages/</em> folder where all your installed plugins and setting files lie (shortcut into this available through preferences menu)</li>
<li><em>Packages/User/</em> folder where are the files specific to your configuration (other folders in Packages/ folder are pristine plugin files and should not be directly edited)</li>
<li><em>Packages/User/Preferences.sublime-settings </em>stores the preferences you have changed</li>
<li><em>Packages/User/Package Control.sublime-settings </em>contains<em> </em>the list of installed addons</li>
</ul>
<h2 id="Configuration_files_needing_copying">1. Configuration files needing copying</h2>
<p>To transfer your Sublime Text configuration to fellow user you only need to copy</p>
<ul>
<li><em>Packages/User/Preferences.sublime-settings </em>for settings<em>
</em></li>
<li><a href="http://stackoverflow.com/a/16414529/315168"><em>Packages/User/Package Control.sublime-settings</em> for list of plugins</a></li>
<li>Other configuration files (shortcut keys, SFTP server configs, etc.) could be transferred, but they are not critical or may contain sensitive information</li>
</ul>
<p>It is not safe to copy plugins as is between environments, as plugins may contain operating system or computer specific dependencies. It&#8217;s better to copy <em>Package Control.sublime-settings</em> file only. On the next Sublime Text start up Package Control will automatically read the list of packages from this file and install any missing packages from Github.</p>
<p>Manually installed packages, those not through Package Control, must be installed by hand on the target computer.</p>
<p><a href="http://opensourcehacker.com/2012/05/24/sync-and-back-up-sublime-text-settings-and-plug-ins-using-dropbox-on-linux-and-osx/">For personal backup purposes you can sync Sublime Text configuration using Dropbox</a>.</p>
<h2 id="Automated_setups">2. Automated setups</h2>
<p>I have created a <a href="https://github.com/miohtama/sublime-helper/">sublime-helper, a collection of shell scripts, which will help copying Sublime Text configurations (hosted on Github).</a> It comes with <a href="https://github.com/miohtama/sublime-helper/blob/master/Preferences.sublime-settings">my own configuration</a> and <a href="https://github.com/miohtama/sublime-helper/blob/master/Package%20Control.sublime-settings">package list</a>; please free to clone and do whatever you want it with to make your and your peers&#8217; workflow smooth.</p>
<p>The script will also setup <em>subl</em> shell alias to open Sublime Text from command line. Also, your UNIX <em>EDITOR</em> environment variable will point to special <em>subl-wrapper-wait-exit</em> command which integrates Sublime Text for <em>git</em> and <em><span style="text-decoration: underline;">svn</span></em> commit message editing.</p>
<p>I tested the script by transferring my Sublime Text 2 configuration from OSX to Ubuntu Linux. A person new to Sublime Text was able to configure the editor and grasp some basics in 5 minutes. After seeing <a href="https://github.com/SublimeLinter/SublimeLinter">SublimeLinter</a> <a href="http://jshint.com">jshint</a> warning highlighting and <a href="https://github.com/jdc0589/JsFormat">JsFormat </a>plugins the test person reaction was: &#8220;Oh my god, oh my god, oh my god.&#8221;</p>
<p>I think he is not switching back to Aptana + Eclipse.</p>
<p><a href="http://opensourcehacker.com/wp-content/uploads/2013/05/Screen-Shot-2013-05-09-at-1.47.51-AM.png"><img class="alignnone size-full wp-image-2792" alt="Screen Shot 2013-05-09 at 1.47.51 AM" src="http://opensourcehacker.com/wp-content/uploads/2013/05/Screen-Shot-2013-05-09-at-1.47.51-AM.png" width="1244" height="488" /></a></p>
<p>&nbsp;
<p class="signature">
 <a href="http://feeds.feedburner.com/mFabrikWebAndMobileDevelopment" rel="alternate" type="application/rss+xml"><img valign="middle" src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="border:0"/></a> <a href="http://feeds.feedburner.com/OpenSourceHacker" rel="alternate" type="application/rss+xml">Subscribe to this blog in a reader</a> <a href="http://twitter.com/moo9000"> <img valign="middle"  style="border:0" src="http://opensourcehacker.com/wp-content/uploads/twitter-24.png"></a> <a href="http://twitter.com/moo9000">Follow me on Twitter</a> 
 <a href="https://www.facebook.com/pages/Open-Source-Hacker/181710458567630"> <img valign="middle"  style="border:0" src="http://opensourcehacker.com/wp-content/uploads/facebook-24.png"></a> <a href="https://www.facebook.com/pages/Open-Source-Hacker/181710458567630">Follow me on Facebook</a> <a href="https://plus.google.com/103323677227728078543/"><img valign="middle"  style="border:0" src="http://opensourcehacker.com/wp-content/uploads/googleplus.png"></a> <a href="https://plus.google.com/103323677227728078543/">Follow me Google+</a></p>
]]></content>
		<link rel="replies" type="text/html" href="http://opensourcehacker.com/2013/05/09/exporting-and-sharing-sublime-text-configuration/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://opensourcehacker.com/2013/05/09/exporting-and-sharing-sublime-text-configuration/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>Mikko Ohtamaa</name>
						<uri>http://opensourcehacker.com</uri>
					</author>
		<title type="html"><![CDATA[Converting presentation slides to HTML blog post with images]]></title>
		<link rel="alternate" type="text/html" href="http://opensourcehacker.com/2013/05/02/converting-presentation-slides-to-images-and-html-blog-post/" />
		<id>http://opensourcehacker.com/?p=2769</id>
		<updated>2013-05-02T07:24:49Z</updated>
		<published>2013-05-02T07:03:30Z</published>
		<category scheme="http://opensourcehacker.com" term="html5" /><category scheme="http://opensourcehacker.com" term="plone" /><category scheme="http://opensourcehacker.com" term="python" /><category scheme="http://opensourcehacker.com" term="apple keynote" /><category scheme="http://opensourcehacker.com" term="ghostscript" /><category scheme="http://opensourcehacker.com" term="github" /><category scheme="http://opensourcehacker.com" term="google reader" /><category scheme="http://opensourcehacker.com" term="pdf" /><category scheme="http://opensourcehacker.com" term="planet venus" /><category scheme="http://opensourcehacker.com" term="rss" />		<summary type="html"><![CDATA[Here is a Python script to convert a PDF to series of HTML &#60;img&#62; tags with alt texts. It makes the presentation suitable embedded for a blog post and reading on a mobile device and such. The motivation for creating &#8230; <a href="http://opensourcehacker.com/2013/05/02/converting-presentation-slides-to-images-and-html-blog-post/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></summary>
		<content type="html" xml:base="http://opensourcehacker.com/2013/05/02/converting-presentation-slides-to-images-and-html-blog-post/"><![CDATA[<div>
<p class="anchor">Here is a Python script to convert a PDF to series of HTML &lt;img&gt; tags with alt texts. It makes the presentation suitable embedded for a blog post and reading on a mobile device and such.</p>
<div class="anchor"></div>
<div class="anchor"></div>
<p class="anchor">The motivation for creating this script is that services creating embedded slideshow viewers (SlideShare, Speaker Deck) create &lt;iframe&gt; based output that is not RSS reader friendly. For example, <a href="http://intertwingly.net/code/venus/docs/index.html">blog aggregation services</a> and soon defunct Google Reader may strip out the presentations &lt;iframe&gt; from RSS feeds. Also, generated &lt;iframe&gt; viewers are not mobile friendly. If you want to share your slides in a blog post using plain old HTML and images is the most bullet-proof way of doing it.</p>
<div class="anchor"></div>
<div class="anchor"></div>
<p class="anchor">The script also shows the power of Python scripting, when combined with UNIX command line tools like <a href="http://ghostscript.com/">Ghostscript PDF renderer</a> and high availability of ready-made Python libraries from <a href="http://pypi.python.org/">PyPi repository</a>.</p>
<div class="anchor">
<p>Example Workflow:</p>
<ul>
<li>Export presentation from Apple Keynote to PDF file. On Export dialog untick <em>include date</em> and <em>add borders around slides</em>.</li>
<li>Run the script against generated PDF file to convert it to a series of JPEG files and a HTML snippet with &lt;img&gt; tags</li>
<li>Optionally, the scripts adds a full URL prefix to &lt;img src&gt;, so you don&#8217;t need to manually link images to your hosting service absolute URL</li>
<li>Copy-paste generated HTML to your blog post</li>
</ul>
<p>Tested with Apple Keynote exported PDFs, but the approach should work for any PDF content.</p>
<p>See <a href="http://opensourcehacker.com/2013/04/24/meet-plone-the-most-awesome-open-source-community-in-the-world/">example blog post and presentation</a>.</p>
<p><a href="http://opensourcehacker.com/2013/04/24/meet-plone-the-most-awesome-open-source-community-in-the-world/"><img class="alignnone size-full wp-image-2785" alt="slide7" src="http://opensourcehacker.com/wp-content/uploads/2013/05/slide7.jpg" width="620" height="480" /></a></p>
<p>Source code below. <a href="https://github.com/miohtama/pdf-to-html">The full source code with README and usage instructions is available on Github</a>.</p>
<pre class="prettyprint lang-py">"""
    PDF to HTML converter.

"""

import os
import sys

import pyPdf
from pyPdf.pdf import ContentStream
from pyPdf.pdf import TextStringObject

SLIDE_TEMPLATE = u'&lt;p&gt;&lt;img src="{prefix}{src}" alt="{alt}" /&gt;&lt;/p&gt;'

# You can pass Ghostscript binary to the script as an environment variable.
GHOSTSCRIPT = os.environ.get("GHOSTSCRIPT", "gs")

def create_images(src, target, width=620, height=480):
    """ Create series of images from slides.

    http://right-sock.net/linux/better-convert-pdf-to-jpg-using-ghost-script/

    :param src: Source PDF file

    :param target: Target folder
    """

    if target.endswith("/"):
        target = target[0:-1]

    # Generated filenames
    ftemplate = "%(target)s/slide%%d.jpg" % locals()

    # gs binary
    ghostscript = GHOSTSCRIPT

    # Export magic of doing
    # Note: Ghostscript 9.06 crashed for me
    # had to upgrade 9.07
    # This command does magic of anti-aliasing text and settings output JPEG dimensions correctly
    cmd = "%(ghostscript)s -dNOPAUSE -dPDFFitPage -dTextAlphaBits=4 -sDEVICE=jpeg -sOutputFile=%(ftemplate)s -dJPEGQ=80 -dDEVICEWIDTH=%(width)d -dDEVICEHEIGHT=%(height)d  %(src)s -c quit"
    cmd = cmd % locals()  # Apply templating

    if os.system(cmd):
        raise RuntimeError("Command failed: %s" % cmd)

def extract_text(self):
    """ Patched extractText() from pyPdf to put spaces between different text snippets.
    """
    text = u""
    content = self["/Contents"].getObject()
    if not isinstance(content, ContentStream):
        content = ContentStream(content, self.pdf)
    # Note: we check all strings are TextStringObjects.  ByteStringObjects
    # are strings where the byte-&gt;string encoding was unknown, so adding
    # them to the text here would be gibberish.
    for operands, operator in content.operations:
        if operator == "Tj":
            _text = operands[0]
            if isinstance(_text, TextStringObject):
                text += _text
        elif operator == "T*":
            text += "\n"
        elif operator == "'":
            text += "\n"
            _text = operands[0]
            if isinstance(_text, TextStringObject):
                text += operands[0]
        elif operator == '"':
            _text = operands[2]
            if isinstance(_text, TextStringObject):
                text += "\n"
                text += _text
        elif operator == "TJ":
            for i in operands[0]:
                if isinstance(i, TextStringObject):
                    text += i

        if text and not text.endswith(" "):
            text += " "  # Don't let words concatenate

    return text

def scrape_text(src):
    """ Read a PDF file and return plain text of each page.

    http://stackoverflow.com/questions/25665/python-module-for-converting-pdf-to-text

    :return: List of plain text unicode strings
    """

    pages = []

    pdf = pyPdf.PdfFileReader(open(src, "rb"))
    for page in pdf.pages:
        text = extract_text(page)
        pages.append(text)

    return pages

def create_index_html(target, slides, prefix):
    """ Generate HTML code for `&lt;img&gt;` tags.
    """

    out = open(target, "wt")

    print &gt;&gt; out, "&lt;!doctype html&gt;"
    for i in xrange(0, len(slides)):
        alt = slides[i]  # ALT text for this slide
        params = dict(src=u"slide%d.jpg" % (i+1), prefix=prefix, alt=alt)
        line = SLIDE_TEMPLATE.format(**params)
        print &gt;&gt; out, line.encode("utf-8")

    out.close()

def main():
    """ Entry point. """

    if len(sys.argv) &lt; 3:
        sys.exit("Usage: pdf2html.py mypresentation.pdf targetfolder [image path prefix]")

    src = sys.argv[1]
    folder = sys.argv[2]

    if len(sys.argv) &gt; 3:
        prefix = sys.argv[3]
    else:
        prefix = ""

    if not os.path.exists(folder):
        os.makedirs(folder)

    alt_texts = scrape_text(src)

    target_html = os.path.join(folder, "index.html")

    create_index_html(target_html, alt_texts, prefix)

    create_images(src, folder)

if __name__ == "__main__":
    main()</pre>
</div>
<div>
<h1><a class="anchor" href="#installation" name="installation"></a></h1>
</div>
</div>
<p class="signature">
 <a href="http://feeds.feedburner.com/mFabrikWebAndMobileDevelopment" rel="alternate" type="application/rss+xml"><img valign="middle" src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="border:0"/></a> <a href="http://feeds.feedburner.com/OpenSourceHacker" rel="alternate" type="application/rss+xml">Subscribe to this blog in a reader</a> <a href="http://twitter.com/moo9000"> <img valign="middle"  style="border:0" src="http://opensourcehacker.com/wp-content/uploads/twitter-24.png"></a> <a href="http://twitter.com/moo9000">Follow me on Twitter</a> 
 <a href="https://www.facebook.com/pages/Open-Source-Hacker/181710458567630"> <img valign="middle"  style="border:0" src="http://opensourcehacker.com/wp-content/uploads/facebook-24.png"></a> <a href="https://www.facebook.com/pages/Open-Source-Hacker/181710458567630">Follow me on Facebook</a> <a href="https://plus.google.com/103323677227728078543/"><img valign="middle"  style="border:0" src="http://opensourcehacker.com/wp-content/uploads/googleplus.png"></a> <a href="https://plus.google.com/103323677227728078543/">Follow me Google+</a></p>
]]></content>
		<link rel="replies" type="text/html" href="http://opensourcehacker.com/2013/05/02/converting-presentation-slides-to-images-and-html-blog-post/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://opensourcehacker.com/2013/05/02/converting-presentation-slides-to-images-and-html-blog-post/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>Mikko Ohtamaa</name>
						<uri>http://opensourcehacker.com</uri>
					</author>
		<title type="html"><![CDATA[Debug SMTP server one-liner]]></title>
		<link rel="alternate" type="text/html" href="http://opensourcehacker.com/2013/04/26/debug-smtp-server-one-liner/" />
		<id>http://opensourcehacker.com/?p=2763</id>
		<updated>2013-04-26T07:25:20Z</updated>
		<published>2013-04-26T07:25:20Z</published>
		<category scheme="http://opensourcehacker.com" term="plone" /><category scheme="http://opensourcehacker.com" term="python" /><category scheme="http://opensourcehacker.com" term="django" /><category scheme="http://opensourcehacker.com" term="linux" /><category scheme="http://opensourcehacker.com" term="osx" /><category scheme="http://opensourcehacker.com" term="postfix" /><category scheme="http://opensourcehacker.com" term="smtp" /><category scheme="http://opensourcehacker.com" term="smtpd" /><category scheme="http://opensourcehacker.com" term="windows" />		<summary type="html"><![CDATA[If you are doing web development there is often need to emulate and intercept outgoing email. Email delivery is handled by SMTP protocol. Production and staging server have fixed SMTP servers available in their network. However, this is not often &#8230; <a href="http://opensourcehacker.com/2013/04/26/debug-smtp-server-one-liner/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></summary>
		<content type="html" xml:base="http://opensourcehacker.com/2013/04/26/debug-smtp-server-one-liner/"><![CDATA[<p>If you are doing web development there is often need to emulate and intercept outgoing email. Email delivery is handled <a href="http://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol">by SMTP</a> protocol. Production and staging server have fixed SMTP servers available in their network. However, this is not often the case for your development laptop, especially if you tend to do development in different networks (places).</p>
<p>Python comes with simple <a href="http://docs.python.org/2/library/smtpd.html">smtpd</a> module which allows you to run a simple SMTP server easily. When doing email debugging, <em>smtpd</em> has extreme useful <em>DebuggingServer</em> feature making it dump all relayed email to stdout instead of relaying them forward for email delivery. This approach is compatible on all platforms: Windows, OSX and Linux.</p>
<p>Non-root way to run debugging SMTP server. You need to change the SMTP server details in your application settings to localhost:1025:</p>
<pre>python -m smtpd -n -c DebuggingServer localhost:1025</pre>
<p>If you want to bind SMTP port 25 you need to run this as a root:</p>
<pre>sudo python -m smtpd -n -c DebuggingServer localhost:25</pre>
<p>Now, when your application sends email it is printed to terminal running debugging smtpd:</p>
<pre>---------- MESSAGE FOLLOWS ----------
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Subject: [example.com] Confirm your email
From: test@example.com
To: mikko@example.com
Date: Fri, 26 Apr 2013 07:20:34 -0000
Message-ID: &lt;20130426072034.83439.2762@Kohr-Ah.local&gt;
X-Peer: 127.0.0.1

Test output from smtpd
------------ END MESSAGE ------------</pre>
<p>Alternative you can go for a full stack solution and install <a href="http://opensourcehacker.com/2013/03/26/using-postfix-and-free-mandrill-email-service-for-smtp-on-ubuntu-linux-server/">Postfix with external authenticating mail server</a>.</p>
<p>&nbsp;
<p class="signature">
 <a href="http://feeds.feedburner.com/mFabrikWebAndMobileDevelopment" rel="alternate" type="application/rss+xml"><img valign="middle" src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="border:0"/></a> <a href="http://feeds.feedburner.com/OpenSourceHacker" rel="alternate" type="application/rss+xml">Subscribe to this blog in a reader</a> <a href="http://twitter.com/moo9000"> <img valign="middle"  style="border:0" src="http://opensourcehacker.com/wp-content/uploads/twitter-24.png"></a> <a href="http://twitter.com/moo9000">Follow me on Twitter</a> 
 <a href="https://www.facebook.com/pages/Open-Source-Hacker/181710458567630"> <img valign="middle"  style="border:0" src="http://opensourcehacker.com/wp-content/uploads/facebook-24.png"></a> <a href="https://www.facebook.com/pages/Open-Source-Hacker/181710458567630">Follow me on Facebook</a> <a href="https://plus.google.com/103323677227728078543/"><img valign="middle"  style="border:0" src="http://opensourcehacker.com/wp-content/uploads/googleplus.png"></a> <a href="https://plus.google.com/103323677227728078543/">Follow me Google+</a></p>
]]></content>
		<link rel="replies" type="text/html" href="http://opensourcehacker.com/2013/04/26/debug-smtp-server-one-liner/#comments" thr:count="5" />
		<link rel="replies" type="application/atom+xml" href="http://opensourcehacker.com/2013/04/26/debug-smtp-server-one-liner/feed/atom/" thr:count="5" />
		<thr:total>5</thr:total>
	</entry>
		<entry>
		<author>
			<name>Mikko Ohtamaa</name>
						<uri>http://opensourcehacker.com</uri>
					</author>
		<title type="html"><![CDATA[Meet Plone: The most awesome open source community in the world]]></title>
		<link rel="alternate" type="text/html" href="http://opensourcehacker.com/2013/04/24/meet-plone-the-most-awesome-open-source-community-in-the-world/" />
		<id>http://opensourcehacker.com/?p=2755</id>
		<updated>2013-04-24T19:36:29Z</updated>
		<published>2013-04-24T19:36:29Z</published>
		<category scheme="http://opensourcehacker.com" term="plone" /><category scheme="http://opensourcehacker.com" term="world plone day" />		<summary type="html"><![CDATA[This is my World Plone Day 2013 presentation, held in World Plone Day event at University of Jyväskylä. The slides are also available on slideshare.net. The story below.  Subscribe to this blog in a reader Follow me on Twitter Follow &#8230; <a href="http://opensourcehacker.com/2013/04/24/meet-plone-the-most-awesome-open-source-community-in-the-world/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></summary>
		<content type="html" xml:base="http://opensourcehacker.com/2013/04/24/meet-plone-the-most-awesome-open-source-community-in-the-world/"><![CDATA[<p>This is my World Plone Day 2013 presentation, held in World Plone Day event at <a href="https://www.jyu.fi/en">University of Jyväskylä</a>. The slides are also available<a href="http://www.slideshare.net/miohtama/test-19911251"> on slideshare.net</a>.</p>
<p>The story below.</p>
<p class="slide"><img alt="Beauty of the beast Mikko Ohtamaa World Plone Day 2013 Jyv−skyl− " src="http://opensourcehacker.com/wp-content/uploads/wpd2013/slide1.jpg" /></p>
<p class="slide"><img alt="Agenda ! History of Plone ! Psyche of the community ! What it takes to get there " src="http://opensourcehacker.com/wp-content/uploads/wpd2013/slide2.jpg" /></p>
<p class="slide"><img alt="" src="http://opensourcehacker.com/wp-content/uploads/wpd2013/slide3.jpg" /></p>
<p class="slide"><img alt="Oldest living open source CMS* ! Zope 1998 ! Plone 2000 ! Plone Foundation 2004 *) unless claimed otherwise " src="http://opensourcehacker.com/wp-content/uploads/wpd2013/slide4.jpg" /></p>
<p class="slide"><img alt="There is no one on the driverÕs seat The community is an organic mash up of small consulting shops  having beer with public sector IT departments " src="http://opensourcehacker.com/wp-content/uploads/wpd2013/slide5.jpg" /></p>
<p class="slide"><img alt="! Plone Foundation, non-proÞt rights holder ! 240 active or emeritus Foundation members ! 50+ sponsors ! 400 guests in conference Living and kicking " src="http://opensourcehacker.com/wp-content/uploads/wpd2013/slide6.jpg" /></p>
<p class="slide"><img alt="Everybody loves Plone  " src="http://opensourcehacker.com/wp-content/uploads/wpd2013/slide7.jpg" /></p>
<p class="slide"><img alt="(except developers) ( ! ! ) " src="http://opensourcehacker.com/wp-content/uploads/wpd2013/slide8.jpg" /></p>
<p class="slide"><img alt="Plone is famous for ! Python programming language ! Security ! Flexibility ! Not being famous " src="http://opensourcehacker.com/wp-content/uploads/wpd2013/slide9.jpg" /></p>
<p class="slide"><img alt="Byproducts of community ! 274 installed packages ! 255 MB installed source code ! 228 + 890 Github repos " src="http://opensourcehacker.com/wp-content/uploads/wpd2013/slide10.jpg" /></p>
<p class="slide"><img alt="Zope2/Startup/misc/zpasswd.py: Copyright (C) 1999, 2000  Digital Creations, Inc. " src="http://opensourcehacker.com/wp-content/uploads/wpd2013/slide11.jpg" /></p>
<p class="slide"><img alt="Plone has only 1 feature ! There is no thing it cannot do  ! Most advanced plugin system ever written in any programming language ! Most advanced permission, role and sharing system which bends so you donÕt have to " src="http://opensourcehacker.com/wp-content/uploads/wpd2013/slide12.jpg" /></p>
<p class="slide"><img alt="Riding the beast ! Self-organizing community teams ! High degree of automatization and continuous integration ! Enhancement proposals ÒPLIPsÓ " src="http://opensourcehacker.com/wp-content/uploads/wpd2013/slide13.jpg" /></p>
<p class="slide"><img alt="Battle-scarred community ! Old enough to look into a mirror and admit the mistakes of the past ! Most friendly community ! No question goes unanswered ... but you might regret asking ÒWe were young.  We needed the money.Ó " src="http://opensourcehacker.com/wp-content/uploads/wpd2013/slide14.jpg" /></p>
<p class="slide"><img alt="Plone community attracts  most intelligent and interesting people... " src="http://opensourcehacker.com/wp-content/uploads/wpd2013/slide15.jpg" /></p>
<p class="slide"><img alt="...and happens everywhere ! World conference ! 2-4 continental symposiums ! ~10 sprints ! ~10 virtual Tune Ups ! 1 World Plone Day " src="http://opensourcehacker.com/wp-content/uploads/wpd2013/slide16.jpg" /></p>
<p class="slide"><img alt="Unparalleled opportunity for international  co-operation " src="http://opensourcehacker.com/wp-content/uploads/wpd2013/slide17.jpg" /></p>
<p class="slide"><img alt="Not always so easy " src="http://opensourcehacker.com/wp-content/uploads/wpd2013/slide18.jpg" /></p>
<p class="slide"><img alt="Too much Python View Viewlet Manager Viewlets TAL HTML DOM / lxml Diazo XML XSLT Component LookupError WTF ??? Robot Git " src="http://opensourcehacker.com/wp-content/uploads/wpd2013/slide19.jpg" /></p>
<p class="slide"><img alt="... like Finland in Eurovision Popular and well-known " src="http://opensourcehacker.com/wp-content/uploads/wpd2013/slide20.jpg" /></p>
<p class="slide"><img alt="Not a part-time hobby to get to Plone you must go and meet people in strange places " src="http://opensourcehacker.com/wp-content/uploads/wpd2013/slide21.jpg" /></p>
<p class="slide"><img alt="" src="http://opensourcehacker.com/wp-content/uploads/wpd2013/slide22.jpg" /></p>
<p class="slide"><img alt="! Ugliest legacy codebase ! Not having smart enough living person to Þx your bug ! No one caring about us ...still... Even with... " src="http://opensourcehacker.com/wp-content/uploads/wpd2013/slide23.jpg" /></p>
<p class="slide"><img alt="Plone is the best CMS  for medium-large scale organizations with 15+ editors, several subsites and complex workßow needs " src="http://opensourcehacker.com/wp-content/uploads/wpd2013/slide24.jpg" /></p>
<p class="slide"><img alt="Plone rocks like no other community on this planet  " src="http://opensourcehacker.com/wp-content/uploads/wpd2013/slide25.jpg" /></p>
<p class="slide"><img alt="opensourcehacker.com Open Source Hacker mikko@redinnovation.com moo9000 " src="http://opensourcehacker.com/wp-content/uploads/wpd2013/slide26.jpg" /></p>
<p class="signature">
 <a href="http://feeds.feedburner.com/mFabrikWebAndMobileDevelopment" rel="alternate" type="application/rss+xml"><img valign="middle" src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="border:0"/></a> <a href="http://feeds.feedburner.com/OpenSourceHacker" rel="alternate" type="application/rss+xml">Subscribe to this blog in a reader</a> <a href="http://twitter.com/moo9000"> <img valign="middle"  style="border:0" src="http://opensourcehacker.com/wp-content/uploads/twitter-24.png"></a> <a href="http://twitter.com/moo9000">Follow me on Twitter</a> 
 <a href="https://www.facebook.com/pages/Open-Source-Hacker/181710458567630"> <img valign="middle"  style="border:0" src="http://opensourcehacker.com/wp-content/uploads/facebook-24.png"></a> <a href="https://www.facebook.com/pages/Open-Source-Hacker/181710458567630">Follow me on Facebook</a> <a href="https://plus.google.com/103323677227728078543/"><img valign="middle"  style="border:0" src="http://opensourcehacker.com/wp-content/uploads/googleplus.png"></a> <a href="https://plus.google.com/103323677227728078543/">Follow me Google+</a></p>
]]></content>
		<link rel="replies" type="text/html" href="http://opensourcehacker.com/2013/04/24/meet-plone-the-most-awesome-open-source-community-in-the-world/#comments" thr:count="5" />
		<link rel="replies" type="application/atom+xml" href="http://opensourcehacker.com/2013/04/24/meet-plone-the-most-awesome-open-source-community-in-the-world/feed/atom/" thr:count="5" />
		<thr:total>5</thr:total>
	</entry>
		<entry>
		<author>
			<name>Mikko Ohtamaa</name>
						<uri>http://opensourcehacker.com</uri>
					</author>
		<title type="html"><![CDATA[Charming social media icons with Font Awesome and CSS3]]></title>
		<link rel="alternate" type="text/html" href="http://opensourcehacker.com/2013/04/22/charming-social-media-icons-with-font-awesome-and-css3/" />
		<id>http://opensourcehacker.com/?p=2726</id>
		<updated>2013-04-23T06:49:14Z</updated>
		<published>2013-04-22T19:38:29Z</published>
		<category scheme="http://opensourcehacker.com" term="html5" /><category scheme="http://opensourcehacker.com" term="plone" /><category scheme="http://opensourcehacker.com" term="css" /><category scheme="http://opensourcehacker.com" term="facebook" /><category scheme="http://opensourcehacker.com" term="fontawesome" /><category scheme="http://opensourcehacker.com" term="google plus" /><category scheme="http://opensourcehacker.com" term="rss" /><category scheme="http://opensourcehacker.com" term="twitter" /><category scheme="http://opensourcehacker.com" term="twitter bootstrap" />		<summary type="html"><![CDATA[In this blog post I&#8217;ll show you how to create and style social media icons (Facebook, Twitter, Google Plus, etc.) easily for your site using Font Awesome font icons. Font Awesome provides an iconset as a TrueType font, meaning that &#8230; <a href="http://opensourcehacker.com/2013/04/22/charming-social-media-icons-with-font-awesome-and-css3/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></summary>
		<content type="html" xml:base="http://opensourcehacker.com/2013/04/22/charming-social-media-icons-with-font-awesome-and-css3/"><![CDATA[<p>In this blog post I&#8217;ll show you how to create and style social media icons (Facebook, Twitter, Google Plus, etc.) easily for your site using <a href="http://fortawesome.github.io/Font-Awesome/">Font Awesome</a> font icons.</p>
<p>Font Awesome provides an iconset as a TrueType font, meaning that you can render and manipulate icons as you would manipulate text with CSS. Each letter corresponds one icon &#8211; think Microsoft Windows Wingdings fonts. Icon set is large and the theme is webby, so <a href="http://fortawesome.github.io/Font-Awesome/#icons-web-app">you&#8217;ll find an icon for all your website needs</a>.</p>
<p>Font Awesome goes down well with popular <a href="http://twitter.github.com/bootstrap/">Twitter Bootstrap CSS &amp; JS </a>library as it has  compatible HTML5 markup and icon naming conventions, though it can be used separately too.</p>
<p><a href="http://miohtama.github.io/FontAwesome-and-Bootstrap-social-icons-example/"><img class="alignnone size-full wp-image-2727" alt="Screen Shot 2013-04-22 at 9.53.26 PM" src="http://opensourcehacker.com/wp-content/uploads/2013/04/Screen-Shot-2013-04-22-at-9.53.26-PM.png" width="716" height="160" /></a></p>
<p>Update: <a href="http://superuser.com/questions/354006/google-chrome-never-renders-fonts-properly-no-smoothing-etc">heard that there is might be an issue with Microsoft Windows and Google Chrome to render these icons</a>. I am seeing if there is a workaround for that and what triggers the condition. Font Awesome has subpixel hinting and should <a href="http://fortawesome.github.io/Font-Awesome/?v=3.0.0">be pixel perfect at 14 px</a>. I&#8217;ll post more info when I have time to further take a look on this issue.</p>
<h2 id="Why_to_use_it?">1. Why to use it?</h2>
<p>Approach presented here is simply superior to any other approach.</p>
<p>Pros</p>
<ul>
<li>Colors can be adjusted with CSS3, with gradients and all that bling bling</li>
<li>Scalable graphics</li>
<li>High DPI (&#8220;retina&#8221;) compatible</li>
<li>Simple HTML markup: just <em>&lt;i class=&#8221;icon icon-foo&#8221;&gt;&lt;/i&gt;</em>. No CSS sprite preprocessing or other workflow complications needed.</li>
<li>Can be animated with CSS3 transitions</li>
<li>Easily match the link text color for monotone icons</li>
<li><a href="https://github.com/miohtama/FontAwesome-and-Bootstrap-social-icons-example/">FontAwesome can be served from CDN</a> &#8211; no need to drop any files on your hosting as bootstrapcdn.com content delivery network hosts the files for you</li>
<li>Works with legacy browsers (IE7+)</li>
</ul>
<p>Cons</p>
<ul>
<li>These icons might not be exactly in the line with the brand guidelines of the service. But these guidelines are mostly guidelining, feel free to ignore them like the other 100000+ websites out there do.</li>
<li>Pixel pushing artists become sad</li>
<li>Does not work outside browser context: email, RSS</li>
</ul>
<h2 id="Example">2. Example</h2>
<p>Below you see a live <em>&lt;iframe&gt;</em> example. The example tries to be straightforward: you could further make icons look better by e.g. fine-tuning border style and using gradients instead of plain color backgrounds.</p>
<p><a href="https://github.com/miohtama/FontAwesome-and-Bootstrap-social-icons-example/">See source code on Github</a>.</p>
<p><iframe src="http://miohtama.github.io/FontAwesome-and-Bootstrap-social-icons-example/" height="200" width="660"></iframe></p>
<p>Source code: HTML (for the latest version please see Github)</p>
<pre class="prettyprint lang-html">  &lt;!doctype html&gt;
  &lt;html&gt;

    &lt;head&gt;

        &lt;!-- Load Bootstrap and FontAwesome CDN'ed from bootstrapcdn.com --&gt;
        &lt;link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/css/bootstrap-combined.no-icons.min.css" rel="stylesheet" /&gt;

        &lt;link href="//netdna.bootstrapcdn.com/font-awesome/3.0.2/css/font-awesome.css" rel="stylesheet" /&gt;

        &lt;link href="style.css" rel="stylesheet" /&gt;

    &lt;/head&gt;
    &lt;body&gt;

        &lt;div class= "container"&gt;

            &lt;h1&gt;&lt;i&gt;&lt;/i&gt;FontAwesome and CSS social icons example&lt;i&gt;&lt;/i&gt;&lt;/h1&gt;

            &lt;p&gt;Social media icons created FontAwesome and styled with CSS3. Example is 100% image free, scalable and high DPI compatible.&lt;/p&gt;

            &lt;div id="social-bar"&gt;
                &lt;a href="https://www.facebook.com/pages/Open-Source-Hacker/181710458567630"&gt;
                    &lt;i&gt;&lt;/i&gt;
                    &lt;span&gt;Facebook&lt;/span&gt;
                &lt;/a&gt;
                &lt;a href="https://twitter.com/moo9000"&gt;
                    &lt;i&gt;&lt;/i&gt;
                    &lt;span&gt;Twitter&lt;/span&gt;
                &lt;/a&gt;
                &lt;a href="https://plus.google.com/103323677227728078543/"&gt;
                    &lt;i&gt;&lt;/i&gt;
                    &lt;span&gt;Google Plus&lt;/span&gt;
                &lt;/a&gt;
                &lt;a href="http://opensourcehacker.com/"&gt;
                    &lt;i&gt;&lt;/i&gt;
                    &lt;span&gt;Blog&lt;/span&gt;
                &lt;/a&gt;
            &lt;/div&gt;

        &lt;/div&gt;

        &lt;script src="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/js/bootstrap.min.js"&gt;&lt;/script&gt;

    &lt;/body&gt;
&lt;/html&gt;</pre>
<p>Source code: CSS (for the latest version please see Github)</p>
<pre class="prettyprint lang-css">.container {
    width: 620px;
}

h1 {
    font-size: 25px;
}

h1 .icon:first-child {
    margin-right: 0.5em;
}

h1 .icon:last-child {
    margin-left: 0.5em;
}

/* Create square icons, white logo on colored background */

#social-bar .icon {
    color: white;
    border-radius: 4px;
    border: 1px solid rgba(128, 128, 128, 0.5);
    min-width: 27px;
    line-height: 27px;
    text-align: center;
}

#social-bar a {
    margin-right: 5px;
    padding: 5px; /* Increase hit rectangle for touch devices */
}

#social-bar a:first-child {
    padding-left: 0;
}

/* Set icon color related to the service */

#social-bar a span {
    margin-left: 5px;
}

#social-bar .icon-rss {
    background: #e5842f;
}

#social-bar .icon-facebook {
    background: #3B5998;
}

#social-bar .icon-twitter {
    background: #00ACED;
}

#social-bar .icon-google-plus {
    background: #E14107;
}

/* Don't underline icon etc. */
#social-bar a:hover {
    text-decoration: none;
}

#social-bar a:hover span {
    text-decoration: underline;
    color: #333333; /* Match icon highlight color */
}

/* Animate mouse hover */
#social-bar a .icon {
   transition: background 0.5s;
}

#social-bar a:hover .icon {
    background: #333333;
    transition: background 0.5s;
}</pre>
<p class="signature">
 <a href="http://feeds.feedburner.com/mFabrikWebAndMobileDevelopment" rel="alternate" type="application/rss+xml"><img valign="middle" src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="border:0"/></a> <a href="http://feeds.feedburner.com/OpenSourceHacker" rel="alternate" type="application/rss+xml">Subscribe to this blog in a reader</a> <a href="http://twitter.com/moo9000"> <img valign="middle"  style="border:0" src="http://opensourcehacker.com/wp-content/uploads/twitter-24.png"></a> <a href="http://twitter.com/moo9000">Follow me on Twitter</a> 
 <a href="https://www.facebook.com/pages/Open-Source-Hacker/181710458567630"> <img valign="middle"  style="border:0" src="http://opensourcehacker.com/wp-content/uploads/facebook-24.png"></a> <a href="https://www.facebook.com/pages/Open-Source-Hacker/181710458567630">Follow me on Facebook</a> <a href="https://plus.google.com/103323677227728078543/"><img valign="middle"  style="border:0" src="http://opensourcehacker.com/wp-content/uploads/googleplus.png"></a> <a href="https://plus.google.com/103323677227728078543/">Follow me Google+</a></p>
]]></content>
		<link rel="replies" type="text/html" href="http://opensourcehacker.com/2013/04/22/charming-social-media-icons-with-font-awesome-and-css3/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://opensourcehacker.com/2013/04/22/charming-social-media-icons-with-font-awesome-and-css3/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>Mikko Ohtamaa</name>
						<uri>http://opensourcehacker.com</uri>
					</author>
		<title type="html"><![CDATA[After migrating old documentation to Sphinx and Github]]></title>
		<link rel="alternate" type="text/html" href="http://opensourcehacker.com/2013/04/14/after-migrating-old-documentation-to-sphinx-and-github/" />
		<id>http://opensourcehacker.com/?p=2720</id>
		<updated>2013-04-14T16:15:12Z</updated>
		<published>2013-04-14T16:14:19Z</published>
		<category scheme="http://opensourcehacker.com" term="plone" />		<summary type="html"><![CDATA[&#160; Updating plone.org: http://plone.org/documentation/manual/developer-manual/ is no more. Deep links like http://plone.org/documentation/manual/developer-manual/foobar are redirected to a special note. &#160;  Subscribe to this blog in a reader Follow me on Twitter Follow me on Facebook Follow me Google+]]></summary>
		<content type="html" xml:base="http://opensourcehacker.com/2013/04/14/after-migrating-old-documentation-to-sphinx-and-github/"><![CDATA[<p>&nbsp;</p>
<p>Updating plone.org:</p>
<p><img class="size-full wp-image-2721 aligncenter" alt="koala" src="http://opensourcehacker.com/wp-content/uploads/2013/04/koala.gif" width="400" height="225" /></p>
<p><a href="http://plone.org/documentation/manual/developer-manual/">http://plone.org/documentation/manual/developer-manual/</a> is no more. Deep links like <a href="http://plone.org/documentation/manual/developer-manual/foobar">http://plone.org/documentation/manual/developer-manual/foobar</a> are redirected to a special note.</p>
<p>&nbsp;
<p class="signature">
 <a href="http://feeds.feedburner.com/mFabrikWebAndMobileDevelopment" rel="alternate" type="application/rss+xml"><img valign="middle" src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="border:0"/></a> <a href="http://feeds.feedburner.com/OpenSourceHacker" rel="alternate" type="application/rss+xml">Subscribe to this blog in a reader</a> <a href="http://twitter.com/moo9000"> <img valign="middle"  style="border:0" src="http://opensourcehacker.com/wp-content/uploads/twitter-24.png"></a> <a href="http://twitter.com/moo9000">Follow me on Twitter</a> 
 <a href="https://www.facebook.com/pages/Open-Source-Hacker/181710458567630"> <img valign="middle"  style="border:0" src="http://opensourcehacker.com/wp-content/uploads/facebook-24.png"></a> <a href="https://www.facebook.com/pages/Open-Source-Hacker/181710458567630">Follow me on Facebook</a> <a href="https://plus.google.com/103323677227728078543/"><img valign="middle"  style="border:0" src="http://opensourcehacker.com/wp-content/uploads/googleplus.png"></a> <a href="https://plus.google.com/103323677227728078543/">Follow me Google+</a></p>
]]></content>
		<link rel="replies" type="text/html" href="http://opensourcehacker.com/2013/04/14/after-migrating-old-documentation-to-sphinx-and-github/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://opensourcehacker.com/2013/04/14/after-migrating-old-documentation-to-sphinx-and-github/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>Mikko Ohtamaa</name>
						<uri>http://opensourcehacker.com</uri>
					</author>
		<title type="html"><![CDATA[PLOG2013 symposium post-mortem]]></title>
		<link rel="alternate" type="text/html" href="http://opensourcehacker.com/2013/04/08/plog2013-symposium-post-mortem/" />
		<id>http://opensourcehacker.com/?p=2702</id>
		<updated>2013-04-08T09:35:00Z</updated>
		<published>2013-04-08T09:35:00Z</published>
		<category scheme="http://opensourcehacker.com" term="plone" /><category scheme="http://opensourcehacker.com" term="sprint" />		<summary type="html"><![CDATA[There was a PLOG2013 symposium in spring 2013, for developers and alike. It was organized by Abstract IT in Italy, on the coast of Mediterranean, in the city of Sorrento. Everybody was wearing a cool T-shirt. The view was astonishing. &#8230; <a href="http://opensourcehacker.com/2013/04/08/plog2013-symposium-post-mortem/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></summary>
		<content type="html" xml:base="http://opensourcehacker.com/2013/04/08/plog2013-symposium-post-mortem/"><![CDATA[<p>There was a <a href="http://www.abstract.it/en/abstract/initiative/plog-2013/">PLOG2013</a> symposium in spring 2013, for developers and alike.</p>
<p>It was organized by <a href="http://abstract.it/">Abstract IT</a> in Italy, on the coast of Mediterranean, in the city of Sorrento.</p>
<p><a href="http://opensourcehacker.com/wp-content/uploads/2013/04/1-IMG_4419.jpg"><img class="alignnone size-full wp-image-2714" alt="1-IMG_4419" src="http://opensourcehacker.com/wp-content/uploads/2013/04/1-IMG_4419.jpg" width="1600" height="940" /></a></p>
<p>Everybody was wearing a cool T-shirt.</p>
<p><a href="http://opensourcehacker.com/wp-content/uploads/2013/04/1-IMG_4375.jpg"><img class="alignnone size-full wp-image-2704" alt="The T-shirt superheroes club annual meeting" src="http://opensourcehacker.com/wp-content/uploads/2013/04/1-IMG_4375.jpg" width="1600" height="1361" /></a></p>
<p>The view was astonishing.</p>
<p><a href="http://opensourcehacker.com/wp-content/uploads/2013/04/1-IMG_4393.jpg"><img class="alignnone size-full wp-image-2709" alt="1-IMG_4393" src="http://opensourcehacker.com/wp-content/uploads/2013/04/1-IMG_4393.jpg" width="1600" height="1200" /></a></p>
<p>The food was healthy and plentiful.</p>
<p><a href="http://opensourcehacker.com/wp-content/uploads/2013/04/1-IMG_4372.jpg"><img class="alignnone size-full wp-image-2703" alt="Lunch is full vegetarian, but tasty nonetheless" src="http://opensourcehacker.com/wp-content/uploads/2013/04/1-IMG_4372.jpg" width="1600" height="1200" /></a></p>
<p>We ate like a hippo.</p>
<p><a href="http://opensourcehacker.com/wp-content/uploads/2013/04/1-IMG_4398.jpg"><img class="alignnone size-full wp-image-2710" alt="1-IMG_4398" src="http://opensourcehacker.com/wp-content/uploads/2013/04/1-IMG_4398.jpg" width="1600" height="1145" /></a></p>
<p>We had to strengthen the hotel WLAN (+3 enhanced router of Wyn).</p>
<p><a href="http://opensourcehacker.com/wp-content/uploads/2013/04/1-IMG_4386.jpg"><img class="alignnone size-full wp-image-2711" alt="1-IMG_4386" src="http://opensourcehacker.com/wp-content/uploads/2013/04/1-IMG_4386.jpg" width="1600" height="1200" /></a></p>
<p>Then we sprinted.</p>
<p><a href="http://opensourcehacker.com/wp-content/uploads/2013/04/1-IMG_44061.jpg"><img class="alignnone size-full wp-image-2706" alt="1-IMG_4406" src="http://opensourcehacker.com/wp-content/uploads/2013/04/1-IMG_44061.jpg" width="1600" height="1200" /></a></p>
<p>We sprinted more.</p>
<p><a href="http://opensourcehacker.com/wp-content/uploads/2013/04/1-IMG_4379.jpg"><img class="alignnone size-full wp-image-2712" alt="1-IMG_4379" src="http://opensourcehacker.com/wp-content/uploads/2013/04/1-IMG_4379.jpg" width="1600" height="838" /></a></p>
<p>We sprinted under a y<a href="https://www.youtube.com/watch?v=phEnpdDusss">ellow lemon tree</a>.</p>
<p><a href="http://opensourcehacker.com/wp-content/uploads/2013/04/1-IMG_4412-001.jpg"><img class="alignnone size-full wp-image-2713" alt="1-IMG_4412-001" src="http://opensourcehacker.com/wp-content/uploads/2013/04/1-IMG_4412-001.jpg" width="1600" height="1200" /></a></p>
<p>We sprinted with attitude.</p>
<p><a href="http://opensourcehacker.com/wp-content/uploads/2013/04/BHK1wJ8CUAAkCPU.jpg_large.jpg"><img class="alignnone size-full wp-image-2715" alt="BHK1wJ8CUAAkCPU.jpg_large" src="http://opensourcehacker.com/wp-content/uploads/2013/04/BHK1wJ8CUAAkCPU.jpg_large.jpg" width="1024" height="1821" /></a></p>
<p>After a day everybody who lacked contributions to the documentation had to swim (no one had to swim!)</p>
<p><a href="http://opensourcehacker.com/wp-content/uploads/2013/04/1-IMG_4409.jpg"><img class="alignnone size-full wp-image-2708" alt="1-IMG_4409" src="http://opensourcehacker.com/wp-content/uploads/2013/04/1-IMG_4409.jpg" width="1600" height="1200" /></a></p>
<p>We were happy and satisfied and then we had a drink.</p>
<p><a href="http://opensourcehacker.com/wp-content/uploads/2013/04/1-IMG_4399.jpg"><img class="alignnone size-full wp-image-2716" alt="1-IMG_4399" src="http://opensourcehacker.com/wp-content/uploads/2013/04/1-IMG_4399.jpg" width="1600" height="1200" /></a></p>
<p>Thank you for wonderful people of AbstractIT for organizing this event and inviting us. We love you all. We will be there next year.
<p class="signature">
 <a href="http://feeds.feedburner.com/mFabrikWebAndMobileDevelopment" rel="alternate" type="application/rss+xml"><img valign="middle" src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="border:0"/></a> <a href="http://feeds.feedburner.com/OpenSourceHacker" rel="alternate" type="application/rss+xml">Subscribe to this blog in a reader</a> <a href="http://twitter.com/moo9000"> <img valign="middle"  style="border:0" src="http://opensourcehacker.com/wp-content/uploads/twitter-24.png"></a> <a href="http://twitter.com/moo9000">Follow me on Twitter</a> 
 <a href="https://www.facebook.com/pages/Open-Source-Hacker/181710458567630"> <img valign="middle"  style="border:0" src="http://opensourcehacker.com/wp-content/uploads/facebook-24.png"></a> <a href="https://www.facebook.com/pages/Open-Source-Hacker/181710458567630">Follow me on Facebook</a> <a href="https://plus.google.com/103323677227728078543/"><img valign="middle"  style="border:0" src="http://opensourcehacker.com/wp-content/uploads/googleplus.png"></a> <a href="https://plus.google.com/103323677227728078543/">Follow me Google+</a></p>
]]></content>
		<link rel="replies" type="text/html" href="http://opensourcehacker.com/2013/04/08/plog2013-symposium-post-mortem/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://opensourcehacker.com/2013/04/08/plog2013-symposium-post-mortem/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>Mikko Ohtamaa</name>
						<uri>http://opensourcehacker.com</uri>
					</author>
		<title type="html"><![CDATA[Write the docs]]></title>
		<link rel="alternate" type="text/html" href="http://opensourcehacker.com/2013/04/05/write-the-docs/" />
		<id>http://opensourcehacker.com/?p=2698</id>
		<updated>2013-04-05T08:54:39Z</updated>
		<published>2013-04-05T08:54:39Z</published>
		<category scheme="http://opensourcehacker.com" term="plone" /><category scheme="http://opensourcehacker.com" term="python" /><category scheme="http://opensourcehacker.com" term="github" /><category scheme="http://opensourcehacker.com" term="pypi" /><category scheme="http://opensourcehacker.com" term="readthedocs" /><category scheme="http://opensourcehacker.com" term="restructured text" /><category scheme="http://opensourcehacker.com" term="sphinx" />		<summary type="html"><![CDATA[Below are my slides for the presentation held in PLOG2013 Plone symposium. It&#8217;s about good software development documentation culture, writing documentation for Python packages and maintaining up-to-date developer documentation in Plone ecosystem. Writing the docs from Mikko Ohtamaa (slideshare.net IFRAME &#8230; <a href="http://opensourcehacker.com/2013/04/05/write-the-docs/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></summary>
		<content type="html" xml:base="http://opensourcehacker.com/2013/04/05/write-the-docs/"><![CDATA[<p>Below are my slides for the presentation held in <a href="http://www.abstract.it/en/abstract/initiative/plog-2013/">PLOG2013</a> <a href="http://plone.org">Plone</a> symposium. It&#8217;s about good software development documentation culture, writing documentation for Python packages and maintaining up-to-date developer documentation in Plone ecosystem.</p>
<p><iframe style="border: 1px solid #CCC; border-width: 1px 1px 0; margin-bottom: 5px;" src="http://www.slideshare.net/slideshow/embed_code/18227923" height="356" width="427" allowfullscreen="" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe></p>
<div style="margin-bottom: 5px;"><strong> <a title="Writing the docs" href="http://www.slideshare.net/miohtama/writing-the-docs" target="_blank">Writing the docs</a> </strong> from <strong><a href="http://www.slideshare.net/miohtama" target="_blank">Mikko Ohtamaa</a></strong></div>
<p>(slideshare.net IFRAME above)</p>
<h2 id="Transcript">1. Transcript</h2>
<p>slideshare.net really screwed up this one.</p>
<p>1. <em>Writing the docs Mikko Ohtamaa PLOG / 2013 Sorrento, Italy</em></p>
<p><em>2. Agenda The culture of good documentation Documenting Python code Documentation tools in Plone</em></p>
<p><em>3. Mikko Ohtamaa moo9000 opensourcehacker.com Open Source 103323677227728078543 Hacker</em></p>
<p><em>4. Am I a bad person If I don’t write documentation</em></p>
<p><em>5. YES.</em></p>
<p><em>6. Peer-driven culture vs. product-driven culture</em></p>
<p><em>7. http://blog.gerv.net/2013/03/why-the-smart-people-leav/</em></p>
<p><em>8. Arch of Doom &amp; i ty Outsourcing lar ess pu in companies start “German breakfast time” Po app using your product h e Tim Story begins with happy peers</em></p>
<p><em>9. “No gaps, no questions needed” documentation is necessary for the project to scale</em></p>
<p><em>10. Don’t worry ☠</em></p>
<p><em>11. How to doc Python README.rst (PyPi, Github, .egg) Sphinx Autodoc readthedocs.org, pythonhosted.org Well-commented unit tests</em></p>
<p><em>12. developer.plone.org ( like stateful readthedocs.org with buildout ) ( like a boss )</em></p>
<p><em>13. Consumers of Plone the project are developers</em></p>
<p><em>14. d.p.org ingredients Body of knowledge Tutorials External package documentation Graveyard of old documentation bil ity sco vera Di</em></p>
<p><em>15. [ developer.plone.org demo ]</em></p>
<p><em>16. Fix your workﬂow Write code Write code ~ write docs Write tests Write tests Write docs</em></p>
<p><em>17. Low-hanging fruits For every blog post you write link it For every stackoverﬂow.com d.p.org question you make link it For every IRC answer you receive write it ust down tio n m nfo rma uts ide I st o head exi ur yo</em></p>
<p><em>18. [ Github inline edit demo ]</em></p>
<p><em>19. Share your slides slideshare.net Link in developer.plone.org</em></p>
<p><em>20. Top-of-the-shelf bottles Theming tutorial Development friendliness out of the box Making Plone itself more dev friendly</em></p>
<p><em>21. moo9000 Open Source Hacker opensourcehacker.com 103323677227728078543 Kiitos</em>
<p class="signature">
 <a href="http://feeds.feedburner.com/mFabrikWebAndMobileDevelopment" rel="alternate" type="application/rss+xml"><img valign="middle" src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="border:0"/></a> <a href="http://feeds.feedburner.com/OpenSourceHacker" rel="alternate" type="application/rss+xml">Subscribe to this blog in a reader</a> <a href="http://twitter.com/moo9000"> <img valign="middle"  style="border:0" src="http://opensourcehacker.com/wp-content/uploads/twitter-24.png"></a> <a href="http://twitter.com/moo9000">Follow me on Twitter</a> 
 <a href="https://www.facebook.com/pages/Open-Source-Hacker/181710458567630"> <img valign="middle"  style="border:0" src="http://opensourcehacker.com/wp-content/uploads/facebook-24.png"></a> <a href="https://www.facebook.com/pages/Open-Source-Hacker/181710458567630">Follow me on Facebook</a> <a href="https://plus.google.com/103323677227728078543/"><img valign="middle"  style="border:0" src="http://opensourcehacker.com/wp-content/uploads/googleplus.png"></a> <a href="https://plus.google.com/103323677227728078543/">Follow me Google+</a></p>
]]></content>
		<link rel="replies" type="text/html" href="http://opensourcehacker.com/2013/04/05/write-the-docs/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://opensourcehacker.com/2013/04/05/write-the-docs/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>Mikko Ohtamaa</name>
						<uri>http://opensourcehacker.com</uri>
					</author>
		<title type="html"><![CDATA[Available for hire: open source hacker]]></title>
		<link rel="alternate" type="text/html" href="http://opensourcehacker.com/2013/04/03/available-for-hire-open-source-hacker/" />
		<id>http://opensourcehacker.com/?p=2685</id>
		<updated>2013-04-03T21:30:06Z</updated>
		<published>2013-04-03T20:56:59Z</published>
		<category scheme="http://opensourcehacker.com" term="plone" /><category scheme="http://opensourcehacker.com" term="python" /><category scheme="http://opensourcehacker.com" term="varnish" /><category scheme="http://opensourcehacker.com" term="fckthisshit" />		<summary type="html"><![CDATA[After having frostbite one too many times whilst working in the Nordic, I am looking forward to new challenges and I will be available for work very soon. If you are looking for a very unique and sought after skill &#8230; <a href="http://opensourcehacker.com/2013/04/03/available-for-hire-open-source-hacker/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></summary>
		<content type="html" xml:base="http://opensourcehacker.com/2013/04/03/available-for-hire-open-source-hacker/"><![CDATA[<p>After having frostbite one too many times whilst working in the Nordic, I am looking forward to new challenges and I will be available for work very soon. If you are looking for a very unique and sought after skill set for your organization, then now is your one million dollar chance.</p>
<p><a href="http://opensourcehacker.com/wp-content/uploads/2013/04/for_hire1.jpg"><img class="alignnone size-full wp-image-2690" alt="for_hire" src="http://opensourcehacker.com/wp-content/uploads/2013/04/for_hire1.jpg" width="751" height="563" /></a></p>
<p>I have been programming since I was nine. I have been involved in web development since 1995 and mobile development since 1999 &#8211; when the first content services hit the mobile phones (ring tones were the in thing at the time). I have a M.Sc. in industrial engineering and management; I have been running my own consultancy business since 2007 and I have been a significant contributor to the open source community since 2000 &#8211; if you are a reader of this blog you may already be aware of my reputation in the communities surrounding <a href="http://opensourcehacker.com/2012/10/02/pycon-finland-is-almost-there-and-here-is-why-you-should-register-now/">Python</a>, <a href="http://opensourcehacker.com/?s=javascript&amp;submit=Search">JavaScript</a> and <a href="http://plone.org/news/2010-plone-irc-superstars-results">Plone CMS</a> technologies. My articles are regularly published on <a href="http://architects.dzone.com/articles/dev-week-mikko-ohtamaa">DZone.com</a>.</p>
<p>Here is some more of my track record: <a href="http://twitter.com/moo9000">Twitter</a>, <a href="http://linkedin.com/in/ohtis">LinkedIn</a>, <a href="https://github.com/miohtama">Github</a>, <a href="http://stackoverflow.com/users/315168/mikko-ohtamaa">Stackoverflow</a>, <a href="https://bugs.launchpad.net/%7Emikko-red-innovation">Ubuntu</a>, <a href="https://bugzilla.mozilla.org/buglist.cgi?order=Importance&amp;emailreporter1=1&amp;resolution=---&amp;resolution=FIXED&amp;resolution=INVALID&amp;resolution=WONTFIX&amp;resolution=DUPLICATE&amp;resolution=WORKSFORME&amp;resolution=INCOMPLETE&amp;resolution=SUPPORT&amp;resolution=EXPIRED&amp;emailtype1=exact&amp;query_format=advanced&amp;emailassigned_to1=1&amp;bug_status=UNCONFIRMED&amp;bug_status=NEW&amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;bug_status=RESOLVED&amp;bug_status=VERIFIED&amp;bug_status=CLOSED&amp;email1=mikko%40redinnovation.com">Mozilla</a>, <a href="http://opensourcehacker.com/references-cv-resume/plone.org/author/miohtama">Plone</a>, <a href="http://opensourcehacker.com/?s=python&amp;submit=Search">Python</a>, <a href="http://www.remword.com/kps_result/2.6.28_ftc.html">Linux kernel</a>.</p>
<p>Business is good; I really have no other reason to quit besides the fact that I want to move forward in my life and build bigger things for which I can take ownership over and leave my mark on. The unfortunate foundation of consultancy business is that if you are not a part of the solution prolonging the problem will make you more money; but the money can only motivate a person up to a certain point.</p>
<p>I am hoping to find a position in which I can utilize my strong ties to the open source technology communities with my management and leadership background. A dream fit would be a function like a CEO or CTO in an internet-oriented startup. Roles as a developer advocate, a community manager, a quality manager or a DevOps lead are all very appealing too.</p>
<p>I am competent programming in a dozen languages. If you are looking for senior programmer or architect I can undertake this kind of purely technical role with ease; however, in such a position your organization would only partially benefit from my business knowledge and contact network. I’m open to this but I could easily point you to other tech-sawy persons who would be better suited to this purpose. If the position that you have in mind is somewhat special and it requires a business mind geared for making money I’m interested. If you require an extraordinary &#8220;hacker&#8221; I might also be interested.</p>
<p>I am looking to relocate somewhere in the world south of Helsinki. I prefer locations with a tropical climate.</p>
<p>My CV is available upon a request. Please contact me via email <a href="mailto:mikko@opensourcehacker.com">mikko@opensourcehacker.com</a>.</p>
<p>Thank you everybody for following this blog. After the first chapter in the new quest has begun, the beers are on me.
<p class="signature">
 <a href="http://feeds.feedburner.com/mFabrikWebAndMobileDevelopment" rel="alternate" type="application/rss+xml"><img valign="middle" src="http://www.feedburner.com/fb/images/pub/feed-icon16x16.png" alt="" style="border:0"/></a> <a href="http://feeds.feedburner.com/OpenSourceHacker" rel="alternate" type="application/rss+xml">Subscribe to this blog in a reader</a> <a href="http://twitter.com/moo9000"> <img valign="middle"  style="border:0" src="http://opensourcehacker.com/wp-content/uploads/twitter-24.png"></a> <a href="http://twitter.com/moo9000">Follow me on Twitter</a> 
 <a href="https://www.facebook.com/pages/Open-Source-Hacker/181710458567630"> <img valign="middle"  style="border:0" src="http://opensourcehacker.com/wp-content/uploads/facebook-24.png"></a> <a href="https://www.facebook.com/pages/Open-Source-Hacker/181710458567630">Follow me on Facebook</a> <a href="https://plus.google.com/103323677227728078543/"><img valign="middle"  style="border:0" src="http://opensourcehacker.com/wp-content/uploads/googleplus.png"></a> <a href="https://plus.google.com/103323677227728078543/">Follow me Google+</a></p>
]]></content>
		<link rel="replies" type="text/html" href="http://opensourcehacker.com/2013/04/03/available-for-hire-open-source-hacker/#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://opensourcehacker.com/2013/04/03/available-for-hire-open-source-hacker/feed/atom/" thr:count="1" />
		<thr:total>1</thr:total>
	</entry>
	</feed>
