<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Sarang's Blog]]></title><description><![CDATA[Thoughts, stories and ideas.]]></description><link>http://sarang.azurewebsites.net/</link><generator>Ghost 0.7</generator><lastBuildDate>Tue, 19 May 2026 18:43:05 GMT</lastBuildDate><atom:link href="http://sarang.azurewebsites.net/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Configure Azure SQL Database firewall rules with PowerShell]]></title><description><![CDATA[<p>Living in the third world comes with its set of issues. I have a terrible pair of ISPs that I have to live with. One is Airtel 4g and the other is You Broadband. Both have a habit of refreshing the public IP every few hours (sometime even twice within</p>]]></description><link>http://sarang.azurewebsites.net/configure-azure-sql-database-firewall-rules-with-powershell/</link><guid isPermaLink="false">982da80c-6849-4762-ba19-97388d609385</guid><dc:creator><![CDATA[Sarang Kulkarni]]></dc:creator><pubDate>Tue, 19 Jul 2016 16:19:22 GMT</pubDate><content:encoded><![CDATA[<p>Living in the third world comes with its set of issues. I have a terrible pair of ISPs that I have to live with. One is Airtel 4g and the other is You Broadband. Both have a habit of refreshing the public IP every few hours (sometime even twice within an hour). I don't get the logic. While everything else is fine since I use (and highly recommend) <a href="https://www.noip.com/">noIP.com</a>. However I am a Azure developer and my life depends on access to Azure SQL Database. With the frequent IP changes one constantly needs to keep a browser tab open with the Azure SQL Server settings open to be able to edit and save the newly assigned IP. <br>
<img src="https://i.imgur.com/ozRQZKS.png" alt="Azure SQL Firewall Rules"></p>

<p>It takes about 4-5 clicks and a sagely amount of patience to do this. In the middle of a debug both can be hard to come by. I usually recommend the "Rule of three" for automating something.  </p>

<blockquote>
  <p>If you had to do the exact same task the third time, automate it. - master jatlh, 'oH.</p>
</blockquote>

<p>So cooked up this little PowerShell script. For tl;dr crowd, you can go get it here.<script src="https://gist.github.com/sarangbk/19abf407f33803521bd223f5f6ef287e.js"></script></p>

<p>If you are still reading lets dig in. The script does some nifty things. First it gets your public IP. I found this cool no-nonsense HTTP endpoint at <a href="http://ifconfig.me/ip">IfConfig.me</a>. Hat-tip for a great name for the tool. Exactly does what it says. Returns a simple text response in body with your publicly visible IP. Here's a fiddler trace showing all the gory details on the wire. <br>
<img src="https://i.imgur.com/Q3jBvZN.png" alt="IfConfig.me fiddler trace"></p>

<p>Then it checks if the given firewall rule name already exists, if it does that one is deleted and a new one is created. I needed this as I constantly need to update the settings and there are few of us devs using the same DB and all have their own firewall rules.</p>

<p>One thing to note is I have removed the PowerShell <strong>Confirm</strong> dialog from the <strong>Remove-AzureRmSqlServerFirewallRule</strong> commandlet. I know what I am doing and didn't need the pesky prompts. If you are worried of accidentally removing a rule remove the <strong>-Force</strong> parameter from the command. This script also ignores errors if any.</p>

<p>Next up, making sure this scripts gets called from a batch file whose icon sits happily in your taskbar. But that's for another post.</p>

