<?xml version="1.0" encoding="UTF-8"?>
<!--Generated by Squarespace Site Server v5.11.81 (http://www.squarespace.com/) on Fri, 25 May 2012 19:21:39 GMT--><feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"><title>Wiki</title><subtitle>Wiki</subtitle><id>http://abdullin.com/wiki/</id><link rel="alternate" type="application/xhtml+xml" href="http://abdullin.com/wiki/"/><link rel="self" type="application/atom+xml" href="http://abdullin.com/wiki/atom.xml"/><updated>2011-12-09T09:35:27Z</updated><generator uri="http://www.squarespace.com/" version="Squarespace Site Server v5.11.81 (http://www.squarespace.com/)">Squarespace</generator><entry><title>Fiddler and Azure</title><id>http://abdullin.com/wiki/fiddler-and-azure.html</id><link rel="alternate" type="text/html" href="http://abdullin.com/wiki/fiddler-and-azure.html"/><author><name>Rinat Abdullin</name></author><published>2010-09-03T12:14:29Z</published><updated>2010-09-03T12:14:29Z</updated><content type="html" xml:lang="en-US"><![CDATA[<p>How to configure Fiddler to use Azure:</p>

<pre><code>cloudStorageAccount = CloudStorageAccount
  .Parse("UseDevelopmentStorage=true;DevelopmentStorageProxyUri=http://ipv4.fiddler");
</code></pre>

<p>Note, that Fiddler instance should be running in order for the name to resolve</p>
]]></content></entry><entry><title>Infinitely Scalable System</title><id>http://abdullin.com/wiki/infinitely-scalable-system.html</id><link rel="alternate" type="text/html" href="http://abdullin.com/wiki/infinitely-scalable-system.html"/><author><name>Rinat Abdullin</name></author><published>2010-08-22T17:49:33Z</published><updated>2010-08-22T17:49:33Z</updated><content type="html" xml:lang="en-US"><![CDATA[<p>Infinitely scalable system is a concept established by <a href="http://abdullin.com/wiki/pat-helland.html">Pat Helland</a> in his paper "Life Beyond Distributed Transactions: An Apostate's Opinion". It describes <strong>software architecture capable of scaling in almost-infinite manner as the amount of data stored and processed grows up</strong>.</p>

<blockquote>
  <p>practically, even in the abstract world, we are talking about the <em>almost-infinite scalability</em> of N Log N costs,where log is based on some pretty large number.</p>
</blockquote>

<p>Such architecture fits the concepts of <a href="http://abdullin.com/wiki/cloud-computing.html">cloud computing</a> really well and is based on a few important assumptions:</p>

<p>System manages <em>entities</em> (aggregate roots in DDD concept) that are identified by some <em>globally unique id</em> and <em>always fit to a single machine</em> or a small cluster. Examples of entities are: customer, patient, project etc. We can always ensure transactional consistency within a single entity.</p>

<p>As system grows, these entities will be redistributed between various machines in order to accommodate the load. We can never know for sure if certain entities are on the same machine or not. Hence, it is impossible to update two logically referenced entities in a single transaction.</p>

<p>Architecture should consider and build upon these limitations from the start, using messaging to provide communication between the different entities.</p>

<p>Infrastructure can usually guarantee, that <strong>messages will be delivered at least once</strong>. Due to infrastructure limitations and costs, order and single delivery are not always guaranteed. Activities (sagas), that represent partnership of the entity with some specific sender,are responsible for handling such interactions, implementing ordering and reduplication as needed. Idempotent operations generally do not need this.</p>

<p>Real-world businesses and operations have been established in the world of slow and unreliable communications (snail mail, telegrams, phones etc.). They already accommodate logic of activities, uncertainty, assumptions and eventually consistent systems in order to stay successful and profitable.</p>

<blockquote>
  <p>In more detail these assumptions are discussed in article on: <a href="http://abdullin.com/journal/2010/8/22/space-travel-and-infinitely-scalable-solutions.html">Space Travel and Infinitely Scalable Solutions</a>.</p>
</blockquote>

