<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>web-development on S Anand</title>
    <link>https://www.s-anand.net/blog/tag/web-development/</link>
    <description>Recent content in web-development on S Anand</description>
    <generator>Hugo -- 0.156.0</generator>
    <language>en-us</language>
    <lastBuildDate>Fri, 05 Jun 2026 17:14:17 +0800</lastBuildDate>
    <atom:link href="https://www.s-anand.net/blog/tag/web-development/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>When the prompt is longer than the code</title>
      <link>https://www.s-anand.net/blog/when-the-prompt-is-longer-than-the-code/</link>
      <pubDate>Fri, 05 Jun 2026 17:14:17 +0800</pubDate>
      <guid>https://www.s-anand.net/blog/when-the-prompt-is-longer-than-the-code/</guid>
      <description>&lt;p&gt;I used &lt;a href=&#34;https://pi.dev/&#34;&gt;pi&lt;/a&gt; to create a compact home page for &lt;a href=&#34;https://media.s-anand.net/&#34;&gt;media.s-anand.net&lt;/a&gt; using these prompts:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Create &lt;code&gt;index.html&lt;/code&gt; - a simple, elegant page that says that this page (media.s-anand.net) serves large media files for &lt;a href=&#34;https://www.s-anand.net/&#34;&gt;Anand&lt;/a&gt; - that&amp;rsquo;s where they should look instead.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;hellip; followed by:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Skip the part that says &amp;ldquo;Please visit &amp;hellip;&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;hellip; then:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Shorten index.html to just 2-3 elegant rules of CSS. I want it MUCH smaller and simpler.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;hellip; and finally:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Center vertically and horizontally.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;These prompts ended up being larger than the 471-byte &lt;code&gt;index.html&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;!doctype html&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;html&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;lang&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;en&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;meta&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;charset&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;meta&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;viewport&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;width=device-width, initial-scale=1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;media.s-anand.net&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;style&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;body&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;min-height&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;100&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;vh&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;display&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;grid&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;place-content&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;center&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;margin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;auto&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;font&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1.25&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;rem&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;1.6&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;system-ui&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;sans-serif&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;h1&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;font-size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;clamp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;rem&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;8&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;vw&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;rem&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;style&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;h1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;media.s-anand.net&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;h1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;This domain serves large media files for &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;href&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://www.s-anand.net/&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;Anand&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;.&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;html&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Not that this matters, because:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I didn&amp;rsquo;t know what I wanted and having an AI coding agent generate a first draft helped with starting trouble and ideation.&lt;/li&gt;
&lt;li&gt;I don&amp;rsquo;t know how to center on the screen and this did it for me.&lt;/li&gt;
&lt;li&gt;I am practicing the skill that matters - reviewing - and not the skill AI is taking over - writing code.&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item>
    <item>
      <title>Things I Learned - 11 Jan 2026</title>
      <link>https://www.s-anand.net/blog/things-i-learned-11-jan-2026/</link>
      <pubDate>Sun, 11 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/things-i-learned-11-jan-2026/</guid>
      <description>&lt;p&gt;This week, I learned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.softwareheritage.org/&#34;&gt;Software Heritage&lt;/a&gt; is a non-profit that archives software. You can &lt;a href=&#34;https://archive.softwareheritage.org/save/&#34;&gt;submit any Git repo&lt;/a&gt; for archival. Over 400 million projects have been archived so far.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.goodreads.com/book/show/36085.Everything_Bad_is_Good_for_You&#34;&gt;Everything Bad Is Good For You&lt;/a&gt; by Steven Johnson (2005) argues that pop culture isn&amp;rsquo;t all bad. But it isn&amp;rsquo;t all good either, unlike the book&amp;rsquo;s claims. &lt;a href=&#34;https://claude.ai/share/15255c7e-c9ec-4251-8837-321612597c49&#34;&gt;Claude&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Popular culture formats (e.g. video games, manga, soap operas, game shows) are steadily more cognitively demanding, complex.&lt;/li&gt;
&lt;li&gt;They provide a dopamine kick from problem-solving.&lt;/li&gt;
&lt;li&gt;These may have led to the Flynn Effect (rising IQs in 1990s-2000s). Or it may be due to nutrition, smaller families, education, etc.&lt;/li&gt;
&lt;li&gt;Action games correlate with visual-spatial skills. Strategy games correlate with memory, planning. But is it causation? It doesn&amp;rsquo;t always translate to real-world skills.&lt;/li&gt;
&lt;li&gt;Also, side effects are real and bad: screen-time, addiction, misinformation, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The purpose of a featured image in a blog post is to help readers decide whether to read it. Share the article&amp;rsquo;s output/focus (e.g. for data stories, products). Else a visual summary (e.g. sketchnote, comic capturing the essence). Else skip. Avoid stock photos. &lt;a href=&#34;https://gemini.google.com/u/2/app/a465e10b89d53dbc&#34;&gt;#&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nflsavant.com/about.php&#34;&gt;NFLSavant.com&lt;/a&gt; has play-by-play data for NFL games.&lt;/li&gt;
&lt;li&gt;Ten of the least well known psychology / sociology research findings. &lt;a href=&#34;https://chatgpt.com/share/695cd05c-df64-8003-87e1-ad47ed8ef2a1&#34;&gt;ChatGPT&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Learning styles are a myth. People might &lt;em&gt;prefer&lt;/em&gt; visual / audio / &amp;hellip; learning but it doesn&amp;rsquo;t help learning. &lt;strong&gt;Mix learning modes&lt;/strong&gt;. NotebookLM can help.&lt;/li&gt;
&lt;li&gt;Casual acquaintances help find new information or jobs much more than close friends, since they&amp;rsquo;re in different social circles. &lt;strong&gt;Nurture weak ties&lt;/strong&gt;. Use a relationship architect.&lt;/li&gt;
&lt;li&gt;Tell a lie often enough and people mistake familiarity for truth. &lt;strong&gt;Fact-check habitually&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The more you see / hear something the more you like it. (Exposure effect.) &lt;strong&gt;Expose to good things&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;When others mess up, we blame them. When we mess up, we blame the situation. (Attribution error.) &lt;strong&gt;Pause before judging&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Sometimes, rewarding people makes them like doing it less. (Overjustification effect.)&lt;/li&gt;
&lt;li&gt;People who know less over-estimate their knowledge. (Dunning-Kruger effect.) &lt;strong&gt;Habitualize calibration&lt;/strong&gt; via feedback and tests.&lt;/li&gt;
&lt;li&gt;People do worse when they&amp;rsquo;re afraid their failure will reflect on their stereotype. (Stereotype threat.) &lt;strong&gt;Practice emotional resets&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Higher expectations lead to better performance. (Pygmalion effect.) &lt;strong&gt;Engineer positive expectations&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Benevolent sexism (e.g. protective paternalism) can be harmful too. &lt;strong&gt;Scan for well-meaning bias&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Liberalism =&amp;gt; economic growth, peace and expanding rights. Also colonial violence, exclusions (women, slavery, &amp;hellip;), and eroding community. It is vulnerable to authoritarianism (e.g. emergency powers, recessions). Since 2006, democracy has &lt;em&gt;consecutively&lt;/em&gt; declined, reversing half the progress since WW2. But alternatives are unclear. &lt;a href=&#34;https://claude.ai/public/artifacts/80d7c519-d431-41e5-8916-926ec433499f&#34;&gt;Claude&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Notes from &lt;a href=&#34;https://www.goodreads.com/book/show/427282.The_Periodic_Table&#34;&gt;The Periodic Table&lt;/a&gt; by Primo Levi.
&lt;ul&gt;
&lt;li&gt;Pure Zinc does not dissolve easily in sulphuric acid. An impurity like Copper Sulphate pulls electrons from Zinc and offers them to Hydrogen ions, speeding up the reaction. Impurities, foreign bodies, etc. have a purpose, too.&lt;/li&gt;
&lt;li&gt;Discomfort = Information. Overcoming discomfort = Capability. Capability = Freedom. Therefore: &lt;strong&gt;Seeking discomfort&lt;/strong&gt; (carefully, purposefully) = Building freedom.&lt;/li&gt;
&lt;li&gt;Simple != Easy. Simple = Clear. Clear = Actionable.&lt;/li&gt;
&lt;li&gt;Indifference often feels like malice.&lt;/li&gt;
&lt;li&gt;⭐ Analogies have limits. (The Map is not the Territory.) When using analogies, always explore where, when and why &lt;em&gt;they will break&lt;/em&gt;. Pay close attention near &lt;em&gt;where&lt;/em&gt; they break.&lt;/li&gt;
&lt;li&gt;⭐ Knowledge vanishes with people unless written down. Write &amp;ldquo;Do X. Because of Y. Unless Z changes.&amp;rdquo; The last two are critical.&lt;/li&gt;
&lt;li&gt;I could NOT have read the book without a Randall Munroe re-styling. I cried anyway.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&amp;ldquo;There&amp;rsquo;s about 300-400 that were corporate assets. One watched them all the time. These are people who in 15 years could be CEO. There&amp;rsquo;s something about them that caught your fancy when you were in a meeting&amp;hellip; brilliant ideas that challenged your thinking&amp;hellip; We called them &amp;ldquo;Corporate Assets&amp;rdquo; and tracked them, to make sure we game-planned them, give them the right assignments.&amp;rdquo; &lt;a href=&#34;https://youtu.be/E50ix2Y62y4?t=1613&#34;&gt;Indra Nooyi, The Knowledge Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Global_attributes/accesskey&#34;&gt;accesskey&lt;/a&gt; attribute works a bit like magic. Adding an &lt;code&gt;accesskey=&amp;quot;h&amp;quot;&lt;/code&gt; on a home page link, or an &lt;code&gt;accesskey=&amp;quot;t&amp;quot;&lt;/code&gt; on a theme toggle button automatically enables keyboard shortcuts Alt+H or Alt+T to activate them. (Varies by browser and OS, but hovering shows the shortcut!)&lt;/li&gt;
&lt;li&gt;Familiarity and recency feel like learning but they&amp;rsquo;re not. Instead: Take tests. Review (spaced repetition). Interleave learning. That&amp;rsquo;s what helps. &lt;a href=&#34;https://claude.ai/public/artifacts/8e5076f4-84c9-497a-ad38-d5654ae3f3b4&#34;&gt;Claude&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.goodreads.com/book/show/18770267-make-it-stick&#34;&gt;Make It Stick (Peter C. Brown, 2014)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.goodreads.com/book/show/18693655-a-mind-for-numbers&#34;&gt;A Mind for Numbers (Barbara Oakley, 2014)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.goodreads.com/book/show/44770129-ultralearning&#34;&gt;Ultralearning (Scott Young, 2019)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.goodreads.com/book/show/34507927-how-to-take-smart-notes&#34;&gt;How to Take Smart Notes (Sönke Ahrens, 2017)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    <item>
      <title></title>
      <link>https://www.s-anand.net/blog/coding-agent-comparison/</link>
      <pubDate>Sat, 25 Oct 2025 00:00:00 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/coding-agent-comparison/</guid>
      <description>&lt;p&gt;I asked multiple coding agents and models to build the same app:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Create a single-page web app at &lt;code&gt;index&lt;/code&gt;.&lt;code&gt;html&lt;/code&gt; that beautifully renders a GitHub user profile and activity comprehensively. Pick the ID in the URL ?&lt;code&gt;id&lt;/code&gt;=&amp;hellip;, default to ?&lt;code&gt;id&lt;/code&gt;=&lt;code&gt;torvalds&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;hellip; and compared their quality, cost, and speed.&lt;/p&gt;
