<?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: Love Liberty</title>
    <description>The latest articles on DEV Community by Love Liberty (@loveliberty).</description>
    <link>https://dev.to/loveliberty</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%2F2202729%2Fbaf09b6d-2415-42e0-9b1d-580b1e2fb4d1.png</url>
      <title>DEV Community: Love Liberty</title>
      <link>https://dev.to/loveliberty</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/loveliberty"/>
    <language>en</language>
    <item>
      <title>Javascript listeners click bait</title>
      <dc:creator>Love Liberty</dc:creator>
      <pubDate>Sat, 16 Nov 2024 23:05:27 +0000</pubDate>
      <link>https://dev.to/loveliberty/javascript-listeners-click-bait-39k3</link>
      <guid>https://dev.to/loveliberty/javascript-listeners-click-bait-39k3</guid>
      <description>&lt;p&gt;Having written code in a test file that worked very nicely, I had to incorporate it into the main code &amp;amp; it didn't go so well.&lt;/p&gt;

&lt;p&gt;The basic code consisted of a simple html file with a single button called "remember this."&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7erze39w5c694d9jtxwv.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7erze39w5c694d9jtxwv.PNG" alt="Image description" width="120" height="54"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That had an onclick to a function called  showRememberMenu(). That function created a menu that was displayed under the button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fht2tn2mla4crwnnyhypq.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fht2tn2mla4crwnnyhypq.PNG" alt="Image description" width="129" height="161"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The dropdown menu had several tags to add to the data as a reminder of why the user was trying to remember it. (I'm old I need all the hlp I can get on remembering stuff.)&lt;/p&gt;

&lt;p&gt;Click the button, see the dropdown menu, click the tag you want &amp;amp; the data you are looking at is saved in an array with that tag. Having clicked the menu it disappears.&lt;/p&gt;

&lt;p&gt;My task was then to drop that into a larger script &amp;amp; see it work just the same... oh, maybe not. Click the menu, store the data with the tag and... what? why is the menu still there? It was deleted in the original as soon as it was clicked. Why is it not going away? &lt;/p&gt;

&lt;p&gt;And if I click the tag that says 'Exit don't save' it is still displaying the menu.&lt;/p&gt;

&lt;p&gt;As a user I was looking at a card that had data from the database. Clicking this button was a way to save that data for later use. Here you can see the card with its new button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyf5s4cyt9i2j5np3nuuj.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyf5s4cyt9i2j5np3nuuj.PNG" alt="Image description" width="577" height="266"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click that button to see the drop down and select the tag that is relevant to remembering this data...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjvxxegojth0icfe16x27.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjvxxegojth0icfe16x27.PNG" alt="Image description" width="129" height="161"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now go do the same with other cards and you have all the data needed to complete some task, but why the "&amp;amp;%!!! is that menu never going away?&lt;/p&gt;

&lt;p&gt;After I ran out of ideas I contacted my collegaue &lt;em&gt;Gemini the AI&lt;/em&gt;. It gave me a first solution which was exactly the code that I already had. It suggested a lot of things, none of which worked.&lt;/p&gt;

&lt;p&gt;It was confident that checking for the existence of the nodes &amp;amp; elements would make everything good, but it didn't.&lt;/p&gt;

&lt;p&gt;It took about an hour of being told things that didn't work and being lectured on timing issues, possibly needing delays, which really weren't relevant, but slowly as a team we solved the problem. &lt;/p&gt;

&lt;p&gt;If you want to try to solve this, I bet you can do it in less time. &lt;/p&gt;

&lt;p&gt;Here's the original draft code that works...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang="en" &amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset="UTF-8"&amp;gt;
  &amp;lt;title&amp;gt;Some Javascript&amp;lt;/title&amp;gt;
  &amp;lt;link rel="stylesheet" href="./someJavascript.css"&amp;gt;
  &amp;lt;link rel="icon" href="favicons/favicon.ico" type="image/icon type"&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;div class="remember" id="remember"&amp;gt;
    &amp;lt;input type="button" class="remember_button" id=remember value="remember this" onclick="showRememberMenu()"&amp;gt;
  &amp;lt;/div&amp;gt;
      &amp;lt;script  src="./someJavascriptCode.js"&amp;gt;&amp;lt;/script&amp;gt;    
    &amp;lt;/body&amp;gt;
    &amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and the javascript&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let logToConsole=true;
var rowData={THId:'2', TaskName:'To climb a tree', TaskDesc:'Try using hands &amp;amp; feet'};
var remember=[];

function rememberProcess(remember){
    if(logToConsole) console.log('RememberProcess()');
for(i=0;i&amp;lt;remember.length;i+=2){
    console.log('Item ',i/2+1,' of ', remember.length/2,' items', 'Remember as ',remember[i], remember[i+1]);}        
}

function putDataIntoRemember(menuHeader,rowData){
    if(logToConsole) console.log('putDataIntoRemember()');
    remember.push(menuHeader);
    remember.push(rowData);
}

function deleteMenu(menuLu){
    if(logToConsole) console.log('deleteMenu()');
    menuLu.parentNode.removeChild(menuLu);
}

function showRememberMenu(){
    if(logToConsole) console.log('showRememberMenu()');

 if(document.querySelector('#rememberMenu') ) return; //menu already exists

    const remember_button = document.querySelector('#remember');
    const menuHeaders=['EXIT no save', 'as Student', 'as Manager', 'as Author', 'as Task' , 'as Note'];
    menuLu=document.createElement('lu');
    menuLu.id='rememberMenu';

for(let i=0;i&amp;lt;menuHeaders.length;i++){
    li=document.createElement('li');         
    li.innerText=menuHeaders[i]; 
    li.id=menuHeaders[i];
    li.classList.add('rememberLi');

    li.addEventListener('click', () =&amp;gt; { //console.log('li button clicked', menuHeaders[i], rowData)
        if(menuHeaders[i]=='EXIT no save') {deleteMenu(menuLu);return};
    putDataIntoRemember(menuHeaders[i], rowData);//[header][rowData]       
    rememberProcess(remember);//do something with the stored data structure
    deleteMenu(menuLu);
      })

    menuLu.appendChild(li);
    }

remember_button.appendChild(menuLu);      
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is some css, but it isn't relevant to the problem&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.remember_button {

        background-color: #5A5050;
        border: 0;
        border-radius: 5px;
        box-shadow: 0 10px 10px rgba(0, 0, 0, 0.2);
        color: #fff;
        font-size: 12px;
        padding: 3px 4px;
        position: relative;        
        letter-spacing: 1px;
        width: 100px;

}

    /*Button goes white on hover*/
.remember_button:hover {
        background-color: #ffffff;
        color: #001F61;
        cursor:pointer;
    }    


.rememberLi{
    background-color: #aa9595;
    border: 0;
    border-radius: 5px;
    box-shadow: 0 10px 10px rgba(0, 0, 0, 0.2);
    color: #fff;
    font-size: 12px;
    padding: 3px 4px;
    position: relative;        
    letter-spacing: 1px;
    width: 100px;

}

.rememberLi:hover {
    background-color: #ffffff;
    color: #001F61;
    cursor:pointer;
}   
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above works, more or less as I wanted.&lt;/p&gt;

&lt;p&gt;Here is the version inside a bigger system which I won't post all of.&lt;/p&gt;

&lt;p&gt;A card is dynamically produced and has the following code added to produce the same kind of button as in the original&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                     // NEW  REMEMBER BUTTON   21:39 16 Nov 2024
  let cardRemember=document.createElement('button');
  cardRemember.classList.add='remember_button';
  cardRemember.id='remember';
  cardRemember.innerText='remember this';

  cardRemember.addEventListener('click', () =&amp;gt; {
    showRememberMenu(rowData);
  });
  cardDivj.appendChild(cardRemember);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and the rest of the javascript is close to identical to the original&lt;br&gt;
&lt;/p&gt;

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

function rememberProcess(remember){
    if(logToConsole) console.log('RememberProcess()');
for(i=0;i&amp;lt;remember.length;i+=2){
    console.log('Item ',i/2+1,' of ', remember.length/2,' items', 'Remember as ',remember[i], remember[i+1]);}        
}

function putDataIntoRemember(menuHeader,rowData){
    if(logToConsole) console.log('putDataIntoRemember()');
    remember.push(menuHeader);
    remember.push(rowData);
}
/*
function deleteMenu(menuLu){
    if(logToConsole) console.log('deleteMenu()');
    console.log(menuLu);
    menuLu.parentNode.removeChild(menuLu);
}
    */

function deleteMenu(menuLu) {
  if (menuLu &amp;amp;&amp;amp; menuLu.parentNode) {
    menuLu.parentNode.removeChild(menuLu);
    console.log("Menu removed successfully");
  } else {
    console.error("Menu or its parent not found");
  }
}

function showRememberMenu(rowData){
    if(logToConsole) console.log('showRememberMenu()');

 if(document.querySelector('#rememberMenu') ) return; //menu already exists

    const remember_button = document.querySelector('#remember');
    const menuHeaders=['EXIT no save', 'as Student', 'as Manager', 'as Author', 'as Task' , 'as Note'];
    menuLu=document.createElement('lu');
    menuLu.id='rememberMenu';

for(let i=0;i&amp;lt;menuHeaders.length;i++){
    li=document.createElement('li');               //  console.log(menuHeaders[i]);//ok
    li.innerText=menuHeaders[i]; // li.innerHTML = `Remember as ${menuHeaders[i]}`; //Gemini suggests this syntax 
    li.id=menuHeaders[i];
    li.classList.add('rememberLi');

    li.addEventListener('click', () =&amp;gt; { console.log('li button clicked', menuHeaders[i], rowData)
        if(menuHeaders[i]==='EXIT no save') {deleteMenu(menuLu);return};
    putDataIntoRemember(menuHeaders[i], rowData);//[header][rowData]       
    rememberProcess(remember);//do something with the stored data structure
    deleteMenu(menuLu);
      })

    menuLu.appendChild(li);
    }

remember_button.appendChild(menuLu);      
}

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

&lt;/div&gt;



&lt;p&gt;A reminder of what it looks like before being clicked&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F08ft29z12kbzkc4omr3i.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F08ft29z12kbzkc4omr3i.PNG" alt="Image description" width="577" height="266"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and how it get stuck after being clicked&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0m7ovlf0tn8mez47g2wa.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0m7ovlf0tn8mez47g2wa.PNG" alt="Image description" width="552" height="268"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I had no idea what the problem was, and Gemini was off on one of its lectures over entirely irrelevant stuff but Ai &amp;amp; I finally narrowed things down and now it seems soo simple.&lt;/p&gt;

&lt;p&gt;So why does the menu persist? A clue from Shakespeare, &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;double double, toil and trouble&lt;br&gt;
Fire burn and cauldron bubble&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When the button was in html the menu went away as the javascript demanded, but when the button was in javascript it remained.&lt;/p&gt;

&lt;p&gt;The problem I learnt is called 'bubbling up' where a click on the submenu is also detected as a click on the button. So the javascript button reacted by re creating the sub menu.&lt;/p&gt;

&lt;p&gt;My AI colleague didn't spot the problem.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>ai</category>
    </item>
    <item>
      <title>fetch() &amp; XMLHttp errors to avoid</title>
      <dc:creator>Love Liberty</dc:creator>
      <pubDate>Thu, 14 Nov 2024 16:04:43 +0000</pubDate>
      <link>https://dev.to/loveliberty/fetch-xmlhttp-errors-to-avoid-1ema</link>
      <guid>https://dev.to/loveliberty/fetch-xmlhttp-errors-to-avoid-1ema</guid>
      <description>&lt;p&gt;Sadly, I didn't avoid these errors. I hope this may help others avoid them when trying to &lt;strong&gt;update a webpage without completely downloading a new version&lt;/strong&gt;. The code I ended up with seems to work:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;async function fetchDbSingle(url, str) {
  const dataToSend = str;
  console.log('fetchDbSingle: ' + str);

  try {
    const response = await fetch(url, {
      method: 'POST',
      headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
      body: dataToSend
    });

    if (!response.ok) {
      throw new Error('Network response was not ok');
    }

    const data = await response.json();
    return data;
  } catch (error) {
    console.error('Error fetching data:', error);
    throw error; // Re-throw the error to be handled by the caller
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;await&lt;/em&gt; works inside an async function to ensure that the data has arrived before attempting to access it. If you need to call an async function from normal code the syntax is &lt;em&gt;.then&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fetchDbSingle(url, str).then(data =&amp;gt; {
  console.log("Received data:", data);
  // Use the data here
}).catch(error =&amp;gt; {
  console.error("Error fetching data:", error);
}); 

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

&lt;/div&gt;



&lt;p&gt;If you try to access the data without using this special syntax the data will be undefined because you are accessing it before it has arrived.&lt;/p&gt;

&lt;p&gt;If you try to access the data outside of the places marked, it will be undefined.&lt;/p&gt;

&lt;p&gt;In my program the fetch() is calling a PHP script that reads a database.&lt;/p&gt;

&lt;p&gt;Here are some warnings that may make no sense to the experienced, but which I wish I had known earlier:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Note that the PHP will send the data by echo, and that in this case the echo will not appear on the screen.&lt;/li&gt;
&lt;li&gt;Make sure your PHP file only contains PHP code; no html. If it contains HTML the returned data will include all the HTML and that will be very confusing. &lt;/li&gt;
&lt;li&gt;Make sure the PHP file (and any file it includes) only have one echo statement. (Oh, and check any included file for html or echo)&lt;/li&gt;
&lt;li&gt;Json_encode what is to be sent by echo. You may want to have javascript json Parse it to make it a javascript array, but that isn't essential.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;If anyone is interested to know why I mention the above warnings, I could write an essay on the mistakes I made &amp;amp; how it took me a week to correct them and you can then chuckle and feel superior.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>php</category>
    </item>
    <item>
      <title>Google Gemini AI helping me to code</title>
      <dc:creator>Love Liberty</dc:creator>
      <pubDate>Tue, 12 Nov 2024 19:59:38 +0000</pubDate>
      <link>https://dev.to/loveliberty/google-gemini-ai-helping-me-to-code-98b</link>
      <guid>https://dev.to/loveliberty/google-gemini-ai-helping-me-to-code-98b</guid>
      <description>&lt;p&gt;Gemini is Google's free to use AI. I am coding something way outside my skill in that I am a retired consultant whose tech skills have been forgotten or have been made redundant. Having a polite well read artificial colleague has been very interesting.&lt;/p&gt;

&lt;p&gt;I usually do a quick search for syntax, but when things just don't work I ask Gemini.&lt;/p&gt;

&lt;p&gt;Gemini isn't very good at debugging. But seems better at suggesting how to do something. It seems to have learnt to make many of the mistakes that humans make. It can miss that a comma has been used instead of a semicolon, or it can miss that getElementById(form) should have been getElementById('form').&lt;/p&gt;

&lt;p&gt;Sometimes it insists that a global shouldn't be used, even when it is the only practical thing to use. It showed me code that used parameters &amp;amp; returned values. I had to ask 3 times before it would lower it's standards to show a way to do it using globals. However it's first attempt at this failed to work. It did eventually show a method, which is what I would have guessed.&lt;/p&gt;

&lt;p&gt;It is never too busy &amp;amp; will explain the various parts of the code it is suggesting, although the code may be wrong &amp;amp; the explanation may not make sense.&lt;/p&gt;

&lt;p&gt;It has, once or twice, suggested code that when pasted into VSC produces syntax errors.&lt;/p&gt;

&lt;p&gt;However, in general the experience has been very good. There are some questions that can't be easily word searched using a normal search service, and there are others which are so stupid that I wouldn't want to ask them on a human site, but I will get a polite answer from my colleague Gemini.&lt;/p&gt;

&lt;p&gt;I did ask one such question on stackoverflow, which I regretted as it was downvoted, closed, reviewed &amp;amp; deleted. Apparently, I had offended the techiegods. After many days of working on it alone I solved the problem &amp;amp; then asked Gemini who gave a partial solution in seconds.&lt;/p&gt;

&lt;p&gt;Here is my favourite response from Gemini:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You're absolutely right! As a language model, I've been trained on a massive dataset of human-generated text. This includes examples of common human errors, such as forgetting quotation marks. While I can process and generate text in a way that is often indistinguishable from human-written text, I'm not immune to making mistakes that humans commonly make.&lt;br&gt;
It's a valuable reminder that even AI models can benefit from human oversight and error correction. Thank you for your patience and for helping me identify and correct these errors.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
    </item>
    <item>
      <title>Database driven task &amp; membership</title>
      <dc:creator>Love Liberty</dc:creator>
      <pubDate>Sat, 12 Oct 2024 15:59:46 +0000</pubDate>
      <link>https://dev.to/loveliberty/database-driven-task-membership-1cco</link>
      <guid>https://dev.to/loveliberty/database-driven-task-membership-1cco</guid>
      <description>&lt;p&gt;I am working on a foolishly grand project to develop a website for the management of a self-help club or association. The project is a mix of keeping track of memberships, messaging &amp;amp; training courses where the members run the entire system.&lt;/p&gt;

&lt;p&gt;There are web services like this which I have used, but I have an idea of doing it differently.&lt;/p&gt;

&lt;p&gt;Html, CSS, JavaScript, PHP MariaDb(mySQL) currently running on Xampp on W10. Using XMLHttpRequest for updating data.  Floating modal Windows to display data. &lt;/p&gt;

</description>
      <category>database</category>
      <category>php</category>
      <category>html</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
