<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Links on QuickRef - Personal Developer Reference</title><link>http://qref.eknath.dev/categories/links/</link><description>Recent content in Links on QuickRef - Personal Developer Reference</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Mon, 01 Jan 2024 00:00:00 +0000</lastBuildDate><atom:link href="http://qref.eknath.dev/categories/links/index.xml" rel="self" type="application/rss+xml"/><item><title>Android Development</title><link>http://qref.eknath.dev/links/android/</link><pubDate>Mon, 01 Jan 2024 00:00:00 +0000</pubDate><guid>http://qref.eknath.dev/links/android/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>Essential Android development resources, APIs, and tools for quick reference during development.&lt;/p>
&lt;h2 id="quick-links">Quick Links&lt;/h2>
&lt;h3 id="documentation">Documentation&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Android Developer Docs&lt;/strong>: &lt;a href="https://developer.android.com">Official Documentation&lt;/a>&lt;/li>
&lt;li>&lt;strong>API Reference&lt;/strong>: &lt;a href="https://developer.android.com/reference">Android API&lt;/a>&lt;/li>
&lt;li>&lt;strong>Material Design&lt;/strong>: &lt;a href="https://material.io/design">Design Guidelines&lt;/a>&lt;/li>
&lt;li>&lt;strong>Jetpack Compose&lt;/strong>: &lt;a href="https://developer.android.com/jetpack/compose">Modern UI Toolkit&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="phone-number-hinting-api">Phone Number Hinting API&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Phone Hint API&lt;/strong>: &lt;a href="https://developers.google.com/identity/sms-retriever/phone-number-hint">Auto-fill phone numbers&lt;/a>&lt;/li>
&lt;li>&lt;strong>SMS Retriever&lt;/strong>: &lt;a href="https://developers.google.com/identity/sms-retriever">Automatic SMS verification&lt;/a>&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;">&lt;code class="language-kotlin" data-lang="kotlin">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8b949e;font-style:italic">// Phone Number Hint API example
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8b949e;font-style:italic">&lt;/span>&lt;span style="color:#ff7b72">private&lt;/span> &lt;span style="color:#ff7b72">fun&lt;/span> &lt;span style="color:#d2a8ff;font-weight:bold">requestHint&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">val&lt;/span> &lt;span style="color:#79c0ff">hintRequest&lt;/span> = &lt;span style="color:#f0883e;font-weight:bold">HintRequest&lt;/span>.Builder()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .setPhoneNumberIdentifierSupported(&lt;span style="color:#ff7b72">true&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .build()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">val&lt;/span> &lt;span style="color:#79c0ff">intent&lt;/span> = &lt;span style="color:#f0883e;font-weight:bold">Credentials&lt;/span>.getClient(&lt;span style="color:#ff7b72">this&lt;/span>).getHintPickerIntent(hintRequest)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> startIntentSenderForResult(intent.intentSender, RESOLVE_HINT, &lt;span style="color:#ff7b72">null&lt;/span>, &lt;span style="color:#a5d6ff">0&lt;/span>, &lt;span style="color:#a5d6ff">0&lt;/span>, &lt;span style="color:#a5d6ff">0&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="essential-apis--services">Essential APIs &amp;amp; Services&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Firebase&lt;/strong>: &lt;a href="https://firebase.google.com/docs/android/setup">Backend services&lt;/a>&lt;/li>
&lt;li>&lt;strong>Google Play Services&lt;/strong>: &lt;a href="https://developers.google.com/android/guides/overview">Core APIs&lt;/a>&lt;/li>
&lt;li>&lt;strong>Biometric API&lt;/strong>: &lt;a href="https://developer.android.com/training/sign-in/biometric-auth">Fingerprint/Face auth&lt;/a>&lt;/li>
&lt;li>&lt;strong>Camera2 API&lt;/strong>: &lt;a href="https://developer.android.com/training/camera2">Camera controls&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="code-snippets">Code Snippets&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;">&lt;code class="language-kotlin" data-lang="kotlin">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8b949e;font-style:italic">// Biometric Authentication
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8b949e;font-style:italic">&lt;/span>&lt;span style="color:#ff7b72">private&lt;/span> &lt;span style="color:#ff7b72">fun&lt;/span> &lt;span style="color:#d2a8ff;font-weight:bold">showBiometricPrompt&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">val&lt;/span> &lt;span style="color:#79c0ff">biometricPrompt&lt;/span> = BiometricPrompt(&lt;span style="color:#ff7b72">this&lt;/span>, &lt;span style="color:#f0883e;font-weight:bold">ContextCompat&lt;/span>.getMainExecutor(&lt;span style="color:#ff7b72">this&lt;/span>),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">object&lt;/span> &lt;span style="color:#f85149">: &lt;/span>&lt;span style="color:#f0883e;font-weight:bold">BiometricPrompt&lt;/span>.AuthenticationCallback() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">override&lt;/span> &lt;span style="color:#ff7b72">fun&lt;/span> &lt;span style="color:#d2a8ff;font-weight:bold">onAuthenticationSucceeded&lt;/span>(result: &lt;span style="color:#f0883e;font-weight:bold">BiometricPrompt&lt;/span>.AuthenticationResult) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">super&lt;/span>.onAuthenticationSucceeded(result)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8b949e;font-style:italic">// Authentication succeeded
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8b949e;font-style:italic">&lt;/span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> })
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">val&lt;/span> &lt;span style="color:#79c0ff">promptInfo&lt;/span> = &lt;span style="color:#f0883e;font-weight:bold">BiometricPrompt&lt;/span>.&lt;span style="color:#f0883e;font-weight:bold">PromptInfo&lt;/span>.Builder()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .setTitle(&lt;span style="color:#a5d6ff">&amp;#34;Biometric Authentication&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .setSubtitle(&lt;span style="color:#a5d6ff">&amp;#34;Log in using your biometric credential&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .setNegativeButtonText(&lt;span style="color:#a5d6ff">&amp;#34;Cancel&amp;#34;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .build()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> biometricPrompt.authenticate(promptInfo)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;">&lt;code class="language-kotlin" data-lang="kotlin">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8b949e;font-style:italic">// Permission Request (Modern approach)
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8b949e;font-style:italic">&lt;/span>&lt;span style="color:#ff7b72">private&lt;/span> &lt;span style="color:#ff7b72">val&lt;/span> &lt;span style="color:#79c0ff">requestPermissionLauncher&lt;/span> = registerForActivityResult(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f0883e;font-weight:bold">ActivityResultContracts&lt;/span>.RequestPermission()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>) { isGranted: Boolean &lt;span style="color:#ff7b72;font-weight:bold">-&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">if&lt;/span> (isGranted) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8b949e;font-style:italic">// Permission granted
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8b949e;font-style:italic">&lt;/span> } &lt;span style="color:#ff7b72">else&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#8b949e;font-style:italic">// Permission denied
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8b949e;font-style:italic">&lt;/span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8b949e;font-style:italic">// Usage
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8b949e;font-style:italic">&lt;/span>requestPermissionLauncher.launch(&lt;span style="color:#f0883e;font-weight:bold">Manifest&lt;/span>.permission.CAMERA)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="tools--resources">Tools &amp;amp; Resources&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Android Studio&lt;/strong>: &lt;a href="https://developer.android.com/studio">IDE Download&lt;/a>&lt;/li>
&lt;li>&lt;strong>ADB Commands&lt;/strong>: &lt;a href="https://developer.android.com/studio/command-line/adb">Debug Bridge&lt;/a>&lt;/li>
&lt;li>&lt;strong>Gradle Plugin&lt;/strong>: &lt;a href="https://developer.android.com/studio/build">Build system&lt;/a>&lt;/li>
&lt;li>&lt;strong>ProGuard/R8&lt;/strong>: &lt;a href="https://developer.android.com/studio/build/shrink-code">Code shrinking&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="key-points">Key Points&lt;/h2>
&lt;ul>
&lt;li>Use Jetpack Compose for modern UI development&lt;/li>
&lt;li>Implement proper permission handling for API 23+&lt;/li>
&lt;li>Follow Material Design guidelines&lt;/li>
&lt;li>Use ViewBinding/DataBinding for view references&lt;/li>
&lt;li>Implement proper lifecycle management&lt;/li>
&lt;/ul>
&lt;h2 id="see-also">See Also&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="http://qref.eknath.dev/programming/kotlin">Kotlin Programming&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://qref.eknath.dev/tools/adb">ADB Tools&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Web Development</title><link>http://qref.eknath.dev/links/web-development/</link><pubDate>Mon, 01 Jan 2024 00:00:00 +0000</pubDate><guid>http://qref.eknath.dev/links/web-development/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>Essential web development resources, frameworks, and tools for modern web development.&lt;/p>
&lt;h2 id="quick-links">Quick Links&lt;/h2>
&lt;h3 id="documentation">Documentation&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>MDN Web Docs&lt;/strong>: &lt;a href="https://developer.mozilla.org">Mozilla Developer Network&lt;/a>&lt;/li>
&lt;li>&lt;strong>Can I Use&lt;/strong>: &lt;a href="https://caniuse.com">Browser compatibility&lt;/a>&lt;/li>
&lt;li>&lt;strong>W3C Standards&lt;/strong>: &lt;a href="https://www.w3.org/standards/">Web standards&lt;/a>&lt;/li>
&lt;li>&lt;strong>Web.dev&lt;/strong>: &lt;a href="https://web.dev">Google web guidance&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="frontend-frameworks">Frontend Frameworks&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>React&lt;/strong>: &lt;a href="https://react.dev">Component library&lt;/a>&lt;/li>
&lt;li>&lt;strong>Vue.js&lt;/strong>: &lt;a href="https://vuejs.org">Progressive framework&lt;/a>&lt;/li>
&lt;li>&lt;strong>Angular&lt;/strong>: &lt;a href="https://angular.io">Full framework&lt;/a>&lt;/li>
&lt;li>&lt;strong>Svelte&lt;/strong>: &lt;a href="https://svelte.dev">Compile-time framework&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="css-resources">CSS Resources&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Tailwind CSS&lt;/strong>: &lt;a href="https://tailwindcss.com">Utility-first CSS&lt;/a>&lt;/li>
&lt;li>&lt;strong>CSS Grid&lt;/strong>: &lt;a href="https://css-tricks.com/snippets/css/complete-guide-grid/">Layout system&lt;/a>&lt;/li>
&lt;li>&lt;strong>Flexbox&lt;/strong>: &lt;a href="https://css-tricks.com/snippets/css/a-guide-to-flexbox/">Flexible layouts&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="code-snippets">Code Snippets&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;">&lt;code class="language-javascript" data-lang="javascript">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8b949e;font-style:italic">// Modern fetch with async/await
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8b949e;font-style:italic">&lt;/span>&lt;span style="color:#ff7b72">async&lt;/span> &lt;span style="color:#ff7b72">function&lt;/span> fetchData(url) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">try&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">const&lt;/span> response &lt;span style="color:#ff7b72;font-weight:bold">=&lt;/span> &lt;span style="color:#ff7b72">await&lt;/span> fetch(url);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">if&lt;/span> (&lt;span style="color:#ff7b72;font-weight:bold">!&lt;/span>response.ok) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">throw&lt;/span> &lt;span style="color:#ff7b72">new&lt;/span> Error(&lt;span style="color:#a5d6ff">`HTTP error! status: &lt;/span>&lt;span style="color:#a5d6ff">${&lt;/span>response.status&lt;span style="color:#a5d6ff">}&lt;/span>&lt;span style="color:#a5d6ff">`&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">const&lt;/span> data &lt;span style="color:#ff7b72;font-weight:bold">=&lt;/span> &lt;span style="color:#ff7b72">await&lt;/span> response.json();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">return&lt;/span> data;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> } &lt;span style="color:#ff7b72">catch&lt;/span> (error) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> console.error(&lt;span style="color:#a5d6ff">&amp;#39;Fetch error:&amp;#39;&lt;/span>, error);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">throw&lt;/span> error;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:2;-o-tab-size:2;tab-size:2;">&lt;code class="language-css" data-lang="css">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8b949e;font-style:italic">/* Modern CSS Grid Layout */&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>.&lt;span style="color:#f0883e;font-weight:bold">grid-container&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">display&lt;/span>: &lt;span style="color:#ff7b72">grid&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">grid-template-columns&lt;/span>: &lt;span style="color:#d2a8ff;font-weight:bold">repeat&lt;/span>(&lt;span style="color:#79c0ff">auto&lt;/span>&lt;span style="color:#ff7b72;font-weight:bold">-&lt;/span>fit, &lt;span style="color:#d2a8ff;font-weight:bold">minmax&lt;/span>(&lt;span style="color:#a5d6ff">300&lt;/span>&lt;span style="color:#ff7b72">px&lt;/span>, &lt;span style="color:#a5d6ff">1&lt;/span>fr));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">gap&lt;/span>: &lt;span style="color:#a5d6ff">1&lt;/span>&lt;span style="color:#ff7b72">rem&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">padding&lt;/span>: &lt;span style="color:#a5d6ff">1&lt;/span>&lt;span style="color:#ff7b72">rem&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8b949e;font-style:italic">/* Responsive design with container queries */&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>@&lt;span style="color:#ff7b72">container&lt;/span> &lt;span style="color:#ff7b72;font-weight:bold">(&lt;/span>&lt;span style="color:#7ee787">min-width&lt;/span>&lt;span style="color:#ff7b72;font-weight:bold">:&lt;/span> &lt;span style="color:#7ee787">400px&lt;/span>&lt;span style="color:#ff7b72;font-weight:bold">)&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#f0883e;font-weight:bold">card&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">display&lt;/span>: &lt;span style="color:#79c0ff">flex&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ff7b72">flex-direction&lt;/span>: &lt;span style="color:#79c0ff">row&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="tools--resources">Tools &amp;amp; Resources&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Vite&lt;/strong>: &lt;a href="https://vitejs.dev">Fast build tool&lt;/a>&lt;/li>
&lt;li>&lt;strong>Webpack&lt;/strong>: &lt;a href="https://webpack.js.org">Module bundler&lt;/a>&lt;/li>
&lt;li>&lt;strong>ESLint&lt;/strong>: &lt;a href="https://eslint.org">Code linting&lt;/a>&lt;/li>
&lt;li>&lt;strong>Prettier&lt;/strong>: &lt;a href="https://prettier.io">Code formatting&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="key-points">Key Points&lt;/h2>
&lt;ul>
&lt;li>Use semantic HTML for accessibility&lt;/li>
&lt;li>Implement responsive design with mobile-first approach&lt;/li>
&lt;li>Optimize for Core Web Vitals&lt;/li>
&lt;li>Use modern JavaScript features (ES6+)&lt;/li>
&lt;li>Follow progressive enhancement principles&lt;/li>
&lt;/ul>
&lt;h2 id="see-also">See Also&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="http://qref.eknath.dev/programming/javascript">JavaScript Programming&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://qref.eknath.dev/tools/css">CSS Tools&lt;/a>&lt;/li>
&lt;/ul></description></item></channel></rss>