<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>iBlog, iByte, iBrianiBlog, iByte, iBrian &#187; Technology</title>
	<atom:link href="http://blog.brianbuikema.com/category/technology/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.brianbuikema.com</link>
	<description>Technology Moves as Fast as We Move It by Brian Buikema</description>
	<lastBuildDate>Tue, 05 Mar 2013 15:33:33 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Software Architecture:  Creating a Solutions Architecture</title>
		<link>http://blog.brianbuikema.com/2012/10/software-architecture-creating-a-solutions-architecture/</link>
		<comments>http://blog.brianbuikema.com/2012/10/software-architecture-creating-a-solutions-architecture/#comments</comments>
		<pubDate>Sun, 21 Oct 2012 04:38:56 +0000</pubDate>
		<dc:creator>Brian Buikema</dc:creator>
				<category><![CDATA[Architecture & Design]]></category>
		<category><![CDATA[Enterprise]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[Solutions Architecture]]></category>
		<category><![CDATA[Startups]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[solutions architecture]]></category>
		<category><![CDATA[startups]]></category>

		<guid isPermaLink="false">http://blog.brianbuikema.com/?p=1398</guid>
		<description><![CDATA[Overview A Solutions Architecture aims to address specific problems and requirements, usually through the design of specific information systems or applications, and typically accommodates many different audiences as it addresses direct business and technical concerns without dropping down to the nuts and bolts of the software architecture. Note, that I provided a link to Wikipedia&#8217;s definition, but I [...]]]></description>
			<content:encoded><![CDATA[<h1>Overview</h1>
<p>A <a href="http://en.wikipedia.org/wiki/Solution_architecture"><em>Solutions Architecture</em></a> aims to address specific problems and requirements, usually through the design of specific information systems or applications, and typically accommodates many different audiences as it addresses direct business and technical concerns without dropping down to the nuts and bolts of the software architecture.</p>
<p>Note, that I provided a link to Wikipedia&#8217;s definition, but I have expanded that definition to be more specific regarding its intended audiences and provided level of detail.</p>
<p>It should be noted, that my intention is not to advocate a Solutions Architecture as another tedious task in the software development process, but to provide a <em>software architecture practice</em> that is</p>
<ul>
<li>practical and useful by a broad audience,</li>
<li>flexible in its composition, and</li>
<li>well understood, especially by business and technical folks.</li>
</ul>
<p>Many times, I&#8217;ve seen the impedance mismatch, e.g., technical jargon, business jargon, expectations, communications, etc&#8230;, go unnoticed, or ignored, far too long.  A Solutions Architecture provides a proven strategy to effectively guide architecting software systems.</p>
<p>In this post, I delve into the concept of <em>Current State Architecture</em> and <em>Future State Architecture </em>and how identifying these help guide us to the ultimate goal, the <em>Solutions Architecture.  </em>If it is discerned through the Solutions Architecture, that the current state architecture is unacceptable, work can begin on creating the future state software architecture.</p>
<p>Please click on the link if you are looking for information on helping you determine</p>
<blockquote><p><a href="http://blog.brianbuikema.com/2012/10/software-architecture-when-is-it-time-to-revisit-your-current-software-architecture/">&#8220;When is it time to revisit my current software architecture?&#8221; - another post by B. Buikema</a></p></blockquote>
<h1>Solutions Architecture</h1>
<p>A Solutions Architecture is typically written as slides, e.g., a powerpoint presentation, not straight-up, highly-textual, documentation.  It is comprised of content and diagrams that provide a 360 degree view of a software architecture as a total solution.  Details such as algorithms, code snippets, detailed designs (i.e., UML class, sequence, state, etc&#8230;) are typically omitted.</p>
<blockquote><p>NOTE:  Companies typically have business and engineering folks whose tolerance for documentation is either small or large, and this is driven by the company culture.  I recommend that the Solution Architecture is kept as tight and to-the-point as possible to match this tolerance.  However, make sure that any items deemed important by folks are, in fact, included to ensure buy-in by all parties.  I will also identify those items I believe are absolutely necessary.</p></blockquote>
<p>Typical items found in a Solutions Architecture are</p>
<ul>
<li>Statement of Work (SOW)</li>
<li>Goals</li>
<li>Considerations</li>
<li>Use Cases</li>
<li>Conceptual Architecture</li>
<li>Logical Architecture</li>
<li>Security Architecture</li>
<li>Information Architecture</li>
<li>Physical Architecture</li>
<li>Network Operations Center (NOC) Requirements</li>
<li><em>CURRENT STATE:</em>  Discussion of Business and Technical Gaps</li>
<li><em>FUTURE STATE:</em>  Solutions to Business and Technical Gaps</li>
<li>Non-Functional Requirements (NFR&#8217;s)</li>
<li>Engineering Development Staffing Requirements (e.g., roles/skills)</li>
<li>NOC Staffing Requirements (e.g., roles/skills)</li>
<li>Operations Staffing Requirements (e.g., roles/skills)</li>
</ul>
<h2>SOW</h2>
<p>This is the statement of work and is usually a paragraph or two describing the intent of the system or application.</p>
<h2>Goals</h2>
<p>Provide key goals important to both the business and engineering.</p>
<h2>Considerations</h2>
<p>Key considerations include, but are not limited to</p>
<ul>
<li>targeted business markets/consumers</li>
<li>targeted technologies/platforms</li>
<li>keeping legacy features (or not)</li>
<li>short and/or long-term business plans</li>
<li>short and/or long-term technical plans</li>
<li>user privacy policies</li>
<li>sensitivity to cost and time</li>
</ul>
<h2>Use Cases</h2>
<p>These are typically high-level and include all major actors and relevant use cases.  Include all roles and responsibilities, and, if you&#8217;re unsure, it is better to include than exclude.</p>
<h2>Conceptual Architecture</h2>
<p>This is the loosest of the architecture diagrams, but can set the stage for understanding the  other architectural views.</p>
<p>The Conceptual Architecture provides a view depicting high-level, conceptual systems, subsystems, and/or applications, and their importance to the actors and use cases.  This is commonly just arrows from the actors to a high-level component and stating the high-level use case it represents.  There are typically no hard and fast rules in creating a Conceptual Architecture, but it is useful when discussing the high-level architecture.</p>
<h2>Logical Architecture</h2>
<p>The Logical Architecture depicts the logical view of the system or application and commonly identifies the main software components as follows:</p>
<ul>
<li>systems</li>
<li>subsystems</li>
<li>applications</li>
<li>servers (such as email and web servers)</li>
<li>services</li>
</ul>
<p><span style="font-size: medium;"><span style="line-height: 24px;">A Logical Architecture need not concern with the attributes of the physical environment.<br />
</span></span></p>
<div>
<h2>Security Architecture</h2>
<p>The Security Architecture typically includes details on</p>
</div>
<ul>
<li>data in flight</li>
<li>data at rest</li>
<li>authentication and authorization</li>
</ul>
<h2>Information Architecture</h2>
<p>The Information Architecture may include core data schemas, data flows, transactions, workflows, etc,&#8230; NOTE:  It&#8217;s advisable not to delve to deep on these, keep them at high-level to satisfy the use cases and come of the other architecture diagrams.</p>
<h2>Physical Architecture</h2>
<p>This depicts a diagram(s) the physical environment(s) of the components the system or application is hosted on.  Server nodes, clusters, firewalls, databases, are just some of the components identified.  Details to the physical hosting and interfacing are well established.</p>
<h2>NOC Requirements</h2>
<p>NOC requires various deployment and topological network diagrams for each environment they maintain to host the system or application.  This usually includes Production, Testing, Staging, and Development.</p>
<h2>Discussion of Business and Technical Gaps</h2>
<p>This is relevant to the Current State Architecture only (see below).</p>
<p>The business gaps can commonly be captured in a table format, identifying the feature, the problem/challenge, the folks affected, and the priority of importance.</p>
<p>The technical gaps are similar, but describe the technical difficulty, of course.</p>
<p>You can also see how useful this becomes when you map the two together to form an end-to-end understanding of why the business problems/challenges occur.</p>
<h2>Solutions to Business and Technical Gaps</h2>
<p>This is relevant to the Future State Architecture only (see below).</p>
<p>Taking the details discussed in the <em>Discussion of Business and Technical Gaps</em>, each item should be identified and given a description of the solution along with a measurement of how well the solution solve the actual problem/challenge,</p>
<p>For example, you can adopt 0 &#8211; 5, where</p>
<ul>
<li>0 represents <em>no solution</em>,</li>
<li>1 represents <em>20% solved</em> and</li>
<li>5 represents <em>100% solved</em>.</li>
</ul>
<h2>NFR&#8217;s</h2>
<p>NFR&#8217;s typically include details that are not always given to engineering, but are critical to operations</p>
<ul>
<li>availability</li>
<li>disaster recovery</li>
<li>performance and scaleability</li>
<li>elasticity</li>
<li>instrumentation</li>
<li>data backup and retention</li>
</ul>
<h1>Representing a Solutions Architecture Through States</h1>
<p>In order to effectively compare and contrast different solutions architectures, it is necessary to provide a baseline, also known as the <em>current state architecture</em>.  And new solutions known as the <em>future state architecture</em>.  This nicely allows us to describe the state of the union as we see it today, and optional solutions that are possibilities for the future.</p>
<h2>Current State Architecture</h2>
<p>Simply stated, this is the current state of the software architecture.  In addition to the architectural specifics, the gaps in both business and technical are included.</p>
<p>In addition to the typical items listed above, the following are specific to the current state:</p>
<ul>
<li>Business Gaps in the Current Architecture</li>
<li>Technical Gaps in the Current Architecture</li>
</ul>
<p><span style="font-size: medium;"><span style="line-height: 24px;">The exercise in creating the Current State Architecture is rewarding as the results make it much easier to justify arguments made in the past that were harder to prove.<br />
</span></span></p>
<div>
<h2>Future State Architecture</h2>
<p>This is the future state software architecture.  In addition to the architectural specifics, the solution to the gaps in both business and technical are included.  Also, technology research, proof-of-concept, and technology selection details are provided.</p>
<p>In addition to the typical items listed above, the following are specific to the future state:</p>
<div>
<ul>
<li>Technology Research, Proof-of-Concept, and Selection</li>
<li>Solving Business Gaps in the Current Architecture</li>
<li>Solving Technical Gaps in the Current Architecture</li>
</ul>
</div>
</div>
<h2>Recommendations</h2>
<p>I recommend the following, at a minimum, as I strongly believe they are core to defining a Solutions Architecture:</p>
<ul>
<li>Statement of Work (SOW)</li>
<li>Goals</li>
<li>Use Cases</li>
<li>Logical Architecture</li>
<li>Security Architecture</li>
<li>Information Architecture</li>
<li>Physical Architecture</li>
<li>NOC Requirements</li>
<li>Non-Functional Requirements (NFR&#8217;s)</li>
<li><em>CURRENT STATE:</em>  Discussion of Business and Technical Gaps</li>
<li><em>FUTURE STATE:</em>  Solutions to Business and Technical Gaps</li>
</ul>
<p><span style="font-size: medium;"><span style="line-height: 24px;">The actual details for each of the above can be brief, as long as any details that can affect the final decision are surfaced enough for clear discussion.  For example, identifying high-level data schema(s) are suffice for the Information Architecture as long as key data stores (e.g., databases) are present in the diagram.<br />
</span></span></p>
<h1>Using the Current and Future State Architectures to Identify the Winning Solutions Architecture</h1>
<p>This is where the rubber hits the road and the real decisions can be made.</p>
<p>Now all of the facts are within easy reach to do comparisons and open up discussions that can include both business and technical folks.  This proves fruitful for a company&#8217;s future, as the business can share its short and long-term needs and engineering can understand its limitations, if any, and together well-informed decisions can now be made going forward.</p>
<h1>Moving Forward</h1>
<p>Coming up in the near future, I will discuss using the <em>Solutions Architecture</em> to drive creation of the <em>Software Architecture</em>.</p>
<p>Please click on the link below if you are looking for information on helping you determine</p>
<blockquote><p><a href="http://blog.brianbuikema.com/2012/10/software-architecture-when-is-it-time-to-revisit-your-current-software-architecture/">&#8220;When is it time to revisit my current software architecture?&#8221; - another post by B. Buikema</a></p></blockquote>
<p>I also have many other posts regarding</p>
<ul>
<li><a href="http://blog.brianbuikema.com/tag/architecture">software architecture</a></li>
<li><a href="http://blog.brianbuikema.com/tag/mobile">mobile (Android) development</a></li>
<li><a href="http://blog.brianbuikema.com/tag/enterprise">enterprise development</a></li>
<li><a href="http://blog.brianbuikema.com/tag/design-patterns">design patterns</a></li>
<li><a href="http://blog.brianbuikema.com">and much more&#8230;</a></li>
</ul>
<p>so look me up.</p>
<p>See you soon!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.brianbuikema.com/2012/10/software-architecture-creating-a-solutions-architecture/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Software Architecture:  When is it Time to Revisit Your Current Software Architecture?</title>
		<link>http://blog.brianbuikema.com/2012/10/software-architecture-when-is-it-time-to-revisit-your-current-software-architecture/</link>
		<comments>http://blog.brianbuikema.com/2012/10/software-architecture-when-is-it-time-to-revisit-your-current-software-architecture/#comments</comments>
		<pubDate>Sun, 21 Oct 2012 03:23:59 +0000</pubDate>
		<dc:creator>Brian Buikema</dc:creator>
				<category><![CDATA[Architecture & Design]]></category>
		<category><![CDATA[Enterprise]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Solutions Architecture]]></category>
		<category><![CDATA[Startups]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[solutions architecture]]></category>
		<category><![CDATA[startups]]></category>

		<guid isPermaLink="false">http://blog.brianbuikema.com/?p=1374</guid>
		<description><![CDATA[Overview In this post, I discuss an important topic in software architecture: &#8220;When is it time to revisit my current software architecture?&#8221; As a software developer, software architect, solutions architect, software product manager, and software consultant (I&#8217;ve been all of them), I have to come into companies to help make decisions regarding the future of [...]]]></description>
			<content:encoded><![CDATA[<h1>Overview</h1>
<p>In this post, I discuss an important topic in software architecture:</p>
<blockquote><p>&#8220;When is it time to revisit my current software architecture?&#8221;</p></blockquote>
<p>As a software developer, software architect, solutions architect, software product manager, and software consultant (I&#8217;ve been all of them), I have to come into companies to help make decisions regarding the future of a current software architecture.  Typically, I&#8217;ve seen several camps, but we&#8217;ll keep our attention focused on these two:</p>
<h2>Startup</h2>
<p>Application coded/tested/deployed to early visionary&#8217;s specs.  Sales is able to sign up some clients.  Clients report mostly good things about the application.  Venture Capitalists (VC&#8217;s) are interested.  Demonstration to VC&#8217;s went great and funding approved!  But engineering says</p>
<ul>
<li>the architecture can&#8217;t scale</li>
<li>it isn&#8217;t robust enough for rapid growth</li>
<li>it wasn&#8217;t designed to do those <em>fancy</em> phase 2, 3, 4, etc&#8230;, features, since we were told to get phase 1 out the door asap.</li>
</ul>
<p>We&#8217;ve all been there.  Now what?</p>
<p>Likely problem:  No real software architecture existed in the first place.  Consider this a <em>working prototype</em>, but no more than that<em>.</em></p>
<h2>Mature</h2>
<p>Application has been in production for several years and supports our clients, but is horrible to maintain, operate, and extend.  The current technology platform is aging and is stifling the business&#8217;s ability to add features that the competition already provides, e.g., mobile support.  The CTO sees a new technology platform that may be the <em>silver bullet</em> to all of these problems.</p>
<p>But what now?</p>
<p>Likely problem:  <em>Software Architecture Erosion</em>.  I&#8217;ll discuss this in detail in the next section.</p>
<h1>Limitations in the Current Software Architecture &#8211; Denial or Reality?</h1>
<p>Most software folks know that there are weaknesses in the software.  Some even know, dare I say, that there are weaknesses in their own code!  However, is it really the code, the design of the code, or the architecture?</p>
<p>Keep in mind, the code can normally cleaned up (given time), and the design can be normally cleaned up (also given time).  This is considered re-factoring and is a normal part of software development.</p>
<p>Software architecture can be a different story, however.  Depending on the lack of proper logical layers, violation of architecture patterns, tightly-coupled interfaces, implicit or explicit use of technology platform-specific communications, strong dependency to a specific type of data store, and more, can contribute to a software architecture&#8217;s limitations.  These limitations normally result in adversely affecting one or more of the following:</p>
<ul>
<li>ability to provide a robust architecture that can handle any kind of stress in both extensibility and resource usage, including any changes to the operating environment, and still provide the desired application functionality</li>
<li>ability to scale to meet growth demands</li>
<li>ability to create/extend features without excessively increasing software complexity</li>
<li>ability to communicate with other software components/technologies</li>
<li>and more&#8230;</li>
</ul>
<p><span style="font-size: medium;"><span style="line-height: 24px;">Ultimately, this leads to <em><a href="http://en.wikipedia.org/wiki/Software_architecture#Software_architecture_erosion">software architecture erosion</a></em>.</span></span></p>
<h2>Software Architecture Erosion</h2>
<p>Simply stated, software architecture erosion is the deterioration of the software architecture by the cumulative effect of numerous implementation decisions that violate the planned architecture.</p>
<p>Let&#8217;s take a look at a typical software architecture as time passes.  Fig 1 depicts the development of new features that are released through new versions.</p>
<p><a href="http://blog.brianbuikema.com/wp-content/uploads/2012/10/Enterprise-Dev-Fig-12.jpg"><img class="aligncenter size-medium wp-image-1431" title="Fig 1" src="http://blog.brianbuikema.com/wp-content/uploads/2012/10/Enterprise-Dev-Fig-12-500x354.jpg" alt="Fig 1" width="500" height="354" /></a><br />
We&#8217;ll also see that during the first three versions, the software architecture has been adhered to as shown in Fig 2.</p>
<p><a href="http://blog.brianbuikema.com/wp-content/uploads/2012/10/Architecture-Fig-21.jpg"><img class="aligncenter size-medium wp-image-1441" title="Fig 2" src="http://blog.brianbuikema.com/wp-content/uploads/2012/10/Architecture-Fig-21-500x414.jpg" alt="Fig 2" width="500" height="414" /></a></p>
<p>&nbsp;</p>
<p>However, things changed for version 4 and 5, as the business decided to expand into other markets and required some conceptually new features that were not envisioned by the planned architecture.  Fig 3 depicts versions 1 through 5.</p>
<p><a href="http://blog.brianbuikema.com/wp-content/uploads/2012/10/Architecture-Fig-31.jpg"><img class="aligncenter size-medium wp-image-1442" title="Fig 3" src="http://blog.brianbuikema.com/wp-content/uploads/2012/10/Architecture-Fig-31-500x346.jpg" alt="Fig 3" width="500" height="346" /></a></p>
<p>As can be seen by the dashed line, the system complexity has increased drastically as the software development team made the decision to violate the planned software architecture in order to accommodate the requested business features.  This is a sure sign of <em>software architecture erosion </em>and puts limitations on future features, release schedules, and more.</p>
<p>One might ask, &#8220;Is there a test I can apply to know if there is a need to rethink our current software architecture?&#8221;</p>
<p>One can look at</p>
<ul>
<li>feature time-to-complete creep,</li>
<li>guage any increases in frustration in the software development team, and</li>
<li>readily perform stress and load tests to obtain performance metrics.</li>
</ul>
<p>One can also identify</p>
<ul>
<li>fragmented business logic spread in multiple layers/components,</li>
<li>tightly-coupled interfaces, and</li>
<li>technology platform-specific communications.</li>
</ul>
<p>Keep in mind, the seniors on the engineering/NOC team <em>know</em> many of the limitations.  Don&#8217;t kid yourself.  The key is determining how much erosion as occurred and how will affect the business in the near and far future.</p>
<h1>Don&#8217;t Look Now, but Someone Booked a Meeting During Your Lunch Hour!</h1>
<p>So now talk about the limitations of the current architecture are omnipresent.</p>
<p>Time for meetings.</p>
<p>Commonly, I see meeting after meeting after meeting occur, where the business stake holders meet with engineering/IT/QA to convey/capture business needs, while engineering meets with platform vendors to attend presentations.  Usually, a few engineering folks quietly discuss what should <em>really</em> be done.  Sometimes business folks learn of a new upcoming technology, and pass this along to engineering as well.</p>
<p>While none of these are inherently bad by themselves, they do indicate a lack of direction that needs to occur.  E<em>veryone</em> has opinions and ideas that provide fragments of a solution, but collectively, these do not provide a complete solution.  Also, I&#8217;ve seen literally hundreds of man hours wasted because these meetings occur, often in silos, and, therefore, folks are not collaborating on</p>
<ul>
<li>understanding the challenges and problems with the current application</li>
<li>understanding upcoming features and future targeted business growth (e.g., 6 mo&#8217;s, 12 mo&#8217;s, 24 mo&#8217;s) that the application must support</li>
<li>prioritizing and time-lining of the above</li>
<li>creating a strategy to help discover a solution</li>
</ul>
<div><span style="font-size: medium;"><span style="line-height: 24px;">Sure, spreadsheets, documents, and emails are written and sent out (mainly by business analysts), but it&#8217;s very likely that most folks don&#8217;t understand the intent of each item.</span></span></div>
<blockquote><p>A common knowledge of the problem must be understood and shared, and a practical strategy must be identified to facilitate the collaborative discovery of a solution.</p></blockquote>
<h1>The Solution</h1>
<p>What it comes down to is understanding all views, or dimensions, of your current software architecture, and conducting an objective review of it by all stakeholders.  You may be thinking,</p>
<blockquote><p>&#8220;How can business folks possibly understand the technical details of the software architecture in order to provide valid input to this important exercise?&#8221;</p></blockquote>
<p>The answer.  Because you will provide a <em>Solutions Architecture</em> that will accommodate many different audiences as it collectively, and without deep-down details, addresses direct business and technical concerns.</p>
<p>In my post, <em><a href="http://blog.brianbuikema.com/2012/10/software-architecture-creating-a-solutions-architecture">Creating a Solutions Architecture</a></em>, I delve into the concept of <em>Current State Architecture</em> and <em>Future State Architecture </em>and how identifying these help guide us to the ultimate goal, the <em>Solutions Architecture.</em></p>
<p>I also have many other posts regarding</p>
<ul>
<li><a href="http://blog.brianbuikema.com/tag/architecture">software architecture</a></li>
<li><a href="http://blog.brianbuikema.com/tag/mobile">mobile (Android) development</a></li>
<li><a href="http://blog.brianbuikema.com/tag/enterprise">enterprise development</a></li>
<li><a href="http://blog.brianbuikema.com/tag/design-patterns">design patterns</a></li>
<li><a href="http://blog.brianbuikema.com">and much more&#8230;</a></li>
</ul>
<p>so look me up.</p>
<p>See you soon!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.brianbuikema.com/2012/10/software-architecture-when-is-it-time-to-revisit-your-current-software-architecture/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MongoDB Sharding:  A Detailed Overview and 15 Minute High Speed Read</title>
		<link>http://blog.brianbuikema.com/2011/01/mongodb-sharding-a-detailed-overview-and-15-minute-high-speed-read/</link>
		<comments>http://blog.brianbuikema.com/2011/01/mongodb-sharding-a-detailed-overview-and-15-minute-high-speed-read/#comments</comments>
		<pubDate>Sat, 29 Jan 2011 03:20:30 +0000</pubDate>
		<dc:creator>Brian Buikema</dc:creator>
				<category><![CDATA[Architecture & Design]]></category>
		<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[Document Repository]]></category>
		<category><![CDATA[Mongodb]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Ubunto]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[cloudcomputing]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[documentrepository]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://blog.brianbuikema.com/?p=1265</guid>
		<description><![CDATA[Scaling is a key feature of MongoDB. And even though manual sharding is supported by most databases, MongoDB supports the concept of autosharding. This 15 minute high speed post provides a detailed overview of autosharding in MongoDB and, specifically, how to create shards supporting autosharding in MongoDB. The process of splitting up data and storing [...]]]></description>
			<content:encoded><![CDATA[<p>Scaling is a key feature of MongoDB.  And even though manual sharding is supported by most databases, MongoDB supports the concept of <em>autosharding</em>.  This 15 minute high speed post provides a detailed overview of autosharding in MongoDB and, specifically, how to create shards supporting autosharding in MongoDB.</p>
<p>The process of splitting up data and storing portions of data on different machines is called <em>sharding</em>.  By splitting up data across machines, it becomes possible to store more data and handle much more load without requiring large or powerful machines, e.g., machines that consist of powerful CPU&#8217;s and/or massive amounts of RAM.</p>
<p>Two types are sharding can occur.  <em>Manual sharding</em> and <em>autosharding</em>.</p>
<p>In <em>manual sharding</em>, the application code manages storing different data on different servers and querying the appropriate server to get it back.  Manual sharding can be done with virtually any database software package.</p>
<p>In MongoDB <em>autosharding</em>, some of the administrative overhead required in manual sharding is eliminated.  The cluster of database servers, or <em>shards</em>, handles splitting up of data and rebalancing of data automatically.</p>
<h2>Autosharding</h2>
<p>The basic concept behind MongoDB&#8217;s sharding is to break up collections into smaller chunks, or <em>documents</em>.  These documents can be distributed across shards so that each shard is responsible for a subset of the total dataset.</p>
<p>As an example, consider the following.  When you set up sharding you choose a key from a collection and use that key&#8217;s values to split up the data.  This key is called the <em>shard key</em>.</p>
<p>Suppose we had a collection of contacts.  If we chose &#8220;lastName&#8221; as our shard key, one shard could hold documents where &#8220;lastName&#8221; starts with A-F, the next shard could hold last names from G-P, and the final shard could hold last names Q-Z.  As you add or remove shards, MongoDB would rebalance this data so that each shard was getting a balanced amount of traffic and a practical amount of data.</p>
<p>So when should you decide to start sharding?  Consider the following reasons:</p>
<blockquote>
<ul>
<li>When you&#8217;ve run out of disk space on your current machine.</li>
<li>You want to write data faster than a single mongod can handle.</li>
<li>You want to keep a larger portion of data in memory to improve performance.</li>
</ul>
</blockquote>
<h2>Setting up Sharding</h2>
<p>Three different components are involved in sharding as follows:</p>
<h4>shard</h4>
<p style="padding-left: 30px;">A shard is a container that holds a subset of a collection&#8217;s data.  A shard is either a single mongod server (for development/testing), or a replica set (for production).</p>
<h4>mongos</h4>
<p style="padding-left: 30px;">This is the router process.  It routes requests and aggregates responses.  It doesn&#8217;t store any data or configuration information, although it does cache information from the config servers.</p>
<h4>config server</h4>
<p style="padding-left: 30px;">Config servers store the configuration of the cluster.  For example, which data is located on which shard.  Used by mongos to determine request routing.</p>
<h3>Starting the Servers</h3>
<p>First we need to strat up our config server and mongos.  We need to start a config server because mongos uses it to get its configuration.</p>
<pre class="brush: plain; title: ; notranslate">
$ mkdir -p ~/dbs/config
$ ./mongod --dbpath ~/dbs/config --port 20000
</pre>
<p>Now we start a mongos process for an application to connect to.  Routing servers do not even need a data directory, but they need to know the location of the config server.</p>
<pre class="brush: plain; title: ; notranslate">
$ ./mongos --port 30000 --configdb localhost:20000
</pre>
<p>Shard administration is always done through a mongos.</p>
<h3>Adding a Shard</h3>
<p>Start a normal mongod instance (or replica set), since this is what a shard naturally is</p>
<pre class="brush: plain; title: ; notranslate">
$ mkdir -p ~/dbs/shard1
$ ./mongod --dbpath ~/dbs/shard1 --port 10000
</pre>
<p>Now connect to the mongos process started earlier and add the shard to the cluster.</p>
<p>First, start up a shell connected to the mongos process as follows:</p>
<pre class="brush: plain; title: ; notranslate">
$ ./mongo localhost:30000/admin
</pre>
<p>Now add this shard with the <em><strong>addshard </strong></em>database command:</p>
<pre class="brush: plain; title: ; notranslate">
&gt; db.runCommand({addshard : &quot;localhost:10000&quot;, allowLocal : true})
{
    &quot;added&quot; : &quot;localhost:10000&quot;,
    &quot;ok&quot; : true
}
</pre>
<p>The &#8220;allowLocal&#8221; key is necessary only if you are running the shard on <strong>localhost </strong>and lets MongoDB know that you&#8217;re in development and know what you are doing.</p>
<h3>Sharding Data</h3>
<p>In order to allow MongoDB to distribute data, you have to explicitly turn sharding on at both the database and collection levels.  For example, the following enaables sharding for the database <em>acme</em>:</p>
<pre class="brush: plain; title: ; notranslate">
&gt; db.runCommand({&quot;enablesharding&quot; : &quot;acme&quot;})
</pre>
<p>Once you&#8217;ve enabled on the <em><strong>acme </strong></em>database, a collection is sharded by running the shardcollection command as follows:</p>
<pre class="brush: plain; title: ; notranslate">
&gt; db.runCommand({&quot;shardcollection&quot; : &quot;acme.products&quot;, &quot;key&quot;, : {&quot;_id&quot; : 1}})
</pre>
<p>Now the collection will be sharded by the &#8220;_id&#8221; key.  When data is added to <strong><em>acme</em></strong>, it will be automatically distributed across the shards based on the values of &#8220;_id&#8221;.</p>
<p>I hope this post enlightens you on the possibilities that MongoDB&#8217;s auto-sharding feature provides for ease of scaling.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.brianbuikema.com/2011/01/mongodb-sharding-a-detailed-overview-and-15-minute-high-speed-read/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Running MongoDB on Ubuntu: Overview, Installation, Setup, and Application Development using Python</title>
		<link>http://blog.brianbuikema.com/2011/01/mongodb-ubunto-overview-installation-setup-dev-python-2/</link>
		<comments>http://blog.brianbuikema.com/2011/01/mongodb-ubunto-overview-installation-setup-dev-python-2/#comments</comments>
		<pubDate>Wed, 26 Jan 2011 20:15:12 +0000</pubDate>
		<dc:creator>Brian Buikema</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[Document Repository]]></category>
		<category><![CDATA[Mongodb]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Ubunto]]></category>
		<category><![CDATA[cloudcomputing]]></category>
		<category><![CDATA[documentrepository]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://blog.brianbuikema.com/?p=1234</guid>
		<description><![CDATA[MongoDb is becoming the defacto standard supporting the concept of NoSQL databases that are schemaless, and true document repositories. Companies developing state-of-the-art applications, both enterprise level and small start-ups, are embracing mongodb for its simple approach for supporting the development of schemaless databases that provide easy learning curve faster development than with traditional relational databases high availability [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.mongodb.org/" target="_blank">MongoDb</a> is becoming the defacto standard supporting the concept of NoSQL databases that are schemaless, and true document repositories. Companies developing state-of-the-art applications, both enterprise level and small start-ups, are embracing mongodb for its simple approach for supporting the development of schemaless databases that provide</p>
<ul>
<li>easy learning curve</li>
<li>faster development than with traditional <a href="http://en.wikipedia.org/wiki/Relational_database" target="_blank">relational databases</a></li>
<li>high availability and easy horizontal scalability</li>
<li>extremely fast access times</li>
<li>powerful indexing and querying capabilities, similar to its relational database counterparts</li>
<li>an ideal database platform for both <a href="http://en.wikipedia.org/wiki/Cloud_computing" target="_blank">cloud</a> and desktop computing</li>
<li>schemaless, document repositories, via collections and documents, that naturally fit application domains</li>
<li>an ideal database platform for embracing <a href="http://blog.brianbuikema.com/category/agile/" target="_blank">agile development</a></li>
</ul>
<p>A general set of MongoDB supported Use Cases, both <em>well suited</em> and <em>less well suited</em> are found <a href="http://www.mongodb.org/display/DOCS/Use+Cases" target="_blank">here</a>.</p>
<p>It should be noted that MongoDB shares the NoSQL spotlight with <a href="http://couchdb.apache.org/" target="_blank">CouchDB</a>.  Since MongoDB and CouchDB are both document-oriented databases with schemaless JSON-style object data storage, folks are naturally asking questions.  <a href="http://www.mongodb.org/display/DOCS/Comparing+Mongo+DB+and+Couch+DB" target="_blank">Please click here to compare MongoDB and CouchDB</a>.</p>
<h2>MongoDB Features</h2>
<p>Here is a list of MongoDB features.  Click on the links for details.</p>
<ul>
<li><a href="http://www.mongodb.org/display/DOCS/Schema+Design" target="_blank">Document-oriented storage</a> via <a href="http://bsonspec.org/" target="_blank">JSON-style documents</a> with dynamic schemas</li>
<li><a href="http://www.mongodb.org/display/DOCS/Indexes" target="_blank">Full Index Support</a></li>
<li><a href="http://www.mongodb.org/display/DOCS/Replication" target="_blank">Replication &amp; High Availability</a></li>
<li><a href="http://www.mongodb.org/display/DOCS/Sharding" target="_blank">Auto-Sharding</a></li>
<li><a href="http://www.mongodb.org/display/DOCS/Querying" target="_blank">Querying</a></li>
<li><a href="http://www.mongodb.org/display/DOCS/Updating" target="_blank">Fast In-Place Updates</a></li>
<li><a href="http://www.mongodb.org/display/DOCS/MapReduce" target="_blank">Map/Reduce</a></li>
<li><a href="http://www.mongodb.org/display/DOCS/GridFS" target="_blank">GridFS</a></li>
<li><a href="http://www.mongodb.org/display/DOCS/MongoDB+Commercial+Services+Providers" target="_blank">Commercial Support</a></li>
</ul>
<h2>The MongoDB Philosophy</h2>
<p>MongoDB was not created to be just another database that tries to do everything for everyone.</p>
<blockquote><p>Instead, MongoDB was created to work with <em>documents</em> rather than <em>rows</em>, was extremely fast, massively scalable, and easy to use.</p></blockquote>
<p>In order to accomplish this, some features were excluded, namely support for transactions.  Therefore, MongoDB may not be a great fit for developing accounting applications.  However, it is quite common to strategize software architectures by using a hybrid of technologies.  For example, a relational database works well with accounting and transactional components.  While MongoDB is a great technology for storing and retrieving complex data and document storage.</p>
<p>At a high-level, MongoDB provides the following (this is not an exhaustive list):</p>
<ul>
<li>A Rich Data Model</li>
<li>Easy Scaling</li>
<li>Simple Administration</li>
<li>Features such as <em>indexing</em>, <em>embedded document references</em>, <em>stored javascript</em>, <em>fixed-size collections</em>, <em>file storage</em>, <em>aggregation</em>, <em>replication</em>, <em>auto-sharding</em>, and more.</li>
<li>And all of the Above without Sacrificing Speed</li>
</ul>
<p>MongoDB is a document-oriented database.  It is not a relational one.  The primary reason for moving away from the relational model to the document-oriented model is to make scaling out easier, but additional advantages are found as well.</p>
<p>The fundamental idea is replacing the concept of a <em>row</em> with the more flexible model, the <em>document</em>.  By supporting embedded documents and arrays, the document-oriented approach makes it possible to represent complex hierarchical relationships with a single record.  This fits naturally with how data needs are addressed by developers using modern object-oriented languages.</p>
<p>More coming soon!</p>
<h2>Installing and Running MongoDB on Ubuntu</h2>
<p>I highly recommend installing MongoDB via the default repositories available in Ubuntu.  These repositories contain MongoDB, but may contain out-of-date versions.  Software installation from repositories is done through <em>aptitude</em>.  In order to obtain the latest versions of MongoDB, simply add the following line to your repository list found in <em><strong>/etc/apt/sources.list</strong></em></p>
<blockquote><p>deb http://downloads.mongodb.org/distros/ubuntu 10.4 10gen</p></blockquote>
<p>where 10.4 is the version of Ubuntu I run.  Make sure to supply the version of Ubuntu you run.</p>
<p>Next, you need to tell aptitude to retrieve the new repositories as follows:</p>
<pre class="brush: plain; title: ; notranslate">$ sudo aptitude update</pre>
<p>And now install MongoDB using the following command:</p>
<pre class="brush: plain; title: ; notranslate">$ sudo aptitude install mongodb-stable</pre>
<p>As the last step in the installation process, you will need to create the data directory yourself.  Make sure and do this as a non-root user.</p>
<pre class="brush: plain; title: ; notranslate">
$ sudo mkdir -p /data/db/
$ sudo chown `id -u` /data/db
</pre>
<p>You can start the MondoDB service as follows, and again, make sure and do this as a non-root user:</p>
<pre class="brush: plain; title: ; notranslate">
$ sudo start mongodb
$ sudo status mongodb
</pre>
<p>And start the MongoDB shell with the following command:</p>
<pre class="brush: plain; title: ; notranslate">$ mongo</pre>
<p>Once in the MongoDB shell, some basic commands include the following:</p>
<pre class="brush: plain; title: ; notranslate">
&amp;gt; show dbs
&amp;gt; show collections
&amp;gt; show users
&amp;gt; use &amp;lt;db name&amp;gt;
</pre>
<h3>Quick Reference to the MongoDB Upstart Scripts</h3>
<p>Here is a quick reference to the commands that control the execution of the mongod server process:</p>
<pre class="brush: plain; title: ; notranslate">
$ sudo status mongodb
$ sudo stop mongodb
$ sudo start mongodb
$ sudo restart mongodb
</pre>
<h3>Important in Case of Error Connecting to the Server</h3>
<p>If upon starting the MongoDB shell, you happen to get an error message connecting to the server similar to the following:</p>
<blockquote><p>Error: couldn&#8217;t connect to server 127.0.0.1} (anon):1137</p></blockquote>
<p>You may also notice that even though you issued the command to start the service, it actually did not start.  The next step is to verify that you are unable to start MongoDB.</p>
<p>Run <em>sudo start mongodb</em>.  It will report</p>
<blockquote><p><em>mongodb start/running, process XXXX</em></p></blockquote>
<p><em><strong> </strong></em>no matter what.  However, when you run <em>sudo status mongodb</em> again, you&#8217;ll get</p>
<blockquote><p>mongodb stop/waiting <span style="font-style: normal;">instead of</span> mongodb start/running</p></blockquote>
<p>Note:  This condition is largely due to an unclean shutdown, and results in the creation of a lockfile <em><strong>/var/lib/mongodb/mongod.lock</strong></em>.</p>
<p>The fix is a quick two-step process as follows:</p>
<ol>
<li>Remove the lockfile.</li>
<li>Run the repair script.</li>
</ol>
<p>This is accomplished as follows:</p>
<pre class="brush: plain; title: ; notranslate">
$ sudo rm /var/lib/mongodb/mongod.lock
$ sudo -u mongodb mongod -f /etc/mongodb.conf --repair
</pre>
<p>Now when you run <em>sudo start mongodb</em>.  It will report</p>
<blockquote><p>mongodb start/running, process XXXX</p></blockquote>
<p>and when you run <em>sudo status mongodb</em> again, you&#8217;ll get the expected</p>
<blockquote><p>mongodb start/running, process XXXX</p></blockquote>
<h3><span style="line-height: 28px; font-size: 26px;">Understanding Data Modeling under MongoDB</span></h3>
<p>A MongoDB database is non-relational and schemaless.  Therefore a MongoDB database is not bound to columns and data types like relational databases are.  One of the primary benefits of a flexible schemaless design is that you are not restricted when programming in a dynamically typed programming language such as Python.  Keep in mind that even though MongoDB is schemaless, the data structure is not completely devoid of schema as you still define collections and indexes, as we will discuss later.  Nevertheless you <em>will not need to predefine any data structure </em>for any of your documents you will be adding.</p>
<p>The fundamental components of a MongoDB database are <em>documents</em> and <em>collections</em>.</p>
<blockquote><p>Document is an item that contains the actual data, similar to a row in a SQL database table.</p></blockquote>
<blockquote><p>Collection is a collection of documents, similar to a table in a SQL database.  Unlike a SQL database, two or more completely different documents can co-exist in a single collection.</p></blockquote>
<p>More coming soon!</p>
<h2>Developing Applications under MongoDB using Python with Example Code</h2>
<p><a href="http://www.python.org/" target="_blank">Python</a> is a simple programming language that provides the natural ability to develop code that is perfectly readable.  Here are some links to Python code examples:</p>
<ul>
<li><a href="http://www.java2s.com/Code/Python/CatalogPython.htm" target="_blank">Catalog of Python Code Examples</a></li>
<li><a href="http://wiki.python.org/moin/SimplePrograms" target="_blank">Simple Python Programs</a></li>
</ul>
<p>In this section, we will develop simple, clear, and powerful code that works with MongoDB through the Python driver known as the <em><a href="https://github.com/mongodb/mongo-python-driver" target="_blank">PyMongo driver</a></em>.</p>
<h3>Installing the PyMongo Driver</h3>
<p>Before we begin to write Python code to access MongoDB databases, we first need to install the PyMongo driver.</p>
<p>I&#8217;m assuming you have Python 2.7 or greater up and running.  The steps for Python installation are simple once you obtain the source from <a href="http://python.org/download/" target="_blank">python.org/download</a> and extract the contents from the tar file, and are commonly listed as follows:</p>
<pre class="brush: plain; title: ; notranslate">
$ ./configure
$ make
$ make test
$ sudo make install
</pre>
<blockquote><p>Of course, you should always consult the readme file to obtain up-to-date instructions.</p></blockquote>
<p>The steps required to install the PyMongo driver are as follows:</p>
<h4><span style="font-weight: normal;">Step 1</span></h4>
<p style="padding-left: 30px;">Obtain the Python <em>setuptools</em> egg for your version of Python.  For example, I obtained setuptools-0.6c11-py2.7.egg from <a href="http://pypi.python.org/pypi/setuptools#using-setuptools-and-easyinstall" target="_blank">http://pypi.python.org/pypi/setuptools#using-setuptools-and-easyinstall</a>.</p>
<h4><span style="font-weight: normal;">Step 2</span></h4>
<p style="padding-left: 30px;">Now execute the downloaded egg as if it were an acual shell script by typing (<em>note your setuptools egg filename may be different depending on the version of Python you are using</em>).</p>
<pre class="brush: plain; title: ; notranslate">
$ sudo sh setuptools-0.6c11-py2.7.egg
</pre>
<h4><span style="font-weight: normal;">Step 3</span></h4>
<div style="padding-left: 30px;">Install the PyMongo module as follows:</div>
<pre class="brush: plain; title: ; notranslate">
$ sudo easy_install pymongo
</pre>
<p>That&#8217;s it!  But let&#8217;s test to ensure that our installation was a success.</p>
<p>From the Python shell, type the following:</p>
<pre class="brush: plain; title: ; notranslate">
&amp;gt;&amp;gt; import pymongo
</pre>
<p>You should be greeted with an empty cursor &gt;&gt;.  That&#8217;s success.</p>
<p>To take it one step further, we&#8217;ll insert data into a database and also retrieve it back.  Remember in MongoDB, if we try to retrieve a database that does not exist, MongoDB creates it for us automatically, as is the case with <strong><em>mytestdb</em></strong> below.</p>
<p>Type the following in the Python shell:</p>
<pre class="brush: plain; title: ; notranslate">
&amp;gt;&amp;gt; from pymongo import Connection
&amp;gt;&amp;gt; c = Connection()
&amp;gt;&amp;gt; db = c.mytestdb
&amp;gt;&amp;gt; collection = db.items
&amp;gt;&amp;gt; item = { &quot;Title&quot; : &quot;Test Data&quot;, &quot;Value1&quot; : &quot;1&quot;, &quot;Value2&quot; : &quot;2&quot;}
&amp;gt;&amp;gt; collection.insert(item)
&amp;gt;&amp;gt; collection.find_one()
</pre>
<div>The result of executing the last line, <em>collection.find_one()</em>, should result in the following (<em>note your ObjectId will probably be different</em>):</div>
<pre class="brush: plain; title: ; notranslate">
{u'_id': ObjectId('4d432adc1d41c85d8a000000'), u'Value1': u'1', u'Value2': u'2', u'Title': u'Test Data'}
</pre>
<h3>An Introduction to Working with MongoDB using Python via the PyMongo Driver</h3>
<p>Now that you have the PyMongo driver installed and running, it is time to learn the basics in developing Python code that works with MongoDB.</p>
<p>Instead of reinventing an already great tutorial, <a href="http://api.mongodb.org/python/1.4%2B/tutorial.html" target="_blank">I provide this link to the tutorial located on the mongodb.org site</a>.</p>
<p>Enjoy.</p>
<h2>Advanced:  Sharding</h2>
<p>Since <em>sharding </em>in MongoDB is a key feature and large topic to discuss, I created a <a href="http://blog.brianbuikema.com/2011/01/mongodb-sharding-a-detailed-overview-and-15-minute-high-speed-read/" target="_blank">separate post found here</a>.  This 15 minute high speed post provides a detailed overview of  autosharding in MongoDB and, specifically, how to create shards  supporting autosharding in MongoDB.</p>
<p>Enjoy.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.brianbuikema.com/2011/01/mongodb-ubunto-overview-installation-setup-dev-python-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MS CRM Dynamics:  Part 2 &#8211; Adding High Performance Advanced Tuning and Optimizations to Your CRM System to Ensure Top Performance</title>
		<link>http://blog.brianbuikema.com/2010/12/ms-crm-dynamics-part-2-adding-high-performance-advanced-tuning-and-optimizations-to-your-crm-system-to-ensure-top-performance/</link>
		<comments>http://blog.brianbuikema.com/2010/12/ms-crm-dynamics-part-2-adding-high-performance-advanced-tuning-and-optimizations-to-your-crm-system-to-ensure-top-performance/#comments</comments>
		<pubDate>Sat, 04 Dec 2010 05:38:24 +0000</pubDate>
		<dc:creator>Brian Buikema</dc:creator>
				<category><![CDATA[Architecture & Design]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[CRM]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[Enterprise]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://blog.brianbuikema.com/?p=1223</guid>
		<description><![CDATA[Part 1 discussed designing and executing advanced performance testing for the deployment of Microsoft CRM Dynamics solutions. This post discusses how to ensure your production CRM environment is tuned and optimized for top performance. My knowledge in this area has been largely obtained by working closely with Robert Shurtleff, the Microsoft CRM Dynamics Architect at [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.brianbuikema.com/2010/12/ms-crm-dynamics-part-1-designing-and-executing-advanced-performance-testing-of-your-crm-solution/">Part 1</a> discussed designing and executing advanced performance testing for the deployment of Microsoft CRM Dynamics solutions.</p>
<p>This post discusses how to ensure your production CRM environment is tuned and optimized for top performance.</p>
<p>My knowledge in this area has been largely obtained by working closely with Robert Shurtleff, the Microsoft CRM Dynamics Architect at Ciber.</p>
<p>Therefore I supply a link to <a href="http://rgsiiiya.blogspot.com/2010/11/dynamics-crm-advanced-performance.html">Robert&#8217;s post on this subject</a>.</p>
<p>Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.brianbuikema.com/2010/12/ms-crm-dynamics-part-2-adding-high-performance-advanced-tuning-and-optimizations-to-your-crm-system-to-ensure-top-performance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MS CRM Dynamics:  Part 1 &#8211; Designing and Executing Advanced Performance Testing of Your CRM Solution</title>
		<link>http://blog.brianbuikema.com/2010/12/ms-crm-dynamics-part-1-designing-and-executing-advanced-performance-testing-of-your-crm-solution/</link>
		<comments>http://blog.brianbuikema.com/2010/12/ms-crm-dynamics-part-1-designing-and-executing-advanced-performance-testing-of-your-crm-solution/#comments</comments>
		<pubDate>Sat, 04 Dec 2010 05:27:36 +0000</pubDate>
		<dc:creator>Brian Buikema</dc:creator>
				<category><![CDATA[Architecture & Design]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[CRM]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[Enterprise]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://blog.brianbuikema.com/?p=1222</guid>
		<description><![CDATA[MS CRM Dynamics can be configured and customized per specific business needs. However, neglecting performance testing can kill your CRM deployment. Conversely, administering some common advanced performance tactics targeted at your specific usage can upgrade performance metrics to well above acceptable standards. More coming soon.]]></description>
			<content:encoded><![CDATA[<p>MS CRM Dynamics can be configured and customized per specific business needs.  However, neglecting performance testing can kill your CRM deployment.</p>
<p>Conversely, administering some common advanced performance tactics targeted at your specific usage can upgrade performance metrics to well above acceptable standards.</p>
<p>More coming soon.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.brianbuikema.com/2010/12/ms-crm-dynamics-part-1-designing-and-executing-advanced-performance-testing-of-your-crm-solution/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Android:  Developing a Server-Side Backup-Restore Process for Your Mobile Apps</title>
		<link>http://blog.brianbuikema.com/2010/10/android-developing-a-server-side-backup-restore-process-for-your-mobile-apps/</link>
		<comments>http://blog.brianbuikema.com/2010/10/android-developing-a-server-side-backup-restore-process-for-your-mobile-apps/#comments</comments>
		<pubDate>Fri, 22 Oct 2010 21:21:13 +0000</pubDate>
		<dc:creator>Brian Buikema</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[App]]></category>
		<category><![CDATA[Architecture & Design]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Document Repository]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Mongodb]]></category>
		<category><![CDATA[Tablet]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[architecture]]></category>

		<guid isPermaLink="false">http://blog.brianbuikema.com/?p=1186</guid>
		<description><![CDATA[In my development of mobile apps, I have come across several cases that could benefit from a server-side backup-restore process as follows: Installation of a new mobile client and connecting using an existing client account. General information backup to protect information loss. Periodic or on-demand publishing of client approved information to the “cloud” for information [...]]]></description>
			<content:encoded><![CDATA[<p>In my development of mobile apps, I have come across several cases that could benefit from a server-side backup-restore process as follows:</p>
<ol>
<li>Installation of a new mobile client and connecting using an existing client account.</li>
<li>General information backup to protect information loss.</li>
<li>Periodic or on-demand publishing of <em>client approved</em> information to the “cloud” for information sharing.  An example is advertisement services that base their marketing efforts on user attributes, e.g., user profile definition or actual user usage statistics.</li>
</ol>
<p><strong>NOTE:  #3 is beyond the scope of this discussion and is left to the reader to adapt and enhance this more general <em>server-side backup-restore process</em>.</strong></p>
<p>Some quick examples of these are the following.</p>
<ol>
<li>New mobile client installation, a.k.a., I bought a new smartphone and I want to install the same apps I had on my previous smartphone, but require that all of my information be imported (retrievable) as well.</li>
<li>General information backup/restore, a.k.a., my information is important to me, thus I require a way to backup/restore my information.</li>
<li>Publishing of <em>client approved</em> information to the “cloud”.  This is beyond the scope of our discussion, but this use case illustrates a potential feature that could benefit from the actual information transfer involved in this process.</li>
</ol>
<h2>Overview</h2>
<p>I&#8217;m writing this post since I recently required a server-side backup-restore process for a mobile application I&#8217;m developing, and I&#8217;m betting many others can benefit from this discussion, including the example client and server-side code.  <a href="http://developer.android.com/index.html" target="_blank">Android </a>is my target mobile platform and <a href="http://aspnet.codeplex.com/releases/view/54306" target="_blank">ASP.NET MVC</a>, using <a href="http://aspnet.codeplex.com/releases/view/24471" target="_blank">RESTful services</a> is my server-side platform of choice.</p>
<h2>Design</h2>
<p>For this exercise, I will create a file of json serialized records at the client.  Each record represents one business entity, e.g., address record, contact record, note record, etc&#8230;</p>
<p>A RESTful service accepts the file, the version of the user records, and the user&#8217;s Id, and stores the file on the server appropriately named to associate it to the user.</p>
<blockquote><p>NOTE:  Another option for storing records on the server, is to store them as key-value pairs, suitable for storage into  a document repository such as <a href="http://www.mongodb.org/" target="_blank">mongodb</a>.</p></blockquote>
<h3>Client Side:  The UserRecords Entity</h3>
<p>The UserRecords is a self-contained entity that actually does most of the work for us.  It is a full-fledged business object and DTO.  We will start with the basics, and develop more as we go along.  Our primary properties are as follows:</p>
<pre class="brush: java; title: ; notranslate">
public class UserRecords {
    public long UserId = -1;
    public byte[] UserRecords = null;
    public String RecordVersion = &quot;1.0&quot;;

    public UserRecords() {
    }
}
</pre>
<p>More coming soon!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.brianbuikema.com/2010/10/android-developing-a-server-side-backup-restore-process-for-your-mobile-apps/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Android Development: Guidelines for Partitioning Your App Functionality Between Client and Server</title>
		<link>http://blog.brianbuikema.com/2010/09/android-development-guidelines-for-partitioning-your-app-functionality-between-client-and-server/</link>
		<comments>http://blog.brianbuikema.com/2010/09/android-development-guidelines-for-partitioning-your-app-functionality-between-client-and-server/#comments</comments>
		<pubDate>Sun, 26 Sep 2010 14:30:45 +0000</pubDate>
		<dc:creator>Brian Buikema</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[App]]></category>
		<category><![CDATA[Architecture & Design]]></category>
		<category><![CDATA[Enterprise]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Tablet]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://blog.brianbuikema.com/2010/09/android-development-guidelines-for-partitioning-your-app-functionality-between-client-and-server/</guid>
		<description><![CDATA[If you have been developing mobile apps for the last year, two things stick out that should make you pay special attention to your architectures. They are: 1) Saturation of wireless carriers&#8217; networks resulting in decreased throughput, a.k.a., s-l-o-w network. 2) And the second is the increase in speed of processors powering our mobile devices [...]]]></description>
			<content:encoded><![CDATA[<p>If you have been developing mobile apps for the last year, two things stick out that should make you pay special attention to your architectures.  They are:</p>
<p>1) Saturation of wireless carriers&#8217; networks resulting in decreased throughput, a.k.a., s-l-o-w network.</p>
<p>2) And the second is the increase in speed of processors powering our mobile devices to over 1Gz and quickly rising.</p>
<p>More coming soon!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.brianbuikema.com/2010/09/android-development-guidelines-for-partitioning-your-app-functionality-between-client-and-server/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Thoughts on owning both a Smartphone and a Tablet</title>
		<link>http://blog.brianbuikema.com/2010/09/thoughts-on-owning-both-a-smartphone-and-a-tablet/</link>
		<comments>http://blog.brianbuikema.com/2010/09/thoughts-on-owning-both-a-smartphone-and-a-tablet/#comments</comments>
		<pubDate>Tue, 07 Sep 2010 08:39:25 +0000</pubDate>
		<dc:creator>Brian Buikema</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Gadget]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Tablet]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://blog.brianbuikema.com/2010/09/thoughts-on-owning-both-a-smartphone-and-a-tablet/</guid>
		<description><![CDATA[I am quite excited that Samsung is going to release the first Android tablets in the coming weeks. I consider myself a huge proponent of the Android platform and own a Droid. In fact, you can read all of my dozens of Android posts found here. With that said, I&#8217;m very upset at the prospect [...]]]></description>
			<content:encoded><![CDATA[<p>I am quite excited that Samsung is going to release the first Android tablets in the coming weeks.  I consider myself a huge proponent of the Android platform and own a Droid.  In fact, you can read all of my dozens of Android posts found <a href="http://blog.brianbuikema.com/category/android">here</a>.</p>
<p>With that said, I&#8217;m very upset at the prospect of being required to purchasing another two-year contract with a wireless carrier in order to have wireless data services, aka, data plan.  PCWorld has an interesting article on this found <a href="http://www.pcworld.com/businesscenter/article/204901/success_of_samsung_galaxy_tab_doomed_by_carrier_contracts.html?tk=hp_pop">here</a>.</p>
<p>You ask, what choices do you really have?  The first that comes to mind is <a href="http://en.wikipedia.org/wiki/Tethering" target="_blank"><em>Tethering</em></a>.  The second is to purchase a Wi-Fi only tablet when available, thus not requiring a data plan.</p>
<p>Let&#8217;s look at the Pros and Cons of owning both a Smartphone and Tablet.</p>
<h2>Pros</h2>
<p>You will be able to have two slightly different, slightly similar devices to choose from depending on your immediate needs.  For example, smartphones are more compact than tablets.</p>
<p>Maybe we will start using the actual &#8220;phone&#8221; feature on our smartphones again.  <img src='http://blog.brianbuikema.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />   And do more reading, typing, and gaming on our tablets.</p>
<h2>Cons</h2>
<p>You may have to buy two separate data plans, similar to the 2-year agreements we&#8217;re currently accustomed to.</p>
<p>Now you will own two quickly obsoleting devices.  <img src='http://blog.brianbuikema.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>You will have to learn how to use two different devices.  Of course, if both are Android platforms, you should really have no, or very little ramp up time learning to use your devices.</p>
<h2>The Future &#8211; How I would like to see Industry Accommodate the Consumer</h2>
<p>I&#8217;ve had this discussion with a dozen or so folks.  I want to purchase a powerfully equipped smartphone, complete with phone and data plans, and be able to purchase &#8220;touchscreen-only&#8221; tablets that come in a variety of sizes, e.g., 7&#8243;, 10&#8243;, etc,&#8230; that cost no more than $99 <em>AND </em>providing a docking mechanism for my smartphone.</p>
<p>In this way, my smartphone provides the CPU, memory, and power supply for the &#8220;touchscreen-only&#8221; tablet.  And me, as a consumer, am not required to purchase a separate data plan for my tablet.  How cool is that!</p>
<p>Additionally, I am free to by &#8220;touchscreen-only&#8221; tablets as often as I choose, since they are relatively cheap at around $99 each.  I&#8217;m betting that the market will flood with a variety of tablets, and consumers will want to <em>buy-and-try</em> these at will.</p>
<p>I am <strong>really interested</strong> in everyone&#8217;s thoughts on this, and am sincerely asking that you comment on this idea.</p>
<p>I hope you find this interesting and innovative.  Remember, we are in the infant stage of <strong><em>all things mobile</em></strong>, and we will see lots of innovation and changes in the coming months.  <img src='http://blog.brianbuikema.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.brianbuikema.com/2010/09/thoughts-on-owning-both-a-smartphone-and-a-tablet/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Android Development &#8211; Part 3:  Using Google&#8217;s Places API to Develop Compelling Location Based Mobile Applications</title>
		<link>http://blog.brianbuikema.com/2010/08/android-development-part-3-using-googles-places-api-to-develop-compelling-location-based-mobile-applications/</link>
		<comments>http://blog.brianbuikema.com/2010/08/android-development-part-3-using-googles-places-api-to-develop-compelling-location-based-mobile-applications/#comments</comments>
		<pubDate>Tue, 24 Aug 2010 03:21:44 +0000</pubDate>
		<dc:creator>Brian Buikema</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[Enterprise]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Location-Based]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Proximity Alerts]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://blog.brianbuikema.com/?p=1141</guid>
		<description><![CDATA[In this post, we will develop the code for our location-based mobile application.  Remember we designed our application in Part 2, and now we ready to tackle the code! Developing the &#8220;Places In My Proximity&#8221; Android Service More coming soon! Developing the &#8220;Retailer Rewards&#8221; Class &#8211; a POJO Requesting Campaign Details from the &#8220;Retailer Campaign&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>In this post, we will develop the code for our location-based mobile application.   Remember we designed our application in <a href="http://blog.brianbuikema.com/2010/08/android-development-part-2-using-googles-places-api-to-develop-compelling-location-based-mobile-applications/" target="_blank">Part 2</a>, and now we ready to tackle the code!</p>
<h2>Developing the &#8220;Places In My Proximity&#8221; Android Service</h2>
<p>More coming soon!</p>
<h2>Developing the &#8220;Retailer Rewards&#8221; Class &#8211; a POJO Requesting Campaign Details from the &#8220;Retailer Campaign&#8221; Server-side RESTful Service</h2>
<p>More coming soon!</p>
<h2>Developing the &#8220;Consumer Settings Activity&#8221; and Supporting XML Configuration Files</h2>
<p>More coming soon!</p>
<h2>Developing the &#8220;Rewards Notification&#8221; Class</h2>
<p>More coming soon!</p>
<h2>Developing the &#8220;Display Retailer Reward Activity&#8221; Class</h2>
<p>More coming soon!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.brianbuikema.com/2010/08/android-development-part-3-using-googles-places-api-to-develop-compelling-location-based-mobile-applications/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
