<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: jswalker.in</title>
    <description>The latest articles on DEV Community by jswalker.in (@jswalker_in).</description>
    <link>https://dev.to/jswalker_in</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F395169%2F0c984849-f771-4093-b500-d8583f306916.png</url>
      <title>DEV Community: jswalker.in</title>
      <link>https://dev.to/jswalker_in</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jswalker_in"/>
    <language>en</language>
    <item>
      <title>BlackJack - Beta version</title>
      <dc:creator>jswalker.in</dc:creator>
      <pubDate>Mon, 29 Jan 2024 05:11:41 +0000</pubDate>
      <link>https://dev.to/jswalker_in/blackjack-beta-version-43c</link>
      <guid>https://dev.to/jswalker_in/blackjack-beta-version-43c</guid>
      <description>&lt;p&gt;🚀  Free Beta Release of My Blackjack Game (Windows Version)! 🎲&lt;/p&gt;

&lt;p&gt;itch store : (Executable) [&lt;a href="https://bit.ly/blackjack-itch-io"&gt;https://bit.ly/blackjack-itch-io&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;Gitlab : (Executable) [&lt;a href="https://bit.ly/black-zip"&gt;https://bit.ly/black-zip&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;Hola! Dev.to family,&lt;/p&gt;

&lt;p&gt;I hope this post finds you all well! I'm thrilled to share a significant milestone in my journey as a developer. After the successful development of my multiplayer game "You-Better-Run," I've been passionately working on a new project during my spare time - a classic and exciting Blackjack game!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🃏 About the Game:&lt;/strong&gt;&lt;br&gt;
This Blackjack game is the result of dedication, late-night coding sessions, and a genuine love for creating engaging experiences. It's a project close to my heart, and I'm excited to bring this to the community for a free beta release.&lt;br&gt;
The game features a combo of four card games to beat boredom after long workdays or to boost entertainment levels when feeling exhausted.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Game includes:
    1.Blackjack
    2.Three-Card Brag
    3.Tough Luck
    4.EO : Guess the card is even or odd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcivqpwulwmyi0ad1kn6q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcivqpwulwmyi0ad1kn6q.png" alt="Blackjack screen" width="348" height="718"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can collect coins even after losing many games and running out of them. Use the free-wheel spin to keep playing the game for free indefinitely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🎉 Free Beta Version Now Available:&lt;/strong&gt;&lt;br&gt;
Today, I'm delighted to announce that the beta version of my Blackjack game is now available for free! 🆓 I would love for you to be a part of this journey and experience the game firsthand. Your feedback and suggestions will be invaluable in shaping the future-version.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔗 How to Access the Beta:&lt;/strong&gt;&lt;br&gt;
To try out the game, simply from itch.io(Executable) [&lt;a href="https://bit.ly/blackjack-itch-io"&gt;https://bit.ly/blackjack-itch-io&lt;/a&gt;] &amp;amp;&amp;amp;  Gitlab(Executable)[&lt;a href="https://bit.ly/black-zip"&gt;https://bit.ly/black-zip&lt;/a&gt;]. I appreciate your support and can't wait to hear your thoughts!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🙌 Let's Connect:&lt;/strong&gt;&lt;br&gt;
I'm always open to connecting with fellow developers, gamers, and anyone passionate about the tech and gaming industry. Feel free to connect, share your thoughts!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;👉 Stay Updated:&lt;/strong&gt;&lt;br&gt;
If you're interested in staying updated on the game's development or future projects,lets connect on various Platform.&lt;/p&gt;

&lt;p&gt;Linkedin : &lt;a href="http://www.linkedin.com/in/jayesh-sapkale-jswalker"&gt;www.linkedin.com/in/jayesh-sapkale-jswalker&lt;/a&gt;&lt;br&gt;
Twitter : &lt;a href="https://twitter.com/jswalker_in"&gt;https://twitter.com/jswalker_in&lt;/a&gt;&lt;br&gt;
Portfolio : &lt;a href="https://jswalker.in/its/jayesh"&gt;https://jswalker.in/its/jayesh&lt;/a&gt;&lt;/p&gt;

</description>
      <category>godotengine</category>
      <category>gamedev</category>
      <category>card</category>
    </item>
    <item>
      <title>PreFy : Personal Recommendation Engine For YouTube</title>
      <dc:creator>jswalker.in</dc:creator>
      <pubDate>Fri, 29 Jan 2021 05:31:55 +0000</pubDate>
      <link>https://dev.to/jswalker_in/prefy-personal-recommendation-engine-for-youtube-104k</link>
      <guid>https://dev.to/jswalker_in/prefy-personal-recommendation-engine-for-youtube-104k</guid>
      <description>&lt;p&gt;Latest hobby project of jswalker called &lt;strong&gt;Prefy&lt;/strong&gt;. A simple choice of own youtube video collection open for the people who might enjoy an unseen fun and elegant video list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project-Link : &lt;a href="https://jswalker.in/its/prefy"&gt;PreFY&lt;/a&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Video collection on fly
&lt;/h3&gt;

&lt;p&gt;To make the system more lightweight, I chose Netlify CDN over firebase CLoudstore because of firebase's relatively smaller amount of Read-query and Every query counts the individual Record consumption instead of query hitting counter which is not suitable for me and in other hand  Netlfy offers 100GB monthly bandwidth.In the Case of Prefy production nature Netlify suitable for such kind of project where: fewer KBs are used and cached and make room for more new users.&lt;/p&gt;

&lt;h3&gt;
  
  
  Role of IndexedDB
&lt;/h3&gt;

&lt;p&gt;To handle more user with less consumption of bandwidth(Netlify Bandwidth) the frequent and latest video collection also store in indexedDB which result in no redundant request on refresh.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[Bug Submit]&lt;/strong&gt;&lt;br&gt;
   DM on &lt;a href="https://twitter.com/jswalker_in"&gt;twitter&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>netlify</category>
      <category>javascript</category>
      <category>indexeddb</category>
    </item>
    <item>
      <title>Incoming : Web Walkie-Talkie</title>
      <dc:creator>jswalker.in</dc:creator>
      <pubDate>Mon, 13 Jul 2020 10:49:26 +0000</pubDate>
      <link>https://dev.to/jswalker_in/incoming-web-walkie-talkie-9fc</link>
      <guid>https://dev.to/jswalker_in/incoming-web-walkie-talkie-9fc</guid>
      <description>&lt;p&gt;The new creation of jswalker called &lt;strong&gt;Incoming&lt;/strong&gt;. An army style communication approach around the world acts like a Radio Transmission over the internet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Product-Link : &lt;a href="https://bit.ly/incoming-inbound"&gt;Incoming&lt;/a&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  [Rule]
&lt;/h2&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt; 1.Remember your codename : Your-Code-Name show in header
 2.Keep your language wise.Anyway its your choice to be gentle.
 3.Radio frequency allotted 5 seconds maximum hold
 4.Call each other by codename
 5.Give time to each user to speak comfortably
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  [Speaking code style]
&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt; 1.To start or check communication use : "Your-Code-Name" Inbound.  E.G. 'Bravo-2' Inbound 
 2.To end of each communication use : 'over'
 3.To ask/send to specific code-name use : Coming 'Opponent-Code-Name'. E.G. 'Coming Charlie'  
 4.To end talk use : "Your-Code-name" 'over and out' E.G. 'Bravo-2 Over and out'  
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;[Bug Submit]&lt;/strong&gt;&lt;br&gt;
   DM on &lt;a href="https://twitter.com/jswalker_in"&gt;twitter&lt;/a&gt; || &lt;a href="https://dev.to/jswalker_in"&gt;Dev.to&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webrtc</category>
      <category>showdev</category>
      <category>node</category>
    </item>
    <item>
      <title>Crypto Challenge</title>
      <dc:creator>jswalker.in</dc:creator>
      <pubDate>Wed, 01 Jul 2020 11:49:20 +0000</pubDate>
      <link>https://dev.to/jswalker_in/crypto-challenge-1i9i</link>
      <guid>https://dev.to/jswalker_in/crypto-challenge-1i9i</guid>
      <description>&lt;p&gt;This is a simple Crypto-challenge designed for the government to Introduce and crack classified project to fight cyber-war.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://bit.ly/crypto-first-challenge"&gt;First challenge&lt;/a&gt; &amp;amp;&amp;amp; &lt;a href="http://bit.ly/tiny-enigma"&gt;Tiny-Enigma&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can try and might break code by trial and error basis.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>crypto</category>
      <category>challenge</category>
    </item>
    <item>
      <title>Offbeat</title>
      <dc:creator>jswalker.in</dc:creator>
      <pubDate>Mon, 29 Jun 2020 13:47:54 +0000</pubDate>
      <link>https://dev.to/jswalker_in/offbeat-1of0</link>
      <guid>https://dev.to/jswalker_in/offbeat-1of0</guid>
      <description>&lt;p&gt;This is one of my products for the Indian crowd and a little bit for outside of India.But there are good quality  videos chosen from Youtube(Embedded).&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://bit.ly/00ffbeat"&gt;Project-Link&lt;/a&gt;
&lt;/h2&gt;

&lt;h4&gt;
  
  
  Status : Rarely update | Nearly dead | Project is old so, Some video(s) might be removed or unavailable
&lt;/h4&gt;

&lt;p&gt;Share your thought !!!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>showdev</category>
    </item>
    <item>
      <title>One domain - multiple service-worker up</title>
      <dc:creator>jswalker.in</dc:creator>
      <pubDate>Fri, 26 Jun 2020 05:48:09 +0000</pubDate>
      <link>https://dev.to/jswalker_in/one-domain-multiple-service-worker-3l4g</link>
      <guid>https://dev.to/jswalker_in/one-domain-multiple-service-worker-3l4g</guid>
      <description>&lt;h3&gt;
  
  
  What dilemma i faced?
&lt;/h3&gt;

&lt;p&gt;I usually keep working on multiple projects but with full attention on one project at a specific time(Week, Month). But for a minimal update, I usually follow the same procedure that keeps an offline app with a service worker.&lt;br&gt;
If you are a &lt;strong&gt;soloprenuer&lt;/strong&gt; and have a cash crunch at an early stage, you have to deal with multiple apps under one domain.&lt;/p&gt;

&lt;p&gt;like I am doing multiple apps(Total 10) with jswalker.in under /its/ tag and 7 with a subdomain.&lt;/p&gt;

&lt;p&gt;If you follow approach from this &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers#Deleting_old_caches"&gt;URL&lt;/a&gt;.You will get few gotchas in work-cycle.&lt;/p&gt;

&lt;h3&gt;
  
  
  Service worker activate event
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
var staticCacheName="appname_version_1";
self.addEventListener('activate', function(event) {
  var cacheWhitelist = [staticCacheName];

  event.waitUntil(
    caches.keys().then(function(keyList) {
      return Promise.all(keyList.map(function(key) {
        if (cacheWhitelist.indexOf(key) === -1) {
           console.log("Cache delete : "+key);
           return caches.delete(key);
        }

      }));

    })
  );

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Root Cause of problem
&lt;/h3&gt;

&lt;p&gt;If we use previous approach We will face no problem and no other cache version will be affected of sub domain's service worker.&lt;/p&gt;

&lt;p&gt;But if you use the same domain with dynamic URLs like: /its/amazing and its/sweeper as different Progressive web app.Previous service-worker strategy makes your Eco-System a little bit vulnerable at the offline stage.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It will clear every cache-list except current app-version.In that case if one of your app got update it will remove all caches(10 APP cache) it means /first-app,/second-app cache will also got removed.But service worker still not Unregister from browser so now network request of PWA not found in &lt;strong&gt;caches.keys()&lt;/strong&gt; and make request over Network not from Service-Worker.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  How to resolve?
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var staticCacheName='appname_version_2';
self.addEventListener('activate', function(event) {

  var static_cache_prefix = staticCacheName.substring(0,staticCacheName.indexOf("_"));

  event.waitUntil(
    caches.keys().then(function(keyList) {
      return Promise.all(keyList.map(function(key) {

        if (key.indexOf(static_cache_prefix) &amp;gt; -1 &amp;amp;&amp;amp; key!=staticCacheName) { 
           console.log("Cache delete : "+key);
           return caches.delete(key);
        }

      }));

    })
  );
});

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What you will achieve?
&lt;/h3&gt;

&lt;p&gt;The above strategy will check appname in cache list AKA &lt;strong&gt;caches.keys()&lt;/strong&gt;.Now it will only remove cache of specific app(separated by URL) with old version and all other related app cache will intact along with new version of updated PWA.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>pwa</category>
    </item>
    <item>
      <title>Ladies &amp;&amp; Gentlemen please welcome PeerCynk</title>
      <dc:creator>jswalker.in</dc:creator>
      <pubDate>Wed, 24 Jun 2020 23:05:09 +0000</pubDate>
      <link>https://dev.to/jswalker_in/ladies-gentlemen-please-welcome-peercynk-4b1b</link>
      <guid>https://dev.to/jswalker_in/ladies-gentlemen-please-welcome-peercynk-4b1b</guid>
      <description>&lt;p&gt;I am here to present my latest &lt;a href="https://bit.ly/peercynk"&gt;Platform&lt;/a&gt; built on peer-to-peer technology for a Web-Community to exchange a resource in a pure peer-to-peer fashion.&lt;br&gt;
Beta version has limited Access-token for Early-access users.&lt;/p&gt;

&lt;p&gt;Checkout Platform: &lt;a href="https://bit.ly/peercynk"&gt;Platform&lt;/a&gt; |  it is a PWA,so accessible both in mobile-web/Desktop-web&lt;/p&gt;

&lt;p&gt;Please do read White-paper : &lt;a href="https://bit.ly/peercynk-white-paper"&gt;White-Paper&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Keep patience with Early Access, It will grow and will become interesting once user-base grow and start contribute on the platform.&lt;/p&gt;

&lt;p&gt;So join and exchange information/resources if you have good intentions.&lt;/p&gt;

&lt;p&gt;Any query/Bug Report DM on dev.to &lt;a href="https://dev.to/jswalker_in"&gt;https://dev.to/jswalker_in&lt;/a&gt; ||  DM on twitter : &lt;a href="https://twitter.com/jswalker_in"&gt;https://twitter.com/jswalker_in&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you love WebRTC or Fan of Peer-To-Peer ideology this platform is for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Note:I have Teeny-Tiny server so please forgive me if server meltdown few time.In the meantime please do read &lt;a href="https://bit.ly/peercynk-white-paper"&gt;White-Paper&lt;/a&gt;
&lt;/h2&gt;

</description>
      <category>showdev</category>
      <category>webrtc</category>
      <category>javascript</category>
      <category>node</category>
    </item>
    <item>
      <title>I have seen three Hype-Cycle.</title>
      <dc:creator>jswalker.in</dc:creator>
      <pubDate>Sat, 20 Jun 2020 01:48:32 +0000</pubDate>
      <link>https://dev.to/jswalker_in/i-have-seen-three-hype-cycle-2c06</link>
      <guid>https://dev.to/jswalker_in/i-have-seen-three-hype-cycle-2c06</guid>
      <description>&lt;p&gt;I have seen/feel/sense three Hype-Cycle in my tech-life(2010-Present).&lt;br&gt;
These are the obvious ones and needn't require the name and also people get angry these days if you speak straight truth on their face so I haven't mentioned the names but you can do a bullseye in a comment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2013 B&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2015-16-17 M&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2019 B&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/glWAEi3tjFE"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;In My limited vision, I believe in &lt;strong&gt;LID&lt;/strong&gt; approach&lt;br&gt;
{Logic + Infrastructure + Data-Flow}&lt;/p&gt;

&lt;p&gt;Share your views?&lt;/p&gt;

</description>
      <category>healthydebate</category>
    </item>
    <item>
      <title>Turn your server into a Centralize-Git-Repository.</title>
      <dc:creator>jswalker.in</dc:creator>
      <pubDate>Thu, 18 Jun 2020 21:02:08 +0000</pubDate>
      <link>https://dev.to/jswalker_in/turn-your-server-into-a-centralize-git-repository-1p</link>
      <guid>https://dev.to/jswalker_in/turn-your-server-into-a-centralize-git-repository-1p</guid>
      <description>&lt;p&gt;GitHub is Great for Open Source projects,&lt;br&gt;
But i don't like GitHub and many other third-party code storage systems when it comes to building a Private-Product which is a highly closed-end system.&lt;/p&gt;

&lt;p&gt;I believe in "Your-Code-Your-Responsibility".&lt;/p&gt;

&lt;p&gt;Don't Transfer Your Responsibility to others or there will be greater consequences.&lt;/p&gt;

&lt;p&gt;If your organization is not involved in open-source development.GitHub is not for you, Private organization must follow own approach to build a product.&lt;/p&gt;

&lt;p&gt;Do it hard way to achieve best results,Setting own git server is piece of cake and secure too(If you want your product secure).&lt;/p&gt;

&lt;h3&gt;
  
  
  Generate key
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt; ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Obtain key from user and push into server
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Copy local id_rsa for windows (C:/USER/YOUR-USERNAME/.ssh/id_rsa.pub) 
For linux(/root/.ssh/id_ras.pub) 

INTO Remote server /root/.ssh/authorized_keys 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Create Directory to store your centralize git server
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir git-server
cd git-server
git init --bare
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Access this Repo at local client
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone root@ip-address:/git-server
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Additional Note:
&lt;/h3&gt;

&lt;p&gt;If you like to make git more secure keep development and production copy where development copy is accessible to everyone in your organization and production copy allow only via special-mechanism such as Custom platform build in browser where user sync development code into production after checks-and-balance.&lt;/p&gt;

&lt;p&gt;For my scenario (Single engineer)&lt;br&gt;
I do not use git at the local/server.Simply use own platform where development code pushes into production mode after stable development channel.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oaCe_vM4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/audd6xaybqk0ddz71r32.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oaCe_vM4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/audd6xaybqk0ddz71r32.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Moral Of the story
&lt;/h3&gt;

&lt;p&gt;IF I can do it as a single engineer, It's a teeny-tiny challenge for the Minimal Team of any organization.&lt;br&gt;
In Case you care about your product.&lt;/p&gt;

&lt;p&gt;EOF&lt;/p&gt;

</description>
      <category>git</category>
      <category>webdev</category>
      <category>linux</category>
    </item>
    <item>
      <title>How to Read IndexedDB data with order?</title>
      <dc:creator>jswalker.in</dc:creator>
      <pubDate>Tue, 16 Jun 2020 21:32:13 +0000</pubDate>
      <link>https://dev.to/jswalker_in/how-to-read-indexeddb-data-with-order-1gel</link>
      <guid>https://dev.to/jswalker_in/how-to-read-indexeddb-data-with-order-1gel</guid>
      <description>&lt;h3&gt;
  
  
  Create Index on timestamp?
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var version = 1;

// Access IndexedDB object everytime
function open_idb(obj,callback){
    var flag = 0;
    try {
        if (DBOpenRequest) {
            flag = 1;
        } else {
            flag = 0;
        }
    } catch (err) {
        flag = 0;
    }

    if (flag == 1) {

        //Use older DB object
        var db = DBOpenRequest.result;
        callback(db);
    } else {

        //Create New db object
        DBOpenRequest = indexedDB.open("test_db", version);
    }

    DBOpenRequest.onsuccess = function(event) {
        try {
            var db = DBOpenRequest.result;
            callback(db);
        } catch (err) {
            callback();
        }
    };

    //Set Index
    DBOpenRequest.onupgradeneeded = function(event) {

        var db = event.target.result;

        //This condition will always satisfy
        if(event.oldVersion&amp;lt;1){
          var object_store = db.createObjectStore('test',{keyPath: 'index'});
              object_store.createIndex("index", "index",{unique:false});
              object_store.createIndex("timestamp", "timestamp",{unique:false});
        }

        db.onerror = function(event) {
            console.log('Error loading database.');
        };
    };
};
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Executive Function
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function push_test_data(obj,callback){
    var index=obj.index;
    var arr=obj.arr;
    var len = arr.length;
    var db=obj.db;



    if(index&amp;lt;len){

        var transaction = db.transaction(['test'], 'readwrite');
        var object_store = transaction.objectStore('test');
        var entry = {index:arr[index].index,timestamp:arr[index].timestamp};

        var request = object_store.put(entry);
            request.onsuccess=function(){
              index=index+1;
              push_test_data({index:index,arr:arr,db:db},callback);
            };

            request.onerror=function(e){
             console.log("Error ");
             console.log(e);
            };      
    }else{
      callback();
    }
};


function order_by(o_){

        var type=o_.type;
        var key=o_.key;


        open_idb({},function(db){

            var transaction = db.transaction(['test'], 'readwrite');
            var object_store = transaction.objectStore('test');
            var request = object_store.index(key).openCursor(null,type);

            var result = [];
            request.onsuccess = function(event) {
                var cursor = event.target.result;
                //console.log(cursor);
                if(cursor){
                    result.push(cursor.value);
                    cursor.continue();
                }else{
                 console.log(":"+type+":");
                 console.log(result);
                }
            };

            request.onerror = function(e) {
              console.log(e);
            };

        });

}

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Initial Push Test Data
&lt;/h2&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;open_idb({},function(db){
    var arr=[{index:1,timestamp:Date.now()+1},{index:2,timestamp:Date.now()+2}];
    push_test_data({arr:arr,index:0,db:db},function(){

    });

});
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Ascending Order
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
open_idb({},function(db){
   order_by({key:"timestamp",type:"next"});  // For ascending order by timestamp
});
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Descending Order
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
open_idb({},function(db){
   order_by({key:"timestamp",type:"prev"});  // For descending order by timestamp
});
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



</description>
      <category>javascript</category>
      <category>indexeddb</category>
    </item>
    <item>
      <title>Node.js on port 80 in AWS</title>
      <dc:creator>jswalker.in</dc:creator>
      <pubDate>Sun, 14 Jun 2020 11:38:24 +0000</pubDate>
      <link>https://dev.to/jswalker_in/node-js-on-port-80-in-aws-59h0</link>
      <guid>https://dev.to/jswalker_in/node-js-on-port-80-in-aws-59h0</guid>
      <description>&lt;h3&gt;
  
  
  First step to AWS
&lt;/h3&gt;

&lt;p&gt;You'll get the fresh machine after register with AWS.&lt;br&gt;
But they provide a user that does not have the power of root. You can write root command with 'sudo su' but launching Node.js process on 80 port is difficult it always gives you The EACCESS Error. Because of Security reasons (For a Reason).&lt;/p&gt;

&lt;p&gt;But as a single/Minimal team, you have a handful and trusted people. So you can make that bet on to get access with root with few adjustments at root level.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;:Caution:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Take a backup of every file that you change mostly in /etc folder.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Install Node.js
&lt;/h3&gt;

&lt;p&gt;After installing node.js you'll notice that 80 port already occupied either from Nginx/Apache WebServer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Steps to configure Node.js on 80 port
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open ssh to ubuntu(AWS) with ssh key(Old one)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write command "sudo su" to gain sudo power&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write command "nano etc/ssh/sshd_config"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;look for PasswordAuthentication tag and change its value 'yes'&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Login to root and password (If this is first time set new password with passwd)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Generate new public and private key in putty generator and keep Public-key ssh-header locally.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--n9WItfT2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ccgi0c6e2j9iwhffau8z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--n9WItfT2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ccgi0c6e2j9iwhffau8z.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Paste (Public-Key:ssh-header) from PuttyGen to /root/.ssh/authorized_keys&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Keep Private and Public key safe for login via public-key from "ssh-client" such as putty : &lt;br&gt;
{Username:root,Method:Public-key} Add/Import your openSSH private key to your SSH-Client's Client-Key-Manager.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--j60_nPJ4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/yomjtmqsn4viuv1uhzwd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--j60_nPJ4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/yomjtmqsn4viuv1uhzwd.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;sudo service sshd restart&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Login with ssh now&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--n3bTPzNh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/terulzuy3vbq0lnr4w2w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--n3bTPzNh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/terulzuy3vbq0lnr4w2w.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You may disable the password login and only allow ssh key again. By setting &lt;strong&gt;"PasswordAuthentication no" (Recommended)&lt;/strong&gt; or you may still allow root access with password(Not recommended).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Stop preoccupied service on port 80
&lt;/h3&gt;

&lt;p&gt;Before executing node.js process need to kill occupied 80 port process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;sudo fuser -k 80/tcp&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Go Ahead
&lt;/h3&gt;

&lt;p&gt;Go-Ahead run Node.js on port 80 it will work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tip:
&lt;/h3&gt;

&lt;p&gt;Use Node.js for APIs.Static assets should serve via NginX.Keep use  Multiple database layer for smooth operation.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>webdev</category>
      <category>node</category>
    </item>
    <item>
      <title>I don't use whatsApp so i built messaging system with PWA for myself.</title>
      <dc:creator>jswalker.in</dc:creator>
      <pubDate>Fri, 12 Jun 2020 09:13:03 +0000</pubDate>
      <link>https://dev.to/jswalker_in/i-don-t-use-whatsapp-so-i-built-messaging-system-with-pwa-for-myself-298k</link>
      <guid>https://dev.to/jswalker_in/i-don-t-use-whatsapp-so-i-built-messaging-system-with-pwa-for-myself-298k</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aplGZftf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/clq6hf5nx2kqn3y36qr2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aplGZftf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/clq6hf5nx2kqn3y36qr2.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; [Ingredients Require]

      * [Node.js + Redis]
      * [Service Worker setting]
      * [Firebase API]
      * [IndexedDB]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;[Node.js]&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;It helps the API wrapper to fulfill the registration and syncing process of user meta info.&lt;br&gt;
I use Redis database to kept every user entry as one key like :&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;set trunk_user_hash JSON.stringify(_user_info_)&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;[Service Worker]&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The service worker keeps alive(Till lifecycle of the worker in the background) to facilitate with the purpose.&lt;/p&gt;

&lt;p&gt;The first one is to keep the cache of an array of files and the second one is to deal with the Firebase web-push Event Listener.&lt;/p&gt;

&lt;p&gt;//List all files path that you want to cache in service worker for offline usage.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var filesToCache = ['./js/js-files.js','./css/css-files.js'];

//identify direct URL call not cached URL of service worker

var _direct_url_=['https://fcm.googleapis.com/fcm/send','/api/call'];

var staticCacheName="version_1";

    self.addEventListener('install', event =&amp;gt; {
       event.waitUntil(
        caches.open(staticCacheName).then(cache =&amp;gt; 
        cache.addAll(filesToCache)).then(self.skipWaiting()
       ));
    });      

    self.addEventListener('activate', function(event) {
       var cacheWhitelist = [staticCacheName];
        event.waitUntil(
          caches.keys().then(function(keyList) {
           return Promise.all(keyList.map(function(key) {
             if (cacheWhitelist.indexOf(key) === -1) {
              return caches.delete(key);
             }
           }));
         }));
     });   

     self.addEventListener('fetch', function(event) {
        var i=0,len=_direct_url_.length;flag = 0;
        for(i=0;i&amp;lt;len;i++){
          if(event.request.url.indexOf(_direct_url_[i])&amp;gt;-1){
             flag=1;
             break;
          }
        }
        if(flag==1){
           return;
        }else{
           event.respondWith(                 
              caches.match(event.request).then(function(response){
               if (response) {
                 return response;
               }
               return fetch(event.request);
              }).catch(function(error) {
            }));
         }
      });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  [Firebase Events]
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    self.addEventListener('push', function(event) {
      var _json_ = JSON.parse(event.data.text());
      console.log(_json_.data.notification);
      console.log(_json_.data.notification.body);

     //Do your magic here
     //Additional code such as time delay,push into idb

      var body = _json_.data.notification;

      //Show Web-push on device
     event.waitUntil(self.registration.showNotification(
       "Title", 
        {icon: 'Icon-Image',
          badge: 'Small-badge-image',
          actions: [
            {action: 'action_1', title: 'show me'},
            {action: 'action_2', title: 'Dont'}
          ],
          vibrate: [3000], /*Three sercond of beep*/
          body: body.body,
          tag:"Unique or same tag for each notification",
          data: body
     }).then(() =&amp;gt; 
       self.registration.getNotifications()).then(notifications=&amp;gt;{
          var msg_body={}; // Feed the payload

         self.clients.matchAll().then((clients) =&amp;gt; {
           clients.map((client) =&amp;gt; {
                   return client.postMessage(JSON.stringify(msg_body));
               })
         });

         // Push message in indexedDB for conversation history  
          push_msg(payload);
       });
   });

 self.addEventListener('notificationclick', function(event) {
   var eventURL = event.notification;
        event.notification.close();
        event.waitUntil(clients.matchAll({type: "window"     
          }).then(function(clientList) {
          for (var i = 0; i &amp;lt; clientList.length; i++) {
             var client = clientList[i];
               if (clients.openWindow){
         return clients.openWindow("Full-URL");         
           }
      }
    }));
  });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;[Firebase]&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Include web push standalone js files from firebase : (&lt;a href="https://firebase.google.com/docs/web/setup"&gt;https://firebase.google.com/docs/web/setup&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;On Document-Ready call following snippet to activate Firebase&lt;/p&gt;

&lt;p&gt;var messaging = firebase.messaging();&lt;br&gt;
firebase.initializeApp({'messagingSenderId': 'YOUR-SENDER-ID'});&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; navigator.serviceWorker.register('./firebase-messaging-sw.js', {
        scope: './'
    }).then(function(registration) {
        console.log('ServiceWorker registerd');
        messaging.useServiceWorker(registration);
    }).then(() =&amp;gt; {
        return messaging.requestPermission();
    }).then(() =&amp;gt; {
        try{
           return messaging.getToken();
        }catch(err){
           console.log(err);
           return false;    
        }
    }).then((token) =&amp;gt; {
        console.log(token); 
    // Store this token locally + into Redis along with user credential and meta data

}).catch((err) =&amp;gt; {
        console.log('Messaging Service not working');
        console.log(err);
});

firebase.initializeApp({'messagingSenderId': 'YOUR-SENDER-ID'});

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/*Ajax Call to send message to specific user*/

$.ajax({
                    type: 'POST',
                    url: "https://fcm.googleapis.com/fcm/send",
                    headers: {
                        "Authorization": "key=[FIREBASE-AUTH-KEY]",
                        "content-type": "application/json",
                    },
                    contentType: 'application/json',
                    dataType: 'json',                    
                    data: JSON.stringify({
                        body: "....",
                        to: [Receiver Token],
                        collapse_key: "new_messages",
                        data: {
                            "notification": {
                                msg_type: "msg",
                                sent_time:new Date(Date.now()+(new Date().getTimezoneOffset()*60000)).getTime()/1000|0,
                                timestamp:Date.now(),
                                ttl:30,
                                code:"Sender Code[Name or Codename]",
                                body: "MESSAGE BODY",
                                title: "Display Name of sender",
                                confirm: "URL FOR Confirm btn[Optional]",
                                decline: "URL FOR Decline btn[Optional]"
                            }
                        },
                        priority: "high"
                    }),
                    success: function(response) {
                      console.log(response);
                    },
                    fail:function(err){
                      console.log(err);
                    } 
             });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;[IndexedDB]&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Use IndexedDB APIs : If you want to store the messages for a while at client side.&lt;/p&gt;

&lt;p&gt;Note:Use IndexedDB code into service worker file so you can manage it easily for transaction.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
window.IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || window.msIDBTransaction;
window.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange || window.msIDBKeyRange;

var FM_DBOpenRequest="";
var db="";



function open_indexeddb(obj,callback){
  FM_DBOpenRequest = indexedDB.open("app-name",1);
  FM_DBOpenRequest.onsuccess = function(event) {
    db = FM_DBOpenRequest.result;
    indexeddbflag=1;
    callback(db);
  };

  FM_DBOpenRequest.onupgradeneeded = function(event) { 
    var db = event.target.result;

        var objectStore = db.createObjectStore('conversation', { keyPath: 'id' });
            objectStore.createIndex("sent_time", "sent_time", {
                unique: false
            });

              if(event.oldVersion&amp;lt;1){
                 /*Create or update object store*/
              }
              if(event.oldVersion&amp;lt;2){
                /*Create or update object store*/
              } 

  };

}

function push_msg(payload){
    /*Store data into object store by put method*/  

      var transaction = db.transaction(['conversation'], 'readwrite');
      var objectStore = transaction.objectStore('conversation');

      var msg_obj={}; /*Add data to push into idb*/
      var request = objectStore.put(msg_obj);
          request.onsuccess = function() {
          };
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;[Additional Tasks]&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;=================&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Keep Conversation at client side&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keep friend's token in-Sync locally.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clear IDB an interval of 24hrs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Allow user to make web-call(WebRTC)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  [Advantages]
&lt;/h3&gt;

&lt;p&gt;===========&lt;br&gt;
1.Small footprint and serve the purpose for friends and family.&lt;br&gt;
2.No one will screening/selling your data.&lt;br&gt;
3.Built to serve the purpose quickly with a low memory footprint.&lt;br&gt;
4.My data My Rule.&lt;/p&gt;

&lt;h1&gt;
  
  
  [Limitations]
&lt;/h1&gt;

&lt;p&gt;1.Firebase is free lunch for us, so sometimes the message got lost in the matrix.&lt;br&gt;
2.Longer in-active users will not awake the device 's background service easily.&lt;br&gt;
3.If the user is not frequent there will be a lot of delay messages.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;This is a simple foundation work for any tiny messaging app. If you want to debug or to grasp more please inspect these files: {js/test.js,firebase-messaging-SW.js} from the console&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Project Trunk : (&lt;a href="https://trunk.jswalker.in"&gt;https://trunk.jswalker.in&lt;/a&gt;)
&lt;/h2&gt;

&lt;p&gt;Product of &lt;a href="https://jswalker.in/its/amazing"&gt;Jswalker.in&lt;/a&gt;&lt;br&gt;
Thank You~~~[Create something that matters] EOF&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webrtc</category>
      <category>redis</category>
      <category>node</category>
    </item>
  </channel>
</rss>