<p>In order to model and implement such entities, one could use domain-driven design. Architecture implementations of the overall scalable system are recommended to follow <a href="http://abdullin.com/cqrs/">CQRS principles</a>.</p>
]]></content></entry><entry><title>Pat Helland</title><id>http://abdullin.com/wiki/pat-helland.html</id><link rel="alternate" type="text/html" href="http://abdullin.com/wiki/pat-helland.html"/><author><name>Rinat Abdullin</name></author><published>2010-08-22T10:24:56Z</published><updated>2010-08-22T10:24:56Z</updated><content type="html" xml:lang="en-US"><![CDATA[<p>Pat Helland is a really smart guy. He was Platform Architect at Microsoft (big-picture strategy), then spent a couple of years at Amazon.com helping the company with its service-oriented-architecture (SOA) strategy. In March 2007 Pat rejoined Microsoft to become a part of the company’s Developer Division.</p>

<p>He recently has worked on the projects like:</p>

<ul>
<li>Bing Infrastructure.</li>
<li>Cosmos - a petabyte store (working towards being an exabyte store) which runs over tens of thousands of inexpensive computers.</li>
<li>Autopilot.</li>
</ul>

<p>There is a <a href="http://blogs.msdn.com/b/pathelland/" target="_blank" class="offsite-link-inline">blog</a></p>

<p>Pat has authored a set of extremely interesting and thoughtful papers:</p>

<ul>
<li><a href="http://www.ics.uci.edu/~cs223/papers/cidr07p15.pdf" target="_blank" class="offsite-link-inline">Life Beyond Distributed Transactions: An Apostate's Opinion</a></li>
</ul>

<blockquote>
  <p>This is 10 page PDF on scalability in really large applications. Ideas from this article are explored further in <a href="http://abdullin.com/journal/2010/8/22/space-travel-and-infinitely-scalable-solutions.html">Space Travel and Infinitely Scalable Solutions</a>.</p>
</blockquote>

<ul>
<li><a href="http://blogs.msdn.com/b/pathelland/archive/2007/05/15/memories-guesses-and-apologies.aspx" target="_blank" class="offsite-link-inline">Memories, Guesses, and Apologies</a></li>
</ul>

<blockquote>
  <p>"Business realities force apologies.  To cope with these difficult realities, we need code and, frequently, we need human beings to apologize.  It is essential that businesses have both code and people to manage these apologies."</p>
</blockquote>

<ul>
<li><a href="http://arxiv.org/ftp/arxiv/papers/0909/0909.1788.pdf" target="_blank" class="offsite-link-inline">Building on Quicksand</a></li>
</ul>

<p>These papers help to shape understanding and body of knowledge in building massively scalable systems. It's strong recommendation to read these if you are studying <a href="http://abdullin.com/cqrs/">CQRS</a> and <a href="http://abdullin.com/xlim/">xLim</a> or simply building solution for the <a href="http://abdullin.com/wiki/cloud-computing.html">cloud computing</a> environment.</p>
]]></content></entry><entry><title>Explore MS SQL Database</title><id>http://abdullin.com/wiki/explore-ms-sql-database.html</id><link rel="alternate" type="text/html" href="http://abdullin.com/wiki/explore-ms-sql-database.html"/><author><name>Rinat Abdullin</name></author><published>2010-08-09T16:00:39Z</published><updated>2010-08-09T16:00:39Z</updated><content type="html" xml:lang="en-US"><![CDATA[<p>List all tables:</p>

<pre><code>SELECT Name from sysobjects where xtype = 'u'
</code></pre>

<p>List MS SQL tables with row counts:</p>

<pre><code>SELECT object_name (i.id) TableName, rows as Row_Count
FROM sysindexes i INNER JOIN sysObjects o ON 
  (o.id = i.id AND o.xType = 'U')
WHERE indid &lt; 2
ORDER BY TableName
</code></pre>

<p>Explore table columns:</p>

<pre><code>SELECT 
  TABLE_NAME as 'Table', 
  COLUMN_NAME as 'Column', 
  COLUMN_DEFAULT as 'Default',
  IS_NULLABLE as 'NULL',
  DATA_TYPE as 'Data', 
  CHARACTER_MAXIMUM_LENGTH as 'LEN',    
  NUMERIC_PRECISION as 'Prec',
  NUMERIC_PRECISION_RADIX as 'Radix',
  NUMERIC_SCALE as 'Scale'

 FROM INFORMATION_SCHEMA.Columns
</code></pre>

<p>Check indexes from table:</p>

