tag:blogger.com,1999:blog-26324550375688902822024-03-13T00:01:47.017-07:00 Hanging on PHP, Rails and Opensources Parsoya Rakeshhttp://www.blogger.com/profile/03882487946199158773noreply@blogger.comBlogger19125tag:blogger.com,1999:blog-2632455037568890282.post-79605003286685060422022-03-31T17:08:00.007-07:002022-04-07T10:13:30.595-07:00Scalable E-Commerce Architecture (Monolithic to Microservices)<p> </p><p class="MsoNormal"><b style="mso-bidi-font-weight: normal;">Scalable E-Commerce
Architecture (Monolithic to Microservices)<o:p></o:p></b></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><b>Building Blocks for E-Commerce: -</b><o:p></o:p></p>
<p class="MsoNormal">The ecommerce is made up of various services such as Product
Information System, Order Management System, Price Management System, Inventory
Management System and others. The platform is monolithic if all service is tightly
coupled and available on single platform only.<o:p></o:p></p>
<p class="MsoNormal"><span style="mso-no-proof: yes;"><br /></span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgFdC_Ttt3iqsfXqto_DRgjSfbLaWvi9boxMviPmQK7xPnFiL0o_aCeDNw_v3C6PULguqPffMnp0mWXZr_bbuX9wNZxQkOpVT0yHfvCIdjn_0LhWRrcwXUOy3d0iN46Um4gUgWsu0OdKHjE01fa1gjqVusktx29FcsxSSTmWqAY86oxcOxYTrnDO0RmIw" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="404" data-original-width="769" height="289" src="https://blogger.googleusercontent.com/img/a/AVvXsEgFdC_Ttt3iqsfXqto_DRgjSfbLaWvi9boxMviPmQK7xPnFiL0o_aCeDNw_v3C6PULguqPffMnp0mWXZr_bbuX9wNZxQkOpVT0yHfvCIdjn_0LhWRrcwXUOy3d0iN46Um4gUgWsu0OdKHjE01fa1gjqVusktx29FcsxSSTmWqAY86oxcOxYTrnDO0RmIw=w640-h289" width="640" /></a></div><br /><!--[endif]--><o:p></o:p><p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<h3 style="background: white; margin-bottom: 6.0pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; margin: 0in 0in 6pt;"><span color="windowtext" face=""Calibri",sans-serif" style="font-size: 11pt; line-height: 107%; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">Traditional vs modern e-commerce architecture<o:p></o:p></span></h3>
<p style="-webkit-text-stroke-width: 0px; background: white; box-sizing: inherit; font-variant-caps: normal; font-variant-ligatures: normal; margin-bottom: 24.0pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; margin: 0in 0in 24pt; max-height: 1e+06px; orphans: 2; overflow-wrap: break-word; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; widows: 2; word-spacing: 0px;"><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">With traditional, <span color="windowtext" style="text-decoration: none; text-underline: none;">monolithic
e-commerce architectures</span>, it’s impossible to modify individual
e-commerce functions without compromising the entire system. Something as
simple as upscaling infrastructure for a product launch or holiday weekend can
require months of preparation.<o:p></o:p></span></p>
<p style="-webkit-text-stroke-width: 0px; background: white; box-sizing: inherit; font-variant-caps: normal; font-variant-ligatures: normal; margin-bottom: 24.0pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; margin: 0in 0in 24pt; max-height: 1e+06px; orphans: 2; overflow-wrap: break-word; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; widows: 2; word-spacing: 0px;"><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">With modern, service-oriented e-commerce
architectures, brands don’t need months to prepare for an event that only lasts
a few days. They can also update, upscale, or enhance individual services
within their tech stack without jeopardizing the entire system.<o:p></o:p></span></p>
<p style="-webkit-text-stroke-width: 0px; background: white; box-sizing: inherit; font-variant-caps: normal; font-variant-ligatures: normal; margin-bottom: 24.0pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; margin: 0in 0in 24pt; max-height: 1e+06px; orphans: 2; overflow-wrap: break-word; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; widows: 2; word-spacing: 0px;"></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiBSsJQDR6HB0QoT_lrELuzE_Fpvj1I05uPrkdFQSZicALC3P_wcxHpT-IE9qaLTfUX9VNowmmEJZsv92vpAFM5xuShkFBfoc4wGyrw6o2qv5N7poBL8EV-ceI_V704ut4ZzgiFMIb2Cja_y5g7M8wCDV1jE1XzljT-_JajchltJih7nKL9gNd-TIEtzw" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="609" data-original-width="855" height="401" src="https://blogger.googleusercontent.com/img/a/AVvXsEiBSsJQDR6HB0QoT_lrELuzE_Fpvj1I05uPrkdFQSZicALC3P_wcxHpT-IE9qaLTfUX9VNowmmEJZsv92vpAFM5xuShkFBfoc4wGyrw6o2qv5N7poBL8EV-ceI_V704ut4ZzgiFMIb2Cja_y5g7M8wCDV1jE1XzljT-_JajchltJih7nKL9gNd-TIEtzw=w640-h401" width="640" /></a></div><br /><br /><p></p>
<p style="background: white; margin-bottom: 24.0pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; margin: 0in 0in 24pt;"><b><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">Traditional: </span></b><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">In a traditional e-commerce architecture, a
monolithic platform is used to power one sales channel or head. Introducing
another channel often means using another platform, leading to disconnected
data, technical debt, and <span color="windowtext" style="text-decoration: none; text-underline: none;">higher
e-commerce software costs</span>.<o:p></o:p></span></p>
<p style="-webkit-text-stroke-width: 0px; background: white; box-sizing: inherit; font-variant-caps: normal; font-variant-ligatures: normal; margin-bottom: 24.0pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; margin: 0in 0in 24pt; max-height: 1e+06px; orphans: 2; overflow-wrap: break-word; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; widows: 2; word-spacing: 0px;"><b><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">Modern:</span></b><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"> In
a modern e-commerce architecture, a “headless” commerce API is used as a data
communication layer to power multiple sales channels or heads. Services like
the <span color="windowtext" style="text-decoration: none; text-underline: none;">product
information manager (PIM)</span> and <span color="windowtext" style="text-decoration: none; text-underline: none;">order
management system (OMS)</span> are separate, scalable services and
connected through APIs. The headless CMS functions as another scalable service
that provides the content to infinite channels.<o:p></o:p></span></p>
<p style="-webkit-text-stroke-width: 0px; background: white; box-sizing: inherit; font-variant-caps: normal; font-variant-ligatures: normal; margin-bottom: 24.0pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; margin: 0in 0in 24pt; max-height: 1e+06px; orphans: 2; overflow-wrap: break-word; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; widows: 2; word-spacing: 0px;"><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">While some monolithic commerce platforms offer
the ability to <span color="windowtext" style="text-decoration: none; text-underline: none;">decouple the
frontend from the backend</span> and make the system headless, the
backend remains unscalable. In the rest of this article, I’ll walk you through
the high-level steps needed to create a scalable e-commerce website
architecture using microservices rather than a traditional monolith.<o:p></o:p></span></p>
<h2 id="step-1-review-your-current-e-commerce-architecture" style="-webkit-text-stroke-width: 0px; background: white; box-sizing: inherit; font-variant-caps: normal; font-variant-ligatures: normal; margin-bottom: 25.5pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; margin: 0in 0in 25.5pt; max-height: 1e+06px; orphans: 2; overflow-wrap: break-word; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; widows: 2; word-spacing: 0px;"><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-font-weight: normal; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">Step 1: Review Your
Current E-Commerce Architecture<o:p></o:p></span></h2>
<p style="-webkit-text-stroke-width: 0px; background: white; box-sizing: inherit; font-variant-caps: normal; font-variant-ligatures: normal; margin-bottom: 24.0pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; margin: 0in 0in 24pt; max-height: 1e+06px; orphans: 2; overflow-wrap: break-word; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; widows: 2; word-spacing: 0px;"><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">Before designing a microservices e-commerce
architecture, it’s essential to review existing architecture to identify
existing software and challenges. This will help you map priorities, determine
technical capabilities, and effectively plan for the new architecture.<o:p></o:p></span></p>
<p style="-webkit-text-stroke-width: 0px; background: white; box-sizing: inherit; font-variant-caps: normal; font-variant-ligatures: normal; margin-bottom: 24.0pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; margin: 0in 0in 24pt; max-height: 1e+06px; orphans: 2; overflow-wrap: break-word; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; widows: 2; word-spacing: 0px;"><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">Let’s take a <span color="windowtext" style="text-decoration: none; text-underline: none;">look at an
unscalable</span>, traditional architecture that <span color="windowtext" style="text-decoration: none; text-underline: none;">many
high-growth brands</span> use in niche verticals. First, we’ll review
the software, then we’ll highlight some challenges with the software and the
e-commerce architecture. Use the same approach during your review, complete
with a high-level diagram like the one below.<o:p></o:p></span></p>
<p style="-webkit-text-stroke-width: 0px; background: white; box-sizing: inherit; font-variant-caps: normal; font-variant-ligatures: normal; margin-bottom: 24.0pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; margin: 0in 0in 24pt; max-height: 1e+06px; orphans: 2; overflow-wrap: break-word; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; widows: 2; word-spacing: 0px;"></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgA3thZltfgyYoNagnyrP_GMGt9imOdkJafGDdY9qNKgEYQHfGgQl1SLkb9hmXm83fsZRRAJJlhj9CY3-bkOCf-Kasy5fR5V6XSzXKC-HxJBz4_2aEu9YP3MUP1GpTpB1pl7nggz8yPVGg_UyDaS3966C8hoaAP--St_90VYD3i9esD30kp82prDCEz-Q" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="624" data-original-width="962" height="415" src="https://blogger.googleusercontent.com/img/a/AVvXsEgA3thZltfgyYoNagnyrP_GMGt9imOdkJafGDdY9qNKgEYQHfGgQl1SLkb9hmXm83fsZRRAJJlhj9CY3-bkOCf-Kasy5fR5V6XSzXKC-HxJBz4_2aEu9YP3MUP1GpTpB1pl7nggz8yPVGg_UyDaS3966C8hoaAP--St_90VYD3i9esD30kp82prDCEz-Q=w640-h415" width="640" /></a></div><br /><br /><p></p>
<p style="-webkit-text-stroke-width: 0px; background: white; box-sizing: inherit; font-variant-caps: normal; font-variant-ligatures: normal; margin-bottom: 24.0pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; margin: 0in 0in 24pt; max-height: 1e+06px; orphans: 2; overflow-wrap: break-word; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; widows: 2; word-spacing: 0px;"><b><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">The software this brand uses includes:</span></b><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><o:p></o:p></span></p>
<p class="MsoNormal" style="background: white; line-height: normal; margin-bottom: 7.5pt; margin-left: 0in; mso-list: l0 level1 lfo3; mso-margin-top-alt: auto; tab-stops: list .5in; text-indent: -0.25in;"><!--[if !supportLists]--><span style="font-family: Symbol; font-size: 10pt; mso-bidi-font-family: Symbol; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";">
</span></span></span><!--[endif]-->Magento website: The brand uses this platform to
power its main e-commerce site. It <span color="windowtext" style="text-decoration: none; text-underline: none;">chose Magento</span> because
it’s free and relatively easy to use. However, more and more Magento extensions
are used over time.<o:p></o:p></p>
<p class="MsoNormal" style="background: white; line-height: normal; margin-bottom: 7.5pt; margin-left: 0in; mso-list: l0 level1 lfo3; mso-margin-top-alt: auto; tab-stops: list .5in; text-indent: -0.25in;"><!--[if !supportLists]--><span style="font-family: Symbol; font-size: 10pt; mso-bidi-font-family: Symbol; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";">
</span></span></span><!--[endif]-->Shopify side site: The brand launched a daily
deals site on Shopify since connecting another sales channel to Magento was not
intuitive. However, this led to <span color="windowtext" style="text-decoration: none; text-underline: none;">inventory and
fulfillment issues</span>.<o:p></o:p></p>
<p class="MsoNormal" style="background: white; line-height: normal; margin-bottom: 7.5pt; margin-left: 0in; mso-list: l0 level1 lfo3; mso-margin-top-alt: auto; tab-stops: list .5in; text-indent: -0.25in;"><!--[if !supportLists]--><span style="font-family: Symbol; font-size: 10pt; mso-bidi-font-family: Symbol; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";">
</span></span></span><!--[endif]-->Square in-store POS: This is the first
technology the brand purchased when it launched its in-store business. Magento
and Shopify were added later on.<br /><br /><o:p></o:p></p>
<p style="-webkit-text-stroke-width: 0px; background: white; box-sizing: inherit; font-variant-caps: normal; font-variant-ligatures: normal; margin-bottom: 24.0pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; margin: 0in 0in 24pt; max-height: 1e+06px; orphans: 2; overflow-wrap: break-word; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; widows: 2; word-spacing: 0px;"><b><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">The biggest software-related challenges this
brand faces include:</span></b><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><o:p></o:p></span></p>
<p class="MsoNormal" style="background: white; line-height: normal; margin-bottom: 7.5pt; margin-left: 0in; mso-list: l3 level1 lfo4; mso-margin-top-alt: auto; tab-stops: list .5in; text-indent: -0.25in;"><!--[if !supportLists]--><span style="font-family: Symbol; font-size: 10pt; mso-bidi-font-family: Symbol; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";">
</span></span></span><!--[endif]-->Overselling occurs because Shopify, Magento, and
the POS do not communicate with one order management system (OMS).<o:p></o:p></p>
<p class="MsoNormal" style="background: white; line-height: normal; margin-bottom: 7.5pt; margin-left: 0in; mso-list: l3 level1 lfo4; mso-margin-top-alt: auto; tab-stops: list .5in; text-indent: -0.25in;"><!--[if !supportLists]--><span style="font-family: Symbol; font-size: 10pt; mso-bidi-font-family: Symbol; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";">
</span></span></span><!--[endif]-->Productivity declines because offline
conversations, paperwork, and patchy Magento extensions are required to make
the system work.<o:p></o:p></p>
<p class="MsoNormal" style="background: white; line-height: normal; margin-bottom: 7.5pt; margin-left: 0in; mso-list: l3 level1 lfo4; mso-margin-top-alt: auto; tab-stops: list .5in; text-indent: -0.25in;"><!--[if !supportLists]--><span style="font-family: Symbol; font-size: 10pt; mso-bidi-font-family: Symbol; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";">
</span></span></span><!--[endif]-->The brand needs additional resources for data
entry since connecting channels require manual data entry in <span color="windowtext" style="text-decoration: none; text-underline: none;">spreadsheets</span> or <span color="windowtext" style="text-decoration: none; text-underline: none;">Quickbooks</span>.<o:p></o:p></p>
<p class="MsoNormal" style="background: white; line-height: normal; margin-bottom: 7.5pt; margin-left: 0in; mso-list: l3 level1 lfo4; mso-margin-top-alt: auto; tab-stops: list .5in; text-indent: -0.25in;"><!--[if !supportLists]--><span style="font-family: Symbol; font-size: 10pt; mso-bidi-font-family: Symbol; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";">
</span></span></span><!--[endif]-->Magento extensions and Shopify apps cause single
points of failure; installing, uninstalling, or updating them can bring down
the entire system.<o:p></o:p></p>
<p style="-webkit-text-stroke-width: 0px; background: white; box-sizing: inherit; font-variant-caps: normal; font-variant-ligatures: normal; margin-bottom: 24.0pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; margin: 0in 0in 24pt; max-height: 1e+06px; orphans: 2; overflow-wrap: break-word; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; widows: 2; word-spacing: 0px;"><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">Clearly defining your existing architecture,
software, and challenges like this is imperative for setting up a new approach
to a service-oriented e-commerce architecture that’s more scalable.<o:p></o:p></span></p>
<h2 id="step-2-build-or-buy-e-commerce-microservices" style="-webkit-text-stroke-width: 0px; background: white; box-sizing: inherit; font-variant-caps: normal; font-variant-ligatures: normal; margin-bottom: 25.5pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; margin: 0in 0in 25.5pt; max-height: 1e+06px; orphans: 2; overflow-wrap: break-word; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; widows: 2; word-spacing: 0px;"><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-font-weight: normal; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">Step 2: Build or Buy E-Commerce Microservices<o:p></o:p></span></h2>
<p style="-webkit-text-stroke-width: 0px; background: white; box-sizing: inherit; font-variant-caps: normal; font-variant-ligatures: normal; margin-bottom: 24.0pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; margin: 0in 0in 24pt; max-height: 1e+06px; orphans: 2; overflow-wrap: break-word; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; widows: 2; word-spacing: 0px;"><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">Once you understand your existing architecture
and business needs, it’s time to choose an approach to replace it that does not
require an expensive and risky <span color="windowtext" style="text-decoration: none; text-underline: none;">replatforming
project</span>. The primary choice at this stage is between building or
buying commerce microservices, applications, and APIs.<o:p></o:p></span></p>
<p style="-webkit-text-stroke-width: 0px; background: white; box-sizing: inherit; font-variant-caps: normal; font-variant-ligatures: normal; margin-bottom: 24.0pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; margin: 0in 0in 24pt; max-height: 1e+06px; orphans: 2; overflow-wrap: break-word; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; widows: 2; word-spacing: 0px;"><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">An example of a
differentiating feature is a room builder for a home decor e-commerce company.
Examples of necessary features include catalog management, cart, pricing, and
checkout.<o:p></o:p></span></p>
<h3 style="-webkit-text-stroke-width: 0px; background: white; box-sizing: inherit; font-variant-caps: normal; font-variant-ligatures: normal; margin-bottom: 6.0pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; margin: 0in 0in 6pt; max-height: 1e+06px; orphans: 2; overflow-wrap: break-word; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; widows: 2; word-spacing: 0px;"><span color="windowtext" face=""Calibri",sans-serif" style="font-size: 11pt; line-height: 107%; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">Building e-commerce
microservices<o:p></o:p></span></h3>
<p style="background: white; box-sizing: inherit; margin: 0in 0in 24pt; max-height: 1e+06px; overflow-wrap: break-word;"><span face="Calibri, sans-serif"><span style="font-size: 14.6667px;">Building a complete microservices architecture for e-commerce in-house is only viable for an enterprise with complex needs. A custom solution can be more expensive to build and maintain. So, unless you’re a billion-dollar enterprise like Amazon, it’ll probably end up being more trouble than it’s worth.</span></span></p><p style="background: white; box-sizing: inherit; margin: 0in 0in 24pt; max-height: 1e+06px; overflow-wrap: break-word;"><span face="Calibri, sans-serif" style="font-size: 14.6667px;">However, there are some microservices you will want to build in-house. One popular way for building custom e-commerce applications is with Amazon elastic container services (ECS). This is a service that lets you quickly launch, exit, or manage docker containers on a cluster. Amazon ECS maintains the application's availability, allowing users to scale containers when necessary.</span></p><p style="background: white; box-sizing: inherit; margin: 0in 0in 24pt; max-height: 1e+06px; overflow-wrap: break-word;"><span face="Calibri, sans-serif" style="font-size: 14.6667px;">Developers at e-commerce brands can also build their own system using Docker. Docker packages individual applications into Docker containers and uses tools such as Kubernetes and Portainer to manage and scale containerized applications (i.e. microservices). Further, you can use tools such as Kong or Ocelot to act as API gateway and help backend microservices communicate with frontend client devices.</span></p><p style="background: white; box-sizing: inherit; margin: 0in 0in 24pt; max-height: 1e+06px; overflow-wrap: break-word;"><span face="Calibri, sans-serif" style="font-size: 14.6667px;">As you can see, there are many tools required to build e-commerce microservices in-house. Besides creating and managing service containers, developers and operation teams need to configure applications to handle load balancing, service discovery, logging, monitoring, and tracing. That’s a lot of overhead. If the company isn’t careful, it can have many distributed monoliths in its e-commerce architecture.</span></p>
<h3 style="-webkit-text-stroke-width: 0px; background: white; box-sizing: inherit; font-variant-caps: normal; font-variant-ligatures: normal; margin-bottom: 6.0pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; margin: 0in 0in 6pt; max-height: 1e+06px; orphans: 2; overflow-wrap: break-word; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; widows: 2; word-spacing: 0px;"><span color="windowtext" face=""Calibri",sans-serif" style="font-size: 11pt; line-height: 107%; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">Buying e-commerce
microservices<o:p></o:p></span></h3>
<p style="background: white; box-sizing: inherit; margin: 0in 0in 24pt; max-height: 1e+06px; orphans: 2; overflow-wrap: break-word; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; widows: 2;"><span face="Calibri, sans-serif"><span style="font-size: 14.6667px;">Another way to build a scalable e-commerce architecture is by using commerce services and APIs from third-party providers. This approach can help brands architect a microservices-based infrastructure while simplifying service management. Below is a simple e-commerce infrastructure diagram that demonstrates a microservices-based architecture.</span></span></p>
<p style="-webkit-text-stroke-width: 0px; background: white; box-sizing: inherit; font-variant-caps: normal; font-variant-ligatures: normal; margin-bottom: 24.0pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; margin: 0in 0in 24pt; max-height: 1e+06px; orphans: 2; overflow-wrap: break-word; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; widows: 2; word-spacing: 0px;"></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjdM8kDX1NB_1VZquw4fZIJQrwaB0i849UbDNB8WK8V3RW1br84XNkyLrb5M1rXqYd35CLr3WuqzR9YQy_41lLSQqLfmX9q-uX00mV2GhOFz55IaqxPFKBzRCjAAI_ykUgbE0g7WG7utg_9GFI1mKR2Fj8IpSXNAQ1eouZXAddt_oI9so67BXL_0tPSQw" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="608" data-original-width="937" height="416" src="https://blogger.googleusercontent.com/img/a/AVvXsEjdM8kDX1NB_1VZquw4fZIJQrwaB0i849UbDNB8WK8V3RW1br84XNkyLrb5M1rXqYd35CLr3WuqzR9YQy_41lLSQqLfmX9q-uX00mV2GhOFz55IaqxPFKBzRCjAAI_ykUgbE0g7WG7utg_9GFI1mKR2Fj8IpSXNAQ1eouZXAddt_oI9so67BXL_0tPSQw=w640-h416" width="640" /></a></div><br /><br /><p></p>
<p style="background: white; box-sizing: inherit; margin: 0in 0in 24pt; max-height: 1e+06px; orphans: 2; overflow-wrap: break-word; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; widows: 2;"><b style="-webkit-text-stroke-width: 0px; font-variant-caps: normal; font-variant-ligatures: normal; word-spacing: 0px;"><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">Backend</span></b><span face="Calibri, sans-serif" style="-webkit-text-stroke-width: 0px; font-size: 11pt; font-variant-caps: normal; font-variant-ligatures: normal; word-spacing: 0px;">: <o:p></o:p></span><span style="background-color: transparent; font-size: 14.6667px;"><span face="Calibri, sans-serif">There are a robust set of apps that includes a PIM, OMS, and pricing engine that come with a user interface for business users. These modular, independent applications are equipped with APIs to provide as much flexibility as custom applications.</span></span></p>
<p style="background: white; box-sizing: inherit; margin: 0in 0in 24pt; max-height: 1e+06px; orphans: 2; overflow-wrap: break-word; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; widows: 2;"><b style="-webkit-text-stroke-width: 0px; font-variant-caps: normal; font-variant-ligatures: normal; word-spacing: 0px;"><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">API: </span></b><span style="background-color: transparent; font-size: 14.6667px;"><span face="Calibri, sans-serif">To orchestrate data and events between the frontend and backend, brands must have an API middle layer. This layer allows them to move away from monolithic architectures by “microservicing” elements of their tech stack one at a time instead of all together.</span></span></p>
<p style="-webkit-text-stroke-width: 0px; background: white; box-sizing: inherit; font-variant-caps: normal; font-variant-ligatures: normal; margin-bottom: 24.0pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; margin: 0in 0in 24pt; max-height: 1e+06px; orphans: 2; overflow-wrap: break-word; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; widows: 2; word-spacing: 0px;"><b><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">Frontend</span></b><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">: The
frontend is managed by a headless CMS that supports multiple frameworks like
Angular, React, and Vue to build reusable components. It lets you control the
entire frontend shopping experience by integrating commerce services via APIs.<o:p></o:p></span></p>
<p style="-webkit-text-stroke-width: 0px; background: white; box-sizing: inherit; font-variant-caps: normal; font-variant-ligatures: normal; margin-bottom: 24.0pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; margin: 0in 0in 24pt; max-height: 1e+06px; orphans: 2; overflow-wrap: break-word; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; widows: 2; word-spacing: 0px;"><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">Third-party providers give the flexibility
needed to design a future-proof e-commerce architecture. It lets retailers add,
remove, and modify individual microservices within their architecture without
risking the entire system and building the microservices themselves.<o:p></o:p></span></p>
<h2 id="step-3-break-down-your-monolithic-architecture" style="-webkit-text-stroke-width: 0px; background: white; box-sizing: inherit; font-variant-caps: normal; font-variant-ligatures: normal; margin-bottom: 25.5pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; margin: 0in 0in 25.5pt; max-height: 1e+06px; orphans: 2; overflow-wrap: break-word; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; widows: 2; word-spacing: 0px;"><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-font-weight: normal; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">Step 3: Break Down Your Monolithic Architecture<o:p></o:p></span></h2>
<p style="-webkit-text-stroke-width: 0px; background: white; box-sizing: inherit; font-variant-caps: normal; font-variant-ligatures: normal; margin-bottom: 24.0pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; margin: 0in 0in 24pt; max-height: 1e+06px; orphans: 2; overflow-wrap: break-word; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; widows: 2; word-spacing: 0px;"></p><p style="-webkit-text-stroke-width: 0px; background: white; box-sizing: inherit; color: black; font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; margin: 0in 0in 24pt; max-height: 1e+06px; orphans: 2; overflow-wrap: break-word; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"></p><p></p><p style="background: white; box-sizing: inherit; margin: 0in 0in 24pt; max-height: 1e+06px; overflow-wrap: break-word;"><span face="Calibri, sans-serif"><span style="font-size: 14.6667px;">After finalizing the new architecture, it’s time to move away from the old, legacy commerce platform. While there are many modern-day design patterns, it’s best to use the strangler pattern to migrate to a modern, service-oriented platform. This approach helps you move away from a monolith by replacing one component at a time. It minimizes the risk of project failure during migration and distributes the development effort needed.</span></span></p>
<p style="-webkit-text-stroke-width: 0px; background: white; box-sizing: inherit; font-variant-caps: normal; font-variant-ligatures: normal; margin-bottom: 24.0pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; margin: 0in 0in 24pt; max-height: 1e+06px; orphans: 2; overflow-wrap: break-word; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; widows: 2; word-spacing: 0px;"></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjE9dJ0g2pnyRytOWsFcauaC4sYjbBXHWRD0iSuQLEINSf1DPndNcTXCpW3jX8eZlFFqm4Qi-kmhTuQ2RaA41OOP6ReMwKIMn62Oa_mCWdSPZkrOXJdQDCxo2vQg1Du-GGB15C-4OWMycrXtjSOL2UlStVE38lBntklYc9GpiG4-_m2ZEL1NUFqw2NhQg" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="597" data-original-width="920" height="416" src="https://blogger.googleusercontent.com/img/a/AVvXsEjE9dJ0g2pnyRytOWsFcauaC4sYjbBXHWRD0iSuQLEINSf1DPndNcTXCpW3jX8eZlFFqm4Qi-kmhTuQ2RaA41OOP6ReMwKIMn62Oa_mCWdSPZkrOXJdQDCxo2vQg1Du-GGB15C-4OWMycrXtjSOL2UlStVE38lBntklYc9GpiG4-_m2ZEL1NUFqw2NhQg=w640-h416" width="640" /></a></div><br /><br /><p></p>
<p style="background: white; box-sizing: inherit; margin: 0in 0in 24pt; max-height: 1e+06px; overflow-wrap: break-word;"><span face="Calibri, sans-serif"><span style="font-size: 14.6667px;">Legacy platforms such as Magento, Shopify, and Oracle ATG let you separate the frontend and e-commerce backend with APIs. E-commerce businesses can leverage this and use API calls to pull data onto a modern frontend like backend commerce components with microservices such as Stripe for payments, Algolia for search.</span></span></p><p style="background: white; box-sizing: inherit; margin: 0in 0in 24pt; max-height: 1e+06px; overflow-wrap: break-word;"><span face="Calibri, sans-serif" style="font-size: 14.6667px;">Let’s assume a brand wants to start with migrating the catalog in its monolithic e-commerce platform to a modular, service-oriented PIM. The first step is to export all product data in a format that’s compatible with the new microservices-based system. Then you need to parse and import it into the new database. The actual process will vary based on the choice of service and database. However, here’s a sample Node script that uses the XmlStream library:</span></p>
<pre style="-webkit-text-stroke-width: 0px; background: rgb(245, 242, 240); box-sizing: inherit; font-variant-caps: normal; font-variant-ligatures: normal; hyphens: none; margin-bottom: 6.0pt; margin-left: 0in; margin-right: 0in; margin-top: 6.0pt; margin: 6pt 0in; max-height: 1e+06px; orphans: 2; overflow-wrap: normal; overflow: auto; tab-size: 4; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; text-shadow: 0px 1px; widows: 2; word-spacing: 0px;"><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="box-sizing: inherit; max-height: 1e+06px;">const fs = require('fs')<o:p></o:p></span></span></pre><pre style="background: rgb(245, 242, 240); margin-bottom: 6.0pt; margin-left: 0in; margin-right: 0in; margin-top: 6.0pt; margin: 6pt 0in;"><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">const XmlStream = require('xml-stream') ;<o:p></o:p></span></pre><pre style="background: rgb(245, 242, 240); margin-bottom: 6.0pt; margin-left: 0in; margin-right: 0in; margin-top: 6.0pt; margin: 6pt 0in;"><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">const stream=fs.createReadStream(catalog.xml');<o:p></o:p></span></pre><pre style="background: rgb(245, 242, 240); margin-bottom: 6.0pt; margin-left: 0in; margin-right: 0in; margin-top: 6.0pt; margin: 6pt 0in;"><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">const xml = new XmlStream(stream);<o:p></o:p></span></pre><pre style="background: rgb(245, 242, 240); margin-bottom: 6.0pt; margin-left: 0in; margin-right: 0in; margin-top: 6.0pt; margin: 6pt 0in;"><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><o:p> </o:p></span></pre><pre style="background: rgb(245, 242, 240); margin-bottom: 6.0pt; margin-left: 0in; margin-right: 0in; margin-top: 6.0pt; margin: 6pt 0in;"><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">xml.preserve('product-id', true);<o:p></o:p></span></pre><pre style="background: rgb(245, 242, 240); margin-bottom: 6.0pt; margin-left: 0in; margin-right: 0in; margin-top: 6.0pt; margin: 6pt 0in;"><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">xml.collect('product');<o:p></o:p></span></pre><pre style="background: rgb(245, 242, 240); margin-bottom: 6.0pt; margin-left: 0in; margin-right: 0in; margin-top: 6.0pt; margin: 6pt 0in;"><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">xml.on('endElement: product-id', function(item) {<o:p></o:p></span></pre><pre style="background: rgb(245, 242, 240); margin-bottom: 6.0pt; margin-left: 0in; margin-right: 0in; margin-top: 6.0pt; margin: 6pt 0in;"><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">saveToDatabase(item);<o:p></o:p></span></pre><pre style="background: rgb(245, 242, 240); margin-bottom: 6.0pt; margin-left: 0in; margin-right: 0in; margin-top: 6.0pt; margin: 6pt 0in;"><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">});<o:p></o:p></span></pre>
<p style="background: white; box-sizing: inherit; margin: 0in 0in 24pt; max-height: 1e+06px; overflow-wrap: break-word;"><span face="Calibri, sans-serif"><span style="font-size: 14.6667px;">Legacy platforms such as Magento, Shopify, and Oracle ATG let you separate the frontend and e-commerce backend with APIs. E-commerce businesses can leverage this and use API calls to pull data onto a modern frontend like backend commerce components with microservices such as Stripe for payments, Algolia for search.</span></span></p><p style="background: white; box-sizing: inherit; margin: 0in 0in 24pt; max-height: 1e+06px; overflow-wrap: break-word;"><span face="Calibri, sans-serif" style="font-size: 14.6667px;">Let’s assume a brand wants to start with migrating the catalog in its monolithic e-commerce platform to a modular, service-oriented PIM. The first step is to export all product data in a format that’s compatible with the new microservices-based system. Then you need to parse and import it into the new database. The actual process will vary based on the choice of service and database. However, here’s a sample Node script that uses the XmlStream library:</span></p>
<h2 id="step-4-rally-support-around-the-new-architecture" style="-webkit-text-stroke-width: 0px; background: white; box-sizing: inherit; font-variant-caps: normal; font-variant-ligatures: normal; margin-bottom: 25.5pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; margin: 0in 0in 25.5pt; max-height: 1e+06px; orphans: 2; overflow-wrap: break-word; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; widows: 2; word-spacing: 0px;"><span face=""Calibri",sans-serif" style="font-size: 11pt; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-font-weight: normal; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">Step 4: Rally
Support Around the New Architecture<o:p></o:p></span></h2>
<p style="background: white; box-sizing: inherit; margin: 0in 0in 24pt; max-height: 1e+06px; overflow-wrap: break-word;"><span face="Calibri, sans-serif"><span style="font-size: 14.6667px;">Engineers and developers can craft solid implementation ideas and migration strategies to deploy a microservice architecture. However, they’ll likely need the entire organization's support, including C-level executives and board of directors at some level during the project.</span></span></p><p style="background: white; box-sizing: inherit; margin: 0in 0in 24pt; max-height: 1e+06px; overflow-wrap: break-word;"><span face="Calibri, sans-serif" style="font-size: 14.6667px;">A recent MIT Sloan Management report reveals that every successful digital transformation demands that leaders transform themselves digitally first. Adopting a new e-commerce architecture is unlikely to be effective without leadership embracing and championing the modern, scalable e-commerce approach. Key stakeholders and business executives must be ready for the changes and long-term commitment of this new, modern architecture.</span></p><p style="background: white; box-sizing: inherit; margin: 0in 0in 24pt; max-height: 1e+06px; overflow-wrap: break-word;"><span face="Calibri, sans-serif" style="font-size: 14.6667px;">Also, the development team must believe enough in the idea to “light up” the rest of the organization. Because adopting a microservice architecture requires more deployable units, it takes more effort to implement. So it's much harder to scale without the whole team on board. The engineering team should show key departments why a microservices system is far more scalable and easier to customize, as well as the preparations and the commitment needed to implement it effectively.</span></p><p style="background: white; box-sizing: inherit; margin: 0in 0in 24pt; max-height: 1e+06px; overflow-wrap: break-word;"><span face="Calibri, sans-serif"><span style="font-size: 14.6667px;"><br /></span></span></p><p style="background: white; box-sizing: inherit; margin: 0in 0in 24pt; max-height: 1e+06px; overflow-wrap: break-word;"><span face="Calibri, sans-serif"><span style="font-size: 14.6667px;">Following this step and other steps outlined above will position your company for long-term success without bringing ongoing activities across merchandising, marketing, and development to a standstill.</span></span></p><p class="MsoNormal"><o:p> </o:p></p><p class="MsoNormal"><o:p> </o:p></p><p class="MsoNormal">As business grows the demands for scalability and flexibility increases to meet the needs.<o:p></o:p></p><p class="MsoNormal"><o:p> </o:p></p><p class="MsoNormal">Benefits of Monolithic Architecture: -<o:p></o:p></p><p class="MsoListParagraphCxSpFirst" style="text-indent: -0.25in;"></p><ul style="text-align: left;"><li>-<span style="font-size: 7pt; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;"> </span>Simple to develop</li><li>-<span style="font-size: 7pt; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;"> </span>Simple to Test (Functional Test using Selenium)</li><li>-<span style="font-size: 7pt; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;"> </span>Simple Deployment</li><li>-<span style="font-size: 7pt; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;"> </span>Simple Scale Horizontally. Multiple Copies behind load balancer</li></ul><o:p></o:p><p></p><p class="MsoListParagraphCxSpMiddle" style="text-indent: -0.25in;"><o:p></o:p></p><p class="MsoListParagraphCxSpMiddle" style="text-indent: -0.25in;"><o:p></o:p></p><p class="MsoListParagraphCxSpLast" style="text-indent: -0.25in;"><o:p></o:p></p><p class="MsoNormal">Drawbacks of Monolithic Architecture: -<o:p></o:p></p><p class="MsoListParagraphCxSpFirst" style="text-indent: -0.25in;"></p><ul style="text-align: left;"><li>-<span style="font-size: 7pt; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;"> </span>Limitation in size and complexity</li><li>-<span style="font-size: 7pt; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;"> </span>Larger the Application, more the complexity</li><li>-<span style="font-size: 7pt; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;"> </span>Performance effected as consumption of application grows</li><li>-<span style="font-size: 7pt; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;"> </span>Deploy whole application every time</li><li>-<span style="font-size: 7pt; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;"> </span>Extensive Manual Testing</li><li>-<span style="font-size: 7pt; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;"> </span>Any bug can bring down whole application</li><li>-<span style="font-size: 7pt; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal;"> </span>Hard to accept new technologies</li><li><o:p> </o:p></li></ul><o:p></o:p><p></p><p class="MsoListParagraphCxSpMiddle" style="text-indent: -0.25in;"><o:p></o:p></p><p class="MsoListParagraphCxSpMiddle" style="text-indent: -0.25in;"><o:p></o:p></p><p class="MsoListParagraphCxSpMiddle" style="text-indent: -0.25in;"><o:p></o:p></p><p class="MsoListParagraphCxSpMiddle" style="text-indent: -0.25in;"><o:p></o:p></p><p class="MsoListParagraphCxSpMiddle" style="text-indent: -0.25in;"><o:p></o:p></p><p class="MsoListParagraphCxSpLast" style="text-indent: -0.25in;"><o:p></o:p></p><p class="MsoNormal">Instead of using monolithic approach, the application can be distributed in various microservices which run independently. The microservices could be exposed using various API like REST or RPC. The micro service itself is independent application which have it own way to save or expose data. Also, the application can have their own database (RDBMS or NoSQL).</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Basic Architecture for micro service: -<o:p></o:p></p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEisbkBXixAV3X6YOHiXj_i1gK6Bvw9a2X1TKP8eQLfW4vHVl1vm2gnrwIhfra1ec0oi1ayC8Ju-LxZvc307oqyQgQkWyxPxmn_u5tKMsRYTWU_1NqiMO3zZ9v6083MfcD-7bV78l-y69rg3R-N9-RNHDPx2HN_uxrDapJy1sTB_mr8GImKp_06yJ2mg0w" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="390" data-original-width="881" height="284" src="https://blogger.googleusercontent.com/img/a/AVvXsEisbkBXixAV3X6YOHiXj_i1gK6Bvw9a2X1TKP8eQLfW4vHVl1vm2gnrwIhfra1ec0oi1ayC8Ju-LxZvc307oqyQgQkWyxPxmn_u5tKMsRYTWU_1NqiMO3zZ9v6083MfcD-7bV78l-y69rg3R-N9-RNHDPx2HN_uxrDapJy1sTB_mr8GImKp_06yJ2mg0w=w640-h284" width="640" /></a></div><br /><br />
<p class="MsoNormal"><b style="mso-bidi-font-weight: normal;">Microservice Base eCommerce
Application: -<o:p></o:p></b></p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiCm6qCSO7jdikND9ao8ny1Dcbf1L3DCdz4x6ghPnR-_4-QXcoW9YLZHYismWd3xVNkKnTRSte7BKZOwAbmfnEGIGrK87EZKS-HhhzhWxcdswHc3Rfh4DwVZIRYFC0-rqw41Mb1KeitEPRVC-hT7y_X5ufBJcCIDAwyNTdzxFm9lV5aUjx9KfPCINZgYg" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="609" data-original-width="975" height="400" src="https://blogger.googleusercontent.com/img/a/AVvXsEiCm6qCSO7jdikND9ao8ny1Dcbf1L3DCdz4x6ghPnR-_4-QXcoW9YLZHYismWd3xVNkKnTRSte7BKZOwAbmfnEGIGrK87EZKS-HhhzhWxcdswHc3Rfh4DwVZIRYFC0-rqw41Mb1KeitEPRVC-hT7y_X5ufBJcCIDAwyNTdzxFm9lV5aUjx9KfPCINZgYg=w640-h400" width="640" /></a></div><br /><br />
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><b style="mso-bidi-font-weight: normal;">Useful Integration
Tools for Ecommerce: -<o:p></o:p></b></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 7.5pt; margin-left: 0in; mso-list: l1 level1 lfo2; mso-margin-top-alt: auto; tab-stops: list .5in; text-indent: -0.25in;"><!--[if !supportLists]--><span style="font-family: Symbol; font-size: 10pt; mso-bidi-font-family: Symbol; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";">
</span></span></span><!--[endif]-->ERP (Enterprise Resource Planning system)
to streamline the exchange of information between a company’s different units
(e.g., finance department, warehouses). Example SAP <o:p></o:p></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 7.5pt; margin-left: 0in; mso-list: l1 level1 lfo2; mso-margin-top-alt: auto; tab-stops: list .5in; text-indent: -0.25in;"><!--[if !supportLists]--><span style="font-family: Symbol; font-size: 10pt; mso-bidi-font-family: Symbol; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";">
</span></span></span><!--[endif]-->PIM (Product Information Management system)
to collect holistic information about products and push it online. Example: CDS
(Content Delivery Drupal)<o:p></o:p></p>
<p class="MsoNormal" style="line-height: normal; margin-bottom: 7.5pt; margin-left: 0in; mso-list: l1 level1 lfo2; mso-margin-top-alt: auto; tab-stops: list .5in; text-indent: -0.25in;"><!--[if !supportLists]--><span style="font-family: Symbol; font-size: 10pt; mso-bidi-font-family: Symbol; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7pt "Times New Roman";">
</span></span></span><!--[endif]-->Personalization tool to increase the return
from marketing initiatives, to position the brand as caring about customers’
time and knowing their habits. (Frontend UI : System Builder)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal" style="line-height: normal; mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; mso-outline-level: 2;"><b style="mso-bidi-font-weight: normal;">How
to Migrate from Monolithic to Modular Architecture<o:p></o:p></b></p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjgZtb-31bfws17LbXq8T3yhP0XDge4bdcuhKLZlK_LlnrnrzKKXNitMX7jyRTzVJbjfapcc9nXkIY3aR7PdDiKU4GshOb2ngP7joM-AZBMq4d6ftEjx9MZF623QzUxuIJ4XMoE-TsbQf4PYw4yNqFlLQegMA-zpFkmtF0j3ToXyQMfupLXjA450mG_WA" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="180" data-original-width="897" height="128" src="https://blogger.googleusercontent.com/img/a/AVvXsEjgZtb-31bfws17LbXq8T3yhP0XDge4bdcuhKLZlK_LlnrnrzKKXNitMX7jyRTzVJbjfapcc9nXkIY3aR7PdDiKU4GshOb2ngP7joM-AZBMq4d6ftEjx9MZF623QzUxuIJ4XMoE-TsbQf4PYw4yNqFlLQegMA-zpFkmtF0j3ToXyQMfupLXjA450mG_WA=w640-h128" width="640" /></a></div><br /><br />
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Tools :-<o:p></o:p></p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgoQrfidibKjFKhmJoPRvsVClIjEZfpVeh2YwjamBAUBwFxw9GzgbjFpNEKTg9R2LB54_mTtXMS04Ka90y7VhcRq18RTiM2Mzeca_RY49jhAIGHNQckFJ5iUEgmu-dN9LBY7E39ndDfdvop4VkGta6v3vVHqOmGEi4wWUpMo_lFRwgij0sputle8kSphw" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="590" data-original-width="975" height="388" src="https://blogger.googleusercontent.com/img/a/AVvXsEgoQrfidibKjFKhmJoPRvsVClIjEZfpVeh2YwjamBAUBwFxw9GzgbjFpNEKTg9R2LB54_mTtXMS04Ka90y7VhcRq18RTiM2Mzeca_RY49jhAIGHNQckFJ5iUEgmu-dN9LBY7E39ndDfdvop4VkGta6v3vVHqOmGEi4wWUpMo_lFRwgij0sputle8kSphw=w640-h388" width="640" /></a></div><br /><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhQBGWW_nJd8OTyyFqloTdvZaauIorNl1926cmvROUtQUEiV848jCj_iQE_CCwE8hmxc4pt1q3LnkQa-14oA0n6tuibV-pczPQYbDbHx39puBBFDTsV7-B3e6nP1I-m5lzTdUubKYCmJM4GE-E57Uaym7lN7fPT1UWe8ebcSl-1xK-bi3eWCTgLaHN6lw" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="316" data-original-width="975" height="208" src="https://blogger.googleusercontent.com/img/a/AVvXsEhQBGWW_nJd8OTyyFqloTdvZaauIorNl1926cmvROUtQUEiV848jCj_iQE_CCwE8hmxc4pt1q3LnkQa-14oA0n6tuibV-pczPQYbDbHx39puBBFDTsV7-B3e6nP1I-m5lzTdUubKYCmJM4GE-E57Uaym7lN7fPT1UWe8ebcSl-1xK-bi3eWCTgLaHN6lw=w640-h208" width="640" /></a></div><br /><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiLS3ks_k2fzmcfBKDPbGClEgmmfNasPJsgG-DYNTYaYrNKk83mWiSzd0oK2v9Ud5mw0sv4Z7mJhInBSrf7V3F5-beQN8dQ9RbCD-l6gBdtkL5TqQdc4zXAnyWp6jq-WM0Qsuxrxg4c7XlUGGTZScBo8iGZ0zHXhouveTX-RjJfny5EKmz-1kM4zO_waw" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="305" data-original-width="950" height="206" src="https://blogger.googleusercontent.com/img/a/AVvXsEiLS3ks_k2fzmcfBKDPbGClEgmmfNasPJsgG-DYNTYaYrNKk83mWiSzd0oK2v9Ud5mw0sv4Z7mJhInBSrf7V3F5-beQN8dQ9RbCD-l6gBdtkL5TqQdc4zXAnyWp6jq-WM0Qsuxrxg4c7XlUGGTZScBo8iGZ0zHXhouveTX-RjJfny5EKmz-1kM4zO_waw=w640-h206" width="640" /></a></div><br /><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhJ6RGRe-Acc79J-zSClDn4adqMt59bw6hiLE7DEOksgHxUhC3fuT6vl6a6LgWkRuM1a83FvXLIyDe_u7Bq6zljB9iYx8FUDaQGLB5XMjPnOxW7jqSROhGm7Ndiv8tJLgfqwtjwwZjD0Pp-VW8oc-0h_wYtPwUDOJV9XauX61cZyEwU-FR88UE-G_VmYA" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="321" data-original-width="975" height="210" src="https://blogger.googleusercontent.com/img/a/AVvXsEhJ6RGRe-Acc79J-zSClDn4adqMt59bw6hiLE7DEOksgHxUhC3fuT6vl6a6LgWkRuM1a83FvXLIyDe_u7Bq6zljB9iYx8FUDaQGLB5XMjPnOxW7jqSROhGm7Ndiv8tJLgfqwtjwwZjD0Pp-VW8oc-0h_wYtPwUDOJV9XauX61cZyEwU-FR88UE-G_VmYA=w640-h210" width="640" /></a></div><br /><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEi0tjtLbJAS6vQQSV1MykxIJJSdONQ2yDa7RqvNOleCjJKGYrbSMNjVX5dWymm5T9aESzMm9bt2DG2jKkhdRQOcnK3moqd8IhxXSyOhWl7cyXcCSJaFg3YrU5qGiJAwdhDgDNYO2lD3rac8-0m8CFJZiIGg7DG_7l0b2SouP1C6JFUFjAQSMQttYzzm-A" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="354" data-original-width="975" height="232" src="https://blogger.googleusercontent.com/img/a/AVvXsEi0tjtLbJAS6vQQSV1MykxIJJSdONQ2yDa7RqvNOleCjJKGYrbSMNjVX5dWymm5T9aESzMm9bt2DG2jKkhdRQOcnK3moqd8IhxXSyOhWl7cyXcCSJaFg3YrU5qGiJAwdhDgDNYO2lD3rac8-0m8CFJZiIGg7DG_7l0b2SouP1C6JFUFjAQSMQttYzzm-A=w640-h232" width="640" /></a></div><br /><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjlwGDDvNGi6b2djqYH-FuL5RpnU-h9DZUvuvfSFd22dpykuxGjyjEhgT0L2JHZWfb1Zki5lQPqTP5oXhznvFJ1eTwaazU7hwidLZRlI-bcww4ul2ZF2yiw9rgPYxhs4eSBw2Eo6CUi8Jq4BQwgLiC0lQ9dytQkmm2f7hOHGEk0VOS2q_Kf-6OEhrffhQ" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="798" data-original-width="975" height="524" src="https://blogger.googleusercontent.com/img/a/AVvXsEjlwGDDvNGi6b2djqYH-FuL5RpnU-h9DZUvuvfSFd22dpykuxGjyjEhgT0L2JHZWfb1Zki5lQPqTP5oXhznvFJ1eTwaazU7hwidLZRlI-bcww4ul2ZF2yiw9rgPYxhs4eSBw2Eo6CUi8Jq4BQwgLiC0lQ9dytQkmm2f7hOHGEk0VOS2q_Kf-6OEhrffhQ=w640-h524" width="640" /></a></div><br /><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgpxIgJkrYN2l_5TSfxq7ulnNHWU-9juzWf1W9jnwRzSlyYsCIAOH98-DHVmHfxG5Zc5OF7GVe4EGKtJXWYwvcujuLuNo8u140XzSsKryQs8CyuSFvNe0oITtkaSBtWoqAUJfBMwFQ-F2YeFMrr8magEM5nPDmfWpgYKW9Sf84yIBJSdY1XfCtbbzqwcQ" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="362" data-original-width="975" height="238" src="https://blogger.googleusercontent.com/img/a/AVvXsEgpxIgJkrYN2l_5TSfxq7ulnNHWU-9juzWf1W9jnwRzSlyYsCIAOH98-DHVmHfxG5Zc5OF7GVe4EGKtJXWYwvcujuLuNo8u140XzSsKryQs8CyuSFvNe0oITtkaSBtWoqAUJfBMwFQ-F2YeFMrr8magEM5nPDmfWpgYKW9Sf84yIBJSdY1XfCtbbzqwcQ=w640-h238" width="640" /></a></div><br /><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjvq2sQnYZ4p6iTDnL1loUpuv5NeRA5Aovd3CNs5NHB9taDYsyFxmHnHMwqKLvwChmJENxs8FfFXY01mMHf4jWvO2-NZkpqdjMbGB0sNW_-g9Sf8KNZ8TMT8TC3pDlfZ02LsBMDOUMcVFX7GrPp5hPd9XSIA0QTrXAJ2ZxAuI5vAV9dRZwYB9EYbDwYEw" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="352" data-original-width="975" height="232" src="https://blogger.googleusercontent.com/img/a/AVvXsEjvq2sQnYZ4p6iTDnL1loUpuv5NeRA5Aovd3CNs5NHB9taDYsyFxmHnHMwqKLvwChmJENxs8FfFXY01mMHf4jWvO2-NZkpqdjMbGB0sNW_-g9Sf8KNZ8TMT8TC3pDlfZ02LsBMDOUMcVFX7GrPp5hPd9XSIA0QTrXAJ2ZxAuI5vAV9dRZwYB9EYbDwYEw=w640-h232" width="640" /></a></div><br /><br />Parsoya Rakeshhttp://www.blogger.com/profile/03882487946199158773noreply@blogger.com0tag:blogger.com,1999:blog-2632455037568890282.post-9369457697147874892020-07-16T00:46:00.000-07:002022-03-20T23:17:19.750-07:00Type Script : Superset of JavaScript <div><br /></div>Superset of Javascript - Microsoft<br /><div><br /></div><div>(1) coffeescript vs typescript vs dart <br /><br />(2) Typscript main language for angular (Angular vs AngularJs)</div><div><br /></div><div><br /></div><div><br /></div><div>Using TypeScript :-</div><div><br /></div><div>(1) Download Nodejs.. Install Node</div><div><br /></div><div>(2) Install typescript > npm install -g typescript </div><div> Check Version > tsc -v</div>Parsoya Rakeshhttp://www.blogger.com/profile/03882487946199158773noreply@blogger.com0tag:blogger.com,1999:blog-2632455037568890282.post-29384830413863235412016-01-18T22:57:00.005-08:002019-01-24T09:27:22.716-08:00REST simplified by Nodejs<div class="separator" style="clear: both; text-align: center;">
</div>
<span style="font-family: "times" , "times new roman" , serif;">Wonderful !! Yes, its amazing to run javascript on server side and develop any application quickly with best performance. So how we can run javascript on server ? Need to install any browser on server which parse request and response result to browser (client) :) ?? Nope... its very simple.. just need a JavaScript runtime. </span><span style="font-family: times, "times new roman", serif;">Nodejs is </span><span style="font-family: times, "times new roman", serif;"> built on Chrome's V8 JavaScript engines</span><br />
<span style="font-family: "times" , "times new roman" , serif;"><br />Node is an interface to the V8 JavaScript runtime – the super-fast JavaScript interpreter that runs in the Chrome browser.</span><br />
<span style="font-family: "times" , "times new roman" , serif;"><br />
Ref : https://nodejs.org/en/</span><br />
<span style="font-family: "times" , "times new roman" , serif;"><br />
I would recommend to use Nodejs for following reasons :-</span><br />
<span style="font-family: "times" , "times new roman" , serif;">(1) Language : Its uses javascript and most of developer know about it.</span><br />
<span style="font-family: "times" , "times new roman" , serif;">(2) Speed : The operation is much much faster as compare to other scripting language</span><br />
<span style="font-family: "times" , "times new roman" , serif;">(3) Object Database : Leverage of using JSON which can be processed on client and server both. Thus can use mongodb which save data directly in JSON format.</span><br />
<span style="font-family: "times" , "times new roman" , serif;">(4) Data Streaming : Node can read/write streams to websockets just as well as it can read/write streams to HTTP. For example, we can pipe stdout from a running process on the server to a browser over a websocket, and have the webpage display the output in real-time.</span><br />
<span style="font-family: "times" , "times new roman" , serif;"><br />
You can do everything with Nodejs what you can do with other scripting language plus speed is bonus. </span><br />
<span style="font-family: "times" , "times new roman" , serif;"><br />
The following some important modules/library used to build a robust application using Nodejs</span><br />
<br />
<br />
(1) NPM : NPM is a Package manager which Installs, publishes and manages node programs<br />
<br />
<div>
(2) NVM: NVM (Node Versioning Manager) allow the managing of versions for the nodejs<br />
<br />
(3) Jade: With node js we can use Jade as a template engine to manage the html.<br />
<br />
(4) Bootstrap : Style your page with your choice.<br />
<br />
(5) Mocha : Write your own Unit Tests and test your application while adding new features in your application. Very important for those who believes in Test Driven application.<br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "times" , "times new roman" , serif; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "times" , "times new roman" , serif; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Now let dive inside nodejs and take a look for it application. Let move ahead and build restful API's for a store in which we do some CRUD operations on items. Also we will authorize some users to access some items using different authentication methods.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: "times" , "times new roman" , serif; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif; vertical-align: baseline;"><span style="line-height: 1.38; white-space: pre-wrap;">Node Installation :</span> I am using MAC so installing node using package manager called home brew.<br /><br />Ref : http://brew.sh/ </span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif; vertical-align: baseline;"> brew install node<br /><br />Now you can check node on your terminal by typing</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"><span style="vertical-align: baseline;"> </span>node --version ( it will display the version of your node eg. v0.12.2</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"><br />
Type "node" which will take you on node prompt.</span><br />
<span style="font-family: "times" , "times new roman" , serif;"> console.log("This is my nodejs")</span><br />
<span style="font-family: "times" , "times new roman" , serif;"><br />
It should display "This is my nodejs" as output. Seems everything is set now and we are ready to build application using nodejs.</span><br />
<span style="font-family: "times" , "times new roman" , serif;"><br />
<br />
Create the skeleton for the application as below :-</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"> Folders : </span><br />
<span style="font-family: "times" , "times new roman" , serif;"><br />
Store/</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"> models/</span><br />
<span style="font-family: "times" , "times new roman" , serif;"> controllers/</span><br />
<span style="font-family: "times" , "times new roman" , serif;"> node_modules/</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"> package.json</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"> server.js</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"><br /></span></div>
<br />
<br />
Basically we are going to follow MVC structure using express module. We are going to define all required nodejs modules in package.json . In Nodejs we need to build our own server so will specify all primary setting and required module in server.js. <br />
<br />
<br />
Module repository : https://www.npmjs.com/<br />
<br />
<br />
Step-1 npm install ( Will install all modules defined in package.json)<br />
<br />
Step-2 command (1) mongo (2) use store (To create new db named store)<br />
<br />
<div>
mongod --dbpath=/Users/rakeshp/Documents/nodeprojects/db --port 27017<br />
mongo will start and will point to 271017<br />
<br />
Step-3 node server <br />
<br />
Check url in browser : localhost:3000/api<br />
<br />
You will see message like "Cannot GET /api". <br />
<br />
<br />
Hurray.... :) Server is running and we are ready for development. <br />
<br />
Basic setup. Include all required packages in package.json <br />
<br />
<br />
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;">eg.</span><br />
<span style="font-family: "times" , "times new roman" , serif;"><br />
package.json :- </span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;">{</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"> "name": "Store",</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"> "main": "server.js",</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"> "dependencies": {</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"> "express": "^4.1.1",</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"> "mongoose": "^4.3.6",</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"> "body-parser": "^1.14.2",</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"> "bcrypt-nodejs": "0.0.3",</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"> "passport": "^0.3.2",</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"> "passport-http": "^0.3.0",</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"> "passport-http-bearer": "^1.0.1",</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"> "oauth2orize": "^1.2.0",</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"> "express-session": "^1.13.0",</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"> "jade": "^1.11.0",</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"> "passport-local": "^1.0.0"</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"> }</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;">}</span><br />
<span style="font-family: "times" , "times new roman" , serif;"><br />
Create your server :- </span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;">eg.</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;">server.js</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;">// Load required modules </span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;">var express = require('express');</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;">var mongoose = require('mongoose');</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;">var bodyParser = require('body-parser');</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;">var jade = require('jade');</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;">var session = require('express-session');</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;">var passport = require('passport');</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;">// Connect store with MongoDB</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;">mongoose.connect('mongodb://localhost:27017/store');</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;">// Create our Express application</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;">var app = express();</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;">// Create our Express router</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;">var router = express.Router();</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;">// Register all our routes</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;">app.use(router);</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;">// Start the server</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;">app.listen(3000);</span><br />
<span style="font-family: "times" , "times new roman" , serif;"><br />
You can find sample application for rest api using "Basic" strategy of passport at</span></div>
<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;">
</div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: "times" , "times new roman" , serif;"><br />
https://github.com/parsoya/store</span><br />
<span style="font-family: "times" , "times new roman" , serif;"><br />
<br />
How to test rest api ??? Its very easy. You can use tools such as Soap UI or Postman. I would recommend to use postman plugin available for chrome. Its easy and free :)</span><br />
<span style="font-family: "times" , "times new roman" , serif;"><br />
<br />
Let add some sample users and then will add some items in our store.</span><br />
<span style="font-family: "times" , "times new roman" , serif;"><br />
(1) Add Users :- </span><br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQ_j2cRTV7EpIbP5EFWNXrdRVOFLckMTCx9xb3Vj7NflmLaSBwxdSsb6aX3xcDuo_gTqPDOyL7AsYj3ZrlUYZEKcSw2Vkz9m_yrp0kpxli3lEgM9TKZkor1yFz3tvh8-Nh2Y-E5t7t3WxO/s1600/image+%25281%2529.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><span style="font-family: "times" , "times new roman" , serif;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQ_j2cRTV7EpIbP5EFWNXrdRVOFLckMTCx9xb3Vj7NflmLaSBwxdSsb6aX3xcDuo_gTqPDOyL7AsYj3ZrlUYZEKcSw2Vkz9m_yrp0kpxli3lEgM9TKZkor1yFz3tvh8-Nh2Y-E5t7t3WxO/s1600/image+%25281%2529.png" /></span></a></td></tr>
<tr><td class="tr-caption" style="text-align: left;"><span style="font-family: "times" , "times new roman" , serif; font-size: small;"><br />
<br />
</span></td></tr>
</tbody></table>
</div>
<span style="font-family: "times" , "times new roman" , serif;"><br />
(2) List Users :- <img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhB3t6SBKxdmkIYQX7OgwG15a5cSN4khqWRownigdcoC-xt9SoP0ghT0wKRTqwnPg6JHVwSKSsZ4NMJZq8jvch72TtILhc1RNmsGCDIYQjMNHIvmBp9cBWEkT54hp_s7CU5SUM7NlvcIpjj/s1600/image+%25282%2529.png" /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhB3t6SBKxdmkIYQX7OgwG15a5cSN4khqWRownigdcoC-xt9SoP0ghT0wKRTqwnPg6JHVwSKSsZ4NMJZq8jvch72TtILhc1RNmsGCDIYQjMNHIvmBp9cBWEkT54hp_s7CU5SUM7NlvcIpjj/s1600/image+%25282%2529.png"><br /></a>(3) Add Items :- </span><br />
<div>
<span style="font-family: "times" , "times new roman" , serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgG91PNV4uI8s205HPHuVMpMS1qfPbFM8XPm4XNcSGFRJXK1xiT8475cfN3Jm_A9QR4kzZlvf48h8xUg1Ah9mhgWoOLm_E85DwAYNJfVyzFCIU93ad2TFfTw76dVRbkZlvu3BBbz-KkTZjo/s1600/image.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><span style="font-family: "times" , "times new roman" , serif;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgG91PNV4uI8s205HPHuVMpMS1qfPbFM8XPm4XNcSGFRJXK1xiT8475cfN3Jm_A9QR4kzZlvf48h8xUg1Ah9mhgWoOLm_E85DwAYNJfVyzFCIU93ad2TFfTw76dVRbkZlvu3BBbz-KkTZjo/s1600/image.png" /></span></a></div>
<div>
<span style="font-family: "times" , "times new roman" , serif;"><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
</span>
<span style="font-family: "times" , "times new roman" , serif;"><br /></span>
</div>
</div>
</div>
Parsoya Rakeshhttp://www.blogger.com/profile/03882487946199158773noreply@blogger.com0tag:blogger.com,1999:blog-2632455037568890282.post-85352020237143592362016-01-12T23:48:00.002-08:002016-01-12T23:48:45.669-08:00MVC or MOVE : Choice is your's !!<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; color: #232629; font-family: Georgia, serif; font-size: 18px; font-stretch: inherit; line-height: 32px; margin-bottom: 32px; outline: 0px; padding: 0px; vertical-align: baseline;">
Few month back I build an restful application using ZF 2.4 and come across with its solid functionality called "EventManager". Yesss Event Manager which draw a broader line between Zf1 and new ZF2 Initially I was confused about its importance in my development but moving ahead I understood its real crux. So really ZF2 is MVC or MOVE ?<br /></div>
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; color: #232629; font-family: Georgia, serif; font-size: 18px; font-stretch: inherit; line-height: 32px; margin-bottom: 32px; outline: 0px; padding: 0px; vertical-align: baseline;">
MVC = Model , View Controller<br />
MOVE = Model Operation View Event<br /></div>
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; color: #232629; font-family: Georgia, serif; font-size: 18px; font-stretch: inherit; line-height: 32px; margin-bottom: 32px; outline: 0px; padding: 0px; vertical-align: baseline;">
In Zf2 , controller are divided into two parts in MOVE i.e Operation and Event. You might have heard about "Fat Model , Skinny Controller" for doing good programming using MVC framework. Zf2 is answer for it .<br /></div>
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; color: #232629; font-family: Georgia, serif; font-size: 18px; font-stretch: inherit; line-height: 32px; margin-bottom: 32px; outline: 0px; padding: 0px; vertical-align: baseline;">
How MOVE is different than MVC ?<br /></div>
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; color: #232629; font-family: Georgia, serif; font-size: 18px; font-stretch: inherit; line-height: 32px; margin-bottom: 32px; outline: 0px; padding: 0px; vertical-align: baseline;">
Let us consider one small scenario in which user is logging using username and password. What would be case in ZF1 and Zf2. ? In ZF1 the action will be passed to model through controller and Model will talk to database to check the authenticity of user then again revert back result to controller which pass to user (views). No central watch for this action but using MOVE you can create your own events let say "loginevent" and control it centrally. So whenever "loginevent" is fired event take care to talk to model and pass result to view. It provide more controls to use this events from anywhere in your application which is not possible using MVC.<br /></div>
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; color: #232629; font-family: Georgia, serif; font-size: 18px; font-stretch: inherit; line-height: 32px; margin-bottom: 32px; outline: 0px; padding: 0px; vertical-align: baseline;">
I found some similarity between ZF2 + Doctrine and Spring + Hibernate. Though I cannot say ZF2 is following purely based on MOVE but can bet its best framework developed in PHP. Most of concepts of ZF2 are derived from Spring, Ruby on Rails. Zend Framework use the power of scripting language and are getting more famous among developers. Spring is pure MVC framework which use power of POJO, Dependency Injection and many more which are also found in ZF2. Either its annotation or XML configurations in hibernate using spring or annotation or XML configurations in doctrine using zf , everything is possible. Think bigger now !! move to MOVE !!<br /></div>
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; box-sizing: border-box; color: #232629; font-family: Georgia, serif; font-size: 18px; font-stretch: inherit; line-height: 32px; margin-bottom: 32px; outline: 0px; padding: 0px; vertical-align: baseline;">
Choice is your's :)</div>
Parsoya Rakeshhttp://www.blogger.com/profile/03882487946199158773noreply@blogger.com0tag:blogger.com,1999:blog-2632455037568890282.post-32566084784475071082013-05-27T22:21:00.000-07:002013-05-27T22:21:20.530-07:00Protecting Google DocsI have find some useful information which can be helpful to protect your data in google docs<div>
<br /></div>
<div>
Reference :- <a href="http://www.skipser.com/p/2/p/password-protect-google-drive-document.html">http://www.skipser.com/p/2/p/password-protect-google-drive-document.html</a></div>
Parsoya Rakeshhttp://www.blogger.com/profile/03882487946199158773noreply@blogger.com0tag:blogger.com,1999:blog-2632455037568890282.post-54874002860663598752012-10-10T23:36:00.000-07:002014-05-21T21:59:17.836-07:00Magento Developer Toolbar extension- Its Amazing<h4 style="text-align: left;">
<span style="font-size: small;"><span style="font-weight: normal;">Professional magento developer toolbar with profiling, database queries, handles, event/observer overview, block nesting, requests and caching.</span></span></h4>
<h2 class="blue" style="font-style: normal; font-variant: normal; font-weight: 300; letter-spacing: normal; line-height: 46px; margin: 0px 0px 27px; orphans: 2; text-align: center; text-indent: 0px; text-rendering: optimizelegibility; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<span style="font-size: small;">
</span><span style="color: white;"><span style="background-color: black;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Be Professional, see what happens in the dark</span></span></span></span></h2>
<div class="row" style="background-color: white; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 18px; margin-left: -20px; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<div class="span10" style="float: left; margin-left: 20px; width: 780px;">
<div style="font-size: 14px; line-height: 22px; margin: 0px 0px 9px;">
<span style="font-family: Times,"Times New Roman",serif; font-size: small;">The Mgt Developer Toolbar for magento is very useful for all developers and frontend guys.<span class="Apple-converted-space"> </span></span><br />
<span style="font-family: Times,"Times New Roman",serif; font-size: small;">Many professional developers all over the world use this extension to find possible performance bottlenecks.<span class="Apple-converted-space"> </span></span><br />
<span style="font-family: Times,"Times New Roman",serif; font-size: small;">You have an overview of the parse time, memory consumption and number of queries executed.<span class="Apple-converted-space"> </span></span><br />
<span style="font-family: Times,"Times New Roman",serif; font-size: small;">It also gives you information about the Controller, Module and Action which is responsible for the current request.<span class="Apple-converted-space"> </span></span><br />
<span style="color: blue;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="color: black; font-size: small;"><span style="font-family: Times,"Times New Roman",serif;">The advantage for frontend guys should also be mentioned, you get a complete overview </span></span></span></span><br />
<span style="color: blue;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="color: black; font-size: small;"><span style="font-family: Times,"Times New Roman",serif;">how the blocks are rendered and which templates are used. This makes all block and template changes</span></span></span></span><br />
<span style="color: blue;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="color: black; font-size: small;"><span style="font-family: Times,"Times New Roman",serif;"> easier than ever before.</span></span><span class="Apple-converted-space"> </span></span></span></div>
</div>
</div>
<span style="color: blue;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span><a href="http://www.mgt-commerce.com/magento-developer-toolbar.html"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></a><a href="http://www.mgt-commerce.com/magento-developer-toolbar.html"><span style="font-family: Arial,Helvetica,sans-serif;">More info : http://www.mgt-commerce.com/magento-developer-toolbar.html</span></a></span>
Parsoya Rakeshhttp://www.blogger.com/profile/03882487946199158773noreply@blogger.com1tag:blogger.com,1999:blog-2632455037568890282.post-92150331767564532132012-10-08T10:06:00.000-07:002012-10-08T10:06:01.107-07:00Saass.. Fun with CSS :)Sass makes CSS fun again. Sass is an extension of CSS3, adding nested rules, variables, mixins, selector inheritance, and more. It’s translated to well-formatted, standard CSS using the command line tool or a web-framework plugin.
Sass has two syntaxes. The new main syntax (as of Sass 3) is known as “SCSS” (for “Sassy CSS”), and is a superset of CSS3’s syntax. This means that every valid CSS3 stylesheet is valid SCSS as well. SCSS files use the extension .scss.
The second, older syntax is known as the indented syntax (or just “Sass”). Inspired by Haml’s terseness, it’s intended for people who prefer conciseness over similarity to CSS. Instead of brackets and semicolons, it uses the indentation of lines to specify blocks. Although no longer the primary syntax, the indented syntax will continue to be supported. Files in the indented syntax use the extension .sass.
Reference : - http://sass-lang.com/Parsoya Rakeshhttp://www.blogger.com/profile/03882487946199158773noreply@blogger.com0tag:blogger.com,1999:blog-2632455037568890282.post-73064605061245229922012-03-24T11:18:00.002-07:002012-07-23T05:30:00.131-07:00Cakephp With Facebook HipHopA new revolution in the world of web development in PHP. You can now compile the code in C++ using the Facebook Hip Hop Compiler.<br />
<br />
You can find more details at :-<br />
<br />
<a href="http://bakery.cakephp.org/articles/lorenzo/2012/01/30/running_cakephp_using_the_facebooks_hiphop_compiler">Running CakePHP using the Facebook's HipHop compiler</a>Parsoya Rakeshhttp://www.blogger.com/profile/03882487946199158773noreply@blogger.com0tag:blogger.com,1999:blog-2632455037568890282.post-86860004366831187432011-09-16T23:34:00.000-07:002011-09-16T23:34:25.205-07:00Rails : SweepersThe sweeper is a new mechanism inducted in rails which allows you to get around having a ton of expire_{page,action,fragment} calls in your code.It does this by moving all the work required to expire cached content into an ActionController::Caching::Sweeper subclass. This class is an observer and looks for changes to an object via callbacks, and when a change occurs it expires the caches associated with that object in an around or after filter.<br />
<br />
Continuing with our Product controller example, we could rewrite it with a sweeper like this:<br />
<br />
class ProductSweeper < ActionController::Caching::Sweeper
observe Product # it keep watch on the Product Model
# As soon as sweeper detects that any new Product was created call this
def after_create(product)
expire_cache_for(product)
end
# As soon as sweeper detects that a Product was updated call this
def after_update(product)
expire_cache_for(product)
end
# As soon as sweeper detects that a Product was deleted call this
def after_destroy(product)
expire_cache_for(product)
end
private
def expire_cache_for(product)
# Expire the index page now that we added a new product
expire_page(:controller => 'products', :action => 'index')<br />
<br />
# Expire a fragment<br />
expire_fragment('all_available_products')<br />
end<br />
end<br />
<br />
You may notice that the actual product gets passed to the sweeper, so if we were caching the edit action for each product, we could add an expire method which specifies the page we want to expire:<br />
<br />
expire_action(:controller => 'products', :action => 'edit', :id => product)<br />
Then we add it to our controller to tell it to call the sweeper when certain actions are called. So, if we wanted to expire the cached content for the list and edit actions when the create action was called, we could do the following:<br />
<br />
class ProductsController < ActionController<br />
<br />
before_filter :authenticate<br />
caches_action :index<br />
cache_sweeper :product_sweeper<br />
<br />
def index<br />
@products = Product.all<br />
end<br />
<br />
end<br />
<br />
So just get rid of unnecessary caching and refresh the caching using sweepers mechanism.Parsoya Rakeshhttp://www.blogger.com/profile/03882487946199158773noreply@blogger.com0tag:blogger.com,1999:blog-2632455037568890282.post-85352239306263555792011-09-16T23:05:00.000-07:002011-09-16T23:05:25.455-07:00ijab with ijabber under the hood of OpenfireWhat a fantastics chatting solution !!! Its works unimaginable. yes, its the webclient ijab (http://ijab.im) which works fantastics with jabber. No other chat can beat this solution. You can install the ijabber using openfire which provide the complete solution for managing all attributes and actions related to chat. <br />
<br />
Both are opensource and available without any cost and very easy to install on the server. <br />
<br />
References to both opensources:<br />
<br />
(1)http://www.igniterealtime.org/projects/openfire/ <br />
<br />
(2)http://code.google.com/p/ijab/<br />
<br />
<br />
Have a happy and fast chatting :)Parsoya Rakeshhttp://www.blogger.com/profile/03882487946199158773noreply@blogger.com0tag:blogger.com,1999:blog-2632455037568890282.post-29569995376301542132011-08-20T12:28:00.000-07:002011-08-20T12:35:13.056-07:00Cloud Computing Vs CDN ( Content Delivery Network )There are many question which are arising regarding the servers. Which one is better and how long it will sustain ? . Currently two servers Cloud and CDN are majorly used in web Development. But what is the main difference between both ? The answer in nutshell is as below :-
<br />
<br />
<br />The big difference is that cloud computing is a big group of servers in 1 data center building which is usually at one location. On the other hand CDN is also group of servers but distributed around the country so it allows web visitors a better and faster access to the website. For example if you're in Boston trying to access a server in California it can be faster to be hitting a server locally in Boston for the files. The CDN is usually able to support much larger traffic volumes since the speed is calculated based on location the traffic comes from.
<br />
<br />
<br />So finally selection of the server will depends on your choice by looking the traffic on site and offcourse your budget also matters :)
<br />Parsoya Rakeshhttp://www.blogger.com/profile/03882487946199158773noreply@blogger.com0tag:blogger.com,1999:blog-2632455037568890282.post-12565117043464613152008-09-17T22:48:00.000-07:002008-09-17T22:58:56.014-07:00Magento a hope that will change the world....Magento is a feature-rich eCommerce platform offering complete flexibility and control over the look, content and functionality<br />of an online store.<br /><br />Key Features :- <br /><br /><span style="font-weight:bold;">Site Management</span><br /> Control multiple websites and stores from one Administration Panel with ability to share as much or as little information as needed<br /> Web Services API for easy integration between Magento and any third-party application<br /><br /><span style="font-weight:bold;">Marketing Promotions and Tools</span><br /> Flexible Coupons (pricing rules) with ability to restrict to stores, customer groups, time period, products, and categories. <br /><br /><span style="font-weight:bold;">International Support</span><br /> Multi-Lingual<br /> Support for Multiple Currencies <br /><br /><span style="font-weight:bold;">Shipping</span><br /> Shipping to multiple addresses in one order<br /><br /><span style="font-weight:bold;">Customer Accounts</span><br />Re-orders from account<br /><br /><span style="font-weight:bold;">Catalog Management</span><br />Batch Import and Export of catalog<br /><span style="font-weight:bold;"><br />Catalog Browsing</span><br /> Layered / Faceted Navigation for filtering of products<br /> Product comparisonsParsoya Rakeshhttp://www.blogger.com/profile/03882487946199158773noreply@blogger.com0tag:blogger.com,1999:blog-2632455037568890282.post-17928788177674987012008-03-28T10:54:00.000-07:002008-03-28T11:04:34.551-07:00Get Ready For Rails 2.0Be Get Prepared for upgrade with Ruby On Rails<br /><br />Some hints can be followed as below :-<br /><br />@params, @session, @flash, @env<br /><br />As of Rails 2.0, you won’t be able to directly access the above instance variables. They have been replaced with methods, which makes customising their actions much easier. It also allows the internals of Rails to change without breaking the API. This is very easy to fix - just remove the @ in front of those variables - they will work exactly the same.<br /><br /><br />find_all, find_first, render_partial<br /><br />In earlier version of Rails there were a number of grouped methods, that do very similar things - find, find_all and find_first all fetch records from the database, the only difference is the number of records they return. It was decided to combine these methods in to one where they are differentiated by passed in options. So find_all becomes find(:all) and find_first becomes find(:first) and render_partial becomes render(:partial).<br /><br />Forms<br /><br />Out of all the HTML helpers, the form tag was an anomaly because it required a start AND end helper. To make it fit in with way the rest of Rails works and to facilitate dynamic form generation, a block method called form_tag was created. This particular update has a trap in it through - because blocks don’t return values, the ERB tag you use must not have an = sign, so<br /> <%= start_form_tag %> <br /> <%= end_form_tag %> <br /> <br /><br />becomes<br /><% form_tag do %> <br /> <% end %> <br /> <br /> <br /><br />Notice the omission of the equals sign in the latter example?<br /><br />Also note that passing :post => %gt; true is deprecated. With the push for RESTfulness, the form needs to know about the other HTTP verbs, put and delete, so a new option has been created:<br /> <% form_tag :method => :post do %> <br /> <% end %> <br /> <br />Plugins<br /><br />A number of what used to be core components of rails have been moved out into plug-ins so as not to clutter the core with stuff that you don’t use very often. It also means that the development of the plugins can be much quicker than that of the core. Probably the major extraction is the third-party database interfaces. Now, by default only MySQL, SQLite and PostgreSQL are supported out of the box. All other databases are supported via gems named activerecord-database-adapter. If you want to use an Oracle just run<br /><br />gem activerecord-oracle-adapter<br /><br />and you will be peachy again.<br /><br />Other extractions of note are the acts_as plug-ins. If you use acts_as_tree or acts_as_list in your model, you will need to script/plugin install them and the built-in pagination has now become the classic_pagination plug-in. Note that by the developers own admission that plug-in is slow (and was slow when it was in core), so if you use it, you may want to think about migrating across to the new and improved will_paginate plug-in.<br /><br /><br />Hurry up and get upgrade before time get elasped... :)<br />So GET, SET , Go................................Parsoya Rakeshhttp://www.blogger.com/profile/03882487946199158773noreply@blogger.com2tag:blogger.com,1999:blog-2632455037568890282.post-75408037659700747622008-03-28T10:32:00.000-07:002008-03-28T10:44:13.431-07:00PHP Vs RubyAjax: Rails and Symfony both use Scriptaculous and Prototype. CakePHP<br />does, but you have to download and install it separately, which, to<br />me, calls into question how well they're integrated.<br /><br />Authentcation: CakePHP has a built-in system, but that system won't<br />fit all needs, so you'll end up writing custom code anyway.<br /><br />Caching: CakePHP only has view caching.<br /><br />Database versioning: None in CakePHP or Symfony, though Symfony has an<br />XML file for each db table, and, I suppose, you could svn them and<br />have versioning that way. Migrations in Rails are superior.<br /><br />Environments: No real separation of environments (prod/dev/test) in <br />CakePHP.<br /><br />Console: None in CakePHP. Symfony and Rails, yes. If you want to use<br />Rails and you think you won't use the console, you're wrong. Once you<br />understand the power, you'll never want to debug without it.<br /><br />Testing: Little integrated testing. It produces some stubs when you<br />"bake" a project, but I prefer how Rails puts those stubs there when<br />you're creating models and controllers, right from the get-go. (More<br />on this below.)<br /><br />Join models: None in CakePHP. Rails has HABTM and has_many :through.<br />All tables are models in Symfony, so that's almost the same. More<br />like HABTM with extra info in the table. Propel, Symfony's ORM<br />engine, is actually quite interesting. (Though, I prefer<br />ActiveRecord.)<br /><br />Form validation: Good in all frameworks, but there are some extra<br />steps involved in dealing with invalid form data in CakePHP.Parsoya Rakeshhttp://www.blogger.com/profile/03882487946199158773noreply@blogger.com0tag:blogger.com,1999:blog-2632455037568890282.post-23574393805276670002008-02-24T02:51:00.000-08:002008-02-24T02:59:08.252-08:00Increase your Blogg popularity<a href="http://creativecommons.org/" target="_blank">Get a creative commons license for your blog content</a><br />Creative Commons makes it easy to assign a license for your online content. I use a license called “Attribution-NonCommercial 2.0″<br />This means (in english)<br />You are free to* to copy, distribute, display, and perform the work* to make derivative works<br />Under the following conditions:* by Attribution. You must attribute the work in the manner specified by the author or licensor.* Noncommercial. You may not use this work for commercial purposes.<br /><a href="http://www.feedburner.com/" target="_blank">Get a feedburner account and direct feeds through feedburner</a><br />Most probably your blogging software will automatically provide an RSS feed capability. However, chances are that you may not be able to track how many readers are subscribing (and how they are subscribing) to your feed. By burning your feed via feedburner, you can get those statistics. Again, it only takes a few minutes to setup a free account on feedburner.<br /><a href="http://www.feedburner.com/" target="_blank">Implement subscription chiclets</a><br />People use variety of RSS readers and you want to make it easy for them to subscribe to your feed from those RSS readers. Feedburner provides scripts to create those subscription chiclets. I suggest that you should take a look at the available options and add those chiclets to your blog site.<br /><a href="http://www.technorati.com/" target="_blank">Claim your blog on technorati</a><br />By registering yourself at technorati and claiming it, you have an ability to put your photo with your profile. When people search for stuff on technorati and your blog comes up in the search results your thumbsize photo appears with the search result. Every single thing helps.<br /><a href="http://www.feedblitz.com/" target="_blank">Provide email subscriptions to your blog</a><br />You will be amazed how many people want to read your blog via their email. It’s easy to set that up. You can get a script to do that by registering at Feedblitz.<br /><a href="http://www.flickr.com/" target="_blank">Link to your photo album</a><br />If you have an online photo album with a service like Flickr, put in a link to that as well.<br /><a href="http://www.pingomatic.com/" target="_blank">Announce your blog to the world</a><br />The first thing that you can do is to use a service like Pingomatic to ping a few servers. Of course, best would be to write compelling content that would make others link to your site.<br /><a href="http://www.blogwise.com/" target="_blank">Register at Blogwise</a><br />Blogwise is a directory that is created manually by a bunch of cool folks. You can submit your blog for inclusion and someone over there will add it to the directory if they find the content appropriate. You can check out the listing for Life Beyond Code and may be leave your comments on this blog there.<br /><a href="http://www.truthlaidbear.com/" target="_blank">Register in the TTLB ecosystem</a><br />TTLB (The Truth Laid Bear) eco-system ranks blogs by links.<br /><a href="http://www.blogarama.com/" target="_blank">Register at Blogarama</a><br />Blogarama is another manually moderated registry.<br /><a href="http://del.icio.us/" target="_blank">Link to your online bookmarks</a><br />If you have an account with del.icio.us and are tracking some interesting websites, you can link to your bookmark page.<br /><a href="http://www.feedvalidtor.org/" target="_blank">Validate your feeds</a><br />Simple way is to subscribe to your own feed in your RSS readers. Other way is to use FeedValidator to check if everything is OK<br /><a href="http://www.feedmap.net/BlogMap/" target="_blank">Geo-tag your blog</a><br />Feedmap provides a simple way of associating your physical co-ordinates (city, zip) to your blog. As more people sign up for this service, your blog will appear in the “bloggers nearby” for your neighbours blogs.<br /><a href="http://www.feedster.com/" target="_blank">Claim your blog at Feedster</a><br />You claimed your blog at Technorati. Now, please go ahead and claim it in Feedster as well. If you do well, you might even get into the feedster elite club “Feedster Top 500″ You can add an icon or your photo to personalize the search results<br /><a href="http://www.mybloglog.com/" target="_blank">Enable MyBlogLog click tracking</a><br />MyBlogLog is really cool. It takes about 2 minutes to implement on your blog and provides real-time tracking (Pro Version) of user behavior (where did they come from and where did they go) on your blog.<br /><a href="http://www.cocomment.com/" target="_blank">Publish your conversations from other blogs to your blog via Comment</a><br />Succeeding in blogging requires participating in conversations. How do you bring all your conversations in one place? Well, CoComment has an answer via their Firefox plugin.<br /><a href="http://www.hittail.com/" target="_blank">Leverage the power of HitTail to get more traffic</a><br />HitTail reveals in real-time the least utilized, most promising keywords hidden in the Long Tail of your natural search results. We present these terms to you as suggestions that when acted on will boost the natural search results of your site. It’s that simple.<br /><a href="http://www.majikwidget.com/mw/index.php" target="_blank">Get cool widgets from MajikWidget</a><br />Do you want to add polls, voting or rating for your blog? Check out cool widgets from Majikwidget. You can get them for a song.<br /><a href="http://www.blogtopsites.com/" target="_blank">Register in BlogTopSites</a><br />BlogTopSites is a directory of blogs. Register your blog under the right category.<a href="http://www.widgetbox.com/" target="_blank"></a><br /><a href="http://www.widgetbox.com/" target="_blank">More widgets from WidgetBox</a><br />There are hundreds of them here. You can pick and choose…<br /><a href="http://www.linkedinabox.com/" target="_blank">Post your LinkedIn Profile via LinkedInABox</a><br />Amir Glick and Yaniv Solnik have a cool widget to display your LinkedIn profile on your blog sidebar.<br /><a href="http://www.wholinked.com/" target="_blank">Give back some link love with WhoLinked</a><br />WhoLinked will search through the web and send you back a list of sites that are linking to your site. You can say “thank you” to those sites by putting up this widget.<br /><a href="http://www.snap.com/" target="_blank">Provide target website previews via Snap Preview</a><br />Snap Preview Anywhere enables anyone visiting your site to get a glimpse of what other sites you’re linking to, without having to leave your site. By rolling over any link, the user gets a visual preview of the site without having to go there, thus eliminating wasted “trips” to linked sites.<a href="http://www.findory.com/">Register your blog at Findory</a><br /><a href="http://www.findory.com/" target="_blank"></a><br />Findory aggregates some of the finest blogs and they recommend content based on users’ interest. So if a user is reading an article in another blog that has similar content, he or she may be presented with your blog to consider reading.<br /><a href="http://www.clustrmaps.com/" target="_blank">Get Clustrmaps for your blog</a><br />Show visitor count and the regions from where the visitors are coming<br /><br /><a href="http://www.webseosolution.com">Web SEO Solution, SEO Company India, Search Engine Optimization India, Search Engine Marketing India, Web Marketing Company India </a>Web Solutionhttp://www.blogger.com/profile/09493669985097964890noreply@blogger.com0tag:blogger.com,1999:blog-2632455037568890282.post-90191232623331214822008-02-01T20:28:00.000-08:002008-02-01T20:36:26.991-08:00Exciting future with PHP5 and Oracle.Get an overview of some of the new features in PHP 5—as well as comments on its future for Oracle users—from its release manager.<br /><br />PHP 5 (PHP: Hypertext Preprocessor Version 5) was officially released on July 13, 2004. Not surprisingly, the release was widely covered by the media due to the leadership role PHP plays in the Web application market. It is true that technologies such as .NET and J2EE have had more exposure and hype than PHP, but ease-of-use, performance, tight integration with the Apache Web server, and a large collection of application building blocks have made PHP one of the leading Web application development languages.<br /><br />You might ask yourself, since PHP 4 featuring the Zend Engine was so successful, why do we even need PHP 5 and the Zend Engine II? The truth is that there are certain areas in which PHP 4 does not excel. Most of these areas are more important for large projects and companies, where project management is more structured and interoperability between systems is a must. PHP 5 addresses these issues, allowing PHP not only to be more attractive for such projects but also to remain a leading technology for Web application development.<br /><br />In this article I will address:<br /><br /> * The reasoning behind PHP 5<br /> * A short overview of some of its new features<br /> * A brief look at the future for PHP and Oracle users.<br /><br />The New Object-Oriented Model of the Zend Engine II<br /><br />Background With PHP's adoption growing steadily, its use in larger projects is also constantly increasing. There does seem to be a connection between large projects and the use of object-oriented (OO) methodology. Not that you can't write a small OO application, and it is certainly possible to write large, impressive applications without object-oriented programming (OOP). However, there does seem to be a tendency to pick the OO paradigm in these cases—probably because OOP offers more conventional tools for functional and technical design (UML — Unified Modeling Language), reuse of solutions for recurring problems (design patterns), and built-in mechanisms in the OO languages themselves that help enforce software designs and contracts.<br /><br />The main problem with PHP's object model in prior versions was that objects were implemented as native types with copy semantics similar to integers and strings. This not only led to some very confusing behavior, due to sometimes unexpected implicit object cloning by PHP, but it also didn't allow us to implement some basic features, such as the ability to de-reference objects that are returned from methods.<br /><br />The following examples illustrate these two problems.<br />a) Implicit object cloning:<br /><br /><?php<br /><br />class Person {<br /> var $name;<br /><br /> function Person($name) {<br /> $this->name = $name;<br /> }<br /><br /> function setName($name) {<br /> $this->name = $name;<br /> }<br /><br /> function getName() {<br /> return $this->name;<br /> }<br />}<br /><br />function lowerCaseName($obj)<br />{<br /> $new_name = strtolower($obj->getName());<br /> $obj->setName($new_name);<br />}<br /><br />$obj = new Person("Andi");<br />lowerCaseName($obj);<br />print $obj->getName();<br /><br />?><br /><br />Most developers would expect this example to print out "andi." However, surprisingly, this example prints out "Andi" in PHP 4. This is due to the previously mentioned way PHP 4 treats objects like regular native types, and as a result, passing $obj to lowerCaseName() by value actually clones the object. The resulting manipulation that lowerCaseName() performs on $obj is done on a cloned version of the object. This behavior not only leads to surprising results but, for developers who were aware of this problem, it would require passing and returning objects by-reference, which would make the code harder to maintain because they'd have to insert "&" in many places (passing by-reference, returning by-reference, and assigning by-reference).<br /><br />b) Inability to de-reference objects returned from methods:<br /><br />$obj->getParentObject()->method();<br /><br />If you aren't familiar with PHP 4, you would probably expect this example to work. However, as a result of the before-mentioned implicit cloning, the ability to de-reference an object that is returned from a method did not exist and could not be implemented. As a workaround, a lot of PHP 4 code would look as follows:<br /><br />$temp_obj &= $obj->getParentObject();<br />$temp_obj->method();<br /><br />There are other examples of how the basic infrastructure of objects was flawed in PHP 4, but these two examples should give you a good idea.<br /><br />Main new language features. The most basic and important change in PHP 5 is to use handles (or id's) for objects instead of implementing them as native datatypes. When copied, only the handle (the id number) itself is actually being copied; the objects these handles represent are not being copied. This seemingly minor change in the semantics of the language is the major driving force behind the majority of the new PHP 5 features. It allows the addition of new language features and new PHP extensions, such as the great SimpleXML that takes full advantage of the new semantics.<br /><br />Without going into too much detail (or this article would become a book), the following is a list of new language features in PHP 5.<br /><br />New object cloning semantics As mentioned, the scripting engine never automatically clones objects in PHP 5, whether they are assigned, passed by-value, or returned by-value from a function. If cloning is required, then the developer may explicitly clone an object by using the new clone keyword (for example, clone $obj;). The developer may also implement a method named __clone() in his class, which will be called on the new resulting object, after the clone operation has copied all of the original object's properties. Implementing this callback is not required but can be useful if the developer wishes each object to have its own copy of a certain resource, thereby creating a new version of that resource for the cloned object (otherwise, both objects would be using the same resource). An example of such a resource is a file.<br /><br />Public/private/protected access modifiers. PHP 5 supports the PPP (Private/Public/Protected) access modifiers commonly found in other object-oriented languages, such as C++ and Java. These access modifiers may be used on both properties and methods, and impose access restrictions.<br /><br />Interfaces and abstract classes and methods. We at Zend Technologies received many requests for multiple inheritance (MI) in PHP, so we decided to address this issue in PHP 5. After comparing the implementation of many languages—mainly C++ and Java—to see which could be most easily adapted to PHP's dynamic nature, we decided to provide a solution for MI by using Java-style interfaces and abstract classes.<br /><br />Ability for PHP extensions to overload PHP object syntax. Probably one of the most significant features of PHP 5 is the way the Zend Engine II has an abstraction layer between the object syntax and its semantics. This approach allows PHP extensions to create their own objects, which have different behavior than the user-level PHP objects. For example, the new COM extension uses these overloading capabilities in order to access COM objects in a way that is natural for PHP developers, using the regular PHP object syntax:<br /><br />$ie = new COM("InternetExplorer.Application"); <br />$ie->Visible = true; <br />$ie->Navigate("http://www.php.net/");<br /><br />Other extensions that take advantage of this ability include the SimpleXML, SOAP, and Perl extensions.<br /><br />Other New Features There are probably a dozen more new language features in PHP 5, such as class constants, static properties and methods, __autoload(), and instanceof operator.You can find a more complete list at http://www.zend.com/php5.<br /><br />Design Patterns As previously discussed, the ability to use design patterns in large (and often also small) PHP software projects is extremely important. It was possible to take advantage of such patterns in PHP 4, but—lacking important language features such as static properties and methods, PPP access modifiers, and interfaces—it was often hard to enforce all of the semantics of these patterns.<br /><br />Singleton Pattern An often-used and excellent example is the Singleton pattern. Although it is one of the simpler patterns, in order to implement it in its entirety, static properties and methods and PPP access modifiers are a necessity.<br /><br />For example:<br /><br /><?php<br /><br />class MySingleton {<br /> static private $instance = NULL;<br /><br /> private function __construct() {<br /> }<br /><br /> private function __clone() {<br /> }<br /><br /> static public function Instance() {<br /> if (self::$instance == NULL) {<br /> self::$instance = new MySingleton();<br /> }<br /> return self::$instance;<br /> }<br /> // ... Additional code for the MySingleton class.<br />}<br /><br />This implementation takes advantage of the new PHP 5 features, which results in a cleaner and less error-prone Singleton implementation. For example, the ability to declare the constructor and clone methods as private prevents developers from mistakenly instantiating an additional copy of the MySingleton class, as only the class itself may access these methods. The support for static properties is used in order to have a globally accessible property (self::$instance) that references the single instance of the class. Declaring the property private makes sure that only the class itself may fiddle with this property.<br /><br />Immutable Object Pattern Another slightly less common design pattern is the Immutable Object pattern. This pattern is usually used in applications where a large amount of references to a relatively small group of values exists. It allows the application's code to share objects by making the objects immutable (forbidding their state to change), and forcing code that wants to do so to create a new instance of the class.<br /><br />The following example shows how you can create a class that represents a SQL query. The assembled query statement itself might be used in many places in your application. Code that wishes to change the value of the query may do so using the changeStmt() method, which returns a handle to a new object that represents the specified query string.<br /><br /><?php<br /><br />final class ImmutableQueryStatement {<br /> private $stmt;<br /><br /> public function __construct($stmt) {<br /> $this->stmt = $stmt;<br /> }<br /><br /> public function getStmt() {<br /> return $this->stmt;<br /> }<br /><br /> public function changeStmt($stmt) {<br /> return new ImmutableQueryStatement($stmt);<br /> }<br />}<br /><br />This example takes advantage of a few new PHP 5 language features. To begin with, it uses the final keyword so that the class may not be "subclassed." This approach prevents developers from subclassing and implementing a version that may be mutable. In addition, changeStmt() takes advantage of the new object handles and returns the newly created object by-value (in PHP 4, a new object instance would have to be returned by reference, complicating the implementation). Last but not least, similar to the previous example, access modifiers are used to specify the access contract this class should adhere to.<br /><br />XML and Web Services in PHP 5<br /><br />Background In the past few years, XML has become increasingly important, allowing different applications and systems to interoperate using standard tools and methodology for dealing with data. This is one of the reasons for Oracle's and other vendors' strong support and adoption of the technology. In every company, the data is the centerpiece of the organization.<br /><br />XML support in PHP 4 was quite a mess. Although it supported SAX (Simple API for XML), DOM (Document Object Model) and XSL (eXtensible Stylesheet Language), there was no unified and standards-conforming implementation. The SAX implementation was based on the aging Expat XML parser, the DOM extension's naming conventions weren't standards-conforming, and the extension never left experimental status. Also, XSL was supported using yet another XML library called Sablotron.<br /><br />It was decided to rewrite the XML support in PHP 5, and a few developers from the PHP community stepped up to make this rewrite a reality. The first and most important decision was that all XML functionality be based on the excellent libxml2 library from the Gnome's project. With this in mind, all three existing extensions were rewritten. Most important, the DOM extension was revamped and its interface redefined to be W3C-compliant. At the time of PHP 5's release, DOM was no longer experimental but full-featured and stable.<br /><br />SimpleXMLBesides the importance of rewriting and unifying the existing XML extensions, a new XML extension has emerged. This extension, called SimpleXML, allows developers to access XML files as if they were native PHP objects. Going back a few sections in this article, this became possible due to the new Zend Engine II giving extensions the ability to overload the object-oriented syntax.<br /><br />Consider the following XML file:<br /><br /><clients><br /><client><br /> <name>John Doe</name><br /> <account_number>87234838</account_number><br /></client><br /><client><br /> <name>Janet Smith</name><br /> <account_number>72384329</account_number><br /></client><br /></clients><br /><br />The following PHP 5 code iterates over the XML file and prints out the names and account numbers of the clients:<br /><br /><?php<br /><br />$clients = simplexml_load_file('clients.xml');<br /><br />foreach($clients->client as $client) {<br /> print "$client->name account: $client->account_number\n";<br />}<br /><br />Running this sample script would result in the following output:<br /><br />John Doe account: 87234838<br />Janet Smith account: 72384329<br /><br />With SimpleXML, accessing XML files becomes extremely easy. I have no doubt that SimpleXML will revolutionize the ease-of-use provided to the PHP developer for dealing with XML files. And if there are certain things SimpleXML cannot do, then due to the fact that both SimpleXML and the DOM extension use the same underlying library, the SimpleXML object can be converted to a DOM tree and more-advanced XML manipulations can be done in DOM. This conversion back and forth between SimpleXML and DOM is zero-copy, meaning it costs neither time nor additional memory.<br /><br />SOAP Going back to my introduction, I mentioned interoperability as a key issue for large companies. Web services— and more specifically, the SOAP protocol—are becoming increasingly popular for solving interoperability issues between two or more systems.<br /><br />As PHP 4 did not feature native integrated SOAP support in the default distribution, we believed that this issue had to be addressed for PHP 5. Therefore, we created a new native implementation for SOAP (client as well as server APIs) that allows PHP developers to create and consume Web services easily.<br /><br />The following example shows just how easy it is to call SOAP services from PHP. You might notice that this extension uses the same object-oriented overloading capabilities as mentioned previously.<br /><br /><?php<br /><br />$client =<br />new SoapClient("http://services.xmethods.net/soap/urn:xmethods-delayed-quotes.wsdl"); <br /><br />print($client->getQuote("ORCL"));<br /><br />At the time of this writing, running this example resulted in printing 11.23.<br /><br />The Future and Oracle<br /><br />General Released in July 2004, PHP 5 has only been around for a short time. Despite that, there are already quite a few interesting things happening in PHP development. There has been a lot of work on improving the performance of the scripting engine and, most importantly for the Oracle readers, there are many new database-related initiatives. Use of Oracle is strong in the PHP community, and a large amount of Zend customers are Oracle users. Their use of Oracle varies as it does with other databases but is usually a very conscious choice, which has to do with Oracle's proven track record, advanced features, and often an already existing investment in Oracle infrastructure.<br /><br />Scripting Engine Performance When developing PHP 5, Zend and the community focused more on functionality than on performance. Therefore, except for a few exceptions, performance of the scripting engine was not improved between PHP 4 and 5.<br /><br />In most PHP applications, the raw execution performance of PHP is not the main bottleneck. The most common bottlenecks are related to I/O and are usually database-related. That said, we still believe that improving the performance of the scripting engine itself will definitely benefit the PHP user. For this reason, we decided to invest significant resources to improve performance for PHP 5.1.x.<br /><br />Since the release of PHP 5, we have invested a lot of resources in tuning the scripting engine. Many ideas were taken from a performance patch that Thies Arntzen and Sterling Hughes published about a year ago. Other ideas came from inside Zend and the PHP developer's community. The end result is an engine that is commonly more than twice as fast as PHP 4.0 and PHP 5.0 for synthetic benchmarks (benchmarks that don't include I/O and real-world code).<br /><br />The improvement is quite impressive, and when PHP 5.1.0 is released all of the PHP users will enjoy it without having to make any changes to their source code. I believe that PHP 5.1.0 will be released early in the first quarter of 2005, but one can never tell with an open source project.<br /><br />SQL Relay. SQL Relay (is a very interesting third-party project. It is a project that implements a proxy broker for SQL connections (including Oracle), allowing for connection pooling of database connections using PHP.<br /><br />The project provides its own version of a PHP database extension (you will be required to change your PHP database code). This extension talks to the SQL Relay broker that relays queries and result sets to and from the database.<br /><br />Some of SQL Relay's advantages:<br /><br /> * Using connection pooling, you can limit the amount of open connections to the database.<br /> * In case PHP persistent connections can't be used in your environment, this solution solves the problem of long connect times when initiating an Oracle database connection.<br /> * The project supports other programming languages too. If you have a hybrid environment, you can take advantage of the same SQL Relay daemons that are being used from PHP. In addition to PHP, language support includes C, Java, Perl, and quite a few more.<br /> * Getting up and running with SQL Relay, although not trivial, is quite simple. I'd also like to note that the SQL Relay author was very responsive to my questions.<br /><br />Some of SQL Relay's disadvantages:<br /><br /> * You have to use a different API than the PHP Oracle extension.<br /> * Result sets are copied twice: first to the SQL Relay broker and then to PHP.<br /> * You don't have as rich an API as you do when using PHP's native oci8 extension.<br /><br />I think that if your project does require Oracle database connection pooling, it is a good idea for you to check out SQL Relay. It might not be perfect, but it might still take a while until a better solution comes along, and this one does seem to work.<br /><br />PDO The PHP community has been working on a new database abstraction layer in addition to the existing oci8 PHP extension that has a native interface to the Oracle Database. As Oracle Technology Network already has an in-depth article covering PHP Data Objects (PDO), by Wez Furlong, suffice to say that PDO is something to watch. PHP has been waiting for quite some time for good native database abstraction. I believe that PDO may very well be the solution we have all been waiting for. The designers of PDO are some of the lead developers of the PHP community, and I like their approach with PDO. The following is a list of their design goals, as written in the PDO README file:<br /><br /> 1. Be lightweight.<br /> 2. Provide a common API for common database operations.<br /> 3. Result in high performance.<br /> 4. Keep the majority of PHP-specific code in the PDO core (such as persistent resource management); drivers should only have to worry about getting the data and not about PHP internals.<br /><br />On one hand it gives a common API for working with databases. But it also allows each driver to add its own additional functionality, so that PDO not only supports the least common denominator of the database APIs but will actually give you the opportunity to use all the features your database has to offer. And we all know Oracle has lots of them.<br /><br />Propel Propel is an object persistence and query framework. It implements object/relational mapping (ORM) and is based on the Apache Torque project, which does the same for Java. Unlike PDO, Propel is a very high-level database abstraction layer, redefining how you query, create, and manipulate persistent objects. Propel, as expected from an OO/RDBMS mapping system, also deals with database schema creation.<br /><br />There are many advantages to a system like this. For starters, developers can concentrate most of their time on writing business logic and have to deal less with the intricacies of the database—whether it is schema management or writing fancy SQL statements. Database manipulation is very natural, as developers just deal with regular objects and the persistence layer deals with the low-level details of updating the right fields and rows in the database.<br /><br />The disadvantage is that you do lose some control. The automatic mapping of the OO model to the relational database is not always straightforward. Not only does it make it hard to write fancy, powerful, hand-crafted queries, but you're also not supposed to do so—you break the abstraction, and a tiny update of the mapping might break the application. Therefore, using such a system means you have to play by the rules of the tool. In most cases, this price is acceptable, as increased productivity helps shorten development times and improves code quality. However, there are certain instances where you might absolutely require this control.<br /><br />Propel is a very interesting project and can come in handy. In addition, it is built on top of a database abstraction layer called Creole. Unlike PDO, this abstraction layer tries to mimic JDBC as much as possible and might be easier to use if you are converting existing Java code to PHP. That said, if PDO becomes mainstream and is distributed as part of standard PHP, it might be best to stick with that.<br /><br />Java Integration Over a year ago, Zend and Sun Microsystems started Java Specification Request (JSR) 223 to define a standard on how to bridge between PHP and Java. Today the JSR's expert group comprises many software vendors, including Oracle. Although the JSR talks about all scripting languages, the initial interest was in PHP and mainly the possibility of calling Java code from PHP. You can guess that one of the primary motives for such connectivity would be to connect front-end PHP servers to back-end J2EE application servers and, more specifically, the ability to call Enterprise Java Beans (EJBs) directly from PHP code.<br /><br />The following is an example of what making an Oracle JDBC query would look like using the Java interface:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjX1WECIq-0ef0bhz5LSM62C6EwTkXdxGTuZq5H_Kz4-C_BA0TmB_jCiHyfVmX0VISflIUixdiGDTAROZsTPJBAyOoGgo0nQDK0jhvf39uVglLACtiB9VqM44ysqG5szq-hFpotScfWPoMi/s1600-h/otn_andi_code_listing.gif"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjX1WECIq-0ef0bhz5LSM62C6EwTkXdxGTuZq5H_Kz4-C_BA0TmB_jCiHyfVmX0VISflIUixdiGDTAROZsTPJBAyOoGgo0nQDK0jhvf39uVglLACtiB9VqM44ysqG5szq-hFpotScfWPoMi/s320/otn_andi_code_listing.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5162236553040948546" /></a><br /><br /><br />figure 1<br />Figure 1: Bridging PHP and Java: What an Oracle JDBC query would look like<br /><br />You can see that what you'll be able to do is write Java code in PHP. This should allow you to call any Java business logic you might have, specifically EJBs.<br /><br />Such bridging support opens up new possibilities for Oracle Application Server users, who have invested in back-end business logic but want to take advantage of the fast development times and features of PHP.<br /><br /><span style="font-weight:bold;">Conclusion</span><br /><br />PHP 5 has definitely been a great step forward for PHP and the PHP community. At the O'Reilly Open Source conference, a reporter asked some of us PHP community leaders if PHP 5 was everything we had hoped for. The answer was unanimous; PHP 5 has become much more than we initially had planned and expected.<br /><br />More specifically, I think Oracle users have a lot to look forward to. With Oracle's published Statement of Direction regarding PHP inclusion in future Oracle Application Server releases, it is clear that the company has recognized the importance of PHP technology. I believe that following this recognition will come a variety of solutions that will improve Oracle/PHP productivity and flexibility, both very much required in today's ever-changing market. The initial bundling of PHP in the upcoming version of Oracle 10g and the PHP extension for Oracle JDeveloper are significant first steps for widespread PHP support by Oracle.Parsoya Rakeshhttp://www.blogger.com/profile/03882487946199158773noreply@blogger.com1tag:blogger.com,1999:blog-2632455037568890282.post-43093908105040741712008-01-31T20:52:00.001-08:002008-01-31T20:52:21.256-08:00Building Web Applications with Ruby on Rails<b>Ruby on Rails</b> has taken the web application community by storm. The Ruby programming language fuses ideas from dynamic, scripting languages with a strong object-oriented framework. Based on the popular <span style="font-weight: bold;" class="Apple-style-span">Model-View-Controller (MVC)</span> paradigm, Ruby on Rails, also called <span style="font-weight: bold;" class="Apple-style-span">RoR</span> and just Rails, is a web programming application framework written in Ruby. Rails leverages Ruby's extensive support for metaprogramming, from which it derives much of its elegance and ease of development. Additionally, Rails makes extensive use of code generation features, making it easy to start a complete application and promoting agile programming techniques. <p> </p> The key design features that make Rails unique in the web application world are <span style="font-weight: bold;" class="Apple-style-span">"Don't Repeat Yourself" (DRY)</span> and "<span style="font-weight: bold;" class="Apple-style-span">Convention over Configuration</span>". The DRY principle means that settings, such as database column names, only need to be specified in one place. Rails ensures that these definitions are visible to all the other web components that need them. Similarly, the Convention over Configuration principle means that web developers only need to make explicit the aspects of their web application that are different from others; Rails (and programmers, too) can infer similar aspects from conventions, e.g., naming conventions. This greatly reduces the need to specify meta data aobut your web application in configuration files, largely eliminating the XML metadata bloat that is common in other web frameworks.Parsoya Rakeshhttp://www.blogger.com/profile/03882487946199158773noreply@blogger.com0tag:blogger.com,1999:blog-2632455037568890282.post-85626296577632679482008-01-31T20:35:00.000-08:002008-02-01T00:57:05.628-08:00Magic of Ajax with Ruby On Rails<span style="font-weight: bold;">Rails Implements Ajax</span><br /><br />Rails has a simple, consistent model for how it implements Ajax operations.<br /><br /><p><span id="intelliTxt">Rails has a simple, consistent model for how it implements Ajax operations.</span></p> <p><span id="intelliTxt">Once the browser has rendered and displayed the initial web page, different user actions cause it to display a new web page (like any traditional web app) or trigger an Ajax operation:</span></p> <ol><li><span id="intelliTxt">A trigger action occurs. This could be the user clicking on a button or link, the user making changes to the data on a form or in a field, or just a periodic trigger (based on a timer).</span></li><li><span id="intelliTxt">Data associated with the trigger (a field or an entire form) is sent asynchronously to an action handler on the server via XMLHttpRequest.</span></li><li><span id="intelliTxt">The server-side action handler takes some action (that's why it is an <i>action handler</i>) based on the data, and returns an HTML fragment as its response.</span></li><li><span id="intelliTxt">The client-side JavaScript (created automatically by Rails) receives the HTML fragment and uses it to update a specified part of the current page's HTML, often the content of a <code></code> tag.</span></li></ol> <p><span id="intelliTxt">An Ajax request to the server can also return any arbitrary data, but I'll talk only about HTML fragments. The real beauty is how easy Rails makes it to implement all of this in your web application.</span></p><p><br /></p><h4 style="font-weight: bold;" class="posttitle"><span style="font-size:180%;">The 7 Habits of Highly Effective Web 2.0 websites</span></h4><span id="t" style=";font-family:arial,verdana,helvetica;font-size:85%;" >Steven Covey, author of “The 7 Habits of Highly Effective People” identified principals which also apply to modern Web 2.0 websites.<br /><br /></span><span id="t" style=";font-family:arial,verdana,helvetica;font-size:85%;" >Highlights and Site Examples include:<br /></span><ol><li><span id="t" style=";font-family:arial,verdana,helvetica;font-size:85%;" > • Your customer is the boss- how your website can listen better</span></li><li><span id="t" style=";font-family:arial,verdana,helvetica;font-size:85%;" > • Start and update your website with your goals in mind</span></li><li><span id="t" style=";font-family:arial,verdana,helvetica;font-size:85%;" > • Balance user experiences with site goals</span></li><li><span id="t" style=";font-family:arial,verdana,helvetica;font-size:85%;" > • Deliver Value back to your web visitors</span></li><li><span id="t" style=";font-family:arial,verdana,helvetica;font-size:85%;" > • Be honest-examine and evaluate what doesn’t work</span></li><li><span id="t" style=";font-family:arial,verdana,helvetica;font-size:85%;" > • Web 2.0- Create an ongoing dialog and community with your customers</span></li><li><span id="t" style=";font-family:arial,verdana,helvetica;font-size:85%;" > • Sharpen your website’s saw- renewal techniques that work</span></li></ol>Parsoya Rakeshhttp://www.blogger.com/profile/03882487946199158773noreply@blogger.com0tag:blogger.com,1999:blog-2632455037568890282.post-18317212724097955862008-01-29T00:49:00.000-08:002008-01-29T00:52:08.569-08:00Exciting world of programming with Ruby On Rails<h1>Dream with Ruby On Rails<br /></h1> <div class="main"> <p> Rails is a full-stack framework for developing <span class="highlight">database-backed web applications</span> according to the Model-View-Control pattern. From the Ajax in the view, to the request and response in the controller, to the domain model wrapping the database, Rails gives you a pure-Ruby development environment. To go live, all you need to add is a database and a web server. </p> </div> <div class="clearall"> </div> <div class="sub"> <h1>Already Catched with Ruby On Rails<br /></h1> </div> <p> Everyone from startups to non-profits to enterprise organizations are using Rails. Rails is all about infrastructure, so it's a great fit for practically any type of web application Be it software for <span class="highlight">collaboration, community, e-commerce, content management, statistics, management</span>, you name it. Examples: </p>Parsoya Rakeshhttp://www.blogger.com/profile/03882487946199158773noreply@blogger.com2