&lt;p&gt;My observations:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quality variance is the highest&lt;/strong&gt;. Some models / agents produce great visuals, some average, some fail completely.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cost and time variance are lower&lt;/strong&gt; among the successful models. About 2X variance in each.&lt;/p&gt;
&lt;p&gt;This is unlike non-code usage, where quality varies &lt;em&gt;less&lt;/em&gt; than cost.&lt;/p&gt;
&lt;p&gt;My takeaway: &lt;strong&gt;Pick the best model&lt;/strong&gt; / &lt;strong&gt;agent&lt;/strong&gt;. Don&amp;rsquo;t worry about speed and cost - the variance is lower.&lt;/p&gt;
&lt;p&gt;Results: &lt;a href=&#34;https://sanand0.github.io/llmevals/coding-agents/&#34;&gt;https://sanand0.github.io/llmevals/coding-agents/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://files.s-anand.net/images/2025-10-25-coding-agent-comparison-linkedin.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/posts/sanand0_i-asked-multiple-coding-agents-and-models-activity-7383420784389787648-moGP&#34;&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Always use value= for dynamic HTML options</title>
      <link>https://www.s-anand.net/blog/always-use-value-for-dynamic-html-options/</link>
      <pubDate>Mon, 31 Jul 2023 06:45:48 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/always-use-value-for-dynamic-html-options/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Always use value= for dynamic HTML options&#34; loading=&#34;lazy&#34; src=&#34;https://www.s-anand.net/blog/assets/html-code.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;Even after 30 years of HTML, I learn new things about it.&lt;/p&gt;