<pre><code>EXEC sp_helpindex 'table_name'
</code></pre>
]]></content></entry><entry><title>XMPP and Jabber</title><id>http://abdullin.com/wiki/xmpp-and-jabber.html</id><link rel="alternate" type="text/html" href="http://abdullin.com/wiki/xmpp-and-jabber.html"/><author><name>Rinat Abdullin</name></author><published>2010-07-25T08:01:06Z</published><updated>2010-07-25T08:01:06Z</updated><content type="html" xml:lang="en-US"><![CDATA[<p>What are XMPP (Extensible Messaging and Presence Protocol) and Jabber?</p>

<blockquote>
  <p>Extensible Messaging and Presence Protocol (XMPP) (<strong>formerly named Jabber</strong>) is an open, XML-based protocol originally aimed at near-real-time, extensible instant messaging (IM) and presence information (e.g., buddy lists), but now expanded into the broader realm of message-oriented middleware.[2]  It was developed by the Jabber open-source community in 1999. Built to be extensible, the protocol has been extended with features such as Voice over Internet Protocol and file transfer signaling.</p>
</blockquote>

<h2>XMPP PROs</h2>

<ul>
<li><strong>Decentralization</strong> - like in email; anyone can run their own XMPP server and there is no central master server.</li>
<li><strong>Open standards</strong> - the Internet Engineering Task Force has formalized XMPP as an approved instant messaging and presence technology under the name of XMPP, and the XMPP specifications have been published as RFC 3920 and RFC 3921.</li>
<li><strong>Long History</strong> - XMPP technologies are used since 1998. Multiple implementations exist and are supported by companies like Sun Microsystems and Google.</li>
<li><strong>Security</strong> - XMPP servers may be isolated from the public XMPP network (e.g., on a company intranet), and robust security (via SASL and TLS) has been built into the core XMPP specifications. </li>
<li><strong>Flexibility</strong> - Custom functionality can be built on top of XMPP. </li>
</ul>

<h2>XMPP CONs</h2>

<ul>
<li><p><strong>Presence data overhead</strong> - XMPP currently has a large overhead in delivering presence data to multiple recipients. </p></li>
<li><p><strong>In-band binary data transfer is inefficient</strong> - Because XMPP is encoded as a single long XML document, binary data must be first base64 encoded before it can be transmitted in-band. Therefore any significant amount of binary data (e.g., file transfers) is best transmitted out-of-band, using in-band messages to coordinate. </p></li>
</ul>

<h2>How to Query XMPP Server</h2>

<pre><code>cmd&gt;nslookup
Default Server:  XXX
Address:  8.8.8.8

&gt; set q=SRV
&gt; set noverbose
&gt; _xmpp-client._tcp.gmail.com.
</code></pre>

<h2>References</h2>

<ul>
<li><a href="http://en.wikipedia.org" target="_blank" class="offsite-link-inline">XMPP  wiki page</a> (this article contains excerpts from it)</li>
<li><strong>XMPP Standards Foundation</strong>
<ul>
<li><a href="http://xmpp.org/software/clients.shtml" target="_blank" class="offsite-link-inline">Clients</a></li>
<li><a href="http://xmpp.org/software/servers.shtml" target="_blank" class="offsite-link-inline">Servers</a></li>
<li><a href="http://xmpp.org/software/libraries.shtml" target="_blank" class="offsite-link-inline">Libraries</a></li>
</ul></li>
</ul>
]]></content></entry><entry><title>Explore mySQL Database</title><id>http://abdullin.com/wiki/explore-mysql-database.html</id><link rel="alternate" type="text/html" href="http://abdullin.com/wiki/explore-mysql-database.html"/><author><name>Rinat Abdullin</name></author><published>2010-07-22T04:04:22Z</published><updated>2010-07-22T04:04:22Z</updated><content type="html" xml:lang="en-US"><![CDATA[<p>List all tables:</p>

<pre><code>show tables;
</code></pre>

<p><a href="http://dev.mysql.com/doc/refman/5.0/en/show.html" target="_blank" class="offsite-link-inline">Other show statements</a></p>

<p>Table creation script:</p>

