<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>TechWire</title>
	
	<link>http://techwire-ua.com</link>
	<description>We are a software development company with a decade of experience. We believe that the solution to outsourcing is to establish proper communication, thus ensuring quality and on-time delivery of customer expectations.</description>
	<lastBuildDate>Thu, 05 Apr 2012 06:15:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/techwire_dp_ua" /><feedburner:info uri="techwire_dp_ua" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>techwire_dp_ua</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Skill Overview</title>
		<link>http://feedproxy.google.com/~r/techwire_dp_ua/~3/qpqfuVWrApI/</link>
		<comments>http://techwire-ua.com/2011/08/skill-overview/#comments</comments>
		<pubDate>Wed, 24 Aug 2011 22:00:00 +0000</pubDate>
		<dc:creator>adminwp</dc:creator>
				<category><![CDATA[Skills]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[dotnet]]></category>
		<category><![CDATA[experience]]></category>
		<category><![CDATA[messaging]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[techwire]]></category>
		<category><![CDATA[ukraine]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://techwire-ua.com/?p=91</guid>
		<description><![CDATA[The following coding languages, operating systems and development tools are those in which TechWire has experience and is confident in working with. Database: Oracle, MS SQL Server, MySQL, Access; Languages: C#, Visual C/C++, Java, Visual Basic, Perl, ASP, PHP; Web-development: &#8230; <a href="http://techwire-ua.com/2011/08/skill-overview/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>The following coding languages, operating systems and development tools are those in which TechWire has experience and is confident in working with.</p>
<p><span id="more-91"></span></p>
<p><strong>Database:</strong> Oracle, MS SQL Server, MySQL, Access;</p>
<p><strong>Languages: </strong>C#, Visual C/C++, Java, Visual Basic, Perl, ASP, PHP;</p>
<p><strong>Web-development: </strong>HTML, JavaScript (including JQuery, JQuery UI), CSS;</p>
<p><strong>Microsoft .NET Framework</strong> (including good practical knowledge of ASP.NET);</p>
<p><strong>Mobile development for iPhone and Android, </strong>using PhoneGap / HTML5 / jQuery Mobile;</p>
<p><strong>Content Management Systems</strong>, such as Drupal, Joomla, as well as lower-level frameworks such as ASP.NET MVC;</p>
<p><strong>Miscellaneous Technologies: </strong>XML, XSLT, COM+, ActiveX, SOAP, REST.<strong><br />
</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://techwire-ua.com/2011/08/skill-overview/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://techwire-ua.com/2011/08/skill-overview/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=skill-overview</feedburner:origLink></item>
		<item>
		<title>An experience with Joomla vulnerability</title>
		<link>http://feedproxy.google.com/~r/techwire_dp_ua/~3/EScOawIfcOA/</link>
		<comments>http://techwire-ua.com/2010/07/prevent-fight-joomla-extension-vulnerabilities/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 10:34:28 +0000</pubDate>
		<dc:creator>adminwp</dc:creator>
				<category><![CDATA[Process]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[extension]]></category>
		<category><![CDATA[hacker]]></category>
		<category><![CDATA[joomla]]></category>
		<category><![CDATA[malicious]]></category>
		<category><![CDATA[prevention]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[vulnerability]]></category>

		<guid isPermaLink="false">http://techwire-ua.com/?p=109</guid>
		<description><![CDATA[Below is a story of one of the sites that we support being hacked, and the lessons we learnt from the experience. I hope you will be able to learn from our experience, and make the right decisions to prevent &#8230; <a href="http://techwire-ua.com/2010/07/prevent-fight-joomla-extension-vulnerabilities/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Below is a story of one of the sites that we support being hacked, and the lessons we learnt from the experience. I hope you will be able to learn from our experience, and make the right decisions to prevent such accidents from happening to your sites.</p>
<p><span id="more-109"></span></p>
<p>Two months ago we received an email from the site&#8217;s hosting provider, stating that the site &#8220;has been hacked and used to run illegal software on the server&#8221;, for which reason they&#8217;ve completely shutdown both the site and its control panel, until we tell them that we&#8217;ve made all the necessary preparations to correct the problem — which meant removing the vulnerability that was exploited, as well as taking steps to reduce the chance of any other vulnerabilities.</p>
<p>I need to note that on the site itself, prior to it being shutdown, there was nothing to indicate any problems. All looked fine.</p>
<p>The way the hack was done was by using an insecure request processing in one of the modules used with the <a title="Joomla CMS" href="http://www.joomla.org">Joomla</a> (a <a title="CMS" href="http://en.wikipedia.org/wiki/Content_management_system">Content Management System</a>) on the site. The module, developed by a third party, was not checking one of the possible request types, which could come from any visitor&#8217;s browser, for possibility of malicious code. This meant, that some commands could be executed on the server of the hosting by calling the site in question with the following link:</p>
<p style="margin-left: 22px;">SITE_ADDRESS/index.html?option=MODULE_NAME&amp;controller=../../../../../../../proc/self/environ%00 HTTP/1.1&#8243; 200 3573 &#8220;-&#8221; &#8220;Mozilla/5.0 mimot</p>
<p>mimot&#8221;</p>
<p>This request should work in the following way <span class="Apple-style-span" style="border-collapse: separate; color: #000000; font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;"><span class="Apple-style-span" style="font-family: arial,sans-serif; white-space: pre-wrap; font-size: small;">—</span></span> the controller code for the specified module is called, and it is passed the parameters in the call, which get processed by &#8220;good&#8221; code afterwards. What happened in reality is that the parameters in the request link were not &#8220;sanitized&#8221; by the code of the module (this is a standard safety procedure, which was left out by the creator of the module by mistake), thus allowing the parameters to contain some &#8220;bad&#8221; code, which was executed as part of the controller call, before the &#8220;good&#8221; code was invoked.</p>
<p>The passed parameter contained &#8220;bad&#8221; code which executed the following actions:</p>
<ul>
<li>Moved many folders up the file structure from where the actual site is located (so further code was executed in the environment that is not even available to the site administrator accessing the site with standard means — FTP or control panel). It is possible that the number of levels that the code needed to be places is standard for the hosting server the site is located on, and that folder could contain service utilities used by many other sites.</li>
<li>Got a remote file &#8220;FILE_NAME.jpg&#8221; and stored it locally. We checked what this file was — if you looked at it using a text editor, you&#8217;d see that it was not an image, in spite of the extension, instead it is a collection of executable scripts that allow remotely performing any actions on the server where this file is installed. Powerful badness.</li>
<li>Renamed the file to &#8220;count.php&#8221; (supposedly choosing a file that executes often), thus turning a fake image into an executable file.</li>
<li>Listed all the files in that directory with a lot of additional information (perhaps to use for further attacks).</li>
</ul>
<p>Upon receiving the notification from the hosting provider, with the above link information, we took the following vital steps:</p>
<ul>
<li><strong>Don&#8217;t panic.</strong> It doesn&#8217;t help anyway, but also we concluded that the site is now closed (until we remove the vulnerability), and the malicious code was already removed by the hosting provider, so no more harm can be done.</li>
<li><strong>Study the threat.</strong> We never saw anything like this before, so it took some time to understand what the above link was doing and how, and what needed to be done to prevent it.</li>
<li><strong>Look for other survivors.</strong> We searched the forums of Joomla webmasters to see if there were other victims of the same vulnerability — and it did turn out that this vulnerability became apparent just a few days before it was exploited on our site, and the very helpful Joomla community did already provide ways to close the door of the risky module.</li>
<li><strong>Restore the site from the backup.</strong> This is also a very important step, since we didn&#8217;t know what other actions the hacker may have done on the site after gaining access to it. It is possible that the database and administrator user passwords were stolen, that additional dangerous code was installed, etc. Thankfully, our trusty provider has an automatic daily backup procedure (which keeps backups of the site, both the files and the database, for 7 days), thus the site was restored to the state before the hacker attack. It was unfortunate that the content placed on the site after this point was lost, but it was an acceptable cost of knowing that the site is now completely clean of any changes by the intruder.</li>
<li><strong>Remove the vulnerability.</strong> Applying the knowledge of the nature of the threat, and the advice from the forum folk, we edited the module code to include sanitizing of parameters processed by the controller code.</li>
<li><strong>Change the passwords.</strong> Restoring the site from backup ensured that it is &#8220;clean&#8221;, yet the hacker could have obtained various passwords (most notably, the database password, since any CMS needs to store it separately to enable its own code to access the database). So we changed all the important passwords.</li>
</ul>
<p>After performing these steps, we notified the hosting provider, and the site was enabled again.</p>
<p>One of the things that we also learnt while investigating the threat is that the module used on the site has not been updated by its author for over a year, so it looked risky to continue using it as opposed to something that has more active support and community. For this reason we looked for an alternative that would satisfy the site&#8217;s goals and, thankfully, were able to rather quickly find a replacement. Open source community is a great crowd to interact with, and if there is a problem that many people need to deal with, somebody out there is most likely working on a good solution for that problem.</p>
<p>The lessons we learnt from this accident:</p>
<ul>
<li><strong>Nobody is invincible.</strong> Even if you write all of your code — you may still make mistakes. But if you depend on software or modules created by somebody else &#8211; the chances are even higher. That doesn&#8217;t mean that we should panic (because — we shouldn&#8217;t), instead, we need to do everything possible that the risks are minimized, and that there is a plan in place for dealing with problems before they arise.</li>
<li><strong>Backups.</strong> Without these, we&#8217;d have a lot more work to do. So, when creating a site, always think about periodic backups, whether they are done by the hosting provider, or whether the site backups itself on a cron job. These are vital, and we were truly thankful we had one.</li>
<li><strong>Keep the software up to date.</strong> Since any site usually depends on several third-party modules, and vulnerabilities may often be discovered and fixed in those modules, it is important to make sure that you are always running the latest and most secure version of the software. I love how <a title="Drupal CMS" href="http://drupal.org/">Drupal</a> CMS deals with it — there is an &#8220;Update&#8221; module which periodically checks for any third party module updates, and notifies the site administration if an update is needed. For Joomla such a centralized solution does not seem to exist, so we put in place periodical reminders to check whether there are any updates to the components, modules and plugins used on the sites that we maintain.</li>
<li><strong>Minimize the risks.</strong> This is a general statement, and needs to be applied to the specific site configuration. At least one can say that it is best not to use any third party addons unless really necessary, and, if needed, then you should choose modules that are well maintained, have an active community around them, and solve as many tasks of your site as possible &#8211; so that you don&#8217;t need to rely on too many of them. There are also many security checklists which describe how file access etc should be configured — these should be followed by definition, at least the official one: <a title="Joomla security checklist" href="http://docs.joomla.org/Security_Checklist_7">http://docs.joomla.org/Security_Checklist_7</a>.</li>
<li><strong>Follow the vulnerability news.</strong> For Joomla, there is a security news feed for the <a href="http://developer.joomla.org/security/news.html">vulnerabilities found in the Joomla core itself</a>, and a feed with constant updates on <a href="http://docs.joomla.org/Vulnerable_Extensions_List">discovered vulnerabilities in Joomla extensions</a>. We are now subscribed to both of those feeds, watching them closely for news about any features that are used on our sites.</li>
</ul>
<p>And, above all, don&#8217;t panic! We hope this information will help you avoid such accidents in the future and, if they do happen, to be able to solve them with least damage to you and your customers.</p>
]]></content:encoded>
			<wfw:commentRss>http://techwire-ua.com/2010/07/prevent-fight-joomla-extension-vulnerabilities/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://techwire-ua.com/2010/07/prevent-fight-joomla-extension-vulnerabilities/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=prevent-fight-joomla-extension-vulnerabilities</feedburner:origLink></item>
		<item>
		<title>Engineering a web-site, step 3: Goals, users, structure</title>
		<link>http://feedproxy.google.com/~r/techwire_dp_ua/~3/5zPzhJ94mM8/</link>
		<comments>http://techwire-ua.com/2010/07/engineering-website-step-3-goals-users-structure/#comments</comments>
		<pubDate>Fri, 09 Jul 2010 15:16:08 +0000</pubDate>
		<dc:creator>adminwp</dc:creator>
				<category><![CDATA[Process]]></category>
		<category><![CDATA[goals]]></category>
		<category><![CDATA[information architecture]]></category>
		<category><![CDATA[structure]]></category>
		<category><![CDATA[web design]]></category>

		<guid isPermaLink="false">http://techwire-ua.com/?p=108</guid>
		<description><![CDATA[Continuing a description of the Information Architecture (IA) process, in this third article of &#8220;Engineering a web-site&#8221; series (dedicated to the design and development of site for the Baptist Union of the Dnepropetrovsk region using Drupal CMS), I describe the &#8230; <a href="http://techwire-ua.com/2010/07/engineering-website-step-3-goals-users-structure/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><em><img style="margin: 0px 10px 5px 0px; float: left;" src="http://techwire-ua.com/wp-content/themes/t/images/stories/ecbdpua_engineering_step3.jpg" alt="Engineering a website, step 3" width="250" height="150" /></em>Continuing a description of the Information Architecture (IA) process, in this third article of &#8220;Engineering a web-site&#8221; series (dedicated to the design and development of site for the <a title="Dnepropetrovsk regional Baptist Union of Ukraine" href="http://ecb.dp.ua">Baptist Union of the Dnepropetrovsk region</a> using <a title="Drupal, a content management system" href="http://drupal.org">Drupal CMS</a>), I describe the final goals for the site, the audience, how that was broken down to specific tasks, and how it was translated into the final site structure.</p>
<p><span id="more-108"></span></p>
<p>&nbsp;</p>
<p>You can find the description of preliminary design stages in the previous articles of the series, one on <a title="Engineering a web-site, step 1: Study of the peers" href="http://techwire-ua.com/2010/04/engineering-website-step-1-study-peers/">studying the peers</a>, and one on <a title="Engineering a web-site, step 2: Interviewing the key users" href="http://techwire-ua.com/2010/04/engineering-website-step-2-interview-key-users/">interviewing the key site users</a>.</p>
<h3>The Goals</h3>
<div style="margin: 0px 0px 5px 10px; float: right; width: 350px; padding: 7px; background-color: #f0f0f0;"><small><img src="http://techwire-ua.com/wp-content/themes/t/images/stories/ecbdpua_teaser_site.png" alt="Teaser site, used prior to launch" width="350" height="243" /><br />
A static teaser site was published during the development process, to make sure the basic information (contacts etc) is already available, and so that the search engines start indexing the site in advance.</small></div>
<p>Based on key user interviews and investigation of other similar sites, the following goals were defined and agreed with the decision-makers, ordered in descending priority:</p>
<ol>
<li>Inform the visitors about the<strong> life of the Regional Union</strong>, including both the past events and the future event announcements.</li>
<li><strong>Offer resources for educating</strong> people serving in the main directions of church ministry. Some resources need to have their access limited to specific user groups.</li>
<li>Provide <strong>reference information about the Regional Union</strong> — about its departments, churches, contact information.</li>
<li>Allow the site <strong>visitors to communicate</strong> with each other and with the Regional Union office — in order to receive answers to their questions, as well as to establish contacts.</li>
<li>To explain what the Bible talks about important issues of the contemporary life, in order to <strong>bring the Good News</strong> of Salvation to those people who don&#8217;t know God, and also to equip those who would like to share the Good News.</li>
</ol>
<h3>The Audience</h3>
<p>The next step in addition to the above goals is to define the potential audience of the site, as follows (with their potential goals of the site):</p>
<ol>
<li><strong>Church members</strong> (check the news, find out about future events, find a church by geography, study provided education materials, find out more about the Regional Union, ask a question, participate in a discussion of a topic or of an article on the site).</li>
<li><strong>Ministers</strong> (goals the same as above, with addition of possibility to contact some other pastors or the Union leadership, find pastoral or ministry resources with restricted access, leave a request to add new resources.</li>
<li><strong>Content editors</strong> (in addition to above tasks, they may need to add and edit new content, moderate the discussions, respond to questions).</li>
<li><strong>Guests</strong> (the tasks are different from the above groups &#8211; find out more about what the Baptists believe in, find an answer to an interesting topic, ask their own question to start a discussion, contact somebody who can help find what they need).</li>
</ol>
<h3>The Structure</h3>
<div style="margin: 0px 20px 5px 0; float: left; width: 350px; padding: 7px; background-color: #f0f0f0;"><small><img src="http://techwire-ua.com/wp-content/themes/t/images/stories/ecbdpua_homepage_mockup.png" alt="ecbdpua_homepage_mockup" width="350" height="376" /><br />
One of the &#8220;mockups&#8221; (also called &#8220;wireframes&#8221; sometimes) created in <a title="Balsamiq - an online mockup and wireframing tool" href="http://www.balsamiq.com/">Balsamiq</a> tool in order to visualize how the various page types may look. You&#8217;ll notice that some things changed in the process, generally in order to simplify the site.</small></div>
<p>Based on the above goals and audience, several possible user scenarios were created (too wordy to post here, but I can share examples if you&#8217;d like &#8211; just ask in the comments below the article). This led to defining content types which the site would hold, and, finally, designing the site structure and navigation for the site users to complete their goals by easily finding the needed content types and functions in the site. These are the resulting site sections and their purpose:</p>
<ol>
<li><strong>Home </strong>- introduction to what the site is about (for first-time visitors), as well dashboard-type summary of all the site activity (for both new and returning vistors),</li>
<li><strong>News </strong>- articles on past events and announcements of the future events, as well as an easy access to news archive.</li>
<li><strong>Library </strong>- educational materials, by ministry type.</li>
<li><strong>Forum </strong>- for discussions, including a restricted-access sub-forum.</li>
<li><strong>About Us</strong> &#8211; to contain information about the Baptists, the Regional Union, and its departments. Additional content type in this section is listing of churches (which turned out very easy to do using Drupal&#8217;s user-filtered Views).</li>
</ol>
<p>Additional &#8220;helper&#8221; screens were also included in secondary navigation &#8211; <strong>Contact</strong>, <strong>Help</strong>, <strong>Sitemap </strong>pages, and the <strong>Search </strong>form. For each of the above page types the required functionality was listed, to make sure that the site goals and audience information above is not lost in the increasing number of details describing the future site. For example, it was noted that users should be allowed to comment any material on the site, and, for their convenience, they should be able to subscribe to receive site, material and discussion updates via e-mail.</p>
<p>After all of this was reviewed, discussed with the decision makers and (finally!) confirmed, it was time to continue with the site development &#8211; which will be described in the final article of the series, to come soon, so stay tuned (<a title="TechWire software development news feed" href="http://feeds.feedburner.com/techwire_dp_ua">subscribing via RSS</a>, for example). Also, I would be happy to hear feedback on this approach &#8211; whether you are using similar process, or perhaps something different &#8211; you can leave your comments below the article (no registration required).</p>
<p>You can find the other articles of the series here:</p>
<ul>
<li><a title="Engineering a web-site, step 1: Study of the peers" href="http://techwire-ua.com/2010/04/engineering-website-step-1-study-peers/">Engineering a web-site, step 1: Study of the peers</a></li>
<li><a title="Engineering a web-site, step 2: Interviewing the key users" href="http://techwire-ua.com/2010/04/engineering-website-step-2-interview-key-users/">Engineering a web-site, step 2: Interviewing the key users<br />
</a></li>
<li>Engineering a web-site, step 3: Goals, users, structure (this article)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://techwire-ua.com/2010/07/engineering-website-step-3-goals-users-structure/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://techwire-ua.com/2010/07/engineering-website-step-3-goals-users-structure/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=engineering-website-step-3-goals-users-structure</feedburner:origLink></item>
		<item>
		<title>Engineering a web-site, step 2: Interviewing the key users</title>
		<link>http://feedproxy.google.com/~r/techwire_dp_ua/~3/edrcSk2LCCs/</link>
		<comments>http://techwire-ua.com/2010/04/engineering-website-step-2-interview-key-users/#comments</comments>
		<pubDate>Tue, 27 Apr 2010 14:01:00 +0000</pubDate>
		<dc:creator>adminwp</dc:creator>
				<category><![CDATA[Process]]></category>
		<category><![CDATA[navigation]]></category>
		<category><![CDATA[research]]></category>
		<category><![CDATA[structure]]></category>
		<category><![CDATA[useability]]></category>
		<category><![CDATA[user interview]]></category>
		<category><![CDATA[web design]]></category>

		<guid isPermaLink="false">http://techwire-ua.com/?p=107</guid>
		<description><![CDATA[This is the next step in working through an informational architecture process for the Union of Evangelical Christian Baptist churches in Dnepropetrovsk region: interviewing the key decision makers, potential site editors and users. In step 1 of &#8220;Engineering a web-site&#8221; &#8230; <a href="http://techwire-ua.com/2010/04/engineering-website-step-2-interview-key-users/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img style="margin: 0 10px 5px 0;" src="http://techwire-ua.com/wp-content/themes/t/images/stories/ecbdpua_engineering_step2.jpg" alt="Engineering a web-site, Step 2" align="left" />This is the next step in working through an informational architecture process for the <a href="http://ecb.dp.ua">Union of Evangelical Christian Baptist churches in Dnepropetrovsk region</a>: interviewing the key decision makers, potential site editors and users.</p>
<p><span id="more-107"></span></p>
<p>In <a href="http://techwire-ua.com/2010/04/engineering-website-step-1-study-peers/">step 1 of &#8220;Engineering a web-site&#8221; series, &#8220;Study of the Peers&#8221;</a>, I described why I think that designing and implementing a site is essentially an engineering task, and how I looked at other sites with a similar task, and what lessons I learnt from this process.</p>
<p>The main risk to handle was that of me creating a site that nobody will ever want to populate (since that&#8217;s not what they needed), and thus it will attract no visitors and will generally serve no purpose. So my next logical step was to talk to those people who could potentially become contributors to the site.</p>
<p>As you may remember, the formal Informational Architecture (IA) process consists of these steps:</p>
<ol>
<li>Site&#8217;s goals.</li>
<li>User experience.</li>
<li>Site content.</li>
<li>Site structure.</li>
<li>Visual design.</li>
</ol>
<p>We are still on step 1 of that process, <strong>defining the goals</strong>, yet that&#8217;s not something to be discouraged about &#8211; I&#8217;d rather spend extra time on getting the goals right, instead of making a site that serves no definite purpose.</p>
<h3>Lots of talking</h3>
<p>First of all, of course, I talked with the head of the regional union of baptist churches, and got his opinion on what the site should be and whom it should be for. I was sure to ask who the main decision-maker would be if any issues arise, and was pleased to hear that it would be him &#8211; committees can be good for some things, but not for making responsible decisions.</p>
<p>From him I also got a list of all the departments of the union (corresponding to various ministries &#8211; Sunday school, church planting, evangelism to prisons, and so on), which had the phone numbers for the person responsible for each of the departments. My reasoning was that these people are in the midst of the events in the union, so they can be a very good source of information and news &#8211; it would be great if I could find out their preferences and create a site that would make them excited.</p>
<p>Additional bonus is that these people also represent a part of the future site&#8217;s audience, as they could use it to find out what it happening in other departments and other churches, and they could use the site to communicate with their friends and co-workers in the church world. So I could hit two birds with one stone, hopefully not hurting them too much as a result.</p>
<p>Thus began the public part of my work, as before that not too many people knew that a site is being cooked, and now I would suddenly create all these expectations in people. Again, that&#8217;s a good thing, having more responsibility actually helps getting things done, and having them done properly.</p>
<p>In all, I spent some lengthy conversations with 12 people, on the phone or in person. The main questions I asked are in the following categories:</p>
<ul>
<li>How much do you use Internet? What are the main tasks you perform on the web? (to get a general feeling of how knowledgeable a person is, and also to get a better insight into what kind of audience the site may serve)</li>
<li>What web-sites do you like the most, and why? What do you not like in web-sites? (again, to get a feel on what may and may not work for these people in both content and visuals).</li>
<li>What are the goals of your department?</li>
<li>How could a web-site help to achieve these goals? (a very broad question, I know, but one that I could hear some good ideas from)</li>
<li>What kinds of content and how often do you think you or your department could contribute to the site?</li>
<li>Do you look forward to your organization having a site, and would you be willing to be actively participating in its life? (if you read the first step of &#8220;Engineering a web-site&#8221; series, then you know that my main concern was that I need to gather a team &#8211; this question has that specific purpose)</li>
</ul>
<h3>When all is said and heard</h3>
<p>The summary of each such conversation was recorded in a single &#8220;Key Users Interview Notes&#8221; document, which is very interesting to re-read after the site is finished <img src='http://techwire-ua.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Each department wishes to have a brief page about them, with possibility to post news or announcements. Everyone wanted a &#8220;library&#8221; of sorts, though not too many people were sure they&#8217;d be able to suggest any actual materials for it. An important idea was stated that it would be good to have a catalog of all the region&#8217;s churches on the site. Leader of music ministry wanted to be able to post sheet music, which expanded the idea of &#8220;library&#8221; to more of a free-form resource center, rather than just a list of articles. One person insisted that a &#8220;restricted&#8221; part of the site is needed. There would also be photo-heavy reports from different events.</p>
<p>Some people also couldn&#8217;t say much, since they don&#8217;t use computers or Internet too often, and that was also important to hear &#8211; the site would need to be as simple and clear to such people as possible, since they are also an important part of the baptist union, and we wouldn&#8217;t want to leave them behind.</p>
<h3>Lessons learned</h3>
<p>My written conclusion at the end of all the interview sessions:</p>
<blockquote style="background-color: #f8f8f8; border-left: solid 3px #FBC74B; padding: 9px 9px 9px 18px;"><p>Everyone mainly thinks of making a site of the members of the union itself, providing materials for church members only, and some even think that it is needed only for the ministers &#8211; deacons and pastors.</p>
<p>Most popular requests for the site (sorted by subjective importance, taking into account how often a feature was mentioned by different people):</p>
<ul>
<li>News, reports, with photographs.</li>
<li>Educational materials for teachers, pastors, preachers (articles, books, series of lessons, with inclusion of files in PDF and other formats, multimedia). Important to have materials categorized by ministry type, for easier searching.</li>
<li>Announcements of future events.</li>
<li>Information about departments and churches, with contact details and addresses. This information should always be available, and never slide down into the archives, as regular news do.</li>
<li>The site needs a section for fellowship &#8211; be it a &#8220;forum&#8221;, a &#8220;chat&#8221;, an FAQ page &#8211; I need to review available tools and decide which one suits the site&#8217;s goals the best.</li>
</ul>
<p>It is also possible to create a section of the site which would be directed at the visitors who are not a part of the union&#8217;s churches &#8211; yet it is hard to decide how it should be done, as nobody shows much interest in developing it. Perhaps there could be a series of &#8220;About Us&#8221; articles for such guests, or a separate FAQ page for important questions &#8211; this needs to be decided.</p></blockquote>
<p>My impressions? Very happy, since some of the things these people were saying sounded like a complete definition of functionality, exactly what I was looking for. I needed to define the site&#8217;s goals, and these interviews gave me a very good idea. On the other hand, it was very hard to tell who would actually be participating in the site, but several people did show genuine interest, so I was hopeful.</p>
<p>You can find the other articles of the series here:</p>
<ul>
<li><a href="http://techwire-ua.com/2010/04/engineering-website-step-1-study-peers/">Engineering a web-site, step 1: Study of the peers</a></li>
<li>Engineering a web-site, step 2: Interviewing the key users (this article)</li>
<li><a href="http://techwire-ua.com/2010/07/engineering-website-step-3-goals-users-structure/">Engineering a web-site, step 3: Goals, users, structure</a></li>
</ul>
<p>Coming next: <strong>Finalizing the site&#8217;s goals, getting a confirmation</strong>.</p>
<p>Stay tuned (<a title="TechWire news feed" href="http://feeds.feedburner.com/techwire_dp_ua">RSS</a> is so handy for that), and I would love to hear what you think in the comments to this article.</p>
]]></content:encoded>
			<wfw:commentRss>http://techwire-ua.com/2010/04/engineering-website-step-2-interview-key-users/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://techwire-ua.com/2010/04/engineering-website-step-2-interview-key-users/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=engineering-website-step-2-interview-key-users</feedburner:origLink></item>
		<item>
		<title>Engineering a web-site, step 1: Study of the peers</title>
		<link>http://feedproxy.google.com/~r/techwire_dp_ua/~3/-UQmBVphipI/</link>
		<comments>http://techwire-ua.com/2010/04/engineering-website-step-1-study-peers/#comments</comments>
		<pubDate>Wed, 21 Apr 2010 12:43:46 +0000</pubDate>
		<dc:creator>adminwp</dc:creator>
				<category><![CDATA[Process]]></category>
		<category><![CDATA[navigation]]></category>
		<category><![CDATA[research]]></category>
		<category><![CDATA[structure]]></category>
		<category><![CDATA[web design]]></category>

		<guid isPermaLink="false">http://techwire-ua.com/?p=106</guid>
		<description><![CDATA[We&#8217;ve recently launched a site developed in Drupal CMS for the Union of Evangelical Christian Baptist churches in the Dnepropetrovsk region. Later I&#8217;ll also post a summary of the technologies used in the site&#8217;s creation, yet before that I would &#8230; <a href="http://techwire-ua.com/2010/04/engineering-website-step-1-study-peers/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img style="margin: 0 10px 5px 0;" src="http://techwire-ua.com/wp-content/themes/t/images/stories/ecbdpua_engineering_step1.jpg" alt="Engineering a web-site, Step 1" align="left" />We&#8217;ve recently launched a site developed in <a href="http://drupal.org">Drupal CMS</a> for the <a title="Dnepropetrovsk regional Evangelical Christian Baptists Union" href="http://ecb.dp.ua">Union of Evangelical Christian Baptist churches in the Dnepropetrovsk region</a>. Later I&#8217;ll also post a summary of the technologies used in the site&#8217;s creation, yet before that I would like to share, in a series of articles, how I approached the design and planning in this project. The first article, &#8220;step 1&#8243;, is dedicated to studying other similar sites, for information, ideas and warnings.</p>
<p><span id="more-106"></span></p>
<h3>Engineering? Isn&#8217;t it a kind of art instead?</h3>
<p>Yes and no. It is an art, and many art forms together — when talking of design, we usually think of visual art. Yet that should come as the last step in the process. Before that, it is an art of communicating with the customer, to find out what they want. Art of asking the right questions — and art of finding good answers. Art of organizing information, of removing the unneeded extras, of convincing the customer that &#8220;everything&#8221; is not a good idea. That is art, yet to keep it all properly structured, to ensure that no key factor is missed, I&#8217;d like to call it an engineering art.</p>
<p><img style="margin: 0 0 5px 10px;" src="http://techwire-ua.com/wp-content/themes/t/images/stories/ecbdpua_site_shot.jpg" alt="Screenshot of the ecb.dp.ua frontpage" align="right" />(you can see the final design of the front page of the site to the right.) In order to produce a logical and usable output, I looked for a step-by-step process usually called &#8220;Information Architecture&#8221;. The rough outline of the process was built on many articles and thoughts in general, in particular I enjoyed the <a href="http://www.webmonkey.com/2010/02/information_architecture_tutorial/">Information Architecture tutorial</a> posted by the kind people at <a href="http://www.webmonkey.com/">webmonkey.com</a>. It describes the following IA steps:</p>
<ol>
<li>Site&#8217;s goals.</li>
<li>User experience.</li>
<li>Site content.</li>
<li>Site structure.</li>
<li>Visual design (see, it is the last step in the process!)</li>
</ol>
<p>I didn&#8217;t follow them strictly, though, but they gave me a good framework to think about and to make some of the key decisions.</p>
<p>Where I was closest to the &#8220;Art&#8221; idea was in the main project direction, since it was formulated as &#8220;we need a site&#8221;. I was left with the task of defining what purpose (other than simply &#8220;being&#8221;) the site will serve, for what audience, with what content and in what form and structure.</p>
<h3>Overcoming the peer pressure, or &#8220;How does everyone else do it?&#8221;</h3>
<p>To avoid starting with a blank canvas, I&#8217;ve performed analysis of other similar Ukrainian sites — searching for regional unions, communities, churches etc. When working on a business or commercial site, this step would be named &#8220;researching the competition&#8221;, yet in the case of this project these other sites can&#8217;t and shouldn&#8217;t be treated as competing, since their service directed to a single common goal.</p>
<p>Surprising result — out of 24 regions (&#8220;oblast&#8221;) of Ukraine, only one regional union site was announced — and even that site was down. Bad luck (actually, something to think about), but I found some regional youth sites, church sites, plus carefully studied the main site of the <a href="http://ecbua.info/">Evangelical Christian Baptists of Ukraine</a>. All these gave me an idea of what content, features and structure are popular in the community, which I listed in a document and presented to the person who gave me the whole &#8220;make a site&#8221; task.</p>
<p>The content types I found in my investigation:</p>
<ul>
<li>About us page (describing the church or organization, contact info, addresses etc).</li>
<li>Description of activities, ministries, reoccurring events in the church / community.</li>
<li>A news feed (including future event announcements).</li>
<li>Articles, sermons, books — in textual, audio and video formats, both created by the church / organization and, *ahem*, &#8220;borrowed&#8221;.</li>
<li>Rich musical sections — note sheets, chords, lyrics, recordings of church choirs and bands, as well as famous Christian singers (yes, Ukrainians love music, no doubt).</li>
<li>Photograph galleries.</li>
<li>Discussion boards (aka Forums).</li>
</ul>
<p>This all looks fairly common, so I knew that I would need to allow for the same kinds of content one way or the other, yet how to structure them so that the visitors can find it if and when needed — that&#8217;s an important decision, but I could make it only after deciding on the site&#8217;s goals and audience. Until then, having an inventory of the possibilities was enough, and was a good start.</p>
<h3>Learning on others&#8217; experience</h3>
<p>I also made one important observation. The fact that most of these sites seemed inactive and poorly maintained was both alarming and thought-provoking. At the end of this research phase I presented the following written conclusion:</p>
<blockquote style="background-color: #f8f8f8; border-left: solid 3px #FBC74B; padding: 9px 9px 9px 18px;"><p>The absence of working regional sites probably means that there is no defined need &#8211; either by the leadership or by the people tasked with distributing information in their region. The fact that many of the church sites are rarely updated most likely means that they were created by techy enthusiasts, as they&#8217;d do it for themselves, without thinking through how these sites could serve their visitors. This also impacted the visual styling and content editorial quality of these sites.</p>
<p>The only fully active site is the <a href="http://ecbua.info">all-Ukrainian one</a>, and it seems to be led by a single maintainer, who continuously &#8220;bugs&#8221; people to provide news updates and other types of content (<strong>N.B.</strong> I found this out from a couple of &#8220;journalists&#8221; who are providing information for the site; since then the site&#8217;s design and management were changed, and I don&#8217;t yet know how it is operated at the moment).</p>
<p>Therefore, a site can exist and be active on the following conditions:</p>
<ul>
<li>Clarity on the site&#8217;s purpose and goals, whom does the site exist for (majority of the information on the studied sites is only interesting to the person who&#8217;s maintaining the site), and this purpose has to be carried in both the site&#8217;s structure and its content.</li>
<li>There should be a team of people who understand the site&#8217;s goals and its audience, and who play an active role in populating the site with content that corresponds to the goals and is interesting to the audience.</li>
</ul>
</blockquote>
<p>Even though this conclusion may be stating the obvious, having relevant research materials to base it on really helped me in further discussions with the key people in the organization, to explain to them why we need a goal, and to paint them a vivid picture of the risks a site encounters if not everyone is on board on what it is for and whom it is for.</p>
<p>Knowing the risks was also important in continuing with the site&#8217;s design and implementation.</p>
<h3>Research is a good idea</h3>
<p>I have to say that the results of this investigation were not all negative. I found good decisions and solutions on those sites, and I wrote down the structure, the content types of each site, how the contact information was presented, what kinds of discussions or interactions were happening on. That was a good foundation to develop on, so I am thankful to their creators and maintainers, especially knowing that their job may be a difficult one when they don&#8217;t have a team of people to share and support their ideas and the desire to improve their on-line ministry.</p>
<p>You can find the other articles of the series here:</p>
<ul>
<li>Engineering a web-site, step 1: Study of the peers (this article)</li>
<li><a href="http://techwire-ua.com/2010/04/engineering-website-step-2-interview-key-users/">Engineering a web-site, step 2: Interviewing the key users</a></li>
<li><a href="http://techwire-ua.com/2010/07/engineering-website-step-3-goals-users-structure/">Engineering a web-site, step 3: Goals, users, structure</a></li>
</ul>
<p>Coming next: <strong>Determining the key decision-makers, conducting interviews, summary of the feedback</strong>.</p>
<p>Stay tuned (<a title="TechWire news feed" href="http://feeds.feedburner.com/techwire_dp_ua">RSS</a> is so handy for that), and I would love to hear what you think in the comments to this article.</p>
]]></content:encoded>
			<wfw:commentRss>http://techwire-ua.com/2010/04/engineering-website-step-1-study-peers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://techwire-ua.com/2010/04/engineering-website-step-1-study-peers/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=engineering-website-step-1-study-peers</feedburner:origLink></item>
		<item>
		<title>Using Google services (Wave, Docs) in daily QA process</title>
		<link>http://feedproxy.google.com/~r/techwire_dp_ua/~3/kJG1QFLU0uI/</link>
		<comments>http://techwire-ua.com/2010/03/using-google-wave-docs-in-qa-process/#comments</comments>
		<pubDate>Thu, 11 Mar 2010 13:09:55 +0000</pubDate>
		<dc:creator>adminwp</dc:creator>
				<category><![CDATA[Communication]]></category>
		<category><![CDATA[Process]]></category>
		<category><![CDATA[Quality]]></category>
		<category><![CDATA[google docs]]></category>
		<category><![CDATA[google wave]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[qa]]></category>
		<category><![CDATA[quality assurance]]></category>
		<category><![CDATA[reporting]]></category>
		<category><![CDATA[status updates]]></category>

		<guid isPermaLink="false">http://techwire-ua.com/?p=95</guid>
		<description><![CDATA[There are many organizational difficulties facing small to medium Software Quality Assurance (QA) teams. Because of this, we welcome any help to simplify this work and make assignment, communication and reporting more reliable. Tools are not the silver bullet, yet &#8230; <a href="http://techwire-ua.com/2010/03/using-google-wave-docs-in-qa-process/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img style="margin: 0px 10px 5px 0px;" src="http://techwire-ua.com/wp-content/themes/t/images/stories/using_google_services.jpg" alt="Using Google services (Wave, Docs) in daily QA process" />There are many organizational difficulties facing small to medium Software Quality Assurance (QA) teams. Because of this, we welcome any help to simplify this work and make assignment, communication and reporting more reliable. Tools are not the silver bullet, yet with a responsible team the right tools can make a lot of difference. Read on to see how we started using Google&#8217;s toolkit (namely, <a title="Google Wave" href="http://wave.google.com/">Google Wave</a> and <a title="Google Docs" href="http://docs.google.com">Google Docs</a>) in our daily QA and general development practices, as described by Dmitriy Boltovskiy, our QA team lead.</p>
<p><span id="more-95"></span></p>
<p style="clear: left;">What are these difficulties, you might ask. Organizing a QA process requires:</p>
<ul>
<li>a lot of preparation, as we work on the test-cases during or right after the design and specification phase,</li>
<li>intensive back and forth communication, both between the QA engineers as they coordinate testing assignments, especially on interdependent tasks, and communication with the development team on the implementation detail, especially when issues are found,</li>
<li>and there&#8217;s reacting to feedback that is sometimes delayed, since the development team may already be working on other tasks, and may not respond to an issue immediately, — thus making a face to face meeting not always possible,</li>
<li>plus lots of reporting and the management keeping a close eye on those reports — to determine when a task is ready to be shipped, or when adjustments to priorities or assignments may be in order.</li>
</ul>
<p>All of this boils down to efficient communication between several team members, so let me show you an example how we solve some of these issues.</p>
<h3>A real-life QA scenario</h3>
<p>Let&#8217;s assume that we plan a new version 3.3.0.0 of our software product. There are two tasks planned for delivery in this release:</p>
<ul>
<li>Task #1001 New report screen in Forecasting Area.</li>
<li>Task #1002 Implement widgets in Home Page.</li>
</ul>
<p>To initiate the process, I create a new Google Wave: “Version 3.3.0.0”, as you can see on the screen below (apologies for having to compress some of the screenshots to get all the data in):<br />
<a href="http://techwire-ua.com/wp-content/themes/t/images/stories/Using-google-services-in-QA-daily-work_html_m5c203fec.png"><img src="http://techwire-ua.com/wp-content/themes/t/images/stories/Using-google-services-in-QA-daily-work_html_m5c203fec.png" alt="Create a new Google Wave" /></a></p>
<p>In order to facilitate interaction, I add 2 people to this wave — Vadim (a QA Engineer) and Alexander (the developer assigned to this task). They can edit this wave and view any changes which were done to it by other people.</p>
<p><img src="http://techwire-ua.com/wp-content/themes/t/images/stories/Using-google-services-in-QA-daily-work_html_m2da33702.png" alt="Assign collaborating members to the Google Wave" /></p>
<p>Then I create the following directory structure in Google Docs, to contain both the specifications and the test-cases for the planned tasks:<br />
<img src="http://techwire-ua.com/wp-content/themes/t/images/stories/Using-google-services-in-QA-daily-work_html_m7a8a49c5.png" alt="Folder structure in Google Docs" /></p>
<p>I upload the following documents into Google Docs:</p>
<ul>
<li>Specifications for Task #1 and Task #2 to the “Tasks” folder.</li>
<li>Test Cases templates (these are still empty, for the QA guys to populate) to the “Test Cases” folder.</li>
</ul>
<p>You can see the specifications here:</p>
<p><img src="http://techwire-ua.com/wp-content/themes/t/images/stories/Using-google-services-in-QA-daily-work_html_4b7180e.png" alt="Task specifications in Google Docs" /></p>
<p>And the test-case templates are here:</p>
<p><img src="http://techwire-ua.com/wp-content/themes/t/images/stories/Using-google-services-in-QA-daily-work_html_36862905.png" alt="Task test-cases in Google Docs" /></p>
<p>These documents are shared with the specific people involved in the development and testing process, so that they can view and edit them as necessary:</p>
<p><img src="http://techwire-ua.com/wp-content/themes/t/images/stories/Using-google-services-in-QA-daily-work_html_3e90f302.png" alt="Sharing documents in Google Docs" /></p>
<p>When this is all done, I update the “Version 3.3.0.0” wave to add links to the corresponding documents, now the wave serves as the main control panel for accessing the needed data and asking questions or providing feedback and status updates:</p>
<p><img src="http://techwire-ua.com/wp-content/themes/t/images/stories/Using-google-services-in-QA-daily-work_html_711fad63.png" alt="Google Wave updated to include links to the documents in Google Docs" /></p>
<p>The actual assignment of the test cases to QA team members can be as easy as leaving a comment, or one could edit the task list and write the person name near the task they are assigned to:</p>
<p><img src="http://techwire-ua.com/wp-content/themes/t/images/stories/Using-google-services-in-QA-daily-work_html_m613fe7bc.png" alt="Assigning tasks to people in Google Wave" /></p>
<p>And get confirmations from each of the guys:</p>
<p><img src="http://techwire-ua.com/wp-content/themes/t/images/stories/Using-google-services-in-QA-daily-work_html_m244e3ef0.png" alt="Task assignment confirmation in Google Wave" /></p>
<p>When test cases are complete I can review and approve them straight from Google Wave, and then I can delete the unnecessary comments or data from the wave. The ready test cases may look like this:</p>
<p><img src="http://techwire-ua.com/wp-content/themes/t/images/stories/Using-google-services-in-QA-daily-work_html_m19812391.png" alt="Test cases for task 1001 in Google Docs" /></p>
<p>&nbsp;</p>
<p><img src="http://techwire-ua.com/wp-content/themes/t/images/stories/Using-google-services-in-QA-daily-work_html_m634536a9.png" alt="Test cases for task 1002 in Google Docs" /></p>
<p>When version 3.3.0.0 is implemented and ready to be tested, Alexander from the development team updates the wave, and may also let know the location of the latest source or installation files to test:</p>
<p><img src="http://techwire-ua.com/wp-content/themes/t/images/stories/Using-google-services-in-QA-daily-work_html_652f91e3.png" alt="" name="graphics12" /></p>
<p>This is when we, the QA team, may start the actual testing process:</p>
<p><img src="http://techwire-ua.com/wp-content/themes/t/images/stories/Using-google-services-in-QA-daily-work_html_399ace97.png" alt="" name="graphics13" /></p>
<p>As testing progresses, which we can also discuss in the wave (though we are more likely to discuss progress in person), I can quickly check every test case and see the overall results:<br />
<img src="http://techwire-ua.com/wp-content/themes/t/images/stories/Using-google-services-in-QA-daily-work_html_71b962d8.png" alt="Test case progress on Task 1001 in Google Docs" /></p>
<p>&nbsp;</p>
<p><img src="http://techwire-ua.com/wp-content/themes/t/images/stories/Using-google-services-in-QA-daily-work_html_m5cd9f715.png" alt="Test case progress on Task 1001 in Google Docs" /></p>
<p>If every single test case has PASSed status, I can report that version 3.3.0.0 is successfully tested, the tasks are completed, and the wave may now be archived:</p>
<p><img src="http://techwire-ua.com/wp-content/themes/t/images/stories/Using-google-services-in-QA-daily-work_html_136aca4b.png" alt="Archiving the Google Wave when testing is complete" /></p>
<p>As you can see, this approach is practical and simple. If the team consists of many members, one may need more ways to filter and display data from the reports, yet for smaller teams this solution works well. Please let us know in the comments if you use something similar, or perhaps you can suggest an alternative approach.</p>
<p>Just remember: no tool or process will ever replace common sense and responsibility.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://techwire-ua.com/2010/03/using-google-wave-docs-in-qa-process/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://techwire-ua.com/2010/03/using-google-wave-docs-in-qa-process/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=using-google-wave-docs-in-qa-process</feedburner:origLink></item>
		<item>
		<title>Accessing unmanaged code in separate context in WPF</title>
		<link>http://feedproxy.google.com/~r/techwire_dp_ua/~3/emf2f2ZySXQ/</link>
		<comments>http://techwire-ua.com/2010/03/accessing-unmanaged-code-separate-context-wpf/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 08:07:20 +0000</pubDate>
		<dc:creator>adminwp</dc:creator>
				<category><![CDATA[Process]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[context]]></category>
		<category><![CDATA[control]]></category>
		<category><![CDATA[example]]></category>
		<category><![CDATA[SynchronizationContext]]></category>
		<category><![CDATA[Windows Presentation Foundation]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://techwire-ua.com/?p=105</guid>
		<description><![CDATA[In order for Windows Forms controls to work correctly in .NET Framework it is necessary to access their methods and properties from the same context that they were created in, otherwise they may display unpredictable behaviour. Usually this is a &#8230; <a href="http://techwire-ua.com/2010/03/accessing-unmanaged-code-separate-context-wpf/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img style="margin: 0 10px 5px 0;" src="http://techwire-ua.com/wp-content/themes/t/images/stories/use_context.png" alt="" align="left" />In order for <a title="Microsoft Windows Forms" href="http://www.microsoft.com/events/series/windowsforms.mspx">Windows Forms</a> controls to work correctly in <a title="Microsoft .Net Framework" href="http://msdn.microsoft.com/netframework/">.NET Framework</a> it is necessary to access their methods and properties from the same context that they were created in, otherwise they may display unpredictable behaviour. Usually this is a concern when using multiple threads, some of which need to modify a control&#8217;s state. All of this is also relevant for <a title="Microsoft Windows Presentation Foundation (WPF)" href="http://msdn.microsoft.com/en-us/library/aa663364.aspx">Windows Presentation Foundation</a> (WPF) technology. However, in WPF such an issue may also arise when using a DLL with unmanaged code — this does not occur in WinForms. We&#8217;ll show an example how one can solve this issue by calling methods from the DLL in a separate context.</p>
<p><span id="more-105"></span></p>
<p>Let&#8217;s say we have a DLL written in C, called &#8220;native.dll&#8221;, and we need to call method getSomeList() of the DLL, which returns a list of items to populate a drop-down control in WPF. In order to implement this, we need to take the following key steps:</p>
<ol>
<li>Create new context for invoking the DLL method.</li>
<li>Invoke the DLL method in the newly created context.</li>
<li>Access the control&#8217;s properties and methods in the context that the control was created in.</li>
</ol>
<p>The sample code below demonstrates this in more detail.</p>
<p style="text-autospace: none; border: solid 1px #d5d5d5; padding: 18px 36px;"><span style="font-size: 10.0pt; font-family: 'Courier New'; color: gray;">///</span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: gray;">&lt;summary&gt;</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New'; color: gray;">///</span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: green;">Interaction logic for </span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: #2b91af;">Window1</span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: green;">.xaml</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New'; color: gray;">///</span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: gray;">&lt;/summary&gt;</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New'; color: blue;">public</span><span style="font-size: 10.0pt; font-family: 'Courier New';"> <span style="color: blue;">partial</span> <span style="color: blue;">class</span> <span style="color: #2b91af;">Window1</span> : <span style="color: #2b91af;">Window</span></span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">{</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">   <span style="color: gray;">//</span> </span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: #040004;">Context</span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: #040004;">for accessing controls</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">   </span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: blue;">private</span><span style="font-size: 10.0pt; font-family: 'Courier New';"> <span style="color: #040004;">System</span>.<span style="color: #040004;">Threading</span>.<span style="color: #2b91af;">SynchronizationContext</span> <span style="color: #040004;">originalContext</span> = <span style="color: blue;">null</span>;</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';"> </span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">   </span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: gray;">//</span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: gray;">We need to import the function</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">   [<span style="color: #2b91af;">DllImport</span>(<span style="color: #a31515;">"native.dll"</span>, <span style="color: #040004;">CharSet</span> = <span style="color: #2b91af;">CharSet</span>.<span style="color: #040004;">Ansi</span>, <span style="color: #040004;">CallingConvention</span></span><span style="font-size: 10.0pt; font-family: 'Courier New';"> = <span style="color: #2b91af;">CallingConvention</span>.<span style="color: #040004;">StdCall</span>)]</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">   <span style="color: blue;">static</span> <span style="color: blue;">public</span> <span style="color: blue;">extern</span> <span style="color: blue;">byte</span> <span style="color: #040004;">getSomeList</span>(<span style="color: blue;">int</span> <span style="color: #040004;">no</span>, <span style="color: #2b91af;">StringBuilder</span> <span style="color: #040004;">name</span>);</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';"> </span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">   <span style="color: gray;">// </span></span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: gray;">Constructor</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">   <span style="color: blue;">public</span> <span style="color: #040004;">Window1</span>()</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">   {</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">      <span style="color: #040004;">InitializeComponent</span>();</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';"> </span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">      <span style="color: gray;">// Obtain the context in which the controls were created</span></span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">      </span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: #040004;">originalContext</span><span style="font-size: 10.0pt; font-family: 'Courier New';"> = <span style="color: #040004;">System</span>.<span style="color: #040004;">Threading</span>.<span style="color: #2b91af;">SynchronizationContext</span>.<span style="color: #040004;">Current</span>;</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">   </span><span style="font-size: 10.0pt; font-family: 'Courier New';">}</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';"> </span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">   <span style="color: gray;">// Populate the list on window load event</span></span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">   </span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: blue;">private</span><span style="font-size: 10.0pt; font-family: 'Courier New';"> <span style="color: blue;">void</span> <span style="color: #040004;">Window_Loaded</span>(<span style="color: blue;">object</span> <span style="color: #040004;">sender</span>, <span style="color: #2b91af;">RoutedEventArgs</span> <span style="color: #040004;">e</span>)</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">   {</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">      <span style="color: blue;">try</span></span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">      {</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">         <span style="color: gray;">// Create context for invocation of </span></span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: gray;">getSomeList</span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: gray;">() from </span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: gray;">native</span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: gray;">.</span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: gray;">dll</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">         </span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: #040004;">System</span><span style="font-size: 10.0pt; font-family: 'Courier New';">.<span style="color: #040004;">Threading</span>.<span style="color: #2b91af;">SynchronizationContext</span> <span style="color: #040004;">sc</span> = <span style="color: blue;">new</span> </span><span style="font-size: 10.0pt; font-family: 'Courier New';"><span style="color: #040004;">System</span>.<span style="color: #040004;">Threading</span>.<span style="color: #2b91af;">SynchronizationContext</span>();</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">         <span style="color: blue;">object</span> <span style="color: #040004;">cr</span> = <span style="color: blue;">null</span>;</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">         <span style="color: gray;">// In this new context, call the list method</span></span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">         </span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: #040004;">sc</span><span style="font-size: 10.0pt; font-family: 'Courier New';">.<span style="color: #040004;">Post</span>(<span style="color: #040004;">ActualGet</span></span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: #040004;">SomeList</span><span style="font-size: 10.0pt; font-family: 'Courier New';">, <span style="color: #040004;">cr</span>);</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">      }</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">      <span style="color: blue;">catch</span> (<span style="color: #040004;">System</span>.<span style="color: #2b91af;">Exception</span> <span style="color: #040004;">ex</span>)</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">      {</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">      }</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">   }</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';"> </span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">   <span style="color: gray;">// Method for receiving the list and accessing the control</span></span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">   </span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: blue;">private</span><span style="font-size: 10.0pt; font-family: 'Courier New';"> <span style="color: blue;">void</span> <span style="color: #040004;">ActualGet</span></span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: #040004;">SomeList</span><span style="font-size: 10.0pt; font-family: 'Courier New';">(<span style="color: blue;">object</span> <span style="color: #040004;">obj</span>)</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">   {</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">      <span style="color: blue;">try</span></span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">      {</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">         <span style="color: gray;">// Receive the list </span></span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">         <span style="color: blue;">string</span>[] <span style="color: #040004;">listItems</span> = <span style="color: #040004;">GetSomeList()</span>;</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">         <span style="color: gray;">// Call method, which populates the drop-down </span></span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: gray;">cbSomeList</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New'; color: gray;">         // in the context in which it was created</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">         </span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: #040004;">originalContext</span><span style="font-size: 10.0pt; font-family: 'Courier New';">.<span style="color: #040004;">Post</span>(<span style="color: #040004;">SetListItems</span>, <span style="color: #040004;">listItems</span>);</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">      }</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">      <span style="color: blue;">catch</span> (<span style="color: #040004;">System</span>.<span style="color: #2b91af;">Exception</span> <span style="color: #040004;">ex</span>)</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">      {</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">      }</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">   }</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';"> </span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">   <span style="color: gray;">// Method for populating the drop-down</span></span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">   </span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: blue;">private</span><span style="font-size: 10.0pt; font-family: 'Courier New';"> <span style="color: blue;">void</span> <span style="color: #040004;">SetListItems</span>(<span style="color: blue;">object</span> <span style="color: #040004;">obj</span>)</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">   {</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">      <span style="color: blue;">try</span></span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">      {</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">         </span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: gray;">//</span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: gray;">populate the drop-down </span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: gray;">cbSomeList</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">         <span style="color: blue;">string</span>[] <span style="color: #040004;">listItems</span> = (<span style="color: blue;">string</span>[])<span style="color: #040004;">obj</span>;</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">         <span style="color: blue;">if</span> (<span style="color: #040004;">listItems</span>!= <span style="color: blue;">null</span> &amp;&amp; <span style="color: #040004;">listItems</span>.<span style="color: #040004;">Length</span> &gt; 0)</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">         {</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">            <span style="color: #040004;">cbSomeList</span>.<span style="color: #040004;">ItemsSource</span> = <span style="color: #040004;">listItems</span>;</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">         }</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">      }</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">      <span style="color: blue;">catch</span> (<span style="color: #040004;">System</span>.<span style="color: #2b91af;">Exception</span> <span style="color: #040004;">ex</span>)</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">      {</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">      }</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">   }</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';"> </span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">   <span style="color: gray;">// Method receives a list </span></span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: gray;">from </span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: gray;">native</span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: gray;">.</span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: gray;">dll</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">   </span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: blue;">public</span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: blue;">string</span><span style="font-size: 10.0pt; font-family: 'Courier New';">[] </span><span style="font-size: 10.0pt; font-family: 'Courier New'; color: #040004;">GetSomeList</span><span style="font-size: 10.0pt; font-family: 'Courier New';">()</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">   </span><span style="font-size: 10.0pt; font-family: 'Courier New';">{</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">      <span style="color: blue;">try</span></span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">      {</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">         <span style="color: blue;">byte</span> <span style="color: #040004;">nErrorCode</span> = 0;</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">         <span style="color: #2b91af;">List</span>&lt;<span style="color: blue;">string</span>&gt; <span style="color: #040004;">list</span> = <span style="color: blue;">new</span> <span style="color: #2b91af;">List</span>&lt;<span style="color: blue;">string</span>&gt;(10);</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">         <span style="color: blue;">for</span> (<span style="color: blue;">int</span> <span style="color: #040004;">i</span> = 1; <span style="color: #040004;">i</span> &lt; 10; <span style="color: #040004;">i</span>++)</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">         {</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">            <span style="color: #2b91af;">StringBuilder</span> <span style="color: #040004;">sbName</span> = <span style="color: blue;">new</span> <span style="color: #2b91af;">StringBuilder</span>(100);</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">            <span style="color: #040004;">nErrorCode</span> = <span style="color: #040004;">getSomeList(i</span>, <span style="color: #040004;">sbName</span>);</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">            <span style="color: blue;">if</span> (<span style="color: #040004;">nErrorCode</span> == <span style="color: #040004;">0</span>)</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">            {</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">               <span style="color: blue;">string</span> <span style="color: #040004;">tmp_</span> = <span style="color: #040004;">sbName</span>.<span style="color: #040004;">ToString</span>();</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">               <span style="color: blue;">if</span> (!<span style="color: blue;">string</span>.<span style="color: #040004;">IsNullOrEmpty</span>(<span style="color: #040004;">tmp_</span>))</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">               {</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">                  <span style="color: #040004;">list</span>.<span style="color: #040004;">Add</span>(<span style="color: #040004;">tmp_</span>);</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">               }</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">            }</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">            <span style="color: blue;">else throw;</span></span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">         }</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">         <span style="color: blue;">return</span> <span style="color: #040004;">list</span>.<span style="color: #040004;">ToArray</span>();</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">      }</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">      <span style="color: blue;">catch</span> (<span style="color: #2b91af;">Exception</span> <span style="color: #040004;">e</span>)</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">      {</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">      }</span></p>
<p><span style="font-size: 10.0pt; font-family: 'Courier New';">   }</span></p>
]]></content:encoded>
			<wfw:commentRss>http://techwire-ua.com/2010/03/accessing-unmanaged-code-separate-context-wpf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://techwire-ua.com/2010/03/accessing-unmanaged-code-separate-context-wpf/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=accessing-unmanaged-code-separate-context-wpf</feedburner:origLink></item>
		<item>
		<title>COM+ average call duration</title>
		<link>http://feedproxy.google.com/~r/techwire_dp_ua/~3/yznie6nTGv0/</link>
		<comments>http://techwire-ua.com/2010/02/com-plus-average-call-duration/#comments</comments>
		<pubDate>Thu, 18 Feb 2010 11:12:59 +0000</pubDate>
		<dc:creator>adminwp</dc:creator>
				<category><![CDATA[Process]]></category>
		<category><![CDATA[average call duration]]></category>
		<category><![CDATA[COM+]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[terminate]]></category>
		<category><![CDATA[windows server 2003 sp2]]></category>

		<guid isPermaLink="false">http://techwire-ua.com/?p=104</guid>
		<description><![CDATA[Serving on support duty, we received an issue report from our customer: some of the processes in I-Plan are silently failing — even though everything worked fine before. The first question any developer would ask in such case: what did &#8230; <a href="http://techwire-ua.com/2010/02/com-plus-average-call-duration/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Serving on support duty, we received an issue report from our customer: some of the processes in <a title="I-Plan, collaborative supply chain management" href="http://www.techwire.dp.ua/experience/4-portfolio/13-i-plan">I-Plan</a> are silently failing — even though everything worked fine before. The first question any developer would ask in such case: what did you change? Turns out, they have installed SP2 on their Windows Server 2003, and this was the exact reason for this issue to appear. Read on to find out what causes it and how it can be solved.</p>
<p><span id="more-104"></span></p>
<h3>The ever-changing Microsoft</h3>
<p>On some reading, we find that <a title="Microsoft!" href="http://www.microsoft.com/">Microsoft</a> have changed the game rules in Service Pack 2 for <a title="Microsoft Windows Server 2003" href="http://technet.microsoft.com/en-us/windowsserver/bb512919.aspx">Windows Server 2003</a>. The functionality that supports automatic collection of process&#8217; dump files for COM+ was changed, and, as it turned out, there was also a change in the logic that completes processes exceeding a certain period of run time, as described in Knowledge Base article 910904: <a title="Knowledge Base 910904" href="http://support.microsoft.com/kb/910904">A change in the functionality of COM+ in Windows Server 2003 to support automatic collection of a process dump file and process termination</a>.</p>
<p>All would be good if it led to gathering data and raised a corresponding warning, yet, unfortunately, a process that runs for an &#8220;unusually high time&#8221; is terminated, while the event type is a mere &#8220;Warning&#8221;:</p>
<blockquote><p>Event Type: <strong>Warning</strong></p>
<p>Event Source: <strong>COM+</strong></p>
<p>Event Category: <strong>(117)</strong></p>
<p>Event ID: <strong>1001</strong></p>
<p>Date: dd.mm.yyyy</p>
<p>Time: HH:MM:SS</p>
<p>User: N/A</p>
<p>Computer:</p>
<p>Description: <strong>The average call duration has exceeded 10 minutes. If this is not the expected behavior, please see article 910904 in the Microsoft Knowledge Base at http://support.microsoft.com for details on how to use the COM+ AutoDump feature to automatically generate dump files and/or terminate the process if the problem occurs again.</strong></p>
<p>Server Application ID: {&#8230;&#8230;&#8230;..}</p>
<p>Server Application Instance ID: {&#8230;&#8230;&#8230;..}</p>
<p>Server Application Name: <strong>I-Plan</strong></p></blockquote>
<p>Of course, we know which processes in our application take longer than 10 minutes, and we know what causes it, so we didn&#8217;t need such a &#8220;gift&#8221; from Microsoft.</p>
<h3>Solution</h3>
<p>The problem can be solved in one of the two following ways, depending on the requirements of your application and server:</p>
<h4>1. Global change to COM+ behavior</h4>
<p>Make the following changes in your system registry (please be careful when modifying the registry, it is not a joke that one can easily break Windows by mis-doing something here):</p>
<p>In the registry path: HKEY_LOCAL_MACHINESOFTWAREMicrosoftCOM3AutoDump (if AutoDump does not exists — please create that branch), add the following keys and their corresponding values (type DWORD):</p>
<ul>
<li><strong>AverageCallThreshold</strong>, set to 3000, — this is maximum allowed duration of process execution, in seconds. If it is exceeded, a warning is raised.</li>
<li><strong>Terminate</strong>, set to 0, — this flag defines behavior on exceeding maximum execution time, 0 means that the process will continue, 1 means that the process will be terminated.</li>
<li><strong>DumpType</strong>, set to 2, — this flag defines the dump creation behavior, 0 means that a full dump file will be generated, 1 that a minidump file will be generated, 2 defines that no dump file is to be generated.</li>
</ul>
<h4>2. Change behavior of a specific COM+ application</h4>
<p>In order to change the behavior of a specific COM+ application, instead of making a global server-wide change, create the above keys and values in the following registry path: HKEY_CLASSES_ROOTAppId{&lt;<strong>YourAppID</strong>&gt;}AutoDump{&lt;<strong>YourCLSID</strong>&gt;}.</p>
<p>It is preferable not to set the <strong>AverageCallThreshold</strong> to be too high, and simply allow the process to continue. At least this way you will be able to collect enough statistics about potential problem spots, and when they appear — to, possibly, try to solve high execution times if they are not needed for your application&#8217;s business logic.</p>
<hr />
<p>PS If it is so easy for Microsoft to change the logic in their server OSes, wouldn&#8217;t it be even easier to stop &#8220;supporting&#8221; the old bugs from Internet Explorer 6 in the more recent IE versions? Just asking.</p>
]]></content:encoded>
			<wfw:commentRss>http://techwire-ua.com/2010/02/com-plus-average-call-duration/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://techwire-ua.com/2010/02/com-plus-average-call-duration/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=com-plus-average-call-duration</feedburner:origLink></item>
		<item>
		<title>ActiveX publisher name not available</title>
		<link>http://feedproxy.google.com/~r/techwire_dp_ua/~3/5l-9_11GynA/</link>
		<comments>http://techwire-ua.com/2010/02/activex-publisher-not-available/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 08:09:30 +0000</pubDate>
		<dc:creator>adminwp</dc:creator>
				<category><![CDATA[Process]]></category>
		<category><![CDATA[activex]]></category>
		<category><![CDATA[certificate]]></category>
		<category><![CDATA[control]]></category>
		<category><![CDATA[dll]]></category>
		<category><![CDATA[ocx]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[publisher name]]></category>
		<category><![CDATA[resources]]></category>
		<category><![CDATA[signing]]></category>

		<guid isPermaLink="false">http://techwire-ua.com/?p=103</guid>
		<description><![CDATA[Testing the installation of our ActiveX controls (used in I-Plan for rich-functionality — grid, graph and date/week/month picker), we noticed that in IE8 the controls display string &#8220;Control name is not available&#8221; instead of the publisher name. How does one &#8230; <a href="http://techwire-ua.com/2010/02/activex-publisher-not-available/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Testing the installation of our ActiveX controls (used in <a title="I-Plan - supply chain management" href="http://www.techwire.dp.ua/experience/4-portfolio/13-i-plan">I-Plan</a> for rich-functionality — grid, graph and date/week/month picker), we noticed that in IE8 the controls display string &#8220;Control name is not available&#8221; instead of the publisher name. How does one solve such a problem?</p>
<p><span id="more-103"></span></p>
<h3>Background</h3>
<p>This came as a surprise, since our customer, <a href="http://www.techwire.dp.ua/partners/9-cooperation/14-trading-science-ltd">Trading Science Ltd</a>, is using security certificates (Microsoft Authenticode content signing <a title="Microsoft Authenticode code signing certificates" href="http://www.thawte.com/code-signing/content-signing-certificates/microsoft-authenticode/index.html">certificates from Thawte</a>) to ensure the validity of the ActiveX controls. What should happen is when the user installs the control for the first time, it is shown as signed (one less thing to worry about for the user), and a question is asked if they would like to trust that publisher to silently install controls in the future.</p>
<p>The ActiveX signing step is part of our automatic build process, so that every control version that we release is signed, without any reliance on manual actions. And that worked great, yet recent tests and closer inspection revealed that the publisher name, as stated above, is no longer available.</p>
<h3>Symptoms</h3>
<p>This is visible especially well in the Add-on manager of <a title="Microsoft Internet Explorer 8" href="http://www.microsoft.com/Windows/internet-explorer/">Internet Explorer 8</a>, instead of a correct publisher name one can see message &#8220;Control name is not available&#8221;:</p>
<p><img src="http://techwire-ua.com/wp-content/themes/t/images/stories/activex_name_not_available.png" alt="ActiveX control - Publisher name is not available" align="center" /></p>
<h3>Project resources description</h3>
<p>The description of the issue, as it seems to happen so often, is far from being actually descriptive. Yet the solution turned out to be simple — after some search, research and experiments, we noticed that the resource description file (it has the .RC extension) of the ActiveX control project has empty properties. In particular, the property &#8220;CompanyName&#8221; was not populated:</p>
<p><img src="http://techwire-ua.com/wp-content/themes/t/images/stories/activex_resource_empty.png" alt="ActiveX project - CompanyName property is empty" align="center" /></p>
<p>Put the publisher name into that field:</p>
<p><img src="http://techwire-ua.com/wp-content/themes/t/images/stories/activex_resource_populated.png" alt="ActiveX project - CompanyName property is filled with publisher name" align="center" /></p>
<p>And the result is…</p>
<h3>Publisher displayed, but &#8220;not verified&#8221;</h3>
<p>This is better — in the IE8 add-on manager we can now see the publisher name displayed correctly. Almost:</p>
<p><img src="http://techwire-ua.com/wp-content/themes/t/images/stories/activex_publisher_not_verified.png" alt="ActiveX project - Publisher name shown, but not verified" align="center" /></p>
<p>What do we do with the unpleasant &#8220;Not verified&#8221; label in front of our publisher name?</p>
<h3>Full solution</h3>
<p>Again, the problem description is not clear — there is no need to actually &#8220;verify&#8221; the publisher name, everything is already verified and signed by an authoritative provider. What needs to be done is to make sure that not only the .cab file (cabinet containing the control) needs to be signed with the certificate, yet also the controls that it contains — all the .DLL and .OCX files. We used the same certificate that we already had to sign everything, and received the long awaited result:</p>
<p><img src="http://techwire-ua.com/wp-content/themes/t/images/stories/activex_publisher_verified.png" alt="ActiveX project - Publisher name shown and verified" align="center" /></p>
<p>Please let us know if you have any additional questions of comments.</p>
]]></content:encoded>
			<wfw:commentRss>http://techwire-ua.com/2010/02/activex-publisher-not-available/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://techwire-ua.com/2010/02/activex-publisher-not-available/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=activex-publisher-not-available</feedburner:origLink></item>
		<item>
		<title>Issue connecting to Oracle 9 from a .Net application</title>
		<link>http://feedproxy.google.com/~r/techwire_dp_ua/~3/QkkQevUOMBk/</link>
		<comments>http://techwire-ua.com/2010/02/issue-connecting-to-oracle-9-from-dot-net/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 12:21:35 +0000</pubDate>
		<dc:creator>adminwp</dc:creator>
				<category><![CDATA[Process]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[atp]]></category>
		<category><![CDATA[connection]]></category>
		<category><![CDATA[ctp]]></category>
		<category><![CDATA[ddq]]></category>
		<category><![CDATA[i-plan]]></category>
		<category><![CDATA[issue]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[problem]]></category>
		<category><![CDATA[version]]></category>

		<guid isPermaLink="false">http://techwire-ua.com/?p=102</guid>
		<description><![CDATA[What do you do when, connecting to Oracle 9 using standard DB client from .Net, an error message informs you that at least Oracle version 8.1.7 or higher is needed? We did encounter such a problem while working on a &#8230; <a href="http://techwire-ua.com/2010/02/issue-connecting-to-oracle-9-from-dot-net/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img style="margin: 0 10px 5px 0;" src="http://techwire-ua.com/wp-content/themes/t/images/stories/oracle_vs_dotnet.jpg" alt="Connecting to Oracle from .Net" align="left" />What do you do when, connecting to Oracle 9 using standard DB client from .Net, an error message informs you that at least Oracle version 8.1.7 or higher is needed? We did encounter such a problem while working on a project. Thankfully, after some searching and asking, a solution could be found — read on if you are looking for an answer too.</p>
<p><span id="more-102"></span></p>
<p>We saw this issue while creating a standalone ATP/CTP* Client (you can read more about this product on the site of our partner, <a href="http://techwire-ua.com/partners/8-representation/16-techwireuk">techwire UK</a>, in the feature titled <a href="http://www.techwireuk.co.uk/index.php?option=com_content&amp;view=article&amp;id=61&amp;Itemid=68">&#8220;Web-based Ordering&#8221;</a>) for <a href="http://techwire-ua.com/experience/4-portfolio/13-i-plan">I-Plan</a>, a supply-chain management application. This client (and the corresponding server-side enhancement) is an application that allows to demonstrates the ATP/CTP logic, usually &#8220;hidden&#8221; within the main I-Plan core, and also it provides possibility for external systems to send ATP/CTP requests to I-Plan using a web-service API.</p>
<h3>Oracle 9 Connection Issue</h3>
<p>The problem occured when connecting to <a href="http://www.oracle.com/">Oracle</a> database server version 9, using standard DB client from Microsoft in <a href="http://www.microsoft.com/NET/">.Net Framework</a>, <a href="http://msdn.microsoft.com/en-us/library/system.data.oracleclient.aspx">System.Data.OracleClient</a>, the following error would return:</p>
<blockquote><p><strong>System.Data.OracleClient requires Oracle client software version 8.1.7 or greater</strong></p></blockquote>
<p>So, it would seem that at least Oracle version of 8.1.7 was needed, or greater — while we were using 9! Additional difficulty in investigating and solving the problem was that it didn&#8217;t occur on all the servers that we tried it on. So it took us some time to find a solution, therefore we hope it may be useful to you someday.</p>
<h3>Solution</h3>
<p>To solve it, we had to perform the steps below on every server where the issue occurs — so there is no generic programmatic solution to this, unfortunately. It is required to give the authenticated user a privilege to the Oracle Home in Oracle 9.2 Client software, as follows:</p>
<ol>
<li>Log on to Windows as a user with Administrator privileges.</li>
<li>Launch Windows Explorer from the Start Menu and and navigate to the ORACLE_HOME folder. This is typically the &#8220;Ora92&#8243; folder under the &#8220;Oracle&#8221; folder (i.e. D:OracleOra92).</li>
<li>Right-click on the ORACLE_HOME folder and choose the &#8220;Properties&#8221; option from the drop down list. A &#8220;Properties&#8221; window should appear.</li>
<li>Click on the &#8220;Security&#8221; tab of the &#8220;Properties&#8221; window.</li>
<li>Click on &#8220;Authenticated Users&#8221; item in the &#8220;Name&#8221; list (on Windows XP the &#8220;Name&#8221; list is called &#8220;Group or user names&#8221;).</li>
<li>Uncheck the &#8220;Read and Execute&#8221; box in the &#8220;Permissions&#8221; list under the &#8220;Allow&#8221; column (on Windows XP the &#8220;Permissions&#8221; list is called &#8220;Permissions for Authenticated Users&#8221;).</li>
<li>Re-check the &#8220;Read and Execute&#8221; box under the &#8220;Allow&#8221; column (this is the box you just unchecked).</li>
<li>Click the &#8220;Advanced&#8221; button and in the &#8220;Permission Entries&#8221; list make sure you see the &#8220;Authenticated Users&#8221; listed there with:<br />
<blockquote><p>Permission = Read &amp; Execute<br />
Apply To = This folder, subfolders and files</p></blockquote>
<p>If this is NOT the case, edit that line and make sure the &#8220;Apply onto&#8221; drop-down box is set to &#8220;This folder, subfolders and files&#8221;. This should already be set properly but it is important that you verify this.</li>
<li>Click the &#8220;OK&#8221; button until you close out all of the security properties windows. The cursor may present the hour glass for a few seconds as it applies the permissions you just changed to all subfolders and files.</li>
<li>Reboot your computer to assure that these changes have taken effect.</li>
</ol>
<p>And then it works!</p>
<p>As you can see the solution is far from obvious, especially if one looks at the original error message. Thankfully, there is a helpful development community around Oracle and .Net, so we found the above on one of the forums. Please feel free to post your feedback or questions in the comment form below.</p>
<hr />
<p><small>* — ATP/CTP stands for &#8220;Available To Promise&#8221; and &#8220;Capacity To Promise&#8221;, two modes for ordering items, the former checking whether the item is available in inventory (across several warehouses, in our case), the latter checking if there is available production capacity to manufacture the required quantity of the material in time.</small></p>
]]></content:encoded>
			<wfw:commentRss>http://techwire-ua.com/2010/02/issue-connecting-to-oracle-9-from-dot-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://techwire-ua.com/2010/02/issue-connecting-to-oracle-9-from-dot-net/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=issue-connecting-to-oracle-9-from-dot-net</feedburner:origLink></item>
	</channel>
</rss>

