<?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:blogger='http://schemas.google.com/blogger/2008' 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-8813074174707015455</id><updated>2016-03-27T14:19:46.501+01:00</updated><category term="java"/><category term="open source"/><category term="agile"/><category term="funny"/><category term="book reviews"/><category term="employee time tracking"/><category term="idea"/><category term="google"/><category term="microsoft"/><category term="office"/><category term="plugin"/><category term="swing"/><category term="ui"/><category term="unix"/><category term=".net"/><category term="eclipse"/><category term="managerial"/><category term="python"/><category term="ruby"/><category term="security"/><category term="agile scrum tool php java code review continuous integration"/><category term="atlassian"/><category term="confluence"/><category term="idea plugin java"/><title type='text'>Unimplemented</title><subtitle type='html'>Unimplemented - unsorted thoughts from minds of &lt;a href=&quot;http://www.spartez.com/&quot;&gt;Spartez&lt;/a&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://unimplemented.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://unimplemented.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Marek Went</name><uri>http://www.blogger.com/profile/09232083819480905207</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>189</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8813074174707015455.post-1853730562830346360</id><published>2015-03-26T14:33:00.000+01:00</published><updated>2015-03-27T15:08:13.475+01:00</updated><title type='text'>New Ephor version 1.2 with lots of good stuff</title><content type='html'>Today we have released version 1.2 of Ephor. It contains a few quite exctiting new features.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;CSV Import&lt;/h3&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The first feature of note is the ability to import your assets from external source, using CSV import. This was the most asked-for feature in Ephor. What you need to do is create a table of assets using your favourite spreadsheet, export the data to a CSV format, and import the CSV file to Ephor. This way, you can quickly migrate to Ephor from your legacy method of storing assets information.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Below is a screenshot of the feature&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-S-5XxqfDtvk/VRATutpB9PI/AAAAAAAAKLI/99sup2Fu-lg/s1600/csv.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-S-5XxqfDtvk/VRATutpB9PI/AAAAAAAAKLI/99sup2Fu-lg/s1600/csv.png&quot; height=&quot;216&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;clear: both; text-align: left;&quot;&gt;&lt;/h2&gt;&lt;h3 style=&quot;clear: both; text-align: left;&quot;&gt;PC Collector Improvements&lt;/h3&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The &quot;PC Collector&quot; functionality, which uses Java-based computer scanner to collect information about user&#39;s machines and send them to Ephor received a bit of a facelift. We have changed the way the scanner is launched - before, it used &quot;Java web start&quot; technology to launch an external Java application. This caused problems, especially on OS X, where all applications launched from the web need to be signed in a way that made an optimal user experience quite impossible. So instead of an external application we are now using a Java applet embedded in Ephor web page.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can see it in action on the screenshot below&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-kH3hAE9IiV0/VRAU1WZD4II/AAAAAAAAKLQ/OSWpmS6x-QI/s1600/pc-collector.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-kH3hAE9IiV0/VRAU1WZD4II/AAAAAAAAKLQ/OSWpmS6x-QI/s1600/pc-collector.png&quot; height=&quot;382&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;clear: both; text-align: left;&quot;&gt;Restricted Read-only Users&lt;/h3&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We have added a new user role to Ephor Standalone: &quot;Restricted User&quot;. Restricted users are able to browse assets, but only in read-only mode, which means that they cannot modify contents of assets. However, they can still create JIRA issues and link them to assets - that way, they can report problems related to their equipment.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In Ephor for JIRA (and Service Desk), we have mapped the &quot;Restricted User&quot; role to configurable set of JIRA groups. This gives Ephor for JIRA administrator the ability to natively control who can edit assets.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Related to that, all Service Desk &quot;customer&quot; users are given the &quot;Restriced User&quot; role.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In addition to that, we provided the ability to also restrict who can modify the &quot;Asset&quot; custom field in JIRA.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;&lt;/h3&gt;&lt;h3&gt;Primary Assets&lt;/h3&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We have added the ability for every user to nominate one of your assets as their &quot;primary&quot; one. For example, you can make your main work machine &quot;primary&quot;:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-NKchQNlwvDY/VRAZqmWXTFI/AAAAAAAAKLo/9uMFrGZfd6M/s1600/primary.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-NKchQNlwvDY/VRAZqmWXTFI/AAAAAAAAKLo/9uMFrGZfd6M/s1600/primary.png&quot; height=&quot;312&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Primary assets can be quickly accessed from Ephor search page:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-A53UiMCJ7Oo/VRAZq1HSW8I/AAAAAAAAKLk/u4oEG1NY_Xo/s1600/primary2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-A53UiMCJ7Oo/VRAZq1HSW8I/AAAAAAAAKLk/u4oEG1NY_Xo/s1600/primary2.png&quot; height=&quot;193&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;and also, in Ephor for JIRA, they can be quickly selected when filling in the &quot;Asset&quot; custom field:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-NxrJnchz5T8/VRAZqruGWXI/AAAAAAAAKLg/Kzvv3jaXdHs/s1600/primary3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-NxrJnchz5T8/VRAZqruGWXI/AAAAAAAAKLg/Kzvv3jaXdHs/s1600/primary3.png&quot; height=&quot;297&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Improved JQL&lt;/h3&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In Ephor for JIRA, searching for issues (using JIRA&#39;s JQL language) associated with an asset was cumbersome - you had to know your asset&#39;s numerical ID. Now the support for JQL has been vastly improved. In addition to supporting numerical ID, we let the user search for issues using the full power of Ephor native &lt;a href=&quot;https://confluence.spartez.com/display/EPHOR/Search+query+syntax&quot;&gt;search queries&lt;/a&gt;: you can specify things like your asset name, MAC address, IP address, owner and pretty much anything else.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;See below for an example query for JIRA issues associated with assets of type &quot;Computer&quot;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-Byu4AEBzcrw/VRAcWqS6jiI/AAAAAAAAKL8/uwY3zxZ7ilM/s1600/jql.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-Byu4AEBzcrw/VRAcWqS6jiI/AAAAAAAAKL8/uwY3zxZ7ilM/s1600/jql.png&quot; height=&quot;292&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;See this page for a &lt;a href=&quot;https://confluence.spartez.com/display/EPHOR/Searching+for+JIRA+Issues+with+Associated+Items+in+Ephor+for+JIRA&quot;&gt;full description&lt;/a&gt; of this functionality.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Support for JIRA Graphs&lt;/h3&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We have now made the Ephor for JIRA&#39;s &quot;Asset&quot; custom field &quot;stattable&quot; - which means that it can be used as data for JIRA graphs. This gives you the ability to plot graphs of the number of issues per asset.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;See screenshots below for the preview of some of such graphs:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-dhK_9j2ZYw4/VRAc_UOWsAI/AAAAAAAAKME/oDnZI89H5aU/s1600/graph.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-dhK_9j2ZYw4/VRAc_UOWsAI/AAAAAAAAKME/oDnZI89H5aU/s1600/graph.png&quot; height=&quot;433&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-tJdAFIJUCyA/VRAi6WRlr1I/AAAAAAAAKMU/PTUnDk2A0gE/s1600/graph2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-tJdAFIJUCyA/VRAi6WRlr1I/AAAAAAAAKMU/PTUnDk2A0gE/s1600/graph2.png&quot; height=&quot;300&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We are going to elaborate on the statistics support in Ephor for JIRA in subsequent releases, providing you with ability to plot more advanced graphs, related to Ephor asset types and other criteria. Watch &lt;a href=&quot;https://jira.spartez.com/browse/NAC-1015&quot;&gt;this issue&lt;/a&gt; for more details.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://unimplemented.blogspot.com/feeds/1853730562830346360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://unimplemented.blogspot.com/2015/03/new-ephor-version-12-with-lots-of-good.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/1853730562830346360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/1853730562830346360'/><link rel='alternate' type='text/html' href='http://unimplemented.blogspot.com/2015/03/new-ephor-version-12-with-lots-of-good.html' title='New Ephor version 1.2 with lots of 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><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-S-5XxqfDtvk/VRATutpB9PI/AAAAAAAAKLI/99sup2Fu-lg/s72-c/csv.png" height="72" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8813074174707015455.post-5424925042979809942</id><published>2015-03-26T08:08:00.001+01:00</published><updated>2015-03-26T08:08:54.769+01:00</updated><title type='text'></title><content type='html'>&lt;h2&gt;TFS4JIRA Synchronization Filters&lt;/h2&gt; &lt;p&gt;TFS4JIRA, our second best-selling plugin, has just been released with new, highly requested feature - Synchronization Filters. We got feedback from many of our clients that they want to somehow limit which issues and work items are synchronized and now they are able to do that. Typical use case for Filters feature are situation where given issue is marked with some label - only issues with this label will be synchronized. Detailed information about how to use Filters can be found in &lt;a href=&quot;https://confluence.spartez.com/display/TFS4JIRA/Synchronization+Filters&quot;&gt;TFS4JIRA documentation&lt;/a&gt;. &lt;/p&gt; &lt;br/&gt;&lt;br/&gt; &lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-R7Le7oAiY4U/VRK5QK3Z7_I/AAAAAAAAA1Q/uKV1eqTUxKE/s1600/filters.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-R7Le7oAiY4U/VRK5QK3Z7_I/AAAAAAAAA1Q/uKV1eqTUxKE/s640/filters.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt; &lt;br/&gt;&lt;br/&gt; &lt;p&gt;Along with new Filters feature we introduced also new design for TFS screens. We named it using super-fancy abbreviation: &quot;TUI&quot; (TFS4JIRA User Interface). Profile Wizard and Synchronization Filters are the first screens created with this new layout but eventually all screens will be using it. &lt;/p&gt; &lt;br/&gt;</content><link rel='replies' type='application/atom+xml' href='http://unimplemented.blogspot.com/feeds/5424925042979809942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://unimplemented.blogspot.com/2015/03/tfs4jira-synchronization-filters.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/5424925042979809942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/5424925042979809942'/><link rel='alternate' type='text/html' href='http://unimplemented.blogspot.com/2015/03/tfs4jira-synchronization-filters.html' title=''/><author><name>Paweł Murawski</name><uri>http://www.blogger.com/profile/13556944524071318913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-R7Le7oAiY4U/VRK5QK3Z7_I/AAAAAAAAA1Q/uKV1eqTUxKE/s72-c/filters.png" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8813074174707015455.post-149352725497437711</id><published>2015-03-05T16:07:00.000+01:00</published><updated>2015-03-05T16:07:54.669+01:00</updated><title type='text'>Debugging concurrency issues on a JIRA plugin case.</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;The goal of this blog post is to share experiences regarding analyzing  and debugging concurrency issues that occured after integrating JIRA  Plugin with Atmosphere library. Perhaps a few tricks might be useful for  casual developer, perhaps some of them could be avoided or replaced  with better techniques. Anyway, the audience of this blogpost is the  developers, so expect &lt;s data-kwik=&quot;4&quot;&gt;gory&lt;/s&gt; technical details.&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;h2 data-kwik=&quot;6&quot; id=&quot;PluggingAtmosphereintoJIRAPlugin.Postmortem.-Background.&quot;&gt;Background.&lt;/h2&gt;&lt;br /&gt;I&#39;m a part of the team that develops a new plugin from scratch for the JIRA Agile application. The plugin main functionality is to allow people placing estimations on the issues - in the realtime! So whenever you&#39;re participating in the planning session you could instantly see in your JIRA what are the estimations from your colleagues - all that without the need of bringing those &lt;a href=&quot;http://codinghorror.typepad.com/.a/6a0120a85dcdae970b012877701ea0970c-pi&quot;&gt;passé poker cards&lt;/a&gt; to the session, or without using &lt;a href=&quot;https://www.google.pl/webhp#q=planning+poker+online&quot;&gt;external application for managing the voting&lt;/a&gt;. Anyway, one of the non trivial development tasks was to implement the &#39;real-time&#39; communication between different web browsers - for example if user A place a vote we would like to transmit that information to the user B and show him the vote (without refreshing the page). Technically we could implement all the stuff (frontend, backend) by ourselves, but being a &lt;strike&gt;smart&lt;/strike&gt; life-experienced engineers we reached for existing open-source solutions: &lt;a href=&quot;https://github.com/Atmosphere/atmosphere&quot;&gt;the Atmosphere library&lt;/a&gt;. After all it should save us a lot of time: no wheel reinventing, no corner case analysis - somebody has spend his/her time already on that.&lt;br /&gt;&lt;div data-kwik=&quot;7&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2&gt;The Story. &lt;/h2&gt;&lt;div data-kwik=&quot;7&quot;&gt;&lt;br /&gt;Unfortunately for us, after managing to integrate with the aforementioned library in our JIRA plugin we started to experience very &lt;span data-kwik=&quot;16&quot; style=&quot;color: black;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: red;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span class=&quot;status-macro aui-lozenge aui-lozenge-error&quot;&gt;&amp;nbsp;UNSTABLE&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt; webdriver test runs on our build server. Yes, I know, webdriver tests are destined to be unstable, but nearly all of the tests were failing/erroring out with unpredictable scheme. That&#39;s not acceptable! So after a bit of astonishment (our plugin seemed to be OK when manually tested) we needed to admit that there is something sinister happening. In the end it turned out to be a concurrency issue: in a non-deterministic condition two threads were writing over the same object, while they shouldn&#39;t do that. Quite a trivial issue, but due to the complexity of involved components (Tomcat, Atmosphere, JIRA, our plugin) it took me a few weeks to nail down the problem. And so I decided to share you a few of my experiences.&lt;/div&gt;&lt;div data-kwik=&quot;7&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2&gt;Initial analysis.&lt;/h2&gt;&lt;br /&gt;Ok, so as I said before, the initial symptom was that our webdriver tests were failing. After inspecting build logs and screenshots from the failed tests, these fact became obvious:&lt;br /&gt;&lt;br /&gt;1) the browser usually failed to load the page completely - in the screenshots we could see white (empty) space, without any html loaded.&lt;br /&gt;2) sometimes the browser failed with the following screenshot:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-aIPqHVqhR2o/VPhFlhO1TPI/AAAAAAAAFFg/G5V0m-8s5IM/s1600/do-bloga-1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-aIPqHVqhR2o/VPhFlhO1TPI/AAAAAAAAFFg/G5V0m-8s5IM/s1600/do-bloga-1.png&quot; height=&quot;435&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span data-kwik=&quot;24&quot; style=&quot;color: black;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;&lt;i&gt;Yuck, not very much informative.&lt;/i&gt;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3) build logs revealed that something wrong was happening with the http communication, as following exceptions were observed in the logs:&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;pre&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;12-sty-2015 19:13:40 [INFO] http-bio-2990-exec-1 ERROR admin 1153x85x1 8a9ocx 127.0.0.1 /secure/RapidBoard.jspa&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;    [com.atlassian.velocity.DefaultVelocityManager] Exception getting message body from Velocity:&lt;br /&gt;&lt;/span&gt;12-sty-2015 19:13:40 [INFO] java.lang.IllegalStateException: getOutputStream() has already been called for this response&lt;br /&gt;12-sty-2015 19:13:40 [INFO]  at org.apache.catalina.connector.Response.getWriter(Response.java:639) &lt;/span&gt;&lt;/pre&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div data-kwik=&quot;35&quot;&gt;or these ones:&lt;span data-kwik=&quot;36&quot; style=&quot;color: black;&quot;&gt;&lt;br data-kwik=&quot;37&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;preformatted panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;preformattedContent panelContent&quot;&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;pre&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;12-sty-2015 14:16:48 [INFO] SEVERE: Servlet.service() for servlet [default] in context with path [/jira] threw exception&lt;br /&gt;12-sty-2015 14:16:48 [INFO] java.lang.IllegalStateException: Cannot forward after response has been committed&lt;br /&gt;12-sty-2015 14:16:48 [INFO]   at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:349)&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;div data-kwik=&quot;40&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i data-kwik=&quot;42&quot;&gt;I&#39;m sparing you the details of the full exception stacktrace - it was pointing out that the exception came somewhere from the&amp;nbsp;&lt;code data-kwik=&quot;43&quot;&gt;org.apache.catalina.*&lt;/code&gt; internals. Not good.&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Ok, so the initial observation was that something is corrupting Tomcat (org.apache.catalina.*) Response objects - but who and why?&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Let&#39;s debug.&lt;/h2&gt;To make things worse the problem appeared to be very tentative - it manifested itself nearly on each build run (where all the test are executed), ok, good, but locally you wouldn&#39;t have such luck - there was no steps to reproduce the issue in a deterministic way. So, what were the options? I concluded that it might be good idea to attach IDEA debugger to a running application and run the tests in a loop. I hoped that at some run the exception will occur and I will be able to inspect things a bit with debugger. Ok, so the first task was to put breakpoints at the right code lines. The logs from the builds contained the relevant code parts, so it should be as simple as doing CTRL+N CTRL+N and entering, for example, &quot;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;org.apache.catalina.connector.Response&lt;/span&gt;&quot; and go to line 639 (see the first log I&#39;ve attached above). So simple.&lt;br /&gt;&lt;br /&gt;Unfortunately, the Tomcat code (org.apache.catalina.*) is not used explicitly by our plugin - of course, eventually the plugin runs in the JIRA environment, which in turn uses Tomcat as a servlet container, but IDEA debugger has no idea of it! So we need to add proper dependency in our project&#39;s pom.xml for making things obvious to IDEA: first we deduct which version of Tomcat is used:&lt;br /&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-gtGTzk2i0-k/VPhJJWWlD8I/AAAAAAAAFFs/aRCvB7LWzb4/s1600/tomcat-version.png&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2F4.bp.blogspot.com%2F-gtGTzk2i0-k%2FVPhJJWWlD8I%2FAAAAAAAAFFs%2FaRCvB7LWzb4%2Fs1600%2Ftomcat-version.png&amp;amp;container=blogger&amp;amp;gadget=a&amp;amp;rewriteMime=image%2F*&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;...then, we might add a special maven profile in our pom.xml and enable it on our devbox:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-RS8WBmLqATQ/VPhJu9SGadI/AAAAAAAAFF0/_gfAWEqhEg4/s1600/idea-profile.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-RS8WBmLqATQ/VPhJu9SGadI/AAAAAAAAFF0/_gfAWEqhEg4/s1600/idea-profile.png&quot; height=&quot;292&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Quite a neat trick - you can even commit that to a shared repository without fearing that you will disturb your co-developers&lt;span data-kwik=&quot;61&quot; style=&quot;color: black;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Breakpoint catching.&lt;/h2&gt;&lt;br /&gt;With above directives IDEA is now able to see Tomcat sources. We can place breakpoints in the exception triggering places and start looping webdriver tests. Whew. A few coffees later breakpoint triggers: the JVM threads are frozen and we can inspect the situation prior to throwing IllegalStateException. As one might expect - there is nothing interesting: after inspecting the Response object (I&#39;ll spare the details) we can clearly see that it is &#39;committed&#39; - whatever that means, but there is no trace of who did that. Let&#39;s check how Response.setCommitted() looks like (this is the only place where &#39;commited&#39; flag is changed):&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;code panel pdl&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent pdl&quot;&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;div&gt;&lt;div class=&quot;syntaxhighlighter nogutter  java&quot; id=&quot;highlighter_290881&quot;&gt;&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code&quot;&gt;&lt;div class=&quot;container&quot; title=&quot;Hint: double-click to select code&quot;&gt;&lt;div class=&quot;line number1 index0 alt2&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;org.apache.coyote.Response.java:&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number2 index1 alt1&quot;&gt;&lt;/div&gt;&lt;div class=&quot;line number3 index2 alt2&quot;&gt;&lt;span style=&quot;color: lime;&quot;&gt;&lt;code class=&quot;java value&quot;&gt;215&lt;/code&gt;&lt;/span&gt;&amp;nbsp; &lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;public&lt;/code&gt; &lt;code class=&quot;java keyword&quot;&gt;void&lt;/code&gt;&lt;/span&gt; &lt;code class=&quot;java plain&quot;&gt;setCommitted(&lt;/code&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;boolean&lt;/code&gt;&lt;/span&gt; &lt;code class=&quot;java plain&quot;&gt;v) {&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number4 index3 alt1&quot;&gt;&lt;span style=&quot;color: lime;&quot;&gt;&lt;code class=&quot;java value&quot;&gt;216&lt;/code&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;this&lt;/code&gt;&lt;/span&gt;&lt;code class=&quot;java plain&quot;&gt;.commited = v;&lt;/code&gt;&lt;/div&gt;&lt;div class=&quot;line number5 index4 alt2&quot;&gt;&lt;span style=&quot;color: lime;&quot;&gt;&lt;code class=&quot;java value&quot;&gt;217&lt;/code&gt;&lt;/span&gt;&amp;nbsp; &lt;code class=&quot;java plain&quot;&gt;}&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;A simple setter. If only we could see the trace of who was executing last time this setter. Fortunately, IDEA breakpoints have nice functionalities - let&#39;s exert them! We do right click on the breakpoint:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-7odB0rejSUI/VPhKuMPAIoI/AAAAAAAAFGA/90i-MrZxpbM/s1600/brak-point.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-7odB0rejSUI/VPhKuMPAIoI/AAAAAAAAFGA/90i-MrZxpbM/s1600/brak-point.png&quot; height=&quot;399&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;...and there we can:&lt;br /&gt;&lt;br /&gt;1) turn off thread suspension - because we don&#39;t want the application to stop on each &quot;setCommitted&quot; operation - there are thousands of them being correct while usually only one is wrong. We don&#39;t know upfront which one.&lt;br /&gt;2) log evaluated expression - where we can execute one-line java expression, so we can start logging something like:&lt;br /&gt;&lt;div class=&quot;code panel pdl&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent pdl&quot;&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;div&gt;&lt;div class=&quot;syntaxhighlighter nogutter  java&quot; id=&quot;highlighter_470753&quot;&gt;&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code&quot;&gt;&lt;div class=&quot;container&quot; title=&quot;Hint: double-click to select code&quot;&gt;&lt;div class=&quot;line number1 index0 alt2&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;Arrays.toString(&lt;/code&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;new&lt;/code&gt;&lt;/span&gt; &lt;code class=&quot;java plain&quot;&gt;Exception().getStackTrace())&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;or we can even use existing object structures and methods to keep IDEA console clean:&lt;br /&gt;&lt;div class=&quot;code panel pdl&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent pdl&quot;&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;div&gt;&lt;div class=&quot;syntaxhighlighter nogutter  java&quot; id=&quot;highlighter_563668&quot;&gt;&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code&quot;&gt;&lt;div class=&quot;container&quot; title=&quot;Hint: double-click to select code&quot;&gt;&lt;div class=&quot;line number1 index0 alt2&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;setHeader(&lt;/code&gt;&lt;span style=&quot;color: #93c47d;&quot;&gt;&lt;code class=&quot;java string&quot;&gt;&quot;tony_halik&quot;&lt;/code&gt;&lt;/span&gt;&lt;code class=&quot;java plain&quot;&gt;, Arrays.toString(&lt;/code&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;new&lt;/code&gt;&lt;/span&gt; &lt;code class=&quot;java plain&quot;&gt;Exception().getStackTrace()))&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;And later retrieve the stacktrace of the offending thread via the debugger, when the IllegalStateException does occur again:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/--AcKNAPSpdU/VPhdM0tHljI/AAAAAAAAFGQ/ayps_q3GRQI/s1600/tony-halik.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/--AcKNAPSpdU/VPhdM0tHljI/AAAAAAAAFGQ/ayps_q3GRQI/s1600/tony-halik.png&quot; height=&quot;473&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;...and reformat it in whatever text editor:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-M6hp5cYx1js/VPhdqH1qcUI/AAAAAAAAFGY/qjawaVhyMTs/s1600/stack-trace.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-M6hp5cYx1js/VPhdqH1qcUI/AAAAAAAAFGY/qjawaVhyMTs/s1600/stack-trace.png&quot; height=&quot;432&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This allows to see what did commit the Response object - it is actually some code of the Atmosphere library (org.atmosphere.cpr.*), which we call during processing http request in our plugin (com.spartez.pokerng.atmosphere.SpartezAtmoshpereFilter). However, analyzing the relevant code of those classes leads to no conclusion. We need more data.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Tomcat threads.&lt;/h2&gt;&lt;br /&gt;At this moment I didn&#39;t understand clearly which threads were involved. I knew which thread was throwing the IllegalStateException, because I could see it clearly in the debugger:&lt;br /&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-cf8DGCk8dzE/VPheBLjE-mI/AAAAAAAAFGg/qdw3cZP5CYc/s1600/current-thread-name.png&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2F1.bp.blogspot.com%2F-cf8DGCk8dzE%2FVPheBLjE-mI%2FAAAAAAAAFGg%2Fqdw3cZP5CYc%2Fs1600%2Fcurrent-thread-name.png&amp;amp;container=blogger&amp;amp;gadget=a&amp;amp;rewriteMime=image%2F*&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div data-kwik=&quot;119&quot;&gt;But was it the same thread that set &#39;commit&#39; flag  some time before? I weren&#39;t sure. To better understand what is going on  I&#39;ve decided to use old-fashioned System.out.println() technique and  collect information about relevant threads and their behavior. I&#39;ve  rebuild Tomcat from scratch with a few additional &lt;span style=&quot;font-size: small;&quot;&gt;&lt;code data-kwik=&quot;120&quot;&gt;System.out.println(Thread.currentThread().getName() + &quot; &quot; + System.identityHashCode(someObject)&lt;/code&gt;&lt;/span&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;code data-kwik=&quot;120&quot;&gt;)&lt;/code&gt;&lt;/span&gt;&amp;nbsp; statements. The &lt;span style=&quot;font-size: small;&quot;&gt;&lt;code data-kwik=&quot;121&quot;&gt;Thread.currentThread().getName()&lt;/code&gt;&lt;/span&gt;&amp;nbsp;is enough to give the answer for the &quot;which thread&quot; question, while&amp;nbsp;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;code data-kwik=&quot;122&quot;&gt;System.identityHashCode(obj)&lt;/code&gt;&lt;/span&gt;&amp;nbsp;is  enough to give the answer for the &quot;which object&quot; question. Not going  into details of how I&#39;ve chosen where to put those statements, let&#39;s  just say that after some trial &amp;amp; error I&#39;ve had quite a decent  activity logs, like the example below:&lt;/div&gt;&lt;div class=&quot;preformatted panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;preformattedContent panelContent&quot;&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;pre&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;(...)&lt;br /&gt;[INFO] http-bio-2990-exec-6 SocketProcessor.run() - obudzil sie&lt;br /&gt;[INFO] http-bio-2990-exec-6 org.apache.coyote.Response@21839092 sendHeaders()&lt;br /&gt;[INFO] http-bio-2990-exec-6 org.apache.coyote.Response@21839092 setCommitted()&lt;br /&gt;[INFO] http-bio-2990-exec-6 org.apache.coyote.Response@21839092 recycle() null&lt;br /&gt;[INFO] http-bio-2990-exec-6 zaraz oddam responsa do puli, patrz nastepny recycle()&lt;br /&gt;[INFO] http-bio-2990-exec-6 org.apache.coyote.Response@21839092 recycle() null&lt;br /&gt;[INFO] http-bio-2990-exec-6 SocketProcessor.run() - skonczyl sie&lt;br /&gt;[INFO] http-bio-2990-exec-6 SocketProcessor.run() - obudzil sie&lt;br /&gt;[INFO] http-bio-2990-exec-6 org.apache.coyote.Response@1413693b sendHeaders()&lt;br /&gt;[INFO] http-bio-2990-exec-6 org.apache.coyote.Response@1413693b setCommitted()&lt;br /&gt;[INFO] http-bio-2990-exec-6 org.apache.coyote.Response@1413693b recycle() null&lt;br /&gt;[INFO] http-bio-2990-exec-6 zaraz oddam responsa do puli, patrz nastepny recycle()&lt;br /&gt;[INFO] http-bio-2990-exec-6 org.apache.coyote.Response@1413693b recycle() null&lt;br /&gt;[INFO] http-bio-2990-exec-6 SocketProcessor.run() - skonczyl sie&lt;br /&gt;[INFO] http-bio-2990-exec-6 SocketProcessor.run() - obudzil sie&lt;br /&gt;[INFO] http-bio-2990-exec-2 org.apache.coyote.Response@44dfe44e sendHeaders()&lt;br /&gt;[INFO] http-bio-2990-exec-2 org.apache.coyote.Response@44dfe44e setCommitted()&lt;br /&gt;[INFO] http-bio-2990-exec-2 org.apache.coyote.Response@44dfe44e recycle() null&lt;br /&gt;[INFO] http-bio-2990-exec-2 zaraz oddam responsa do puli, patrz nastepny recycle()&lt;br /&gt;[INFO] http-bio-2990-exec-2 org.apache.coyote.Response@44dfe44e recycle() null&lt;br /&gt;[INFO] http-bio-2990-exec-2 SocketProcessor.run() - skonczyl sie&lt;br /&gt;(...)&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;div data-kwik=&quot;125&quot;&gt;This is normal behaviour of Tomcat threads  that handle the http requests from the web browsers - usually the  communcation goes like this:&lt;br /&gt;1) new request has come from the web browser (via TCP) and Tomcat should handle that&lt;br /&gt;2)  a thread is waking up from the pool - in the example above these  threads are named &quot;http-bio-2990-exec-X&quot;, and I&#39;ve logged wake up with  the &quot;obudzil sie&quot; message written to the System.out.&lt;br /&gt;3)  a thread is handling the request - it passes it to the underlying  servlet (JIRA side) or whatever, and it uses Tomcat&#39;s  org.apache.coyote.Response to deliver http content back to the web  browser.&lt;br /&gt;3.1) in the example above you can see that  http-bio-* threads are serving the headers (sendHeaders()) which result  in setting committed flag. I weren&#39;t logging other activity as I wasn&#39;t  interested in it.&lt;br /&gt;4) after finishing processing the  request - the relevant resources (in our example: Response object) are  recycled and the thread goes to the pool (&quot;skonczyl sie&quot; message)&lt;/div&gt;&lt;div data-kwik=&quot;131&quot;&gt;...rinse and repeat until there are http requests to serve.&lt;/div&gt;&lt;br /&gt;&lt;h2&gt;Tomcat recycling.&lt;/h2&gt;&lt;div data-kwik=&quot;133&quot;&gt;Above  example shows how the causal activity looks like. However, I noticed  that our IllegalStateException was usually preceded with (more-less)  following activity:&lt;/div&gt;&lt;div class=&quot;preformatted panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;preformattedContent panelContent&quot;&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;pre&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;[INFO] http-bio-2990-exec-10 SocketProcessor.run() - obudzil sie&lt;br /&gt;[INFO] http-bio-2990-exec-6 SocketProcessor.run() - obudzil sie&lt;br /&gt;[INFO] http-bio-2990-exec-10 org.apache.coyote.Response@52e93037 sendHeaders()&lt;br /&gt;[INFO] http-bio-2990-exec-10 org.apache.coyote.Response@52e93037 setCommitted()&lt;br /&gt;[INFO] http-bio-2990-exec-10 WARN anonymous 805x1914x2 1p39yc7 127.0.0.1 /plugins/servlet/jpp-ng/atmosphere/board/1&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;[INFO]   [org.atmosphere.cpr.DefaultBroadcaster] Duplicate resource bee1c112-4f54-46dd-ae60-7a9360a0aea3. Could be&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;[INFO]   caused by a dead connection not detected by your server. Replacing the old one with the fresh one&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;[INFO] http-bio-2990-exec-3 SocketProcessor.run() - obudzil sie&lt;br /&gt;[INFO] http-bio-2990-exec-3 org.apache.coyote.Response@59909aec recycle() null&lt;br /&gt;[INFO] http-bio-2990-exec-3 zaraz oddam responsa do puli, patrz nastepny recycle()&lt;br /&gt;[INFO] http-bio-2990-exec-3 org.apache.coyote.Response@59909aec recycle() null&lt;br /&gt;[INFO] http-bio-2990-exec-10 org.apache.coyote.Response@59909aec sendHeaders()&lt;br /&gt;[INFO] http-bio-2990-exec-10 org.apache.coyote.Response@59909aec setCommitted()&lt;br /&gt;[INFO] http-bio-2990-exec-3 SocketProcessor.run() - skonczyl sie&lt;br /&gt;[INFO] http-bio-2990-exec-3 SocketProcessor.run() - obudzil sie&lt;br /&gt;[INFO] http-bio-2990-exec-3 zaraz oddam responsa do puli, patrz nastepny recycle()&lt;br /&gt;[INFO] http-bio-2990-exec-3 org.apache.coyote.Response@6d6935c4 recycle() null&lt;br /&gt;[INFO] http-bio-2990-exec-3 SocketProcessor.run() - skonczyl sie&lt;br /&gt;[INFO] http-bio-2990-exec-10 SocketProcessor.run() - skonczyl sie&lt;br /&gt;[INFO] http-bio-2990-exec-6 org.apache.coyote.Response@21839092 setCommitted()&lt;br /&gt;[INFO] http-bio-2990-exec-9 SocketProcessor.run() - obudzil sie&lt;br /&gt;[INFO] http-bio-2990-exec-9 org.apache.coyote.Response@52e93037 recycle() null&lt;br /&gt;[INFO] http-bio-2990-exec-2 org.apache.coyote.Response@52e93037 sendHeaders()&lt;br /&gt;[INFO] http-bio-2990-exec-2 org.apache.coyote.Response@52e93037 setCommitted()&lt;br /&gt;[INFO] http-bio-2990-exec-9 zaraz oddam responsa do puli, patrz nastepny recycle()&lt;br /&gt;[INFO] http-bio-2990-exec-9 org.apache.coyote.Response@52e93037 recycle() null&lt;br /&gt;[INFO] http-bio-2990-exec-9 SocketProcessor.run() - skonczyl sie&lt;br /&gt;[INFO] http-bio-2990-exec-9 SocketProcessor.run() - obudzil sie&lt;br /&gt;[INFO] http-bio-2990-exec-2 org.apache.coyote.Response@1413693b sendHeaders()&lt;br /&gt;[INFO] http-bio-2990-exec-2 org.apache.coyote.Response@1413693b setCommitted()&lt;br /&gt;[INFO] http-bio-2990-exec-2 org.apache.coyote.Response@1413693b recycle() null&lt;br /&gt;[INFO] http-bio-2990-exec-2 zaraz oddam responsa do puli, patrz nastepny recycle()&lt;br /&gt;[INFO] http-bio-2990-exec-2 org.apache.coyote.Response@1413693b recycle() null&lt;br /&gt;[INFO] http-bio-2990-exec-2 SocketProcessor.run() - skonczyl sie&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;div data-kwik=&quot;136&quot;&gt;With the interesting part being actually this:&lt;/div&gt;&lt;div class=&quot;preformatted panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;preformattedContent panelContent&quot;&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;pre&gt;&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;[INFO] http-bio-2990-exec-10 SocketProcessor.run() - obudzil sie&lt;br /&gt;(...)&lt;br /&gt;[INFO] http-bio-2990-exec-3 SocketProcessor.run() - obudzil sie&lt;br /&gt;[INFO] http-bio-2990-exec-3 org.apache.coyote.Response@59909aec recycle() null&lt;br /&gt;[INFO] http-bio-2990-exec-3 zaraz oddam responsa do puli, patrz nastepny recycle()&lt;br /&gt;[INFO] http-bio-2990-exec-3 org.apache.coyote.Response@59909aec recycle() null&lt;br /&gt;[INFO] http-bio-2990-exec-10 org.apache.coyote.Response@59909aec sendHeaders()&lt;br /&gt;[INFO] http-bio-2990-exec-10 org.apache.coyote.Response@59909aec setCommitted()&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;div data-kwik=&quot;139&quot;&gt;There are two threads involved, one of  them seems to wake up out of the order and recycle the  Response@59909aec, and put it back to the pool (&quot;zaraz oddam responsa do  puli&quot; message). The other thread however is still messing with the  Response object after recycle. Ok, so now let&#39;s take a look at the  recycling mechanism in Tomcat:&lt;/div&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;div class=&quot;container&quot; title=&quot;Hint: double-click to select code&quot;&gt;&lt;div class=&quot;line number1 index0 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: #93c47d;&quot;&gt;&lt;code class=&quot;java comments&quot;&gt;// org.apache.coyote.Response code from tomcat 7.0.40. Lines 511-527:&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number2 index1 alt1&quot;&gt;&lt;/div&gt;&lt;div class=&quot;line number3 index2 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;public&lt;/code&gt;&lt;/span&gt; &lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;void&lt;/code&gt;&lt;/span&gt; &lt;code class=&quot;java plain&quot;&gt;recycle() {&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number4 index3 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number5 index4 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;contentType = &lt;/code&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;null&lt;/code&gt;&lt;/span&gt;&lt;code class=&quot;java plain&quot;&gt;;&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number6 index5 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;contentLanguage = &lt;/code&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;null&lt;/code&gt;&lt;/span&gt;&lt;code class=&quot;java plain&quot;&gt;;&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number7 index6 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;locale = DEFAULT_LOCALE;&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number8 index7 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;characterEncoding = Constants.DEFAULT_CHARACTER_ENCODING;&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number9 index8 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;charsetSet = &lt;/code&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;false&lt;/code&gt;&lt;/span&gt;&lt;code class=&quot;java plain&quot;&gt;;&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number10 index9 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;contentLength = &lt;span style=&quot;color: #93c47d;&quot;&gt;-&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;color: #93c47d;&quot;&gt;&lt;code class=&quot;java value&quot;&gt;1&lt;/code&gt;&lt;/span&gt;&lt;code class=&quot;java plain&quot;&gt;;&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number11 index10 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;status = &lt;/code&gt;&lt;span style=&quot;color: #93c47d;&quot;&gt;&lt;code class=&quot;java value&quot;&gt;200&lt;/code&gt;&lt;/span&gt;&lt;code class=&quot;java plain&quot;&gt;;&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number12 index11 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;message = &lt;/code&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;null&lt;/code&gt;&lt;/span&gt;&lt;code class=&quot;java plain&quot;&gt;;&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number13 index12 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;commited = &lt;/code&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;false&lt;/code&gt;&lt;/span&gt;&lt;code class=&quot;java plain&quot;&gt;;&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number14 index13 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;errorException = &lt;/code&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;null&lt;/code&gt;&lt;/span&gt;&lt;code class=&quot;java plain&quot;&gt;;&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number15 index14 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;headers.clear();&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number16 index15 alt1&quot;&gt;&lt;/div&gt;&lt;div class=&quot;line number17 index16 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;span style=&quot;color: #93c47d;&quot;&gt;&lt;code class=&quot;java comments&quot;&gt;// update counters&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number18 index17 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;contentWritten=&lt;/code&gt;&lt;span style=&quot;color: #93c47d;&quot;&gt;&lt;code class=&quot;java value&quot;&gt;0&lt;/code&gt;&lt;/span&gt;&lt;code class=&quot;java plain&quot;&gt;;&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number19 index18 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;}&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div data-kwik=&quot;142&quot;&gt;This is quite interesting. Tomcat  actually reuses various objects that are needed for the communication  with the web browser. In this blog post we will focus on the Response  object, but Tomcat actually uses the same recycling pattern for other  http handling objects too. Back to the example above: you can see that  recycle() method resets most of the local variables of the Response  object to some default values. So whenever a Tomcat thread finishes  handling the request, it actually calls that method and put the Response  object to the pool of ready-to-be-reused Responses. However, there  might still be an object in the memory that references that Response  object and will manipulate it! And it seems that this was the cause -  Atmosphere library is actually wrapping and storing the Response object  in its data structures. Otherwise it wouldn&#39;t be able to conduct  asynchronous operations on the http requests as it should. Could it be  that in some dire circumstances the Atmosphere code writes to the  Response that Tomcat already collected for re-using?&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Completing asynchronous request.&lt;/h2&gt;&lt;br /&gt;&lt;div data-kwik=&quot;144&quot;&gt;After  some investigating I managed to nail down what is causing Tomcat to  wake up a thread and recycle a Response. It was completing asynchronous  request, which is done by calling asyncContext.complete() from the  Servlet 3.0 API. I just needed to know now which thread (and why) was  completing asynchronous requests. To achieve that I&#39;ve rebuild  Atmosphere library with additional hack:&lt;/div&gt;&lt;div class=&quot;code panel pdl&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent pdl&quot;&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;div&gt;&lt;div class=&quot;syntaxhighlighter nogutter  java&quot; id=&quot;highlighter_511153&quot;&gt;&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code&quot;&gt;&lt;div class=&quot;container&quot; title=&quot;Hint: double-click to select code&quot;&gt;&lt;div class=&quot;line number1 index0 alt2&quot;&gt;&lt;div class=&quot;line number1 index0 alt2&quot;&gt;&lt;span style=&quot;color: #93c47d;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;//my addition:&lt;/code&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;/code&gt;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/code&gt;&lt;code class=&quot;java comments&quot;&gt;&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;/code&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;response.setHeader(&lt;/code&gt;&lt;code class=&quot;java string&quot;&gt;&quot;asyncCompleted&quot;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;, Thread.currentThread().getName() + &lt;/code&gt;&lt;code class=&quot;java string&quot;&gt;&quot; asyncCompleted\n&quot;&lt;/code&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;/code&gt;&lt;/span&gt; &lt;/code&gt;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;/code&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java string&quot;&gt;&lt;/code&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;/code&gt;&lt;/span&gt; &lt;/code&gt;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;/code&gt;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;span style=&quot;color: #93c47d;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;/code&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;/code&gt;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/code&gt;&lt;code class=&quot;java comments&quot;&gt;&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number2 index1 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;/code&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;/code&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;/code&gt;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;/code&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java string&quot;&gt;&lt;/code&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;/code&gt;&lt;/span&gt; &lt;/code&gt;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;+ Arrays.toString(&lt;/code&gt;&lt;code class=&quot;java keyword&quot;&gt;new&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;Exception(&lt;/code&gt;&lt;code class=&quot;java string&quot;&gt;&quot;asyncCompleted&quot;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;).getStackTrace()));&amp;nbsp;&lt;/code&gt;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/code&gt;&lt;code class=&quot;java comments&quot;&gt;&lt;/code&gt;&lt;/span&gt;&lt;span style=&quot;color: #93c47d;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class=&quot;line number1 index0 alt2&quot;&gt;&lt;span style=&quot;color: #93c47d;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;/code&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt; &lt;/code&gt;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/code&gt;&lt;code class=&quot;java comments&quot;&gt;&lt;/code&gt;&lt;/span&gt;&lt;span style=&quot;color: #93c47d;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #93c47d;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;//end of my addition&lt;/code&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;/code&gt;&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;/code&gt;&lt;code class=&quot;java comments&quot;&gt;&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;/code&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;/code&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;/code&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;asyncContext.complete();&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;div data-kwik=&quot;147&quot;&gt;and tweaking the Tomcat Response:&lt;/div&gt;&lt;div class=&quot;code panel pdl&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent pdl&quot;&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;div&gt;&lt;div class=&quot;syntaxhighlighter nogutter  java&quot; id=&quot;highlighter_8838&quot;&gt;&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code&quot;&gt;&lt;div class=&quot;container&quot; title=&quot;Hint: double-click to select code&quot;&gt;&lt;div class=&quot;line number1 index0 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;public&lt;/code&gt;&lt;/span&gt; &lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;void&lt;/code&gt;&lt;/span&gt; &lt;code class=&quot;java plain&quot;&gt;recycle() {&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number2 index1 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;contentType = &lt;/code&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;null&lt;/code&gt;&lt;/span&gt;&lt;code class=&quot;java plain&quot;&gt;;&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number3 index2 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;contentLanguage = &lt;/code&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;null&lt;/code&gt;&lt;/span&gt;&lt;code class=&quot;java plain&quot;&gt;;&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number4 index3 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;locale = DEFAULT_LOCALE;&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number5 index4 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;characterEncoding = Constants.DEFAULT_CHARACTER_ENCODING;&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number6 index5 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;charsetSet = &lt;/code&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;false&lt;/code&gt;&lt;/span&gt;&lt;code class=&quot;java plain&quot;&gt;;&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number7 index6 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;contentLength = &lt;span style=&quot;color: #93c47d;&quot;&gt;-&lt;/span&gt;&lt;/code&gt;&lt;span style=&quot;color: #93c47d;&quot;&gt;&lt;code class=&quot;java value&quot;&gt;1&lt;/code&gt;&lt;/span&gt;&lt;code class=&quot;java plain&quot;&gt;;&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number8 index7 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;status = &lt;/code&gt;&lt;span style=&quot;color: #93c47d;&quot;&gt;&lt;code class=&quot;java value&quot;&gt;200&lt;/code&gt;&lt;/span&gt;&lt;code class=&quot;java plain&quot;&gt;;&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number9 index8 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;message = &lt;/code&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;null&lt;/code&gt;&lt;/span&gt;&lt;code class=&quot;java plain&quot;&gt;;&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number10 index9 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;commited = &lt;/code&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;false&lt;/code&gt;&lt;/span&gt;&lt;code class=&quot;java plain&quot;&gt;;&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number11 index10 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;errorException = &lt;/code&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;null&lt;/code&gt;&lt;/span&gt;&lt;code class=&quot;java plain&quot;&gt;;&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number12 index11 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String asyncCompleted = headers.getHeader(&lt;/code&gt;&lt;span style=&quot;color: #93c47d;&quot;&gt;&lt;code class=&quot;java string&quot;&gt;&quot;asyncCompleted&quot;&lt;/code&gt;&lt;/span&gt;&lt;code class=&quot;java plain&quot;&gt;);&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number13 index12 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;headers.clear();&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number14 index13 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code class=&quot;java keyword&quot;&gt;if&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;(asyncCompleted != &lt;/code&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;null&lt;/code&gt;&lt;/span&gt;&lt;code class=&quot;java plain&quot;&gt;) { setHeader(&lt;/code&gt;&lt;span style=&quot;color: #93c47d;&quot;&gt;&lt;code class=&quot;java string&quot;&gt;&quot;asyncCompleted&quot;&lt;/code&gt;&lt;/span&gt;&lt;code class=&quot;java plain&quot;&gt;, asyncCompleted); }&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number15 index14 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number16 index15 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java comments&quot;&gt;// update counters&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number17 index16 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;contentWritten=&lt;/code&gt;&lt;span style=&quot;color: #93c47d;&quot;&gt;&lt;code class=&quot;java value&quot;&gt;0&lt;/code&gt;&lt;/span&gt;&lt;code class=&quot;java plain&quot;&gt;;&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number18 index17 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;}&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;div data-kwik=&quot;150&quot;&gt;This allowed me to check in the debugger  who was completing the asyncContext last time. Using the same technique  as I used to determine the code that set the committed flag, I just  needed to trigger the IllegalStateException once again and dig down to  the Response object in the debugger:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-olxRW7VXNks/VPhg_UwGBsI/AAAAAAAAFGs/OYzUWmg9t4o/s1600/asyncCompleted.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-olxRW7VXNks/VPhg_UwGBsI/AAAAAAAAFGs/OYzUWmg9t4o/s1600/asyncCompleted.png&quot; height=&quot;388&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div data-kwik=&quot;156&quot;&gt;This allowed me to see two stacktraces of the same thread:&lt;br /&gt;1) the stacktrace in the moment of calling asyncContext.complete()&lt;br /&gt;2) the stacktrace in the moment of committing the Response&amp;nbsp;&lt;/div&gt;&lt;div data-kwik=&quot;159&quot;&gt;By manual inspection of these two (and analyzing the difference) I finally arrived at this Atmosphere code:&lt;/div&gt;&lt;div class=&quot;code panel pdl&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent pdl&quot;&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;div&gt;&lt;div class=&quot;syntaxhighlighter nogutter  java&quot; id=&quot;highlighter_316089&quot;&gt;&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code&quot;&gt;&lt;div class=&quot;container&quot; title=&quot;Hint: double-click to select code&quot;&gt;&lt;div class=&quot;line number1 index0 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: #93c47d;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;// org.atmosphere.cpr.AtmosphereResourceImpl: ver &lt;/code&gt;&lt;code class=&quot;java value&quot;&gt;2.2&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;.&lt;/code&gt;&lt;code class=&quot;java value&quot;&gt;3&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;lines &lt;/code&gt;&lt;code class=&quot;java value&quot;&gt;737&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;-&lt;/code&gt;&lt;code class=&quot;java value&quot;&gt;782&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number2 index1 alt1&quot;&gt;&lt;/div&gt;&lt;div class=&quot;line number3 index2 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;public&lt;/code&gt; &lt;code class=&quot;java keyword&quot;&gt;void&lt;/code&gt;&lt;/span&gt; &lt;code class=&quot;java plain&quot;&gt;cancel() &lt;/code&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;throws&lt;/code&gt;&lt;/span&gt; &lt;code class=&quot;java plain&quot;&gt;IOException {&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number4 index3 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;try&lt;/code&gt;&lt;/span&gt; &lt;code class=&quot;java plain&quot;&gt;{&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number5 index4 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;if&lt;/code&gt;&lt;/span&gt; &lt;code class=&quot;java plain&quot;&gt;(!isCancelled.getAndSet(&lt;/code&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;true&lt;/code&gt;&lt;/span&gt;&lt;code class=&quot;java plain&quot;&gt;)) {&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number6 index5 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&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;/code&gt;&lt;code class=&quot;java plain&quot;&gt;(...)&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number8 index7 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&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;/code&gt;&lt;code class=&quot;java plain&quot;&gt;asyncSupport.complete(&lt;/code&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;this&lt;/code&gt;&lt;/span&gt;&lt;code class=&quot;java plain&quot;&gt;);&amp;nbsp; &lt;/code&gt;&lt;span style=&quot;color: #93c47d;&quot;&gt;&lt;code class=&quot;java comments&quot;&gt;// &amp;lt;-- this calls eventually &lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class=&quot;line number7 index6 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&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; &lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;&lt;/code&gt;&lt;span style=&quot;color: #93c47d;&quot;&gt;&lt;code class=&quot;java comments&quot;&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; asyncContext.complete()&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;(...)&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number9 index8 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: #93c47d;&quot;&gt;&lt;code class=&quot;java spaces&quot;&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;/code&gt;&lt;code class=&quot;java comments&quot;&gt;// We must close the underlying WebSocket as well.&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number10 index9 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&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;/code&gt;&lt;code class=&quot;java keyword&quot;&gt;if&lt;/code&gt; &lt;code class=&quot;java plain&quot;&gt;(AtmosphereResponse.&lt;/code&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;class&lt;/code&gt;&lt;/span&gt;&lt;code class=&quot;java plain&quot;&gt;.isAssignableFrom(response.getClass())) {&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number11 index10 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&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;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;AtmosphereResponse.&lt;/code&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;class&lt;/code&gt;&lt;/span&gt;&lt;code class=&quot;java plain&quot;&gt;.cast(response).close();&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number12 index11 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&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;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;AtmosphereResponse.&lt;/code&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;class&lt;/code&gt;&lt;/span&gt;&lt;code class=&quot;java plain&quot;&gt;.cast(response).destroy();&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number13 index12 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&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;/code&gt;&lt;code class=&quot;java plain&quot;&gt;}&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number14 index13 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&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;/code&gt;&lt;code class=&quot;java plain&quot;&gt;(...)&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number15 index14 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;}&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number16 index15 alt1&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java spaces&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class=&quot;java plain&quot;&gt;} &lt;/code&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;&lt;code class=&quot;java keyword&quot;&gt;finally&lt;/code&gt;&lt;/span&gt; &lt;code class=&quot;java plain&quot;&gt;{&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;line number17 index16 alt2&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;code class=&quot;java plain&quot;&gt;(...)&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;div data-kwik=&quot;162&quot;&gt;It seems that Atmosphere &#39;cancel&#39;  implementation first signal that the asynchronous operation is completed  (and thus Tomcat recycle the Response with another thread). Later, the  Atmosphere calls .close() on the wrapped Response object. Further  inspection revealed that .close() implementation leads to changing  Response state to committed. Could it be that actually completing the  asyncContext should mean that nobody can manipulate the Response object  anymore? To test that hypothesis let&#39;s use another feature of  breakpoints:&lt;br /&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-NGZd6Dlzt2s/VPhnI1A6NtI/AAAAAAAAFG4/4zGRFtkZVxI/s1600/only-current-thread.png&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2F1.bp.blogspot.com%2F-NGZd6Dlzt2s%2FVPhnI1A6NtI%2FAAAAAAAAFG4%2F4zGRFtkZVxI%2Fs1600%2Fonly-current-thread.png&amp;amp;container=blogger&amp;amp;gadget=a&amp;amp;rewriteMime=image%2F*&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span data-kwik=&quot;24&quot; style=&quot;color: black;&quot;&gt;&lt;/span&gt;Let&#39;s allow of the asyncContext.complete() operation and freeze the current thread right in the succeeding statement (line 757 in the above screenshot - note I&#39;ve checked Suspend: &quot;Thread&quot; option instead of default &quot;All&quot;). This will allow other threads to work in the background, and possibly one of them will collect and recycle() the &lt;span style=&quot;color: #8e7cc3;&quot;&gt;&lt;b&gt;response&lt;/b&gt;&lt;/span&gt; object. And in fact - stopping at this breakpoint and resuming after a few seconds has made the IllegalStateException problem nearly 100% replicating. Further more - commenting out the line:&lt;br /&gt;&lt;div class=&quot;code panel pdl&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent pdl&quot;&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;div&gt;&lt;div class=&quot;syntaxhighlighter nogutter  java&quot; id=&quot;highlighter_664760&quot;&gt;&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;code&quot;&gt;&lt;div class=&quot;container&quot; title=&quot;Hint: double-click to select code&quot;&gt;&lt;div class=&quot;line number1 index0 alt2&quot;&gt;&lt;span style=&quot;color: #93c47d;&quot;&gt;&lt;code class=&quot;java comments&quot;&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; AtmosphereResponse.class.cast(response).close();&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;made the webdriver tests to run stable. Whoa. Could it be that Atmosphere authors didn&#39;t know that you can&#39;t manipulate Response objects after completing asynchronous operations? Perhaps the problem only manifest itself in the JIRA/Tomcat7 environment - I guess Atmosphere is used occasionally on such a combo. So perhaps nobody have this problem yet, because other containers have different (contention-proof) recycling mechanisms. Or maybe no recycling mechanisms at all. I dunno.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Conclusion.&lt;/h2&gt;&lt;br /&gt;Fixing the problem should be quite easy now - for example one might modify Atmosphere code and get rid of these unnecessary .close() actions. Another one could raise an issue in the Atmosphere Github repository and wait till authors fix the issue. Another one can wrap the Response objects with own wrapper that will be able to cut any action after the asyncContext.complete() is called. Another one might find yet another creative solution.&lt;br /&gt;&lt;br /&gt;Anyway, that&#39;s a different story. In this blog post I wanted to focus on analyzing concurrency issues and as we finally got into the root cause of the problem - I think we can finish the story here. I hope you enjoyed it, thanks for reading.&lt;br /&gt;&lt;br /&gt;Oh, and by the way: if you are active JIRA Agile user and you do estimating of story points for your issues (or plan to add that step to your development process) you might be interested in checking out our new add-on available on the Atlassian Marketplace: &lt;a href=&quot;https://marketplace.atlassian.com/plugins/com.spartez.estimations&quot;&gt;Agile Estimates&lt;/a&gt;. It&#39;s a tool for collaborative estimating within JIRA Agile directly, and incidentally also the product that made me write this blog post in the first place.&lt;span data-kwik=&quot;178&quot;&gt;&lt;span data-kwik=&quot;181&quot;&gt; :)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span data-kwik=&quot;24&quot; style=&quot;color: black;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span data-kwik=&quot;24&quot; style=&quot;color: black;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span data-kwik=&quot;24&quot; style=&quot;color: black;&quot;&gt;&lt;br /&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://unimplemented.blogspot.com/feeds/149352725497437711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://unimplemented.blogspot.com/2015/03/debugging-concurrency-issues-on-jira.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/149352725497437711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/149352725497437711'/><link rel='alternate' type='text/html' href='http://unimplemented.blogspot.com/2015/03/debugging-concurrency-issues-on-jira.html' title='Debugging concurrency issues on a JIRA plugin case.'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/04922348655315302975</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-K7-TFdTncWA/VPhr29dvjpI/AAAAAAAAFHM/ZZ4CAsZE4Ng/s1600/*'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-aIPqHVqhR2o/VPhFlhO1TPI/AAAAAAAAFFg/G5V0m-8s5IM/s72-c/do-bloga-1.png" height="72" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8813074174707015455.post-6184141982070185751</id><published>2015-03-04T16:00:00.001+01:00</published><updated>2015-03-04T16:16:22.498+01:00</updated><title type='text'>Implementing custom check-in policy for Visual Studio</title><content type='html'>Here in Spartez we are currently hard working on developing &lt;a href=&quot;https://www.spartez.com/tfs4jira&quot;&gt;TFS4JIRA&lt;/a&gt; - our great app integrating TFS and JIRA. It is an indispensible tool especially (but not only!) for teams that use JIRA as their issue tracker and store their repository in TFS. They usually want to include JIRA issue key in every check-in message so that this check-in will be linked and shown in JIRA issue view (like on the image below).  &lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-Bm8AlDwnfZA/VPcaddZD23I/AAAAAAAAAUA/SB04fJt_zj0/s1600/issue_view_checkins.ss.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-Bm8AlDwnfZA/VPcaddZD23I/AAAAAAAAAUA/SB04fJt_zj0/s1600/issue_view_checkins.ss.png&quot; height=&quot;210&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The problem appeared that there was no mechanism to ensure that developer included JIRA issue key in his check-in comment. If there is no such key, then obviously such a check-in is not shown in JIRA. We decided to create an open source &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/ms181459(v=vs.100).aspx&quot;&gt;TFS check-in policy plugin&lt;/a&gt; that will enforce developers to include at least one valid JIRA issue key. It&#39;s already available on the &lt;a href=&quot;https://visualstudiogallery.msdn.microsoft.com/cdec2575-43b2-4c29-b67b-c266010f2150&quot;&gt;Visual Studio Gallery&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;How custom TFS check-in policy works internally&lt;/h3&gt;Custom check-in policy is a plugin to Visual Studio installed by each developer separately, but its configuration is stored globally in TFS Server. To see what it means let&#39;s first take a look at the diagram below:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-sHFxyYtu4TI/VPcQg08yjTI/AAAAAAAAATc/c0Nrto-ntpY/s1600/diagram.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-sHFxyYtu4TI/VPcQg08yjTI/AAAAAAAAATc/c0Nrto-ntpY/s1600/diagram.png&quot; height=&quot;278&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Let&#39;s assume the following: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Team Lead installed and configured custom policy in his Visual Studio.&lt;/li&gt;&lt;li&gt;Developer A installed custom policy plugin in his Visual Studio.&lt;/li&gt;&lt;li&gt;Developer B did not install custom policy plugin in his Visual Studio.&lt;/li&gt;&lt;/ul&gt;In this case the Team Lead and Developer A will have custom policy installed and configured properly(settings are stored in TFS server) but Developer B will not use this custom policy at all (so he will successfully check-in even if his code doesn&#39;t meet policy requirements). That&#39;s why installing custom policy plugin should be a part of onboarding process for each developer.  &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Creating custom check-in policy &lt;/h3&gt;A good place to start developing custom check-in policy is &lt;a href=&quot;http://blogs.msdn.com/b/jimlamb/archive/2010/03/31/how-to-implement-package-and-deploy-custom-check-in-policy-for-tfs-2010.aspx&quot;&gt;this tutorial&lt;/a&gt; (remember to install Visual Studio SDK before you dive in). It explains the basics well but during development of our custom check-in policy we had to solve some interesting problems that weren&#39;t covered there:  &lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Custom check-in policy created for one version of Visual Studio will not work with other versions. That&#39;s because the version of assembly &lt;em&gt;Microsoft.TeamFoundation.VersionControl.Client&lt;/em&gt; referenced from your plugin has to match version of target Visual Studio. That&#39;s why we&#39;ve created separate packages for VS 2010, 2012 and 2013 that reference the Core project with business logic. Taking into account the fact that for each VS you need a separate VSIX package the structure of our plugin looks as follows: &lt;br /&gt;&lt;br /&gt; &lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-F8vMq_vkP4I/VPcRUAgkWrI/AAAAAAAAATo/JihVCheAzws/s1600/diagram.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-F8vMq_vkP4I/VPcRUAgkWrI/AAAAAAAAATo/JihVCheAzws/s1600/diagram.png&quot; height=&quot;252&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt; &lt;br /&gt;Plugin projects are just very thin wrappers for Core. The code looks exactly the same for VS 2010, 2012 and 2013 so we took advantage from &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/9f4t9t92(v=vs.90).aspx&quot;&gt;Add as Link&lt;/a&gt; functionality in Visual Studio to have only one copy of source files.  &lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Initially we configured assembly name for projects &#39;Plugin for VS 2010&#39;, &#39;Plugin for VS 2012&#39; and &#39;Plugin for VS 2013&#39; in the following way: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;&#39;Plugin for VS 2010&#39; produced an assembly called &lt;em&gt;CheckinPolicyVS2010.dll&lt;/em&gt;,&lt;/li&gt;&lt;li&gt;&#39;Plugin for VS 2012&#39; produced an assembly called &lt;em&gt;CheckinPolicyVS2012.dll&lt;/em&gt;,&lt;/li&gt;&lt;li&gt;&#39;Plugin for VS 2013&#39; produced an assembly called &lt;em&gt;CheckinPolicyVS2013.dll&lt;/em&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Now let&#39;s assume that the Team Leader has installed and configured our custom check-in policy using Visual Studio 2010. The problem is that TFS stores assembly name in which custom check-in policy is defined (in this case &lt;em&gt;CheckinPolicyVS2010.dll&lt;/em&gt;) in central TFS server. So the custom policy will work for team members using VS 2010 but not for these using VS 2012 and VS 2013 (Because they don&#39;t have &lt;em&gt;CheckinPolicyVS2010.dll&lt;/em&gt;). The solution is to set the same assembly name for all three mentioned projects.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Our custom policy connects with JIRA so we need to store somewhere connection credentials. Of course central TFS server is not a good place for such data so we decided to use &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/ms995355.aspx&quot;&gt;Data Protection API&lt;/a&gt; (DPAPI) to encrypt them and store locally for each developer. We used the great &lt;a href=&quot;https://www.nuget.org/packages/EasySec/&quot;&gt;EasySec&lt;/a&gt; nuget package to work in DPAPI. It gives you a very convinient API to encrypt and decrypt data:  &lt;pre style=&quot;border: 1px dashed white; padding: 15px; width: 600px;&quot;&gt;var encryptor = new EasySec.Encryption.DPAPIEncryptor();&lt;br /&gt;var stringToEncrypt = &quot;stringToEncrypt&quot;;&lt;br /&gt; &lt;br /&gt;var encryptedString = encryptor.Encrypt(stringToEncrypt);&lt;br /&gt;var decryptedString = encryptor.Decrypt(encryptedString); &lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h3&gt;Source code&lt;/h3&gt;You can find the source code for our plugin on &lt;a href=&quot;https://bitbucket.org/spartez/jiraissuekeycheckinpolicy/wiki/Home&quot;&gt;Bitbucket&lt;/a&gt;. Feel free to comment and contribute.</content><link rel='replies' type='application/atom+xml' href='http://unimplemented.blogspot.com/feeds/6184141982070185751/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://unimplemented.blogspot.com/2015/03/implementing-custom-check-in-policy-for.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/6184141982070185751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/6184141982070185751'/><link rel='alternate' type='text/html' href='http://unimplemented.blogspot.com/2015/03/implementing-custom-check-in-policy-for.html' title='Implementing custom check-in policy for Visual Studio'/><author><name>Mateusz Zieliński</name><uri>http://www.blogger.com/profile/05013964278129752660</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-Bm8AlDwnfZA/VPcaddZD23I/AAAAAAAAAUA/SB04fJt_zj0/s72-c/issue_view_checkins.ss.png" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8813074174707015455.post-5892485540029177198</id><published>2014-07-28T16:03:00.000+01:00</published><updated>2014-07-28T16:05:25.857+01:00</updated><title type='text'>Spartez sunny summer releases: Quick Notes, Agile Cards and more.</title><content type='html'>&lt;br /&gt;&lt;h3&gt;Although the holiday season is taking a toll on our team (sunny skies outside and the proximity of the &amp;nbsp;beach seem to have something to do with this...) we&#39;re always cooking comething in our Spartez lab.&lt;/h3&gt;&lt;br /&gt;Probably deserving the highest praise in this regard are &lt;a href=&quot;http://spartez.com/quicknotes&quot; target=&quot;_blank&quot;&gt;Quick Notes&lt;/a&gt;, formerly known as “kwik!”. Having recently gone a thorough makeover in terms of general appearance and functionalities, followed by a series of new releases with significant bugfixes, this clever little plugin is now improved and perfect for taking notes while browsing Confluence pages, just as you would use Post-It for annotating the content of a physical piece of paper.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-qAINAqt40v4/U9Zk6D2yMyI/AAAAAAAAAIk/4HiHkob-Pmc/s1600/QN1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-qAINAqt40v4/U9Zk6D2yMyI/AAAAAAAAAIk/4HiHkob-Pmc/s1600/QN1.png&quot; height=&quot;195&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;i&gt;Quick Notes can be created in a number of ways, whichever the user finds most convenient. They support Wiki Markup, so that their content will always be clear and look professional.&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-v1L8kfbguwU/U9ZlJBaLsnI/AAAAAAAAAIs/xVzCueFNdog/s1600/QN2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-v1L8kfbguwU/U9ZlJBaLsnI/AAAAAAAAAIs/xVzCueFNdog/s1600/QN2.png&quot; height=&quot;195&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;i&gt;&lt;/i&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;i&gt;&lt;i&gt;If you want to notify someone using your Quick Note, just type&#39;@&#39; followed by their username into the note&#39;s content and this user will receive an automatic e-mail notification from you.&lt;/i&gt;&lt;/i&gt;&lt;/div&gt;&lt;i&gt;&lt;/i&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-lnfFB6dkMIY/U9ZlStPnpjI/AAAAAAAAAI0/abatxtIbUQI/s1600/QN3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-lnfFB6dkMIY/U9ZlStPnpjI/AAAAAAAAAI0/abatxtIbUQI/s1600/QN3.png&quot; height=&quot;195&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;i&gt;If a Quick Note overlaps a piece of the text that you are reading, just click on the &#39;x&#39; button in the top right corner of the note to dismiss it. To reopen the note click on the highlighted text which it refers to.&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://spartez.com/agilecards&quot; target=&quot;_blank&quot;&gt;Agile Cards&lt;/a&gt; have also made it to the new release delivery box. The series of recent usability improvements and bugfixes includes a few changes regarding the card templates. The cards’ print settings have been moved to templates; print templates can now be selected when printing from JIRA Agile boards. Also, templates are no longer linked to individual projects and are now sorted alphabetically in the &quot;Select template&quot; screen.&lt;br /&gt;&lt;br /&gt;Coming up soon is a new release of &lt;a href=&quot;http://spartez.com/tfs4jira&quot; target=&quot;_blank&quot;&gt;TFS4JIRA&lt;/a&gt; with lots of new synchronization features.&lt;br /&gt;In the meantime we’re slipping on our geeky flip-flops on, grabbing a handful of wifi and making our way over to the beach to continue summer’s developments… See you in the sun!&lt;br /&gt;&lt;h2&gt;&amp;nbsp;&lt;/h2&gt;</content><link rel='replies' type='application/atom+xml' href='http://unimplemented.blogspot.com/feeds/5892485540029177198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://unimplemented.blogspot.com/2014/07/spartez-sunny-summer-releases-quick.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/5892485540029177198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/5892485540029177198'/><link rel='alternate' type='text/html' href='http://unimplemented.blogspot.com/2014/07/spartez-sunny-summer-releases-quick.html' title='Spartez sunny summer releases: Quick Notes, Agile Cards and more.'/><author><name>Spartez Product Team</name><uri>http://www.blogger.com/profile/02180218414180138867</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-qAINAqt40v4/U9Zk6D2yMyI/AAAAAAAAAIk/4HiHkob-Pmc/s72-c/QN1.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8813074174707015455.post-3565386997675064417</id><published>2014-05-15T10:51:00.000+01:00</published><updated>2014-05-15T10:52:01.399+01:00</updated><title type='text'>It&#39;s a world of things out there</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;Our asset management standalone system a.k.a. Ephor has moved to the next level &lt;a href=&quot;http://ephor.spartez.com/&quot; target=&quot;_blank&quot;&gt;with its very own, dedicated minisite&lt;/a&gt;:&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://ephor.spartez.com/&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-wg2I7jz4MLI/U3SJCpC6JNI/AAAAAAAAAIU/zA6pp8MFHWM/s1600/Ephor+website.png&quot; height=&quot;237&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;span id=&quot;goog_2050011066&quot;&gt;&lt;/span&gt;&lt;span id=&quot;goog_2050011067&quot;&gt;&lt;/span&gt;&lt;a href=&quot;https://www.blogger.com/&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;From now on &lt;a href=&quot;http://ephor.spartez.com/&quot; target=&quot;_blank&quot;&gt;ephor.spartez.com&lt;/a&gt; will be our all-Ephor-related information hub, frequently feeded with practical tips and hints, with a bit of fun and a tinge of Ephor-pink to spice things up.&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;We&#39;ve also taken a brave headfirst dive into asset management and launched an Ephor-linked &lt;a href=&quot;https://www.facebook.com/pages/World-of-Things/1403639113251668&quot; target=&quot;_blank&quot;&gt;Facebook site entitled &quot;World of Things&quot;&lt;/a&gt;, where we&#39;ll be&amp;nbsp;exploring a whole new view on asset management, stretching from packing a suitcase for a business trip or a survival camp (it&#39;s an asset management challenge, take it from us!) to the hazards of maintaining outdated office equipment.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Drop by and grab some asset management themed miscellanea!&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://unimplemented.blogspot.com/feeds/3565386997675064417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://unimplemented.blogspot.com/2014/05/its-world-of-things-out-there.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/3565386997675064417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/3565386997675064417'/><link rel='alternate' type='text/html' href='http://unimplemented.blogspot.com/2014/05/its-world-of-things-out-there.html' title='It&#39;s a world of things out there'/><author><name>Spartez Product Team</name><uri>http://www.blogger.com/profile/02180218414180138867</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-wg2I7jz4MLI/U3SJCpC6JNI/AAAAAAAAAIU/zA6pp8MFHWM/s72-c/Ephor+website.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8813074174707015455.post-2879289857793117957</id><published>2014-05-15T10:19:00.001+01:00</published><updated>2014-05-15T10:20:41.479+01:00</updated><title type='text'>JIRA Service Desk integrable Ephor4JIRA</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://spartez.com/ephor4jira&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-pRIoWyvm6CM/U3NY1eM5IBI/AAAAAAAAAHQ/itDKCIcqjXc/s1600/Ephor4JIRA_banner_blog.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align=&quot;JUSTIFY&quot; style=&quot;page-break-inside: avoid; widows: 8;&quot;&gt;&lt;h3&gt;&lt;span style=&quot;text-decoration: none;&quot;&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;&lt;span style=&quot;font-style: normal;&quot;&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;Now that the our Ephor standalone asset management system is out and about, we’ve &amp;nbsp;recently launched a &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;text-decoration: none;&quot;&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;&lt;span style=&quot;font-style: normal;&quot;&gt;&lt;u&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;background: transparent;&quot;&gt;&lt;a href=&quot;http://spartez.com/ephor4jira&quot; target=&quot;_blank&quot;&gt;Service Desk-integrable Ephor4JIRA app&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;text-decoration: none;&quot;&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;&lt;span style=&quot;font-style: normal;&quot;&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;background: transparent;&quot;&gt;.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;/div&gt;&lt;div align=&quot;JUSTIFY&quot; style=&quot;page-break-inside: avoid; widows: 8;&quot;&gt;&lt;span style=&quot;text-decoration: none;&quot;&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;&lt;span style=&quot;font-style: normal;&quot;&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;background: transparent;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;JUSTIFY&quot; style=&quot;page-break-inside: avoid; widows: 8;&quot;&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;While the standalone version of Ephor is integrable with Atlassian JIRA - so that you can create issues such as “Replace ink cartridge in printer” or “Buy 20 more chairs like this one for conference room” straight from the concerned item view in Ephor and immediately see them pop up in JIRA - the Ephor4JIRA app is basically a second incarnation of the same software that goes one step further. It’s a JIRA plugin, which besides JIRA itself, also integrates directly with JIRA Service Desk. Plus, user management in Ephor4JIRA is (obviously) transparently integrated with JIRA&#39;s.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;Here is a small preview:&lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;JUSTIFY&quot; style=&quot;page-break-inside: avoid; widows: 8;&quot;&gt;&lt;span style=&quot;text-decoration: none;&quot;&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;&lt;span style=&quot;font-style: normal;&quot;&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;&lt;span style=&quot;background: transparent;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-pDYTzjj6oIo/U3NdtMFSVkI/AAAAAAAAAHg/l5Duw9qFPGU/s1600/E4J_1L.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-pDYTzjj6oIo/U3NdtMFSVkI/AAAAAAAAAHg/l5Duw9qFPGU/s1600/E4J_1L.png&quot; height=&quot;195&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-50EtFySTczY/U3Nd9cPWZxI/AAAAAAAAAHo/k1X-g5ASVSo/s1600/E4J_2L.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-50EtFySTczY/U3Nd9cPWZxI/AAAAAAAAAHo/k1X-g5ASVSo/s1600/E4J_2L.png&quot; height=&quot;195&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-lx0K8Ivr0_0/U3NeBYkA1OI/AAAAAAAAAHw/nT2lUnjYo_I/s1600/E4J_3L.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-lx0K8Ivr0_0/U3NeBYkA1OI/AAAAAAAAAHw/nT2lUnjYo_I/s1600/E4J_3L.png&quot; height=&quot;195&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align=&quot;JUSTIFY&quot; style=&quot;font-style: normal; font-weight: normal; page-break-inside: avoid; text-decoration: none; widows: 8;&quot;&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;&lt;span style=&quot;background: transparent;&quot;&gt;So if you already have JIRA and want to tightly integrate it with your asset management - you should probably go for&amp;nbsp;&lt;a href=&quot;https://my.atlassian.com/addon/try/com.spartez.jira.plugins.ephor-for-jira?referrer=pac&amp;amp;binaryURL=https%3A%2F%2Fmarketplace.atlassian.com%2Fdownload%2Fplugins%2Fcom.spartez.jira.plugins.ephor-for-jira%2Fversion%2F100000210&quot; target=&quot;_blank&quot;&gt;Ephor4JIRA&lt;/a&gt;.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;&lt;span style=&quot;background: transparent;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;&lt;span style=&quot;background: transparent;&quot;&gt;If you don&#39;t have JIRA, or if you want to have a separate asset management server that is not hosted in JIRA (but can talk to JIRA, delegating asset workflows to it) - use &lt;a href=&quot;http://ephor.spartez.com/&quot; target=&quot;_blank&quot;&gt;Ephor standalone&lt;/a&gt;. &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;JUSTIFY&quot; style=&quot;font-weight: normal; page-break-inside: avoid; widows: 8;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align=&quot;JUSTIFY&quot; style=&quot;page-break-inside: avoid; widows: 8;&quot;&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;Both of these solutions are available for a free 30-day evaluation period (or, if you have no more than 100 assets to manage, they’re free altogether!) and offer what, from our own experience, we feel is most important for such a system to actually be useful to any serious asset-management enthusiast.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://unimplemented.blogspot.com/feeds/2879289857793117957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://unimplemented.blogspot.com/2014/05/jira-service-desk-integrable-ephor4jira.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/2879289857793117957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/2879289857793117957'/><link rel='alternate' type='text/html' href='http://unimplemented.blogspot.com/2014/05/jira-service-desk-integrable-ephor4jira.html' title='JIRA Service Desk integrable Ephor4JIRA'/><author><name>Spartez Product Team</name><uri>http://www.blogger.com/profile/02180218414180138867</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-pRIoWyvm6CM/U3NY1eM5IBI/AAAAAAAAAHQ/itDKCIcqjXc/s72-c/Ephor4JIRA_banner_blog.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8813074174707015455.post-5523236953792076003</id><published>2014-03-12T21:27:00.000+01:00</published><updated>2014-03-13T11:18:59.779+01:00</updated><title type='text'>Ephor 1.0: new promo cartoon</title><content type='html'>Yes, we believe in unorthodox marketing ;-).  &lt;br /&gt;&lt;br /&gt;But really, imagine if you were a yak breeder. You&#39;d surely need an asset management system, right?&lt;br /&gt;&lt;br /&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;//www.youtube.com/embed/okUtevc8NdM?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://unimplemented.blogspot.com/feeds/5523236953792076003/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://unimplemented.blogspot.com/2014/03/ephor-10-new-promo-cartoon.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/5523236953792076003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/5523236953792076003'/><link rel='alternate' type='text/html' href='http://unimplemented.blogspot.com/2014/03/ephor-10-new-promo-cartoon.html' title='Ephor 1.0: new promo cartoon'/><author><name>Spartez Product Team</name><uri>http://www.blogger.com/profile/02180218414180138867</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8813074174707015455.post-7015937926224019360</id><published>2014-03-11T14:55:00.004+01:00</published><updated>2014-03-11T15:14:32.188+01:00</updated><title type='text'>Agile Poker on the go.</title><content type='html'>&lt;div style=&quot;page-break-after: auto; page-break-before: auto; page-break-inside: avoid;&quot;&gt;We’ve added a new feature to Agile Poker and made it mobile. It’s now possible to evaluate user stories and participate in Agile Poker sessions using a mobile device.&lt;/div&gt;&lt;div style=&quot;page-break-after: auto; page-break-before: auto; page-break-inside: avoid;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;page-break-inside: avoid;&quot;&gt;Imagine that your project team is away from their desks, taking part in a meeting where several user stories are to be voted. All of you no longer have to carry your laptops to the conference room to run an Agile Poker session - your phones are all you need. The Scrum Master presents the issue on the conference room TV or projector and you...  just grab your smartphone, log into JIRA and wait for the Scrum Master to select the story:&lt;/div&gt;&lt;div style=&quot;page-break-inside: avoid;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-054lejHS8g4/Ux8VZLkxyRI/AAAAAAAAAGo/IZxlk7SKFwQ/s1600/WP_001217.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-054lejHS8g4/Ux8VZLkxyRI/AAAAAAAAAGo/IZxlk7SKFwQ/s1600/WP_001217.jpg&quot; height=&quot;320&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;page-break-inside: avoid;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;page-break-inside: avoid;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;page-break-after: auto; page-break-before: auto; page-break-inside: avoid;&quot;&gt;The Agile Poker deck pops up on your phone’s screen ready for voting to be done:&lt;/div&gt;&lt;div style=&quot;page-break-after: auto; page-break-before: auto; page-break-inside: avoid;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-mP5poSbmj1Y/Ux8VgcGTrzI/AAAAAAAAAGw/DGAFcrH3P3w/s1600/WP_001218.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-mP5poSbmj1Y/Ux8VgcGTrzI/AAAAAAAAAGw/DGAFcrH3P3w/s1600/WP_001218.jpg&quot; height=&quot;320&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;page-break-after: auto; page-break-before: auto; page-break-inside: avoid;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;page-break-after: auto; page-break-before: auto; page-break-inside: avoid;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;page-break-after: auto; page-break-before: auto; page-break-inside: avoid;&quot;&gt;The team make their estimates:&lt;/div&gt;&lt;div style=&quot;page-break-after: auto; page-break-before: auto; page-break-inside: avoid;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-qL_7PO5XTio/Ux8VmhK0pBI/AAAAAAAAAG4/cm0keL8hVo4/s1600/WP_001226.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-qL_7PO5XTio/Ux8VmhK0pBI/AAAAAAAAAG4/cm0keL8hVo4/s1600/WP_001226.jpg&quot; height=&quot;320&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;page-break-after: auto; page-break-before: auto; page-break-inside: avoid;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;page-break-after: auto; page-break-before: auto; page-break-inside: avoid;&quot;&gt;&lt;/div&gt;&lt;div align=&quot;JUSTIFY&quot; style=&quot;page-break-after: auto; page-break-before: auto; page-break-inside: avoid; widows: 8;&quot;&gt;Once the session is completed, your vote shows on your screen along with the average vote for that session.&lt;/div&gt;&lt;div align=&quot;JUSTIFY&quot; style=&quot;page-break-after: auto; page-break-before: auto; page-break-inside: avoid; widows: 8;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-jsUnHAATLLo/Ux8Vw2DNt7I/AAAAAAAAAHA/jpBaktb-zVw/s1600/WP_001227.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-jsUnHAATLLo/Ux8Vw2DNt7I/AAAAAAAAAHA/jpBaktb-zVw/s1600/WP_001227.jpg&quot; height=&quot;320&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;JUSTIFY&quot; style=&quot;page-break-after: auto; page-break-before: auto; page-break-inside: avoid; widows: 8;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align=&quot;JUSTIFY&quot; style=&quot;page-break-after: auto; page-break-before: auto; page-break-inside: avoid; widows: 8;&quot;&gt;&lt;/div&gt;&lt;div align=&quot;JUSTIFY&quot; style=&quot;page-break-after: auto; page-break-before: auto; page-break-inside: avoid; widows: 8;&quot;&gt;&amp;nbsp;Voila! You’re ready for the next voting to begin.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://unimplemented.blogspot.com/feeds/7015937926224019360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://unimplemented.blogspot.com/2014/03/agile-poker-on-go.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/7015937926224019360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/7015937926224019360'/><link rel='alternate' type='text/html' href='http://unimplemented.blogspot.com/2014/03/agile-poker-on-go.html' title='Agile Poker on the go.'/><author><name>Spartez Product Team</name><uri>http://www.blogger.com/profile/02180218414180138867</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-054lejHS8g4/Ux8VZLkxyRI/AAAAAAAAAGo/IZxlk7SKFwQ/s72-c/WP_001217.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8813074174707015455.post-8299023713487950263</id><published>2014-02-27T14:46:00.000+01:00</published><updated>2014-02-28T10:18:01.311+01:00</updated><title type='text'>Ephor 1.0: Down to business</title><content type='html'>&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-nyOWHfBMtng/Uw8_5W7QTRI/AAAAAAAAAFI/7zKneLq8BXA/s1600/Ephor_+1.0+followup_banner_blog.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-nyOWHfBMtng/Uw8_5W7QTRI/AAAAAAAAAFI/7zKneLq8BXA/s1600/Ephor_+1.0+followup_banner_blog.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align=&quot;LEFT&quot; style=&quot;font-style: normal; font-weight: normal; page-break-inside: avoid; text-decoration: none; widows: 1;&quot;&gt;&lt;div align=&quot;LEFT&quot; style=&quot;font-style: normal; font-weight: normal; page-break-inside: avoid; text-decoration: none; widows: 1;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: white; font-family: inherit;&quot;&gt;With the initial fireworks out of the way and Ephor 1.0 well on its way, here’s a short follow-up to what Ephor has in store for all you serious enterprise / inventory / resource asset management enthusiasts out there. The “Electronics” sample data scheme embedded in Ephor 1.0 is a good real-life illustration of the office IT equipment use case scenario.&lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;widows: 1;&quot;&gt;&lt;span style=&quot;color: white; font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;page-break-inside: avoid;&quot;&gt;&lt;span style=&quot;color: white; font-family: inherit;&quot;&gt;Without breaking it up into too much detail, this is basically what your exemplary “Electronics” item classes and hierarchical categories could look like once your equipment categories and subcategories are defined and all concerned employees / users identified.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;font-style: normal; font-weight: normal; page-break-inside: avoid; text-decoration: none; widows: 1;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;background: transparent;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-MaAXV4qQvhs/Uw9AFzioUpI/AAAAAAAAAFQ/xOJylhTKOEo/s1600/2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-MaAXV4qQvhs/Uw9AFzioUpI/AAAAAAAAAFQ/xOJylhTKOEo/s1600/2.png&quot; height=&quot;168&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;font-style: normal; font-weight: normal; page-break-inside: avoid; text-decoration: none; widows: 1;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;font-style: normal; font-weight: normal; page-break-inside: avoid; text-decoration: none; widows: 1;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-OgdUBJ-1W-o/Uw9AMqlPn9I/AAAAAAAAAFY/Q-vjUn0lkDc/s1600/8.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-OgdUBJ-1W-o/Uw9AMqlPn9I/AAAAAAAAAFY/Q-vjUn0lkDc/s1600/8.png&quot; height=&quot;168&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;font-style: normal; font-weight: normal; page-break-inside: avoid; text-decoration: none; widows: 1;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;font-style: normal; font-weight: normal; page-break-inside: avoid; text-decoration: none; widows: 1;&quot;&gt;&lt;div align=&quot;LEFT&quot; style=&quot;page-break-inside: avoid; widows: 129;&quot;&gt;&lt;span style=&quot;color: white; font-family: inherit;&quot;&gt;It’s fully customizable, so really &lt;/span&gt;&lt;span style=&quot;color: white;&quot;&gt;the&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: white; font-family: inherit;&quot;&gt;data scheme possibilities are endless. For, let’s say, computers, the fields you may need would probably include title; user; value; serial number; CPU vendor, model &amp;amp; speed; cores count; RAM size and such. Once you define these field types for a specific item / asset type, here’s what uploading a new computer to Ephor could look like (if you choose to do it by hand instead of the built-in automagic hardware scanning PC Collector app):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;widows: 1;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-2QUaJlMqvbg/Uw9AcrsvAvI/AAAAAAAAAFk/RBcGuBOiNDE/s1600/3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-2QUaJlMqvbg/Uw9AcrsvAvI/AAAAAAAAAFk/RBcGuBOiNDE/s1600/3.png&quot; height=&quot;168&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: Arial; font-size: 17px; text-align: -webkit-left; widows: 1;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;&lt;span style=&quot;color: white; font-family: inherit; text-align: -webkit-left; widows: 1;&quot;&gt;And here’s how the uploaded item would be visible:&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: Arial; font-size: 17px; text-align: -webkit-left; widows: 1;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-pxX3JUxdcfc/Uw9AoLPygWI/AAAAAAAAAFo/RGfyY8QVIsI/s1600/4.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-pxX3JUxdcfc/Uw9AoLPygWI/AAAAAAAAAFo/RGfyY8QVIsI/s1600/4.png&quot; height=&quot;168&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;font-style: normal; font-weight: normal; page-break-inside: avoid; text-decoration: none; widows: 1;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: white; font-family: inherit;&quot;&gt;Once you have your new computer uploaded into Ephor and you find yourself in need of, let’s say, screen wipes, you can create a JIRA® issue straight out of the item view in Ephor to facilitate your need:&lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;font-style: normal; font-weight: normal; page-break-inside: avoid; text-decoration: none; widows: 1;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;background: transparent;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-N4iGr3Iyw_U/Uw9A0s3yvkI/AAAAAAAAAFw/Abqt70df9hk/s1600/5.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-N4iGr3Iyw_U/Uw9A0s3yvkI/AAAAAAAAAFw/Abqt70df9hk/s1600/5.png&quot; height=&quot;168&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;&lt;span style=&quot;color: white; font-family: inherit; text-align: -webkit-left; widows: 1;&quot;&gt;The created issue will pop up in JIRA®...&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: Arial; font-size: 17px; text-align: -webkit-left; widows: 1;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-gob_yXiBsA8/Uw9A5Abdv4I/AAAAAAAAAF4/5tJdAR4o-LE/s1600/6.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-gob_yXiBsA8/Uw9A5Abdv4I/AAAAAAAAAF4/5tJdAR4o-LE/s1600/6.png&quot; height=&quot;168&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;font-style: normal; font-weight: normal; page-break-inside: avoid; text-decoration: none; widows: 1;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: white; font-family: inherit;&quot;&gt;… and the link to the issue (and all other created &amp;amp; related issues) will be visible in the item view:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;&lt;span style=&quot;font-family: Times, Times New Roman, serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-dbnqvnh1Sks/Uw9BCYCUM4I/AAAAAAAAAGA/FirTT54tL0M/s1600/7.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-dbnqvnh1Sks/Uw9BCYCUM4I/AAAAAAAAAGA/FirTT54tL0M/s1600/7.png&quot; height=&quot;168&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;font-style: normal; font-weight: normal; page-break-inside: avoid; text-decoration: none; widows: 1;&quot;&gt;&lt;span style=&quot;font-family: Arial; font-size: 17px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;font-style: normal; font-weight: normal; page-break-inside: avoid; text-decoration: none; widows: 1;&quot;&gt;&lt;span style=&quot;color: white; font-family: inherit;&quot;&gt;At some point you’ll also probably want to know which users in your organization own / use / maintain which pieces or sets of equipment. This can be recorded in Ephor by inking items with items &amp;amp; items with users.&lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;font-style: normal; font-weight: normal; page-break-inside: avoid; text-decoration: none; widows: 1;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-GiYEjeuyVi4/Uw9BIv1PU_I/AAAAAAAAAGI/yQ50RPljcFI/s1600/9.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-GiYEjeuyVi4/Uw9BIv1PU_I/AAAAAAAAAGI/yQ50RPljcFI/s1600/9.png&quot; height=&quot;168&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;font-style: normal; font-weight: normal; page-break-inside: avoid; text-decoration: none; widows: 1;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: white; font-family: inherit;&quot;&gt;If a user has a lot of assets assigned to them, a link graph view may come in handy for a clearer perspective:&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;background: transparent;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-oRqn7FqkgXQ/Uw9BPUHxNRI/AAAAAAAAAGQ/eU5ucKpEB98/s1600/10.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-oRqn7FqkgXQ/Uw9BPUHxNRI/AAAAAAAAAGQ/eU5ucKpEB98/s1600/10.png&quot; height=&quot;168&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;font-style: normal; font-weight: normal; page-break-inside: avoid; text-decoration: none; widows: 1;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;font-style: normal; font-weight: normal; page-break-inside: avoid; text-decoration: none; widows: 1;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: white; font-family: inherit;&quot;&gt;Last but not least, assets uploaded into Ephor can be browsed by custom queries. The most often ran searches can be saved and used as predefined queries, either only by you or by all Ephor users (hence the “My searches” and Public searches” distinction):&lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;font-style: normal; font-weight: normal; page-break-inside: avoid; text-decoration: none; widows: 1;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;background: transparent;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-WwIVzJ-anF0/Uw9BUn31nNI/AAAAAAAAAGY/eXZQ8L_QHQU/s1600/11.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-WwIVzJ-anF0/Uw9BUn31nNI/AAAAAAAAAGY/eXZQ8L_QHQU/s1600/11.png&quot; height=&quot;168&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;font-style: normal; font-weight: normal; page-break-inside: avoid; text-decoration: none; widows: 1;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;font-family: Arial;&quot;&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;background: transparent;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align=&quot;LEFT&quot; style=&quot;font-style: normal; font-weight: normal; page-break-inside: avoid; text-decoration: none; widows: 1;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: white; font-family: inherit;&quot;&gt;Ok. That’s it for now. Coming up: a series of short Ephor demos to get those still screens moving with some commentary in the background and a new, tailor-made Ephor website.&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;color: white; font-family: inherit; widows: 1;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: white; font-family: inherit; widows: 1;&quot;&gt;We’re also working hard on preparing Ephor to meet the real world during two big international events in March. More on this soon. Stay tuned.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: white; font-family: inherit; widows: 1;&quot;&gt;&lt;br /&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://unimplemented.blogspot.com/feeds/8299023713487950263/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://unimplemented.blogspot.com/2014/02/ephor-10-down-to-business.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/8299023713487950263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/8299023713487950263'/><link rel='alternate' type='text/html' href='http://unimplemented.blogspot.com/2014/02/ephor-10-down-to-business.html' title='Ephor 1.0: Down to business'/><author><name>Spartez Product Team</name><uri>http://www.blogger.com/profile/02180218414180138867</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-nyOWHfBMtng/Uw8_5W7QTRI/AAAAAAAAAFI/7zKneLq8BXA/s72-c/Ephor_+1.0+followup_banner_blog.png" height="72" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8813074174707015455.post-2339087241127017734</id><published>2014-02-10T17:29:00.002+01:00</published><updated>2014-02-14T20:06:00.601+01:00</updated><title type='text'>Ephor 1.0: new features &amp; tweaks, pricing &amp; Valentine&#39;s Day themed sample data.</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-3TgFZ5uSKKQ/Uvj1JERZJrI/AAAAAAAAACg/ep1Y0zdqgNY/s1600/Ephor_1.0_banner_blog.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-3TgFZ5uSKKQ/Uvj1JERZJrI/AAAAAAAAACg/ep1Y0zdqgNY/s1600/Ephor_1.0_banner_blog.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;As of today, &lt;a href=&quot;http://spartez.com/ephor&quot;&gt;Ephor&#39;s 1.0 release is officially out and about&lt;/a&gt;, ready for &lt;a href=&quot;http://spartez.com/ephor/buy&quot;&gt;evaluation and purchase&lt;/a&gt;. The package includes two brand new sample data sets, one of them filled with seasonal romance, hearts and unicorns. No doubt about it - this year Cupid&#39;s Valentine&#39;s-Day-management job will be nice and easy with Ephor, so buckle up for those cards and candy coming in.&lt;br /&gt;&lt;br /&gt; &lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-wydtUbvrmEY/Uvj8gFO0ZLI/AAAAAAAAAD0/_mBfn0M5p3A/s1600/Ephor+1.0_blog_home+screen.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-wydtUbvrmEY/Uvj8gFO0ZLI/AAAAAAAAAD0/_mBfn0M5p3A/s1600/Ephor+1.0_blog_home+screen.png&quot; height=&quot;159&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-BaDU868yVCo/Uvj8p374U_I/AAAAAAAAAD8/I_AKSoHYk_0/s1600/Ephor+1.0_blog_gifts.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-BaDU868yVCo/Uvj8p374U_I/AAAAAAAAAD8/I_AKSoHYk_0/s1600/Ephor+1.0_blog_gifts.png&quot; height=&quot;160&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-3RhBSqJdzt4/Uvj89rFor-I/AAAAAAAAAEM/UzTKHm-6WsI/s1600/Ephor+1.0_blog_gift+view.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-3RhBSqJdzt4/Uvj89rFor-I/AAAAAAAAAEM/UzTKHm-6WsI/s1600/Ephor+1.0_blog_gift+view.png&quot; height=&quot;160&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;The other sample data set is our own office hardware automagically scanned into Ephor with the help of the built-in PC Collector app. Not as entertaining as the Valentine&#39;s Day stuff, but probably a little easier to relate to in terms of everyday life, this sample data set lets you take a sneak peek at exactly how we at Spartez manage our electronic equipment using Ephor, with the sole difference being the actual users, whom we&#39;ve chosen to disguise under the identities of Greek philosophers. Eureka ;-).&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-2859DZ5wWyA/Uvj92srcI0I/AAAAAAAAAEY/HH62OaExUOY/s1600/Ephor+1.0_blog_employees.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-2859DZ5wWyA/Uvj92srcI0I/AAAAAAAAAEY/HH62OaExUOY/s1600/Ephor+1.0_blog_employees.png&quot; height=&quot;159&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-xxSNEhJeGDI/Uvj9-FgHmxI/AAAAAAAAAEg/Gqtgb8TXHu0/s1600/Ephor+1.0_blog_keyboards.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-xxSNEhJeGDI/Uvj9-FgHmxI/AAAAAAAAAEg/Gqtgb8TXHu0/s1600/Ephor+1.0_blog_keyboards.png&quot; height=&quot;161&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;Anyway, as for Ephor itself, since its December 2013 EAP BETA release, we&#39;ve tweaked the majority of the existing features and introduced a few new gimmicks, such as saving search filters, keyboard navigation &amp;amp; inter-item link hierarchy browser in the form of a clickable graph.&lt;span style=&quot;background-color: white; color: #222222; font-family: Arial, sans-serif; font-size: 14px; line-height: 1.4285715;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-IbLrER4qIhQ/Uvj-Eq1wtPI/AAAAAAAAAEo/tpYnNlArG4s/s1600/Ephor+1.0_blog_network+equipment.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-IbLrER4qIhQ/Uvj-Eq1wtPI/AAAAAAAAAEo/tpYnNlArG4s/s1600/Ephor+1.0_blog_network+equipment.png&quot; height=&quot;160&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/--tfTPX1pIdA/Uvj-J7mAJBI/AAAAAAAAAEw/2uMh52Qt2J8/s1600/Ephor+1.0_blog_items+with+memory+less+than+128GB_.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/--tfTPX1pIdA/Uvj-J7mAJBI/AAAAAAAAAEw/2uMh52Qt2J8/s1600/Ephor+1.0_blog_items+with+memory+less+than+128GB_.png&quot; height=&quot;160&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-6XQEJNqKR8E/Uvj-O0ex3uI/AAAAAAAAAE4/MmWgp0ZLPVs/s1600/Ephor+1.0_blog_iris+links.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-6XQEJNqKR8E/Uvj-O0ex3uI/AAAAAAAAAE4/MmWgp0ZLPVs/s1600/Ephor+1.0_blog_iris+links.png&quot; height=&quot;160&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;Clearly, there&#39;s a lot new stuff to try out and see, so if we&#39;ve managed to whet your asset management appetite, then &lt;a href=&quot;http://spartez.com/ephor/buy&quot;&gt;grab an Ephor 1.0 license from our website, evaluate away and purchase to use happily ever after&lt;/a&gt;. After wrapping our heads around the possible item management scenarios and intense discussions with regard to potential asset scopes we&#39;ve come to the conclusion that it&#39;s a complicated world our there. So, leaning towards the straightforward solution, we went for a simple pricing scheme with only four asset tiers:&lt;div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;up to 100 items - &lt;a href=&quot;http://ephorlicense.spartez.com/license/free&quot;&gt;Free!&lt;/a&gt;&lt;/li&gt;&lt;li&gt;up to 1,000 items - $1,000.00&amp;nbsp;&lt;/li&gt;&lt;li&gt;up to 10,000 items - $2,000.00&amp;nbsp;&lt;/li&gt;&lt;li&gt;unlimited items - $4,000.00&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;What a single item entity is, in terms of the assets which you want to manage, is for you to determine. An item of any type counts towards the license limit, so a file uploaded to Ephor is also a type of item. Naturally, system-generated items, such as built-in images of IT equipment, do not count. To learn more about the details, hop over to our website.&lt;br /&gt;&lt;br /&gt;We&#39;re all geared up for your comments, feedback and general demand, both &lt;a href=&quot;http://spartez.com/ephor&quot;&gt;here&lt;/a&gt; and on the &lt;a href=&quot;https://marketplace.atlassian.com/plugins/com.spartez.webapps.ephor&quot;&gt;Atlassian Marketplace (where Ephor is proudly displayed)&lt;/a&gt;, so fire away!&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: white; color: #333333; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://unimplemented.blogspot.com/feeds/2339087241127017734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://unimplemented.blogspot.com/2014/02/ephor-10-new-features-tweaks-pricing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/2339087241127017734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/2339087241127017734'/><link rel='alternate' type='text/html' href='http://unimplemented.blogspot.com/2014/02/ephor-10-new-features-tweaks-pricing.html' title='Ephor 1.0: new features &amp; tweaks, pricing &amp; Valentine&#39;s Day themed sample data.'/><author><name>Spartez Product Team</name><uri>http://www.blogger.com/profile/02180218414180138867</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-3TgFZ5uSKKQ/Uvj1JERZJrI/AAAAAAAAACg/ep1Y0zdqgNY/s72-c/Ephor_1.0_banner_blog.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8813074174707015455.post-8877955890130859411</id><published>2013-12-23T16:04:00.001+01:00</published><updated>2013-12-23T16:04:19.443+01:00</updated><title type='text'>Upcoming in Spartez Ephor - Link Hierarchy Browser</title><content type='html'>Just to let you know, the next Early Access Preview version of Ephor, due to be released just after Christmas, will include inter-item link hierarchy browser. It will let you visualize relationships between items as a clickable graph.&lt;br /&gt;&lt;br /&gt;See the attached screenshot of our &quot;Christmas&quot; sample data hierarchy for how it is going to look like. Nifty, isn&#39;t it?&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-p35rmudvt0I/UrhQGQdh3wI/AAAAAAAAE4E/43YudnipNA4/s1600/item+hierarchy.png&quot; imageanchor=&quot;1&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-p35rmudvt0I/UrhQGQdh3wI/AAAAAAAAE4E/43YudnipNA4/s400/item+hierarchy.png&quot; /&gt;&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://unimplemented.blogspot.com/feeds/8877955890130859411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://unimplemented.blogspot.com/2013/12/upcoming-in-spartez-ephor-link.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/8877955890130859411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/8877955890130859411'/><link rel='alternate' type='text/html' href='http://unimplemented.blogspot.com/2013/12/upcoming-in-spartez-ephor-link.html' title='Upcoming in Spartez Ephor - Link Hierarchy Browser'/><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/-p35rmudvt0I/UrhQGQdh3wI/AAAAAAAAE4E/43YudnipNA4/s72-c/item+hierarchy.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8813074174707015455.post-4269372051821682146</id><published>2013-12-17T11:02:00.002+01:00</published><updated>2014-02-14T20:23:59.378+01:00</updated><title type='text'>Meet Ephor. Your new asset manager with an excellent professional relationship with JIRA®.</title><content type='html'>&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://spartez.com/ephor&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-kxgahvW0Tus/UrAdbf5RmFI/AAAAAAAAAAc/6-C_9QO_0aI/s1600/Ephor+blog+banner.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;margin-top: 10px;&quot;&gt;&lt;br /&gt;&lt;br /&gt;For some time now we have been working on a new idea, a standalone application for managing assets. Literally any type of assets at all that any company out there might need to manage: from automobiles, buildings, computers and desks to wine bottles, xylophones, yaks and zucchinis. From A to Z. Having had a thorough look at the market, we came to the conclusion that all of the currently available solutions are either extremely expensive &amp;amp; complex do-it-all systems, or free &amp;amp; primitive, hardly-do-anything-at-all ones. There’s nothing in the middle, and frankly, nothing that we ourselves would like to use.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So here we are today launching an &lt;a href=&quot;http://spartez.com/ephor&quot;&gt;Early Access Preview Christmas Edition of Ephor&lt;/a&gt; - a behind-the-firewall standalone enterprise asset management system which can be integrated with Atlassian JIRA®, allowing you to finally get on top of your assets -&amp;nbsp;picture that! &lt;/div&gt;Some Ephor EAP Christmas Edition screens to help you with the picturing:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-BdA6Q29qM58/UrAfGIlH5KI/AAAAAAAAAAw/gdUhK3R1vxU/s1600/Ephor_580x330_screen2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-BdA6Q29qM58/UrAfGIlH5KI/AAAAAAAAAAw/gdUhK3R1vxU/s320/Ephor_580x330_screen2.jpg&quot; height=&quot;182&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-F0xORJfqRP4/UrAfMQ_JkjI/AAAAAAAAAA4/EcvgdfntAG8/s1600/Ephor_580x330_screen3.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-F0xORJfqRP4/UrAfMQ_JkjI/AAAAAAAAAA4/EcvgdfntAG8/s320/Ephor_580x330_screen3.jpg&quot; height=&quot;182&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;h3&gt;&lt;b&gt;Long story short, Ephor’s powerful lightweight features include:&lt;/b&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;custom field configuration&amp;nbsp;&lt;/li&gt;&lt;li&gt;freetext search, search by fields &amp;amp; predefined queries&amp;nbsp;&lt;/li&gt;&lt;li&gt;defining item classes and hierarchical categories&amp;nbsp;&lt;/li&gt;&lt;li&gt;linking items with items and items with users&amp;nbsp;&lt;/li&gt;&lt;li&gt;tracking item history and location&amp;nbsp;&lt;/li&gt;&lt;li&gt;printing QR code labels&amp;nbsp;&lt;/li&gt;&lt;li&gt;intuitive desktop and mobile interface&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;&lt;b&gt;As for Ephor &amp;amp; JIRA®/Confluence® integration:&lt;/b&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;creating issues in JIRA® out of items in Ephor&amp;nbsp;&lt;/li&gt;&lt;li&gt;showing JIRA® issue status in Ephor&amp;nbsp;&lt;/li&gt;&lt;li&gt;backlinking in JIRA® to items in Ephor (using JIRA® issue remote links)&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;i&gt;comming up&lt;/i&gt;: Ephor JIRA® issue templates &amp;amp; custom renderer plugin for issue links&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;i&gt;comming up&lt;/i&gt;: custom Confluence® plugin use; Confluence® reporting; rendering items in Confluence®&lt;/li&gt;&lt;/ul&gt;&lt;ul style=&quot;background-color: white; color: #333333; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; margin: 10px 0px 0px;&quot;&gt;&lt;/ul&gt;The current plan is that &lt;a href=&quot;http://spartez.com/ephor/license&quot;&gt;Ephor will be licensed&lt;/a&gt; basing on the number of items (assets) which it will be used to manage. There will be tiers such as &quot;up to 100 assets&quot;, &quot;101-500 assets&quot;, &quot;501-1000 assets&quot; and so on. The exact licensing tiers are TBD.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On top of that, once the EAP stage is over, we promise that the non-free-of-charge Ephor will be fairly priced. We believe in value for money.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And here’s something interesting: &lt;b&gt;a mystery user from the North Pole has recently registered with us to evaluate Ephor&lt;/b&gt;. Judging from the assets he has uploaded to Ephor we can only guess that he must be some kind of a VIP on the gift delivery market. There&#39;s travel equipment, reindeer, presents, chimney climbing accessories, decorations and what have you. We took the liberty of inserting these assets into Ephor as our sample data, so you can check them out for yourself. Note the intriguing item types and custom fields. Test how Ephor&#39;s functionalities accommodate them.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;&lt;a href=&quot;http://spartez.com/ephor/buy&quot; target=&quot;_blank&quot;&gt;Explore the possibilities offered by Ephor and prance into 2014 managing your assets merrier than ever. Ho, ho, ho!&lt;/a&gt;&lt;/h3&gt;</content><link rel='replies' type='application/atom+xml' href='http://unimplemented.blogspot.com/feeds/4269372051821682146/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://unimplemented.blogspot.com/2013/12/meet-ephor-your-new-asset-manager-with.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/4269372051821682146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/4269372051821682146'/><link rel='alternate' type='text/html' href='http://unimplemented.blogspot.com/2013/12/meet-ephor-your-new-asset-manager-with.html' title='Meet Ephor. Your new asset manager with an excellent professional relationship with JIRA®.'/><author><name>Spartez Product Team</name><uri>http://www.blogger.com/profile/02180218414180138867</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-kxgahvW0Tus/UrAdbf5RmFI/AAAAAAAAAAc/6-C_9QO_0aI/s72-c/Ephor+blog+banner.jpg" height="72" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8813074174707015455.post-4173675631843684525</id><published>2013-12-03T14:40:00.002+01:00</published><updated>2014-02-14T20:08:07.355+01:00</updated><title type='text'>TFS4JIRA by Spartez now available for JIRA OnDemand</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-mGb6M6FaEo8/Up3fMeHhv1I/AAAAAAAAEwk/6NTZ6ssGQeI/s1600/TFS4JIRA_hosted_550.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-mGb6M6FaEo8/Up3fMeHhv1I/AAAAAAAAEwk/6NTZ6ssGQeI/s1600/TFS4JIRA_hosted_550.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;TFS4JIRA by Spartez is a smart two-way communication vehicle, which bridges the Microsoft Team Foundation Server® and JIRA®. Starting from today all of you JIRA OnDemand users out there can integrate the power of Microsoft TFS® with the awesomeness of JIRA® using our brilliant tool.&lt;br /&gt;&lt;br /&gt;Just like its regular download version, the OnDemand TFS4JIRA plugin enables you to automatically view your project- or issue-associated TFS® check-ins in JIRA®, as well as effortlessly synchronize changes made to the issues and work items between JIRA® and TFS®. &lt;br /&gt;&lt;br /&gt;Visit &lt;a href=&quot;http://spartez.com/tfs4jira&quot;&gt;spartez.com/tfs4jira&lt;/a&gt; and find out more or watch our TFS4JIRA video:&lt;br /&gt;&lt;br /&gt;&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;//www.youtube.com/embed/9xYV0Jk_Prw&quot; width=&quot;420&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;The download version of TFS4JIRA has entered the Atlassian Marketplace in May 2012. Since then we&#39;ve released multiple improved versions and TFS4JIRA has been downloaded by companies all around the globe more than 3300 times. &lt;br /&gt;&lt;br /&gt;TFS4JIRA&#39;s latest release for JIRA OnDemand is available on a subscription basis (just as the OnDemand JIRA is) via the &lt;a href=&quot;https://marketplace.atlassian.com/plugins/com.spartez.jira.plugins.bork.tfs4jira#ondemand&quot;&gt;Atlassian Marketplace&lt;/a&gt; and the OnDemand JIRA UPM.&lt;br /&gt;&lt;br /&gt;Like it? Don&#39;t forget to drop us a review! </content><link rel='replies' type='application/atom+xml' href='http://unimplemented.blogspot.com/feeds/4173675631843684525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://unimplemented.blogspot.com/2013/12/tfs4jira-by-spartez-now-available-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/4173675631843684525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/4173675631843684525'/><link rel='alternate' type='text/html' href='http://unimplemented.blogspot.com/2013/12/tfs4jira-by-spartez-now-available-for.html' title='TFS4JIRA by Spartez now available for JIRA OnDemand'/><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/-mGb6M6FaEo8/Up3fMeHhv1I/AAAAAAAAEwk/6NTZ6ssGQeI/s72-c/TFS4JIRA_hosted_550.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8813074174707015455.post-6825569753276389978</id><published>2013-09-19T09:48:00.002+01:00</published><updated>2013-09-19T10:15:12.841+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><title type='text'>Mocking Java8 lambdas using Proxy</title><content type='html'>&lt;h3&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Introduction&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Java8 introduces new language feature which is a well-known&lt;i&gt; lambda function&lt;/i&gt;. This new language feature is realized under the covers by the &lt;i&gt;functional interfaces&lt;/i&gt;, i.e. interfaces containing only one method. Good example is of such interface is the Comparable having exactly one &quot;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;int compareTo(T o)&quot;&lt;/span&gt; method. Input arguments and return value of interface&#39;s function determine arguments and return value of the lambda expression. The type &lt;i&gt;inference mechanism&lt;/i&gt; is used to choose proper argument/return types from the context.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;You can write a lambda function either as a code block (in curly brackets) or as an expression-like statement.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;border: 1px solid black; padding: 4px;&quot;&gt;&lt;span style=&quot;color: #6aa84f;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;// examples of &#39;functional interfaces&#39;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: #0b5394;&quot;&gt;&lt;b&gt;interface &lt;/b&gt;&lt;/span&gt;Produce&amp;lt;T&amp;gt; {&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&amp;nbsp; T produce();&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;}&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: #0b5394;&quot;&gt;&lt;b&gt;interface &lt;/b&gt;&lt;/span&gt;Execute {&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: #0b5394;&quot;&gt;&lt;b&gt;void &lt;/b&gt;&lt;/span&gt;execute();&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;}&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #93c47d;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: #6aa84f;&quot;&gt;// examples of lambdas&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;Produce&amp;lt;Integer&amp;gt; get123 = () -&amp;gt; 123;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;Execute sayHello = () -&amp;gt; { System.out.println(&quot;Hello&quot;); };&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;Integer i = get123.produce();&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;sayHello.execute();&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Mocking lambdas&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;But how can we wrap lambda functions, for example for test purposes? Well, lambdas are called using the invokedynamic feature introduced in Java7 and the exact implementation of how lambdas are called may vary from JVM to JVM. If you want to learn more, watch &lt;a href=&quot;https://www.youtube.com/watch?v=C_QbkGU_lqY&quot; target=&quot;_blank&quot;&gt;this presentation&lt;/a&gt;.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Luckily we can &quot;see&quot; lambdas as classes implementing one functional interface. And this interface has a method of the return type the same as the target variable (or a field / method argument) to which lambda is being assigned to. This is resolved thanks to the type inference mechanism.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Because of fact that lambda implements an interface, it shall be possible to create a mock class using standard java.lang.reflect.Proxy (without need to perform bytecode manipulation).&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;Solution&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;So let&#39;s wrap a lambda inside a method. But how to determine types? No worries. Just use generics.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;border: 1px solid black; padding: 4px;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;/**&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #999999;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&amp;nbsp;* Draft of the lambda wrapper.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #999999;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&amp;nbsp;*/&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #0b5394;&quot;&gt;private static&lt;/span&gt; &lt;/b&gt;&amp;lt;T&amp;gt; T lambdaWrapper(&lt;span style=&quot;color: #0b5394;&quot;&gt;&lt;b&gt;final &lt;/b&gt;&lt;/span&gt;T lambda) {&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #999999;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: #6aa84f;&quot;&gt;&amp;nbsp; // ... need to add some magic here ...&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: #0b5394;&quot;&gt;&lt;b&gt;return &lt;/b&gt;&lt;/span&gt;lambda;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;}&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;Produce&amp;lt;Integer&amp;gt; get123 = lambdaWrapper(() -&amp;gt; 123);&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;Execute sayHello = lambdaWrapper(() -&amp;gt; System.out.println(&quot;Hello&quot;));&amp;nbsp;&lt;integer&gt; &lt;/integer&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;integer&gt;Wrapper looks fine. But how to return our mock and not the original lambda?&amp;nbsp;&lt;/integer&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;integer&gt;We will use a proxy in order to intercept call of a lambda body. The java.lang.reflect.Proxy works for interfaces only, but luckily every lambda implements an interface, which is of the same type as the target.&amp;nbsp;&lt;/integer&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;integer&gt;We can use generics to design a wrapper working for every possible lambda signature.&amp;nbsp;&lt;/integer&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-family: Arial,Helvetica,sans-serif;&quot;&gt;&lt;integer&gt;We can return an interface, not a lambda as a wrapper&#39;s return value and it will be still assignable to the target variable. And the type inference in javac will work out the proper type binding for such generic method.&lt;/integer&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style=&quot;border: 1px solid black; padding: 4px;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;integer&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;color: #0b5394;&quot;&gt;&lt;b&gt;import &lt;/b&gt;&lt;/span&gt;java.lang.reflect.*;&lt;/span&gt;&lt;/integer&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #999999;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;integer&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;nbsp;&lt;/span&gt; &lt;/integer&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #999999;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;integer&gt;/**&lt;/integer&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #999999;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;integer&gt;&amp;nbsp;* A complete lambda wrapper.&amp;nbsp;&lt;/integer&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #999999;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;integer&gt;&amp;nbsp;* @param lambda lambda function to be wrapped&amp;nbsp;&lt;/integer&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #999999;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;integer&gt;&amp;nbsp;* @param &lt;i&gt; &amp;lt;I&amp;gt; interface which lambda class implements&amp;nbsp;&lt;/i&gt;&lt;/integer&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #999999;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;integer&gt;&lt;i&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (derived by compiler via type inference)&lt;/i&gt;&lt;/integer&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #999999;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;integer&gt;&lt;i&gt;&amp;nbsp;* @param &lt;t&gt; &amp;lt;T&amp;gt; lambda class having function code to be executed&amp;nbsp;&lt;/t&gt;&lt;/i&gt;&lt;/integer&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #999999;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;integer&gt;&lt;i&gt;&lt;t&gt;&amp;nbsp;* @return I interface implemented by lambda&amp;nbsp;&lt;/t&gt;&lt;/i&gt;&lt;/integer&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;integer&gt;&lt;i&gt;&lt;t&gt;&lt;span style=&quot;color: #999999;&quot;&gt;&amp;nbsp;*/&lt;/span&gt;&amp;nbsp;&lt;/t&gt;&lt;/i&gt;&lt;/integer&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;integer&gt;&lt;i&gt;&lt;t&gt;&lt;b&gt;&lt;span style=&quot;color: #0b5394;&quot;&gt;private static&lt;/span&gt; &lt;/b&gt;&lt;b&gt; &lt;/b&gt;&amp;lt;I, T &lt;span style=&quot;color: #0b5394;&quot;&gt;&lt;b&gt;extends &lt;/b&gt;&lt;/span&gt;I&amp;gt; I lambdaWrapper(&lt;span style=&quot;color: #0b5394;&quot;&gt;&lt;b&gt;final &lt;/b&gt;&lt;/span&gt;T lambda) {&amp;nbsp;&lt;/t&gt;&lt;/i&gt;&lt;/integer&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;integer&gt;&lt;i&gt;&lt;t&gt;&lt;i extends=&quot;&quot; i=&quot;&quot; t=&quot;&quot;&gt;&amp;nbsp; Object obj = Proxy.newProxyInstance(&amp;nbsp;&lt;/i&gt;&lt;/t&gt;&lt;/i&gt;&lt;/integer&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;integer&gt;&lt;i&gt;&lt;t&gt;&lt;i extends=&quot;&quot; i=&quot;&quot; t=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; lambda.getClass().getClassLoader(),&amp;nbsp;&lt;/i&gt;&lt;/t&gt;&lt;/i&gt;&lt;/integer&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;integer&gt;&lt;i&gt;&lt;t&gt;&lt;i extends=&quot;&quot; i=&quot;&quot; t=&quot;&quot;&gt;&amp;nbsp; &amp;nbsp; lambda.getClass().getInterfaces(),&amp;nbsp;&lt;/i&gt;&lt;/t&gt;&lt;/i&gt;&lt;/integer&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;integer&gt;&lt;i&gt;&lt;t&gt;&lt;i extends=&quot;&quot; i=&quot;&quot; t=&quot;&quot;&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #0b5394;&quot;&gt;new&amp;nbsp;&lt;/span&gt;&lt;/b&gt;InvocationHandler() {&amp;nbsp;&lt;/i&gt;&lt;/t&gt;&lt;/i&gt;&lt;/integer&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;integer&gt;&lt;i&gt;&lt;t&gt;&lt;i extends=&quot;&quot; i=&quot;&quot; t=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&amp;nbsp;&lt;/i&gt;&lt;/t&gt;&lt;/i&gt;&lt;/integer&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;integer&gt;&lt;i&gt;&lt;t&gt;&lt;i extends=&quot;&quot; i=&quot;&quot; t=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #0b5394;&quot;&gt;&lt;b&gt;public &lt;/b&gt;&lt;/span&gt;Object invoke(Object proxy, Method method,&amp;nbsp;&lt;/i&gt;&lt;/t&gt;&lt;/i&gt;&lt;/integer&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;integer&gt;&lt;i&gt;&lt;t&gt;&lt;i extends=&quot;&quot; i=&quot;&quot; t=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Object[] args) &lt;span style=&quot;color: #0b5394;&quot;&gt;&lt;b&gt;throws &lt;/b&gt;&lt;/span&gt;Throwable {&amp;nbsp;&lt;/i&gt;&lt;/t&gt;&lt;/i&gt;&lt;/integer&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #6aa84f;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;integer&gt;&lt;i&gt;&lt;t&gt;&lt;i extends=&quot;&quot; i=&quot;&quot; t=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // PUT YOUR WRAPPER CODE HERE&amp;nbsp;&lt;/i&gt;&lt;/t&gt;&lt;/i&gt;&lt;/integer&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;integer&gt;&lt;i&gt;&lt;t&gt;&lt;i extends=&quot;&quot; i=&quot;&quot; t=&quot;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #0b5394;&quot;&gt;&lt;b&gt;return &lt;/b&gt;&lt;/span&gt;method.invoke(lambda, args);&amp;nbsp;&lt;/i&gt;&lt;/t&gt;&lt;/i&gt;&lt;/integer&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;integer&gt;&lt;i&gt;&lt;t&gt;&lt;i extends=&quot;&quot; i=&quot;&quot; t=&quot;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/i&gt;&lt;/t&gt;&lt;/i&gt;&lt;/integer&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;integer&gt;&lt;i&gt;&lt;t&gt;&lt;i extends=&quot;&quot; i=&quot;&quot; t=&quot;&quot;&gt;&amp;nbsp; &amp;nbsp; });&amp;nbsp;&lt;/i&gt;&lt;/t&gt;&lt;/i&gt;&lt;/integer&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;integer&gt;&lt;i&gt;&lt;t&gt;&lt;i extends=&quot;&quot; i=&quot;&quot; t=&quot;&quot;&gt;&lt;b&gt;&amp;nbsp; &lt;span style=&quot;color: #0b5394;&quot;&gt;return &lt;/span&gt;&lt;/b&gt;(I)obj; &lt;span style=&quot;color: #6aa84f;&quot;&gt;// cast to lambda&#39;s interface&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/t&gt;&lt;/i&gt;&lt;/integer&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;integer&gt;&lt;i&gt;&lt;t&gt;&lt;i extends=&quot;&quot; i=&quot;&quot; t=&quot;&quot;&gt;}&amp;nbsp;&lt;/i&gt;&lt;/t&gt;&lt;/i&gt;&lt;/integer&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;integer&gt;&lt;i&gt;&lt;t&gt;&lt;i extends=&quot;&quot; i=&quot;&quot; t=&quot;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;i&gt;&lt;i extends=&quot;&quot; i=&quot;&quot; t=&quot;&quot;&gt;Produce&amp;lt;Integer&amp;gt; get123 = lambdaWrapper(() -&amp;gt; 123);&lt;/i&gt;&lt;/i&gt;&lt;/span&gt; &lt;/i&gt;&lt;/t&gt;&lt;/i&gt;&lt;/integer&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;integer&gt;&lt;i&gt;&lt;t&gt;&lt;i extends=&quot;&quot; i=&quot;&quot; t=&quot;&quot;&gt;Execute sayHello = lambdaWrapper(() -&amp;gt; System.out.println(&quot;Hello&quot;));&amp;nbsp;&lt;/i&gt;&lt;/t&gt;&lt;/i&gt;&lt;/integer&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://unimplemented.blogspot.com/feeds/6825569753276389978/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://unimplemented.blogspot.com/2013/09/mocking-java8-lambdas-using-proxy_19.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/6825569753276389978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/6825569753276389978'/><link rel='alternate' type='text/html' href='http://unimplemented.blogspot.com/2013/09/mocking-java8-lambdas-using-proxy_19.html' title='Mocking Java8 lambdas using Proxy'/><author><name>Marek</name><uri>http://www.blogger.com/profile/08624668220729678236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8813074174707015455.post-3300987485846777490</id><published>2013-05-09T14:41:00.001+01:00</published><updated>2014-02-14T20:24:52.756+01:00</updated><title type='text'>Spartez Does Street Art</title><content type='html'>Ever since we moved to our new office last year, something seemed to be missing. Yes, the new office is bigger, better, more comfortable and better suited for our ever increasing crew than the rudimentary office that we had before. But - the new office did not have any character. If you walked in, you would not be able to tell if you are in Gdansk, Bangalore, San Francisco or St Petersburg. Same beige walls as in any office. Same Aeron chairs. Same grey floor. Same Ikea desks. Even air conditioning has exactly the same controller panel model that I saw in any other office I have ever visited. One word describes it - boring.&lt;br /&gt;&lt;br /&gt;As we want to make our company a Great Place To Work, we had to think of something to somehow make the office special.&lt;br /&gt;&lt;br /&gt;To this end, we contacted two local street artists -&amp;nbsp;&lt;a href=&quot;http://veraking.blogspot.com/&quot; target=&quot;_blank&quot;&gt;Vera&lt;/a&gt; and &lt;a href=&quot;http://chamsko.soup.io/&quot; target=&quot;_blank&quot;&gt;Julia&lt;/a&gt; - to paint some cool graffiti on our walls.&lt;br /&gt;&lt;br /&gt;Now our office is different from everybody else&#39;s.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Take a Look&lt;/h3&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-GgIrXhFsSXI/UYui4ZjwEuI/AAAAAAAABiE/4sDSRLvy1Vk/s1600/DSC02335.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-GgIrXhFsSXI/UYui4ZjwEuI/AAAAAAAABiE/4sDSRLvy1Vk/s320/DSC02335.JPG&quot; height=&quot;213&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-82g8AdrpySM/UYuj3bWOUSI/AAAAAAAABkg/JK1S6NBTjGo/s1600/DSC02296.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-82g8AdrpySM/UYuj3bWOUSI/AAAAAAAABkg/JK1S6NBTjGo/s320/DSC02296.JPG&quot; height=&quot;213&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-WyY7n9pXqT4/UYuj2ImTkBI/AAAAAAAABkE/L_loK4pMcY0/s1600/DSC02286.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-WyY7n9pXqT4/UYuj2ImTkBI/AAAAAAAABkE/L_loK4pMcY0/s320/DSC02286.JPG&quot; height=&quot;213&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-YXqW9fi7Zlk/UYuj3Xs8ozI/AAAAAAAABkY/LhAaPkLNFwU/s1600/DSC02305.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-YXqW9fi7Zlk/UYuj3Xs8ozI/AAAAAAAABkY/LhAaPkLNFwU/s320/DSC02305.JPG&quot; height=&quot;213&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-iRphqtnZWmM/UYuj4dkSjXI/AAAAAAAABkk/T4BOmgDpw2k/s1600/DSC02314.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-iRphqtnZWmM/UYuj4dkSjXI/AAAAAAAABkk/T4BOmgDpw2k/s320/DSC02314.JPG&quot; height=&quot;213&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-zNg55DP1ht8/UYuj5Rx0OXI/AAAAAAAABlA/btkfqrxFGZ8/s1600/DSC02330.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-zNg55DP1ht8/UYuj5Rx0OXI/AAAAAAAABlA/btkfqrxFGZ8/s320/DSC02330.JPG&quot; height=&quot;213&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-o-FMAJhcUCU/UYuj5v5bX4I/AAAAAAAABk8/PP4AYFHq_wU/s1600/DSC02345.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-o-FMAJhcUCU/UYuj5v5bX4I/AAAAAAAABk8/PP4AYFHq_wU/s320/DSC02345.JPG&quot; height=&quot;178&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Some Details&lt;/h3&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-ch-q52QANms/UYujzJQcnCI/AAAAAAAABjA/NtbCnBOXkMc/s1600/DSC02251.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-ch-q52QANms/UYujzJQcnCI/AAAAAAAABjA/NtbCnBOXkMc/s200/DSC02251.JPG&quot; height=&quot;133&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-MR0ZII20gxE/UYujz4aNBfI/AAAAAAAABjM/AWdKzfbqB1o/s1600/DSC02262.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-MR0ZII20gxE/UYujz4aNBfI/AAAAAAAABjM/AWdKzfbqB1o/s200/DSC02262.JPG&quot; height=&quot;133&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-oe7lCmAcCrw/UYuj47zB_TI/AAAAAAAABk0/7x9xOP-1--A/s1600/DSC02329.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-oe7lCmAcCrw/UYuj47zB_TI/AAAAAAAABk0/7x9xOP-1--A/s200/DSC02329.JPG&quot; height=&quot;133&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-EbsdgGDqgE4/UYuj4p12cxI/AAAAAAAABkw/8FpsewrUQ2M/s1600/DSC02328.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-EbsdgGDqgE4/UYuj4p12cxI/AAAAAAAABkw/8FpsewrUQ2M/s200/DSC02328.JPG&quot; height=&quot;133&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-8WWGxgBR7P4/UYuj0kBycKI/AAAAAAAABjs/Mqc7QCkojFM/s1600/DSC02266.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-8WWGxgBR7P4/UYuj0kBycKI/AAAAAAAABjs/Mqc7QCkojFM/s200/DSC02266.JPG&quot; height=&quot;200&quot; width=&quot;133&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;h3&gt;&lt;/h3&gt;&lt;h3&gt;Artists At Work&lt;/h3&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-2BLM5iJHGNM/UYujErwajJI/AAAAAAAABig/7UJQzAKVgg4/s1600/DSC02237.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-2BLM5iJHGNM/UYujErwajJI/AAAAAAAABig/7UJQzAKVgg4/s200/DSC02237.JPG&quot; height=&quot;133&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-B6JSPw-UMqg/UYui_Qmbp3I/AAAAAAAABiQ/NnrrgWwy5ug/s1600/DSC02235.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-B6JSPw-UMqg/UYui_Qmbp3I/AAAAAAAABiQ/NnrrgWwy5ug/s200/DSC02235.JPG&quot; height=&quot;133&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-AqD7OZbttiI/UYuj2M-BGwI/AAAAAAAABj0/3u68465YhW4/s1600/DSC02275.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-AqD7OZbttiI/UYuj2M-BGwI/AAAAAAAABj0/3u68465YhW4/s200/DSC02275.JPG&quot; height=&quot;133&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: white; color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;BTW, we are still looking for developers (note that we are &lt;b&gt;very&lt;/b&gt; picky), so if you would like to work for us, feel free to drop us an e-mail at &lt;a href=&quot;mailto:jobs@spartez.com&quot;&gt;jobs@spartez.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://unimplemented.blogspot.com/feeds/3300987485846777490/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://unimplemented.blogspot.com/2013/05/spartez-does-street-art.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/3300987485846777490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/3300987485846777490'/><link rel='alternate' type='text/html' href='http://unimplemented.blogspot.com/2013/05/spartez-does-street-art.html' title='Spartez Does Street Art'/><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/-GgIrXhFsSXI/UYui4ZjwEuI/AAAAAAAABiE/4sDSRLvy1Vk/s72-c/DSC02335.JPG" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8813074174707015455.post-4437482818281685860</id><published>2012-11-11T15:23:00.002+01:00</published><updated>2012-11-11T15:46:00.042+01:00</updated><title type='text'>After the party</title><content type='html'>So few days ago we hosted a house-warming party in our new, shiny (sorry, I meant, noisy - our neighbours are still finishing their offices) office.&lt;br /&gt;&lt;br /&gt;Honestly, I completely did not know what to expect. After all we just throw an invitation at a few places: on Twitter and Facebook obviously, a few posters at local universities, a few mentions at local conferences and users groups ... and a full-fledged bill-board at one of the most crowded street-crossings in Gdańsk.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-UaMwC9SFxU4/UJ-xhbo014I/AAAAAAAAApc/VZqBqln4_RM/s1600/billboard-spartez.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;260&quot; src=&quot;http://3.bp.blogspot.com/-UaMwC9SFxU4/UJ-xhbo014I/AAAAAAAAApc/VZqBqln4_RM/s400/billboard-spartez.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;picture here=&quot;here&quot;&gt;&lt;/picture&gt;&lt;br /&gt;&lt;br /&gt;I did not know who and how many people would sign up. The results far exceeded my dreams. Nearly 90 people signed up, vast majority of them showed up at the event. We hoped to attract 30 - 50 guests, so I dare say it exceed our expectations by far :)&lt;br /&gt;Actually I had to close the registration due to too big interest (I really did not know if we can fit so many people in our 300 m2) more than 2 days before the event and on the quickly opened waiting list we quickly got almost 10 people wanting to join us.&lt;br /&gt;&lt;br /&gt;All in all everything went quite smooth. So many people managed to squeeze in our office. Actually we could fit probably 30 - 40 more (in terms of raw floor space), but our air-conditioning barely handled those who showed up (it was really too hot when most of the people were in a single room when I was doing the presentation).&lt;br /&gt;&lt;br /&gt;I was afraid that random people would come - e.g. those just interested in having a free drink or a fist fighting ;). Fortunately they were no such guests. It looks like all people were genuinely interested in our company (both Spartez and Atlassian), wanted to share something, learn something (we hosted a few young startupers) or were interested in one of the jobs we are offering.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-RxpxUhVjjuU/UJ-yIjp-MDI/AAAAAAAAApk/3GTu2u7B09g/s1600/SPARTEZ_05.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;213&quot; src=&quot;http://2.bp.blogspot.com/-RxpxUhVjjuU/UJ-yIjp-MDI/AAAAAAAAApk/3GTu2u7B09g/s320/SPARTEZ_05.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-jnasK9HeN5c/UJ-yLDfvt0I/AAAAAAAAAps/xzlOkmbKABc/s1600/SPARTEZ_07.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;http://1.bp.blogspot.com/-jnasK9HeN5c/UJ-yLDfvt0I/AAAAAAAAAps/xzlOkmbKABc/s320/SPARTEZ_07.jpg&quot; width=&quot;213&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-SWaLaRRzC8w/UJ-yajjjXpI/AAAAAAAAAqc/S-NP-9jO8Oc/s1600/SPARTEZ_14.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;http://1.bp.blogspot.com/-SWaLaRRzC8w/UJ-yajjjXpI/AAAAAAAAAqc/S-NP-9jO8Oc/s320/SPARTEZ_14.jpg&quot; width=&quot;213&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-nJD3yKwf84g/UJ-yNqeqo6I/AAAAAAAAAp0/6i752cGlaGA/s1600/SPARTEZ_06.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;http://4.bp.blogspot.com/-nJD3yKwf84g/UJ-yNqeqo6I/AAAAAAAAAp0/6i752cGlaGA/s320/SPARTEZ_06.jpg&quot; width=&quot;213&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;After initial mingling I presented a few things: a short history of Atlassian with the emphasis of its values and how the attracted us to, a short history of Spartez (including revealing the mystery of how our company was founded and why such name was picked) and then I very quickly presented those several positions for which we are looking for people:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Team Leader&amp;nbsp;&lt;/li&gt;&lt;li&gt;Front-end developers&lt;/li&gt;&lt;li&gt;Java developers (all levels, including our highly wanted principal)&lt;/li&gt;&lt;li&gt;UX engineer&lt;/li&gt;&lt;li&gt;Product manager&lt;/li&gt;&lt;li&gt;QA engineer&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;BTW, we are still looking (I mentioned we are _very_ picky), so feel free to drop us an e-mail at &lt;a href=&quot;mailto:jobs@spartez.com&quot;&gt;jobs@spartez.com&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-4f3buKk1p0o/UJ-yiNMaZrI/AAAAAAAAAqs/cUZtSMZfo0s/s1600/SPARTEZ_08.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;213&quot; src=&quot;http://2.bp.blogspot.com/-4f3buKk1p0o/UJ-yiNMaZrI/AAAAAAAAAqs/cUZtSMZfo0s/s320/SPARTEZ_08.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-lNoYhEZ84LU/UJ-yk12t8DI/AAAAAAAAAq0/MzyLbwb6XvY/s1600/SPARTEZ_04.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;http://4.bp.blogspot.com/-lNoYhEZ84LU/UJ-yk12t8DI/AAAAAAAAAq0/MzyLbwb6XvY/s320/SPARTEZ_04.jpg&quot; width=&quot;213&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Then there was a time for a lot of questions and honestly I was completely swamped for next hour or so by a lot of people who pinned me down and wanted to know much more. Great conversations. It turned out that there are several people really interested in&amp;nbsp;invigorating&amp;nbsp;our Tricity geek scene. JUGs, JS meetups, Scala meetups, Agile parties, hackathons - we don&#39;t have them too often in Gdansk and area. &amp;nbsp;I got a few very good connections and I hope to co-host some interesting meetups in the near future. Stay tuned.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After several more chats, I felt so much tired, that I sneaked out to our fussball table to witness the finals (we did organize the fussball championships - big kudos to Orzech for that) - unfortunately we were not very hospitable here and two Spartez pairs made it to the final.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-yjPSMGcgG_g/UJ-yUnrlV5I/AAAAAAAAAqE/U1_qexI3vJ0/s1600/SPARTEZ_19.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;http://2.bp.blogspot.com/-yjPSMGcgG_g/UJ-yUnrlV5I/AAAAAAAAAqE/U1_qexI3vJ0/s400/SPARTEZ_19.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-YmhvZ7xeSwo/UJ-yY2xLlCI/AAAAAAAAAqU/_WLWX7y75KU/s1600/SPARTEZ_13.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;http://1.bp.blogspot.com/-YmhvZ7xeSwo/UJ-yY2xLlCI/AAAAAAAAAqU/_WLWX7y75KU/s400/SPARTEZ_13.jpg&quot; width=&quot;266&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Then I landed in our poker room where Filip Rogaczewski was &lt;strike&gt;cheating&lt;/strike&gt; winning with other players (of course no gambling, just free chips) in Texas Hold&#39;em. He won also my pool, but finally there was a draw between two last players - they bet with &quot;all in&quot; and both had &lt;i&gt;exactly&lt;/i&gt; &lt;i&gt;the same&lt;/i&gt; full house. And they gave up further play. Perfect solution.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-09OlmsPE3dE/UJ-yQSeZ6PI/AAAAAAAAAp8/aMpCc9tEyHE/s1600/SPARTEZ_22.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;http://3.bp.blogspot.com/-09OlmsPE3dE/UJ-yQSeZ6PI/AAAAAAAAAp8/aMpCc9tEyHE/s320/SPARTEZ_22.jpg&quot; width=&quot;213&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-d5OZmv9KHB4/UJ-yclRfrNI/AAAAAAAAAqk/-kV78m_lprY/s1600/SPARTEZ_20.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;213&quot; src=&quot;http://4.bp.blogspot.com/-d5OZmv9KHB4/UJ-yclRfrNI/AAAAAAAAAqk/-kV78m_lprY/s320/SPARTEZ_20.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-YmH9dp2ujJE/UJ-yXM4KSTI/AAAAAAAAAqM/8V6WdOBvANM/s1600/SPARTEZ_12.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;http://4.bp.blogspot.com/-YmH9dp2ujJE/UJ-yXM4KSTI/AAAAAAAAAqM/8V6WdOBvANM/s320/SPARTEZ_12.jpg&quot; width=&quot;213&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;All in all that was a very&amp;nbsp;pleasant&amp;nbsp;evening. After 10 PM we started heading home.&lt;/div&gt;&lt;div&gt;There were no damages, no beer spilled (but at poker table, which is like a rule), no one got sick. Food was decent, chats were great and the guests were awesome.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Thank you for joining us. I hope you enjoyed it and I hope to celebrate with you in the future too.&lt;br /&gt;&lt;br /&gt;Special thanks for Spartez crew for organizing and taking care of this event! I owe you guys beer! Help yourself from our fridge. :)&lt;br /&gt;And special kudos to my awesome &lt;a href=&quot;http://www.facebook.com/katarzyna.seligawroblewska&quot; target=&quot;_blank&quot;&gt;sister&lt;/a&gt; and &lt;a href=&quot;http://www.facebook.com/filhalandilas&quot; target=&quot;_blank&quot;&gt;brother-in-law&lt;/a&gt; for taking these wonderful pictures.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://unimplemented.blogspot.com/feeds/4437482818281685860/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://unimplemented.blogspot.com/2012/11/after-party.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/4437482818281685860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/4437482818281685860'/><link rel='alternate' type='text/html' href='http://unimplemented.blogspot.com/2012/11/after-party.html' title='After the party'/><author><name>Wojciech Seliga</name><uri>http://www.blogger.com/profile/11923347478200368758</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_9itee73ZiXE/TI_YqDCmaZI/AAAAAAAAAck/03OZNHNYxMc/S220/wseliga-72x72.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-UaMwC9SFxU4/UJ-xhbo014I/AAAAAAAAApc/VZqBqln4_RM/s72-c/billboard-spartez.jpg" height="72" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8813074174707015455.post-3264050332476765396</id><published>2012-10-29T15:18:00.001+01:00</published><updated>2012-10-29T15:19:12.817+01:00</updated><title type='text'>House-warming Party in Gdańsk - come chat with us on 5th of November</title><content type='html'>On 5th of November we are hosting a&amp;nbsp;House-warming&amp;nbsp;party in our new office.&lt;br /&gt;If you are already our friend, or want to learn more about what we are doing (especially in Atlassian ecosystem) or perhaps if you are looking for a new job - please join us after 5 PM next week. You can find &lt;a href=&quot;http://www.spartez.com/en/contact.html&quot; target=&quot;_blank&quot;&gt;detailed map on our website&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-d-Tj20sYrPQ/UI6NIee-fjI/AAAAAAAAApM/-KflqtWvluE/s1600/spartez_scroller_copy-small.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;278&quot; src=&quot;http://3.bp.blogspot.com/-d-Tj20sYrPQ/UI6NIee-fjI/AAAAAAAAApM/-KflqtWvluE/s400/spartez_scroller_copy-small.jpg&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;We have announced the event week ago and so far more people have registered than we originally hoped for. Due to space limitations at our venue, we will have to close soon the registration. &lt;b&gt;There are less than 20 slots (free!) left &lt;/b&gt;- so hurry up.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://www.eventbrite.com/event/4665995117?ref=ebtn&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;Eventbrite - Parapetówka ze Spartez i Atlassian&quot; src=&quot;http://www.eventbrite.com/custombutton?eid=4665995117&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Except for having a good time in the evening, we would like to use this opportunity to spread the word that we are hiring.&lt;br /&gt;We are still looking for several talented and passionate guys (who want to work in a very casual environment, with around 30 colleagues locally and millions customers globally).&lt;br /&gt;We are looking most of all for:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Java developers&lt;/li&gt;&lt;li&gt;Javascript/front-end developers&lt;/li&gt;&lt;li&gt;UX Designer&lt;/li&gt;&lt;li&gt;Product Manager&lt;/li&gt;&lt;li&gt;Team Lead (with very strong fresh technical background)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;If you are interested, come and talk to us during the event or/and apply via e-mail (&lt;a href=&quot;mailto:jobs@spartez.com&quot;&gt;jobs@spartez.com&lt;/a&gt;) or using this &lt;a href=&quot;http://www.atlassian.com/company/careers/?tab=gdansk&quot; target=&quot;_blank&quot;&gt;online form&lt;/a&gt;&amp;nbsp;(not all jobs may be currently listed there).&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://unimplemented.blogspot.com/feeds/3264050332476765396/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://unimplemented.blogspot.com/2012/10/house-warming-party-in-gdansk-come-chat.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/3264050332476765396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/3264050332476765396'/><link rel='alternate' type='text/html' href='http://unimplemented.blogspot.com/2012/10/house-warming-party-in-gdansk-come-chat.html' title='House-warming Party in Gdańsk - come chat with us on 5th of November'/><author><name>Wojciech Seliga</name><uri>http://www.blogger.com/profile/11923347478200368758</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_9itee73ZiXE/TI_YqDCmaZI/AAAAAAAAAck/03OZNHNYxMc/S220/wseliga-72x72.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-d-Tj20sYrPQ/UI6NIee-fjI/AAAAAAAAApM/-KflqtWvluE/s72-c/spartez_scroller_copy-small.jpg" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8813074174707015455.post-7585165767872201974</id><published>2012-09-04T17:23:00.001+01:00</published><updated>2012-09-04T17:28:11.643+01:00</updated><title type='text'>We are moving!</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px; margin-bottom: 0in;&quot;&gt;This year we will be celebrating the fifth anniversary of our company. That was a crazy period of time – so much has happened!&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px; margin-bottom: 0in;&quot;&gt;From the very beginning we have been very closely cooperating with Atlassian – an awesome Australian company which brought to the world such software masterpieces like JIRA, Confluence, Crucible or Bamboo. We have also provided custom solutions (related to Atlassian products) to many leading Polish and foreign companies. Finally&amp;nbsp;&lt;a href=&quot;https://my.spartez.com/&quot; style=&quot;color: #1155cc;&quot; target=&quot;_blank&quot;&gt;our commercial products&lt;/a&gt;&amp;nbsp;have been purchased by several hundred companies from all over the world, including: VISA, Wells Fargo, Warner Bross Games, Siemens, TF SKOK, DB Schenker and Amazon. Wow!&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px; margin-bottom: 0in;&quot;&gt;We have been present (speaking and even sponsoring) at dozens of software development conferences and geek meetups in Poland and abroad. I think we have earned some good reputation (and a title of the most picky recruiters in the area).&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px; margin-bottom: 0in;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px; margin-bottom: 0in;&quot;&gt;Over the course of years we have been contributing more and more to Atlassian products and, lo and behold, we proved that we know pretty well how to develop software and slowly by constantly we have been expending our tight partnership with Atlassian.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-vAtcejT0g-8/UEYpmDmLWsI/AAAAAAAAAo0/kFvraGC98S8/s1600/new-office2.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;300&quot; src=&quot;http://2.bp.blogspot.com/-vAtcejT0g-8/UEYpmDmLWsI/AAAAAAAAAo0/kFvraGC98S8/s400/new-office2.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px; margin-bottom: 0in;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;background-color: white; margin-bottom: 0in;&quot;&gt;&lt;span style=&quot;background-color: white;&quot;&gt;Now the time has come to make much bigger leap.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; margin-bottom: 0in;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;background-color: white;&quot;&gt;Recently together with Atlassian we have hired several new awesome software developers (&lt;/span&gt;&lt;a href=&quot;http://www.atlassian.com/company/careers/?tab=gdansk&quot; style=&quot;background-color: white;&quot; target=&quot;_blank&quot;&gt;we are still hiring&lt;/a&gt;&lt;span style=&quot;background-color: white;&quot;&gt;!). And ...&amp;nbsp;we have finally outgrew our first cosy office – a house in the backyards in the very centre of Gdansk – between Wrzeszcz and Oliwa districts – in Strzyża (Australians claim we are insane with saving so much on vowels :)). Though we love so much this area that we decided to stay in this district and move to a new place very close to our current office.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px; margin-bottom: 0in;&quot;&gt;So this week we are moving to a brand new A class office building – Garnizon Omega building, where we will be one of the first tenants.&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px; margin-bottom: 0in;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px; margin-bottom: 0in;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-b4NERtItgmE/UEYpOcvW63I/AAAAAAAAAos/40AqSs4apJQ/s1600/new-office1.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;300&quot; src=&quot;http://2.bp.blogspot.com/-b4NERtItgmE/UEYpOcvW63I/AAAAAAAAAos/40AqSs4apJQ/s400/new-office1.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;That&#39;s an awesome place (just look at the pictures – they are real!). Walking distance from trams, SKM (Tricity train), bus tops, 5 - 7 min walk from our biggest shopping mall – Baltic Gallery. And the place is quite silent – 200 or 300 m away from the noise of the main Grunwaldzka street. With New Słowackiego street almost ready (and already available for car traffic) it&#39;s also very conveniently located for people commuting from suburbs via Tricity highway (like I do personally). We almost doubled our effective office space there and we hope that it will serve us well for next few years.&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px; margin-bottom: 0in;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px; margin-bottom: 0in;&quot;&gt;We are still a small company (just exceeding 20 people) and we are proud of it. We used to work for big behemoth corporations and we know how much better is to work in a company where everyone knows each other and where things get simply done instead of being talked about. With new people hopefully joining us over the course of next months, we will grow significantly but we are sure we will still maintain the spirit of a cozy company with very few rules (common sense instead) and a great atmosphere. After all,&amp;nbsp;&lt;a href=&quot;http://en.wikipedia.org/wiki/Dunbar&#39;s_number&quot; style=&quot;color: #1155cc;&quot; target=&quot;_blank&quot;&gt;anthropologists believe&lt;/a&gt;&amp;nbsp;that a group of people (a tribe) can operate cohesively and efficiently up to 100 (some say even 200) people without too many extra rules, laws and enforced norms. And the lack of rules, laws and enforcement norms is what we really like. We still have a lot of capacity for growth till we even get close to such limit :)&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px; margin-bottom: 0in;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px; margin-bottom: 0in;&quot;&gt;Today we all visited our new office to pick the place for our desks (and see it in reality).&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px; margin-bottom: 0in;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-S9rq_if4s2o/UEYnHKkW1kI/AAAAAAAAAoM/7E_g8kP3cWc/s1600/demolishion.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;300&quot; src=&quot;http://2.bp.blogspot.com/-S9rq_if4s2o/UEYnHKkW1kI/AAAAAAAAAoM/7E_g8kP3cWc/s400/demolishion.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;That&#39;s not our former office :)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px; margin-bottom: 0in;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px; margin-bottom: 0in;&quot;&gt;Nope. It&#39;s not our new office :). It&#39;s a house being dismantled (well demolished) which was on our way. Could not resist taking a picture.&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px; margin-bottom: 0in;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-v_9twrDRcLs/UEYnwPdBoAI/AAAAAAAAAoU/7OA3ADeOg2Q/s1600/view-from-the-office.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;300&quot; src=&quot;http://1.bp.blogspot.com/-v_9twrDRcLs/UEYnwPdBoAI/AAAAAAAAAoU/7OA3ADeOg2Q/s400/view-from-the-office.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;View from our office&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px; margin-bottom: 0in;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-HY5jjQ09VKc/UEYoFKhzIiI/AAAAAAAAAoc/hY9iAPh1EPM/s1600/interior.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;300&quot; src=&quot;http://4.bp.blogspot.com/-HY5jjQ09VKc/UEYoFKhzIiI/AAAAAAAAAoc/hY9iAPh1EPM/s400/interior.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;One of our open space rooms&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-9e_g5R30lbc/UEYooHKEssI/AAAAAAAAAok/RaEcYs8GR-0/s1600/bicycle-lot.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;300&quot; src=&quot;http://3.bp.blogspot.com/-9e_g5R30lbc/UEYooHKEssI/AAAAAAAAAok/RaEcYs8GR-0/s400/bicycle-lot.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;A dedicated bicycle lot with 3 showers! Yes, yes, yes!&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px; margin-bottom: 0in;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px; margin-bottom: 0in;&quot;&gt;We are going to organize a housewarming party in September. As the final decoration works are still in progress, we cannot announce the exact date yet. &lt;b&gt;Stay tuned!&lt;/b&gt;&lt;/div&gt;&lt;div style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px; margin-bottom: 0in;&quot;&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://unimplemented.blogspot.com/feeds/7585165767872201974/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://unimplemented.blogspot.com/2012/09/we-are-moving.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/7585165767872201974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/7585165767872201974'/><link rel='alternate' type='text/html' href='http://unimplemented.blogspot.com/2012/09/we-are-moving.html' title='We are moving!'/><author><name>Wojciech Seliga</name><uri>http://www.blogger.com/profile/11923347478200368758</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_9itee73ZiXE/TI_YqDCmaZI/AAAAAAAAAck/03OZNHNYxMc/S220/wseliga-72x72.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-vAtcejT0g-8/UEYpmDmLWsI/AAAAAAAAAo0/kFvraGC98S8/s72-c/new-office2.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8813074174707015455.post-1667132466100503962</id><published>2011-12-23T10:52:00.000+01:00</published><updated>2012-02-18T22:21:22.426+01:00</updated><title type='text'>Scrum Standup in JIRA and Confluence</title><content type='html'>&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;What?&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Scrum Standup plugins for JIRA and Confluence have been released&lt;/u&gt;.&lt;br /&gt;&lt;br /&gt;They are available to download and try from &lt;a href=&quot;https://plugins.atlassian.com/plugin/details/849934&quot;&gt;https://plugins.atlassian.com/plugin/details/849934&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Scrum Standup plugin for JIRA&lt;/b&gt; allows to quickly create a daily written standup report and link it with the issues you have worked on.&amp;nbsp;It takes only a minute or two to prepare standup note. Just few clicks and few words - no worries about layout, edit conflicts, issue searching and linking hardness, no too large page kills your browser problem.&lt;br /&gt;Scrum Standup plugin for JIRA&amp;nbsp;contains dedicated view to display all daily standup notes for a project - great place for managers and absent folks.&lt;br /&gt;Built in and configurable email notifications can keep you up to date with the ongoing team progress.&lt;br /&gt;&lt;br /&gt;Take a look:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-0BU7Tg7PhZ8/T0ANnuqF9oI/AAAAAAAACTQ/CfR_RL1tGCw/s1600/1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;177&quot; src=&quot;http://3.bp.blogspot.com/-0BU7Tg7PhZ8/T0ANnuqF9oI/AAAAAAAACTQ/CfR_RL1tGCw/s320/1.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-nZYlKGriTe0/T0APR0EmxeI/AAAAAAAACTg/tRN0eFjKUrk/s1600/2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;19&quot; src=&quot;http://2.bp.blogspot.com/-nZYlKGriTe0/T0APR0EmxeI/AAAAAAAACTg/tRN0eFjKUrk/s320/2.jpg&quot; width=&quot;32&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-g8lMkKpi7ew/T0AP_ThU9aI/AAAAAAAACTo/er2DgznxdZI/s1600/3.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;19&quot; src=&quot;http://4.bp.blogspot.com/-g8lMkKpi7ew/T0AP_ThU9aI/AAAAAAAACTo/er2DgznxdZI/s320/3.jpg&quot; width=&quot;32&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-WOEoNwVeYRM/T0AQN8eGqRI/AAAAAAAACTw/Re0uW6z5uJo/s1600/4.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;18&quot; src=&quot;http://2.bp.blogspot.com/-WOEoNwVeYRM/T0AQN8eGqRI/AAAAAAAACTw/Re0uW6z5uJo/s320/4.jpg&quot; width=&quot;32&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-mXXVI6VlMt0/T0AQY1Qf21I/AAAAAAAACT4/Qr-1naaV-Sc/s1600/5.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;20&quot; src=&quot;http://3.bp.blogspot.com/-mXXVI6VlMt0/T0AQY1Qf21I/AAAAAAAACT4/Qr-1naaV-Sc/s320/5.jpg&quot; width=&quot;32&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-0bcgQ9qxa7A/T0AQjzdn4HI/AAAAAAAACUA/eR-vvejCG_E/s1600/6.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;16&quot; src=&quot;http://2.bp.blogspot.com/-0bcgQ9qxa7A/T0AQjzdn4HI/AAAAAAAACUA/eR-vvejCG_E/s320/6.jpg&quot; width=&quot;32&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-7GuuHz-rH2E/T0AQksLoFgI/AAAAAAAACUE/oi0NXaTcCvc/s1600/7.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;10&quot; src=&quot;http://4.bp.blogspot.com/-7GuuHz-rH2E/T0AQksLoFgI/AAAAAAAACUE/oi0NXaTcCvc/s320/7.jpg&quot; width=&quot;32&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-NWuIXPJICgA/T0AQl9MF4BI/AAAAAAAACUQ/ibmcjjH4zc4/s1600/8.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;20&quot; src=&quot;http://4.bp.blogspot.com/-NWuIXPJICgA/T0AQl9MF4BI/AAAAAAAACUQ/ibmcjjH4zc4/s320/8.jpg&quot; width=&quot;32&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Scrum Standup plugin for Confluence&lt;/b&gt; allows to retrieve standup notes from JIRA and display them on the Confluence page.&amp;nbsp;It gives you everything you need to familiarize yourself with the team progress on a single wiki page. Just open and read.&lt;br /&gt;&lt;br /&gt;Screenshots:&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-mw7RgqB5PkY/T0AUU2HWfbI/AAAAAAAACUY/QNq1eIl96pA/s1600/c1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;171&quot; src=&quot;http://3.bp.blogspot.com/-mw7RgqB5PkY/T0AUU2HWfbI/AAAAAAAACUY/QNq1eIl96pA/s320/c1.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-I8j62l3ib5Y/T0AUWbglSvI/AAAAAAAACUg/prAAerDSLwk/s1600/c2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;20&quot; src=&quot;http://2.bp.blogspot.com/-I8j62l3ib5Y/T0AUWbglSvI/AAAAAAAACUg/prAAerDSLwk/s320/c2.jpg&quot; width=&quot;32&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-3WhfRaBxtWE/T0AUXyPtbxI/AAAAAAAACUo/iAH2OT_uxaU/s1600/c3.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;20&quot; src=&quot;http://4.bp.blogspot.com/-3WhfRaBxtWE/T0AUXyPtbxI/AAAAAAAACUo/iAH2OT_uxaU/s320/c3.jpg&quot; width=&quot;32&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-u0FlJ5HuW5M/T0AO7uoe-OI/AAAAAAAACTY/PNWri7423pw/s1600/c4.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;19&quot; src=&quot;http://2.bp.blogspot.com/-u0FlJ5HuW5M/T0AO7uoe-OI/AAAAAAAACTY/PNWri7423pw/s320/c4.jpg&quot; width=&quot;32&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Scrum Standup plugins for JIRA and Confluence&amp;nbsp;are ready to download and try from&amp;nbsp;&lt;a href=&quot;https://plugins.atlassian.com/plugin/details/849934&quot;&gt;https://plugins.atlassian.com/plugin/details/849934&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;&lt;b&gt;Why?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There are two problems we want to solve with Scrum Standup plugins &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Problem 1&lt;/b&gt;: &lt;u&gt;Gather people together for a daily standup meeting&lt;/u&gt;.&lt;br /&gt;&lt;br /&gt;Let&#39;s imagine following scenario.&lt;br /&gt;&lt;br /&gt;You are a part of a team which uses JIRA for issue tracking. The team is small, agile and try to practice Scrum. You have a sprint planning meeting every two weeks when you prioritize backlog and estimate user stories, you try to meet every day on a short standup meeting so everyone in the team is up to date with others work, you perform a demo and sprint retrospective at the end of iteration. All of that helps your team to work smarter with no additional effort. Sweet... but what if:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;One or more of your team members work remotely and your team is dispersed.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Part of your team works in a different timezone and there are 9 hours of difference.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Some of the team members are &#39;&lt;i&gt;burn the midnight oil&lt;/i&gt;&#39; geeks and start work in the afternoon.&amp;nbsp;&lt;/li&gt;&lt;li&gt;People get sick or their kids get sick and they work from home for a few days.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Someone started to build a house of dream and works in totally unpredictable manner.&amp;nbsp;&lt;/li&gt;&lt;li&gt;There are other reasons which make it difficult to gather people together every day at specified time.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;In terms of sprint planning or retrospective meetings it is not a big problem. They happen once a week, biweekly or even more rarely so it is not very painful to gather people and perform video or Skype meeting. People tend to agree for an afternoon or very early morning meeting if it happens no more than once a week. They can get up early this day, take a baby sitter and deal with their private stuff another day. No big deal.&lt;br /&gt;&lt;br /&gt;Scrum standup meeting is a different story. It happens daily so if you run into one of the listed above cases it may be impossible to gather the team together at the same time everyday.&lt;br /&gt;There are many solutions:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Reorganize your project and team so there are no remote folks.&lt;/li&gt;&lt;li&gt;Run Scrum of Scrums.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Meet your remote product owner once a week instead of every day.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Start daily standup meeting even if half of the team is absent.&lt;/li&gt;&lt;li&gt;Run&amp;nbsp;daily standup meeting&amp;nbsp;before lunch when most of your staff is there.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Anything can be a solution. If you found it, people are happy and project is going smoothly then you are lucky and can stop reading here. You probably don&#39;t need anything more.&lt;br /&gt;&lt;br /&gt;If nothing works or you are simply not satisfied how the things go then written reports and Scrum Standup plugin may be an answer.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Problem 2&lt;/b&gt;: &lt;u&gt;What was done yesterday&lt;/u&gt;.&lt;br /&gt;&lt;br /&gt;Have you ever run into one of the following?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You missed last standup meeting or even worse, you were sick for a few days and feel that you don&#39;t know the current state of the project.&amp;nbsp;&lt;/li&gt;&lt;li&gt;You get back to work and want to know what happened when you were off.&amp;nbsp;&lt;/li&gt;&lt;li&gt;You have a problem and remember that someone fixed similar thing a week ago. Unfortunately your remote team is sleeping right now and you can&#39;t find who was that and how to find a fix among tens of SCM commits.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;Again there are many ways to deal with the problem:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Check activity stream of your JIRA project. &lt;/li&gt;&lt;li&gt;Go through SCM commits. &lt;/li&gt;&lt;li&gt;Use JIRA search to find the correct issue or comment.&lt;/li&gt;&lt;li&gt;Use Assembla/Github/Bitbucket search to find the right commit.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;If it works for you in all cases and you feel you don&#39;t need anything more just stop reading here.&lt;br /&gt;&lt;br /&gt;If it does not work or you feel you miss something, written reports and Scrum Standup plugin may be an answer again.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;That&#39;s why we decided to create Scrum Standup plugins for JIRA and Confluene&lt;/u&gt;.&lt;br /&gt;&lt;br /&gt;You can download and try them from &lt;a href=&quot;https://plugins.atlassian.com/plugin/details/849934&quot;&gt;https://plugins.atlassian.com/plugin/details/849934&lt;/a&gt;&lt;br /&gt;Bugs and feature requests can be raised at: &lt;a href=&quot;https://jira.spartez.com/jira/browse/SSJ&quot;&gt;https://jira.spartez.com/jira/browse/SSJ&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Enjoy,&lt;br /&gt;Scrum Standup team.</content><link rel='replies' type='application/atom+xml' href='http://unimplemented.blogspot.com/feeds/1667132466100503962/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://unimplemented.blogspot.com/2011/12/scrum-standup-in-jira-and-confluence.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/1667132466100503962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/1667132466100503962'/><link rel='alternate' type='text/html' href='http://unimplemented.blogspot.com/2011/12/scrum-standup-in-jira-and-confluence.html' title='Scrum Standup in JIRA and Confluence'/><author><name>Jacek Jaroczynski</name><uri>https://plus.google.com/112427208557053285816</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-jVduPOPn23I/AAAAAAAAAAI/AAAAAAAACd8/Emwgjb2w2dQ/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-0BU7Tg7PhZ8/T0ANnuqF9oI/AAAAAAAACTQ/CfR_RL1tGCw/s72-c/1.jpg" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8813074174707015455.post-363301395190258490</id><published>2011-10-10T10:21:00.002+01:00</published><updated>2011-10-10T10:24:29.953+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="atlassian"/><category scheme="http://www.blogger.com/atom/ns#" term="confluence"/><category scheme="http://www.blogger.com/atom/ns#" term="plugin"/><title type='text'>Approver Plugin For Confluence</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/--hIN8AYKHvE/TpK0r9uM49I/AAAAAAAABQc/rNUDz8A1xEU/s1600/thumbsup-80.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/--hIN8AYKHvE/TpK0r9uM49I/AAAAAAAABQc/rNUDz8A1xEU/s1600/thumbsup-80.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;&quot;&gt;Atlassian Confluence is a fine product, but so far it &amp;nbsp;has been lacking an important feature - there was no way to show your approciation of somebody&#39;s contributions (pages, blog posts, even comments), other than by commenting on them. This was in stark contract with places like Google+ or Facebook, where you can simply click a &quot;+1&quot; or &quot;Like&quot; button to quickly say that you like what somebody said.&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;&quot;&gt;To address that, we have created a simple, but powerful Confluence plugin - &lt;a href=&quot;http://approver.spartez.com/&quot;&gt;the Approver&lt;/a&gt;.&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;&quot;&gt;This plugin adds a widget to your Confluence pages, in a form of a &quot;Thumbs up&quot; button with a small counter. When you click this button, you annnounce to everybody that can read the page that you &quot;approve&quot; (&quot;like&quot;, &quot;+1&quot;)&amp;nbsp;the content just above it. The widget appears at the bottom of every page, as well as next to each comment. Whan you click the button, it turns to blue, so that you know whether or not you already &quot;approved&quot;. When you click the counter, you are shown a list of everybody who also &quot;approved&quot;&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;&quot;&gt;But wait, there is more. In addition to this button, Approver can optionally add Google+&#39;s &quot;+1&quot; and Facebook&#39;s &quot;Like&quot; buttons to every page or comment. This lets you share your opinions about the content with the whole world. Enable and use these with caution though - they expose your Confluence URLs (but not the content) to everybody on Google+ or Facebook. So if you consider these URLs secret, you should disable this option.&lt;/div&gt;&lt;div class=&quot;&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;&quot;&gt;Approver can be downloaded from our web page at&amp;nbsp;&lt;a href=&quot;http://approver.spartez.com/&quot;&gt;http://approver.spartez.com/&lt;/a&gt;, or from &lt;a href=&quot;https://plugins.atlassian.com/plugin/details/638974&quot;&gt;Atlassian Plugin Exchange&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;&quot;&gt;Here are some screenshots of Approver in action&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;&quot;&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-M__q48urEyM/TpK0mJLrrQI/AAAAAAAABQY/-t-BW7Dl2_I/s1600/approver-small.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;153&quot; src=&quot;http://1.bp.blogspot.com/-M__q48urEyM/TpK0mJLrrQI/AAAAAAAABQY/-t-BW7Dl2_I/s320/approver-small.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;b&gt;closeup of all buttons on a page&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-KoHRaHuKfeg/TpK3go9sSXI/AAAAAAAABQg/7ORps-qhDJw/s1600/approver-full.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;315&quot; src=&quot;http://3.bp.blogspot.com/-KoHRaHuKfeg/TpK3go9sSXI/AAAAAAAABQg/7ORps-qhDJw/s400/approver-full.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;b&gt;full page with Approver buttons and approvers list&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-M__q48urEyM/TpK0mJLrrQI/AAAAAAAABQY/-t-BW7Dl2_I/s1600/approver-small.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;br /&gt;&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://unimplemented.blogspot.com/feeds/363301395190258490/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://unimplemented.blogspot.com/2011/10/approver-plugin-for-confluence.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/363301395190258490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/363301395190258490'/><link rel='alternate' type='text/html' href='http://unimplemented.blogspot.com/2011/10/approver-plugin-for-confluence.html' title='Approver Plugin For Confluence'/><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/--hIN8AYKHvE/TpK0r9uM49I/AAAAAAAABQc/rNUDz8A1xEU/s72-c/thumbsup-80.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8813074174707015455.post-5564246590936312532</id><published>2011-07-18T14:13:00.004+01:00</published><updated>2011-07-19T07:25:37.827+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="eclipse"/><title type='text'>Eclipse mysteries</title><content type='html'>Do you use Eclipse? Have you faced below error and don&#39;t know what is going on? Google does not help?&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;!ENTRY org.eclipse.osgi 2 0 2011-07-15 05:06:39.766&lt;br /&gt;!MESSAGE The following is a complete list of bundles which are not resolved, see the prior log entry for the root cause if it exists:&lt;br /&gt;!SUBENTRY 1 org.eclipse.osgi 2 0 2011-07-15 05:06:39.766&lt;br /&gt;!MESSAGE Bundle org.eclipse.jdt.apt.pluggable.core_1.0.400.v20110305-1450 [107] was not resolved.&lt;br /&gt;!SUBENTRY 2 org.eclipse.jdt.apt.pluggable.core 2 0 2011-07-15 05:06:39.766&lt;br /&gt;!MESSAGE Missing imported package org.eclipse.jdt.internal.compiler.tool_0.0.0.&lt;br /&gt;!SUBENTRY 2 org.eclipse.jdt.apt.pluggable.core 2 0 2011-07-15 05:06:39.767&lt;br /&gt;!MESSAGE Missing imported package org.eclipse.jdt.internal.compiler.apt.dispatch_0.0.0.&lt;br /&gt;!SUBENTRY 2 org.eclipse.jdt.apt.pluggable.core 2 0 2011-07-15 05:06:39.767&lt;br /&gt;!MESSAGE Missing imported package org.eclipse.jdt.internal.compiler.apt.model_0.0.0.&lt;br /&gt;!SUBENTRY 2 org.eclipse.jdt.apt.pluggable.core 2 0 2011-07-15 05:06:39.767&lt;br /&gt;!MESSAGE Missing imported package org.eclipse.jdt.internal.compiler.apt.util_0.0.0.&lt;br /&gt;!SUBENTRY 1 org.eclipse.osgi 2 0 2011-07-15 05:06:39.767&lt;br /&gt;!MESSAGE Bundle org.eclipse.jdt.compiler.apt_1.0.400.v0110509-1300 [109] was not resolved.&lt;br /&gt;!SUBENTRY 2 org.eclipse.jdt.compiler.apt 2 0 2011-07-15 05:06:39.767&lt;br /&gt;!MESSAGE Missing optionally imported package org.eclipse.jdt.internal.compiler.tool_0.0.0.&lt;br /&gt;!SUBENTRY 1 org.eclipse.osgi 2 0 2011-07-15 05:06:39.767&lt;br /&gt;!MESSAGE Bundle org.eclipse.jdt.compiler.tool_1.0.100.v_B61 [110] was not resolved.&lt;br /&gt;!SUBENTRY 2 org.eclipse.jdt.compiler.tool 2 0 2011-07-15 05:06:39.767&lt;br /&gt;!MESSAGE Missing Constraint: Bundle-RequiredExecutionEnvironment: JavaSE-1.6&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Stay calm and do not try to solve above dependency problem. In 99.99% it is a side effect of another problem, even if you can&#39;t see anything special in your log at first sight. &lt;br /&gt;&lt;br /&gt;Have a cup of coffee or bottle of beer if you can and relax. &lt;br /&gt;&lt;br /&gt;Next go through your log again. Look for some suspicious warnings as well as innocent info messages located in the nearby. It may be everything, file system permission problem, ant issue or any other stuff totally unrelated to the org.eclipse.jdt imports and dependencies.&lt;br /&gt;&lt;br /&gt;Write a comment if my post helped to solve your case.</content><link rel='replies' type='application/atom+xml' href='http://unimplemented.blogspot.com/feeds/5564246590936312532/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://unimplemented.blogspot.com/2011/07/eclipse-mysteries.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/5564246590936312532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/5564246590936312532'/><link rel='alternate' type='text/html' href='http://unimplemented.blogspot.com/2011/07/eclipse-mysteries.html' title='Eclipse mysteries'/><author><name>Jacek Jaroczynski</name><uri>https://plus.google.com/112427208557053285816</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-jVduPOPn23I/AAAAAAAAAAI/AAAAAAAACd8/Emwgjb2w2dQ/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8813074174707015455.post-832900183764186506</id><published>2011-07-15T08:29:00.016+01:00</published><updated>2011-07-15T20:21:17.174+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="employee time tracking"/><title type='text'>Simple web based time reporting with MrTickTock 1.3</title><content type='html'>MrTickTock 1.3 has been released and published at &lt;a href=&quot;http://mrticktock.com/&quot;&gt;http://mrticktock.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;font-size:130%;&quot; &gt;What&#39;s new?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In this version we have added comprehensive &lt;span style=&quot;font-weight:bold;&quot;&gt;time reports creation&lt;/span&gt; capability to our cool and small agile time tracker.&lt;br /&gt;&lt;br /&gt;The previous &lt;span style=&quot;font-style:italic;&quot;&gt;Reports&lt;/span&gt; section was very simple and limited and many users complained about it. Therefore we have added several enhancements and now users can create a report in three easy steps:&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Select date range&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;There are several predefined items like current week/month/year, previous week/month/year, last 7 days, etc. as well as custom date range selection.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Select projects&lt;/span&gt; which should be included in the report.&lt;br /&gt;&lt;br /&gt;All tasks from the selected projects are included in the report. In version 1.7 we will introduce &lt;span style=&quot;font-style:italic;&quot;&gt;billable&lt;/span&gt; task concept and allow to create reports for all the tasks or only for the billable ones.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Select type of grouping&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;It is a crucial setting which defines how the report will look like. There are several options available which we believe covers 99% of use cases. Users can group report entries by date, tasks, projects and customers. Combined options are also available.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;There is no &lt;span style=&quot;font-weight:bold;&quot;&gt;users selection&lt;/span&gt; as we decided it would be a redundant step. Report automatically contains all users involved in the selected project in the selected date range.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Export to CSV&lt;/span&gt; is another useful part of &lt;span style=&quot;font-style:italic;&quot;&gt;Reports&lt;/span&gt; section. It works fine with MS Office, Open Office and other office tools. It is really helpful for users who want to decorate report with their own comments and calculations.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Other changes&lt;/span&gt; in MrTickTock 1.3:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;First created task (for new users) is automatically set as &lt;span style=&quot;font-weight:bold;&quot;&gt;Default Task&lt;/span&gt; and marked wit yellow star (default task is used by Windows Sidebar gadget and will be used by mobile applications for automatic time tracking).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Windows Sidebar gadget&lt;/span&gt; has now auto-refresh feature (set to 5 minutes) and clickable logo which opens online time sheet in the browser.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Several other small improvements and bug fixes.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;font-size:130%;&quot; &gt;What&#39;s next?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Version 1.4 will bring &lt;span style=&quot;font-weight:bold;&quot;&gt;Remote Stand-up&lt;/span&gt; feature. There will be possibility to add public comment to every time report as well as a sick leave and a day off. We will introduce separate view to present all of that nicely as a daily time report for a project. It should be extremely useful for team collaboration.&lt;br /&gt;It will also work for managers who are not familiar with Scrum and Agile practices but care about team progress and project condition on a daily basis.&lt;br /&gt;&lt;br /&gt;That&#39;s all for today folks. I hope you will like MrTickTock as much as I do. It is getting more and more useful and awesome every release.&lt;br /&gt;&lt;br /&gt;You can check the road-map and backlog in our &lt;a href=&quot;https://loft.spartez.com/jira/browse/TT&quot;&gt;JIRA&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We publish most recent news via &lt;a href=&quot;http://www.twitter.com/mrticktock_com&quot;&gt;Twitter&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Enjoy,&lt;br /&gt;MrTickTock team</content><link rel='replies' type='application/atom+xml' href='http://unimplemented.blogspot.com/feeds/832900183764186506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://unimplemented.blogspot.com/2011/07/simple-web-based-time-reporting-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/832900183764186506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/832900183764186506'/><link rel='alternate' type='text/html' href='http://unimplemented.blogspot.com/2011/07/simple-web-based-time-reporting-with.html' title='Simple web based time reporting with MrTickTock 1.3'/><author><name>Jacek Jaroczynski</name><uri>https://plus.google.com/112427208557053285816</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-jVduPOPn23I/AAAAAAAAAAI/AAAAAAAACd8/Emwgjb2w2dQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8813074174707015455.post-8170192452839752155</id><published>2011-06-06T13:48:00.006+01:00</published><updated>2011-06-06T20:31:06.329+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="employee time tracking"/><title type='text'>Simple web based time tracking with MrTickTock 1.2</title><content type='html'>MrTickTock 1.2 has been released. As usually it brings bunch of useful features and improvements. It is published at &lt;a href=&quot;http://mrticktock.com&quot;&gt;http://mrticktock.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;What&#39;s new?&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Track time with &#39;Start Work&#39; and &#39;Stop Work&#39; buttons&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;The most expected feature is now live. If you constantly forget your work start time or you switch tasks quite often you will like this feature. Simply press &#39;Start Work&#39; button at the beginning of your work and &#39;Stop Work&#39; at the end. MrTickTock will automatically save your exact work time. You will be able to edit calculated time report if you need.&lt;br /&gt;&lt;br /&gt;You don&#39;t have to keep your browser open as the start work time is saved on the server side. You can freely restart your computer or open MrTickTok page in another browser and your start work time will be there.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Change task order with drag &amp; drop&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;It is really awesome feature. We haven&#39;t seen it in any other time reporting tool. You can simply drag your task, move it up or down on the list and drop in the position you like. It is a cool way to have your favourite tasks at the top of the list.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Windows desktop gadget&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;Do you use Windows 7 or Vista? Do you like desktop gadgets? If yes then install our new gadget which allows to report time in a second right from your Windows desktop. &lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Simple UI improvements and bug fixes&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;We constantly apply small changes to our application to make it more user friendly, more obvious and easier to use. &lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;What&#39;s next?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Version 1.3 will focus on reports. We plan to make them really usable by adding grouping and CSV export. It should be released in the middle of June.&lt;br /&gt;&lt;br /&gt;Remote stand-up feature will appear in the version 1.4 scheduled for the beginning of July. &lt;br /&gt;We practice SCRUM a lot (also in remote teams) and having an agile time tracker with remote stand-up support could be really beneficial. &lt;br /&gt;We will also create Confluence plugin to show all the stand-up entries on the wiki page.&lt;br /&gt;&lt;br /&gt;You can check the road-map and backlog in our &lt;a href=&quot;https://loft.spartez.com/jira/browse/TT&quot;&gt;JIRA&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We publish most recent news via &lt;a href=&quot;http://www.twitter.com/mrticktock_com&quot;&gt;Twitter&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Enjoy,&lt;br /&gt;MrTickTock team</content><link rel='replies' type='application/atom+xml' href='http://unimplemented.blogspot.com/feeds/8170192452839752155/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://unimplemented.blogspot.com/2011/06/simple-web-based-time-tracking-with.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/8170192452839752155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/8170192452839752155'/><link rel='alternate' type='text/html' href='http://unimplemented.blogspot.com/2011/06/simple-web-based-time-tracking-with.html' title='Simple web based time tracking with MrTickTock 1.2'/><author><name>Jacek Jaroczynski</name><uri>https://plus.google.com/112427208557053285816</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-jVduPOPn23I/AAAAAAAAAAI/AAAAAAAACd8/Emwgjb2w2dQ/s512-c/photo.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8813074174707015455.post-6189955246764930184</id><published>2011-04-16T12:09:00.017+01:00</published><updated>2011-04-19T07:45:17.234+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="employee time tracking"/><title type='text'>Simple web based vacation tracking with MrTickTock 1.1</title><content type='html'>MrTickTock 1.1 has been released. It brings bunch of useful features and improvements. Everything is available at &lt;a href=&quot;http://mrticktock.com&quot;&gt;http://mrticktock.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;What&#39;s new?&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Vacation tracking&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;Our small time tracker is now also a vacation tracker. Users can easily set day and week as Off or Sick which is marked on a time sheet with a nice background color. Light yellow color together with small sun icon means that user is off and hopefully has a sunny vacation time. Light pink color together with small red cross icon means that user is sick.&lt;br /&gt;&lt;br /&gt;List of absent team mates for the current day and week is visible right below the time sheet table.&lt;br /&gt;&lt;br /&gt;There is no integration with Google calendar at the time but it is still on our road-map and should appear quite soon. We will also add support for vacation request-approve process which is often used in larger companies.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Gravatar integration&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;It allows users to see their avatar pictures across the application.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Reminder emails&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;Users can get email message at the end of day if they forget to report time. We do not send reminders on weekends and days marked as Off. Reminder emails can be completely disabled.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Time zone support&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;Current day on the time sheet page is highlighted according to the user&#39;s time zone and reminder emails are sent at 6pm of user&#39;s time.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Version 1.1 contains few other improvements and fixes. As usually the full list of changes can be found in our JIRA.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;What&#39;s next?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Version 1.2 will bring additional improvements on the time sheet page, mobile view and possibility to track time with start and stop buttons (asked by few customers). It should be released at the end of the May.&lt;br /&gt;&lt;br /&gt;Remote stand-up feature will appear in the version 1.3 scheduled for the middle of June.&lt;br /&gt;&lt;br /&gt;You can check the road-map and backlog in our &lt;a href=&quot;https://loft.spartez.com/jira/browse/TT&quot;&gt;JIRA&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We publish most recent news via &lt;a href=&quot;http://www.twitter.com/mrticktock_com&quot;&gt;Twitter&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Enjoy,&lt;br /&gt;MrTickTock team</content><link rel='replies' type='application/atom+xml' href='http://unimplemented.blogspot.com/feeds/6189955246764930184/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://unimplemented.blogspot.com/2011/04/simple-web-based-vacation-tracking-with.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/6189955246764930184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8813074174707015455/posts/default/6189955246764930184'/><link rel='alternate' type='text/html' href='http://unimplemented.blogspot.com/2011/04/simple-web-based-vacation-tracking-with.html' title='Simple web based vacation tracking with MrTickTock 1.1'/><author><name>Jacek Jaroczynski</name><uri>https://plus.google.com/112427208557053285816</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-jVduPOPn23I/AAAAAAAAAAI/AAAAAAAACd8/Emwgjb2w2dQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry></feed>