<pre><code>show create table %tablename%;
</code></pre>
]]></content></entry><entry><title>Command-Query Responsibility Segregation - CQRS</title><id>http://abdullin.com/wiki/command-query-responsibility-segregation-cqrs.html</id><link rel="alternate" type="text/html" href="http://abdullin.com/wiki/command-query-responsibility-segregation-cqrs.html"/><author><name>Rinat Abdullin</name></author><published>2010-04-23T21:21:10Z</published><updated>2010-04-23T21:21:10Z</updated><content type="html" xml:lang="en-US"><![CDATA[<p>Command-Query Responsibility Segregation (CQRS) is a way of designing and developing scalable and robust enterprise solutions with rich business value.</p>

<p>In an oversimplified manner, <b>CQRS separates commands</b> (that change the data) <b>from the queries</b> (that read the data). This simple decision brings along a few changes to the classical architecture with service layers along with some positive side effects and opportunities. Instead of the RPC and Request-Reply communications, messaging and Publish-Subscribe are used.</p>

<blockquote>
  <p>BTW, check out <a href="http://abdullin.com/cqrs/">Getting Started with CQRS</a>! You'll find links to best articles, videos and samples on Command-Query Responsibility Segregation (with a dash of Cloud Computing).</p>
</blockquote>

<p>If we go deeper, <em>Command-query Responsibility Separation</em> is about development principles, patterns and the guidance to build enterprise solution architecture on top of them.</p>

<p>Such enterprise solutions aim to be:</p>

<ul>
<li>Scalable </li>
<li>Focused on the business rather than the technology</li>
<li>Can grow to handle complex problems without growing development costs</li>
<li>Adapt to changing business requirements</li>
<li>Efficiently integrate with other software and systems</li>
<li>Benefit from the cloud computing</li>
<li>Inherently handle multiple users</li>
</ul>

<p>While going for these goals, CQRS attempts to solve problems of:</p>

<ul>
<li>Performance bottlenecks and scalability</li>
<li>Concurrency conflicts, their resolution and prevention</li>
<li>Data staleness</li>
<li>Complexity of the design, development and maintenance</li>
</ul>

<p><strong>Related links:</strong></p>

<ul>
<li><a href="http://abdullin.com/cqrs/">Getting started with CQRS</a>.</li>
<li><a href="http://abdullin.com/journal/2010/10/22/top-10-reasons-to-do-cqrs-in-a-pdf.html">Top 10 benefits of CQRS</a> (in a nice downloadable PDF).</li>
<li><a href="http://skillsmatter.com/podcast/open-source-dot-net/udi-dahan-command-query-responsibility-segregation/rl-311" target="_blank" class="offsite-link-inline">CQRS introductory video</a>.</li>
<li><a href="http://www.udidahan.com/2009/12/09/clarified-cqrs/" target="_blank" class="offsite-link-inline">Clarified CQRS paper</a> by Udi Dahan.</li>
<li><a href="http://codebetter.com/blogs/gregyoung/archive/2008/05/20/devteach-talk.aspx" target="_blank" class="offsite-link-inline">DevTeach Video</a></li>
<li><a href="http://abdullin.com/journal/2010/3/23/dddd-cqrs-and-other-enterprise-development-buzz-words.html" target="_blank" class="offsite-link-inline">DDDD, CQRS and Other Enterprise Development Buzz-words</a></li>
</ul>

<p><em>This article is a part of <a href="http://abdullin.com/software-development-bok/">Software Development Body of Knowledge ABC</a> series. You can <a href="http://feeds.abdullin.com/RinatAbdullin"><strong>subscribe to RSS feed to stay updated</strong></a></em>.</p>

<p>Related Links:</p>
]]></content></entry><entry><title>What is API?</title><id>http://abdullin.com/wiki/what-is-api.html</id><link rel="alternate" type="text/html" href="http://abdullin.com/wiki/what-is-api.html"/><author><name>Rinat Abdullin</name></author><published>2009-07-24T17:06:06Z</published><updated>2009-07-24T17:06:06Z</updated><content type="html" xml:lang="en-US"><![CDATA[<p>Application Programming Interface (API) is a specification for interacting with software application or service programmatically. Usually it is exposed as a set of allowed method calls along with:</p>

<ul>
<li>defined parameters and return arguments;</li>
<li>calling conventions;</li>
<li>usage limitations.</li>
</ul>

<p>For example, here's how a piece of Twitter REST API looks like:</p>

