<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6068163282126598626</id><updated>2012-02-16T05:06:07.508-08:00</updated><category term='google+'/><category term='google+ Windows desktop gadget .NET'/><category term='disaster'/><category term='google+ circles'/><category term='javascript'/><category term='api'/><category term='ajax'/><title type='text'>Duct Tape Programmer</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>32</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6068163282126598626.post-4619898041630739048</id><published>2011-12-07T05:08:00.001-08:00</published><updated>2011-12-07T05:18:58.966-08:00</updated><title type='text'>Google+ Changed, G+7 Had To Be Fixed</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-myNQ90KuzrE/Tt9nAzIdQuI/AAAAAAAABWE/nhOuWsgq_8Y/s1600/gp7.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-myNQ90KuzrE/Tt9nAzIdQuI/AAAAAAAABWE/nhOuWsgq_8Y/s1600/gp7.png" /&gt;&lt;/a&gt;&lt;/div&gt;I have noticed a couple of days ago, that very important functionality in the &lt;a href="http://www.kalamonsoft.com/gp7"&gt;G+7 desktop gadget&lt;/a&gt; stopped working. You could no longer view and add comments, add +1s or share.&lt;br /&gt;&lt;br /&gt;Some investigation revealed that Google changed they way they handle dynamic content of Google+. It was a pretty nasty change, as the initial data is no longer included in the page content as a static table, but dynamically created in parts, using Javascript. This made my &lt;a href="http://ducttapeprogrammer.blogspot.com/2011/10/using-google-api-real-one-not-official.html"&gt;post about parsing Google+ post pages&lt;/a&gt; obsolete. As well as broke G+7.&lt;br /&gt;&lt;br /&gt;Fortunately, I managed to reverse-engineer what Google does yet again and prepared version 1.8 of G+7 that brings back the missing functionality.&lt;br /&gt;&lt;br /&gt;Go &lt;a href="http://www.kalamonsoft.com/gp7"&gt;here&lt;/a&gt; to download it and enjoy.&lt;br /&gt;&lt;br /&gt;I am going to prepare a blog post soon, outlining what Google is doing now on their Google+ pages and how you can parse the new format of the data.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6068163282126598626-4619898041630739048?l=ducttapeprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/4619898041630739048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/12/google-changed-g7-had-to-be-fixed.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/4619898041630739048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/4619898041630739048'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/12/google-changed-g7-had-to-be-fixed.html' title='Google+ Changed, G+7 Had To Be Fixed'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-myNQ90KuzrE/Tt9nAzIdQuI/AAAAAAAABWE/nhOuWsgq_8Y/s72-c/gp7.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6068163282126598626.post-367759949583113607</id><published>2011-11-03T14:12:00.000-07:00</published><updated>2011-11-03T14:12:49.762-07:00</updated><title type='text'>Are We Done Yet? Or - Earned Value Calculations in Agile Projects</title><content type='html'>&lt;blockquote class="tr_bq"&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;Don't worry, this is not one of these posts where someone attempts to cram Scrum burn-down charts into waterfall CPI/SPI to satisfy upper management who don't speak agile. This post is going to describe a metric that can be useful to project managers running software projects using agile methodologies. The metric is going to tell you how close to "done" you are in your project. Or more precisely: how close the value delivered by your project so far is to the total expected value of the project.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;I have been using agile software development methodologies for a few years now. One thing always surprised me - while agile has effort tracking figured, described and&amp;nbsp;codified as a set of useful practices, tracking earned value for projects is lacking. Up until recently, it was hard to find any mention of agile value tracking on the internet. These days, some authors write about it, but somehow the subject is not very popular in agile teams.&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;The Confusion&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;I have witnessed time and again that project teams tend to confuse effort spent (or estimated) with value delivered (or promised). What the popular metrics (like agile burn-down charts or traditional CPI/SPI values) &lt;i&gt;do&lt;/i&gt; measure is effort, time and budget spent, and how they compare to the plan. And while very useful, effort metrics are not equivalent to value metrics. Not even close to equivalent to be exact. Why? Quite simple. Sometimes features that are very valuable are not very costly. Sometimes the opposite happens - you are working on something that requires a lot of work, but the return on investment is questionable. In a typical sofware project, a relation of a cost of a feature to its value is vary, very non-linear. Yet, the fallacy of equaling effort spent (or, in other words, sunken cost) to value delivered is very very common.&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Why is knowing the value delivered useful? Well, it lets you decide whether it is worthwhile to continue the project or not. In fact, under normal circumstances, this metric should be &lt;i&gt;the&lt;/i&gt; metric deciding the fate of your project. It is much more important than budget, time and effort overruns: you will want to continue a project that continues to bring you satisfactory amount of value regardless of whether it costs more than you expected or not. And you will want to cancel a worthless project even if it is cheap, because you can redict your people and resources to more promising undertakings.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Value Points&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;To measure value delivered by your project as you keep working on it is to add one more parameter to each of your user stories. The metric is called &lt;b&gt;Value Point (VP)&lt;/b&gt;. Value Point is vary much like a Story Point (used for effort estimation and tracking), in that it is relative. It tells you how the value of a story compares to the value of some other story. Which is useful, because it lets you estimate stories for value using not just concrete financial metrics, but also more fuzzy things (like gut feeling).&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Who assigns the Value Points? The ones responsible for this are project sponsors and any other party that have vested interest in the outcome of the project, can benefit from it, or can provide input for a value of particular story. How is the value points assignment done?&amp;nbsp;&lt;span class="Apple-style-span" style="background-color: white; font-family: sans-serif; font-size: 13px; line-height: 19px;"&gt;th&lt;/span&gt;e simplest way is to use an equivalent of Scrum release and iteration planning poker and calculate the average of VPs assigned by each participant of the planning meeting. A Fibonacci sequence (&lt;span class="Apple-style-span" style="background-color: white; font-family: sans-serif; font-size: 13px; line-height: 19px;"&gt;1, 2, 3, 5, 8, 13, 21, 34, 55, 89...) is used to establish "legal" values.&lt;/span&gt;&amp;nbsp;That is the methodology that is suggested by majority of texts on the subject.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;However, other methods can also be used and are sometimes more adequate. For example, there is nothing sacred about using Fibonacci sequence here. You can use a continuum of values, fractional values, span many orders of magnitudes (this is a no-no for Story Point-based effort planning, but for value estimations, it is not uncommon to be able to tell with confidence that something is 200x more valuable then something else in the same project). Best of all, as long as the decision-making team is stable, you don't really need to reach any sort of a consensus and to pick an average Value Points number. Instead, you can just calculate a total out of everybody's assigned Value Points and use this as a final VP number for a story (in contrast to this, in effort planning, a consensus is absolutely required)&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;What Are Value Points Good For?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;After you assigned value points to stories in your project, you are able to provide very useful metrics to the project management team&lt;/div&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;is the project still delivering as much value as it did when we first started it?&amp;nbsp;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;If the value stream dropped, is the value being delivered high enough to justify continuing the project?&lt;/li&gt;&lt;li style="text-align: justify;"&gt;what is the percentage of "very valuable but easy to implement" features? To establish that, you pick stories that have high VP metrics and low Story Point metrics&lt;/li&gt;&lt;li style="text-align: justify;"&gt;what is the percentage of "not very valuable but hard to implement" features? If you have stories like that, you may want to consider dropping them (or maybe postponing until they become more valuable)&lt;/li&gt;&lt;li style="text-align: justify;"&gt;last but not least: how "done" are you in the project - meaning - what percentage of value points has been completed in the project. Upper management very often craves for this sort of a metric&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6068163282126598626-367759949583113607?l=ducttapeprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/367759949583113607/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/11/are-we-done-yet-or-earned-value.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/367759949583113607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/367759949583113607'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/11/are-we-done-yet-or-earned-value.html' title='Are We Done Yet? Or - Earned Value Calculations in Agile Projects'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6068163282126598626.post-1451941718719463786</id><published>2011-10-24T01:46:00.000-07:00</published><updated>2011-10-24T01:46:48.209-07:00</updated><title type='text'>Want to record your desktop? Try DeskBeam Junior</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;a href="http://2.bp.blogspot.com/-dD_O1mF1rEY/TnjLeK-aK_I/AAAAAAAABPI/SGQKwa4kx1o/s1600/deskbeamlogo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-dD_O1mF1rEY/TnjLeK-aK_I/AAAAAAAABPI/SGQKwa4kx1o/s1600/deskbeamlogo.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Sometimes you just want to scratch that itch.&amp;nbsp; For some time, I have been wondering what would it take to write a screen recording application. For Windows. The existing ones were either too primitive, or too expensive.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;All the freeware recorders that I could find recorded either with lossy compression, which made the resulting video stream look awful (not to mention they dropped frames like crazy at higher video rates, because MP4 compression is CPU intensive), or with no compression at all, which made the recorded files huge (like 1GB per minute huge).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Then there were the "it's free, but" variety: free, but limited redording length (varying from 15 seconds to 5 minutes), free but with watermark added to the video, or free but only work with the vendor's own video sharing web service. None of these was good enough for my liking.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;And last but not least, there are the expensive recorders with all sorts of bells and whistles. Good products, but costly.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I wanted to have something modest and simple (but not primitive), which would be able to capture desktop activity with 100% fidelity, apply a decent compression, so that the recording has sane size and which woudl allow me to perform some basic editing, such as&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;trimming the beginning and the end of the recording&lt;/li&gt;&lt;li&gt;fading in and out&lt;/li&gt;&lt;li&gt; title and credit screens&lt;/li&gt;&lt;li&gt;watermarking&lt;/li&gt;&lt;li&gt;adding background audio&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt; Plus I wanted to be able to compress the result to WMV (remember, we are talking Windows-based recorder here) and upload it to YouTube for the world to see.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The work took me a good while, because the problem turned out to be more difficult than I thought. After I solved the main obstacles of recording the video, all kinds of details to address popped up (there are always problematic details to address, aren't there?).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;But eventually the project was finished. You can download the DeskBeam Junior installer from &lt;a href="http://www.kalamonsoft.com/dbjr"&gt;http://www.kalamonsoft.com/dbjr&lt;/a&gt; and try it out. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Or take a look at some screenshots to whet your appetite&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: 0px; margin-right: 0px; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://www.kalamonsoft.com/images/deskbeamcapture.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="137" src="http://www.kalamonsoft.com/images/deskbeamcapture.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Recorder dialog&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: 0px; margin-right: 0px; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://www.kalamonsoft.com/images/deskbeamplayer.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="189" src="http://www.kalamonsoft.com/images/deskbeamplayer.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Player/editor&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: 0px; margin-right: 0px; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-ap3hiphElHo/TqUkqEu_SMI/AAAAAAAABRA/6GfJuKmVYuo/s1600/mazio.png" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="219" src="http://4.bp.blogspot.com/-ap3hiphElHo/TqUkqEu_SMI/AAAAAAAABRA/6GfJuKmVYuo/s320/mazio.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Compressor&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: 0px; margin-right: 0px; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-mJb1FbgqTxg/TqUlJJX9nwI/AAAAAAAABRI/TIYs38O8b6U/s1600/mazio2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="191" src="http://4.bp.blogspot.com/-mJb1FbgqTxg/TqUlJJX9nwI/AAAAAAAABRI/TIYs38O8b6U/s320/mazio2.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;YouTube uploader&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6068163282126598626-1451941718719463786?l=ducttapeprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/1451941718719463786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/10/want-to-record-your-desktop-try.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/1451941718719463786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/1451941718719463786'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/10/want-to-record-your-desktop-try.html' title='Want to record your desktop? Try DeskBeam Junior'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-dD_O1mF1rEY/TnjLeK-aK_I/AAAAAAAABPI/SGQKwa4kx1o/s72-c/deskbeamlogo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6068163282126598626.post-5023487272822073553</id><published>2011-10-21T03:41:00.000-07:00</published><updated>2011-10-21T03:41:31.867-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='google+'/><category scheme='http://www.blogger.com/atom/ns#' term='api'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><title type='text'>Using Google+ API - The Real One - Part 2. Ajax, Paging and Commenting</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-2vENV7291xU/TphhDua8uXI/AAAAAAAABQ0/lR4zUo8LcQg/s1600/gplus.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/-2vENV7291xU/TphhDua8uXI/AAAAAAAABQ0/lR4zUo8LcQg/s200/gplus.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;In the &lt;a href="http://ducttapeprogrammer.blogspot.com/2011/10/using-google-api-real-one-not-official.html"&gt;first installment&lt;/a&gt; of my blog series about using the &lt;i&gt;real&lt;/i&gt;&amp;nbsp;Google+ API, I have described how to retrieve a Javascript structure, representing messages by parsing a Google+ page source. This was a good introduction, buty there is a better way to retrieve a message stream - by calling Google+ server directly using Ajax calls. This method of communicating with Google+ is better than screen scraping described before, because it allows you to get more than the first page of messages&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;The Message Stream Ajax Call URL&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In order to retrieve a message stream from Google+, perform a HTTP GET request to this URL:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;https://plus.google.com/_/stream/getactivities/?sp=[1,2,null,&lt;b&gt;&lt;span class="Apple-style-span" style="color: #cc0000;"&gt;circleid&lt;/span&gt;&lt;/b&gt;,null,&lt;span class="Apple-style-span" style="color: #cc0000;"&gt;&lt;b&gt;20&lt;/b&gt;&lt;/span&gt;,null,"social.google.com",[]]&amp;amp;rt=j&lt;b&gt;&lt;span class="Apple-style-span" style="color: #cc0000;"&gt;&amp;amp;ct=token&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;In order to overcome the potential problem with caching (Internet Explorer tends to return cached version of the server response instead of actually contacting the server), you will want to append a dummy timestamp parameter to the request, like this:&lt;/div&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;'&amp;amp;_requid=' + new Date().getTime()&lt;/span&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;There are three important parameters of the call, which let you control what gets returned. I have marked these in red color in the URL above.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;The first one - &lt;b&gt;&lt;span class="Apple-style-span" style="color: #cc0000; font-family: 'Courier New', Courier, monospace;"&gt;circleid&lt;/span&gt;&lt;/b&gt; - is the identifier of the circle, from which you want to retrieve the message stream. If you want to retrieve messages from "all circless", set this to &lt;b&gt;&lt;span class="Apple-style-span" style="color: #cc0000; font-family: 'Courier New', Courier, monospace;"&gt;null&lt;/span&gt;&lt;/b&gt;. Otherwise, you will have to know the ID of the circle you want to retrieve messages from. I will show you how to retrieve information about circles in the next installment of this series&lt;/li&gt;&lt;li style="text-align: justify;"&gt;the second parameter in red is the page size. The default is 20 messages, but you can set this to something else, depending on your needs&lt;/li&gt;&lt;li style="text-align: justify;"&gt;the third parameter -&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #cc0000;"&gt;&amp;amp;ct=token&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;- is the "page token" of the page of message stream that you want to retrieve. This is an optional parameter - you should omit it if you want to retrieve the first page. Otherwise, you have to know what the page token of the page that you want to retrieve is. I will describe this in more detail below.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;Retrieving the Message Stream&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Given the URL above, you can execute the following jQuery to retrieve message stream:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;var &lt;b&gt;frontGarbage&lt;/b&gt; = "Invalid JSON: )]}'";&lt;/span&gt;&amp;nbsp;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="background-color: white; font-family: 'Courier New', Courier, monospace; line-height: 22px;"&gt;jQuery.support.cors = true;&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;jQuery.ajax({&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; type: 'GET',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; url: &lt;b&gt;url&lt;/b&gt;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; error: function (xhr, status, error) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (error.indexOf(frontGarbage) == 0) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var &lt;b&gt;response&lt;/b&gt; = jQuery.parseJSON(error.substring(frontGarbage.length));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; });&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Before we dig into what is the content of &lt;b&gt;response&lt;/b&gt;&lt;/span&gt;&amp;nbsp;, I first need to explain two things:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;why is the response retrieved in the &lt;b&gt;error &lt;/b&gt;handler and not in the &lt;b&gt;success &lt;/b&gt;handler of the jQuery Ajax call?&amp;nbsp;&lt;/li&gt;&lt;li&gt;what is &lt;b&gt;frontGarbage&lt;/b&gt;?&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;div style="text-align: justify;"&gt;The answer is - the first is the consequence of the second. Google+ server, in all its wisdom, prefixes the proper JSON response of the message stream (and pretty much of any response that it returns to the callers) with the garbage text. This is probably an attempt to make my life more difficult. As a result of this, jQuery is unable to automagically parse the response as JSON and decides that the server errored. Fortunately, it gives us the full server response in the &lt;b&gt;error&amp;nbsp;&lt;/b&gt;parameter, allowing us to parse the JSON manually&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;Now, on to the &lt;b&gt;response&amp;nbsp;&lt;/b&gt;data. The majority of it, namely &lt;b&gt;response[0][1][1][0]&lt;/b&gt; is the message table containing messages in the exact same format as described in my &lt;a href="http://ducttapeprogrammer.blogspot.com/2011/10/using-google-api-real-one-not-official.html"&gt;previous post&lt;/a&gt;. You can interpret it in the same way, no modifications required.&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;There is an additional important parameter in the response:&amp;nbsp;&lt;b&gt;response[0][1][1][1]&lt;/b&gt;. It is a pretty long string of hexadecimal characters, which constitutes the "next page token" value for a page that you have just retrieved. Which means that if you pass this value as the &lt;b&gt;ct&lt;/b&gt; parameter of the Ajax call's URL, you will get the next page of messages. Curiously, there does not seem to be a "previous page token" anywhere in the response. Which means that you have to remember the already retrieved tokens in some kind of a table, and use the correct one to move back and forth between the message stream pages&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Adding Comment To The Post&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Now let's concentrate on a stuff that is actually absolutely impossible in the current incarnation of the Google+ API. Which is - let's modify something in the message stream, which the official API does not let you do, because it is a read-only API.&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Before we begin - you may be wondering now, why I have described two methods of retrieving a message stream: by screen scraping the HTML page, and by means of an Ajax call. The reason for this is that in order to perform any sort of non-read-only operation, you need to know the &lt;a href="http://en.wikipedia.org/wiki/Cross-site_request_forgery"&gt;XSRF token&lt;/a&gt;. Otherwise, Google+ server will reject the call (and rightfully so - we don't want Google+ to be insecure, do we?). For obvious reasons, the XSRF token cannot be obtained by an Ajax call - it has to be contained on a page. So to get to the token required to modify a message on Google+, you have to do the following:&lt;/div&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;obtain the URL of the message (the&amp;nbsp;&lt;span class="Apple-style-span" style="background-color: white; font-family: 'Courier New', Courier, monospace; line-height: 22px;"&gt;post[21]&lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white; font-family: 'Courier New', Courier, monospace; font-size: 13px; line-height: 22px;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="background-color: white; line-height: 22px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;described inthe previous post contains the URL - you will need to prepend &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;https://plus.google.com&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt; to this value)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="background-color: white; line-height: 22px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;screen-scrape the page to obtain its message data, as described in the previous post&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="background-color: white; line-height: 22px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;the &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;pageData[1][15]&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt; is the XSRF token that you want&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="line-height: 22px;"&gt;After every non-read-only operation, you will hav eto obtain a new XSRF token again. The simplest way to do it is to repeat step 2 and 3. But typically, the next XSRF token is also present in all server responses from state-modifying operations. Identifying these is left as an excercise to the reader (Firebug is your friend here).&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="line-height: 22px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="line-height: 22px;"&gt;Now that we have the required XSRF token, posting a comment to the Google+ message is very easy&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="background-color: white; font-family: 'Courier New', Courier, monospace; line-height: 22px;"&gt;jQuery.support.cors = true;&lt;/span&gt;&amp;nbsp;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;var data = 'itemId=' +&amp;nbsp;&lt;b&gt;postId&lt;/b&gt;&amp;nbsp;+ '&amp;amp;text=' + encodeURIComponent(&lt;b&gt;text&lt;/b&gt;);&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;data = data + '&amp;amp;clientId=os:' + &lt;b&gt;postId&lt;/b&gt; + ':' + new Date().getTime();&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;data = data + '&amp;amp;at=' + encodeURIComponent(&lt;b&gt;xsrf&lt;/b&gt;) + '&amp;amp;'&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;jQuery.ajax({&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; type: 'POST',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; url: 'https://plus.google.com/_/stream/comment/?_requid=' + new Date().getTime() + '&amp;amp;rt=j',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; data: data,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; error: function (xhr, status, error) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (error.indexOf(frontGarbage) == 0) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="Apple-style-span" style="color: #38761d;"&gt;// this is a success&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="Apple-style-span" style="color: #cc0000;"&gt;// this is a failure. You may want to display some error message&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; });&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;The important elements of this code are&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;postId&amp;nbsp;&lt;/b&gt;- this is the post ID described in the previous post. It is contained in the post[8] element of the message structure&lt;/li&gt;&lt;li&gt;&lt;b&gt;text&lt;/b&gt; - this is the text of the comment that you want to post&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;To Be Continued&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In the next installment, I will describe how to:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;retrieve a list of circles&lt;/li&gt;&lt;li&gt;add or remove a +1 to the post&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6068163282126598626-5023487272822073553?l=ducttapeprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/5023487272822073553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/10/using-google-api-real-one-part-2-ajax.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/5023487272822073553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/5023487272822073553'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/10/using-google-api-real-one-part-2-ajax.html' title='Using Google+ API - The Real One - Part 2. Ajax, Paging and Commenting'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-2vENV7291xU/TphhDua8uXI/AAAAAAAABQ0/lR4zUo8LcQg/s72-c/gplus.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6068163282126598626.post-4601625869885335416</id><published>2011-10-17T01:47:00.000-07:00</published><updated>2011-12-07T05:19:17.843-08:00</updated><title type='text'>Using Google+ API - The Real One, Not The Official Ersatz. - Part 1. The Basics</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-2vENV7291xU/TphhDua8uXI/AAAAAAAABQ0/lR4zUo8LcQg/s1600/gplus.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-2vENV7291xU/TphhDua8uXI/AAAAAAAABQ0/lR4zUo8LcQg/s1600/gplus.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="color: #cc0000; font-size: large;"&gt;&lt;b&gt;Important Update&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #cc0000; font-size: large;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cc0000;"&gt;hile This post is now a little bit obsolete, because Google changed the way they render Google+ post pages. I am going to prepare an updated post describing the changes very soon. Meanwhile you can go to my &lt;a href="http://ducttapeprogrammer.blogspot.com/2011/12/google-changed-g7-had-to-be-fixed.html"&gt;announcement post&lt;/a&gt; to grab the latest version of G+7 that fixes the problems that Google's changes caused.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt; &lt;/div&gt;&lt;div style="text-align: justify;"&gt;While working on the &lt;a href="http://www.kalamonsoft.com/gp7"&gt;G+7 Windows Desktop Gadget&lt;/a&gt;, the most difficult problem was retrieving information that I wanted from Google+, and also, updating Google+ with stuff (like adding comments, sharing, +1-ing, etc.). When I started, there was no Google+ API available at all. People all over the world were trying to find some workarounds, but none of them was good enough to be of practical use.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Since then, Google released a first version of &lt;a href="https://developers.google.com/+/api/"&gt;Google+ API&lt;/a&gt;. Unfortunately, in its current incarnation, the API has a very limited functionality. As &lt;a href="https://plus.google.com/110981030061712822816/posts"&gt;Steve Yegge&lt;/a&gt; described it in his &lt;a href="https://plus.google.com/112678702228711889851/posts/eVeouesvaVX"&gt;recent infamous rant&lt;/a&gt;, it is a "Stalker API" - it allows you to learn stuff about a particular person on Google+ - their posts, circles, comments, etc. But it does not let you do any of the stuff you would want to use to implement a proper Google+ application, such as a standalone desktop client, a mobile client, a desktop gadget etc. There is no way to retrieve a stream of activities that you as a Google+ user see when you open &lt;a href="http://plus.google.com/"&gt;http://plus.google.com&lt;/a&gt;. The is no way to comment, share posts, +1 a post or a comment.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I hope this situation changes (Google, are you listening?), but in the meantime, I had to resort to reverse engineering the protocol that Google+ pages &lt;i&gt;actually&lt;/i&gt; use to produce the content that you can see on them. The result of this reverse-engineering efforts will be the subject of the series of blog posts that I am beginning today. I hope to post every second day. I hope that these posts are useful to Google+ developers out there.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Todays post will cover some very important basics, such as data fromats, protocols, etc. Next installments will describe the following topics&lt;/div&gt;&lt;ul&gt;&lt;li&gt;details of authentication&amp;nbsp;&lt;/li&gt;&lt;li&gt;retrieving list of your circles &lt;/li&gt;&lt;li&gt;retrieving message stream for a particular circle&lt;/li&gt;&lt;li&gt;adding +1 to a post&lt;/li&gt;&lt;li&gt;commenting on a post&lt;/li&gt;&lt;li&gt;sharing a post&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;The list above reflects the current functionality of &lt;a href="http://www.kalamonsoft.com/gp7"&gt;G+7&lt;/a&gt; desktop gadget.&amp;nbsp; Which means that it reflects the state of reverse engineering which I am currently at. There is obviously more to Google+ than that, and I suppose over time G+7 will be updated, as soon as I figure out details of of other operations.&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;The Basics - Authentication, Protocols, Data Formats&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Google+ uses Ajax to create pages that you see. What happens when you open &lt;a href="https://plus.google.com/"&gt;https://plus.google.com&lt;/a&gt;&amp;nbsp;(or any other page containing at least one message on Google+) is - in order&lt;/div&gt;&lt;ol&gt;&lt;li&gt;a page with some trivial HTML is loaded and displayed&lt;/li&gt;&lt;li&gt;the page, in addition to HTML, contains a Javascript data structure that encodes the details of the currently logged in user, as well as a first page of the message stream that you see&lt;/li&gt;&lt;li&gt;this structure is read by Javascript code and HTML that displays message stream is dynamically constructed by Javascript&lt;/li&gt;&lt;li&gt;Javascript executes some HTTP GET and HTTP POST calls to Google+ to retrieve additional information and put it on a page&lt;/li&gt;&lt;/ol&gt;The easiest (but not the only) way to start implemeting a Google+ client is get at this first page and retrieve the initial Javascript data structure. For this, you have to&lt;br /&gt;&lt;ol&gt;&lt;li&gt; issue a HTTP GET request to &lt;a href="https://plus.google.com/"&gt;https://plus.google.com&lt;/a&gt; or to a page with one particular message&lt;/li&gt;&lt;li&gt;read in the resulting page&lt;/li&gt;&lt;li&gt;find the part of the page between the string '&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;OZ_initData = &lt;/span&gt;'&amp;nbsp; and '&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;;window.jstiming.load.tick('idp');&lt;/span&gt;'&lt;/li&gt;&lt;li&gt;interpret this substring as a Javascript data structure&lt;/li&gt;&lt;li&gt;use the structure for subsequent operations&lt;/li&gt;&lt;/ol&gt;This is how this can be done using &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt;, like this: &lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;jQuery.support.cors = true; &lt;b style="color: #38761d;"&gt;// this is a secret sauce, which I will describe later&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;jQuery.ajax({&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type: 'GET',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; url: 'https://plus.google.com/?_requid=' + new Date().getTime(),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; success: function (data, status, xhr) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var start = data.indexOf('OZ_initData = ');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var end = data.indexOf(";window.jstiming.load.tick('idp');");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (start &amp;gt; 0 &amp;amp;&amp;amp; end &amp;gt; 0) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; start += 'OZ_initData = '.length;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&lt;span style="color: #990000;"&gt;var pageData&lt;/span&gt;&lt;/b&gt; = jQuery.parseJSON(data.substring(start, end));&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&lt;span style="color: #38761d;"&gt;// ... do stuff with &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="color: #38761d;"&gt;pageData &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;/div&gt;&lt;/blockquote&gt;You may be wondering what's the deal with&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;jQuery.support.cors = true;&lt;/span&gt;. Well, to be frank - it is a hack. The propblem with Ajax support in jQuery is that it only works within a single domain. Which means that only Javascript loaded from a particular web page is able to access URLs belonging to a domain, to which the page belongs. Which means that if you implement a desktop gadget or a desktop client, you are out of luck - jQuery will throw a "No Transport" error at you if you tell it to make an Ajax call to &lt;a href="https://plus.google.com/"&gt;https://plus.google.com&lt;/a&gt;. Unless of course, you force it to behave. The trick was described in &lt;a href="http://blueonionsoftware.com/blog.aspx?p=03aff202-4198-4606-b9d6-686fd13697ee"&gt;this excellent post&lt;/a&gt;. But admittedly, this is a trick and a hack, and if jQuery implementation ever changes, it might not be possible to do this any more&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;b&gt;Side note - Authentication&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;/blockquote&gt;&lt;blockquote style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;As you can see, the data structure that you want to get at is contained now in a &lt;b&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;pageData&lt;/span&gt;&lt;/b&gt; variable. I will describe this data structure in more detail later, but first we must overcome one big hurdle. Namely - in order to be able to view &lt;a href="https://plus.google.com/"&gt;https://plus.google.com&lt;/a&gt;, you need to authenticate. If you are implementing some code that will execute in a browser, in the context of an already logged in user (like a greasemonkey script, browser plugin, or somesuch), there is nothing to be done - you are already authenticated and jQuery will execute its Ajax request with proper credentials. But if you are implementing something like a standalone client - say a .NET desktop client for Google+, you must first retrieve three cookie values, resulting from authenticating to Google+. The names of cookies you want are: &lt;b&gt;SID&lt;/b&gt;,&lt;b&gt; SSID&lt;/b&gt; and &lt;b&gt;HSID&lt;/b&gt;. Then you have to use these cookie values in the&amp;nbsp;&lt;b&gt;Cookie&amp;nbsp;&lt;/b&gt;header of all your HTTP requests.&amp;nbsp;I will cover how to get these cookies in an example .NET application in one of the subsequent posts.&lt;/span&gt;&lt;/blockquote&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;On To The Good Stuff&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The data structure that we retrieved to the &lt;b&gt;pageData&lt;/b&gt; variable&amp;nbsp; has been partially described in an &lt;a href="http://www.reddit.com/r/googleplus/comments/iq21n/getting_the_google_feed_for_any_profile_in_json/"&gt;excellent post&lt;/a&gt; that I used as a reference when implementing G+7. That post took a stab at figuring out the data format. &amp;nbsp;It was a tremendous help, but it missed some less frequently used details. I have discovered some more information in there. Here it goes&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;for a page with a list of posts (like &lt;a href="https://plus.google.com/"&gt;https://plus.google.com&lt;/a&gt; or a page showing a stream from a circle)&lt;/div&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post = pageData[4][0][i] - where i is the post index. There are 20 post in the table&lt;/span&gt;&lt;/blockquote&gt;&amp;nbsp;for a page with a single post (like &lt;a href="https://plus.google.com/104167973823715920379/posts/RYZ6e18xX6n"&gt;this one&lt;/a&gt;)&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post = pageData[20]&lt;/span&gt;&lt;/blockquote&gt;Each &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post &lt;/span&gt;is a huge table (93 entries, each of the cells can have big sub-entries). Details of each &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[3] = poster name &lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[4] = Full HTML text&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[5] = post timestamp&amp;nbsp;(milliseconds since 01.01.1970)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[7] = Comments post&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[7][x][16] = comment author photo.&amp;nbsp;You will want to add a '?sz=16' parameter to shrink the image&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[7][x][6] = comment author ID&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[7][x][1] = comment author name&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[7][x][3] = comment timestamp (milliseconds since 01.01.1970)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[7][x][2] = comment text&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[8] = ID of the post&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[11] = Array of one or more links&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[11][x][3] = Title of link&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[11][x][5][1] = URL of image uploaded&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[11][x][21] = Description of link&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[11][x][24][1] = Linked URL&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[11][x][24][4] = Type: document, image, photo, video&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[11][x][41][0][1] = Thumbnail of image&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[16] = poster ID&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[18] = URL of the poster photo. You will want to add a '?sz=48' parameter to shrink the image&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[21] = Link to Google+ page for the post&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[25] = shares of the post&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[27] = location where the post was made&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[27][10] = a miniature image of Google Maps image of the location, centered at the location coordinates&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[27][3] = name of the location&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[27][8] = Google Maps&amp;nbsp;URL of the location&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[44] = if the post is a share of some other message, the original message author&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[44][0] = original message author name&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[44][1] = original message author ID&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[44][4] = original message author photo URL&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[47] = if the post is a share of some other message, the message accompanying the share&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[73][9] = if you are one of the people who +1d the post, this is set to your name&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[73][16] = number of +1s for the post&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;post[93] = number of comments&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Some potentially useful details for dealing with the information above&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;URLs don't necessarily start with http: or https:. This is ok if you use them from the context of the page you are currently on (e.g., if you are implementing a greasemonkey script). But if you implement a standalone client, you may want to fix these URLs by &amp;nbsp;prepending https: to them before use&lt;/li&gt;&lt;li style="text-align: justify;"&gt;The user mugshot photos come from Picasaweb. As such, they are quite big, but if you append a '&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;?sz=48&lt;/span&gt;' parameter to them , they get resized to 48x48 pixels. This also works for 16x16. I have not tried other sizes, but I suppose they work also&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Other image URLs can come from anywhere. And suppose you want to display them shrinked proportionally, you will need to have a way to do it easily. I found that Google+ uses some internal service to do so, which I also taken the liberty to use. The following Javascript function does the trick:&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;function getSizedImage(imgUrl, size) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; return &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'https://images1-focus-opensocial.googleusercontent.com/gadgets/proxy?url='&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; + encodeURIComponent(imgUrl)&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; + '&amp;amp;container=focus&amp;amp;gadget=a&amp;amp;rewriteMime=image/*&amp;amp;refresh=31536000&amp;amp;resize_w='&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; + size + '&amp;amp;no_expand=1';&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;To Be Continued&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Well, I guess this is enough for today - like I said, the message structure is quite huge and describing it took a lot of space.&lt;br /&gt;&lt;br /&gt;In the next installment, I will describe how to:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;interpret some additional information that can be retrieved using Ajax requests&lt;/li&gt;&lt;li&gt;retrieve the same information as above using Ajax request and not screen-scraping the Google+ web page&lt;/li&gt;&lt;li&gt;display more then one page of messages&amp;nbsp;(20 posts)&amp;nbsp;&lt;/li&gt;&lt;li&gt;comment on a message&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6068163282126598626-4601625869885335416?l=ducttapeprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/4601625869885335416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/10/using-google-api-real-one-not-official.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/4601625869885335416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/4601625869885335416'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/10/using-google-api-real-one-not-official.html' title='Using Google+ API - The Real One, Not The Official Ersatz. - Part 1. The Basics'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-2vENV7291xU/TphhDua8uXI/AAAAAAAABQ0/lR4zUo8LcQg/s72-c/gplus.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6068163282126598626.post-2515037922288590386</id><published>2011-10-13T12:33:00.000-07:00</published><updated>2011-10-14T02:05:11.584-07:00</updated><title type='text'>Sharing posts from G+7 desktop gadget coming your way</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.kalamonsoft.com/images/gp7.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.kalamonsoft.com/images/gp7.png" /&gt;&lt;/a&gt;&lt;/div&gt;As I &lt;a href="http://ducttapeprogrammer.blogspot.com/2011/09/trying-to-implement-sharing-posts-more.html"&gt;promised several times&lt;/a&gt;, after a couple of nights of heavy reverse engineering, I have implemented sharing posts in &lt;a href="http://www.kalamonsoft.com/gp7"&gt;G+7 desktop gadget&lt;/a&gt;. Currently you can share eithe rpublicly, or with one selected circle. I suppose I could add more sharing possibilities if there is enough interest (+1 this post and/or comment if you are interested)&lt;br /&gt;&lt;br /&gt;You can also type in a custom share message&lt;br /&gt;&lt;br /&gt;&lt;strike&gt;The functionality will be available tomorrow, when I release version 1.7.0.0. Stay tuned.&lt;/strike&gt;&lt;br /&gt;&lt;strike&gt;&lt;br /&gt;&lt;/strike&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;UPDATE:&amp;nbsp;&lt;/b&gt;Version 1.7 with support for sharing is avalable.&amp;nbsp;&lt;a href="http://www.kalamonsoft.com/gp7"&gt;Go get it!&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In the meantime, take a look at some screenshots&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-g5caDW-xZZw/Tpc8iCUvhxI/AAAAAAAABQs/G051VCf5sz4/s1600/mazio2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/-m0E2toGWGHU/Tpc8gnsIOYI/AAAAAAAABQk/ac1jrg3RaMU/s1600/mazio.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="259" src="http://2.bp.blogspot.com/-m0E2toGWGHU/Tpc8gnsIOYI/AAAAAAAABQk/ac1jrg3RaMU/s320/mazio.png" width="320" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-g5caDW-xZZw/Tpc8iCUvhxI/AAAAAAAABQs/G051VCf5sz4/s1600/mazio2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="227" src="http://3.bp.blogspot.com/-g5caDW-xZZw/Tpc8iCUvhxI/AAAAAAAABQs/G051VCf5sz4/s320/mazio2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6068163282126598626-2515037922288590386?l=ducttapeprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/2515037922288590386/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/10/sharing-posts-from-g7-desktop-gadget.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/2515037922288590386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/2515037922288590386'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/10/sharing-posts-from-g7-desktop-gadget.html' title='Sharing posts from G+7 desktop gadget coming your way'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-m0E2toGWGHU/Tpc8gnsIOYI/AAAAAAAABQk/ac1jrg3RaMU/s72-c/mazio.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6068163282126598626.post-777829750057443619</id><published>2011-10-11T10:38:00.000-07:00</published><updated>2011-10-11T10:38:34.063-07:00</updated><title type='text'>More on +1 button in G+7</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.kalamonsoft.com/images/gp7.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.kalamonsoft.com/images/gp7.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;So Google must have changed something again, because as of today, the +1 button in &lt;a href="http://www.kalamonsoft.com/gp7"&gt;G+7&lt;/a&gt; works properly again - i.e. it updates its state properly based on refreshed information from Google+. Go figure.&lt;br /&gt;&lt;br /&gt;I will be fixing this tomorrow-ish anyway, because I don't trust Google any more :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Plus I will try to &lt;a href="http://ducttapeprogrammer.blogspot.com/2011/09/trying-to-implement-sharing-posts-more.html"&gt;work some more on sharing posts&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Stay tuned&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6068163282126598626-777829750057443619?l=ducttapeprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/777829750057443619/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/10/more-on-1-button-in-g7.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/777829750057443619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/777829750057443619'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/10/more-on-1-button-in-g7.html' title='More on +1 button in G+7'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6068163282126598626.post-8711924164238349383</id><published>2011-09-28T09:29:00.000-07:00</published><updated>2011-09-28T10:32:47.474-07:00</updated><title type='text'>G+7 - +1 button does immediately update its state after adding +1 to a post</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.kalamonsoft.com/images/gp7.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.kalamonsoft.com/images/gp7.png" /&gt;&lt;/a&gt;&lt;/div&gt;I have just noticed that something changed in the Google+ infrastructure and the +1 button in the &lt;a href="http://www.kalamonsoft.com/gp7"&gt;G+7 desktop gadget&lt;/a&gt; does not properly update its state after adding +1 to a post, because there seems to be a significant delay in propagating the added +1 to the message stream. The +1 does get added, but the button stays white instead of turning blue. Refreshing the message a couple of times fixes things.&lt;br /&gt;&lt;br /&gt;This used to work when I implemented this functionality (the update was immediate), so something must have changed at Google.&lt;br /&gt;&lt;br /&gt;Anyway - fix is coming with version 1.7, which is going to be available very soon (probably after weekend). I am going to:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;add a delay before updating the page&lt;/li&gt;&lt;li&gt;flip the +1 button state manually after update without waiting for the message stream update&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6068163282126598626-8711924164238349383?l=ducttapeprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/8711924164238349383/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/09/g7-1-button-does-immediately-update-its.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/8711924164238349383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/8711924164238349383'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/09/g7-1-button-does-immediately-update-its.html' title='G+7 - +1 button does immediately update its state after adding +1 to a post'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6068163282126598626.post-4499928591712376124</id><published>2011-09-23T00:57:00.000-07:00</published><updated>2011-09-23T00:57:53.388-07:00</updated><title type='text'>G+7 version 1.6 out - authentication problems fixed</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.kalamonsoft.com/images/gp7.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.kalamonsoft.com/images/gp7.png" /&gt;&lt;/a&gt;&lt;/div&gt;Since I removed all .NET components from &lt;a href="http://www.kalamonsoft.com/gp7"&gt;G+7&lt;/a&gt;, I started receiving bug reports from people who could no longer log in to Google+ with my gadget. What was really weird - I was unable to reproduce this on any of my Windows 7 machines, and I have quite a few of these, in all sorts of flavours - 32 bit, 64 bit, on laptops, desktops, workstations, whathaveyou.&lt;br /&gt;&lt;br /&gt;Anyway, the problem started to look serious, as quite a lot of people seemed to have this problem.&lt;br /&gt;&lt;br /&gt;My assumption was that the gadgets share cookies with the Internet Explorer, which the documentation at MSDN seemed to imply (it is not a very good documentation, mid you, there is a lot of guessing involved). So if you logged in to Google+ with Internet Explorer, the gadget gets logged in too.&lt;br /&gt;&lt;br /&gt;Apparently, this is not entirely true, and there are circumstances where the cookies are not shared.&lt;br /&gt;They do seem to always be shared on 32 bit windows. On 64 bit, not quite. I happened to have "Internet Explorer 9 Preview" installed on my 64 bit machine, and it worked. But when I uninstalled it (on a hunch), suddenly I too got locked out of Google+ in my gadget.&lt;br /&gt;&lt;br /&gt;So the question was - what's going on? And most of all - how do I let people log in reliably? After much head-scratching it started to look like the gadget is not exactly tied to Internet Explorer. What it &lt;i&gt;does&amp;nbsp;&lt;/i&gt;get tied to is your .NET platform. So if you run a .NET application that has "Web Browser" control embedded in it, you point this at &lt;a href="http://plus.google.com/"&gt;plus.google.com&lt;/a&gt;&amp;nbsp;and authenticate with it, then the gadget is let in too.&lt;br /&gt;&lt;br /&gt;Well, how weird. But, in absence of useful Google+ API (the current attempt is very very lacking - Google, are you listening?), this is the only way.&lt;br /&gt;&lt;br /&gt;So, I have released &lt;a href="http://www.kalamonsoft.com/gp7"&gt;version 1.6 of the G+7 gadget&lt;/a&gt;, which brings back the .NET based authenticator. It is more lightweight and does not attempt to log you in automatically, but it seems quite reliable.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Try it here:&amp;nbsp;&lt;a href="http://www.kalamonsoft.com/serve?file=gp7/1.6.0.0/gplus7.gadget"&gt;http://www.kalamonsoft.com/serve?file=gp7/1.6.0.0/gplus7.gadget&lt;/a&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6068163282126598626-4499928591712376124?l=ducttapeprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/4499928591712376124/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/09/g7-version-16-out-authentication.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/4499928591712376124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/4499928591712376124'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/09/g7-version-16-out-authentication.html' title='G+7 version 1.6 out - authentication problems fixed'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6068163282126598626.post-447351296292975275</id><published>2011-09-22T01:45:00.000-07:00</published><updated>2011-09-22T01:46:35.246-07:00</updated><title type='text'>Twitter "Tweet" button does not count tweets? You may be doing it wrong :)</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-kwrHexfzyVg/Tnryn0edaQI/AAAAAAAABPU/EEnny0AX_Gs/s1600/mazio.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="170" src="http://1.bp.blogspot.com/-kwrHexfzyVg/Tnryn0edaQI/AAAAAAAABPU/EEnny0AX_Gs/s320/mazio.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Some time ago, I decided to add the Twitter &lt;a href="http://twitter.com/about/resources/tweetbutton"&gt;"Tweet" button&lt;/a&gt; to subpages of &lt;a href="http://kalamonsoft.com/"&gt;kalamonsoft.com&lt;/a&gt;, so that you could share your feelings about the software I make. The problem was - the button was not counting tweets. Now, it &lt;i&gt;could&lt;/i&gt; mean that nobody cares to share their opinion about my products on Twitter, but it was unlikely, as Facebook and Google+ counters did go up.&lt;br /&gt;&lt;br /&gt;Searching google did not help at all. I was just about to give up on this button, but I found this Twitter &lt;a href="https://dev.twitter.com/discussions/1722"&gt;development discussions place&lt;/a&gt;, where you could ask questions and hopefully somebody listens. So I asked my question, and lo and behold, &lt;a href="http://twitter.com/#%21/episod"&gt;@episod&lt;/a&gt; answered (praise this guy).&lt;br /&gt;&lt;br /&gt;The problem was - in order for the button to work, the HTTP HEAD request has to be properly handled by your site. Now, for most of the self-hosted sites this is not a problem as web servers have this built-in. But I am hosting my site on &lt;a href="http://appengine.google.com/"&gt;Google App Engine&lt;/a&gt;, and the site is implemented in Python. I am providing handlers to HTTP requests by overriding some methods of the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;webapp.RequestHandler&lt;/span&gt; class. Typically only the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;get()&lt;/span&gt; or &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;post()&lt;/span&gt; method is overriden. Which makes HTTP HEAD not work - an error is returned and the twitter button does not like this.&lt;br /&gt;&lt;br /&gt;After I added a trivial &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;head()&lt;/span&gt; method override, the twitter button immediately started to work.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;So, if you want the twitter button to work on your site, remember to handle HEAD requests properly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6068163282126598626-447351296292975275?l=ducttapeprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/447351296292975275/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/09/twitter-share-button-does-not-count.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/447351296292975275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/447351296292975275'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/09/twitter-share-button-does-not-count.html' title='Twitter &quot;Tweet&quot; button does not count tweets? You may be doing it wrong :)'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-kwrHexfzyVg/Tnryn0edaQI/AAAAAAAABPU/EEnny0AX_Gs/s72-c/mazio.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6068163282126598626.post-5853252014125831431</id><published>2011-09-20T10:32:00.000-07:00</published><updated>2011-09-20T10:32:40.341-07:00</updated><title type='text'>DeskBeam Junior screencasting app - new version available</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-dD_O1mF1rEY/TnjLeK-aK_I/AAAAAAAABPI/SGQKwa4kx1o/s1600/deskbeamlogo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-dD_O1mF1rEY/TnjLeK-aK_I/AAAAAAAABPI/SGQKwa4kx1o/s1600/deskbeamlogo.png" /&gt;&lt;/a&gt;&lt;/div&gt;Today I have released new early access preview version (0.9.3) of &lt;a href="http://www.kalamonsoft.com/dbjr"&gt;DeskBeam Junior&lt;/a&gt; screencasting application. This version is pretty close to what the actual final 1.0 release will look like. There are a couple of minor bugs with background audio trimming left, but they don't affect final (WMV-compressed) capture files.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The big features of this EAP are&lt;br /&gt;&lt;ul&gt;&lt;li&gt;screencasting and screen captures from secondary monitors&lt;/li&gt;&lt;li&gt;fixes for captures at increased DPI sizes (important for folks with bad eyesight :)) &lt;/li&gt;&lt;li&gt;autoupdate fixes &lt;/li&gt;&lt;li&gt;a bunch of other bugfixes&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-xqFoFXq4heE/TnjNPPD09dI/AAAAAAAABPM/LoP9-oZ-hdM/s1600/mazio.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="226" src="http://3.bp.blogspot.com/-xqFoFXq4heE/TnjNPPD09dI/AAAAAAAABPM/LoP9-oZ-hdM/s320/mazio.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;As you can see, visually not much changed, other than the addition of the monitor selection dropdown. But there is quite a lot going on under the hood.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-h9k0a_9Kht8/TnjN7jb-saI/AAAAAAAABPQ/Hu78jQg29mE/s1600/mazio.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="207" src="http://4.bp.blogspot.com/-h9k0a_9Kht8/TnjN7jb-saI/AAAAAAAABPQ/Hu78jQg29mE/s320/mazio.png" width="320" /&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;I have also added a "welcome" message in the player. Not a big deal, just a cosmetic change.&lt;/div&gt;&lt;br /&gt;&lt;b&gt;As usual, you can download new DeskBeam Junior version from &lt;a href="http://www.kalamonsoft.com/dbjrdownload"&gt;here&lt;/a&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6068163282126598626-5853252014125831431?l=ducttapeprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/5853252014125831431/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/09/deskbeam-junior-screencasting-app-new.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/5853252014125831431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/5853252014125831431'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/09/deskbeam-junior-screencasting-app-new.html' title='DeskBeam Junior screencasting app - new version available'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-dD_O1mF1rEY/TnjLeK-aK_I/AAAAAAAABPI/SGQKwa4kx1o/s72-c/deskbeamlogo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6068163282126598626.post-4267870316755971221</id><published>2011-09-19T03:03:00.000-07:00</published><updated>2011-10-12T13:43:24.204-07:00</updated><title type='text'>Trying to implement sharing posts - more fun reverse-engineering Google+</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.kalamonsoft.com/images/gp7.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.kalamonsoft.com/images/gp7.png" /&gt;&lt;/a&gt;&lt;/div&gt;As promised in my &lt;a href="http://ducttapeprogrammer.blogspot.com/2011/09/1-button-in-g7-strikes-back.html"&gt;previous post&lt;/a&gt;, I have just released &lt;a href="http://www.kalamonsoft.com/gp7"&gt;G+7&lt;/a&gt; version 1.5, which supports adding +1s to posts.&lt;br /&gt;&lt;br /&gt;With this out of the way, I am starting to investigate how to implement sharing posts. Of course, this is not (yet) possible with the freshly released Google+ API, so as usual, I have to do some reverse-engineering and add a lot of guessing. I am close to understanding how everything works, with selecting circles to share with and all the gory details. There is just one tiny detail that I have no idea about. So, Googlers, hackers, Ajax people, maybe you van help me out.&lt;br /&gt;&lt;br /&gt;Apparently, to share a post on Google+, I have to POST this sort of JSON message to it:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: xx-small;"&gt;[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; "share with nobody",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; "oz:104167973823715920379.&lt;b&gt;&lt;span style="font-size: small;"&gt;&lt;span style="color: red;"&gt;13280d46e2b&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;.0",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: xx-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; "z134ip5j0ovce3a4a04cgvszxu2qdjrgk24",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "aclEntries":&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "scope":&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "scopeType":"focusGroup",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "name":"empty",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "id":"104167973823715920379.4c320e48a4b5a4a",&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: xx-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "me":false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "requiresKey":false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "groupType":"p"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "role":20&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "scope":&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "scopeType":"focusGroup",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "name":"empty",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "id":"104167973823715920379.4c320e48a4b5a4a",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "me":false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "requiresKey":false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "groupType":"p"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "role":60&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; null,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; false&lt;br /&gt;] &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Believe it or not, but I know what all the above long numbers are (&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: small;"&gt;104167973823715920379&lt;/span&gt; is some sort of category marker or whatever that can be retrieved from another Ajax call, &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: xx-small;"&gt;&lt;span style="font-size: small;"&gt;4c320e48a4b5a4a&lt;/span&gt; &lt;/span&gt;is the circle ID and &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: xx-small;"&gt;&lt;span style="font-size: small;"&gt;z134ip5j0ovce3a4a04cgvszxu2qdjrgk24&lt;/span&gt; &lt;/span&gt;is the post ID). The only thing I have no idea about is the stuff in the red. It looks like some sort of a timestamp or something, but unlike regular Google+ timestamps (which are just &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;new Date().getTime()&lt;/span&gt; Javascript fuction results), this one has some hex numbers in it (or so it seems).&lt;br /&gt;&lt;br /&gt;So, if you are able to help me out here, just let me know. &lt;br /&gt;&lt;br /&gt;Or, if you are a Googler working on the Google+ API, feel free to just implement this functionality in the next rev or G+ API. I would really be grateful if I could just dump this stupid reverse-engineering stuff and use a proper API.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UPDATE (12 Oct 2011):&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;the mysterious part kinda looks like timestamps (milliseconds since 00:00 01.01.1970)&lt;b&gt;&amp;nbsp;&lt;/b&gt; in hex.&lt;br /&gt;&lt;br /&gt;13280D46E2B is 1316421398059 in decimal, which is some time on Sept 19th 2011, which is when I conducted the experiments and when the post was made.&lt;br /&gt;&lt;br /&gt;Will I be able to implement sharing soon? Find out tomorrow&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6068163282126598626-4267870316755971221?l=ducttapeprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/4267870316755971221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/09/trying-to-implement-sharing-posts-more.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/4267870316755971221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/4267870316755971221'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/09/trying-to-implement-sharing-posts-more.html' title='Trying to implement sharing posts - more fun reverse-engineering Google+'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6068163282126598626.post-6760381341214853598</id><published>2011-09-16T04:35:00.000-07:00</published><updated>2011-09-19T02:52:15.133-07:00</updated><title type='text'>+1 button in G+7 strikes back</title><content type='html'>Well, a second post today, just to let you know that the +1 button in &lt;a href="http://www.kalamonsoft.com/gp7"&gt;G+7 desktop gadget&lt;/a&gt; is coming along nicely and will be available on Monday, when I release version 1.5. Stay tuned&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-5jyzjZ5n7iI/TnM0bOE1feI/AAAAAAAABOs/dhmGJrMzoX0/s1600/mazio.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="306" src="http://1.bp.blogspot.com/-5jyzjZ5n7iI/TnM0bOE1feI/AAAAAAAABOs/dhmGJrMzoX0/s400/mazio.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;UPDATE: G+7 version 1.5 (with the +1 button and other good stuff) is available here:&amp;nbsp;&lt;a href="http://www.kalamonsoft.com/gp7"&gt;http://www.kalamonsoft.com/gp7&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6068163282126598626-6760381341214853598?l=ducttapeprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/6760381341214853598/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/09/1-button-in-g7-strikes-back.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/6760381341214853598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/6760381341214853598'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/09/1-button-in-g7-strikes-back.html' title='+1 button in G+7 strikes back'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-5jyzjZ5n7iI/TnM0bOE1feI/AAAAAAAABOs/dhmGJrMzoX0/s72-c/mazio.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6068163282126598626.post-987430330825058363</id><published>2011-09-16T00:45:00.000-07:00</published><updated>2011-09-16T00:45:49.443-07:00</updated><title type='text'>Another Day, Another Release - G+7 version 1.4 is out</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.kalamonsoft.com/images/gp7.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.kalamonsoft.com/images/gp7.png" /&gt;&lt;/a&gt;&lt;/div&gt;G+7 has been using an external, auxiliary application (googleauthenticator.exe) to perform authentication in Google+. This caused quite a few problems. The external application introduced dependancy on .NET framework. Some users with non-latin languages reported problems with authenticating, which was caused by the authenticator using heavy screen-scraping techinques to perform authentication. Some virus scanners (esp. Norton) flagged the authenticator as a potential threat, as it launched from a non-standard location (gadget installation directory).&lt;br /&gt;&lt;br /&gt;&lt;div&gt;But worst of all, the authenticator was a total hack and a worakround for not being able to properly log in to Google+.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Well - the authenticator is no more. Starting with G+7 version 1.4 (released a minute ago), G+7 authenticates using your regular Internet Explorer credentials. It became more lightweight, it does not depend on any external frameworks, it behaves better. Enjoy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As usual, you can get G+7 from &lt;a href="http://www.kalamonsoft.com/gp7"&gt;here&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6068163282126598626-987430330825058363?l=ducttapeprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/987430330825058363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/09/another-day-another-release-g7-version.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/987430330825058363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/987430330825058363'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/09/another-day-another-release-g7-version.html' title='Another Day, Another Release - G+7 version 1.4 is out'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6068163282126598626.post-1217938716501957721</id><published>2011-09-15T08:03:00.000-07:00</published><updated>2011-09-15T08:03:48.379-07:00</updated><title type='text'>G+7 version 1.3 - with support for adding comments. And problems with Microsoft Live Gallery</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.kalamonsoft.com/images/gp7.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.kalamonsoft.com/images/gp7.png" /&gt;&lt;/a&gt;&lt;/div&gt;For the last week, I have been working hard on providing support for adding comments to posts from within the post view in &lt;a href="http://www.kalamonsoft.com/gp7"&gt;G+7&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This required quite a lot of effort, as I had to do a lot of reverse-engineering of Google+ Ajax calls. First - to dynamically reload the post after the comment is added and second - to actually post a comment. It took me a while to figure out everything and put all the pieces together, but eventually I was successful.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So this is what the result looks like&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-mmHZ_RBddoE/TnIQn3etfrI/AAAAAAAABOc/H1lGilxNX20/s1600/comments1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="248" src="http://3.bp.blogspot.com/-mmHZ_RBddoE/TnIQn3etfrI/AAAAAAAABOc/H1lGilxNX20/s320/comments1.png" width="320" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/-j4RdLpUst78/TnIRHEiAE-I/AAAAAAAABOk/VfI-kjqUyQM/s1600/comments2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="217" src="http://3.bp.blogspot.com/-j4RdLpUst78/TnIRHEiAE-I/AAAAAAAABOk/VfI-kjqUyQM/s320/comments2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: none; clear: left; color: black; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;I hope you will like the new functionality as much as I do.&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: none; clear: left; color: black; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;You can install G+7 by following this link:&amp;nbsp;&lt;a href="http://www.kalamonsoft.com/gp7"&gt;http://www.kalamonsoft.com/gp7&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: none; clear: left; color: black; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;By the way - for a short while, G+7 was available on Microsoft's &lt;a href="http://gallery.live.com/"&gt;Windows Live Gallery&lt;/a&gt;. But I have just noticed that something broke, and G+7 download link no longer works. I am not sure what exactly broke the link, but I took the gadget offline, until the problem gets fixed. I submitted an update and hopefully things will get corrected by Microsoft people. However, it seems to be taking them a while to respond to update requests (last time it was around 2 weeks). Please stay tuned.&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: none; clear: left; color: black; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: none; clear: left; color: black; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6068163282126598626-1217938716501957721?l=ducttapeprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/1217938716501957721/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/09/g7-version-13-with-support-for-adding.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/1217938716501957721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/1217938716501957721'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/09/g7-version-13-with-support-for-adding.html' title='G+7 version 1.3 - with support for adding comments. And problems with Microsoft Live Gallery'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-mmHZ_RBddoE/TnIQn3etfrI/AAAAAAAABOc/H1lGilxNX20/s72-c/comments1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6068163282126598626.post-7548775875430931553</id><published>2011-09-10T05:56:00.000-07:00</published><updated>2011-09-15T07:45:27.632-07:00</updated><title type='text'>DeskBeam Jr error - please contact me</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/-qPUeuzYObe8/TmteayTVxmI/AAAAAAAABOY/_vVbIbCLLlA/s1600/deskbeamlogo-trans-50.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-qPUeuzYObe8/TmteayTVxmI/AAAAAAAABOY/_vVbIbCLLlA/s1600/deskbeamlogo-trans-50.png" /&gt;&lt;/a&gt;To whomever anonymously posted a bug in our bugtracker about the crash in DeskBeam Junior - please try to install Microsoft runtime redistributable package from &lt;a href="http://www.microsoft.com/download/en/details.aspx?id=5555"&gt;http://www.microsoft.com/download/en/details.aspx?id=5555&lt;/a&gt; and try again&lt;br /&gt;&lt;br /&gt;Ah, and contact me :) &lt;br /&gt;&lt;br /&gt;Thanks&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UPDATE:&amp;nbsp;the error has already been fixed&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6068163282126598626-7548775875430931553?l=ducttapeprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/7548775875430931553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/09/deskbeam-jr-error-please-contact-me.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/7548775875430931553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/7548775875430931553'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/09/deskbeam-jr-error-please-contact-me.html' title='DeskBeam Jr error - please contact me'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-qPUeuzYObe8/TmteayTVxmI/AAAAAAAABOY/_vVbIbCLLlA/s72-c/deskbeamlogo-trans-50.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6068163282126598626.post-1516426079803868815</id><published>2011-09-08T11:19:00.000-07:00</published><updated>2011-09-08T11:19:26.825-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='disaster'/><title type='text'>Over Quota at Google Apps Engine :)</title><content type='html'>Oh dear. You guys are amazing me. Suddenly so many people started to download &lt;a href="http://www.kalamonsoft.com/gp7"&gt;G+7&lt;/a&gt; that my resource usage at Google Apps Engine went over free quota. Who knew it would happen on the third day :)&lt;br /&gt;&lt;br /&gt;So, the site is intermittently unavailable. I have enabled billing and we should be back online in 20 minutes. At least this is what Google says.&lt;br /&gt;&lt;br /&gt;Sorry about the mess&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6068163282126598626-1516426079803868815?l=ducttapeprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/1516426079803868815/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/09/over-quota-at-google-apps-engine.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/1516426079803868815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/1516426079803868815'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/09/over-quota-at-google-apps-engine.html' title='Over Quota at Google Apps Engine :)'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6068163282126598626.post-8375249145061538117</id><published>2011-09-08T07:24:00.000-07:00</published><updated>2011-09-08T07:29:45.348-07:00</updated><title type='text'>G+7 version 1.2 - now with support for Circles</title><content type='html'>In my&amp;nbsp;&lt;a href="http://ducttapeprogrammer.blogspot.com/2011/09/g7-and-google-circles.html"&gt;last post&lt;/a&gt;, I mentioned that I have been working on providing support for Google+ circles.&amp;nbsp;Well, today I have released G+7 version 1.2, in which circles support became available for public consumption.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-ridptCqv7f4/TmjNg1CxM0I/AAAAAAAABOQ/eESKUPGKzBs/s1600/circle2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/-ridptCqv7f4/TmjNg1CxM0I/AAAAAAAABOQ/eESKUPGKzBs/s200/circle2.png" width="195" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Here is how circles work in G+7&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;After logging in, if you want to limit the stream of updates to a certain circle, simply select this circle from a dropdown in the settings panel, as shown in the illustration to the left.&lt;br /&gt;If you select a circle, and additional icon (a sort of b/w mini "Circles" icon from Google+) shows up in the gadget's header. When you hover your mouse over the icon, it shows you the circle name in the tooltip. When you click on the icon, it opens the circle's feed in your browser.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;You can get version 1.2 of G+7&amp;nbsp;&lt;a href="http://www.kalamonsoft.com/gp7"&gt;here&lt;/a&gt;.&amp;nbsp;Try it and let me know what you think&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-x_hgsk9lGMI/TmjOAkJtwAI/AAAAAAAABOU/h3ztu6LjB_E/s1600/circles1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-x_hgsk9lGMI/TmjOAkJtwAI/AAAAAAAABOU/h3ztu6LjB_E/s320/circles1.png" width="207" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Plans&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;I have big plans for the future. I will be adding support for commenting, sharing posts and for adding +1s to them. Stay tuned. You can find information about updates in the blinking icon in the gadget itself, or&amp;nbsp;&lt;a href="https://twitter.com/#!/kalamonsoft"&gt;on twitter&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6068163282126598626-8375249145061538117?l=ducttapeprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/8375249145061538117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/09/g7-version-12-now-with-support-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/8375249145061538117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/8375249145061538117'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/09/g7-version-12-now-with-support-for.html' title='G+7 version 1.2 - now with support for Circles'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-ridptCqv7f4/TmjNg1CxM0I/AAAAAAAABOQ/eESKUPGKzBs/s72-c/circle2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6068163282126598626.post-6449473893899495314</id><published>2011-09-07T07:48:00.000-07:00</published><updated>2011-09-08T07:24:58.025-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google+ circles'/><title type='text'>G+7 And Google+ Circles</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-SP7zvXDtKRE/TmeE3z_fvBI/AAAAAAAABOM/R0x1ieJsIwY/s1600/Google-Plus-Circles-150x150.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-SP7zvXDtKRE/TmeE3z_fvBI/AAAAAAAABOM/R0x1ieJsIwY/s1600/Google-Plus-Circles-150x150.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;I am working on G+7 version 1.2. The big feature of this version is going to be the ability to filter the message stream by circles.&lt;br /&gt;The feature is coming along nicely.&lt;br /&gt;Actually it seems to be much easier than I expected, because it looks like jQuery is very much able to properly talk to Google+ with valid credentials, if I prod it sufficiently hard, so I can get rid of most of the .NET-based helper apps&lt;br /&gt;&lt;br /&gt;Anyway - stay tuned&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UPDATE: support for circles is now available with &lt;a href="http://ducttapeprogrammer.blogspot.com/2011/09/g7-version-12-now-with-support-for.html"&gt;G+7 version 1.2&lt;/a&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6068163282126598626-6449473893899495314?l=ducttapeprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/6449473893899495314/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/09/g7-and-google-circles.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/6449473893899495314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/6449473893899495314'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/09/g7-and-google-circles.html' title='G+7 And Google+ Circles'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-SP7zvXDtKRE/TmeE3z_fvBI/AAAAAAAABOM/R0x1ieJsIwY/s72-c/Google-Plus-Circles-150x150.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6068163282126598626.post-3836274548617359457</id><published>2011-09-06T04:53:00.000-07:00</published><updated>2011-09-06T04:53:17.341-07:00</updated><title type='text'>G+7 Google+ gadget - version 1.1.0.0: fun with +1 button</title><content type='html'>&lt;a href="http://www.google.com/+1/button/images/icon.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.google.com/+1/button/images/icon.png" /&gt;&lt;/a&gt;Today I have released version 1.1.0 of the &lt;a href="http://www.kalamonsoft.com/gp7"&gt;G+7&lt;/a&gt;&amp;nbsp;Windows desktop gadget.&lt;br /&gt;&lt;br /&gt;The original plan for this release was to add the &lt;a href="http://code.google.com/intl/en-US/apis/+1button/"&gt;+1 button&lt;/a&gt;&amp;nbsp;to every message, so that you could quickly +1 a post without having to open it in the browser. Unfortunately, the reality proved to be more complicated than my hopes. It seems like the button, while working fine for web pages (like &lt;a href="http://www.kalamonsoft.com/gp7"&gt;this one&lt;/a&gt;), does not really behave properly for posts on Google+ itself. It does render the number of +1s correctly, however clicking on it, and passing the post's URL as the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;href&lt;/b&gt;&lt;/span&gt; parameter (which is an URL like &lt;a href="https://plus.google.com/104167973823715920379/posts/c3Qs3u3Ba8N"&gt;this one&lt;/a&gt;)&amp;nbsp;does not increase +1 count on the post page. I am not exactly sure what clicking on the button actually does, but it is not what one would expect.&lt;br /&gt;&lt;br /&gt;So, instead, I have provided just a read-only number of +1s on a post, and a note to remind you if you were one of the +1ers or not (sorry &lt;a href="https://plus.google.com/105030465637303791249/"&gt;CmdrTaco&lt;/a&gt;&amp;nbsp;for using your post for illustration purposes. I hope you don't mind)&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-ZyfiKI1i8ac/TmYJRNzD-gI/AAAAAAAABOE/fzK_Alr71mE/s1600/mazio.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://4.bp.blogspot.com/-ZyfiKI1i8ac/TmYJRNzD-gI/AAAAAAAABOE/fzK_Alr71mE/s320/mazio.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The +1 button functionality will come later. To implement it, I have to reverse engineer the Ajax call that Google+ itself uses to bump the +1 on a post (I have a pretty good idea about how to do it) and create some mini-app in .NET invoked from teh gadget to do the bumping.&lt;br /&gt;&lt;br /&gt;Either that or some jQuery trick may be possible as I have noticed that once I perform the login from a helper app that contains an embedded IE control, the gadget itself seems to become aware of all auth cookies that Google+ requires.&lt;br /&gt;&lt;br /&gt;Anyway - the lack of API for Google+ is a royal pain in the arse and a real shame. I hope Google gets its act together soon, as having to reverse-engineer inner workings of G+ web pages to implement any standalone G+ client is not a good long-term strategy&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6068163282126598626-3836274548617359457?l=ducttapeprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/3836274548617359457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/09/g7-google-gadget-version-1100-fun-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/3836274548617359457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/3836274548617359457'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/09/g7-google-gadget-version-1100-fun-with.html' title='G+7 Google+ gadget - version 1.1.0.0: fun with +1 button'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-ZyfiKI1i8ac/TmYJRNzD-gI/AAAAAAAABOE/fzK_Alr71mE/s72-c/mazio.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6068163282126598626.post-2176714415307495789</id><published>2011-09-05T02:33:00.000-07:00</published><updated>2011-09-05T02:49:40.575-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google+ Windows desktop gadget .NET'/><title type='text'>G+7 - Google+ Windows Desktop Gadget</title><content type='html'>&lt;div class="separator" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: center;"&gt;&lt;a href="http://www.kalamonsoft.com/images/gp7.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.kalamonsoft.com/images/gp7.png" /&gt;&lt;/a&gt;&lt;a href="http://www.kalamonsoft.com/images/gp7-big.png" imageanchor="1" style="clear: left; display: inline !important; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;a href="http://www.kalamonsoft.com/images/gp7-small.png" imageanchor="1" style="clear: left; display: inline !important; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;a href="http://www.kalamonsoft.com/images/gp7-expanded.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href="http://www.kalamonsoft.com/images/gp7-small.png" imageanchor="1" style="clear: left; display: inline !important; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href="http://www.kalamonsoft.com/images/gp7-big.png" imageanchor="1" style="clear: left; display: inline !important; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Last week, I created and released&amp;nbsp;&lt;a href="http://www.kalamonsoft.com/gp7"&gt;G+7&lt;/a&gt;&amp;nbsp;- a Windows 7/Vista desktop gadget that displays live stream of updates from your Google+ friends.&lt;br /&gt;&lt;br /&gt;The implementation was a bit tricky, first of all because of the face that Google+ does not offer any sort of official API. So I had to resort to reverse engineering Ajax calls made by Google+ web page to fetch posts. Second complication was caused by the face that Windows desktop gadgets are pretty much pure javascript, and because of that they have trouble creating and using authentication cookies that Google uses - like I said, there is no API available to authenticate you programmatically to Google+, so some hacks had to be made, some .NET code used to retrieve cookies as well as fetching update streams.&lt;br /&gt;&lt;br /&gt;All of this makes G+7 a bit of a hack job.&lt;br /&gt;&lt;br /&gt;But anyway - I suppose it is quite useful to some people, as I have been seeing quite a lot of downloads over the weekend.&lt;br /&gt;&lt;br /&gt;I am planning some additional fucntionality in the future:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;posting comments to messages&lt;/li&gt;&lt;li&gt;sharing posts&lt;/li&gt;&lt;li&gt;+1 button&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a href="http://www.kalamonsoft.com/gp7"&gt;Give it a try&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here are some screenshots&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.kalamonsoft.com/images/gp7-small.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://www.kalamonsoft.com/images/gp7-small.png" width="71" /&gt;&lt;/a&gt;&lt;a href="http://www.kalamonsoft.com/images/gp7-small.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: none; color: black;"&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href="http://www.kalamonsoft.com/images/gp7-expanded.png" imageanchor="1" style="clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="135" src="http://www.kalamonsoft.com/images/gp7-expanded.png" width="200" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.kalamonsoft.com/images/gp7-big.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://www.kalamonsoft.com/images/gp7-big.png" width="123" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6068163282126598626-2176714415307495789?l=ducttapeprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/2176714415307495789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/09/g7-google-windows-desktop-gadget.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/2176714415307495789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/2176714415307495789'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2011/09/g7-google-windows-desktop-gadget.html' title='G+7 - Google+ Windows Desktop Gadget'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6068163282126598626.post-8803075362734325385</id><published>2010-12-07T03:25:00.000-08:00</published><updated>2010-12-07T03:25:17.133-08:00</updated><title type='text'>"None of this affects me"</title><content type='html'>Great comment on &lt;a href="http://news.slashdot.org/comments.pl?sid=1898332&amp;amp;cid=34462472"&gt;slashdot&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; line-height: 14px;"&gt;‎&lt;i&gt;"I'd really like to comment on this but I afraid of the consequences. I'd like to work someday and possibly travel to the US. I'd rather just pretend I don't know what's happening. Besides, none of this really affects me. It's about the past and from where I stand today nothing from any of the actions they have taken has changed my l&lt;span class="text_exposed_show" style="display: inline;"&gt;ife in any way. At least now yet."&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6068163282126598626-8803075362734325385?l=ducttapeprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/8803075362734325385/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2010/12/none-of-this-affects-me.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/8803075362734325385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/8803075362734325385'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2010/12/none-of-this-affects-me.html' title='&quot;None of this affects me&quot;'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6068163282126598626.post-1693533578480442973</id><published>2010-12-06T06:05:00.000-08:00</published><updated>2010-12-06T06:05:25.074-08:00</updated><title type='text'>My email to a dude I know at Twitter about WikiLeaks</title><content type='html'>I care a lot about WikiLeaks. It is hard not to. I also care a lot about the fact that despite obvious volume of tweets on Twitter, with #wikileaks hashtag, they do not show up as "trending" Twitter's, making it seem like the subject is not relevant to a significant portion of the audience - which, as it happens, is in line with what the US government and its allied Powers That be would want you to believe.&lt;br /&gt;&lt;br /&gt;I also happen to know a dude at Twitter (nobody important I assume, just a developer, but still - an insider).&lt;br /&gt;&lt;br /&gt;So I emailed the Twitter guy with the following message:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #444444; font-family: arial, sans-serif; font-size: 13px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;i&gt;[...] I would really like to know why #wikileaks (as well as related hashtags) is not trending on Twitter, even though it obviously generates a massive amount of tweets, probably order of magnitude higher that anything else on Twitter.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;At this point I still refuse to believe that Twitter is a part of a larger conspiracy to shut up WikiLeaks,&amp;nbsp;although I am coming alarmingly close, having in mind PayPal and Amazon fiasco (I am in process of cancelling my accounts with both of these). I am still more inclined to think that you have a problem with your trending algorithm. But - if you do not get your act together, and soon, your credibility as a social medium is going to suffer a lot. After all, your only advantage is being the place where people post stuff (tech itself is quite trivial, wouldn't you agree?). If you lose credibility, you lose users and they may never come back.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;So, if you know anybody on the trend analysis team (or whatever team takes care of this functionality at Twitter), I would be grateful if you passed my concerns to them.&lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6068163282126598626-1693533578480442973?l=ducttapeprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/1693533578480442973/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2010/12/my-email-to-dude-i-know-at-twitter.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/1693533578480442973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/1693533578480442973'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2010/12/my-email-to-dude-i-know-at-twitter.html' title='My email to a dude I know at Twitter about WikiLeaks'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6068163282126598626.post-4733371086461772007</id><published>2010-07-12T00:44:00.000-07:00</published><updated>2010-07-12T00:56:17.165-07:00</updated><title type='text'>Security advice for riding a motorcycle during a heat wave</title><content type='html'>It seems like we are having a bit of a hot summer in Poland at last. Which mean riding a motorcycle becomes a bit of a challenge, because regular riding clothes become hot and uncomfortable. You basically have two choices:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;lose the armour and ride in tshirt and shorts&lt;/li&gt;&lt;li&gt;stay in the armour and risk getting unconscious becouse of the heat&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;My advice is - &lt;i&gt;absolutely do not ride without full armour!&lt;/i&gt; Reasons - the risk of injury while riding without it is grave. Your bare skin will be peeled off within a second from the contact with a tarmac. Also, during the heatwave, both you and the rest of the drivers on the street easily lose concentration, increasing the probability of accident &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, what to do? Armour, does get hot very quickly indeed. The solution is simple - &lt;b&gt;get yourself a wet bandana and put it around your neck&lt;/b&gt;.&lt;b&gt; It will keep you cool and fresh&lt;/b&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6068163282126598626-4733371086461772007?l=ducttapeprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/4733371086461772007/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2010/07/security-advice-for-riding-motorcycle.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/4733371086461772007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/4733371086461772007'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2010/07/security-advice-for-riding-motorcycle.html' title='Security advice for riding a motorcycle during a heat wave'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6068163282126598626.post-1930395188542917229</id><published>2010-06-28T10:33:00.000-07:00</published><updated>2010-06-28T10:43:27.279-07:00</updated><title type='text'>Email from a headhunter and my reply</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: medium;"&gt;I have received an email from a headhunter today and I have replied.&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Read below:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: rgb(68, 68, 68); "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;Dear Gorycki&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: rgb(68, 68, 68); "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  border-collapse: collapse; color: rgb(68, 68, 68); font-family:arial, sans-serif;font-size:13px;"&gt;&lt;p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 12pt; margin-left: 0px; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;We have a CV on file from you which is more than a year old. Have you secured employment in Ireland or are you still interested in moving here? If so – can you email me an updated CV with details of your current remuneration package and outline what types of roles you are interested in hearing about? We will then update your file and keep you informed if suitable roles arise.&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 12pt; margin-left: 0px; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;If you are no longer interested in hearing from us about new roles in Ireland – can you email us saying so and we can remove your file from our database.&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 12pt; margin-left: 0px; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Many thanks – and looking forward to hearing from you.&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Kindest regards&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;b&gt;&lt;span style="font-weight: bold; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;b&gt;&lt;span style="font-weight: bold; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Brian McFadden&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Director&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;span style="font-family:Myriad Pro;"&gt;&lt;span style="font-family:'Myriad Pro';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;If this we&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;re the first time my last name is misused in an email from the headhunter, I woudl let it pass. But as these guys cannot be bothered to even try to think which name is the first name and which one is the last, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'Myriad Pro';"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;I felt obliged to respond in the following way:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;span class="Apple-style-span"  style="font-family:'Myriad Pro';"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Dear McFadden,&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;&lt;span style="font-family:Myriad Pro;font-size:85%;"&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;Six years after Poland joined EU and since hordes of Poles invaded Ireland and the rest of British Islands, I really  hoped to find you guys to be able to distinguish our first names from our last names. I am absolutely sure that there are numerous Januszes, Marcins, Piotrs, Wojteks and so on (hint - these are the first names of Polish folks, which I assume are still customarily used in your country as header lines in email and other correspondence). &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;On the other hand, Gorycki (typically mispronounced badly by everybody from England or Ireland), Nowak, Kowalski, etc. are our last names. I really expect professional headhunters from the Islands looking for potential candidates in countries like Poland to be able to tell which name is which and use the correct one while making the first contact. Or, if unsure, to at least try to figure out some sort of neutral form that would not be offensive - hint: using just the last name is very much a no-no. Or, if everything else fails, as the last resort, ask your secretary or a cleaning lady (she is more likely than not Polish, or Lithuanian, or Czech or Slovak - all of which will be able to help you out). &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;Kind Regards&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;Janusz Gorycki&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Myriad Pro;font-size:85%;"&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6068163282126598626-1930395188542917229?l=ducttapeprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/1930395188542917229/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2010/06/email-from-headhunter-and-my-reply.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/1930395188542917229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/1930395188542917229'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2010/06/email-from-headhunter-and-my-reply.html' title='Email from a headhunter and my reply'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6068163282126598626.post-391745508537532635</id><published>2010-06-24T13:50:00.000-07:00</published><updated>2010-06-24T13:52:22.350-07:00</updated><title type='text'>Kalamon Software Web Site Facelift</title><content type='html'>I have spruced up the KalamonSoft web site, to make it a bit less generic. What do you think of the new layout and colors?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6068163282126598626-391745508537532635?l=ducttapeprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/391745508537532635/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2010/06/kalamon-software-web-site-facelift.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/391745508537532635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/391745508537532635'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2010/06/kalamon-software-web-site-facelift.html' title='Kalamon Software Web Site Facelift'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6068163282126598626.post-2570530994162584993</id><published>2010-06-02T12:13:00.000-07:00</published><updated>2010-06-02T12:29:14.236-07:00</updated><title type='text'>DeskBeam Junior Coming Along Nicely. And Other Good Stuff</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.kalamonsoft.com/_/rsrc/1273843893752/products/deskbeam-jr/deskbeamlogo.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 120px; height: 120px;" src="http://www.kalamonsoft.com/_/rsrc/1273843893752/products/deskbeam-jr/deskbeamlogo.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;I have been silent for a while, because I spend almost all of my evenings and nights coding my new baby - a &lt;b&gt;lightweight screencasting application&lt;/b&gt; which I call &lt;a href="http://www.kalamonsoft.com/products/deskbeam-jr"&gt;&lt;b&gt;DeskBeam Junior&lt;/b&gt;&lt;/a&gt;. Why "Junior"? Because this is just the first approximation of what I have in mind in the "Senior" version, which is going to come later, and which will include advanced video editing capabilities.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The picture on the left is the logo for the application, which I created a week ago. It is supposed to represent a flower. I hope you find it cute. &lt;/div&gt;&lt;div&gt;&lt;br /&gt; &lt;div&gt;The whole thing at this moment is a bit secret/unstable/in statu nascendi, so I am not giving you samples, screenshots or downloads to try out just yet - but do expect some early access preview (of alpha-to-beta-ish quality) in a couple of weeks.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Unlike my previous creations, the software will not be open source - I am going to charge for it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But - it will be rather cheap - to the tune of &lt;b&gt;$20-$25&lt;/b&gt;, so I guess everybody should be able to afford it.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On a totally different note, I am preparing a long-ish post/presentation/essay on the subject of "&lt;b&gt;Earned Value Measurements in Agile Projects&lt;/b&gt;" (yes, the title is deliberately controversial, as typical Agile approach is that EVM is bogus and worthless). I seem to have found an interesting metric for agile projects, which I guess nobody had though of before (at least Google does not know of anybody with an idea like that - I have been looking for it on the internets for a while). I hope the metric will be useful to some project managers out there, so if you are one of them, stay tuned. There will be formulas, graphics, and all sorts of good stuff&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6068163282126598626-2570530994162584993?l=ducttapeprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/2570530994162584993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2010/06/deskbeam-junior-coming-along-nicely-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/2570530994162584993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/2570530994162584993'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2010/06/deskbeam-junior-coming-along-nicely-and.html' title='DeskBeam Junior Coming Along Nicely. And Other Good Stuff'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6068163282126598626.post-4971744365491697270</id><published>2010-05-12T01:09:00.000-07:00</published><updated>2010-05-12T01:12:24.540-07:00</updated><title type='text'>My yamaha scored a hit today :)</title><content type='html'>Ok, I drew first blood on the motorcycle today. Well, not exactly blood, but there were (probably) some minor scratches - I have nicked some van's right mirror while passing it in the traffic jam. So, if you read this Mr. van dude (yeah, right) - I am officially very sorry for that. I will be more careful next time&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6068163282126598626-4971744365491697270?l=ducttapeprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/4971744365491697270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2010/05/my-yamaha-scored-hit-today.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/4971744365491697270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/4971744365491697270'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2010/05/my-yamaha-scored-hit-today.html' title='My yamaha scored a hit today :)'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6068163282126598626.post-6366282116572495223</id><published>2010-04-14T06:55:00.001-07:00</published><updated>2010-04-14T06:59:22.875-07:00</updated><title type='text'>XJ6 it is</title><content type='html'>Ok, so I bought me a Yamaha XJ6. Ain't it nice?&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now I have to learn how to ride it without getting killed or maimed. That is going to be interesting&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://katalog-motocykli.pl/clanky/yamaha-xj6-2009.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 540px; height: 360px;" src="http://katalog-motocykli.pl/clanky/yamaha-xj6-2009.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6068163282126598626-6366282116572495223?l=ducttapeprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/6366282116572495223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2010/04/xj6-it-is.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/6366282116572495223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/6366282116572495223'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2010/04/xj6-it-is.html' title='XJ6 it is'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6068163282126598626.post-1529379017011168005</id><published>2010-03-23T01:12:00.000-07:00</published><updated>2010-03-23T01:14:17.187-07:00</updated><title type='text'>Dan Pink on motivation</title><content type='html'>A must see video from TED Talks - Dan Pink &lt;a href="http://www.ted.com/talks/dan_pink_on_motivation.html"&gt;talks about some surprising findings&lt;/a&gt; about motivation and incentives&lt;br /&gt;&lt;br /&gt;Highly recommended&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6068163282126598626-1529379017011168005?l=ducttapeprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/1529379017011168005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2010/03/dan-pink-on-motivation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/1529379017011168005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/1529379017011168005'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2010/03/dan-pink-on-motivation.html' title='Dan Pink on motivation'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6068163282126598626.post-6371387906384120575</id><published>2010-03-20T14:43:00.000-07:00</published><updated>2010-03-20T14:44:51.397-07:00</updated><title type='text'>Kawasaki ER6n or Yamaha XJ-6</title><content type='html'>Hard choices to make...&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Which one is more cool, which one will rule? :)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6068163282126598626-6371387906384120575?l=ducttapeprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/6371387906384120575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2010/03/kawasaki-er6n-or-yamaha-xj-6.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/6371387906384120575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/6371387906384120575'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2010/03/kawasaki-er6n-or-yamaha-xj-6.html' title='Kawasaki ER6n or Yamaha XJ-6'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6068163282126598626.post-5370876921967063682</id><published>2010-03-16T01:59:00.000-07:00</published><updated>2010-03-16T02:01:50.496-07:00</updated><title type='text'>Obligatory Introductory Post</title><content type='html'>This is going to be a blog about everything and anything. I will try to talk about programming and software most of the time I guess, but you are likely to find posts about music, motorcycles, my family, politics, weird web sites and whatever else I feel like writing about.&lt;br /&gt;&lt;br /&gt;Be warned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6068163282126598626-5370876921967063682?l=ducttapeprogrammer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ducttapeprogrammer.blogspot.com/feeds/5370876921967063682/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2010/03/obligatory-introductory-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/5370876921967063682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6068163282126598626/posts/default/5370876921967063682'/><link rel='alternate' type='text/html' href='http://ducttapeprogrammer.blogspot.com/2010/03/obligatory-introductory-post.html' title='Obligatory Introductory Post'/><author><name>Marcin Gorycki</name><uri>http://www.blogger.com/profile/15881673241063551585</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-uqKObpO0ws0/TrLyCpNfsRI/AAAAAAAABTw/c8ItClbmQWQ/s220/DSC02209-cs.jpg'/></author><thr:total>0</thr:total></entry></feed>