<p><strong>Ref:</strong> <br>
<a href="https://msdn.microsoft.com/en-us/library/mt603588.aspx">Remove-AzureRmSqlServerFirewallRule</a> <br>
<a href="https://msdn.microsoft.com/en-us/library/mt603860.aspx">New-AzureRmSqlServerFirewallRule</a></p>]]></content:encoded></item><item><title><![CDATA[Use SQL Server Dynamic Management Views for identifying performance bottlenecks]]></title><description><![CDATA[<p>Cloud is expensive! I can't stress that enough. The consumption for one of our product went from ~$600 a month to >$1000 a month over the last one year. Most of which could be attributed to scale but a lot of it is bad code too. I have been a</p>]]></description><link>http://sarang.azurewebsites.net/sql-server-dynamic-management-views-for-identifying-performance-bottlenecks/</link><guid isPermaLink="false">f4c34f69-1966-428e-bc72-17fd73ae0e91</guid><dc:creator><![CDATA[Sarang Kulkarni]]></dc:creator><pubDate>Mon, 09 May 2016 20:10:34 GMT</pubDate><content:encoded><![CDATA[<p>Cloud is expensive! I can't stress that enough. The consumption for one of our product went from ~$600 a month to >$1000 a month over the last one year. Most of which could be attributed to scale but a lot of it is bad code too. I have been a huge fan of <a href="https://en.wikipedia.org/wiki/Jeff_Atwood">CodingHorror</a>, and in turn a subscriber of his <a href="http://blog.codinghorror.com/hardware-is-cheap-programmers-are-expensive/">Hardware is cheap, Programmers are expensive</a> theory. Perfectly sound advice on the desktop, sadly not for the cloud or at scale, a lesson I learnt the hard way.</p>

<p>One of the major costs over the past year or so for us has been SQL Azure (Yeah Azure Database or whatever MSFT decides to call it next, I am old, I am sticking to SQL Azure). The new portal does help some in identifying rogue queries. It shows  </p>

<blockquote>
  <p>TOP 5 queries per CPU consumption (Aggregation type: sum) Last 24 hrs.</p>
</blockquote>

<p><img src="https://sarangghost.blob.core.windows.net/staticfiles/10052016/Azure%20Portal%20Query%20Performance%20Insight.PNG" alt="Azure Portal Query Performance Insight"></p>

<p>This is great, however it may not be enough for all the needs. Fret not, the stuff the chart is generated with is called <a href="https://msdn.microsoft.com/en-us/library/ms188754.aspx">Dynamic Management Views</a> or DMV for short. These are super powerful and can reveal a lot about your database and server performance.</p>

<p>A little <strong>warning</strong> from Microsoft before we move ahead.  </p>

<blockquote>
  <p>Dynamic management views and functions return internal, implementation-specific state data. Their schemas and the data they return may change in future releases of SQL Server. Therefore, dynamic management views and functions in future releases may not be compatible with the dynamic management views and functions in this release. For example, in future releases of SQL Server, Microsoft may augment the definition of any dynamic management view by adding columns to the end of the column list. We recommend against using the syntax SELECT * FROM dynamic<em>management</em>view_name in production code because the number of columns returned might change and break your application.</p>
</blockquote>

<p>With that out of the way lets dig into some queries. I've written them to include only the TOP (n), if you are reading this, I assume you are already aware and will replace the &lt; n > with the desired number.</p>

<p>Run the following queries against the database you want to troubleshoot.</p>

<p><strong>Queries that were executed the maximum number of times</strong></p>

<pre><code class="language-sql">-- Get Queries that were executed the maximum number of times
SELECT TOP (&lt;n&gt;)  
    dmExecQueryStats.last_execution_time AS [TimeStamp], 
    dmExecSQLText.TEXT AS [QueryText], 
    dmExecQueryStats.execution_count AS [ExecutionCount], 
    dateadd(s, convert(bigint, dmExecQueryStats.total_worker_time) / 1000, convert(time, '00:00:00')) AS [Total CPU Time Used], 
    dateadd(s, convert(bigint, dmExecQueryStats.total_elapsed_time) / 1000, convert(time, '00:00:00')) AS [Total Elapsed Time]
FROM sys.dm_exec_query_stats AS dmExecQueryStats  
CROSS APPLY sys.dm_exec_sql_text(dmExecQueryStats.sql_handle) AS dmExecSQLText  
ORDER BY dmExecQueryStats.execution_count DESC  
</code></pre>

<p><br>
<strong>Queries that took maximum time to execute</strong></p>

<pre><code class="language-sql">-- Get Queries that took maximum time to execute
SELECT TOP (&lt;n&gt;)  
    dmExecQueryStats.last_execution_time AS [TimeStamp], 
    dmExecSQLText.TEXT AS [QueryText], 
    dmExecQueryStats.execution_count AS [ExecutionCount], 
    dateadd(s, convert(bigint, dmExecQueryStats.total_worker_time) / 1000, convert(time, '00:00:00')) AS [Total CPU Time Used], 
    dateadd(s, convert(bigint, dmExecQueryStats.total_elapsed_time) / 1000, convert(time, '00:00:00')) AS [Total Elapsed Time]
FROM sys.dm_exec_query_stats AS dmExecQueryStats  
CROSS APPLY sys.dm_exec_sql_text(dmExecQueryStats.sql_handle) AS dmExecSQLText  
ORDER BY dmExecQueryStats.total_elapsed_time DESC  
</code></pre>

<p><br>
<strong>Queries that consumed the maximum CPU</strong></p>

<pre><code class="language-sql">-- Get Queries that utilized maximum CPU time
SELECT TOP (&lt;n&gt;)  
    dmExecQueryStats.last_execution_time AS [TimeStamp], 
    dmExecSQLText.TEXT AS [QueryText], 
    dmExecQueryStats.execution_count AS [ExecutionCount], 
    dateadd(s, convert(bigint, dmExecQueryStats.total_worker_time) / 1000, convert(time, '00:00:00')) AS [Total CPU Time Used], 
    dateadd(s, convert(bigint, dmExecQueryStats.total_elapsed_time) / 1000, convert(time, '00:00:00')) AS [Total Elapsed Time]
FROM sys.dm_exec_query_stats AS dmExecQueryStats  
CROSS APPLY sys.dm_exec_sql_text(dmExecQueryStats.sql_handle) AS dmExecSQLText  
ORDER BY dmExecQueryStats.total_worker_time DESC  
</code></pre>

<p><br>
<strong>Queries executed recently</strong></p>

<pre><code class="language-sql">-- Get Queries executed recently 
SELECT TOP (&lt;n&gt;)  
    dmExecQueryStats.last_execution_time AS [TimeStamp], 
    dmExecSQLText.TEXT AS [QueryText], 
    dmExecQueryStats.execution_count AS [ExecutionCount], 
    dateadd(s, convert(bigint, dmExecQueryStats.total_worker_time) / 1000, convert(time, '00:00:00')) AS [Total CPU Time Used], 
    dateadd(s, convert(bigint, dmExecQueryStats.total_elapsed_time) / 1000, convert(time, '00:00:00')) AS [Total Elapsed Time]
FROM sys.dm_exec_query_stats AS dmExecQueryStats  
CROSS APPLY sys.dm_exec_sql_text(dmExecQueryStats.sql_handle) AS dmExecSQLText  
ORDER BY dmExecQueryStats.last_execution_time  DESC  
</code></pre>

<p>These are the ones I used, there are far too many DMVs to cover in a blog post, however these should give a fair idea about how to use them.</p>]]></content:encoded></item><item><title><![CDATA[What HTTP Status code to respond with]]></title><description><![CDATA[<p><strong>Protocol</strong></p>

<blockquote>
  <p>In telecommunications, a communications protocol is a system of rules that allow two or more entities of a communications system to transmit information via any kind of variation of a physical quantity. These are the rules or standard that defines the syntax, semantics and synchronization of communication and possible</p></blockquote>]]></description><link>http://sarang.azurewebsites.net/what-http-status-code-to-respond-with/</link><guid isPermaLink="false">faf2c8fa-1596-4a2e-9f7b-7ca16b963cfd</guid><dc:creator><![CDATA[Sarang Kulkarni]]></dc:creator><pubDate>Mon, 09 May 2016 18:47:53 GMT</pubDate><content:encoded><![CDATA[<p><strong>Protocol</strong></p>