<ul>
<li>Twitter REST API Method: <em>statuses update</em></li>
<li>URL: <em>http://twitter.com/statuses/update.format</em></li>
<li>Formats: <em>xml, json, rss, atom</em></li>
<li>HTTP Method(s): <em>POST</em></li>
<li>Requires Authentication: <em>true</em></li>
<li>API rate limited: <em>false</em></li>
<li>Parameters: ...</li>
<li>Response: ...</li>
</ul>

<p>There are a few categorizations of APIs in the software development world.</p>

<p><strong>Web APIs</strong> define interfaces for interacting with various web sites and services in the Internet. These APIs usually use Hypertext Transfer Protocol (HTTP) requests for passing around data represented in JavaScript Object Notation (JSON) or Extensible Markup Language (XML) formats.</p>

<p>Twitter REST API, mentioned above, is an example of such Web API.</p>

<p><strong>Operating System APIs</strong> represent low-level methods exposed by the operating system (OS) that could be used by software applications to integrate with it. <em>Windows API</em> (or Win32) and <em>POSIX</em> definitions are among the most known examples.</p>

<p><strong>Software APIs</strong> are usually exposed by software vendors willing to provide integration capabilities for their products.</p>
]]></content></entry><entry><title>What is Virtual Machine - VM?</title><id>http://abdullin.com/wiki/what-is-virtual-machine-vm.html</id><link rel="alternate" type="text/html" href="http://abdullin.com/wiki/what-is-virtual-machine-vm.html"/><author><name>Rinat Abdullin</name></author><published>2009-07-20T08:38:23Z</published><updated>2009-07-20T08:38:23Z</updated><content type="html" xml:lang="en-US"><![CDATA[<p>In computer science a Virtual Machine (VM) is a software implementation of a hardware (or a part of it) that executes programs, applications and scripts just like the real machine would do.</p>

<p>Here's the simplest example of Virtual Machine - Windows 7 running Windows XP in a VM to provide backwards compatibility for the older applications:</p>

<p><span class="full-image-block ssNonEditable"><span><img src="http://abdullin.com/storage/uploads/2009/07/2009-07-20_virtual_machine.png" alt="Virtual Machine running Windows XP within Windows 7"/></span></span></p>

<p>Here's another example - Sun VirtualBox running Ubuntu x64 server within Windows 7:</p>

<p><span class="full-image-block ssNonEditable"><span><img src="http://abdullin.com/storage/uploads/2009/07/2009-07-20_ubuntu_vm.png" alt=""/></span></span></p>

<p>These were the examples of <em>Operating System Virtual Machines</em>. Another type of VM is <em>Application Virtual Machine</em>, that runs applications and scripts in an isolated virtual environment. Examples of that would be Java VM or .NET Framework VM.</p>

<h1>VMs and Software Development</h1>

<p><br />
Virtual Machines are getting very important and widely used these days. This happens due to the improvements in hardware and virtualization capabilities along with the numerous benefits offered by the technology. </p>

<p>Some of usage scenarios include:</p>

<ul>
<li><p>Quality Assurance teams get the ability to test applications, their deployments and upgrades more efficiently. Testers don't need to have multiple OS and installation configurations available any more. A set of VM files (that are easy to share) is a replacement for that.</p>

<p>Additionally, it is quite easy to configure <a href="http://abdullin.com/wiki/continuous-integration.html">continuous integration</a> to run actual integration tests within differet virtual machines (emulating various OS and setup configurations), thus providing a better code coverage and issue detection.</p></li>
<li><p>Software Developers could try out latest changes and various multi-server deployment configurations within <a href="http://abdullin.com/journal/2008/8/19/configuring-virtual-development-environment.html">virtual development environments</a>.</p></li>
<li><p>Cloud service providers could sell finely-grained computing capacities to customers in form of the VM slices. Customer is able to configure his Virtual Machine any way he wants.</p>

<p>Should they want to change hosting provider, they just need to move a single VM from one environment to another.</p></li>
<li><p>For complex enterprise applications (spawning multiple machines and server roles) virtual machines provide high-level separation of concerns, simplifying software evolution and maintenance.</p></li>
<li><p>It is really easy to launch multiple virtual machine clones from one VM file. This simplifies <a href="http://abdullin.com/journal/2009/6/20/cloud-bursting-scenarios-for-small-companies.html">scaling and cloud bursting scenarios for organizations</a>.</p></li>
</ul>

