tag:blogger.com,1999:blog-58190611315140178112024-02-19T03:34:06.485+01:00Shrpr BlogBlog about .NET, Services and other technical stuffAnonymoushttp://www.blogger.com/profile/02783736154832837692noreply@blogger.comBlogger19125tag:blogger.com,1999:blog-5819061131514017811.post-88693160842433628122011-12-09T15:37:00.001+01:002011-12-09T15:37:15.582+01:00Shrpr Web Resource Editor 0.3 released<p>I have uploaded Version 0.3 of the Web Resource Editor, a code editor inside Dynamics Crm, to <a href="https://github.com/ggmueller/Shrpr.WebResourceEditor/downloads" target="_blank">WRE Downloads</a> some minutes ago.</p> <p>This version brings two new features</p> <h5>Help</h5> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZ7wxsdrIOM_vflgujDRMbV47g00XzjMuYH97mezyYf9cSJgVbf6XaLKrpnlUG9-jhwGyKlEngtuMwp4LGVcJRDXsxkGzeYXYXKFjTVJDPt1ZaXGjzaL9dr8PDSdZm7MNOhRNkQhgwb5cj/s1600-h/image%25255B3%25255D.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" align="left" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2V02mJzdYt4aCe22xl_dzMndX6-erMOz0oxMvEOzlDTEl9iBEuduu_3dZ2gjcBF7Xlj-mYcRBnC3IunBsv9Vpm18qS0khOjTUcoJpi4Bq3XsU41gkRghvOkU5Z6A0KQtH1ebEomBst0GZ/?imgmax=800" width="181" height="139"></a></p> <p>A Help dialog is now included in the Editor. It describes all the supported commands the editor can do at the moment.</p> <h5>Shortcuts</h5> <p>This release also includes a number of shortcuts to make you more productive.</p> <p>Take a detailed look at the shortcuts, there are a lot of commands that are supported, which are <em>Keyboard only</em> at the moment.</p> <p>You can find all the shortcuts in the help.</p> <h5>Additional Work</h5> <p>Additionally the way the editor identifies the type of resource was improved. It now uses the resource type of <a href="http://crm.dynamics.com" target="_blank">Dynamics Crm</a> to select its highlighting mode.</p> <p>Also I fixed a regression, where the title of the editor was not the resources name.</p> <p>So if you are interested download the new release.</p> <p>If you have suggestions post it here or to <a href="https://github.com/ggmueller/Shrpr.WebResourceEditor/issues" target="_blank">WRE Issues</a>.</p> Anonymoushttp://www.blogger.com/profile/02783736154832837692noreply@blogger.com0tag:blogger.com,1999:blog-5819061131514017811.post-69247040018985119322011-11-20T19:54:00.001+01:002011-11-20T19:54:51.483+01:00New Release of Shrpr Web Resource Editor<p>There seems to be quite some interest in this project and so some bugs surfaced that I have fixed now.</p> <p>Those fixes also come with a new feature</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvWSVAvc_ySxELX3xDWWJgKfyg_AKRjYp6H3nLXm-__YgsHowJw2-4ZdoaQe18cZy-FNDH99jl5TiSYumi4wA4TtYg8yVjqQDv61P305AN-UdQsEVRauvIaqopI6dr1e1lCpukWMjBWUM2/s1600-h/image%25255B2%25255D.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" align="left" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggf11SUNKaHJ4np8tq7u_k4g6J24zSH430rQR3Jb46wO0ElVopSJO9xROuxP9KNn2_8jq-N5pkdIk77MzegF0M70-BkwpERj3Rgb4jWwV8h86p5C2YM1ZUeIjHPFzN8NpQPBz6x2Og2CWt/?imgmax=800" width="244" height="84"></a></p> <p> Annotations show up, eg if you have a TODO in a comment in the file you are editing. <br>Hovering over the annotation on the left sidebar, shows the TODO.<br>Clicking on it brings you right to the annotation.</p> <h5>Fixes included:</h5> <ul> <li>Some users had the problem, that clicking the <em>Edit in WRE </em>button did load a wrong URL. This should be fixed now.</li> <li>An error was thrown when moving the mouse over the sidebar.</li> <li>The WebResourceEditor loaded only the published state of the Webresource. It is more useful to load the unpublished state. This is fixed now.</li></ul> <p>Thanks to all who reported the bugs. Surely there are still rough edges on the editor. I plan to fix them in future releases.</p> <p>If you have already installed the managed solution, I suggest you update to the new version using the Overwrite option, when importing the solution.</p> <p align="left">You can find the download on <a href="https://github.com/ggmueller/Shrpr.WebResourceEditor/downloads" target="_blank">GitHub</a></p> Anonymoushttp://www.blogger.com/profile/02783736154832837692noreply@blogger.com5tag:blogger.com,1999:blog-5819061131514017811.post-44484042858392737062011-11-16T22:24:00.001+01:002011-11-16T22:42:51.883+01:00Shrpr Web Resource Editor: First ReleaseIn the last few days I have been quite busy creating a new project.<br />
Initially I started this as a personal project, to learn a bit more about JavaScript. But the outcomes are quite useful and so I open it as a project on GitHub.<br />
<br />
<b>So what is it?</b><br />
<b><br /></b><br />
It is a better way to edit Webresources, more specific Javascript, Html and Css, directly within Dynamics Crm in a better way.<br />
It will not replace Visual Studio, but I think it is a nice way to do small bugfixes, changes online.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjY40th3GzwWI34jeEa0g_SZ_-cFOH71Ln19baJtwOflffkVUYKcuJwBUAZahvC4mlNXMVIUpdbmc2AYr3QZ6-hY9e2xSk2HTc3TyLTZyIrIhy_2TvvHw8OwWiV-C-6Hdwcisjvlh5szfp1/s1600/WebResourceEditor.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="196" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjY40th3GzwWI34jeEa0g_SZ_-cFOH71Ln19baJtwOflffkVUYKcuJwBUAZahvC4mlNXMVIUpdbmc2AYr3QZ6-hY9e2xSk2HTc3TyLTZyIrIhy_2TvvHw8OwWiV-C-6Hdwcisjvlh5szfp1/s320/WebResourceEditor.png" width="320" /></a></div>
<br />
<br />
<b>What can it do?</b><br />
<br />
<ul>
<li>It provides Syntax Highlighting for JavaScript, Html and Css</li>
<li>It shows Row Numbers for the file</li>
<li>It highlights matching braces</li>
<li>It has a very simple code completion</li>
</ul>
You find screenshots of the features at the end of this post.<br />
<br />
<div>
<b>How does it work?</b></div>
<div>
I have used only Html, Javascript and Css to create this functionality. </div>
<div>
It combines several components, most notably the Editor component of the <a href="http://eclipse.org/orion/" target="_blank">Eclipse Orion</a> project. This editor is also the soon to be editor within <a href="http://www.mozilla.org/en/firefox/new/" target="_blank">Mozilla Firefox</a>.</div>
<div>
So no need for Silverlight or Flash here.</div>
<div>
<br /></div>
<div>
You can find all informations about download, the project site and so on on this blog under <a href="http://www.shrpr.org/p/shrpr-web-resource-editor.html" target="">Shrpr Web Resource Editor</a>.</div>
<div>
<br /></div>
<div>
I have tested the editor OnPremise and Online,</div>
<div>
but please be aware that this release is an early release, so use it with caution.</div>
<div>
<br /></div>
<div>
If you have any ideas please do not hesitate to contact me.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_mFxVMPNRHhR26NgdqLhOkdDQfWiXW28Dc_MtUfgenZDGBGxgYAdARTbgLQbIJImCsHBlCtUQG0NXvk5ePe_VWFCOfQzqKRsc9qfy9Ep2N7W_ZoUhirR0xdbxrONCEBzzAi78mOaDTsjQ/s1600/EditInWre.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="217" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_mFxVMPNRHhR26NgdqLhOkdDQfWiXW28Dc_MtUfgenZDGBGxgYAdARTbgLQbIJImCsHBlCtUQG0NXvk5ePe_VWFCOfQzqKRsc9qfy9Ep2N7W_ZoUhirR0xdbxrONCEBzzAi78mOaDTsjQ/s320/EditInWre.png" width="320" /></a></div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLMZg2HbL0rWKEF6szuBO98thCYVnXTgCAb3rie4uaP9IhLhjprT3_houtN05UVPoGtWeFON9VEjTGvaM_E1ByCEpam6R6rJ9HNwhzLc79HIrKDMXOMJc5J-yJgGkSBqbFioYeua-Z56dp/s1600/CodeCompletion.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="204" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLMZg2HbL0rWKEF6szuBO98thCYVnXTgCAb3rie4uaP9IhLhjprT3_houtN05UVPoGtWeFON9VEjTGvaM_E1ByCEpam6R6rJ9HNwhzLc79HIrKDMXOMJc5J-yJgGkSBqbFioYeua-Z56dp/s320/CodeCompletion.png" width="320" /></a></div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-dIGWs1gLDtHdzhCpNAX2arcTijDxtmcbSZWpkB7YHfw7EgvHtyoyOndNtHLQpCV9lc6RIJ56hjr0WOc39m0Lecp8pGwWahoOr715jojtx9h9XwvmD953rQAs3nFCp2l7y1NcU1LC7hOp/s1600/MatchBraces.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-dIGWs1gLDtHdzhCpNAX2arcTijDxtmcbSZWpkB7YHfw7EgvHtyoyOndNtHLQpCV9lc6RIJ56hjr0WOc39m0Lecp8pGwWahoOr715jojtx9h9XwvmD953rQAs3nFCp2l7y1NcU1LC7hOp/s1600/MatchBraces.png" /></a><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKnh4EAGBbqOmVpDmc2stCoYTeap6ClGTuOiuI42kHvhBbhNEr3jGqwkj_-XibZdv15NUpljgyQYR76jp-Om3aJAJ7sB8R9oXOBukUBnYhsUcpHP7vVSFCDTQmRVlF8its2D0GafUAaH0n/s1600/Position.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKnh4EAGBbqOmVpDmc2stCoYTeap6ClGTuOiuI42kHvhBbhNEr3jGqwkj_-XibZdv15NUpljgyQYR76jp-Om3aJAJ7sB8R9oXOBukUBnYhsUcpHP7vVSFCDTQmRVlF8its2D0GafUAaH0n/s1600/Position.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiJFP08nW3hto8v5ZjLEdLICwNQkdryVO8_qsvmTA51KUJGNbwtuFLBavS1S1_ozOOaG35xP1UahSkH9nKQXFbhaHwa1OlXGgKOpQmlCRFaUpYoxrI9fWMFmHa7_SICYmTPQ1ULWq1EVvh/s1600/LineNumbers.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="114" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiJFP08nW3hto8v5ZjLEdLICwNQkdryVO8_qsvmTA51KUJGNbwtuFLBavS1S1_ozOOaG35xP1UahSkH9nKQXFbhaHwa1OlXGgKOpQmlCRFaUpYoxrI9fWMFmHa7_SICYmTPQ1ULWq1EVvh/s320/LineNumbers.png" width="320" /></a></div>
<div>
<br /></div>
<div>
<br /></div>Anonymoushttp://www.blogger.com/profile/02783736154832837692noreply@blogger.com4tag:blogger.com,1999:blog-5819061131514017811.post-54706777425674903062011-10-26T17:24:00.001+02:002011-10-26T17:24:51.058+02:00Dynamics CRM: Activity Feeds<p>Yesterday saw a new <a href="http://crm.dynamics.com" target="_blank">Dynamics CRM</a> premiere. With Update Rollup 5 for CRM 2011 Microsoft not only released a couple of bug fixes, but also a couple of new features.</p> <p>Those features include:</p> <ul> <li>Enhancements to Charts</li> <li>New capabilities for Dialogs and Workflows</li> <li>Better duplicate detection, when handling null values</li> <li>Enhancements to the Outlook Clients Reading Pane</li> <li>Better performance when Tracking Emails</li></ul> <p>While these are enhancements are welcome probably the most user-visible new feature are the Activity Feeds.</p> <p>Activity Feeds is a collaboration tool for Microsoft CRM. Like <a href="http://www.twitter.com" target="_blank">Twitter</a> or <a href="https://www.yammer.com/" target="_blank">Yammer</a> this tool falls in to the category of micro blogging tools.</p> <p>Lets take a look at this new feature and then go into a little more detail.</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgl1cM27yRpgpc_dNEPR_kjB18Bbb-IdbZmyqafIXIRbQvuniJNXSzAE63q_7-l0XesNQM28NQ1LqgKJ2pPkcDp4bycMuVYYPphFyzfmJ0EPhbvaX9Jllf45X4O4dPBKFZTs95e1uhXioK5/s1600-h/image%25255B4%25255D.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNAmnVO4jT3pQK7BJTRAH-rKX0-keN00XwdTDmmzsoTDn1k0XCsuEc7ePZptQPqkiE8oIyHOW3xgWf_MWObLit7Nzf_9kQuHVbJ1L3UyzRyFttW7AcqqJRpuvyeHFvrT5jWY_gU1lSn2qJ/?imgmax=800" width="551" height="293"></a></p> <p>Here we see, that users enter short bits of information. The feeds allow to comment each entry and display the conversation in a threaded manner.<br>In a company conversion this sure is an enhancements to Twitters version of showing each entry on a timeline without context.</p> <p>Context is also one of the best things about having such a feature integrated into your CRM when comparing it to other enterprise Microblogs like Yammer. Using the symbol @ in your post gives you a dialog to link your activity to a record, like an account or an opportunity. This way you have an easy way to talk about something in your posts.</p> <p>A Microblog also allows you to follow people, if you are using Twitter you know that you can go to another persons profile and click Follow there. These posts then get posted into you Twitter Stream. With Activity Feeds you have your wall, where all post of the CRM users you follow get posted. But you cannot only follow users, but also other entities within the CRM, like an account or opportunity. When following these you also get information updates from these followed entities posted to your wall. You will no more miss an important update someone has done to your opportunity.</p> <p>You can see that this can provide a nice way for collaboration within a company. You are able to get feedback for an opportunity, request help for an incident, or just provide some information you feel that is important to others within the company.</p> <p>When introducing these kind of features to the company you should be aware some things.</p> <ul> <li>There should be a sponsor for this feature and he should be a Power User of the Activity Feeds an provide some real helpful insights</li> <li>Company management should be using this as a platform to provide new information to the employees</li> <li>This should be an open discussion platform, no limits on open speech, you should welcome criticism</li> <li>Have the Activity Feeds always available to the employees</li></ul> <p>For my last suggestion there are two things you can do right now:</p> <ul> <li>If you are one of the few who have a Windows Phone 7 phone, you can download the Dynamics CRM <a href="http://www.windowsphone.com/en-US/apps/632921fd-ab99-4392-822f-f0ddbdbc856e" target="_blank">App</a></li> <li>In Outlook set the What’s New page, or whatever Activity Feeds are called in your Organization as the Start View.<br>Therefor go to Outlooks <em>File > Options > Advanced > Outlooks start and exit</em> and set <em>Start Outlook in this folder</em> to What’s New</li></ul> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCJQdtGzFNjbxBOpMGkpnkpp3yoQ8ZWbXGdy59fiXxstLp4kkPSTtbByU8i35CnaKdLuetic-PvMWFE6fzOffacHTj2wm8gvW5di8FdaDIl95nIE6i1SF-SYtiygEaIfrUf2oEVQhIdTGt/s1600-h/image%25255B9%25255D.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiB8jKO0Gc7Lc6by3p-BdehqOKTxqs1DbKdTryZNAH43XKymw6854XykoVfSeJ3SoKM5XBxx_WPRcNczzLsTOkzPjI7C_LUI8VMYdtCmzVCs1F8SX9gtR4SKgxvGMZj4i1KXYVORM25LNYd/?imgmax=800" width="440" height="383"></a></p> <p>Now have fun with Activity Feeds.</p> Anonymoushttp://www.blogger.com/profile/02783736154832837692noreply@blogger.com0tag:blogger.com,1999:blog-5819061131514017811.post-54299615728889438262011-09-18T19:25:00.000+02:002011-11-12T21:16:36.478+01:00Automatically close incident in CRM 2011In CRM 2011 the Javascript API received a good piece of an overhaul, and so there is a lot more you can do using Javascript.<br />
<br />
One thing that's still a bit nasty is changing the state of the current forms entity using the API, and while you can still do that using a SOAP SetStateRequest, you will not get a good UI interaction.<br />
<br />
In my case, I had to automatically close an incident, which also has to result in the creation of an Incident Resolution Activity.<br />
<br />
The usual recommendation you get is to use the CloseIncidentRequest and use the SOAP Api accordingly, but I did feel, but the user would have to refresh the form manually in order to see that the action really was executed. So this was not the kind of experience I wanted our users to have, so I analyzed how Microsoft did this on the default Close Incident dialog and reused their implementation like this:<br />
<br />
<pre class="brush: javascript;">
// Close the incident.
// Xml has to be set to Hidden Input crActivityXml to create incidentresolution
// New statuscode has to be set to HiddenInput crNewStatus
var xml = "<incidentresolution>";
xml += "<timespent>0</timespent>";
xml += "<description></description>";
xml += "<subject>Anfrage abgeschlossen</subject>";
xml += "<incidentid>"+Xrm.Page.data.entity.getId()+"</incidentid>";
xml += "</incidentresolution>";
var oActivityXml=createHiddenInput("crActivityXml",xml),oStatusCode=createHiddenInput("crNewStatus",5); //StatusCode "Behoben"
if(!crmForm.SubmitCrmForm(FormEventId_Deactivate,true,true,false)){
deleteInput(oActivityXml);deleteInput(oStatusCode);
}
</pre>
<br />
Here I am creating the IncidentResolution activity, it is done in the Close Incident Dialog, but instead of asking the User for Input, it is automatically set.<br />
<br />
The IncidentResolution and the new state of this incident is set to hidden fields, and the Save operation of the Form is called.<br />
<br />
This would also allow you to do some REST calls to calculate the Sum of the time used or doing gathering some other data for the incident resolution.<br />
<br />
Be aware, that this solution uses unsupported API, so you might have to update your code in case of an change from Microsoft, but this gives you an excellent experience.Anonymoushttp://www.blogger.com/profile/02783736154832837692noreply@blogger.com2tag:blogger.com,1999:blog-5819061131514017811.post-26128578987095063132011-04-28T19:04:00.001+02:002011-04-28T19:04:31.448+02:00CRM 2011 Reporting Globalization: The missing link<p>Today one of our customers reported, that the Number Separators in CRM reports are the wrong ones. No matter what is configured in the users settings, the reports always use the En-Us formatting.</p> <p>Taking a look at the <font face="Courier New">fn_GetFormatStrings() </font>Sql function, we suspected that the CRM Reporting Extensions were not correctly setting the User Information and thus the function was using the format configuration from the System. Using SQL Profile we took a look at the executed SQL Queries, but they correctly set the appropriate UserId.</p> <p>Digging deeper into <font face="Courier New">fn_GetFormatStrings()</font> we saw, that no matter what, always “,” is returned for the NumberSeparator and “.” for DecimalSeparator. Thus suspecting that no matter what no report using this method of formatting would show the wrong separators.</p> <p>Executing a Vanilla report we were proofed wrong. Those report correctly showed a “,” as DecimalSeparator.</p> <p>Having eliminated the SQL queries as reason for this behavior I went for the report itself.</p> <p>The Money fields in the Sales Pipeline also use the <font face="Courier New">fn_GetFormatString()</font>, but is nevertheless showing the correct format.</p> <p>Looking through the report properties, I realized that Microsoft uses a lot of additional parameters in its report definitions:</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKAfbacVni_QsZiBWd7RcU14F8wbkc_IYwExl8E724ADTp4YIcI4mwGsKyGb-qwMlrr7W2sIpAJ5a4_afJ2Subxrpx5o0ig_8RrKjae8OyFyWC-77_kysxvMg1A6lIx7P3bn5lxOWdnXQf/s1600-h/image%5B2%5D.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqxjD0HYCDRMChEWio-Xfob2klX4UvUyLslw-PUzrUFenzOdGia18NnyqynBTjPwwOb-T8XLqdF4PBtAL6Stj-I_P4Lk8savwet0fF25txpqB5wzPr0lAHZpl86fnuOWgXCqeGDcujdr-R/?imgmax=800" width="162" height="244"></a></p> <p>At the beginning CRM_Currency_2 was suspicious, but it is used only in some chart formatting, in the sales pipeline.</p> <p>So I opened the Sales Pipeline report as code and then I noticed a difference between the Sales Pipeline Report and our custom report, the Sales Pipeline report defined this:</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjebGgANR7UwvtmsncRAu8QJlTWtrfGIL_Kls7tIs1kJNiJXw6CVbIpEynR4NVGC83iHhSFNI7ZGHuEmTBqE1baI50-tpt57pzxVpWIBY5C_HuacIE0IXMWJDmIVFzhCI9P8t-jBkUE3hAD/s1600-h/image%5B7%5D.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN8Eqz6SD_9Q_MVVTV2wxv9jtdy_2OWVu6-PtPUHgTB-OmL26khtpWntWcdByEjKfec1L-m9xOkQSydtKmjSDqthazTMLRQ9svrgkC9yzYnQj6XRaltszdFwDKMq9DnIgjWTi5U3xreCK1/?imgmax=800" width="524" height="60"></a></p> <p>Where the parameter is defined like this:</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmHjbPsZ9_a8aA477iNVFirE6yIm-fzPPCD_yXQ5uHZERCNvmqocy7jmspy96eU88NZW7JlEZ1V9xuxVflXrbjE_ikj4-slJ3VuBTE3RNvvc4I5pIKp43NzobK4-0BNHlcjtRWTG0y0nBJ/s1600-h/image%5B14%5D.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwWNU4XzpDBo4iT0H3nH0yTAH-28cWNT6j_HxLJqkhbYTFBts4V6TWT9Zns5oakxJW6fIWnlCJQyJ-1k49-uTcUP-1Gc7HxpYrjBpf0zXWyVkvbbLU2UTtXw6cCQuSLNOu6yBH93w8OIw4/?imgmax=800" width="370" height="228"></a></p> <p>So, it takes the NumberLanguageCode from the <font face="Courier New">fn_GetFormatStrings()</font> and uses it as language in the report.</p> <p>Putting this into our custom report finally resulted in the expected format.</p> <p>So keep in mind that only using <font face="Courier New">fn_GetFormatStrings()</font> is not enough to properly localize your custom reports.</p> <p>I have not been able to find this in the Sdk, hopefully Microsoft will document this soon.</p> Anonymoushttp://www.blogger.com/profile/02783736154832837692noreply@blogger.com1tag:blogger.com,1999:blog-5819061131514017811.post-89283748394635907542011-04-27T18:41:00.000+02:002011-04-27T18:41:36.757+02:00New Spring .NET releases<script src="http://storify.com/ggmueller/spring-net-releases.js"></script><noscript>[<a href="http://storify.com/ggmueller/spring-net-releases" target="blank">View the story "New Spring .NET releases" on Storify]</a></noscript>Anonymoushttp://www.blogger.com/profile/02783736154832837692noreply@blogger.com0tag:blogger.com,1999:blog-5819061131514017811.post-45832591623607418482011-04-19T17:36:00.001+02:002011-04-19T17:39:04.702+02:00Unit Testing with the Dynamics CRM ServiceContext<p>One of the nice things in Dynamics CRM 2011 and in a similar way in CRM4.0 with Sdk 13 is the ability to query CRM data using LINQ.</p> <p>The centerpiece for this feature is the ServiceContext. This allows you to do a query using LINQ.</p> <p>Now when it comes to unit testing the code the ServiceContext is a pain.</p> <p>What I wanted to do is to be able to define the data, the ServiceContext queries on, while not being connected to CRM.</p> <p>So, I needed a way to redirect the ServiceContext to a List.</p> <p>Searching through documentation I found the overridable </p><pre>protected IQueryable<TEntity> CreateQuery<TEntity>(IQueryProvider provider, string entityLogicalName)<br /></pre><br /><p>method. This is a factory method that than uses the query provider to query the data.</p><br /><p>Now I extend the ServiceContext class and override the CreateQuery method:</p><pre class="brush: csharp;">public class TestServiceContext : ServiceContext<br />{<br /> public ICollection<Entity> Data { get; private set; }<br /><br /> public TestServiceContext(IOrganizationService service, ICollection<Entity> data) : base(service)<br /> {<br /> Data = data;<br /> }<br /><br /> [SuppressMessage("Microsoft.Design", "CA1004", Justification = "Design cannot be changed, as method signature is provided by Xrm OrganizationServiceContext")]<br /> protected override IQueryable<TEntity> CreateQuery<TEntity>(IQueryProvider provider, string entityLogicalName)<br /> {<br /> return Data.OfType<TEntity>().Where(data => { var entityData = data as Entity;<br /> if (entityData != null)<br /> return entityData.LogicalName == entityLogicalName;<br /> else<br /> return false;}).AsQueryable();<br /> }<br />}<br /></pre><br /><p>Basically there can be two cases that have to be reckoned with:</p><br /><ul><br /><li>Queries created using ServiceContext.CreateQuery<Account>() <br /><li>Queries created using ServiceContext.CreateQuery(Account.LogicalName)</li></ul><br /><p>That’s why we reduce the returned data set to those OfType<TEntity> and then query it down to those entities having the specified logical name.</p><br /><p>Using this implementation of TestServiceContext now actually queries on the Data collection.</p><br /><p>Now you should have a Factory that creates your ServiceContext in your code, using a Mocking library you can then return the TestServiceContext when calling the factory.</p><br /><p>I will show a use case and a test in the next couple of days.</p> Anonymoushttp://www.blogger.com/profile/02783736154832837692noreply@blogger.com0tag:blogger.com,1999:blog-5819061131514017811.post-17487338458148919592011-02-03T21:07:00.001+01:002011-02-03T21:14:20.983+01:00Posting from the phone<div><p>So now there is a Blogger app in the Android market.  This surely opens a whole new world of possibilities for new Blog posts. Let's see if I use the new possibilities. </p>
</div>Anonymoushttp://www.blogger.com/profile/02783736154832837692noreply@blogger.com0tag:blogger.com,1999:blog-5819061131514017811.post-27789332192468263342011-01-25T12:46:00.001+01:002011-01-25T12:50:17.407+01:00CrmSvcUtil generates classes that are not compilable and workaround<p>CrmSvcUtil is a code generator that generates code for the <a href="http://msdn.microsoft.com/en-us/library/gg328210.aspx" target="_blank">Early-Bound classes</a> in Dynamics CRM 2011.</p> <p>Depending on the customizations in your system in can happen, that it generates two properties that have the same name. This is the case, when you have a relationship and an attribute in the customization that have the same name.</p> <p>While I consider it not to be a best practice to have the same name in the relationship and the attribute sometimes you just have to live with existing customizations.</p> <p>First thing to do was to file a bug with Microsoft. While they also consider that to be a problem in the current version of the CrmSvcUtil, they also said, that this will not be fixed in RTM.</p> <p>So, time for a workaround:</p> <p>The CrmSvcUtil allows replace or extend some parts of the code generation, giving you also a point to where you can fix this problem.</p> <p>Documentation for this is not very detailed in the Sdk so here is they way to do that.</p> <ul> <li>Create a C# class library project and add the CrmSvcUtil.exe as reference <li>Add a class that implements INamingService (this class can be found in the CrmSvcUtil reference <li>Add a constructor that takes an INamingService as parameter, the CrmSvcUtil than injects the DefaultNamingService, which allows you to extend that functionality <li>Delegate the implementation of the INamingService interface to the DefaultNamingService, only extend the implementation of GetNameForRelationship <li>Create a CrmSvcUtil.exe.config and configure your implementation as NamingService</li></ul> <p>I implemented my NamingService this way:</p> <p><pre class="brush: csharp;">using System;<br />using Microsoft.Crm.Services.Utility;<br />using Microsoft.Xrm.Sdk;<br />using Microsoft.Xrm.Sdk.Metadata;<br /><br />namespace Ksection.MsCrm.XrmTools.CrmSvcUtil<br />{<br /> public class NamingService : INamingService<br /> {<br /> private readonly INamingService _defaultNamingService;<br /><br /> public string GetNameForOptionSet(EntityMetadata entityMetadata, OptionSetMetadataBase optionSetMetadata, IServiceProvider services)<br /> {<br /> return _defaultNamingService.GetNameForOptionSet(entityMetadata, optionSetMetadata, services);<br /> }<br /><br /> public string GetNameForOption(OptionSetMetadataBase optionSetMetadata, OptionMetadata optionMetadata, IServiceProvider services)<br /> {<br /> return _defaultNamingService.GetNameForOption(optionSetMetadata, optionMetadata, services);<br /> }<br /><br /> public string GetNameForEntity(EntityMetadata entityMetadata, IServiceProvider services)<br /> {<br /> return _defaultNamingService.GetNameForEntity(entityMetadata, services);<br /> }<br /><br /> public string GetNameForAttribute(EntityMetadata entityMetadata, AttributeMetadata attributeMetadata, IServiceProvider services)<br /> {<br /> return _defaultNamingService.GetNameForAttribute(entityMetadata, attributeMetadata, services);<br /> }<br /><br /> public string GetNameForRelationship(EntityMetadata entityMetadata, RelationshipMetadataBase relationshipMetadata, EntityRole? reflexiveRole, IServiceProvider services)<br /> {<br /> return _defaultNamingService.GetNameForRelationship(entityMetadata, relationshipMetadata, reflexiveRole, services) + "Relationship";<br /> }<br /><br /> public string GetNameForServiceContext(IServiceProvider services)<br /> {<br /> return _defaultNamingService.GetNameForServiceContext(services);<br /> }<br /><br /> public string GetNameForEntitySet(EntityMetadata entityMetadata, IServiceProvider services)<br /> {<br /> return _defaultNamingService.GetNameForEntitySet(entityMetadata, services);<br /> }<br /><br /> public string GetNameForMessagePair(SdkMessagePair messagePair, IServiceProvider services)<br /> {<br /> return _defaultNamingService.GetNameForMessagePair(messagePair, services);<br /> }<br /><br /> public string GetNameForRequestField(SdkMessageRequest request, SdkMessageRequestField requestField, IServiceProvider services)<br /> {<br /> return _defaultNamingService.GetNameForRequestField(request, requestField, services);<br /> }<br /><br /> public string GetNameForResponseField(SdkMessageResponse response, SdkMessageResponseField responseField, IServiceProvider services)<br /> {<br /> return _defaultNamingService.GetNameForResponseField(response, responseField, services);<br /> }<br /><br /> public NamingService(INamingService defaultService)<br /> {<br /> _defaultNamingService = defaultService;<br /> }<br /><br /> <br /> }<br />}<br /><br /></pre><br /><p>Und die passende CrmSvcUtil.exe.config:</p><br /><p><pre class="brush: xml;"><?xml version="1.0" encoding="utf-8" ?><br /><configuration><br /> <appSettings><br /> <add key="namingservice" value="Ksection.MsCrm.XrmTools.CrmSvcUtil.NamingService, Ksection.MsCrm.XrmTools.CrmSvcUtil"/><br /> </appSettings><br /></configuration><br /></pre><br /><br /><p>This implementation just adds Relationship as postfix to each relationship, therefore avoiding the problem.</p> Anonymoushttp://www.blogger.com/profile/02783736154832837692noreply@blogger.com0tag:blogger.com,1999:blog-5819061131514017811.post-84074558826376562992011-01-23T19:54:00.000+01:002011-01-23T19:54:40.190+01:00Creating a better social experience on this blogIn order to have a better social experience here, I have extended this blogs layout with a Facebook 'Like' Button giving you the ability to like any posts.<br />
If you are interested in creating a Like Button on Blogger yourself look <a href="http://www.bloggerplugins.org/2010/04/facebook-like-button-for-blogger.html">here</a>.<br />
If you cannot find the <data:post.body> Tag on your template, at least I had the problem with Google Chrome, just search for post-body and make sure you have the Checkbox selected to see the complete template.</data:post.body>Anonymoushttp://www.blogger.com/profile/02783736154832837692noreply@blogger.com1tag:blogger.com,1999:blog-5819061131514017811.post-56650232706574389542010-11-18T11:02:00.000+01:002010-11-18T11:02:44.737+01:00Analyzing communication to CRM 2011–Analyzing WCF messagesOne of the technical news in Dynamics CRM 2011 is the use of WCF-based web services instead of the old ASP.NET based web services.<br />
Now let me say one thing about WCF. It is far to complex. Personally I think this was made in order to demonstrate that Microsoft can create really complex frameworks.<br />
But the nice thing is that behind this complexity the framework is also very flexible, you just have to know where to hook into.<br />
So the problem I had was that I called a web service on the new Organization.svc endpoint and got the fault that the server was not able to de-serialize the message, as it was in a wrong format.<br />
My first step analyzing such an error is looking at the actual xml that was send to the server. Starting up <a href="http://www.fiddler2.com/fiddler2/">Fiddler</a> I realized that the new endpoint is now using WS-Security to encrypt the message content, thus logging the traffic was not very helpful.<br />
So I decided to hook into WCF in order to log the actual message before it is encrypted.<br />
You can modify WCF by adding behaviors to it. In order to do that for CRM, you have to add a behavior to the Service Endpoint of the service configuration.<br />
You have to do that before you instantiate the OrganizationService with the ServiceConfiguration.<br />
In order to be able to reuse that I implemented that as an Extension Method to IServiceConfiguration like this:<br />
<pre class="brush: csharp;">public static IServiceConfiguration<IOrganizationService> ApplyMessageInspector(this IServiceConfiguration<IOrganizationService> orgCfg)
{
orgCfg.CurrentServiceEndpoint.Behaviors.Add(new MessageInspectorBehaviour());
return orgCfg;
}
</pre><br />
I want to add a client behavior, so I implemented ApplyClientBehavoir<br />
<pre class="brush: csharp;">public class MessageInspectorBehaviour : IEndpointBehavior
{
public void Validate(ServiceEndpoint endpoint)
{
}
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
clientRuntime.MessageInspectors.Add(new MessageInspector());
}
}
</pre><br />
A message inspector allows you to inspect and also modify the message if you want. In my case I only wanted to send the messages in my request and the servers response to my favorite logging tool <a href="http://nlog-project.org/">NLog</a>:<br />
<pre class="brush: csharp;">public class MessageInspector : IClientMessageInspector
{
private static readonly Logger ReqLogger = LogManager.GetLogger("WCF.Client.Request");
private static readonly Logger ResLogger = LogManager.GetLogger("WCF.Client.Response");
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
ReqLogger.Info(request);
return null;
}
public void AfterReceiveReply(ref Message reply, object correlationState)
{
ResLogger.Info(reply);
}
}
</pre><br />
So that’s it, quite easy if you already have the code, but if you have to dig around the API first a big pain.Anonymoushttp://www.blogger.com/profile/02783736154832837692noreply@blogger.com0tag:blogger.com,1999:blog-5819061131514017811.post-67855000327837476422010-11-11T17:32:00.001+01:002010-11-11T17:33:36.495+01:00Difference between testing and trying out<p>On days like this it can be really hard to find out whether the functionality you just have implemented really works, and really does what your customer want, isn’t it?</p> <p>Well, actually, no it isn’t.</p> <p>One of the things that are just frequently ignored, is that testing really is a structured process.</p> <h5>What do you need for a test?</h5> <ol> <li>Create a test plan; The test plan includes all tests that should be executed. Try to write the test as simple as possible. Everybody on the project should be able to execute a test. Rule-of-thumb here: It should sound like its being written by a child. Each test consists of:</li> <ol> <li>A subject</li> <li>Steps to execute the test</li> <li>A description what condition have to be met for this test to be successful</li></ol> <li>Involve your customer; Talk to your customer, include his input, and get his commitment to these test.</li> <li>Implement</li> <li>Execute the test; Be careful when executing tests. One of the goal in testing is also to have an environment where errors are reproducible.</li> <ol> <li>Read the execution steps carefully</li> <li>Execute the steps one-by-one</li> <li>Do not leave out steps or reinterpret certain steps because “it should lead to the same result”, someone trying to fix the bug you have filed will be grateful, when he is able to reproduce it.</li></ol></ol> <p>If you do not follow these steps, you are not testing, you are trying out your software. In this case you also might be able to find bugs, but it will be harder for you and anyone else to reproduce bugs.</p> <p>You also will not be able to guarantee the same high quality of your product.</p> <h5>What should be tested?</h5> <p>You should test your business process, your use cases or user stories, no matter how you call it.</p> <p>Most important is that you test from a users perspective in order to make your product work for your user.</p> <p>Also make sure you test corner cases, exceptions in business process. Eg you handle orders in your system, what happens when the order is canceled within the minute it has been ordered?</p> <p>Normally you do not have to test cases that should not work, but there might be exceptions to that, eg when implementing a credit card validation, only for VISA, you might also want to test, that it gives an error for American Express.</p> <p>In these cases you have to evaluate carefully.</p> <h5>Who should write test cases?</h5> <p>This should be a responsibility of everybody in the project. The customer is just as well a good source as is the developer.</p> <p>You have to make sure that the person responsible for the product, eg the Product Owner in a Scrum project knows that these tests exist, so he can coordinate them with the customer.</p> <p>Also make sure that you have a fixed set of test cases before starting to develop.</p> <p>If you add test cases during development you will most likely need longer to implement than you have estimated.</p> Anonymoushttp://www.blogger.com/profile/02783736154832837692noreply@blogger.com0tag:blogger.com,1999:blog-5819061131514017811.post-58276350357700754362010-07-15T17:47:00.000+02:002010-07-15T17:47:11.421+02:00ESB in Java and .NET WorldThe word Enterprise Service Bus means something different, when looking at ESB solutions in .NET and Java Open Source space.<br />
In Java Space the ESB is responsible for message validation and routing. The ESB also maps application specific data models to a common domain model in order to have one domain language within the services. It also implements adapters that abstract different protocols and applications. <br />
For the execution of the business process ESBs are bundeled with BPE servers that execute business process desciptions mostly based on <a href="http://en.wikipedia.org/wiki/BPEL">BPEL</a> (Business Process Execution Language).<br />
In the .NET world the business process is at the heart of the ESB. In case of the three implementations mentioned <a href="http://www.shrpr.org/2010/07/open-source-service-bus-options-in-net.html">here</a>, it is implemented in code. The process there is implemented as a saga, that is used to store all necesarry data to execute the process. These implementations only implement asynchronous communication using Message Queues. All of them support MSMQ, but there are also other options.<br />
Adapters and alike are not available so it is up to the implementor of the process to adapt the ESB to application specific protocols and data structures<br />
<br />
So if you talk to somebody about a ESB you have to be careful if he is a .NET or a Java GuyAnonymoushttp://www.blogger.com/profile/02783736154832837692noreply@blogger.com2tag:blogger.com,1999:blog-5819061131514017811.post-36507246517062353162010-07-13T22:02:00.000+02:002010-07-13T22:02:15.345+02:00Open Source Service Bus Options in .NETIn a recent project I had the opportunity to take a look at the open source ESB options in the .NET space.<br />
Looks like there are not as many options as in Java space.<br />
<br />
Here are the projects I found and look like they are alive:<br />
<br />
<ul><li><a href="http://www.nservicebus.org/">nServiceBus</a></li>
<li><a href="http://masstransit-project.com/">MassTransit</a></li>
<li><a href="http://github.com/ayende/rhino-esb">Rhino Service Bus</a></li>
</ul><div>In the next days I will post some basics about each of these projects.</div>Does anyone know of other options in this area? I would really like to take a look of them if you do.Anonymoushttp://www.blogger.com/profile/02783736154832837692noreply@blogger.com4tag:blogger.com,1999:blog-5819061131514017811.post-83333039378863951732010-07-04T21:38:00.001+02:002010-07-04T22:21:23.379+02:00How to find the last whitespace in a string?So some time ago we had a problem where we need to find the last whitespace in a string.<br />
So while this sounds like an easy problem to solve, there is not a single-liner that accomplishes that in .NET (besides a RegEx which is an overkill in this case).<br />
So the .NET BCL has the <a href="http://msdn.microsoft.com/en-us/library/system.string.lastindexof.aspx" target="_blank">LastIndexOf</a> and <a href="http://msdn.microsoft.com/en-us/library/system.string.lastindexofany.aspx" target="_blank">LastIndexOfAny</a> method and its overloads, and it has methods in System.Char to identify if a character is categorized as a certain Unicode category, in this case <a href="http://msdn.microsoft.com/en-us/library/System.Char.IsWhiteSpace.aspx" target="_blank">IsWhiteSpace</a>. But there is no good way to combine these two together. So I decided to implement my own way using an Extension Method.<br />
What I wanted to do was this:<br />
<pre class="brush: csharp;">[TestFixture]
public class StringExtensionTests
{
[Test]
public void TestLastIndexWhere()
{
Assert.That("Hello".LastIndexWhere(x => x == 'l'), Is.EqualTo(3));
Assert.That("Hello".LastIndexWhere(x => x == 'x'), Is.EqualTo(-1));
Assert.That("Helloel".LastIndexWhere(x => x == 'l', 5), Is.EqualTo(3));
Assert.That("Helloel".LastIndexWhere(x => x == 'l', 5, 2), Is.EqualTo(-1));
Assert.That("Hello el".LastIndexWhere(x => char.IsWhiteSpace(x), 5, 2), Is.EqualTo(5));
Assert.That("Hello\tel".LastIndexWhere(x => char.IsWhiteSpace(x), 5, 2), Is.EqualTo(5));
}
}
</pre>I skipped the tests for Exceptions here.<br />
As you see this allows to use the whole set of possibilities to work with characters in an easy to use way. And this is the implementation:<br />
<pre class="brush: csharp;">public static class StringExtensions
{
public static int LastIndexWhere(this string str, Func<char, bool> condition)
{
return LastIndexWhere(str, condition, str.Length - 1, str.Length);
}
public static int LastIndexWhere(this string str, Func<char, bool> condition, int startIndex)
{
return LastIndexWhere(str, condition, startIndex, startIndex);
}
public static int LastIndexWhere(this string str, Func<char, bool> condition, int startIndex, int count)
{
if (str == null) throw new ArgumentNullException("str");
if (condition == null) throw new ArgumentNullException("condition");
if (startIndex >= str.Length) throw new ArgumentOutOfRangeException("startIndex");
if (startIndex - count < -1) throw new ArgumentOutOfRangeException("count");
for (int i = startIndex; i > startIndex - count; i--)
{
if (condition(str[i]))
{
return i;
}
}
return -1;
}
}
</pre>Quite easy, but comes in handy in this case.<br />
So I guess I include that in my Util library for the future.Anonymoushttp://www.blogger.com/profile/02783736154832837692noreply@blogger.com0tag:blogger.com,1999:blog-5819061131514017811.post-60590147949265584042010-06-27T00:30:00.001+02:002010-07-04T21:56:14.353+02:00Multitasking is an efficiency killerMultitasking really can be a problem for efficiency. Ever went home from work and asked yourself, where the hell the time has gone?<br />
<div>Usually when I have this feeling, it was one of the days, where I had to work on several different projects or I had several interruptions. The problem here really is that multitasking for humans is a myth. As a programmer would say, the human brain is single threaded, this means, it can only work on a single task.</div><div>So when you think you are working on multiple tasks, what you really do, is you work on one task (like programming) and the you work on another (like answering a phone call). Between those tasks the brain needs some time to switch from one task to another.</div><div>If this happens regularly you wont get anything done, as the time needed for context switching takes overhand.</div><div>JoelOnSoftware also wrote a great blog about <a href="http://www.joelonsoftware.com/articles/fog0000000022.html">that</a>.</div><div>Thats the reason why agile software methodologies like <a href="http://www.scrum.org/">Scrum</a> recommend to remove multitasking from project and resource plans. </div><div>They also introduce Daily Meeting, like the Daily Scrum, where the team should remove any impediments, like open questions. This is the place and time where team members should request help, because there they can do it, without causing efficiency problems for others within the team.</div><div>Scrum also recommends as a programming practice, to develop as a pair, so that if questions arise, the developers working on that same problem, can discuss it, and try to solve this problem on their own. This practice also results in viewer task switches, as the developer does not have to seek help from a developer, who works on an entire different task.</div><div>One should also try to reduce interruptions in the typical work life like Email, Phone Calls and others.</div><div><br />
</div><div><b>What to do?</b></div><div><ul><li>Especially reducing interruptions because of Email is an easy thing. Email is an asynchronous communication. You do not have to answer it at once.</li>
<li>For me I found it helpful to disable the incoming email alerts, and only checking my emails in the morning, and before my breaks.</li>
<li>Answer the emails you can answer without additional work first, then those that need work to be done.</li>
<li>Remove task switches from your daily plan. Plan to work on one task, finish that and then start with the next.</li>
<li>Plan for tasks that are as big as possible without being longer than a work day.</li>
<li>Recognize that there will be unplanned interruption despite of the plans</li>
<li>For projects: Use a project process that supports your productivity, like <a href="http://www.scrum.org/">Scrum</a>, <a href="http://www.extremeprogramming.org/">XP</a> and <a href="http://en.wikipedia.org/wiki/Agile_software_development">other agile processes</a></li>
</ul><div><b>Update</b></div></div><div><a href="http://www.infoq.com/">InfoQ</a> now also has a nice article about <a href="http://www.infoq.com/articles/multitasking-problems">multitasking</a>.</div>Anonymoushttp://www.blogger.com/profile/02783736154832837692noreply@blogger.com0tag:blogger.com,1999:blog-5819061131514017811.post-167198585661136812010-06-13T22:43:00.001+02:002010-06-13T22:43:19.379+02:00Don’t be religious about technology, you might miss something<p>Recently in a project I realized how bad it is, if gomeone in the team is religious about some piece of technology. Especially when discussing about things like .NET vs Java, ASP.NET vs ASP.NET MVC, Microsoft vs. Apple, Google Maps vs Bing Maps, Springframework.net vs Castle Windsor, Nhibernate vs EF, Siebel vs Micrsoft CRM, … religious feelings for some technology can be really damaging to your project.</p> <p>If you have multiple choices you should really evaluate and have good reasons for your choice.</p> <p>Criteria for an evaluation can be:</p> <ul> <li>Features that fit your needs <li>Additional features <li>Quality <li>Know How <li>Licensing costs <li>Integration with existing code and frameworks </li></ul> <p>A criterion, that is not so good but often a fact in big companies, are company guidelines. They should harmonize development within a company, but often can hinder good choices and creativity.</p> <p>For a developer the best thing you can do, is to keep up-to-date. Take a look at existing and upcoming technologies, so you can make quick and reasoned decisions. Take a look at technologies that rival your own choices, as they will have good ideas in them that you can use in your own implementations.</p> Anonymoushttp://www.blogger.com/profile/02783736154832837692noreply@blogger.com0tag:blogger.com,1999:blog-5819061131514017811.post-70915027762675693202010-05-11T19:53:00.002+02:002010-06-23T21:33:34.113+02:00Hello, WorldSo, I start with a classic on every new programming blog out there. Not very creative. Nevertheless I hope the postings I write here will be interesting to you.<br />
So what is this all about?<br />
As I work for a CRM company, <a href="http://www.ksection.com/" target="_blank">k.section</a>, the idea is to develop great CRM applications based on standard software, like Microsoft CRM, and extend them using good Software Engineering principles, and a little magic ;-) .<br />
By the way, if you are looking for posts on the useage of CRM systems, take a look on my companies german blog <a href="http://blog.ksection.com/">http://blog.ksection.com</a>, where I am posting some things too.Anonymoushttp://www.blogger.com/profile/02783736154832837692noreply@blogger.com1