<blockquote>
  <p>In telecommunications, a communications protocol is a system of rules that allow two or more entities of a communications system to transmit information via any kind of variation of a physical quantity. These are the rules or standard that defines the syntax, semantics and synchronization of communication and possible error recovery methods. Protocols may be implemented by hardware, software, or a combination of both.</p>
</blockquote>

<p><em>Source: Wikipedia (<a href="https://en.wikipedia.org/wiki/Communications_protocol">https://en.wikipedia.org/wiki/Communications_protocol</a>)</em></p>

<p>We web developers thrive on HTTP, another protocol. For a long time we were content with GET and POST. Especially in the Microsoft world. Other HTTP verbs were unheard of. Come ASPNET MVC the paradigm changed and we were forced to become "HTTP Aware". With the adoption of <a href="https://en.wikipedia.org/wiki/Representational_state_transfer">REST</a> (REpresentational State Transfer) and <a href="http://www.asp.net/web-api">ASPNET WebAPI</a> even more so. However the protocol is not just one way communication and the way HTTP Verbs like GET, PUT, POST, DELETE... are meant for the client to tell the server what it needs to do, similarly the server will have to respond in a predictable matter. In HTTP we do this with the HTTP Status codes. 404 anyone? Of course there are request and response headers in the protocol, but lets reserve that for another discussion.</p>

<p><strong>HTTP Status Codes</strong></p>

<blockquote>
  <p>The first digit of the Status-Code defines the class of response. The last two digits do not have any categorization role. There are 5 values for the first digit <br>
  <mark>1xx:</mark> Informational - Request received, continuing process <br>
  <mark>2xx:</mark> Success - The action was successfully received, understood, and accepted <br>
  <mark>3xx:</mark> Redirection - Further action must be taken in order to complete the request <br>
  <mark>4xx:</mark> Client Error - The request contains bad syntax or cannot be fulfilled <br>
  <mark>5xx:</mark> Server Error - The server failed to fulfill an apparently valid request  </p>
</blockquote>

<p><em>Source: IETF (<a href="https://tools.ietf.org/html/rfc2616#section-6.1.1">https://tools.ietf.org/html/rfc2616#section-6.1.1</a>)</em></p>

<p>Picking the right response code however is tricky and is a series of long winding decisions. I am often confused making those decisions and end up making wrong choices. So to keep matters simple I started looking for a simple decision tree to aid in the decision making process. I found quite a few but they were too complex to decipher and scroll through, so decided to bite the bullet and draw one in Visio. The png below is for reference and the <a href="https://sarangghost.blob.core.windows.net/staticfiles/09052016/HTTP%20Response%20Decision%20Tree.vsdx">VSDX is available here</a>. </p>

<p>For the sake of full disclosure, this is not a ultimate guide. I have omitted the verbs <a href="https://tools.ietf.org/html/rfc2616#section-9.8">TRACE</a>, used for remote application-layer loopbacks and <a href="https://tools.ietf.org/html/rfc2616#section-9.9">CONNECT</a>, used by proxies that can dynamically switch to being a tunnel. Both of which I have no business coding as of today or in near future.</p>

<p>The way I am working through this file right now, is when I have a question about a response code, I look up the Verb being requested, and follow the decision tree from there. Hope this helps you too.</p>

<p><img src="https://sarangghost.blob.core.windows.net/staticfiles/09052016/HTTP%20Response%20Decision%20Tree.png" alt="alt" title="">   </p>

<p><strong>Further reading:</strong></p>

<ul>
<li><a href="https://tools.ietf.org/html/rfc2616#section-4.5">HTTP General Headers</a>  </li>
<li><a href="https://tools.ietf.org/html/rfc2616#section-7.1">HTTP Entity Headers</a>  </li>
<li><a href="https://tools.ietf.org/html/rfc2616#section-6.2">HTTP Response Headers</a>  </li>
</ul>

<p>PS: Very important response code is also not included in the diagram<a href="https://en.wikipedia.org/wiki/Hyper_Text_Coffee_Pot_Control_Protocol">HTTP 418</a>. Sorry for being a HTTP 418 <br>
<img src="https://upload.wikimedia.org/wikipedia/commons/4/4d/HTCPCP_Pot.jpg" alt="TeaPot"></p>]]></content:encoded></item><item><title><![CDATA[Get Row Count from all tables in a MSSQL Database]]></title><description><![CDATA[<p>We are in the middle of a migration of a large database from one Azure region to another. Having configured the geo-replication I wanted to confirm the replication is working correctly. Yes I am paranoid like that.</p>

<p>So a few searches later landed at this awesome page on MSDN (<a href="https://msdn.microsoft.com/en-us/library/ms190324.aspx">https:</a></p>]]></description><link>http://sarang.azurewebsites.net/get-count-of-rows-in-a-mssql-database/</link><guid isPermaLink="false">7ef8d763-8c95-4fc2-bf3e-2e333e1e9b1b</guid><dc:creator><![CDATA[Sarang Kulkarni]]></dc:creator><pubDate>Sat, 07 May 2016 12:42:04 GMT</pubDate><content:encoded><![CDATA[<p>We are in the middle of a migration of a large database from one Azure region to another. Having configured the geo-replication I wanted to confirm the replication is working correctly. Yes I am paranoid like that.</p>

<p>So a few searches later landed at this awesome page on MSDN (<a href="https://msdn.microsoft.com/en-us/library/ms190324.aspx">https://msdn.microsoft.com/en-us/library/ms190324.aspx</a>). And managed to put together this little script. There could be better ways of doing this, but this one worked for our needs. </p>

<p>Happy to see how you are doing it</p>

<pre><code class="language-sql">-- Run this against the database from which you want the row counts
-- Ref https://msdn.microsoft.com/en-us/library/ms190324.aspx
SELECT  
      QUOTENAME(SCHEMA_NAME(sysObjects.schema_id)) + '.' + QUOTENAME(sysObjects.name) AS [Table]
      , SUM(sysPartitions.Rows) AS [Rows]
FROM  
      sys.objects AS sysObjects
      INNER JOIN sys.partitions AS sysPartitions
            ON sysObjects.object_id = sysPartitions.object_id
WHERE  
      sysObjects.type = 'U' -- U = Table (user-defined) (https://msdn.microsoft.com/en-us/library/ms190324.aspx)
      AND sysObjects.is_ms_shipped = 0x0 --Object is created by an internal SQL Server component. Ignore these objects from the query
      AND index_id &lt; 2 -- We need all Heap (0) and Clustered (1) indices
GROUP BY  
      sysObjects.schema_id, sysObjects.name
ORDER BY [Table]  
GO  
</code></pre>

<p>Also available at a gist here (<a href="https://gist.github.com/sarangbk/01549440ef73e8729b19baf0608c08c8">https://gist.github.com/sarangbk/01549440ef73e8729b19baf0608c08c8</a>) for some reason Gist editor is not happy to syntax highlight any SQL code today so not including the embed here.</p>]]></content:encoded></item><item><title><![CDATA[Shiny new thing]]></title><description><![CDATA[This post shows how to host Ghost on a Azure website.]]></description><link>http://sarang.azurewebsites.net/shiny-new-thing/</link><guid isPermaLink="false">0c4ff81c-628b-4b41-89b7-1ba411405f3d</guid><category><![CDATA[blog]]></category><category><![CDATA[blogging]]></category><category><![CDATA[ghost]]></category><category><![CDATA[azure]]></category><dc:creator><![CDATA[Sarang Kulkarni]]></dc:creator><pubDate>Sun, 06 Mar 2016 12:38:03 GMT</pubDate><content:encoded><![CDATA[<p>I am a Pro-procrastinator. Avoiding blogging, sighting frivolous reasons like, "not having a decent platform to blog with" is my favourite one. Having spent initial days, rigging my own redneck blog, to lazying it out with <a href="http://geekswithblogs.net/iunknown/Default.aspx">subtext on geekswithblogs</a> to good old self hosted WordPress. Heck I even went full redneck (or geek if you will) and tried going <a href="https://pages.github.com/">GitHub Pages</a>. None satisfied me. Or rather none seemed to help me get over my procrastination.</p>

<h3 id="entertheghost">Enter the Ghost</h3>

<p>Finally I almost decided to go <a href="https://medium.com/">Medium</a>, but this excellent <a href="http://www.troyhunt.com/2015/10/creating-blog-for-your-non-techie.html">blog post</a> by <a href="https://twitter.com/troyhunt">@troyhunt </a> convinced me otherwise. So off I go to <a href="https://ghost.org/">Ghost.org</a> to signup and sadly they've changed their pricing since. The 8$ a month was real tempting but at 14$ a month I have my reservations. The simplicity of Ghost was still remarkable and I already had it running on a machine at home. What nailed it for me finally was this thing called "<a href="https://deploy.azure.com/#/form/infohome">Deploy to Azure</a>". <br>
<img src="https://deploy.azure.com/content/deploybuttondark.png" alt="Deploy to Azure" title=""> <br>
Which automagically deploys stuff to an Azure website, using Azure Resource Manager templates. It's another DevOpsy shiny new thing which I will try to cover in another post. In simple terms it provisions and configures the Azure Website for you and deploys the code there. </p>

<p>That brings us to this potentially bad decision of hosting Ghost on my own. This is forked from Felix Riesberg's <a href="https://github.com/AzureWebApps/Ghost-Azure">Ghost-Azure</a> repo, so a big thanks is due to the dude. This repo is a good example of how and why to use the Deploy to Azure button.</p>

<h3 id="customdomain">Custom Domain</h3>

<p>I have moved my domains to <a href="https://dnsimple.com/">DNSimple</a> and it really is dead simple. Azure website is available as a one-click service along many others and it took less than a minute to setup the ALIAS and CNAME to <a href="https://azure.microsoft.com/en-in/documentation/articles/web-sites-custom-domain-name/">awverify</a> records. After that its a quick step in the Azure Portal to tell azure that you want to use this domain, and telling ghost you will be using this domain. This can be done at your blog's <code>/ghost/settings/navigation/</code> page, and voila!</p>

<h3 id="syntaxhighlighting">Syntax Highlighting</h3>

<p>I am currently trying out Prism.js for syntax highlighting. The installation is a bit of work, uploading one js and one css file to the theme's directory and editing the theme file to link those js and css files.</p>

<p>I hope to write a better todo for this, but there already is plenty of help at Ghost.org. Happy blogging.</p>]]></content:encoded></item><item><title><![CDATA[Welcome to Ghost]]></title><description><![CDATA[<p>You're live! Nice. We've put together a little post to introduce you to the Ghost editor and get you started. You can manage your content by signing in to the admin area at <code>&lt;your blog URL&gt;/ghost/</code>. When you arrive, you can select this post from a list</p>]]></description><link>http://sarang.azurewebsites.net/welcome-to-ghost/</link><guid isPermaLink="false">353fedf2-afee-4788-aff9-03dcdc98063f</guid><category><![CDATA[Getting Started]]></category><dc:creator><![CDATA[Sarang Kulkarni]]></dc:creator><pubDate>Sat, 05 Mar 2016 20:22:39 GMT</pubDate><content:encoded><![CDATA[<p>You're live! Nice. We've put together a little post to introduce you to the Ghost editor and get you started. You can manage your content by signing in to the admin area at <code>&lt;your blog URL&gt;/ghost/</code>. When you arrive, you can select this post from a list on the left and see a preview of it on the right. Click the little pencil icon at the top of the preview to edit this post and read the next section!</p>

<h2 id="gettingstarted">Getting Started</h2>

<p>Ghost uses something called Markdown for writing. Essentially, it's a shorthand way to manage your post formatting as you write!</p>

<p>Writing in Markdown is really easy. In the left hand panel of Ghost, you simply write as you normally would. Where appropriate, you can use <em>shortcuts</em> to <strong>style</strong> your content. For example, a list:</p>

<ul>
<li>Item number one</li>
<li>Item number two
<ul><li>A nested item</li></ul></li>
<li>A final item</li>
</ul>

<p>or with numbers!</p>

<ol>
<li>Remember to buy some milk  </li>
<li>Drink the milk  </li>
<li>Tweet that I remembered to buy the milk, and drank it</li>
</ol>

<h3 id="links">Links</h3>

<p>Want to link to a source? No problem. If you paste in a URL, like <a href="http://ghost.org">http://ghost.org</a> - it'll automatically be linked up. But if you want to customise your anchor text, you can do that too! Here's a link to <a href="http://ghost.org">the Ghost website</a>. Neat.</p>

<h3 id="whataboutimages">What about Images?</h3>

<p>Images work too! Already know the URL of the image you want to include in your article? Simply paste it in like this to make it show up:</p>

<p><img src="https://ghost.org/images/ghost.png" alt="The Ghost Logo"></p>

<p>Not sure which image you want to use yet? That's ok too. Leave yourself a descriptive placeholder and keep writing. Come back later and drag and drop the image in to upload:</p>

<h3 id="quoting">Quoting</h3>

<p>Sometimes a link isn't enough, you want to quote someone on what they've said. Perhaps you've started using a new blogging platform and feel the sudden urge to share their slogan? A quote might be just the way to do it!</p>

<blockquote>
  <p>Ghost - Just a blogging platform</p>
</blockquote>

<h3 id="workingwithcode">Working with Code</h3>

<p>Got a streak of geek? We've got you covered there, too. You can write inline <code>&lt;code&gt;</code> blocks really easily with back ticks. Want to show off something more comprehensive? 4 spaces of indentation gets you there.</p>

<pre><code>.awesome-thing {
    display: block;
    width: 100%;
}
</code></pre>

<h3 id="readyforabreak">Ready for a Break?</h3>

<p>Throw 3 or more dashes down on any new line and you've got yourself a fancy new divider. Aw yeah.</p>

<hr>

<h3 id="advancedusage">Advanced Usage</h3>

<p>There's one fantastic secret about Markdown. If you want, you can write plain old HTML and it'll still work! Very flexible.</p>

<p><input type="text" placeholder="I'm an input field!"></p>

<p>That should be enough to get you started. Have fun - and let us know what you think :)</p>]]></content:encoded></item></channel></rss>