&lt;p&gt;This Monday morning, I woke up to a mail from &lt;a href=&#34;https://www.linkedin.com/in/sundeeprm/&#34;&gt;Sundeep&lt;/a&gt; saying requests for a &lt;code&gt;Data Engineer - AWS/Azure/GCP&lt;/code&gt; in our internal fulfilment portal raised an error.&lt;/p&gt;
&lt;p&gt;My guess was one of these:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The &amp;ldquo;/&amp;rdquo; in the role is causing a problem. (Developer mistake.)&lt;/li&gt;
&lt;li&gt;The role exists in one table but not the other. (Recruitment team mistake.)&lt;/li&gt;
&lt;li&gt;The application wasn&amp;rsquo;t set up / restarted properly. (IT mistake.)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;All three were wrong&lt;/strong&gt;. So I dug deeper.&lt;/p&gt;
&lt;p&gt;The role was defined as &lt;code&gt;Data Engineer  - AWS/Azure/GCP&lt;/code&gt; (note the 2 spaces before the hyphen). But the form kept sending &lt;code&gt;Data Engineer - AWS/Azure/GCP&lt;/code&gt; (spaces were condensed).&lt;/p&gt;
&lt;p&gt;I swear there was &lt;strong&gt;NOTHING&lt;/strong&gt; in the code that changes the options. The relevant line just picked up the role and rendered it inside the &lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;```markup
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;option&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;{{ row[&amp;#39;Role&amp;#39;] }}&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;option&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I used the browser&amp;rsquo;s developer tools to inspect the &lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt; element. It showed the options with the 2 spaces:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-markup&#34; data-lang=&#34;markup&#34;&gt;&amp;lt;option&amp;gt;Data Engineer  - AWS/Azure/GCP&amp;lt;/option&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;But, when I selected it and printed the value, it had only one space.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;document&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;querySelector&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;#role&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;br&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&amp;gt;&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Data Engineer - AWS/Azure/GCP&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s when it hit me. &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model/Whitespace&#34;&gt;HTML condenses whitespaces&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Till date, I only ever used &lt;code&gt;&amp;lt;option value=&amp;quot;&amp;quot;&amp;gt;&lt;/code&gt; when specifying a value &lt;strong&gt;different&lt;/strong&gt; from what&amp;rsquo;s displayed. I never thought of using it to &lt;strong&gt;preserve&lt;/strong&gt; the value.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LESSON&lt;/strong&gt;: If you&amp;rsquo;re dynamically generating &lt;code&gt;&amp;lt;option&amp;gt;&lt;/code&gt;s, &lt;strong&gt;ALWAYS&lt;/strong&gt; use &lt;code&gt;value=&lt;/code&gt; with the same value as the text.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Create SVG with PowerPoint</title>
      <link>https://www.s-anand.net/blog/create-svg-with-powerpoint/</link>
      <pubDate>Mon, 21 Dec 2020 16:24:00 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/create-svg-with-powerpoint/</guid>
      <description>&lt;p&gt;With Office 365, &lt;a href=&#34;https://support.microsoft.com/en-us/office/edit-svg-images-in-microsoft-office-365-69f29d39-194a-4072-8c35-dbe5e7ea528c&#34;&gt;PowerPoint supports SVG editing&lt;/a&gt;. This is really powerful. It means you can draw in PowerPoint and render it on the web &amp;ndash; including as interactive or animated visuals.&lt;/p&gt;
&lt;p&gt;For example, the SVG in this &lt;a href=&#34;https://gramener.com/processmonitor/simulator&#34;&gt;simulator&lt;/a&gt; was created just with PowerPoint.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://gramener.com/processmonitor/simulator&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://www.s-anand.net/blog/assets/proxy.gif&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The process is simple. Draw anything. Select any shapes and right-click. Select Save As Picture&amp;hellip; and choose SVG.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://www.s-anand.net/blog/assets/image-6.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;For example, you can use PowerPoint to create Smart Art, export it as SVG, and embed it into a page. See this example on &lt;a href=&#34;https://codepen.io/sanand0/pen/poEwYYy&#34;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;
&lt;iframe allowfullscreen=&#34;true&#34; allowtransparency=&#34;true&#34; frameborder=&#34;no&#34; height=&#34;480&#34; loading=&#34;lazy&#34; scrolling=&#34;no&#34; src=&#34;https://codepen.io/sanand0/embed/poEwYYy?height=480&amp;amp;theme-id=light&amp;amp;default-tab=result&#34; style=&#34;width: 100%;&#34; title=&#34;Smart Art SVG&#34;&gt;
  See the Pen &lt;a href=&#34;https://codepen.io/sanand0/pen/poEwYYy&#34;&gt;Smart Art SVG&lt;/a&gt; by S Anand
  (&lt;a href=&#34;https://codepen.io/sanand0&#34;&gt;@sanand0&lt;/a&gt;) on &lt;a href=&#34;https://codepen.io&#34;&gt;CodePen&lt;/a&gt;.
&lt;/iframe&gt;
&lt;p&gt;The SVG is fairly well structured and easy to edit. The code generated for these 2 simple shapes:&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://www.s-anand.net/blog/assets/image-png-8.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;&amp;hellip; is quite straight-forward &amp;ndash; just two SVG shapes.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-svg&#34; data-lang=&#34;svg&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;rect&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;x=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;125.5&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;y=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;185.5&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;width=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;107&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;height=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;107&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;stroke=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;#2F528F&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;stroke-width=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;1.33333&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;stroke-miterlimit=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;8&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;fill=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;#4472C4&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;path&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;d=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;M243.5 292.5 297 185.5 350.5 292.5Z&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;stroke=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;#2F528F&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;stroke-width=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;1.33333&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;stroke-miterlimit=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;8&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;fill=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;#4472C4&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;fill-rule=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;evenodd&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I was worried about the lack of SVG authoring tools in Windows. (InkScape is not usable, and Adobe&amp;rsquo;s tools are complex and expensive.) PowerPoint fits perfectly.&lt;/p&gt;
&lt;div class=&#34;video-embed&#34;&gt;&lt;iframe src=&#34;https://www.youtube.com/embed/5ndouHSYGxA&#34; title=&#34;YouTube video&#34; loading=&#34;lazy&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&#34; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
</description>
    </item>
    <item>
      <title>A-Z of my browsing history</title>
      <link>https://www.s-anand.net/blog/a-z-of-my-browsing-history/</link>
      <pubDate>Fri, 09 May 2014 16:16:38 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/a-z-of-my-browsing-history/</guid>
      <description>&lt;p&gt;When you start typing in the address bar, Chrome suggests a link to visit, based on &lt;a href=&#34;http://en.wikipedia.org/wiki/Frecency&#34;&gt;frecency&lt;/a&gt;. What do my recommendations look like?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A is for &lt;a href=&#34;http://airtel.in/smartbyte-s/page.html&#34;&gt;airtel.in/smartbyte-s/page.html&lt;/a&gt; – the page where you can check your bandwidth usage. I used to check it infrequently until I upgraded to a 125GB connection. Now I check it every few days and feel miserable that I’ve nowhere near used up my quota. This has coerced me to watch many Telugu movies, of which I don’t understand a word.&lt;/li&gt;
&lt;li&gt;B is for &lt;a href=&#34;http://blog.gramener.com/&#34;&gt;blog.gramener.com&lt;/a&gt; – I blog there on data stories. The last month or so has been fairly active thanks to the elections.&lt;/li&gt;
&lt;li&gt;C is for &lt;a href=&#34;http://calendar.google.com&#34;&gt;calendar.google.com&lt;/a&gt; – which has become primarily a &lt;strong&gt;shared&lt;/strong&gt; calendar. It was always indispensible to manage my time. Now it helps my colleagues pick when to call me. Right now, my calendar has events booked about two months in advance.&lt;/li&gt;
&lt;li&gt;D is for &lt;a href=&#34;https://docs.google.com/&#34;&gt;docs.google.com&lt;/a&gt; – for effectively one single purpose: shared spreadsheets. This is such a common and powerful use case, and I’m surprised it hasn’t become much easier to use.&lt;/li&gt;
&lt;li&gt;E is for &lt;a href=&#34;http://epaper.timesofindia.com/&#34;&gt;epaper.timesofindia.com&lt;/a&gt; – some of our content has been published by The Economic Times, and I keep doing ego-searches in the print edition. But close behind is &lt;a href=&#34;http://eci.nic.in/&#34;&gt;eci.nic.in&lt;/a&gt; which I’ve been scraping a lot, and &lt;a href=&#34;http://election-results.ibnlive.in.com/&#34; title=&#34;http://election-results.ibnlive.in.com/&#34;&gt;election-results.ibnlive.in.com&lt;/a&gt; which we created for CNN-IBN.&lt;/li&gt;
&lt;li&gt;F is for &lt;a href=&#34;http://www.flipkart.com/&#34;&gt;flipkart.com&lt;/a&gt; – not &lt;a href=&#34;https://www.facebook.com/&#34;&gt;facebook.com&lt;/a&gt;. I’m not often on Facebook.&lt;/li&gt;
&lt;li&gt;G is for &lt;a href=&#34;https://gramener.com/&#34;&gt;gramener.com&lt;/a&gt;. Naturally. (It’s not surprising that it’s not google.com: I search directly from the address bar.)&lt;/li&gt;
&lt;li&gt;H is for &lt;a href=&#34;http://handsontable.com/&#34;&gt;handsontable.com&lt;/a&gt; – a library that I’ve been using a lot recently, followed by &lt;a href=&#34;http://html5please.com/&#34; title=&#34;http://html5please.com/&#34;&gt;html5please.com&lt;/a&gt; that tells me which HTML5 features are ready for use.&lt;/li&gt;
&lt;li&gt;I is for &lt;a href=&#34;http://ibn.gramener.com/&#34;&gt;ibn.gramener.com&lt;/a&gt; – another property we created, but it only just beats &lt;a href=&#34;http://www.irctc.co.in/&#34;&gt;irctc.co.in&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;J is for &lt;a href=&#34;http://join.me/&#34;&gt;join.me&lt;/a&gt; – a clean way to share your screen without the audience having to install anything (though you the sharer do have to install the software.)&lt;/li&gt;
&lt;li&gt;K is for &lt;a href=&#34;https://kraken.io/&#34;&gt;kraken.io&lt;/a&gt; – an amazingly efficient image compressor. As you might have guessed, I lead a strange life.&lt;/li&gt;
&lt;li&gt;L is for &lt;a href=&#34;https://learn.gramener.com/&#34;&gt;learn.gramener.com&lt;/a&gt; – our Intranet. Sorry, you can’t access this one.&lt;/li&gt;
&lt;li&gt;M is for &lt;a href=&#34;https://mail.google.com/&#34;&gt;mail.google.com&lt;/a&gt;. I’ll probably be moving away from gmail as a backend this weekend to &lt;a href=&#34;https://github.com/JoshData/mailinabox/&#34;&gt;Mail-in-a-box&lt;/a&gt;, though. Google’s pulling the plug on Google Reader has shaken my faith.&lt;/li&gt;
&lt;li&gt;N is for &lt;a href=&#34;http://news.ycombinator.com/&#34; title=&#34;http://news.ycombinator.com/&#34;&gt;news.ycombinator.com&lt;/a&gt;. When I’m bored and want to watch something while I have dinner, I don’t open YouTube. I open Hacker News.&lt;/li&gt;
&lt;li&gt;O is for &lt;a href=&#34;http://odc.datameet.org/&#34; title=&#34;http://odc.datameet.org/&#34;&gt;odc.datameet.org&lt;/a&gt; – the Open Data Camp. I’m quite into open data.&lt;/li&gt;
&lt;li&gt;P is for &lt;a href=&#34;https://pay.airtel.com/&#34; title=&#34;https://pay.airtel.com&#34;&gt;pay.airtel.com&lt;/a&gt;, but if you ignore the number of bills I pay, it would be &lt;a href=&#34;http://pandas.pydata.org/&#34; title=&#34;http://pandas.pydata.org/&#34;&gt;pandas.pydata.org&lt;/a&gt;, the home page of a remarkable data processing library.&lt;/li&gt;
&lt;li&gt;Q is for &lt;a href=&#34;http://www.quirksmode.org/&#34;&gt;quirksmode.org&lt;/a&gt;, PPK’s remarkable browser-compatibility guide&lt;/li&gt;
&lt;li&gt;R is for &lt;a href=&#34;http://reader.s-anand.net/&#34;&gt;reader.s-anand.net&lt;/a&gt;, my self-hosted RSS reader. It used to be reader.google.com, but Google let me down there.&lt;/li&gt;
&lt;li&gt;S is for &lt;a href=&#34;http://s-anand.net/&#34; title=&#34;http://s-anand.net/&#34;&gt;s-anand.net&lt;/a&gt; – this blog.&lt;/li&gt;
&lt;li&gt;T is for &lt;a href=&#34;https://twitter.com/&#34;&gt;twitter.com&lt;/a&gt;. Unlike Facebook, I don’t dislike Twitter so much.&lt;/li&gt;
&lt;li&gt;U is for &lt;a href=&#34;http://underscorejs.org/&#34; title=&#34;http://underscorejs.org/&#34;&gt;underscorejs.org&lt;/a&gt;. Clearly I need to get a life.&lt;/li&gt;
&lt;li&gt;V is for &lt;a href=&#34;http://visualizing.org/&#34; title=&#34;http://visualizing.org/&#34;&gt;visualizing.org&lt;/a&gt;. They have a number of interesting data visualisations.&lt;/li&gt;
&lt;li&gt;W is for &lt;a href=&#34;http://www.webpagetest.org&#34;&gt;webpagetest.org&lt;/a&gt; – it helps measure the speed of web pages.&lt;/li&gt;
&lt;li&gt;X is for &lt;a href=&#34;http://xem.github.io/&#34; title=&#34;http://xem.github.io/&#34;&gt;xem.github.io&lt;/a&gt;. I’ve probably visited this page once, but it’s the only one in my recent history that starts with X&lt;/li&gt;
&lt;li&gt;Y is for &lt;a href=&#34;https://www.youtube.com/&#34;&gt;youtube.com&lt;/a&gt;. I lied. I spend an order of magnitude more time watching Telugu movies on YouTube than on Hacker News.&lt;/li&gt;
&lt;li&gt;Z is for &lt;a href=&#34;https://www.zoemob.com/en/&#34;&gt;zoemob.com&lt;/a&gt;. Again, a page I visited only once, but there’s nothing else in Z at the moment.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;comments&#34;&gt;Comments&lt;/h2&gt;
&lt;!-- wp-comments-start --&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;http://www.s-anand.net/blog/software-i-currently-use/&#34;&gt;Software I currently use | s-anand.net&lt;/a&gt;&lt;/strong&gt; &lt;em&gt;9 May 2014 6:24 pm&lt;/em&gt; &lt;em&gt;(pingback)&lt;/em&gt;:
[…] course, some of my apps apps have moved online, and my earlier post on the A-Z of my browsing history covers that. But there are a few applications that I’ve hosted which I must talk about. […]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;http://broadband-chandigarh.in&#34;&gt;chandigarh&lt;/a&gt;&lt;/strong&gt; &lt;em&gt;13 Oct 2015 7:27 pm&lt;/em&gt;:
you can delete your web search history through link
&lt;a href=&#34;https://history.google.com/history&#34;&gt;https://history.google.com/history&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- wp-comments-end --&gt;
</description>
    </item>
    <item>
      <title>Auto reloading pages</title>
      <link>https://www.s-anand.net/blog/auto-reloading-pages/</link>
      <pubDate>Sun, 30 Sep 2012 10:33:15 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/auto-reloading-pages/</guid>
      <description>&lt;p&gt;After watching &lt;a href=&#34;http://worrydream.com/&#34;&gt;Bret Victor&lt;/a&gt;’s &lt;a href=&#34;http://www.youtube.com/watch?v=PUv66718DII&#34;&gt;Inventing on Principle&lt;/a&gt;, I just &lt;strong&gt;had&lt;/strong&gt; to figure out a way of getting live reloading to work. I know about &lt;a href=&#34;http://livereload.com/&#34;&gt;LiveReload&lt;/a&gt;, of course, and everything I’ve heard about it is good. But their Windows version is in alpha, and I’m not about to experiment just yet.&lt;/p&gt;
&lt;p&gt;This little script does it for me instead:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;interval&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;location&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;lastdate&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;updateIfChanged&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;req&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;XMLHttpRequest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;req&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;HEAD&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;location&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;href&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;req&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;send&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;date&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;req&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;getResponseHeader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Last-Modified&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;lastdate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;lastdate&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;date&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;lastdate&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;date&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;location&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;reload&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;setInterval&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;updateIfChanged&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;interval&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;})(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;300&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;location&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It checks the current page every 300 milliseconds and reloads it if the Last-Modified header is changed. I usually include it as a minified script:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;){&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;setInterval&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(){&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;XMLHttpRequest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;HEAD&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;href&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;send&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;getResponseHeader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Last-Modified&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;reload&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)})(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;300&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;location&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;There are no dependencies on any library, like jQuery. However, it requires that the file be on a web server. (It’s easy to fix that, but since I always run a local webserver, I’ll let you solve that problem yourself.)&lt;/p&gt;
</description>
    </item>
    <item>
      <title>HTML 4 &amp; 5: The complete Reference</title>
      <link>https://www.s-anand.net/blog/html-4-5-the-complete-reference/</link>
      <pubDate>Wed, 09 Feb 2011 17:08:02 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/html-4-5-the-complete-reference/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.s-anand.net/blog/assets/HTML4and5TheCompleteReference.webp&#34;&gt;&lt;img alt=&#34;HTML-4-and-5-The-Complete-Reference&#34; loading=&#34;lazy&#34; src=&#34;https://www.s-anand.net/blog/assets/HTML4and5TheCompleteReference.webp&#34; title=&#34;HTML-4-and-5-The-Complete-Reference&#34;&gt;&lt;/a&gt; &lt;a href=&#34;http://itunes.apple.com/us/app/html-4-5-the-complete-reference/id414940489?mt=8&#34;&gt;HTML 4 &amp;amp; 5: The Complete Reference&lt;/a&gt; is an iPhone / iPad app that does exactly what it says: a reference for HTML 4 and 5.&lt;/p&gt;
&lt;p&gt;It has a list of all tags, clearly demarcated as HTML4, HTML5 or both. The application is fairly easy to scroll through to find the tag or attribute you want. Clicking on a tag, you get:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a brief &lt;strong&gt;description&lt;/strong&gt; of what it’s for&lt;/li&gt;
&lt;li&gt;what &lt;strong&gt;attributes&lt;/strong&gt; are valid – the good part is you can see clearly which attributes are specific to the element, and which ones are common (like class, id, etc.). You can also see the possible values for the attribute, which helps.&lt;/li&gt;
&lt;li&gt;and an &lt;strong&gt;example&lt;/strong&gt; of how the tag is used. The examples are quite simplistic, and there’s only one per tag, but it does have a rendered version of the code, which helps.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can also scroll through the list of attributes and see which tags they’re valid for.&lt;/p&gt;
&lt;p&gt;The part that quite interested me was the “characters” or HTML entities. Quite often, I’d want the pound (£) or right angle quotes (»), but wouldn’t know the character or entity reference. So far, I’ve been using this &lt;a href=&#34;http://www.howtocreate.co.uk/sidehtmlentity.html&#34;&gt;HTML entity reference&lt;/a&gt; to search for characters, where I can just type in the word (e.g. pound or quote) and it filters the list to show what I want. I was really hoping to see that on the app, but was disappointed. It lets you search, but it’s not search as you type. And the result points you to a &lt;strong&gt;section that contains&lt;/strong&gt; the character – not directly to the character. (It’s a bit difficult to find the character in the longer sections).&lt;/p&gt;
&lt;p&gt;There’s also a section where you can see elements by “task” – e.g. Forms, Link-related, Document Setup, Interaction, etc. This is a pretty useful break-up if you’re looking for the right element for the job, or browsing for interesting new elements to discover in HTML5. (I found the &lt;code&gt;&amp;lt;menu&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;command&amp;gt;&lt;/code&gt; tags this way.&lt;/p&gt;
&lt;p&gt;You do have the option of just downloading the &lt;a href=&#34;http://www.whatwg.org/specs/web-apps/current-work/html-a4.pdf&#34;&gt;PDF version of the HTML5 spec&lt;/a&gt; and reading it in iBooks, of course. So while I find the book useful, without a search-as-you-type feature, I suspect it won’t do much for my speed of looking up things, so I’ll just stick to the spec for the moment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Disclosure&lt;/strong&gt;: I’m writing this post as part of O’Reilly’s blogger review program. While I’m not getting paid to review the app, I did get it for free.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>HTML5: Up and Running</title>
      <link>https://www.s-anand.net/blog/html5-up-and-running/</link>
      <pubDate>Fri, 05 Nov 2010 13:30:59 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/html5-up-and-running/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;http://covers.oreilly.com/images/9780596806026/cat.gif&#34;&gt; &lt;a href=&#34;http://oreilly.com/catalog/9780596806026/&#34;&gt;HTML5: Up and Running&lt;/a&gt; is the book version of Mark Pilgrim’s comprehensive introduction to HTML5 at &lt;a href=&#34;http://diveintohtml5.org/&#34;&gt;DiveIntoHTML5.org&lt;/a&gt;. Whether you buy the book or read it online, it’s the best introduction to the topic you’ll find.&lt;/p&gt;
&lt;p&gt;Mark begins with the history of HTML5 (using email archaeology, as he calls it). You’d never guess that many of the problems we have with XHTML, MIME types, etc. have roots in discussions over 20 years ago. From then on, he moves into feature detection (which uses the &lt;a href=&#34;http://www.modernizr.com/&#34;&gt;Modernizr&lt;/a&gt; library), new tags, canvas, video, geo-location, storage, offline web apps, new form features and microdata. Each chapter can be read independently – so if you’re planning to use this as a reference, you may be better of reading the links kept up-to-date at &lt;a href=&#34;http://diveintohtml5.org/&#34;&gt;DiveIntoHTML5.org&lt;/a&gt;. If you’re interesting in learning about the features, it’s a very readable book, terse, simple, and above all, delightfully intelligent.&lt;/p&gt;
&lt;p&gt;Incidentally, if you’re starting off on a new HTML5 project, you’re probably best off using &lt;a href=&#34;http://html5boilerplate.com/&#34;&gt;HTML5BoilerPlate.com&lt;/a&gt;. It’s very &lt;a href=&#34;http://github.com/paulirish/html5-boilerplate/commits/master&#34;&gt;actively maintained&lt;/a&gt;, and contains some really nifty tricks you can learn like the &lt;a href=&#34;http://paulirish.com/2010/the-protocol-relative-url/&#34;&gt;protocol-relative URL&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Disclosure: I’m writing this post as part of &lt;a href=&#34;http://oreilly.com/bloggers/&#34;&gt;O’Reilly’s blogger review program&lt;/a&gt;. While I’m not getting paid to review books, I sure am getting to read them for free.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Modular CSS frameworks</title>
      <link>https://www.s-anand.net/blog/modular-css-frameworks/</link>
      <pubDate>Sun, 19 Sep 2010 21:34:37 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/modular-css-frameworks/</guid>
      <description>&lt;p&gt;A fair number of the CSS frameworks I’ve seen – &lt;a href=&#34;http://www.blueprintcss.org/&#34;&gt;Blueprint&lt;/a&gt;, &lt;a href=&#34;http://devkick.com/lab/tripoli/&#34;&gt;Tripoli&lt;/a&gt;, &lt;a href=&#34;http://developer.yahoo.com/yui/3/&#34;&gt;YUI&lt;/a&gt;, &lt;a href=&#34;http://sencss.kilianvalkhof.com/&#34;&gt;SenCSS&lt;/a&gt; – are monolithic. What I’d like is to be able to mix and match specific components of these.&lt;/p&gt;
&lt;p&gt;For example, &lt;a href=&#34;http://960.gs/&#34;&gt;960.gs&lt;/a&gt; has a simple grid system that I’d love to combine with the vertical rhythm that &lt;a href=&#34;http://sencss.kilianvalkhof.com/&#34;&gt;SenCSS&lt;/a&gt; offers. (Vertical rhythm ensures that sentences align vertically.) I’d love to have a CSS framework that just sets the fonts, for example, and touches nothing else. Or something that defines the colour schemes, and lets you change the theme like Microsoft Office does.&lt;/p&gt;
&lt;h2 id=&#34;lesscss&#34;&gt;LessCSS&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;http://lesscss.org/&#34;&gt;Less CSS&lt;/a&gt; has been invaluable in helping with this. It extends the CSS language without deviating significantly from it. Compared to &lt;a href=&#34;http://sass-lang.com/&#34;&gt;SASS&lt;/a&gt; and &lt;a href=&#34;http://sandbox.pocoo.org/clevercss/&#34;&gt;CleverCSS&lt;/a&gt;, I’d say it has a better chance of getting incorporated as into, say, CSS4.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LessCSS offers variables&lt;/strong&gt;. I can define a variable:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-css&#34; data-lang=&#34;css&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;foreground&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;#&lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;112233&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and use it like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-css&#34; data-lang=&#34;css&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;h1&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;foreground&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;hover&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;background-color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;foreground&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When I change @foreground, it’s replaced everywhere.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LessCSS offers multiple inheritance&lt;/strong&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-css&#34; data-lang=&#34;css&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;highlight&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;red&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;button&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;border-radius&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nc&#34;&gt;action&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;err&#34;&gt;.highlight&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;err&#34;&gt;.button&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This assigns the properties of the highlight and the button classes to the action class. Any changes made to the parents automatically get inherited.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LessCSS has a Javascript pre-processor&lt;/strong&gt;. So I can include it directly in the HTML, and add the pre-processor, which converts it into CSS.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;link&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;href=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;style.less&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;rel=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;stylesheet/less&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;script&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;src=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;less.js&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I now use LessCSS as the basis of all new projects.&lt;/p&gt;
&lt;h2 id=&#34;css-libraries&#34;&gt;CSS libraries&lt;/h2&gt;
&lt;p&gt;My first attempt to consolidate modular CSS libraries is at &lt;a href=&#34;http://bitbucket.org/sanand0/csslibs&#34;&gt;bitbucket.org/sanand0/csslibs&lt;/a&gt;. As far as possible, I’ve tried to avoid creating new libraries, or even tweaking existing ones. Over time, I hope to completely eliminate any new code.&lt;/p&gt;
&lt;p&gt;There are two types 2 types of libraries. Some just have variable definitions. Others actually define styles. For example, I’ve got three libraries that just define variables:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;color_themes.less&lt;/strong&gt;: Defines a standard set of color themes (based on the Office 2007 color themes)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;font_stacks.less&lt;/strong&gt;: Defines Web-safe font stacks (based on &lt;a href=&#34;http://www.sitepoint.com/article/eight-definitive-font-stacks/&#34;&gt;Sitepoint&amp;rsquo;s article&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;backgrounds.less&lt;/strong&gt;: Transparent background patterns (randomly useful images)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Including the above libraries will have no effect. You need to explicitly use them. For example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-css&#34; data-lang=&#34;css&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;font_stacks.less&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;         &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;Does&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;nothing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;h1&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;font-family&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;font&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;serif&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;  &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;Makes&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;H1&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;serif&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;font&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The following libraries define styles. Including them will define new classes or change the style of tags / classes.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;reset.less&lt;/strong&gt;: Resets default styles consistently across browsers. I chose &lt;a href=&#34;http://github.com/yui/yui3/blob/master/src/cssreset/css/reset.css&#34;&gt;YUI3 CSS Reset&lt;/a&gt; arbitrarily. I think &lt;a href=&#34;http://github.com/paulirish/html5-boilerplate&#34;&gt;HTML5boilerplate&lt;/a&gt;’s CSS reset may be a better choice, though.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;grids.less&lt;/strong&gt;: Defines classes for fixed and fluid grids. I choose &lt;a href=&#34;http://github.com/yui/yui3/blob/master/src/cssgrids/css/grids.css&#34;&gt;YUI3 CSS Grids&lt;/a&gt; over &lt;a href=&#34;http://960.gs/&#34;&gt;960.gs&lt;/a&gt; (which I’ve used for some years) because of its ability to offer fixed as well as fluid layouts, and the sheer brilliance of its minimality.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;lineheight.less&lt;/strong&gt;: Sets font sizes, ensuring that lines have a vertical rhythm. This is a stripped-down version of &lt;a href=&#34;http://sencss.kilianvalkhof.com/source/sen.css&#34;&gt;SenCSS&lt;/a&gt;, but over time, I’ll phase this out and use some standard framework someone comes up with.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Between these, I think the base infrastructure for most applications is in place. What’s required next are widgets. Specifically, I’d like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Buttons&lt;/strong&gt;. A really good, cross-browser, non-image-based button that offers rounded corners, gradients and borders.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Forms&lt;/strong&gt;. Consistent form styling, without forcing me to use a specific form layout.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Icons&lt;/strong&gt;. A standard icon library with replaceable CSS sprite-sets.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I’ll try keep the &lt;a href=&#34;http://bitbucket.org/sanand0/csslibs&#34;&gt;code&lt;/a&gt; updated as I find these. Do pass me any suggestions you may have.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;comments&#34;&gt;Comments&lt;/h2&gt;
&lt;!-- wp-comments-start --&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Abhishek Singh&lt;/strong&gt; &lt;em&gt;20 Sep 2010 6:23 pm&lt;/em&gt;:
This is really cool&amp;hellip; I think i wont be facing any build kit issues from now on :-)&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- wp-comments-end --&gt;
</description>
    </item>
    <item>
      <title>Make backgrounds transparent</title>
      <link>https://www.s-anand.net/blog/make-backgrounds-transparent/</link>
      <pubDate>Wed, 28 Apr 2010 06:57:37 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/make-backgrounds-transparent/</guid>
      <description>&lt;p&gt;This is the simplest way that I’ve found to make the background colour of an image transparent.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;http://portableapps.com/apps/graphics_pictures/gimp_portable&#34;&gt;Download GIMP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Open your image. I’ll pick this one:&lt;br&gt;
&lt;a href=&#34;https://www.s-anand.net/blog/assets/killme1.webp&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://www.s-anand.net/blog/assets/killme1.webp&#34;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Optional: Select Image – Mode – RGB if it’s not RGB.&lt;/li&gt;
&lt;li&gt;Select Colors – Colors to Alpha…&lt;br&gt;
&lt;a href=&#34;https://www.s-anand.net/blog/assets/killme2.webp&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://www.s-anand.net/blog/assets/killme2.webp&#34;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Click on the white button next to “From” and select the eye-dropper.&lt;a href=&#34;https://www.s-anand.net/blog/assets/killme3.webp&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://www.s-anand.net/blog/assets/killme3.webp&#34;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pick the green colour on the image, and click OK&lt;br&gt;
&lt;a href=&#34;https://www.s-anand.net/blog/assets/killme4.webp&#34;&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://www.s-anand.net/blog/assets/killme4.webp&#34;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The anti-aliasing is preserved as well.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;comments&#34;&gt;Comments&lt;/h2&gt;
&lt;!-- wp-comments-start --&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Vinu&lt;/strong&gt; &lt;em&gt;28 Apr 2010 11:21 pm&lt;/em&gt;:
There is a tool in MS Office products (Word, Excel, PowerPoint) to set the transparent color as well, assuming of course that you plan to embed the image in a document&amp;hellip;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;http://www.s-anand.net/&#34;&gt;S Anand&lt;/a&gt;&lt;/strong&gt; &lt;em&gt;29 Apr 2010 7:19 am&lt;/em&gt;:
Need to use the image in web pages, mostly. Would this MS Office tool still work?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;http://www.s-anand.net/&#34;&gt;S Anand&lt;/a&gt;&lt;/strong&gt; &lt;em&gt;29 Apr 2010 7:20 am&lt;/em&gt;:
True, Ravi. I need to automate this task, though. Tried ImageMagick at first, but gave up after a while.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vinu&lt;/strong&gt; &lt;em&gt;30 Apr 2010 5:51 pm&lt;/em&gt;:
Good question. If you use a drag and drop, WYSIWYG web page editor, then perhaps it will translate. I tested it between Powerpoint &amp;amp; Word and it worked.
Here&amp;rsquo;s the location of the control on PowerPoint 2007: on the Picture Tools /Format ribbon&amp;gt; Recolor (in the Adjust group, first from the left) drop down to &amp;ldquo;Set Transparent Color&amp;rsquo;.
Keyboard accelerator = Alt + J P E S.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;http://www.raviatluri.in&#34;&gt;Atluri&lt;/a&gt;&lt;/strong&gt; &lt;em&gt;28 Apr 2010 3:59 pm&lt;/em&gt;:
This works well only for text and images with strong contrast against their background
text as an image is outdated ;)
and for images i would use blend-&amp;gt;merge-&amp;gt;eraser for edges!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;http://bit.ly/vipulrawal&#34;&gt;Vipul&lt;/a&gt;&lt;/strong&gt; &lt;em&gt;13 May 2010 5:31 am&lt;/em&gt;:
Remove background option in MS-PowerPoint 2010 works even better. In love with that feature. :)&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- wp-comments-end --&gt;
</description>
    </item>
    <item>
      <title>IE6 in Corporates</title>
      <link>https://www.s-anand.net/blog/ie6-in-corporates/</link>
      <pubDate>Wed, 17 Jun 2009 09:13:03 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/ie6-in-corporates/</guid>
      <description>&lt;p&gt;PPK’s &lt;a href=&#34;http://www.quirksmode.org/blog/archives/2009/06/state_of_the_br_1.html&#34;&gt;State of the Browser – IE Edition&lt;/a&gt; mentions one reason why IE6 will probably stay on for a while.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Now why do I expect IE6 to stick around while IE7 goes down? The answer is simple: Intranets… many office workers will continue to be condemned to IE6.&lt;/p&gt;
&lt;p&gt;At work, that is. It’s quite likely that on their private computer at home they run another browser — IE7 or 8, Firefox, or maybe one of the smaller ones.&lt;/p&gt;
&lt;p&gt;… &lt;strong&gt;Basically, most of the IE6 market share comes from office-hour surfing, while it drops significantly in the after-hours period.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I checked the numbers on my site. It’s bang on. Last month, the percentage of IE6 users around noon was a little over 40%. At midnight, the percentage was 20%.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Percentage of IE6 users over a 24-hour window&lt;/strong&gt; &lt;a href=&#34;https://www.s-anand.net/blog/assets/flickr-24-hour_3634557407_o-png.webp&#34; title=&#34;Percentage of IE6 users over a 24-hour window&#34;&gt;&lt;img alt=&#34;Graph: Twice as many IE6 users at noon compared to midnight&#34; loading=&#34;lazy&#34; src=&#34;https://www.s-anand.net/blog/assets/flickr-24-hour_3634557407_o-png.webp&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Given that the bulk of my audience is from India, I would assume that these statistics are probably representative of Indian corporates. But I guess it means that there’s a fair bit of music listening happening at work. Probably a good thing.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;comments&#34;&gt;Comments&lt;/h2&gt;
&lt;!-- wp-comments-start --&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;http://tildekarthik.blogspot.com&#34;&gt;Karthik A&lt;/a&gt;&lt;/strong&gt; &lt;em&gt;17 Jun 2009 5:03 pm&lt;/em&gt;:
Yes, even our corporate IT deploys IE6. In fact , many of our enterprise apps support only IE6. Personally, I have upgraded and find that Javascripts that are unresponsive in IE8 and Chrome dont actually throw up that error in IE6.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;http://quirksmode.org&#34;&gt;ppk&lt;/a&gt;&lt;/strong&gt; &lt;em&gt;18 Jun 2009 2:43 pm&lt;/em&gt;:
Thanks for these figures! It&amp;rsquo;s good to have some actual data to point at, even though it&amp;rsquo;s anecdotal. Added link to main article.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;http://thejeshgn.com&#34;&gt;Thejesh GN&lt;/a&gt;&lt;/strong&gt; &lt;em&gt;8 Jul 2009 2:03 pm&lt;/em&gt;:
Interesting stats. I need to check my stats.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;http://www.digitalfiddler.com&#34;&gt;Naveen Arur&lt;/a&gt;&lt;/strong&gt; &lt;em&gt;13 Jul 2009 10:14 am&lt;/em&gt;:
Bang on target. Fortunately, my organization, which can be counted as large one, has woken up and we are moving forward(if there is such a thing with Microsoft) to IE 7 by end of the year&amp;hellip;.which also means more work for me to check if my applications work on IE7.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Khair&lt;/strong&gt; &lt;em&gt;22 Sep 2009 3:06 pm&lt;/em&gt;:
The reason why corporates don&amp;rsquo;t adapt to the changes is because of money invovled in upgrading. They have an awful time and money in making legacy applications compatible with new version of IE!!&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- wp-comments-end --&gt;
</description>
    </item>
    <item>
      <title>Error logging with Google Analytics</title>
      <link>https://www.s-anand.net/blog/error-logging-with-google-analytics/</link>
      <pubDate>Sat, 23 May 2009 19:29:01 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/error-logging-with-google-analytics/</guid>
      <description>&lt;p&gt;A quick note: I blogged earlier about &lt;a href=&#34;https://www.s-anand.net/blog/javascript-error-logging/&#34;&gt;Javascript error logging&lt;/a&gt;, saying that you can wrap every function in your code (automatically) in a &lt;code&gt;try{} catch{}&lt;/code&gt; block, and log the error message in the &lt;code&gt;catch{}&lt;/code&gt; block.&lt;/p&gt;
&lt;p&gt;I used to write the error message to a Perl script. But now I use &lt;a href=&#34;http://code.google.com/apis/analytics/docs/tracking/eventTrackerGuide.html&#34;&gt;Google’s event tracking&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;push&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;=&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;join&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;substr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;500&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;pageTracker&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;_trackEvent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Error&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;function_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The good part is that it makes error monitoring a whole lot easier. Within a day of implementing this, I managed to get a couple of errors fixed that had been pending for months.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;comments&#34;&gt;Comments&lt;/h2&gt;
&lt;!-- wp-comments-start --&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;http://thejeshgn.com&#34;&gt;Thejesh GN&lt;/a&gt;&lt;/strong&gt; &lt;em&gt;29 May 2009 7:40 am&lt;/em&gt;:
That is a good tip. I can use the present infrastructure for error logging..&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- wp-comments-end --&gt;
</description>
    </item>
    <item>
      <title>Short notes</title>
      <link>https://www.s-anand.net/blog/short-notes/</link>
      <pubDate>Wed, 20 May 2009 05:15:32 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/short-notes/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m quite busy on a project right now, and don&amp;rsquo;t get time to write long articles. So for a while, I&amp;rsquo;m going to stick to short notes on interesting stuff.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Peter Bregman has a very interesting piece on &lt;a href=&#34;http://blogs.harvardbusiness.org/bregman/2009/05/why-you-should-encourage-weakn.html&#34;&gt;Why You Should Encourage Weakness&lt;/a&gt;. It boils down to a choice: &lt;strong&gt;do you focus on on improving strengths or minimising weaknesses?&lt;/strong&gt; Conventional performance evaluations focus on the latter. I very strongly support Bregman’s view on this. &lt;strong&gt;The weakness isn’t why you hired the person!&lt;/strong&gt; Unless it’s killing the organisation, just leave them to focus on their strengths.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.google.com/analytics/&#34;&gt;Google Analytics&lt;/a&gt; has a fairly interesting &lt;a href=&#34;http://code.google.com/apis/analytics/docs/&#34;&gt;API&lt;/a&gt; that I hadn’t explored until recently. Picked up [Advanced Web Metrics with Google Analytics](&lt;a href=&#34;http://www.s-anand.net/amazon-browser.html#advanced&#34;&gt;http://www.s-anand.net/amazon-browser.html#advanced&lt;/a&gt; web metrics with google analytics) and learnt that you can track outbound clicks, page load times, Javascript events and error logs, almost anything at all using Google Analytics. You can also mirror the logging on your local server using pageTracker._setLocalRemoteServerMode()&lt;/li&gt;
&lt;li&gt;The whole concept of a Sandbox environment seems to be picking up within Google. There’s a &lt;a href=&#34;https://sandbox.google.com/checkout/&#34;&gt;Checkout sandbox&lt;/a&gt;, an &lt;a href=&#34;http://code.google.com/apis/ajax/playground/&#34;&gt;AJAX API playground&lt;/a&gt;, an &lt;a href=&#34;http://adwordsapi.blogspot.com/2009/05/adwords-api-on-app-engine-python.html&#34;&gt;AdWords sandbox&lt;/a&gt;, an &lt;a href=&#34;http://code.google.com/apis/adsense/developer/adsense_api_sandbox.html&#34;&gt;AdSense API sandbox&lt;/a&gt;, the &lt;a href=&#34;http://mapstraction.appspot.com/&#34;&gt;Mapstraction API sandbox&lt;/a&gt;, even an event called &lt;a href=&#34;http://code.google.com/events/io/sandbox.html&#34;&gt;Developer Sandbox&lt;/a&gt;. (After saying Sandbox 6 times, I feel a bit like Hobbes.)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;http://picayune.uclick.com/comics/ch/1992/ch920623.gif&#34;&gt;&lt;/p&gt;
</description>
    </item>
    <item>
      <title>WordPress themes on Live Writer</title>
      <link>https://www.s-anand.net/blog/wordpress-themes-on-windows-live-writer/</link>
      <pubDate>Sun, 08 Mar 2009 01:27:20 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/wordpress-themes-on-windows-live-writer/</guid>
      <description>&lt;p&gt;One of the reasons I moved to WordPress was the ability to write posts offline, for which I use &lt;a href=&#34;http://download.live.com/writer&#34;&gt;Windows Live Writer&lt;/a&gt; most of the time. The beauty of this is that I can preview the post &lt;strong&gt;exactly&lt;/strong&gt; as it will appear on my site. Nothing else that I know is as &lt;a href=&#34;http://en.wikipedia.org/wiki/WYSIWYG&#34;&gt;WYSIWYG&lt;/a&gt;, and it’s very useful to be able to type knowing exactly where each word will be.&lt;/p&gt;
&lt;p&gt;The only hitch is: if you write your own &lt;a href=&#34;http://wordpress.org/extend/themes/&#34;&gt;WordPress theme&lt;/a&gt;, Live Writer probably won’t be able to detect your theme — unless you’re an expert theme writer.&lt;/p&gt;
&lt;p&gt;I hunted on Google to see how to get my theme to work with Live Writer. I didn’t find any tutorials. So after a bit of hit-and-miss, I’m sharing a quick primer of what worked for me. If you don&amp;rsquo;t want to go through the hassle, you can always call on professionals who are adept at services like &lt;a href=&#34;https://www.littlebluedeerdesign.com/&#34;&gt;professional custom website design&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Open any post on your blog (using your new theme) and save that as &lt;code&gt;view.html&lt;/code&gt; in your theme folder. Now replace the page’s title with {post-title} and the page’s content with {post-body}. For example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;h1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;{post-title}&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;h1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;{post-body}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is the file Live Writer will be &lt;a href=&#34;http://msdn.microsoft.com/en-us/library/bb463261.aspx&#34;&gt;using as its theme&lt;/a&gt;. This page will be displayed exactly as it is by Live Writer, with {post-title} and {post-body} replaced with what you type. You can put in anything you want in this page — but at least make sure you include your CSS files.&lt;/p&gt;
&lt;p&gt;To let Live Writer know that &lt;code&gt;view.html&lt;/code&gt; is what it should display, copy WordPress’ &lt;code&gt;/wp-includes/wlw-manifest.xml&lt;/code&gt; to your theme folder and add the following lines just before &lt;code&gt;&amp;lt;/manifest&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;WebLayout
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;http://msdn.microsoft.com/en-us/library/bb463263.aspx&#34;&gt;Live Writer searches for wlmanifest.xml&lt;/a&gt; in the &lt;code&gt;&amp;lt;link rel=&amp;quot;wlmanifest&amp;quot;&amp;gt;&lt;/code&gt; tag of your home page. Since WordPress already links to its default &lt;code&gt;wlwmanifest.xml&lt;/code&gt;, we need remove that link and add our own. So add the following code to your &lt;code&gt;functions.php&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;my_wlwmanifest_link&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;echo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;remove_action&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;wp_head&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;wlwmanifest_link&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;add_action&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;wp_head&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;my_wlwmanifest_link&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That’s it. Now if you add your blog to Live Writer, it will automatically detect the theme.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;comments&#34;&gt;Comments&lt;/h2&gt;
&lt;!-- wp-comments-start --&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;http://yuntian.name/?p=228&#34;&gt;Windows Live Writer 向 DEDECMS 发文章 | 快乐生活，快乐工作&lt;/a&gt;&lt;/strong&gt; &lt;em&gt;30 Apr 2009 8:39 am&lt;/em&gt; &lt;em&gt;(pingback)&lt;/em&gt;:
[&amp;hellip;] WordPress themes on Live Writer [&amp;hellip;]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;http://www.websitesare.us&#34;&gt;San Diego Web Design&lt;/a&gt;&lt;/strong&gt; &lt;em&gt;22 Jun 2009 9:04 pm&lt;/em&gt;:
Note to my first post as it doesn&amp;rsquo;t show correctly:
What I did is I ended up adding the part between the tags to the regular wlwmanifest.xlm file.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;http://goodinformation&#34;&gt;vivek&lt;/a&gt;&lt;/strong&gt; &lt;em&gt;15 Jun 2009 6:23 am&lt;/em&gt;:
Hi,
Thanks great information&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;http://www.websitesare.us&#34;&gt;San Diego Web Design&lt;/a&gt;&lt;/strong&gt; &lt;em&gt;22 Jun 2009 9:02 pm&lt;/em&gt;:
Thank you, thank you, thank you! I was trying for hours to fix this before I found your post! Actually, the way you described it didn&amp;rsquo;t exactly work for me (I guess I did something wrong with the paths), but I ended up just adding the
WebLayout
with the absolute path to the regular wlwmanifest.xlm inside the includes folder and now it works!
Thanks again, your post was the only one describing this problem and helping me fix it!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;shawn&lt;/strong&gt; &lt;em&gt;29 Jan 2010 7:37 pm&lt;/em&gt;:
I was having this issue today and came across this page. I came up with a very simple fix that requires no coding.
When setting up your blog in WLW, go to your admin settings in the wordpress dashboard and temporarily set your &amp;ldquo;Reading&amp;rdquo; settings to &amp;ldquo;Front page displays -&amp;gt; Your latest posts &amp;ldquo;. WLW will successfully download the theme, then set your Front page displays back to your custom setting.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;http://www.zimmi.cz&#34;&gt;zimmi&lt;/a&gt;&lt;/strong&gt; &lt;em&gt;27 Jan 2010 7:53 pm&lt;/em&gt;:
What if it still doesn&amp;rsquo;t work? Anything else I can try?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;S&lt;/strong&gt; &lt;em&gt;15 Jul 2010 5:45 pm&lt;/em&gt;:
Thank you so much!!!!!!!!!! this worked.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;http://www.girls-information.com&#34;&gt;girls information&lt;/a&gt;&lt;/strong&gt; &lt;em&gt;27 Sep 2010 7:19 am&lt;/em&gt;:
this worked for me tanks for sharing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;http://www.eyes2design.com/flogging-and-blogging/graphene-child-themes-and-live-writer&#34;&gt;Graphene, Child Themes, and Live Writer - Eyes2Design&lt;/a&gt;&lt;/strong&gt; &lt;em&gt;28 Jul 2012 4:57 am&lt;/em&gt; &lt;em&gt;(pingback)&lt;/em&gt;:
[&amp;hellip;] came across this page by &lt;a href=&#34;https://www.s-anand.net&#34;&gt;www.s-anand.net&lt;/a&gt; which helped me a lot in understanding how Live Writer and WordPress get along together. So follow [&amp;hellip;]&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- wp-comments-end --&gt;
</description>
    </item>
    <item>
      <title>Caching pages on Apache</title>
      <link>https://www.s-anand.net/blog/caching-pages-on-apache/</link>
      <pubDate>Thu, 14 Aug 2008 12:00:00 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/caching-pages-on-apache/</guid>
      <description>&lt;p&gt;I don&amp;rsquo;t use any &lt;a href=&#34;http://en.wikipedia.org/wiki/Blog_hosting_service&#34;&gt;blogging software&lt;/a&gt; for my site. I just hand-wired it some years ago. When doing this, one of the &lt;strong&gt;biggest problems was &lt;a href=&#34;http://en.wikipedia.org/wiki/Caching&#34;&gt;caching&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Consider each blog entry page. Each page has the same template, but different content. Both the template and content could be changed. So ideally, blog pages should be served dynamically. That is, every time someone requests the page, I should look up the content, look up the template, and put them together.&lt;/p&gt;
&lt;p&gt;I did that, and within a few days outgrew my &lt;a href=&#34;http://www.hostgator.com/&#34;&gt;hosting service&lt;/a&gt;&amp;rsquo;s CPU usage limit. Running such a program for every page hit is too heavy on the CPU.&lt;/p&gt;
&lt;p&gt;One way around this is to create the pages beforehand and serve it as regular HTML. But every time the template changes, you need to re-generate every single page. I had over 2,500 pages. That would kill the CPU usage if I changed the template often.&lt;/p&gt;
&lt;p&gt;At that point, I did a piece of analysis. &lt;strong&gt;Do I really need to regenerate all 2000 blog entries?&lt;/strong&gt; Wouldn&amp;rsquo;t the &lt;a href=&#34;http://en.wikipedia.org/wiki/80-20_rule&#34;&gt;80-20 rule&lt;/a&gt; apply? The Apache log confirmed that 20% of the URLs were accounting for 76% of the hits. So I&amp;rsquo;d be wasting my time regenerating all the pages every time I changed the template.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.s-anand.net/blog/assets/flickr-hits-per-page_2761682983_o-png.webp&#34; title=&#34;Cumulative Hits Per Page&#34;&gt;&lt;img alt=&#34;Graph: 20% of URLs account for 76% of hits&#34; loading=&#34;lazy&#34; src=&#34;https://www.s-anand.net/blog/assets/flickr-hits-per-page_2761682983_o-png.webp&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So based on this, I decided to dynamically cache the pages. When a page is requested for the first time, I create the page and save it in a cache. The next time, I&amp;rsquo;d just serve it from the cache. If the template changes, I just need to delete the cache. This way, I only generate pages that are requested, and they&amp;rsquo;re only generated once.&lt;/p&gt;
&lt;p&gt;OK, so that&amp;rsquo;s the background. Now let me get to how I did it.&lt;/p&gt;
&lt;p&gt;I wrote a Perl script, &lt;code&gt;blog.pl&lt;/code&gt;, that would generate a page in the &lt;code&gt;html&lt;/code&gt; folder whenever it is called. Next, I changed &lt;a href=&#34;http://httpd.apache.org/&#34;&gt;Apache&lt;/a&gt;&amp;rsquo;s &lt;a href=&#34;http://httpd.apache.org/docs/2.0/howto/htaccess.html&#34;&gt;.htaccess&lt;/a&gt; to run this program &lt;strong&gt;only&lt;/strong&gt; if the page did not exist in the &lt;code&gt;html&lt;/code&gt; folder.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Redirect to cache first&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;RewriteCond %&lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;REQUEST_FILENAME&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt; !-f
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;RewriteRule ^&lt;span class=&#34;o&#34;&gt;([&lt;/span&gt;^/&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;*&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\.&lt;/span&gt;html$       html/&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;.html
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# If not found, run program to create page&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;RewriteCond %&lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;REQUEST_FILENAME&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt; !-f
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;RewriteRule ^html/&lt;span class=&#34;o&#34;&gt;([&lt;/span&gt;^/&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;*&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\.&lt;/span&gt;html$  blog.pl?t&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The first block redirects Apache to the cache. The second block checks if the file exists in the cache. If it doesn&amp;rsquo;t, the Apache redirects to the program. The program creates the page in the cache and displays it. Thereafter, Apache will just serve the file from the cache.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;This Apache trick can be used in another way. I keep files organised in different folders to simplify my work. But to visitors of this site, that organisation is irrelevant. So I effectively merge these folders into one. For example, I have a folder called &lt;a href=&#34;https://www.s-anand.net/blog/a/&#34;&gt;a&lt;/a&gt; in which I keep my static content. I also have this piece of code:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-apacheconf&#34; data-lang=&#34;apacheconf&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;RewriteCond&lt;/span&gt; %{REQUEST_FILENAME} !-f
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;RewriteRule&lt;/span&gt; ^([^/]+)$   a/$1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If any file is not found in the main folder, just check in the &lt;code&gt;a/&lt;/code&gt; folder. So I can access the file &lt;a href=&#34;https://www.s-anand.net/blog/assets/hindholam.midi&#34;&gt;/a/hindholam.midi&lt;/a&gt; as &amp;lt;/hindholam.midi&amp;gt; as well.&lt;/p&gt;
&lt;p&gt;This can be extended to a series of folders: either as a cascade of caches, or to merge many folders into one.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;comments&#34;&gt;Comments&lt;/h2&gt;
&lt;!-- wp-comments-start --&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Kannan Ekanath&lt;/strong&gt; &lt;em&gt;17 Aug 2008 7:00 am&lt;/em&gt;:
[http://random-thoughts-and-rambling.blogspot.com/]&lt;/p&gt;
&lt;p&gt;Hi,
I wanted to know a comparison/contrast how setting up blog etc in your own hosted space compares with things like &lt;a href=&#34;http://sites.google.com&#34;&gt;http://sites.google.com&lt;/a&gt;. I have always postponed this buying of a domain in favour of things like sites.google.com. Obviously I understand that the advantages would be you can control the LAF, the content, the organisation etc. But have you got a comparison doc or something on what precisely one would get if he hosts things in his own domain instead of a google/yahoo powered wiki style page?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;S Anand&lt;/strong&gt; &lt;em&gt;17 Aug 2008 1:31 pm&lt;/em&gt;:
@Kannan: Don&amp;rsquo;t have anything offhand, Kannan. But buying a domain would make sense anyway &amp;ndash; you could point your domain to sites.google.com transparently. If you wanted to build your own blogging system for your site, though, I&amp;rsquo;d advise against it. I did it because I started in 1999 and there weren&amp;rsquo;t many blogging systems then. Today, it just doesn&amp;rsquo;t make sense.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Nirupam&lt;/strong&gt; &lt;em&gt;18 Aug 2008 7:43 am&lt;/em&gt;:
Hi
Want to create a site for myself. Should I go for own hosted space or should I start using sites like Geosites etc. I want to deploy web-based applications in my site. Can you please advise?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;S Anand&lt;/strong&gt; &lt;em&gt;19 Aug 2008 11:24 am&lt;/em&gt;:
@Nirupam: If you want to deploy your own applications, you should probably create your own site. Get a free hosting service to start with. I&amp;rsquo;ve used 110mb.com, freestarthost.com and awardspace.com, and found them to be OK.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- wp-comments-end --&gt;
</description>
    </item>
    <item>
      <title>Google web authoring statistics</title>
      <link>https://www.s-anand.net/blog/google-web-authoring-statistics/</link>
      <pubDate>Wed, 25 Jan 2006 12:00:00 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/google-web-authoring-statistics/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://code.google.com/webstats/index.html&#34;&gt;Google web authoring statistics&lt;/a&gt;. An analysis of over a billion pages to see how people use HTML markup.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Speed up your pages</title>
      <link>https://www.s-anand.net/blog/speed-up-your-pages/</link>
      <pubDate>Tue, 03 Jan 2006 12:00:00 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/speed-up-your-pages/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://bravenewword.typepad.com/brave_new_word/2005/11/web_developers_.html&#34;&gt;Speed up your pages&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>10 places you must use Ajax</title>
      <link>https://www.s-anand.net/blog/10-places-you-must-use-ajax/</link>
      <pubDate>Sun, 04 Dec 2005 12:00:00 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/10-places-you-must-use-ajax/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.sourcelabs.com/blogs/ajb/2005/12/10_places_you_must_use_ajax.html&#34;&gt;10 places you must use Ajax&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Google Adsense</title>
      <link>https://www.s-anand.net/blog/google-adsense/</link>
      <pubDate>Wed, 28 Sep 2005 12:00:00 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/google-adsense/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve put in &lt;a href=&#34;https://www.google.com/adsense/&#34;&gt;Google Adsense&lt;/a&gt; on my page. But the results are ridiculously irrelevant!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;comments&#34;&gt;Comments&lt;/h2&gt;
&lt;!-- wp-comments-start --&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Raghuraman&lt;/strong&gt; &lt;em&gt;9 Sep 2008 9:15 am&lt;/em&gt;:
google adsense work in expliand in tamil language, For an approval of adsense and how to publish my website to the visitors for click programe and get earn by this work. Thanking you&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- wp-comments-end --&gt;
</description>
    </item>
  </channel>
</rss>