<p><strong>Related links:</strong></p>

<ul>
<li><a href="http://en.wikipedia.org/wiki/Virtual_machine" target="_blank" class="offsite-link-inline">Virtual Machine</a> on Wikipedia</li>
<li><a href="http://abdullin.com/journal/2008/7/31/development-server-meets-virtualization.html">Development server meets virtualization</a></li>
<li><a href="http://abdullin.com/journal/2008/8/19/configuring-virtual-development-environment.html">Configuring Virtual Development Environment</a></li>
</ul>
]]></content></entry><entry><title>Agile Software Development</title><id>http://abdullin.com/wiki/agile-software-development.html</id><link rel="alternate" type="text/html" href="http://abdullin.com/wiki/agile-software-development.html"/><author><name>Rinat Abdullin</name></author><published>2009-06-13T07:50:08Z</published><updated>2009-06-13T07:50:08Z</updated><content type="html" xml:lang="en-US"><![CDATA[<p><em>Agile Software Development</em> is an <em>iterative and incremental approach</em> in software development, where <em>requirements and solutions evolve</em> through a <em>tight collaboration</em> of self-organizing cross-functional teams.</p>

<p>Simply put, Agile Software Development is a <em>group of software development methodologies</em> that work quite well when:</p>

<ul>
<li>projects are not mission-critical;</li>
<li>business requirements change extremely fast;</li>
<li>there are great developers available;</li>
<li>development teams are small;</li>
<li>development culture and mentality favors self-organization and self-learning.</li>
</ul>

<p>In other words, Agile works quite well in situations when some <strong>unique software project has to be delivered really fast</strong> in order to seize the market opportunity. This works because Agile software methodologies allow development teams to <em>adapt quickly to the rapidly changing business requirements</em>. This happens because of:</p>

<ul>
<li><strong>short development iterations</strong> allowing to start getting feedback early in the project's life-cycle and incorporate it into the product fast by delivering working software repeatedly and in a timely manner;</li>
<li><strong><a href="http://abdullin.com/wiki/continuous-integration.html">continuous integration</a></strong> helping to reduce development friction and improve quality of a rapidly developing project in self-organizing environment;</li>
<li><strong>feature-driven development</strong> focusing development on delivering features (functionality) bringing real business value to the client (and the project);</li>
<li><strong>lean software development</strong> laying out common principles for efficient software development process;</li>
<li><strong>eXtreme Programming</strong> pushing lightweight software development methodologies to the extreme.</li>
</ul>

<p>Long-term planning (along with some other formalities of a totally controlled project management process) is mostly sacrificed in favor of the flexibility, fast delivery and self-organization. In such a situation we still have to maintain high quality of the project deliverables (while reducing the resource consumption). This is achieved with the help from:</p>

<ul>
<li><a href="http://abdullin.com/wiki/test-driven-development-tdd.html"><strong>test-driven development</strong></a> - provides foundation for the <em>Continuous Integration</em> and facilitates change while maintaining stability of the software project;</li>
<li><strong>pair programming</strong> - improves code quality and allows to have more efficient knowledge sharing.</li>
</ul>

<p><strong>Related Links:</strong></p>

<ul>
<li><a href="http://en.wikipedia.org/wiki/Agile_software_development" target="_blank" class="offsite-link-inline">Agile Software Development</a> on Wikipedia</li>
<li><a href="http://en.wikipedia.org/wiki/Lean_software_development" target="_blank" class="offsite-link-inline">Lean Software Development</a> on Wikipedia</li>
<li><a href="http://en.wikipedia.org/wiki/Scrum_(development)" target="_blank" class="offsite-link-inline">Scrum</a> on Wikipedia</li>
<li><a href="http://en.wikipedia.org/wiki/Planning_poker" target="_blank" class="offsite-link-inline">Planning poker</a> on Wikipedia</li>
<li><a href="http://www.extremeprogramming.org/what.html" target="_blank" class="offsite-link-inline">eXtreme Programming</a> on ExtremeProgramming.com</li>
</ul>

<p><em>This article is a part of <a href="http://abdullin.com/software-development-bok/">Software Development Body of Knowledge ABC</a> series. You can <a href="http://feeds.abdullin.com/RinatAbdullin"><strong>subscribe to RSS feed to stay updated</strong></a></em>.</p>
]]></content></entry></feed>
