tag:blogger.com,1999:blog-22410131522844797702024-02-19T05:10:13.346-05:00Steinn (Stan) Jónsson's Tech TalkBlog about software development, agile practices, software use, and the latest happenings in the wide world of technologySteinn Jónssonhttp://www.blogger.com/profile/03561013028097975228noreply@blogger.comBlogger36125tag:blogger.com,1999:blog-2241013152284479770.post-32024404005185293142019-01-13T23:03:00.000-05:002019-01-13T23:29:30.402-05:00Interactive Venue Map for CodeMashI was frustrated with not having a searchable venue map for the CodeMash conference, so I decided to create one myself. Initially, I was going to build it from scratch while learning some cool new JavaScript framework, but upon googling the problem I came to realize that there are various tools out there that make creating such a map fairly easy. The software that best fit my needs was <a href="https://www.mapwize.io/">MapWize</a>. I ended up creating the following map, which can be accessed via <a href="http://codemash.sjonsson.com/">codemash.sjonsson.com</a> or by clicking on the image below.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://maps.mapwize.io/#/v/codemashmap/1?k=77baa5c28c938b81&z=17.57"><img border="0" data-original-height="1600" data-original-width="927" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfRS7pLlkkko5yD8yGIxlVYG-Q4N5cql9H4f6V-pKZH5yZ7W08fcbcjY7j6-Mq8_GEfOBG2oekGkE3dQHFCvxPJge5UsDrYyOsljbxnIyIIQaWWCt54PuHZZ7SarhcCxIlZT6Te8kp_WqL/s640/CodeMashMapScreenShot.png" width="369" /></a><span id="goog_521706134"></span><a href="https://www.blogger.com/"></a><span id="goog_521706135"></span></div>
The map allows you to search for a room by name and to get directions between two rooms, in addition to supporting pinch-zoom and general website responsiveness.<br />
<br />
Here are the high-level steps that went into creating the map:<br />
<ul>
<li>I emailed the CodeMash team and got a reasonably high res PDF of last year's conference map. </li>
<li>I cropped the image and removed much of the background.</li>
<li>I imported the image into MapWize Studio and overlayed it onto their street map, which already had the exterior of the Kalahari Convention Center.</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnQ7E1oHFVCMgQdNaphzpcN6qGmqGqfb1blmWlau7brO8tBbf8kuM2H-TEau2nnHXHfO7ZE9PMTq-MMc2BL0mTCJg5o2rtAS20yLCAPbwPTJXFufNKf2j47po6VvJZvBVyMZEHlYRWDyTL/s1600/CodeMashMapImport.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1474" data-original-width="1600" height="587" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnQ7E1oHFVCMgQdNaphzpcN6qGmqGqfb1blmWlau7brO8tBbf8kuM2H-TEau2nnHXHfO7ZE9PMTq-MMc2BL0mTCJg5o2rtAS20yLCAPbwPTJXFufNKf2j47po6VvJZvBVyMZEHlYRWDyTL/s640/CodeMashMapImport.png" width="640" /></a></div>
<ul>
<li>I then added a new place on the map for each conference room and drew the boundaries of each room. I gave the room a name and configured a few properties, such as room type and marked it as searchable and clickable. This was the most tedious part of the process as it took some time to draw each room onto the map.</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgU-2CJ5T7lfZJSCusMBFBRMv2UlvXJdD420AaEUd7G9hbQR0C2B_lIQ5YRqQmEPAzgCfqM_-BOGYQZFJqoeoCBhZlMdTi0KqzwsYTnA9hbycL3tHSbWNCj9PDF_BiNhdPAqQNJ8CgEMiwX/s1600/CodeMashMapPlaces.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1474" data-original-width="1600" height="587" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgU-2CJ5T7lfZJSCusMBFBRMv2UlvXJdD420AaEUd7G9hbQR0C2B_lIQ5YRqQmEPAzgCfqM_-BOGYQZFJqoeoCBhZlMdTi0KqzwsYTnA9hbycL3tHSbWNCj9PDF_BiNhdPAqQNJ8CgEMiwX/s640/CodeMashMapPlaces.png" width="640" /></a></div>
<ul>
<li>Next, I drew direction lines along all the hallways and marked the exits/entrances of the building. This is what the software uses when calculating directions between two places on the map.</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMN-PQcMpRYRr9Wxz7I3e2-tfnmiwapEBNhnQFV_nRphATsxKer-4ehaZIgDQm8hKqOJTKG8AIvF7l2EmHzf8SF-yxdeX6101zAxS_rrCsK4RFzIERVNBEGwr7PB_U_KVXm0tJaRnFp5Lt/s1600/CodeMashMapDirections.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1507" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMN-PQcMpRYRr9Wxz7I3e2-tfnmiwapEBNhnQFV_nRphATsxKer-4ehaZIgDQm8hKqOJTKG8AIvF7l2EmHzf8SF-yxdeX6101zAxS_rrCsK4RFzIERVNBEGwr7PB_U_KVXm0tJaRnFp5Lt/s640/CodeMashMapDirections.png" width="601" /></a></div>
<ul>
<li>And that is pretty much it. I then published the map and generated a MapWize URL for it. To make it a bit easier to share and to remember, I created the alias <a href="http://codemash.sjonsson.com/">codemash.sjonsson.com</a>. </li>
</ul>
One feature I didn't take advantage of was indoor navigation based on beacons or location of Wifi routers. If those are enabled, the software can show your indoor location on the map. That way you only have to type in the destination when getting directions to your next session and you'll see yourself on the map as you are walking. Pretty much how you'd expect outdoor navigation to work. You can achieve the same by giving the map permission to see your GPS location, but GPS reception is spotty when indoors.<br />
<br />
Anyways, I used the map heavily during CodeMash and shared it with other conference guests. Feel free to use it and further share with others. If you found it helpful I'd love to hear from you :)Steinn Jónssonhttp://www.blogger.com/profile/03561013028097975228noreply@blogger.com0tag:blogger.com,1999:blog-2241013152284479770.post-63424904944471804492018-11-29T21:18:00.000-05:002018-11-29T22:04:46.484-05:00Fitness gadgets that make exercising less boringToday I gave a talk at work on various fitness gadgets, equipment, and software that I have used to try to mix up my exercise routine and make working out a little more fun. I covered the Zwift and iFit virtual training platforms, the Zombies Run mobile app, fitness trackers, and Strava - the social network for athletes. The talk was well received and we had some great discussions afterward about various other gadgets that my coworkers have experimented with. I encouraged people to try at least one of those to see if it will make exercising a little more enjoyable 🙂<br />
Below are my slides from the talk.<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="485" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/oKiE3oF7gR7nwi" style="border-width: 1px; border: 1px solid #ccc; margin-bottom: 5px; max-width: 100%;" width="595"> </iframe> <br />
(If the embedded slides don't work in your browser, <strong><a href="http://www.slideshare.net/steinnjonsson/fitness-gadgets-that-make-exercising-less-boring-124451645" target="_blank" title="Fitness Gadgets That Make Exercising Less Boring">try accessing them on Slideshare</a>)</strong><br />
<br />Steinn Jónssonhttp://www.blogger.com/profile/03561013028097975228noreply@blogger.com0tag:blogger.com,1999:blog-2241013152284479770.post-2877001915747576772018-02-27T22:47:00.000-05:002018-02-27T22:50:58.902-05:00Get the most out of attending conferencesLast week I gave a talk at work on getting the most out of attending software development conferences.
I've been attending conferences for quite a while now and figured I had enough tips in the bag to share with others. Things such as the importance of getting out of your comfort zone, how to learn from other attendees, various note taking tips, and why it is important to review what you learned. The slides from my talk can be seen below:<br />
<br />
<iframe src="//www.slideshare.net/slideshow/embed_code/key/mqcNll4VnFp5aH" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/steinnjonsson/get-the-most-out-of-attending-conferences" title="Get the most out of attending conferences" target="_blank">Get the most out of attending conferences</a> </strong> from <strong><a href="https://www.slideshare.net/steinnjonsson" target="_blank">Steinn (Stan) Jónsson</a></strong> </div>
<br />
Steinn Jónssonhttp://www.blogger.com/profile/03561013028097975228noreply@blogger.com0tag:blogger.com,1999:blog-2241013152284479770.post-10393574315166370122018-01-12T23:34:00.000-05:002018-01-13T00:02:43.224-05:00CodeMash 2018I spent the past couple of days at the CodeMash developer conference in Sandusky, Ohio. I learned some new technologies, caught up with old friends, and as usual had a great time. Some of the technology trends spotted this year: AI, machine learning, blockchain, digital voice assistants, people getting serious about security, and cheap (often cloud-connected) hardware controllers with tons of neat sensors. Here is some of what I saw at the conference.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.blogger.com/video.g?token=AD6v5dxyJSNuSKG9TzBKyymg7xLag6t9fO84g2x1iLDFld_Ve6JV0p9XCGp0qSjf8evKp5HJowx70lQAhahP8vEGJQ' class='b-hbp-video b-uploaded' frameborder='0'></iframe></div>
<div style="clear: both; text-align: center;">
<span style="color: #1d2129; font-family: "sf optimized" , , , , ".sfnstext-regular" , sans-serif; font-size: 14px; letter-spacing: -0.12px; text-align: left;">BB-8 riding the hallways</span></div>
<div class="separator" style="clear: both; text-align: center;">
<span style="color: #1d2129; font-family: "sf optimized" , , , , ".sfnstext-regular" , sans-serif; font-size: 14px; letter-spacing: -0.12px; text-align: left;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.blogger.com/video.g?token=AD6v5dyX1viNS6oAIx0Mub6OmVXlN17X2l1lDyZkp08vW1kQjymwHumMm3JWecjxYGqAIqEdrejdpQrIgE4n8qxHHA' class='b-hbp-video b-uploaded' frameborder='0'></iframe></div>
<div style="clear: both; text-align: center;">
<span style="color: #1d2129; font-family: "sf optimized" , , , , ".sfnstext-regular" , sans-serif; font-size: 14px; letter-spacing: -0.12px; text-align: left;">An attendee 3D printed this dragon</span></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1hd0rdBh6cgrK3YMlAVU53y9LdMnP8NI7X3ROONRusmtd8IEnTeIiV-VH9y517q2gEEc1N-JReBx4s4XzvutBs7r5t6mTgT8CIiEuq5hCDBJag816iq2VMf-44r6W0FkyzyTg0vySQuLo/s1600/IMG_1034.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="900" data-original-width="1600" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1hd0rdBh6cgrK3YMlAVU53y9LdMnP8NI7X3ROONRusmtd8IEnTeIiV-VH9y517q2gEEc1N-JReBx4s4XzvutBs7r5t6mTgT8CIiEuq5hCDBJag816iq2VMf-44r6W0FkyzyTg0vySQuLo/s320/IMG_1034.JPG" width="320" /></a></div>
<div style="clear: both; text-align: center;">
<span style="color: #1d2129; font-family: "sf optimized" , , , , ".sfnstext-regular" , sans-serif; font-size: 14px; letter-spacing: -0.12px; text-align: left;">Unusually warm temperatures at the Kalahari resort. It got into the 60s (F) on Thursday, but then turned into a blizzard Friday afternoon! That's Ohio weather for you.</span></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCRtzt7bgWJK85ov3Dt9PGQgveCOC3wkcW1igldLTLMcwu6sz7akvUo_bDIo0HWhoEDH1vXN28dEEm0-DrRuyMtGufzp-M2aCSMHVYcuB3FqS8s1n1Lm4s3NJaHLaxrx_YoLc9RTAo_CQJ/s1600/IMG_6394.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCRtzt7bgWJK85ov3Dt9PGQgveCOC3wkcW1igldLTLMcwu6sz7akvUo_bDIo0HWhoEDH1vXN28dEEm0-DrRuyMtGufzp-M2aCSMHVYcuB3FqS8s1n1Lm4s3NJaHLaxrx_YoLc9RTAo_CQJ/s320/IMG_6394.JPG" width="320" /></a></div>
<div style="clear: both; text-align: center;">
<span style="color: #1d2129; font-family: "sf optimized" , , , , ".sfnstext-regular" , sans-serif; font-size: 14px; letter-spacing: -0.12px; text-align: left;">Firefly board game</span></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.blogger.com/video.g?token=AD6v5dwsFY7m0glkpdsz5RqOPZuUSPNGkraUrn02eFVGyOAM6NgVgvjT__vHSWx42lrfv6cJMPa5UnRyQsEacWjLXA' class='b-hbp-video b-uploaded' frameborder='0'></iframe></div>
<div style="clear: both; text-align: center;">
<span aria-live="polite" class="fbPhotosPhotoCaption" data-ft="{"tn":"K"}" id="fbPhotoSnowliftCaption" style="color: #1d2129; display: inline; font-family: "sf optimized" , , , , ".sfnstext-regular" , sans-serif; font-size: 14px; letter-spacing: -0.12px; line-height: 18px; outline: none; text-align: left; width: auto;" tabindex="0"><span class="hasCaption" style="font-family: inherit;">I built this heart rate monitor using Arduino and a pulse sensor</span></span></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp65yqVp1aHl4P-gWxRsVAFbBqYHGvWjcZrfYs0eoftahw0tUBYXCgQmmM17N3kSSAygEvmSaQGWFlh97XlIjI3gri-NDI3wAjTEVYNKRuzeE2TRDEeYlcRliMAym-gdBO4G5T34m8vGfb/s1600/IMG_0091.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp65yqVp1aHl4P-gWxRsVAFbBqYHGvWjcZrfYs0eoftahw0tUBYXCgQmmM17N3kSSAygEvmSaQGWFlh97XlIjI3gri-NDI3wAjTEVYNKRuzeE2TRDEeYlcRliMAym-gdBO4G5T34m8vGfb/s320/IMG_0091.JPG" width="320" /></a></div>
<div class="" style="clear: both; text-align: center;">
<span aria-live="polite" class="fbPhotosPhotoCaption" data-ft="{"tn":"K"}" id="fbPhotoSnowliftCaption" style="color: #1d2129; display: inline; font-family: "sf optimized" , , , , ".sfnstext-regular" , sans-serif; font-size: 14px; letter-spacing: -0.12px; line-height: 18px; outline: none; text-align: left; width: auto;" tabindex="0"><span class="hasCaption" style="font-family: inherit;">KidzMashers doing laser tag</span></span></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.blogger.com/video.g?token=AD6v5dwFxucaowbO92G3pGBS59zvjJfBJxbM512suMnnQ0uGx1IwemgAkpcTvl6E_fibKEYWDgLNWggmBpceQHOXlw' class='b-hbp-video b-uploaded' frameborder='0'></iframe></div>
<div style="clear: both; text-align: center;">
<span style="color: #1d2129; font-family: "sf optimized" , , , , ".sfnstext-regular" , sans-serif; font-size: 14px; letter-spacing: -0.12px; text-align: left;">Sphero robot programmed into a game of Hot Potato</span></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7ZcORA0MinOTJoo2bPe35i-OpAF-T1OfQkUGmqlxR55Rn1tm9EEHsJuyzr9SOzq1erKnClPtG8jQvjE9zwnMNAwn-KzoS5TWzUp7xgz06j233XrXVLila6ARNXj8muYyKpZeMlsbwKtwp/s1600/IMG_1945.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7ZcORA0MinOTJoo2bPe35i-OpAF-T1OfQkUGmqlxR55Rn1tm9EEHsJuyzr9SOzq1erKnClPtG8jQvjE9zwnMNAwn-KzoS5TWzUp7xgz06j233XrXVLila6ARNXj8muYyKpZeMlsbwKtwp/s320/IMG_1945.JPG" width="320" /></a></div>
<div style="clear: both; text-align: center;">
<span aria-live="polite" class="fbPhotosPhotoCaption" data-ft="{"tn":"K"}" id="fbPhotoSnowliftCaption" style="color: #1d2129; display: inline; font-family: "sf optimized" , , , , ".sfnstext-regular" , sans-serif; font-size: 14px; letter-spacing: -0.12px; line-height: 18px; outline: none; text-align: left; width: auto;" tabindex="0"><span class="hasCaption" style="font-family: inherit;">A presentation about giving a presentation</span></span><span aria-live="polite" class="fbPhotosPhotoCaption" data-ft="{"tn":"K"}" id="fbPhotoSnowliftCaption" style="color: #1d2129; display: inline; font-family: "sf optimized" , , , , ".sfnstext-regular" , sans-serif; font-size: 14px; letter-spacing: -0.12px; line-height: 18px; outline: none; text-align: left; width: auto;" tabindex="0"><span class="hasCaption" style="font-family: inherit;"><br />(or recursion as we developers would call it)</span></span></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijzhzHDkBmSjx_JM4nXtFd-B5kHGPaXfUtouOioQ99ubO-lU6hb02Onxncmvj2dYNls1fq_S6b6lbtpImz5XZfP5JqlQhfX2GTH9mamdMr9tIBWNIotH02EBgYMUZgDpuujjECQL6rFdGC/s1600/IMG_7209.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1200" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijzhzHDkBmSjx_JM4nXtFd-B5kHGPaXfUtouOioQ99ubO-lU6hb02Onxncmvj2dYNls1fq_S6b6lbtpImz5XZfP5JqlQhfX2GTH9mamdMr9tIBWNIotH02EBgYMUZgDpuujjECQL6rFdGC/s320/IMG_7209.JPG" width="240" /></a></div>
<div style="clear: both; text-align: center;">
<span style="color: #1d2129; font-size: 14px; letter-spacing: -0.12px; text-align: left;">Bunch of 3D printed stuff</span></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.blogger.com/video.g?token=AD6v5dxW12oIxrLclJp8UN-YIFhQvxFhBB6io6wAzjsPnOWWF_64ZOzA7TBVA4Zoz_WIlo1_yd3Onz69z9lFxFUAbA' class='b-hbp-video b-uploaded' frameborder='0'></iframe></div>
<div style="clear: both; text-align: center;">
<span style="color: #1d2129; font-family: "sf optimized" , , , , ".sfnstext-regular" , sans-serif; font-size: 14px; letter-spacing: -0.12px; text-align: left;">A mainframe programmer spotted leaving the conference ;)</span></div>
<br />
<br />
CodeMash definitely peaked my interest in exploring some technologies I haven't used before. Let's get to work on that!<br />
I believe this was my 9th time attending this unique event. I can't wait for CodeMash 2019.<br />
<br />Steinn Jónssonhttp://www.blogger.com/profile/03561013028097975228noreply@blogger.com0tag:blogger.com,1999:blog-2241013152284479770.post-53883325690980308012017-05-22T22:34:00.000-04:002017-05-23T11:55:02.360-04:00Learn by listening to audiobooksLast week I gave a talk at work about the many benefits of listening to audiobooks. I've been a heavy audiobook listener ever since discovering this book format back in 2001 as a great way to get me through long commutes. I talked about where I get books from and suggested how mundane activities can be made more fun by doing them while listening to audiobooks. I listed some of my favorite authors and provided various book recommendations both for self-improvement and general entertainment. The slides from my talk can be seen below:<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="485" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/qawk6d3oAaXRes" style="border-width: 1px; border: 1px solid #ccc; margin-bottom: 5px; max-width: 100%;" width="595"> </iframe> <br />
<div style="margin-bottom: 5px;">
<strong> <a href="https://www.slideshare.net/steinnjonsson/learn-and-have-fun-by-listening-to-audiobooks" target="_blank" title="Learn and have fun by listening to audiobooks">Learn and have fun by listening to audiobooks</a> </strong> from <strong><a href="https://www.slideshare.net/steinnjonsson" target="_blank">Steinn 'Stan' Jónsson</a></strong> </div>
<br />
Steinn Jónssonhttp://www.blogger.com/profile/03561013028097975228noreply@blogger.com0tag:blogger.com,1999:blog-2241013152284479770.post-76915314904750977992016-12-23T00:02:00.000-05:002017-05-22T21:54:25.053-04:00Teach your kids to codeLast week I gave a talk at Alliance Data on teaching your kids to code. I basically walked through various applications, websites and robots that I have tried together with my kids (age 12, 9 and 6) and shared what we have enjoyed and what not. Using these tools we have created together multiple stories and games, to our mutual enjoyment. If you are a software developer who has a kid, I definitely recommend trying some of these tools out. Here are the slides from my talk:<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="485" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/Ie8uiOr67xeRRX" style="border-width: 1px; border: 1px solid #ccc; margin-bottom: 5px; max-width: 100%;" width="595"> </iframe> <br />
<div style="margin-bottom: 5px;">
<strong> <a href="https://www.slideshare.net/steinnjonsson/teach-your-kids-to-code" target="_blank" title="Teach your kids to code">Teach your kids to code</a> </strong> from <strong><a href="https://www.slideshare.net/steinnjonsson" target="_blank">Steinn 'Stan' Jónsson</a></strong> </div>
<br />
Steinn Jónssonhttp://www.blogger.com/profile/03561013028097975228noreply@blogger.com2tag:blogger.com,1999:blog-2241013152284479770.post-64260834146034912992016-01-29T09:11:00.001-05:002017-05-22T21:55:24.137-04:00Interview for QA or the HighwayI will be taking my Web Services Testing talk to the <a href="http://www.qaorthehighway.com/">QA or the Highway conference</a> next month. I am excited to speak at this QA focused conference for the first time. I have heard a lot of good things about the conference. Alliance Data, my new employer will be sending their entire testing team to the conference, so hopefully I'll have some friendly faces in the audience during my session :) To promote the event and generate buzz, the <a href="http://blog.testingcurator.com/">Testing Curator</a> is interviewing some of the speakers in what they call the Speaker Series. I was recently interviewed. Below is a link to the results.<br />
<br />
<br />
<table>
<tbody>
<tr>
<td><a href="http://blog.testingcurator.com/2016/01/28/qa-or-the-highway-2016-speaker-series-featuring-stan-jonsson/" style="text-decoration: none;">
<img src="http://speaking-easy.com/wp-content/uploads/2015/12/qa_highway.jpg" />
</a>
</td>
<td><a href="http://blog.testingcurator.com/2016/01/28/qa-or-the-highway-2016-speaker-series-featuring-stan-jonsson/" style="text-decoration: none;">
</a>
<h2 style="text-decoration: none;">
<a href="http://blog.testingcurator.com/2016/01/28/qa-or-the-highway-2016-speaker-series-featuring-stan-jonsson/" style="text-decoration: none;">QA or the Highway 2016 – Speaker Series – Featuring Stan Jónsson</a></h2>
<a href="http://blog.testingcurator.com/2016/01/28/qa-or-the-highway-2016-speaker-series-featuring-stan-jonsson/" style="text-decoration: none;">
<span style="color: black;">Our sixth featured speaker who will be at QA or the Highway is Stan Jónsson.<br />
1. What attracted you to speaking at QA or the Highway this year? I saw a...</span>
<h4>
<span style="color: grey;">blog.testingcurator.com</span></h4>
</a>
</td>
</tr>
</tbody></table>
Steinn Jónssonhttp://www.blogger.com/profile/03561013028097975228noreply@blogger.com5tag:blogger.com,1999:blog-2241013152284479770.post-82688145252512251332016-01-09T00:32:00.000-05:002017-05-22T21:56:09.549-04:00CodeMash 2016 - Program some health into your life<span style="text-align: justify;">Another awesome </span><a href="http://www.codemash.org/" style="text-align: justify;">CodeMash</a><span style="text-align: justify;"> is coming to an end, with a lot of great sessions and a bunch of fun activities throughout the conference. I attended the full 4 days and was joined by my family for the last 2. For the first time my kids attended </span><a href="http://www.codemash.org/kidzmash" style="text-align: justify;">KidzMash</a><span style="text-align: justify;">, where they had a great time learning game development, how robots work, building an </span><a href="https://s3.amazonaws.com/cmj-presentations/altoid-flashlight-codemash-2016/index.html" style="text-align: justify;">Altoid-flashlight</a><span style="text-align: justify;"> and learning how to count to F! In the CodeMash spirit I attended mostly sessions outside my immediate comfort zone; including pre-compiler on 7 languages, front-end talks, UX-talks, softskill-talks and a few pertaining to what I am currently working on; microservices and modularity.</span><br />
<div style="text-align: justify;">
<br />
<div style="text-align: justify;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3EP6ys2H3WggFhWYFr7soi7YtJBzlAPvPDAxzRRTPbCVS9pmmiTGFOwy4H58eVK7tGIidwhXmflP8ELfgSv_5LF6cG_2i4FYK7b1gQpzHZe-08mIG6osjPNjzBC_qZ0pa-B20As79wJow/s1600/CodeMash2016Speaking.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: justify;"><img border="0" height="264" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3EP6ys2H3WggFhWYFr7soi7YtJBzlAPvPDAxzRRTPbCVS9pmmiTGFOwy4H58eVK7tGIidwhXmflP8ELfgSv_5LF6cG_2i4FYK7b1gQpzHZe-08mIG6osjPNjzBC_qZ0pa-B20As79wJow/s320/CodeMash2016Speaking.png" width="320" /></a> I was honored to be presenting at CodeMash for the third time. This time on a non-technical subject dear to my heart. My talk was titled <a href="http://www.codemash.org/session/program-some-health-into-your-life/">Program some health into your life</a>; where I walked developers through what it takes to stay healthy at a desk job, the basics of nutrition and exercising, and offered various tips on loosing weight and getting the most out of your effort. It went very well and I was not even booed when I suggested bacon was not the cornerstone of a healthy meal plan! :) Apparently there was a <a href="https://twitter.com/MEKergosien/status/685551495929040897">free candy buffet</a> going on at the same time I gave my talk, so I was pleased to see a room full of programmers giving up sweets for health advice :) Below are the slides from my talk. </div>
<div style="text-align: justify;">
</div>
</div>
<br />
As in years past, hats off to the CodeMash organizers for putting on a great conference. I am already looking forward to CodeMash 2017!
Now off to the water park with the family!
<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="485" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/8iuXX4EZBx2Sm0" style="border-width: 1px; border: 1px solid #CCC; margin-bottom: 5px; max-width: 100%;" width="595"> </iframe> <br />
<div style="margin-bottom: 5px;">
<strong> <a href="https://www.slideshare.net/steinnjonsson/program-some-health-into-your-life" target="_blank" title="Program some health into your life">Program some health into your life</a> </strong> from <strong><a href="https://www.slideshare.net/steinnjonsson" target="_blank">Steinn 'Stan' Jónsson</a></strong> </div>
<br />Steinn Jónssonhttp://www.blogger.com/profile/03561013028097975228noreply@blogger.com1tag:blogger.com,1999:blog-2241013152284479770.post-32669966019754005042015-10-26T22:19:00.001-04:002017-05-22T21:56:30.310-04:00Biking to workLast week, during a monthly lunch and learn, I gave a talk on bicycling to work. I have been riding to work once a week for a few months now and this was my attempt to get some of my coworkers to join in on the fun. Aside from multiple health benefits, I have found that when I ride I arrive at work much happier and better prepared to tackle the day, than on days when I commute via car. During the talk I shared various tips on bike commuting and on how to go about mapping a bike-friendly route from one's home to work. Using Strava.com and Google's Bicycling and Street View data I have been able to map out a relatively safe route from my home in Hilliard to my current work in Easton, Ohio. The route is rather long (around 29 miles) so I have only been doing it once a week. Below are the slides from the talk. If you have any good bike commuting tips to share, I would love to hear from you!<br />
<br />
<br />
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/NCpNPLzNLFHIe4" style="border-width: 1px; border: 1px solid #CCC; margin-bottom: 5px; max-width: 100%;" width="425"> </iframe> <br />
<div style="margin-bottom: 5px;">
<br /></div>
</div>
Steinn Jónssonhttp://www.blogger.com/profile/03561013028097975228noreply@blogger.com1tag:blogger.com,1999:blog-2241013152284479770.post-54938521536029712732015-06-30T20:33:00.000-04:002017-05-22T21:56:49.534-04:00StirTrek Talk Available on YouTube<div>
Last month I had the pleasure of <a href="http://stirtrek.com/Speaker/Get/114">presenting at StirTrek</a> 2015, Ultron Edition. This one day software development conference has grown into one of the premier technology events in town, so I felt honored to get a chance to present. The conference was held at the Rave Theaters in Columbus, and as in previous years the 1500 attendee tickets were sold out in minutes. <br />
<br />
I gave a talk on Testing Web Services, similar to ones previously presented at CodeMash and Columbus Code Camp. According to the proctor manning my theater, 217 people attended the session. The presentation went very well and I had a lot of people come up to me afterwards and thank me for the talk, which made me feel good. The talk was recorded and can now be <a href="https://www.youtube.com/watch?v=zg0sGF5aRGk">viewed on YouTube</a>. Only the audio and video feeds to the projector were captured, so you wont be able to see my face. Well, maybe just as well. If you want to learn more about <b>SoapUI, JMeter </b>and<b> REST-assured</b>, then give the video a shot. It is about an hour long.
<br />
<div>
<br /></div>
<iframe align="middle" allowfullscreen="" frameborder="0" height="360" src="https://www.youtube.com/embed/zg0sGF5aRGk?rel=0" width="640"></iframe>
<br />
<div>
<br /></div>
The slides from the talk (with screenshots of most of what I walked through), along with all code/scripts are available in the <a href="https://github.com/stirtrek/2015MayStirTrek/blob/master/Quality%20and%20Security/StanJonsson-TestingWebServices.zip">StirTrek Github repo</a> (downloadable zip file).
</div>
<br />
<div>
As always the conference ended with a private movie screening. This time the movie was The Avengers: Age of Ultron. My wife joined me and the rest of the Quick Solutions gang for the viewing, which was a great ending to a fun conference. </div>
<div>
<br /></div>
Steinn Jónssonhttp://www.blogger.com/profile/03561013028097975228noreply@blogger.com0tag:blogger.com,1999:blog-2241013152284479770.post-24360226808123044952015-03-16T00:05:00.001-04:002022-02-14T11:39:30.433-05:00JMS testing with HermesJMS<a class="external-link" href="https://docs.solace.com/Developer-Tools/Integration-Guides/Hermes-Jms.htm" rel="nofollow" style="color: #3b73af; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; text-decoration: none;">HermesJMS</a><span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;"> </span><span face="Arial, sans-serif" style="color: #333333;"><span style="font-size: 14px; line-height: 20px;">is a handy tool that can be used to visually interact with JMS destinations (JMS Queues or JMS Topics). I find it convenient for ad hoc testing of JMS applications. I use it to monitor the status of JMS Queues, browse their contents, and to drop messages onto queues for testing purposes. </span></span><br />
<span face="Arial, sans-serif" style="color: #333333;"><span style="font-size: 14px; line-height: 20px;"><br /></span></span><span face="Arial, sans-serif" style="color: #333333;"><span style="font-size: 14px; line-height: 20px;">When viewing a message in a JMS Queue, HermesJMS shows you the JMS headers and the value of the message payload, even if the payload is a serialization of a custom Java object. For example, in my current consulting engagement, we had a situation where we had a bad message stuck at the front of one of our JMS Queues (and due to invalid configuration our app kept processing that same message over and over, rather than proceeding onto the next message in the queue). Through the WebLogic Console we were able to see that there was a message in the queue that wasn't getting processed, but we couldn't see the actual content of the message that was causing it to get stuck. By connecting HermesJMS to the queue we could view the message payload and as a result identify and fix the issue.</span></span><br />
<br />
<b style="color: #333333; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px;">Browse Queue Contents</b><br />
<span face="Arial, sans-serif" style="color: #333333;"><span style="font-size: 14px; line-height: 20px;"><br /></span></span><span face="Arial, sans-serif" style="color: #333333;"><span style="font-size: 14px; line-height: 20px;">The screenshot below shows an example of what browsing messages in a JMS Queue looks like:<br /></span></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjD145eUz5L6-mGGMRvC7qPOVQRe_tdHACpsIABlXcN2AOghITIYK8Ay0J1_pBTBze2L80yEPIIox_SH96QJoKob19ik8DFkIZXU6iJ2hkik9PXB83qL8jTm9GDps6fn2vLCTFsr2nzhCL4/s1600/HermesJMSBrowseQueue.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="372" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjD145eUz5L6-mGGMRvC7qPOVQRe_tdHACpsIABlXcN2AOghITIYK8Ay0J1_pBTBze2L80yEPIIox_SH96QJoKob19ik8DFkIZXU6iJ2hkik9PXB83qL8jTm9GDps6fn2vLCTFsr2nzhCL4/s1600/HermesJMSBrowseQueue.png" width="640" /></a></div>
<span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;"><br /></span>
<span face="Arial, sans-serif" style="color: #333333;"><span style="font-size: 14px; line-height: 20px;">The table lists the JMS messages currently in the queue and the JMS headers for each message. Below the table is then a text rendering of the actual payload (typically a serialized Java object). In this example the payload is a Java class called <a href="https://github.com/sjonsson/HermesJMSDemo/blob/master/src/main/java/com/sjonsson/hermes/HermesDemo.java">HermesDemo</a> with two properties, foo and bar (which I creatively concocted for this blog post :)</span></span><br />
<span face="Arial, sans-serif" style="color: #333333;"><span style="font-size: 14px; line-height: 20px;"> </span></span><br />
<span face="Arial, sans-serif" style="color: #333333;"><span style="font-size: 14px; line-height: 20px;"><b>Drag Messages Between Queues</b></span></span><br />
<span face="Arial, sans-serif" style="color: #333333;"><span style="font-size: 14px; line-height: 20px;"><br /></span></span>
<span face="Arial, sans-serif" style="color: #333333;"><span style="font-size: 14px; line-height: 20px;">Another handy feature of HermesJMS is that you can easily copy messages between queues. For example, if I click on the top message in the demo/Queue on my local machine I can drag it over to a queue in my testing environment (UAT):<br /></span></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEig8yOQ44-hYji6rlHFFkeXuDDTh9Or4KxOhzvXS-reOxETwUR2Bo4-gDpiOohOqyxQsM0rdvYDqhiiRP-R3zdPL19HKdwMwyw_sQqJw3kxu7X0q3SCD5K7MTipcHSS_7uSlS0fvMXlwMb6/s1600/HermesJMSCopyToQueue.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="372" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEig8yOQ44-hYji6rlHFFkeXuDDTh9Or4KxOhzvXS-reOxETwUR2Bo4-gDpiOohOqyxQsM0rdvYDqhiiRP-R3zdPL19HKdwMwyw_sQqJw3kxu7X0q3SCD5K7MTipcHSS_7uSlS0fvMXlwMb6/s1600/HermesJMSCopyToQueue.png" width="640" /></a></div>
<span face="Arial, sans-serif" style="color: #333333;"><span style="background-color: white;"><span style="font-size: 14px; line-height: 20px;"><br /></span></span></span>
<span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;">HermesJMS asks me to confirm the action and then copies the message over. HermesJMS will automatically handle any necessary mapping if the JMS Destination names differ between the source and the target queues. I find this drag and drop feature quite handy for ad hoc testing JMS applications in multiple environments. I produce a message on one of my local queues and then drag it as needed onto a corresponding queue in the environment I want to test. </span><br />
<span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;"><br /></span>
<b style="color: #333333; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px;">Build Message Stores</b><br />
<span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;"><br /></span><span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;">HermesJMS also has a feature where you can build so called stores; that work off of a database rather than an actual JMS destination. Using this feature you can build a database of various JMS messages and have them ready for dragging over to a remote destination anytime you need to test a specific condition in one of your JMS applications. </span><br />
<span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;"><br /></span><b style="color: #333333; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px;">XML Export/Import</b><br />
<span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;"><br /></span><span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;">Alternatively HermesJMS allows you to export messages to XML files, for later import into queues/topics. To do this, you simply click on a message in the queue and select <i>Save as XML...</i> from the <i>Messages</i> menu, then give it a file name and hit save. To import the message to a queue you click on the JMS Queue and select <i>Send XML Encoded Messages</i> from the <i>Messages</i> menu and then select the XML file to import from on your hard drive:<br /></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_V3IZFtd9v_JdEh_V59ed1Q2XPDdfh9rMLb_BuC275ysgJ6z9hPaL5H4Hi9qiQIvZhayM_TjbcyaJ1ktdT2VCK5tZZPIHeNkJxNH7gnyylgirupnghQiSIq1kHd7gv4pi0kAf2W6R67z7/s1600/HermesJMSSendXMLtoQueue.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="372" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_V3IZFtd9v_JdEh_V59ed1Q2XPDdfh9rMLb_BuC275ysgJ6z9hPaL5H4Hi9qiQIvZhayM_TjbcyaJ1ktdT2VCK5tZZPIHeNkJxNH7gnyylgirupnghQiSIq1kHd7gv4pi0kAf2W6R67z7/s1600/HermesJMSSendXMLtoQueue.png" width="640" /></a></div>
<span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;"><br /></span>
<span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;">Note: if the JMS Destination name does not match between the source and target queues you will need to edit the XML and update the value to match that of the target queue. </span><br />
<span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;"><br /></span>
<span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;">In our example the exported DemoClass.xml file looks like this:</span><br />
<span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;"><br /></span>
<script src="http://gist-it.appspot.com/github/sjonsson/HermesJMSDemo/blob/master/.hermes/messages/DemoClass.xml?footer=0"></script>
<span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;">where the value of the object tag is an object serialization + Base64 encoding of the following Java class:
<span style="background-color: white;"><br /></span>
<br />
<script src="http://gist-it.appspot.com/github/sjonsson/HermesJMSDemo/blob/master/src/main/java/com/sjonsson/hermes/HermesDemo.java?footer=0"></script>
</span>
<span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;">When you export a message from a Queue to XML, HermesJMS handles the serialization magic for you and writes it out to the XML file. If you want to create a new XML message from scratch (e.g. when adding the first message for a queue), you can build the serialization string using the <a href="https://github.com/sjonsson/HermesJMSDemo/blob/master/src/main/java/com/sjonsson/hermes/SerializeHermesDemoClass.java" target="_blank">SerializeHermesDemoClass</a> in my Github repo (just modify the main method to use whatever class you want to serialize).</span><br />
<br />
<b style="color: #333333; font-family: Arial, sans-serif; line-height: 20px;">Setup Instructions<br /></b><br />
<div>
<span face="Arial, sans-serif" style="color: #333333;"><span style="font-size: 14px; line-height: 20px;">Below are basic instructions for getting HermesJMS set up. In my case I am using WebLogic as the application server. Setup for other app servers is similar; you just need to use the ContextFactory and jar files specific to that app server. If you go to </span><span style="font-size: 14px; line-height: 20px;"><a href="http://www.hermesjms.com/">hermesjms.com</a> you will find setup instructions for many app servers under the </span></span><span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;">Providers menu</span><span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;">.</span></div>
<span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;">
</span>
<br />
<ol style="margin: 10px 0px 0px;"><span face="Arial, sans-serif" style="color: #333333;">
<li style="color: #333333; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px;">Download and install HermesJMS, either directly from <a class="external-link" href="http://sourceforge.net/projects/hermesjms/files/hermesjms/" rel="nofollow" style="color: #3b73af; text-decoration: none;">Sourceforge</a> or as part of <a class="external-link" href="http://sourceforge.net/projects/soapui/files/" rel="nofollow" style="color: #3b73af; text-decoration: none;">SoapUI</a> install.</li>
<li style="font-size: 14px; line-height: 20px;"><span face="Arial, sans-serif" style="color: #333333;"><span style="font-size: 14px; line-height: 20px;">Start HermesJMS by running hermes.bat/hermes.sh.</span></span></li>
<span face="Arial, sans-serif" style="color: #333333;">
<li style="font-size: 14px; line-height: 20px;"><span face="Arial, sans-serif" style="color: #333333;">Create a ClasspathGroup for your app server jar files</span> </li>
</span><ol style="color: #333333; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; list-style-type: lower-alpha; margin: 0px;">
<li>Select Option and Preferences</li>
<li>Click on the Providers tab</li>
<li>Right-click on Classpath Groups and select Add Group and give it a name (e.g. JarDependencies)</li>
<li>Click the + sign and right-click on Library and select Add Jars and find the jar files you want to import. In our case that is weblogic.jar, wlclient.jar, and <a href="https://github.com/sjonsson/HermesJMSDemo/blob/master/target/HermesDemo-1.0-SNAPSHOT.jar">HermesDemo.jar</a>, which has the custom Java class used in our demo. If you want HermesJMS to show the contents of a custom Java object in your JMS Queue, it needs to have the corresponding class file on its classpath. You can either add the jar here, or alternatively edit hermes.bat/hermes.sh and add it where the CLASSPATH variable gets set.<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzunhCKCzLEww9fF3SJdu3Ik3lYZxesaK3mP1HnBai9VA_aAuE0ct45kmUVOUBIqUoJOvTB_k9siOI1ZqCZXIrGAlXBS0Z3qxxlypG4a-VvWSbmmi6yrRVYuqrGSW1OI-Sl7gZXVaklrZ-/s1600/HermesScreenShot_JarDependencies.png" style="font-family: "Times New Roman"; font-size: medium; line-height: normal; margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="297" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzunhCKCzLEww9fF3SJdu3Ik3lYZxesaK3mP1HnBai9VA_aAuE0ct45kmUVOUBIqUoJOvTB_k9siOI1ZqCZXIrGAlXBS0Z3qxxlypG4a-VvWSbmmi6yrRVYuqrGSW1OI-Sl7gZXVaklrZ-/s1600/HermesScreenShot_JarDependencies.png" width="400" /></a></li>
</ol>
<span face="Arial, sans-serif" style="color: #333333;"><span face="Arial, sans-serif" style="color: #333333;">
<li style="font-size: 14px; line-height: 20px;">Next we need to create a Session for JNDI browsing the JMS server </li>
</span><ol style="font-size: 14px; line-height: 20px; list-style-type: lower-alpha; margin: 0px;">
<li>On the Preferences screen, click the Sessions tab.</li>
<li>Give the session a name, corresponding to the JMS server you are pointing it to.</li>
<li>Select the Plug In matching your app server. In our case it is BEA WebLogic.</li>
<li>Under Loader, select your JarDependencies and under Class select hermes.JNDIConnectionFactory.</li>
<li>Populate the binding, initialContextFactory, providerUrl, and security properties as appropriate for your app server. For WebLogic the properties are:<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPBvdyAeBxg9PP7COGlSy2Loxa5SC8m_H7WePkNIM328_HPZixdsNqPsheMtqAsUyiZPj-T2IPOJldD3B5Q8At6NDLcRgLgimz0dNLMTN3RY-onVo-rxp8cBlBjKKNpimwAkVwMEVG5TZL/s1600/HermesScreenShot_ConnectionFactory.png" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPBvdyAeBxg9PP7COGlSy2Loxa5SC8m_H7WePkNIM328_HPZixdsNqPsheMtqAsUyiZPj-T2IPOJldD3B5Q8At6NDLcRgLgimz0dNLMTN3RY-onVo-rxp8cBlBjKKNpimwAkVwMEVG5TZL/s1600/HermesScreenShot_ConnectionFactory.png" width="498" /></a></li>
<li>If the destination names don't get auto-populated, right-click under Destinations and add the names of JMS Queues/Topics you want to connect to on the JMS Server.</li>
</ol>
</span></span></ol>
<div>
<span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;"><br />Note: If you are using WebLogic you can alternatively download this </span><a href="https://github.com/sjonsson/HermesJMSDemo/blob/master/.hermes/hermes-config.xml" style="color: #3b73af; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; text-decoration: none;">pre-populated hermes-config.xml</a><span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;"> file and put it in your .hermes directory (replacing the default one that HermesJMS puts there during install). Before you run HermesJMS make sure you edit the file and change the following:</span><br />
<ul>
<li><span style="font-size: 14px; line-height: 20px;">Update the providerUrl value to match the server and port of your JMS Server.</span></li>
<li><span style="font-size: 14px; line-height: 20px;">Set the securityCredentials and securityPrincipal values to mach your username and password.</span></li>
<li><span style="font-size: 14px; line-height: 20px;">Edit the library paths for JarDepdencies and make sure they point to wherever you have these jar files on your machine.</span></li>
</ul>
<span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;"><br /></span>
<span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;"><b>In </b></span><span face="Arial, sans-serif" style="color: #333333;"><span style="font-size: 14px; line-height: 20px;"><b>Conclusion</b></span></span><br />
<span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;"><br /></span>
<span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;">I hope this overview and these setup instructions help you get going with HermesJMS. Once you have it working, interacting with your JMS destinations is a breeze, and testing a given JMS app can be as simple as a drag and drop.</span><br />
<span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;"><br /></span>
<span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;">If you need to run a suite of JMS tests, e.g. for sanity testing or load testing, you can use <a href="http://www.soapui.org/">SoapUI</a>, which knows how to interact with HermesJMS. I may write a future blog post demonstrating this integration. For SoapUI basics, see this <a href="http://www.sjonsson.com/2011/08/web-service-testing-with-soapui.html">blog post</a>.</span><br />
<span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;"><br /></span>
<span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;">All the examples used for this blog post can be seen in this <a href="https://github.com/sjonsson/HermesJMSDemo">Github repo</a>.</span><br />
<span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;"><br /></span>
<span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;">Happy JMSing!</span><br />
<span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;"><br /></span></div>
<span face="Arial, sans-serif" style="color: #333333; font-size: 14px; line-height: 20px;">
</span>Steinn Jónssonhttp://www.blogger.com/profile/03561013028097975228noreply@blogger.com6tag:blogger.com,1999:blog-2241013152284479770.post-61398949793942276822014-03-25T00:23:00.001-04:002014-03-25T08:40:31.332-04:00How do you explain Java technologies to non-technical audience?Today I had the interesting challenge of trying to explain various Java buzzwords to people with very little technical knowledge. Basically, we wanted our talent managers (recruiters) at Quick Solutions to gain a high level understanding of some of the Java technologies they recruit people for. <br />
<br />
In prepping for this presentation I put on my "simplification hat" and tried to think of the essence of some of the more popular Java technologies. I wanted to leave the talent managers with a simple visual picture in their minds, that represented the benefits of each technology. Then I followed each of those visuals up with a basic architecture diagram that explained how the technology fits into a typical application. I also gave them sample questions and answers for each technology, all focused on the high-level benefits of each technology (which problems the technology is meant to solve). <br />
<br />
At the beginning I also went over some of the reasons I love being a consultant, and how to use those to attract talent. I basically walked through the bullet-points in <a href="http://www.sjonsson.com/2013/08/7-reasons-to-become-software.html">this blog post</a>. <br />
<br />
The general feedback I got was that they were able to follow along and they found the information very helpful. I suspect though I may have lost a few of them near the end, when I got onto design patterns :)<br />
<br />
Below are some of the more visual slides from my presentation. The <a href="http://www.slideshare.net/steinnjonsson/java-for-qsi-talent-managers" target="_blank">full slide deck is available on Slideshare</a>. <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</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/AVvXsEg0PPdRv2FgPxEBb9z0Q314vMtqdYSj_Bc3G89IEPdpPGEF8qDi7DvDhufFmtx3vwQtRYB0dAOxsVjbhuBp-YyG8VK7C4-2FwU_thlPL-2cAyWQIsiKPq-ea4aeh-_ox-BtYDUjjmAh7eei/s1600/Slide05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0PPdRv2FgPxEBb9z0Q314vMtqdYSj_Bc3G89IEPdpPGEF8qDi7DvDhufFmtx3vwQtRYB0dAOxsVjbhuBp-YyG8VK7C4-2FwU_thlPL-2cAyWQIsiKPq-ea4aeh-_ox-BtYDUjjmAh7eei/s1600/Slide05.png" height="330" style="border: 1px solid black;" width="440" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgC2Q3P1krmzJH5psFnEJFueNOgUQquYLDXeIsYc0pHGeFJUJxCQBPK9DdacpzsCKflUvFY_fA6gAFyWM-jG98GtosjawR4UtlRauMp5y7jtTBoiUT562bRl0uxphvKh2ffD_5l9yCDKoI-/s1600/Slide08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgC2Q3P1krmzJH5psFnEJFueNOgUQquYLDXeIsYc0pHGeFJUJxCQBPK9DdacpzsCKflUvFY_fA6gAFyWM-jG98GtosjawR4UtlRauMp5y7jtTBoiUT562bRl0uxphvKh2ffD_5l9yCDKoI-/s1600/Slide08.png" height="330" style="border: 1px solid black;" width="440" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMpSFZy5hyphenhyphenmN8wADXMFEeAQN2VzXQRlCahaxHBRKIHYzlKq2W4QgniNuAMgJD5bTb4JRYb6-BOf2v8J8oAcWikFrwkSManLCQzPGOG2H7NN2vwNC-1YhU5jbPwCII4BqlRMZ_pMxSIHPLM/s1600/Slide11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMpSFZy5hyphenhyphenmN8wADXMFEeAQN2VzXQRlCahaxHBRKIHYzlKq2W4QgniNuAMgJD5bTb4JRYb6-BOf2v8J8oAcWikFrwkSManLCQzPGOG2H7NN2vwNC-1YhU5jbPwCII4BqlRMZ_pMxSIHPLM/s1600/Slide11.png" height="330" style="border: 1px solid black;" width="440" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhN20K0VUztTgRmFthA4Guf0gOt1eAV8fYfLDjNcb1qgJpAUKrpBpD4YvC2a-GaNN85isV9JswVh98a3irsS-6M262AlzLLtPYzLQtmeFN9kemVO-kUgE4exU_SbbFQMH9J6HEhrDV3Gdyo/s1600/Slide14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhN20K0VUztTgRmFthA4Guf0gOt1eAV8fYfLDjNcb1qgJpAUKrpBpD4YvC2a-GaNN85isV9JswVh98a3irsS-6M262AlzLLtPYzLQtmeFN9kemVO-kUgE4exU_SbbFQMH9J6HEhrDV3Gdyo/s1600/Slide14.png" height="330" style="border: 1px solid black;" width="440" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjc1i8_M-cZRIMajq6MPWeGul6cb-iavrA7-7a-QNAqkZr9GIygSIsS3RLHVJLOJJkmvvOo4QF5zx0QY54cGVLb9IBpymTMZRYQe0pI1xnXquyu0JKcjejd04BXkSyJJAtH_GplP8mHItdK/s1600/Slide17.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjc1i8_M-cZRIMajq6MPWeGul6cb-iavrA7-7a-QNAqkZr9GIygSIsS3RLHVJLOJJkmvvOo4QF5zx0QY54cGVLb9IBpymTMZRYQe0pI1xnXquyu0JKcjejd04BXkSyJJAtH_GplP8mHItdK/s1600/Slide17.png" height="330" style="border: 1px solid black;" width="440" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjilEMg-pacBtt2obbzjgsdphneakK0vmvb25GILkKHjqxqnBhHXADNJvhmllmp1u21CBeJRhhONrk86U1Hf3NrYKglaZSyycIYWlVdr-QrxqlhSABEsNqdOgqA9ZvCLBsx4UxRX386wP3x/s1600/Slide19.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjilEMg-pacBtt2obbzjgsdphneakK0vmvb25GILkKHjqxqnBhHXADNJvhmllmp1u21CBeJRhhONrk86U1Hf3NrYKglaZSyycIYWlVdr-QrxqlhSABEsNqdOgqA9ZvCLBsx4UxRX386wP3x/s1600/Slide19.png" height="330" style="border: 1px solid black;" width="440" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
What do you think? Did I pick the right visuals? Could I have made it even simpler?</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
Steinn Jónssonhttp://www.blogger.com/profile/03561013028097975228noreply@blogger.com4tag:blogger.com,1999:blog-2241013152284479770.post-32480067435698589242014-01-10T15:12:00.000-05:002016-02-18T15:22:06.791-05:00CodeMash 2014<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7bnOYWK0tcxYSVQxERFAiXQHIiTtlhtnIhdQOMMm0m_-gFGkgQ503-o3QqqbqsIqKEIid5uqM8ANUBQ-KzWiN0_keUT5mc8nAbotcUAU0QZqlIAbmE384d83Z__q0TXVP-hTKVjYClGRs/s1600/2014-01-10+12.53.39.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7bnOYWK0tcxYSVQxERFAiXQHIiTtlhtnIhdQOMMm0m_-gFGkgQ503-o3QqqbqsIqKEIid5uqM8ANUBQ-KzWiN0_keUT5mc8nAbotcUAU0QZqlIAbmE384d83Z__q0TXVP-hTKVjYClGRs/s200/2014-01-10+12.53.39.jpg" height="180" width="320" /></a>CodeMash 2014 is winding down and as usual the conference was a blast! Lots of greats talks, lots of fun activities, and last but not least good time to be had in the waterpark! Outside of the talks they had activities such as lock picking, jam sessions, early morning 5K run, astronomy, 3D printing, game rooms, open spaces, lightning talks, kids fun at KidsMash, a StarTrek simulator, various parties, bacon bar, and on and on. This was my 4th year attending the conference and it is without a doubt my favorite developer conference. Hats off to the organizers!<br />
<br />
This year I was fortunate enough to not only deliver one, but two talks at the conference. On Thursday I gave a talk on Web Service testing and Friday I did one on Kanban. The first talk went sort of ok. I was very nervous, felt I stuttered too much through the material and didn't feel very sharp in my thoughts, so I didn't feel super good afterwards. I had a talk with Leon Gersing in the evening and he gave me some great pointers on delivering presentations and dealing with nerves. I went ahead and rehearsed my second talk several times in the evening and then delivered it the following morning and felt way more relaxed, sharp in my thoughts and quite enjoyed giving the talk. So thanks, Leon, for the tips! Now I am waiting for my family to join me at Kalahari, so we can hit the waterpark tonight and tomorrow.<br />
<br />
The slide decks from my talks are available on Slideshare:
<br/>
<br/>
<iframe src="//www.slideshare.net/slideshow/embed_code/key/fB9S41YMGn9zJJ" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> </div>
<br/>
and
<br/>
<br/>
<iframe src="//www.slideshare.net/slideshow/embed_code/key/MHRH9BMvzx4Rqk" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> </div>
<br/>
The slides have also been uploaded to the <a href="https://github.com/TechConf/CodeMash2014">conference GitHub</a>.
<br/>
<br/>Steinn Jónssonhttp://www.blogger.com/profile/03561013028097975228noreply@blogger.com0tag:blogger.com,1999:blog-2241013152284479770.post-73679473044821025842013-09-25T22:09:00.000-04:002016-02-18T15:09:05.631-05:00Agile Open SpaceI enjoyed facilitating an Open Space meeting for <a href="http://www.agilelunchbox.org/" target="_blank">agileLUNCHBOX</a> today. This was the first such meeting for that organization. We had around 20 participants and did 2 rounds of discussions, in 3 circles. We had a variety of topics posted and some great discussions. I took a few photos of the event, which you can see below; including one that shows the topics that we discussed. Click on an image to see a larger version. <br />
<br />
Before kicking off the discussions I gave a brief overview of Open Space Technology. Here is the short <a href="http://www.slideshare.net/steinnjonsson/agile-lunchbox-open-space-september-2013" target="_blank">slide deck</a> I went through. <br />
<br />
At the end we had a brief retrospective and it was the general consensus that we should do another Open Space meeting at agileLUNCHBOX in the near future. We are also going to look into having an Open Space evening at <a href="http://www.cohaa.org/" target="_blank">COHAA</a>, where we have more time to work with.<br />
<br />
<embed type="application/x-shockwave-flash" src="https://photos.gstatic.com/media/slideshow.swf" width="600" height="400" flashvars="host=picasaweb.google.com&hl=en_US&feat=flashalbum&RGB=0x000000&feed=https%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2F111010492940070022395%2Falbumid%2F5927709435279752209%3Falt%3Drss%26kind%3Dphoto%26hl%3Den_US" pluginspage="http://www.macromedia.com/go/getflashplayer"></embed>
<br />
<br />
Steinn Jónssonhttp://www.blogger.com/profile/03561013028097975228noreply@blogger.com0tag:blogger.com,1999:blog-2241013152284479770.post-461612425712046772013-09-20T00:07:00.000-04:002013-09-20T00:07:29.599-04:00Web Service Testing TalkToday I gave a talk on Testing Web Services at the monthly QSI Tech Lunch. I basically went through various products and frameworks that I have used when testing Web Services, talked about what kind of testing each one is suited for, and provided some general tips on Web Service testing. I have uploaded the slides from the presentation to <a href="http://www.slideshare.net/steinnjonsson/qsi-tech-lunch-web-service-testing" target="_blank">Slideshare</a> and the code and test-scripts are available on <a href="https://github.com/sjonsson/WebServiceTesting" target="_blank">GitHub</a>. I will be repeating this talk (likely with slight modifications) at the 2013 <a href="http://columbuscodecamp.com/" target="_blank">Columbus Code Camp</a>, next month.Steinn Jónssonhttp://www.blogger.com/profile/03561013028097975228noreply@blogger.com1tag:blogger.com,1999:blog-2241013152284479770.post-58693217255545795082013-08-31T15:33:00.001-04:002014-02-11T09:33:13.769-05:007 Reasons to Become a Software Development Consultant<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiro1Hwkq3mOKKiHRd0U48ONkVc1-B4CbmCKlYowAphiSGzv5QiSITuSfjmRzH2zVepjHUfqjsI6ftFQclLXlkfHdcZU8-7mFifp6MtqGpONodGaJlFLrMf5_bPLVQ64S7p3dmnPNnQhmVW/s1600/devloper3.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img alt="Happy developer" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiro1Hwkq3mOKKiHRd0U48ONkVc1-B4CbmCKlYowAphiSGzv5QiSITuSfjmRzH2zVepjHUfqjsI6ftFQclLXlkfHdcZU8-7mFifp6MtqGpONodGaJlFLrMf5_bPLVQ64S7p3dmnPNnQhmVW/s200/devloper3.png" height="126" title="Photo courtesy of FreeDigitalPhotos.net" width="200" /></a><span style="font-family: Calibri, sans-serif;"><span style="line-height: 22.84375px;"><br />I have been a software development consultant for a few years now. I sometimes get asked by friends and colleagues why I prefer being a consultant rather than becoming a full-time employee (FTE) at one of the many companies I have done contract work for. Here are some of the reasons why I think consulting is the way to go.</span></span><br />
<ol>
<li><span style="font-family: Calibri, sans-serif; line-height: 22.84375px;"><b>It forces you to stay on top of your game and as a result you end up becoming a very well rounded developer </b> </span></li>
<ul>
<li><span style="font-family: Calibri, sans-serif; line-height: 22.84375px;">You can't get away with just learning the technology stack of a single company and eventually becoming stagnant. You need to stay marketable, follow trends and learn the latest and greatest.</span></li>
<li><span style="font-family: Calibri, sans-serif; line-height: 22.84375px;">When working for a consulting company you are encouraged to attend conferences, do public speaking, etc. to enhance your career. </span><span style="font-family: Calibri, sans-serif; line-height: 22.84375px;"> </span></li>
</ul>
<li><span style="font-family: Calibri, sans-serif; line-height: 22.84375px;"><b>You get exposed to many different technologies and have an opportunity to learn a lot</b></span></li>
<ul>
<li><span style="font-family: Calibri, sans-serif; line-height: 22.84375px;">I have never been hired onto a client assignment knowing every single technology listed on the job posting. There are always some things I don't know beforehand, and as a result of the assignment will get to learn those.</span></li>
</ul>
<li><span style="font-family: Calibri, sans-serif; line-height: 22.84375px;"><b>You end up doing a lot more new development (green-field projects) than you would ever do as an FTE</b></span></li>
<ul>
<li><span style="font-family: Calibri, sans-serif; line-height: 22.84375px;">Consultants are rarely brought in for maintenance work, carrying the on-call phone, or doing production support; things that most developers are not too found of.</span></li>
</ul>
<li><span style="font-family: Calibri, sans-serif; line-height: 22.84375px;"><b>You get to shop around and see how multiple companies do their software development</b></span></li>
<ul>
<li><span style="font-family: Calibri, sans-serif; line-height: 22.84375px;">Eventually you become really good at picking up good habits from your clients, stuff you see that works, and assisting other clients in doing the same. That makes you really valuable and your work rewarding (what you do matters).</span></li>
</ul>
<li><span style="font-family: Calibri, sans-serif; line-height: 22.84375px;"><b>You typically don't do a lot of overtime, but when you do, it is paid</b></span></li>
<ul>
<li><span style="font-family: Calibri, sans-serif; line-height: 22.84375px;">Clients are much more likely to ask their FTEs to do overtime than a consultant that they have to pay extra for. Contracts are typically written with a 40 hour workweek in mind. Any change in that requires paperwork and additional expense to the client (throwing off their budget), so most clients tend to avoid that.</span></li>
</ul>
<li><span style="font-family: Calibri, sans-serif; line-height: 22.84375px;"><b>You get to work with and learn from really great people </b></span></li>
<ul>
<li><span style="font-family: Calibri, sans-serif; line-height: 22.84375px;">Consulting companies thrive on having the best and brightest minds and they ensure their employees do a lot of knowledge sharing. <a href="http://www.quicksolutions.com/" target="_blank">QSI</a>, the company I consult for is excellent at doing this.</span></li>
<li><span style="font-family: Calibri, sans-serif; line-height: 22.84375px;">Most clients you end up working for have some really good people as well (architects, tech leads, etc.), that you get to learn from.</span></li>
</ul>
<li><span style="font-family: Calibri, sans-serif;"><span style="line-height: 22.84375px;"><b>You are not stuck in the same old job</b></span></span></li>
<ul>
<li><span style="font-family: Calibri, sans-serif;"><span style="line-height: 22.84375px;">After few years in the same place many developers get bored and start wondering if the grass is greener somewhere else. Being a consultant means you will have a frequent change of scenery, so you rarely have time to get bored. If you like your client and do a good job, you can likely get renewed with them as long as you care to (for years). If you are ready for something else, then complete your assignment and work with your consulting company to get a placement somewhere else. It may take some time to get it worked out (you want to make sure you end things on a good note with the client), but it is a lot easier than having to quit your job and find a new company to work for.</span></span></li>
</ul>
</ol>
<br />
<span style="font-family: Calibri, sans-serif;"><span style="line-height: 22.84375px;">Lastly, it is just a lot of fun!</span></span><br />
<span style="font-family: Calibri, sans-serif;"><span style="line-height: 22.84375px;"><br /></span></span>
<br />
<ul style="border: 0px; font-family: Helvetica, Arial, 'Droid Sans', sans-serif; font-size: 14px; line-height: 19.984375px; list-style-position: outside; margin: 0.2857em 0px 0.714285em 2em; padding: 0px;">
</ul>
Steinn Jónssonhttp://www.blogger.com/profile/03561013028097975228noreply@blogger.com12tag:blogger.com,1999:blog-2241013152284479770.post-5284222946812518302013-03-13T15:47:00.000-04:002013-08-20T22:01:52.098-04:00Visually Import SSL Certificates to Java KeystoresWorking with SSL certs in Java, in particular those self-signed ones frequently found in dev & QA environments, usually means dealing with the command line <a href="http://docs.oracle.com/javase/6/docs/technotes/tools/solaris/keytool.html">keytool</a> that comes with Java. Either to add a certificate to a keystore (JKS file) or to add a new certificate authority to your truststore (cacerts file). If you are tired of reading the keytool help or googling what the exact import command looks like (and have forgotten it in the year or so since you last had to deal with it), I recommend the GUI tool <a href="http://portecle.sourceforge.net/">Portecle</a>. It makes it very easy to view the contents of a keystore/truststore file and to import new certificates, and it allows you to download public certificates right from within the tool. <br />
<br />
To add a public key certificate to a keystore, open up the JKS file in Portecle, select Examine SSL/TLS Connection and type in the hostname and port number of the https site you would like add certificate from. Then hit the PEM encoding button and save the certificate to a file. Next click the Import Trusted Certificate button and select the file you exported and hit save. That's it!<br />
<br />
To add a trust for a new certificate authority in your truststore you open up your cacerts file (password most likely 'changeit') and add the CA certificate file via the Import Trusted Certificate button. You will need to locate the CA certificate file on your app server and convert it to PEM format if it is not already in that format. For example in WebLogic the CA file is located in the [WebLogic Home]/server/lib directory (CertGenCA.der by default). In IIS you can export the CA file to PEM format through the IIS Management Console. After importing the CA file to your cacerts file your JVM should trust certificates issued by that CA.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<img border="0" height="385" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmecNHrMNVUAFrJdVsonYgGZQj_bXbwpd7bG3VY27aUlYiY-Fb3yA7HePatn3Cg8HwBajRQj4sjgulZeYGwoGBf8mF3SMAcCPZe94TMvJDuXUSOH5zLto0BOCPq_gUyokfdcrBtDHiB-QE/s400/portecle_screenshot.png" width="400" /></div>
<br />Steinn Jónssonhttp://www.blogger.com/profile/03561013028097975228noreply@blogger.com0tag:blogger.com,1999:blog-2241013152284479770.post-91195541138010233702012-09-27T01:21:00.001-04:002013-03-23T23:37:15.285-04:00Presentation - Kanban Case Study<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSyGykzHBeBJUspj_PbYGOZm-dSgDBMHafehsMDmiHjai0qdXRbv3Lqs-UKYXo1XOXGbrKIh3HQaardAjAlhGuDjk7sK-_gZxJEe0D4G_Pq16unA6jMvs_fIcIkpumjL83fOP9yZU6dBh0/s1600/KanbanStandup.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="204" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSyGykzHBeBJUspj_PbYGOZm-dSgDBMHafehsMDmiHjai0qdXRbv3Lqs-UKYXo1XOXGbrKIh3HQaardAjAlhGuDjk7sK-_gZxJEe0D4G_Pq16unA6jMvs_fIcIkpumjL83fOP9yZU6dBh0/s320/KanbanStandup.jpg" width="320" /></a></div>
<div style="text-align: justify;">
Here are <a href="http://www.slideshare.net/steinnjonsson/kanban-case-study-14478736">slides on a Kanban Case Study</a> that I presented at <a href="http://www.agilelunchbox.org/">agileLUNCHBOX</a> today. I basically recapped my experience using Kanban at <a href="http://www.hugsmidjan.is/">Hugsmiðjan</a> (maker of <a href="http://www.eplica.com/">Eplica CMS</a>), and showed how our Kanban board evolved over time. I went over basic Kanban theory and covered a few advanced topics like associated metrics. I also talked about how we integrated Kanban and Scrum. The talk was well received and afterwards we had some good agile discussions. </div>
Steinn Jónssonhttp://www.blogger.com/profile/03561013028097975228noreply@blogger.com0tag:blogger.com,1999:blog-2241013152284479770.post-88006014318322660682012-09-14T18:00:00.000-04:002014-03-24T15:07:21.301-04:00Web Service Development - Best PracticesAs a software developer I have had to deal with a fair amount of Web Services, both as the consumer and provider of services. Below is a list of best practice guidelines that I have gradually assembled and try to follow when developing Web Services. I also usually send this list to people that are writing Web Services that I am to consume. I have found that it saves me considerable headache when it comes time to integrate with the service. Most of my guidelines are written with XML over SOAP in mind, but some are common sense tips that should apply to other types of Web Services, like JSON over REST.<br />
<br />
<h3>
The Guidelines</h3>
<ol>
<li class="li1">A Web Service should be defined with a WSDL (or WADL in case of REST) and all responses returned by the Web Service should comply with the advertised WSDL.</li>
<ol>
<li class="li1">This can for example be tested with tools like SoapUI (see my blog entry <a href="http://www.sjonsson.com/2011/08/web-service-testing-with-soapui.html">Web Service Testing with soapUI</a>) or XMLSpy, which validate SOAP responses against a WSDL.</li>
</ol>
<li>Use XML Schema to define the input and output of your Web Service operations.</li>
<ol>
<li class="li1">Make sure to define return types for all returned data, preferably as XSD ComplexTypes.</li>
<li class="li1">Do not use the AnyType tag, as it makes it impossible (or non-beneficial) to use XML binding libraries to auto-generate code to construct request/response objects.</li>
<li class="li1">For ComplexTypes, make sure the occurrence indicators (minOccurs and maxOccurs) are correctly defined, so that it is clear to the consumer which fields are required and which are optional and the frequency of each field.</li>
<li class="li1">Make sure your namespaces are well defined (not some default like "org.tempuri")</li>
</ol>
<li class="li1">Do not use a proprietary authentication protocol for your Web Service. Rather use common standards like HttpAuth or Kerberos. Or define username/password as part of your XML payload and expose your Web Service via SSL.</li>
<li class="li1">Keep it simple </li>
<ol>
<li>Write a Web Service with many simple methods rather than one large method (with numerous arguments) that tries to be everything to everyone.</li>
<li class="li1">Adhere to the OO principles of maximizing cohesion and minimizing coupling when designing your Web Services.</li>
</ol>
<li class="li1">Make sure your Web Service returns error messages that are useful for debugging/tracking problems. For example, include an error code and a human readable error description.</li>
<li class="li1">Make sure to offer a development environment for your service, which preferably runs the same Web Service version as production, but off of a test database rather than production data.</li>
<li class="li1">Thoroughly test your Web Service, in a technology-agnostic manner, before having others integrate with it.</li>
</ol>
<div>
<br />
<h3>
Consequences of Breaking These Guidelines</h3>
<div>
<br /></div>
Why all these rules? Because I have found it to significantly increase development time for the consumer when they are broken. Here are some of the offenders I frequently come across, and the resulting consequences:<br />
<ul>
<li>Web Services that don't define a WSDL and are poorly documented.</li>
<ul>
<li>This usually leaves the consumer shooting in the dark as to how to communicate with the service and what to expect as a response. This results in a lot of trial-and-error and having to manually write code to marshall & unmarshall the XML data.</li>
</ul>
<li>Web Services that define a WSDL but don't conform to it.</li>
<ul>
<li>This can be extremely frustrating for the Web Service consumer who usually ends up getting some sort of a cryptic error message from his generated XML bindings code. That leads to a lot of head scratching and eventually writing the XML marshalling code from scratch. I would say this is a worse offense than not defining a WSDL at all. </li>
</ul>
<li>Web Services that are hidden behind some proprietary authentication protocol. </li>
<ul>
<li>A good example that comes to mind is the NTLM v2 protocol that IIS supports and is a proprietary Microsoft protocol. Integrating with this protocol from other technologies than .Net is usually not straight forward. Last time I had to do it from Java we ended up having to purchase a proprietary library to be able to authenticate against the service, as no reliable open source implementation existed (which took us way to long to discover).</li>
</ul>
<li>Web Services that define poor or no error messages.</li>
<ul>
<li>These are the type of services that blow up with some XML parsing error, showing a stack trace that is specific to the Web Service implementation technology. They basically provide no useful feedback to the consumer about what may have gone wrong and whether the issue is on the client or server side. Furthermore, it leaves no way for the consumer to gracefully handle the error by choosing actions based on error type.</li>
</ul>
<li>Web Services that don't work unless consumed in the authoring technology.</li>
<ul>
<li>I have often I had to consume Web Services that were incorrectly autogenerated by some tool/framework (Siebel and .Net come to mind), and really don't conform to Web Service standards. I therefore urge developers to test their own service with soapUI, JMeter or other standalone Web Service clients, before they publish it to others. That way you also get to chew your own dog food, so to speak, meaning you see what the XML for your service looks like.</li>
</ul>
</ul>
<div>
That's my two cents on the issue. If you have more guidelines to share, or don't agree with mine, I'd love to hear from you.</div>
<br />
<br />
<ul class="ul1"><ul class="ul1">
</ul>
</ul>
</div>
Steinn Jónssonhttp://www.blogger.com/profile/03561013028097975228noreply@blogger.com1tag:blogger.com,1999:blog-2241013152284479770.post-4567047104947785292012-08-31T09:37:00.000-04:002012-09-20T09:48:19.252-04:00Run Jenkins on Tomcat with SSL<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPiXX6uZCXrL-NWG8tRQQ2cnW5OHD-I_BZpRjxHimnBxL1IBIlaIlsfO8g7f0ai0JgN4LEgcYvpJtgggT3gMLXTUE5k_q1wToodBtLg4XO4trkfEZKKMulZpOmHaaE0OdVPt13Vka5nDrz/s1600/jenkins.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="102" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPiXX6uZCXrL-NWG8tRQQ2cnW5OHD-I_BZpRjxHimnBxL1IBIlaIlsfO8g7f0ai0JgN4LEgcYvpJtgggT3gMLXTUE5k_q1wToodBtLg4XO4trkfEZKKMulZpOmHaaE0OdVPt13Vka5nDrz/s320/jenkins.png" width="320" /></a></div>
At work I recently got the task of getting Jenkins up and running on Tomcat and set it up in such a way that requests were exclusively served via SSL. Since it took a bit of googling to get this done I decided to document the instructions should anyone need to do the same. Here they are:<br />
<br />
<ul>
<li>Download and install the latest version of <a href="http://tomcat.apache.org/">Tomcat</a>. </li>
<li>Download the latest <a href="http://mirrors.jenkins-ci.org/war/latest/jenkins.war">Jenkins WAR file</a> and extract it to [Tomcat home]/webapps/ROOT.</li>
<ul>
<li>Note: this is assuming the only web application you will be running on Tomcat is Jenkins. If you are planning to use Tomcat to run multiple web applications you will need to create server.xml host configurations for each one.</li>
</ul>
<li>If you haven't already, download and install the latest version of <a href="http://www.java.com/getjava">Java</a>.
</li>
<li>If you are not planning to run SSL, all you should have to do at this point is start Tomcat (via [Tomcat home]/bin/Tomcat7w.exe or the service menu on Windows, or [Tomcat home]/bin/startup.sh on Linux/Unix)</li>
<li>To get SSL working you will need an SSL certificate. You can get an official certificate through <a href="https://www.verisign.com/">Verisign</a> or <a href="http://www.thawte.com/">Thawty</a>. In this example we will be using a free self-signed certificate, generated with the keytool that comes with Java.</li>
<li>Run: [Java home]/bin/keytool genkey -alias tomcat -keyalg RSA -keystore [tomcat home]/.keystore -validity [desired number days the certificate should be valid for]<br />E.g.: <b>"C:\Program Files\Java\jdk1.7.0_05\bin\keytool" -genkey -alias tomcat -keyalg RSA -keystore C:\Tomcat\.keystore -validity 365</b></li>
<li>Provide a password for the keystore and answer questions about your organization. When asked for key password just hit enter. This should create one certificate in the keystore located at
C:\Tomcat\.keystore.</li>
<li>Edit [Tomcat home]/conf/server.xml and html-uncomment the following text:</li>
<i><!--</i>
<i> <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"</i><br />
<i> maxThreads="150" scheme="https" secure="true"</i><br />
<i> clientAuth="false" sslProtocol="TLS" /></i><br />
<i>--></i><br />
<li>Furthermore add to it the following two attributes: <b> <i>keystoreFile="C:\Tomcat\.keystore" keystorePass="YourPassword"</i></b> (inputing values that match your setup) and change the port value to 443.</li>
<li>To redirect all http traffic to https change the line:</li>
<i><Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /></i>
<br />
over to:<br />
<i><Connector port="<b>80</b>" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="<b>443</b>" /></i><br />
<li>That's it. You should now be able to start Tomcat (seet bullet #4) and view Jenkins on http://localhost (which should autoredirect you to https://localhost) or use your actual hostname.</li>
</ul>
Steinn Jónssonhttp://www.blogger.com/profile/03561013028097975228noreply@blogger.com0tag:blogger.com,1999:blog-2241013152284479770.post-34855795230814307052012-06-17T10:02:00.002-04:002012-06-18T05:33:39.963-04:00Agile Tips from Remote Seminar with Henrik Kniberg<div style="text-align: justify;">
Last week Agile netið organized a remote seminar with Henrik Kniberg, award-winning keynote speaker and author of multiple Agile and Lean books. The seminar was held at the Grand Hotel in Reykjavík, where around 10 Icelandic Agile enthusiasts gathered to remote connect to Henrik via Skype and Google Hangout. We listened to Henrik talk about <a href="https://dl.dropbox.com/u/1018963/Projects/2012-01-24%20Lima%20Seminar/Lean%20from%20the%20Trenches.pdf">lessons learned at one of his recent projects</a> and then had a long Q&A session, where we got to ask him all sorts of Agile and Lean related questions. Despite an initial technical hiccup with poor sound quality the event was very enjoyable and informative. Here are some of my take-aways. Basically random tips from the discussions that I found useful.</div>
<ul>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwpziImeTnnw2pfL7GLgqk4_kWwK0MeBuvg-3CtTn0RP626Z0poyZKxVDdiQU-O7mTTyf7evCVS03hpj90DsAInUdNcIl-qSEZpqMx2RcnCvkTyAHOFFsJ45sDY5Mi8INdw1ZsGI-okTzH/s1600/trafficjam.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="105" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwpziImeTnnw2pfL7GLgqk4_kWwK0MeBuvg-3CtTn0RP626Z0poyZKxVDdiQU-O7mTTyf7evCVS03hpj90DsAInUdNcIl-qSEZpqMx2RcnCvkTyAHOFFsJ45sDY5Mi8INdw1ZsGI-okTzH/s400/trafficjam.jpg" width="400" /></a>
<li style="text-align: justify;">If you need to explain to someone the benefits of limiting work in progress when running Kanban, use a traffic jam analogy: When there are not that many cars on a given highway, everything runs smoothly and we have a lot of cars running through the highway. But as we add more cars on the highway, basically everything starts slowing down to a jam and we have fewer and fewer cars that are able to drive the highway to the end. The same thing happens in Kanban if we don't put WIP limits on our queues. Starting more tasks actually causes us to end up finishing fewer.</li>
</ul>
<ul>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9XxHKn8_JChF8mb43ZYE3uaOj2GJuq8Tp8PxIJvYObSFoJD-FOBBm00hF2H90K_s63WN13jtd0Syh2xcU2EltqlqU-ehOwo63RkWSxzHpThqtbM8sHXiEYpmuWor5HxZJ-QEZzzrJgOwu/s1600/Screen+Shot+2012-06-16+at+10.19.30+PM.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: justify;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9XxHKn8_JChF8mb43ZYE3uaOj2GJuq8Tp8PxIJvYObSFoJD-FOBBm00hF2H90K_s63WN13jtd0Syh2xcU2EltqlqU-ehOwo63RkWSxzHpThqtbM8sHXiEYpmuWor5HxZJ-QEZzzrJgOwu/s200/Screen+Shot+2012-06-16+at+10.19.30+PM.png" width="110" /></a>
<li style="text-align: justify;">If you ever need to sell to management the need to pay off a technical debt and refactor some legacy code: print out the longest class, tape the pages together and bring it with you to a meeting! When you show up with a 5 meter long paper strip, showing some monstrosity of a class, people have an easier time visualizing the problem.</li>
<li style="text-align: justify;">When running a Scrum team, think about establishing a rule that each team member that completes a user story needs to ask the team if he can help out with a story that is already in progress before he is allowed to start work on a new one. That encourages cooperation and limits work in progress, increasing the likelihood that we have fully completed stories at the end of the sprint, as opposed to stories that are partially done. If our sprint backlog is 10 stories we would much rather have 8 fully completed stories at the end of the sprint than 6 completed stories and 4 partially done.</li>
<li style="text-align: justify;">According to Henrik, research has shown that incorporating QA into your agile development teams (testing continuously) saves on overall time spent in testing and bug fixing. Meaning that if you test and bug fix as part of each sprint, as opposed to doing a large round of testing at the end of the project followed by a lot of bug fixes, you save time. One reason for this is that when it comes time to fix a bug the code is still fresh in the developer's mind. Also the continuous QA feedback encourages developers to deliver higher quality code. This is visualized in the following illustration from Henrik's <a href="https://dl.dropbox.com/u/1018963/Projects/2012-01-24%20Lima%20Seminar/Lean%20from%20the%20Trenches.pdf">slides</a>:</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_zDqf-JEhC8xvqHcNsK7o8W6fzp5x-Q545TFiQW8M1VlyzkePXWY-8TzAWXYSuMd8L47LKCPI-fgj_F0RI4jtrXoPVOqkrLRqVhHPu0Ik5iER4sx8-Vsw02Aolx6_Bf_tWAh-5IRTL83L/s1600/Screen+Shot+2012-06-16+at+10.34.44+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="276" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_zDqf-JEhC8xvqHcNsK7o8W6fzp5x-Q545TFiQW8M1VlyzkePXWY-8TzAWXYSuMd8L47LKCPI-fgj_F0RI4jtrXoPVOqkrLRqVhHPu0Ik5iER4sx8-Vsw02Aolx6_Bf_tWAh-5IRTL83L/s400/Screen+Shot+2012-06-16+at+10.34.44+PM.png" width="400" /></a></div>
<ul>
<li style="text-align: justify;">Size doesn't matter. According to Henrik having the team categorize user stories into small, medium and large before implementation is not very useful. At the end of his project he calculated actual times spent on user stories and found out that it actually took about the same time on average to implement a story that had been categorized as small as it took to implement a story that had been categorized as medium.</li>
<li style="text-align: justify;">When you are on a large project that comprises multiple teams, try doing finger voting to assess the overall confidence that the project will get delivered on time. Basically, in weekly meetings ask team leads to hold up fingers on one hand representing their confidence that their team will get the required work done on time. Where 5 fingers mean "definitely", 4 fingers mean "likely", 3 fingers "it's a gray line", two fingers "probably not" and one finger means "no way". Track this on a weekly basis. If you get few fingers in the air, you know you have a problem that needs to be addressed.</li>
<li style="text-align: justify;">Try to make your development teams cross functional. Each team should comprise all the skills required to fully deliver a feature (e.g. graphics designer, front-end developer, back-end developer, DBA, tester). If a resource is needed at least 50% of the time put him on the team. Make sure everyone has a home team, even though they might be outsourced to other teams from time to time.</li>
<li style="text-align: justify;">To check the health of a Scrum team use the <a href="http://www.crisp.se/gratis-material-och-guider/scrum-checklist">Scrum check-list</a>.</li>
</ul>
<div style="text-align: justify;">
<br /></div>Steinn Jónssonhttp://www.blogger.com/profile/03561013028097975228noreply@blogger.com2tag:blogger.com,1999:blog-2241013152284479770.post-87930026592990938892012-01-17T18:55:00.006-05:002012-07-23T06:15:05.470-04:00Ský Development Conference (Links in Icelandic)<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjP-pBfLqoexpMF8R11xQDmzWQwYU8_D1X_Ze4qszhanWX_za0pmJIWmQySgPbCbTRwW83az7GiI5AfBB5_TGrc4eNHGmoFio2mSQogIqvAJHdKjtndKznpf7r1xZLbiDftn1Za1WQAoq-z/s1600/skylogo2.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="110" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjP-pBfLqoexpMF8R11xQDmzWQwYU8_D1X_Ze4qszhanWX_za0pmJIWmQySgPbCbTRwW83az7GiI5AfBB5_TGrc4eNHGmoFio2mSQogIqvAJHdKjtndKznpf7r1xZLbiDftn1Za1WQAoq-z/s200/skylogo2.png" width="200" /></a></div>
<div style="text-align: justify;">
Last week I had the pleasure of presenting at the annual Ský Development Conference (Hugbúnaðarrástefna Ský) in Reykjavík, Iceland. This year's conference theme was "The Work Environment of Software Developers". The conference offered presentations on the following topics: Programming Languages, Quality Assurance, Issue Tracking, User Interfaces, Project Management, Databases and Data Warehousing. My presentation was under the Project Management topic, titled "Practical Tips for Software Development Leads". In it I tried to provide some practical tips to team leads and software development managers. Suggestions on such things as how to get the most out of your team, how to manage your time, how to use programming to help with your managerial duties, how to achieve continuous improvement and how to motivate developers. The conference was all in Icleandic, so unfortunately so are the slides. They are available on the <a href="http://www.sky.is/index.php?option=com_content&view=article&id=1532:2012-vinnuumhverfi-forritarans&catid=16&Itemid=146">conference web site</a> and on <a href="http://www.slideshare.net/steinnjonsson/praktsk-r-fyrir-forritara-sem-leia-hugbnaarrun-10977271">Slideshare</a> (mine).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
I especially liked Ólafur Gauti Guðmundsson's presentation on the <a href="http://sky.is/images/stories/2012_SkjolOgMyndir/Play.pdf">Play framework</a>, which I have been playing with a bit and Stefán Baxter's presentation on <a href="http://sky.is/images/stories/2012_SkjolOgMyndir/NoSql%202012.pdf">NoSQL</a> databases. Margrét Dóra also had a great talk on <a href="http://sky.is/images/stories/2012_SkjolOgMyndir/MaggaDora-SKY2012.pdf">user interfaces</a>, reminding us that "stupid users" are really our own fault, a result of poor user interface design. And Birna Íris Jónsdóttir had a good <a href="http://www.sky.is/images/stories/2012_SkjolOgMyndir/birna.pdf"><span id="goog_1128703610"></span>QA talk<span id="goog_1128703611"></span></a> titled "It works on my machine!" where she took some shots at us programmers for all the lame excuses we provide when our stuff breaks! :) All in all a fun day and an enjoyable conference.</div>Steinn Jónssonhttp://www.blogger.com/profile/03561013028097975228noreply@blogger.com0tag:blogger.com,1999:blog-2241013152284479770.post-6719329258657008692012-01-15T10:51:00.003-05:002012-03-19T20:12:24.820-04:00Quickly Launch Remote Desktop Connections on Mac OS XAt work and at home I have a few PC servers that I frequently need to remote connect to. My Mac launcher application of choice is <a href="http://www.alfredapp.com/">Alfred</a>. I wanted to be able to use it to instantly launch connections to those servers without needing to type in anything but the first few letters of the server name. Getting this setup on Mac OS X is a bit of a hassle, but here is basically what I do:<br />
<ul><li>I use the <a href="http://www.microsoft.com/mac/remote-desktop-client">Remote Desktop Connection Client for Mac</a> to connect to the PC servers.</li>
<li>After installing the client and typing in the name of the server I want to connect to I go to preferences and customize the connection:</li>
</ul><ol><ul><li>Under the Login tab I enter account information</li>
<li>Under the Display tab I specify my preferred remote desktop size</li>
<li>Sometimes I tweak some of the other settings, but those two are of main importance</li>
</ul></ol><ul><li>Then I go to File and Save As... and save this connection as a .rdp file on my Mac</li>
<li>Now I can double-click on the file to be instantly connected to the remote server</li>
<li>Problem is that application launchers don't really know how to run .rdp files, so I want to take it a step further and create a runnable Mac Application for each .rdp file. To do this I use an open source program called <a href="http://sveinbjorn.org/platypus">Platypus</a>, that a <a href="http://twitter.com/hugith">coworker of mine</a> told me about. </li>
<li>Unfortunately Platypus does not know how to run .rdp files, but it does know how create Applications that launch shell scripts. Hence, I create a simple shell script to launch my remote desktop connection. E.g. if I want to launch SteiniServer.rdp, then my script would look like this:<br />
<br />
<i>open "/Applications/Remote Desktop Connection.app" ~/Documents/RDC/SteiniServer.rdp<br />
<br />
</i></li>
<li>Then I save the script on my computer in a file called rdcSteiniServer.sh</li>
<li>Now I open Platypus and use it to create a Mac Application with the following settings:</li>
</ul><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAG6kUNyNWCPAzgMMDb332cj1c-dFT-1BWck-VozeoE4Ndt5sTB9LzYfvuhIId3Ou7myWdA_Y-ZvKI2Hm9aJteQZtmeiLTTrPignffPP60HAWIrvW1RHeGt3lESlMMZnSWuL9uYHDWy1TH/s1600/Screen+Shot+2012-03-20+at+12.06.17+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="550" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAG6kUNyNWCPAzgMMDb332cj1c-dFT-1BWck-VozeoE4Ndt5sTB9LzYfvuhIId3Ou7myWdA_Y-ZvKI2Hm9aJteQZtmeiLTTrPignffPP60HAWIrvW1RHeGt3lESlMMZnSWuL9uYHDWy1TH/s640/Screen+Shot+2012-03-20+at+12.06.17+AM.png" width="640" /></a></div></div><div>(If you want to add a custom icon for your application you can right-click the image and choose Select Image File...)<br />
</div><div>The only thing that really matters is selecting Script Type Shell and the path to your script.<br />
<ul><li>Then I hit Create and select:</li>
</ul><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaLS6xxUIOrrgThgyC4QHkD8r-amf5xxdGGyRDIAqXybl3tw9xLYUX-2p_bdFjChJuMmyJfYv-MfnnOLNRAkDrQkWvPpRammGwTBjQmk4-qdwGX6EjyWCoxZ03wYLmcA1Ea1BXKc4lkj0J/s1600/CreateApplication.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="164" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaLS6xxUIOrrgThgyC4QHkD8r-amf5xxdGGyRDIAqXybl3tw9xLYUX-2p_bdFjChJuMmyJfYv-MfnnOLNRAkDrQkWvPpRammGwTBjQmk4-qdwGX6EjyWCoxZ03wYLmcA1Ea1BXKc4lkj0J/s320/CreateApplication.png" width="320" /></a></div><div><br />
</div><ul><li>Now I am ready to launch my remote connection with Alfred, which I do like this:</li>
</ul><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijwZnO8rkhmqh3nSUA3Em-Ui2meaqgyVECqcTrxJftj0zqPv-bpC06xJyDu7t-KYr7__1vtn3OWq_oKlQjuX9egPnze-tD9o__5LqnNJNrHzbn1sD4q21Ba4PNRL2L7n1MckDwaV1rjZq6/s1600/Alfred.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="93" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijwZnO8rkhmqh3nSUA3Em-Ui2meaqgyVECqcTrxJftj0zqPv-bpC06xJyDu7t-KYr7__1vtn3OWq_oKlQjuX9egPnze-tD9o__5LqnNJNrHzbn1sD4q21Ba4PNRL2L7n1MckDwaV1rjZq6/s320/Alfred.png" width="320" /></a></div><div><ul><li>Basically, I activate Alfred (Ctrl-A for me) and as soon as I have typed in RDC it finds the RDC Steini Server Application and when I hit enter I am automatically logged into the remote PC server without having to type in anything else.</li>
</ul><ol></ol><div><br />
</div></div></div><div>If you have a simpler way of achieving the same I am eager to hear :-)</div>Steinn Jónssonhttp://www.blogger.com/profile/03561013028097975228noreply@blogger.com5tag:blogger.com,1999:blog-2241013152284479770.post-22111153560621855782011-08-30T10:00:00.000-04:002011-08-30T10:00:06.742-04:00Web Service Testing with soapUI<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhej220n5_DDsD4QmaXZvi5nBnBbp9kDiTkXAd1rFwHZuNX_YP9g1MakMhKBuERDlf3naetbt4DMnmK9R08j1iLnk0e6rYKRzZ1__B6nNqgwgfq-OU94QBkoxFKDxx7d2BmrpysvxFT6MuP/s1600/Screen+shot+2011-06-09+at+11.17.23+AM.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="194" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhej220n5_DDsD4QmaXZvi5nBnBbp9kDiTkXAd1rFwHZuNX_YP9g1MakMhKBuERDlf3naetbt4DMnmK9R08j1iLnk0e6rYKRzZ1__B6nNqgwgfq-OU94QBkoxFKDxx7d2BmrpysvxFT6MuP/s200/Screen+shot+2011-06-09+at+11.17.23+AM.png" width="200" /></a></div>For a few years now I have used the open source application <a href="http://www.soapui.org/">soapUI</a> to simplify Web Service testing. Both to test services that I have written and to test external services that I have had to consume. In this post I'll cover the basic types of testing you can do with soapUI and provide some practical tips on how to use soapUI when working with Web Services. If you don't want to go through the detailed examples I suggest jumping straight to the Practical Tips section at the end.<br />
<br />
<span style="font-size: large;">Getting Started</span><br />
<br />
After <a href="http://sourceforge.net/projects/soapui/files/">downloading</a> and installing soapUI the easiest way to get started is to create a new project from an initial WSDL or WADL. For demonstration purposes I'll use the free Weather Web Service at <a href="http://www.webservicex.net/globalweather.asmx">http://www.webservicex.net/globalweather.asmx</a>. We will create a test for each operation in this SOAP Web Service. We will also create a Test Suite, that allows us to run all our tests at the click of a button. Furthermore, we will create a Load Test for our Test Suite and a Mock Service to simulate the functionality of the Web Service.<br />
<br />
To do this go to <i>File</i> and select <i>New soapUI Project</i>. Populate the New soapUI Project screen in the following manner and click <i>OK</i>:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJJ7EZUSwcJB1X9Ov3P_7rrBUPWHYr_2Abw77Pj7rzRrzztlfsTXZprm7SBkLtVdy5RuORyrOQbpy5nviW3l9uhokg7B50_uOrGDad2XRBx4ufG0jiqyw4o0v1kgqUY6aT4bPZB7yExec_/s1600/Screen+shot+2011-08-29+at+9.33.32+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="371" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJJ7EZUSwcJB1X9Ov3P_7rrBUPWHYr_2Abw77Pj7rzRrzztlfsTXZprm7SBkLtVdy5RuORyrOQbpy5nviW3l9uhokg7B50_uOrGDad2XRBx4ufG0jiqyw4o0v1kgqUY6aT4bPZB7yExec_/s640/Screen+shot+2011-08-29+at+9.33.32+AM.png" width="640" /></a></div>Basically, paste the URL to the web service WSDL file into the Initial WSDL/WADL field and additionally check the field to generate a MockService. SoapUI will now load the Web Service definition and ask you questions about how to create the MockService:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEive206TBJw5YWISZFv8W4PXwLLIPhmPx91y93gWHDsoZt7YTTNvmYEn-h9no3c-NbvwEIKsvpEpf4d6y6KlkFxpGK4wkWIX8SXMva9-oytke23RkEyLGtMrO2vNPFK3lc67sSnT_vGETGJ/s1600/Screen+shot+2011-08-08+at+11.23.11+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="432" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEive206TBJw5YWISZFv8W4PXwLLIPhmPx91y93gWHDsoZt7YTTNvmYEn-h9no3c-NbvwEIKsvpEpf4d6y6KlkFxpGK4wkWIX8SXMva9-oytke23RkEyLGtMrO2vNPFK3lc67sSnT_vGETGJ/s640/Screen+shot+2011-08-08+at+11.23.11+AM.png" width="640" /></a></div>For this demonstration change the path to "/WeatherMock" and check the <i>Starts the MockService immediately</i> checkbox, but otherwise accept the defaults. After clicking <i>OK</i>, specify the name of the Mock Service as "Weather MockService" (or a name of your choice) and click <i>OK</i> again. <br />
<br />
This will complete generating artifacts for the SOAP 1.2 version of the GlobalWeather Web Service.<br />
Next you will be asked the exact same questions, for the SOAP 1.1 version. Since we don't plan to use SOAP 1.1 you can just hit <i>Cancel</i>. (I haven't found a way to configure soapUI to only generate artifacts for SOAP 1.2. If you know how to, please let me know! :)<br />
<br />
<span style="font-size: large;">Running Tests</span><br />
<br />
To execute a given test, drill down to the requests that soapUI auto-generated and insert values that make sense for the given Web Service operation. In our case, in the Navigator on the left, click on <i>GlobalWeatherSoap12</i>, then <i>GetCitiesByCountry</i> and then double-click on <i>Request 1</i>. <br />
We'll set the Country name as <i>Iceland</i> and then hit the green arrow button to execute the test.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPJMVpHYZ7LpF145MLp2Kot5oSTUfn0ulxJEdtvsDF70xgKYYrW7_TbczwZahHSDFKoAbl_5ypQoTikwIYANGFRdVZgyXJohgEZsmpKfQ5mb75-JRXD2a_6SUGaIdsf-CIMj8LMNDrKS1f/s1600/Screen+shot+2011-08-18+at+11.51.11+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="404" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPJMVpHYZ7LpF145MLp2Kot5oSTUfn0ulxJEdtvsDF70xgKYYrW7_TbczwZahHSDFKoAbl_5ypQoTikwIYANGFRdVZgyXJohgEZsmpKfQ5mb75-JRXD2a_6SUGaIdsf-CIMj8LMNDrKS1f/s640/Screen+shot+2011-08-18+at+11.51.11+AM.png" width="640" /></a></div>Voila, you should get results back from the Web Service, a list of Icelandic cities. To check if the Web Service response is valid (conforms to the WSDL), right-click in the results window and click Validate.<br />
<br />
Lets give this test the name "City Test". (Right-click Request 1 and select rename) <br />
Then do a similar test for the GetWeather operation. Click on <i>GetWeather</i> and then double-click on <i>Request 1</i>. Put in <i>"</i>Reykjavik<i>"</i> for CityName and <i>"</i>Iceland" for CountryName and run the test. Also rename the test to "Weather Test". After running the test, the results should look something like this:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5kXeLt0jwdgkvZ4MdeGpciaUmJvgUimVby6LI3QZUHbJi2HPBTprSGFWuFPixL6xP64T4og0jVwMGWMnN-j8cDmLXYi-R9jCP2sht_L9KIK9BB3bDjP27uSfxyw1u7l6-6ul0ZC_B_C-b/s1600/Screen+shot+2011-08-18+at+5.45.31+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="318" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5kXeLt0jwdgkvZ4MdeGpciaUmJvgUimVby6LI3QZUHbJi2HPBTprSGFWuFPixL6xP64T4og0jVwMGWMnN-j8cDmLXYi-R9jCP2sht_L9KIK9BB3bDjP27uSfxyw1u7l6-6ul0ZC_B_C-b/s640/Screen+shot+2011-08-18+at+5.45.31+PM.png" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"></div><span style="font-size: large;">Build a TestSuite</span><br />
<br />
Now that we have created two tests, lets add them to a TestSuite so we can easily re-run them at any time. In the Navigator on the left, right-click GlobalWeatherSoap12 and select Generate TestSuite. Select <i>Use existing Requests in interface</i>, and check <i>Generates a default LoadTest for each created TestCase </i>and <i>Single TestCase with one Request for each Operation</i>: <br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimeHneUfJhPewHntJ35YB9ld44CCAbyqGV2pLGhdUzk4bNEE-gtZa5ekJIvDCPz6Yt-MZu1Q4NlQv5NPmn2IewP8Fk_1-spTojbbHoGY84hb1GHtL1dAi2LLy8Tk3YCR1PDC9HnyC4zjBq/s1600/Screen+shot+2011-08-30+at+12.23.43+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="330" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimeHneUfJhPewHntJ35YB9ld44CCAbyqGV2pLGhdUzk4bNEE-gtZa5ekJIvDCPz6Yt-MZu1Q4NlQv5NPmn2IewP8Fk_1-spTojbbHoGY84hb1GHtL1dAi2LLy8Tk3YCR1PDC9HnyC4zjBq/s400/Screen+shot+2011-08-30+at+12.23.43+AM.png" width="400" /></a></div>After clicking OK give the TestSuite the name "Weather TestSuite". Double-click on <i>GlobalWeatherSoap12 TestSuite</i> under <i>Weather TestSuite</i> to show the TestCase editor.<br />
Then click the green arrow button to run the TestSuite. If all goes well you should be presented with a results-screen like this, indicating a successful test run:<br />
<br />
<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/AVvXsEhALRCheeEPcPTIDOr9GKsbX-3jBIvY7mZdEcgGJKv2K8t7FA11bxa24Cz2J8KRR2K1x9Gw10F6MJQC70yaPIoWA604xFYUbeyiketS7MMmivMifgSDFZb-hREpH3-FM6hMZ7RdvOcqLFpQ/s1600/Screen+shot+2011-08-25+at+10.03.41+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="375" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhALRCheeEPcPTIDOr9GKsbX-3jBIvY7mZdEcgGJKv2K8t7FA11bxa24Cz2J8KRR2K1x9Gw10F6MJQC70yaPIoWA604xFYUbeyiketS7MMmivMifgSDFZb-hREpH3-FM6hMZ7RdvOcqLFpQ/s400/Screen+shot+2011-08-25+at+10.03.41+AM.png" width="400" /></a></div><br />
If the TestSuite run fails you'll see FAILED at the top instead of FINISHED and you should get a message explaining why a given test failed.<br />
<br />
<span style="font-size: large;">Add Assertions</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;"></div>To make the tests more meaningful lets add some assertions to validate the responses from the Web Service we are calling. You do this by opening up the test Request Editor (double-click on a given test step under TestSuite in the Navigator) and then click the plus-sign next to the green arrow button (second from the left).<br />
<br />
For both tests lets add the assertion called <i>SOAP Response</i>, to ensure the Web Service is returning a valid SOAP response. Then add the assertion called <i>Response SLA</i> and specify the response time as 2000 ms. That basically means that we are going to consider the test a failure if we don't get a response within two seconds. Lastly, lets add some content validation by selecting a <i>Contains</i> validation. For the GetCitiesByCountry operation add the string "<country>Iceland</country>" as the content to expect in the response, and for the GetWeather operation add the string "<status>Success</status>". <br />
<br />
Then run the TestSuite again to make sure you get success-results.<br />
<br />
<span style="font-size: large;">Run a Load Test</span><br />
<br />
When we created the TestSuite in last step, we told soapUI to generate a Load Test as well. You'll find it under the TestSuite in the Navigator on the left, under the heading Load Test. The default name is LoadTest 1. Double click on it in the Navigator to open it up. Before running the LoadTest you can tweak such parameters as number of concurrent threads to run, length of the test-run, and delay between tests. Once you have made the desired configurations hit the green arrow button to run the Load Test:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOlvLU4jCP8WgGFTz5Q9oz5oNwDohsYnTJrq7so5dN6JJ5W0zSIizHoWg8gR_8DlsRwyz2lS3Savqg904DcfJFR9gv1ITt5K5AJr2SRPeR8bavtZ10v8PMnADBndj1mSKlnQ3QlNKQ2bGI/s1600/Screen+shot+2011-08-25+at+10.55.02+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="235" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOlvLU4jCP8WgGFTz5Q9oz5oNwDohsYnTJrq7so5dN6JJ5W0zSIizHoWg8gR_8DlsRwyz2lS3Savqg904DcfJFR9gv1ITt5K5AJr2SRPeR8bavtZ10v8PMnADBndj1mSKlnQ3QlNKQ2bGI/s640/Screen+shot+2011-08-25+at+10.55.02+AM.png" width="640" /></a></div><br />
In this sample, 5 concurrent threads are running the TestSuite for 60 seconds with a random wait of up to 1 second between the start of each test.<br />
You can track the progress of the load test with the progress bar in the upper right corner. If it reaches a 100% without reporting any test errors you are good to go.<br />
<br />
<span style="font-size: large;">Use the Mock Service</span><br />
<br />
Back when we imported the Weather Web Service we told soapUI to generate and start a Mock Service. That service can now be accessed at http://localhost:8088/WeatherMock. This is convenient for example if you are developing against a Web Service that has been designed (WSDL/WADL available) but not yet implemented. Then you can have the Mock return an actual Web Service response to test your code even though the actual implementation hasn't been completed. A default response has already been generated (under WeatherMock Service, GetCitiesByCountry, and Response 1), which you can edit as you like.<br />
<br />
You can also have the Mock service return different responses depending on which request it receives. To demonstrate this, lets create two new MockResponses for the GetWeather operation:<br />
<ul><li>Click on GetWeather under the Weather MockSerive in the Navigator and select <i>New MockResponse</i>. </li>
<li>Give it the name "ReykjavikWeatherResponse". Accept the automatically generated response, but put the value "Reykjavik" in the GetWeatherResult tag. (Or even better copy the actual response from calling GetWeather for Reykjavik, which should give you a fully valid response). </li>
<li>Create another response called <i>AkureyriWeatherResponse</i> and put the text <i>"</i>Akureyri<i>"</i> in the GetWeatherResult tag. </li>
</ul>Now put logic in the Mock service for when to return each response:<br />
<ul><li>Double-click on GetWeather in the Navigator to show the MockOperation Editor. </li>
<li>Select ReykjavikWeatherResponse under MockResponses.</li>
<li>Select QUERY_MATCH under Dispatch.</li>
<li>Click the plus sign to add a new match. </li>
<li>Give it the name <i>"</i>Reykjavik". </li>
<li>Select Reykjavik and then populate the XPath value with:<br />
<br />
<i>declare namespace web='http://www.webserviceX.NET';<br />
declare namespace soap='http://www.w3.org/2003/05/soap-envelope';<br />
/soap:Envelope/soap:Body/web:GetWeather/web:CityName</i><br />
<br />
This XPath query will grab the value from the CityName tag.</li>
<li>Under <i>Expected Value</i> enter "Reykjavik".</li>
<li>Under <i>Dispatch to</i>, select ReykjavikWeatherResponse.</li>
<li>Repeat the same steps to create a Match that returns AkureyriWeatherResponse when the city name in the request is Akureyri.</li>
</ul>Now you can test your mock Match-logic by opening up your GetWeather test and adding http://localhost:8088/WeatherMock as the endpoint to use (select the current endpoint in the dropdown and pick <i>add new endpoint...</i>). Then run the test and play around with changing the city name in the request to get different responses from the Mock service.<br />
<br />
Additionally, if you want to test your client-side error handling you can have soapUI generate a soap:Fault response and have your Mock return it. You do that by creating a MockResponse and then clicking the apostrophe icon in the MockResponse Editor. Then edit the auto generated response as appropriate.<br />
<br />
<span style="font-size: large;">Practical Tips: What to use soapUI for</span><br />
<br />
Now that we have covered the basics of soapUI, here are some practical tips for putting it to use during your software development.<br />
<br />
<u>Test Web Services You Have to Consume</u><br />
<br />
When consuming external services, before delving into code, use soapUI to "kick the tires" of the Web Service. This especially applies when consuming newly written services. Rather than potentially spending hours pulling your hair over why your client code isn't working, spend a few minutes with soapUI validating and getting familiar with the Web Service you are about to consume. In particular:<br />
<ul><li>Create and run simple tests for key Web Service operations</li>
<li>Make sure there are no security/access problems</li>
<ul><li>Is the web service using some proprietary authentication protocol (NTLMv2 comes to mind) that might give you trouble during implementation?<br />
</li>
</ul><li>Have soapUI validate that responses conform to the Web Service contract (WSDL/WADL)</li>
<li>Visually inspect responses </li>
<ul><li>Do they make sense or are they some illegible auto generated garble that should really be cleaned up and restructured by the Web Service developer? </li>
<li>Do the responses meet your needs?</li>
</ul><li>Test a few boundary cases</li>
<ul><li>Does the Web Service implement proper error handling? Or does it blow up with an HTTP 500 error or some non SOAP compliant text message? Does the level of error reporting meet your needs?</li>
</ul><li>Add all your tests to a TestSuite. That way you can quickly "ping" the Web Service to make sure everything is working on the other end. When a problem arises, taking your code out of the loop is a good way to make sure the issue is on the remote end and not with your own code.</li>
</ul>When developing against a newly written external Web Service, it is very rare that the Web Service works 100% out of the box as expected. There is usually a fair amount of communication needed between the Web Service developer and the client-side developer to tweak things until the Web Service works as needed. By using soapUI, you can inspect the Web Service right at the time it is delivered to you, and quickly spot things that may need to be fixed. I usually take 5 or 10 minutes to do so and almost always have a list of things that need to be modified. The response time for getting those changes implemented is usually very short, as the Web Service developer is still engaged in the project and things fresh in his mind. If I don't get back to him/her until some weeks later when I finally get around to implementing my client-side code, the other developer has probably moved onto other things and/or forgotten why he implemented the service in a certain way. <br />
<br />
Lastly, if you have received a WSDL/WADL file, but the service hasn't actually been implemented, and you NEED to start implementation against the service (not ideal), then consider using soapUI to create a Mock service from the WSDL/WADL file. That way you can have your code hit the Mock service and at least get some preliminary feedback on whether your client code is working. Since creating a Mock service is really a breeze with soapUI it can sometimes be more practical than implementing Mock objects in your code.<br />
<br />
<u>Test Your Own Web Services</u><br />
<br />
When writing a Web Service for others to consume it can be handy to have a soapUI TestSuite to sanity test your service. Of course you should still write unit and integration tests for your code, but having a good soapUI TestSuite can be quick and easy way to find out if all your services are running as expected. When you get that 4 AM phone call saying that something is broke, fire up soapUI and at the click of a button sanity test all of your Web Service operations. If you are smart, you'll hand the TestSuite over to a support team so that you only get woken when the issue truly is on your end ;-) Just make sure to add proper assertions for Web Service responses and include SLA assertions to test that things are not running dead slow.<br />
<br />
If you are concerned about the performance of your Web Service or whether it can handle a given load, then a soapUI Load Test can be a convenient way to test that. Set the number of threads to imitate the expected number of concurrent users for your service and add SLA assertions to make sure all requests are handled in a timely fashion. Of course generating all the load from a single machine does not quite imitate real traffic, so for truer numbers consider having coworkers assist you in running simultaneous Load Tests from multiple machines.<br />
<br />
Steinn Jónssonhttp://www.blogger.com/profile/03561013028097975228noreply@blogger.com6tag:blogger.com,1999:blog-2241013152284479770.post-47045144138719682852011-06-30T21:41:00.003-04:002011-06-30T22:06:23.570-04:00Kanban with David Anderson<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; text-align: right;"><tbody>
<tr><td style="text-align: center;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFzvKlvWL_6aSasidYI-wJR-CH2CQIOOtaxfwuEVIrnHk_4iOQKsEauEULLLtgJNUPtQxiGv4AjzKdEAB2EMPtyS6dVIASoRBluIMrQX7M2YjFSp1ern3ZlZTxLee91hATqCMBYi-eDrsb/s320/photo+1.JPG" style="margin-left: auto; margin-right: auto;" width="320" /></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><br />
</td></tr>
</tbody></table>This week I enjoyed attending a two day Kanban training class by <a href="http://agilemanagement.net/index.php/bio_david/">David Anderson</a>, the Father of Kanban-style software development. The class provided an overview of Kanban and offered many tips on how to get the most out of Kanban. David rolled through a deck of some 150 slides and answered various questions. On the practical side, the class was divided into four teams and each team had to design a Kanban board for an actual company and then play an entertaining <a href="http://www.getkanban.com/">Kanban game</a>, which turned out to be quite competitive. The team I was on, Grand Kanban :) managed to squeeze out a slim victory with around $62,000 in revenue, which according to David was a pretty good score ;-)<br />
<br />
Few points from the class: <br />
<br />
<b>The Kanban Method is based on three core principles:</b><br />
<ul><li> Start with what you do now</li>
<li> Agree to pursue incremental evolutionary change</li>
<li> Initially, respect current processes, roles, responsibilities & job titles</li>
</ul><br />
<b>The five keys to a successful Kanban implementation are</b>:<br />
<ul><li> Visualize Workflow</li>
<li> Limit Work-in-Progress</li>
<li> Manage Flow</li>
<li> Make Process Policies Explicit</li>
<li> Improve Collaboratively (using models & scientific method)</li>
</ul><b><br />
Key class takeaways according to Dave were:</b><br />
<ul><li>Kanban is like water </li>
<ul><li><i>It goes around obstacles and slowly changes them, rather than removing them like a bulldozer </i></li>
</ul><li>Change has to come from within</li>
<ul><li><i>How many experts does it take to change an organization? Answer: One. <u>But people are going to have to want to change</u></i></li>
</ul></ul><b><br />
Surprising fact from the class:</b> <br />
<br />
According to a research done by David, getting more done only <u>ranks number 4</u> on most manager's lists! The list of their preference being:<br />
<ol><li>Predictability</li>
<li>Business Agility (ability to respond to changes in market)</li>
<li>Good Governments (managing budgets, money spent the way intended, etc.)</li>
<li>Getting more done</li>
</ol><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMxqnxWAtf4qElLHHx2kJtJxxAoASxlxSplu6XL5SPzNxXzVFnrsCSCL7qNCdg60La5xUDlOV96g5F0HHpEthY6JZo4lgUWO009AgyzlYdDF1XRHBtGdldzsrke9-Do2RjQzqoTF0uk0LJ/s1600/photo+2.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><br />
<img border="0" height="239" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMxqnxWAtf4qElLHHx2kJtJxxAoASxlxSplu6XL5SPzNxXzVFnrsCSCL7qNCdg60La5xUDlOV96g5F0HHpEthY6JZo4lgUWO009AgyzlYdDF1XRHBtGdldzsrke9-Do2RjQzqoTF0uk0LJ/s320/photo+2.JPG" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Playing the Kanban game</td></tr>
</tbody></table><br />
All in all a good class and I look forward to continuing the improvement of Kanban at <a href="http://www.hugsmidjan.is/">Hugsmiðjan</a> where we develop the <a href="http://www.eplica.com/">Eplica CMS</a>.Steinn Jónssonhttp://www.blogger.com/profile/03561013028097975228noreply@blogger.com0