<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Bermuda Automation Blog]]></title><description><![CDATA[Case studies from Bermuda Automation]]></description><link>https://blog.baut.bm/</link><image><url>https://blog.baut.bm/favicon.png</url><title>Bermuda Automation Blog</title><link>https://blog.baut.bm/</link></image><generator>Ghost 3.37</generator><lastBuildDate>Tue, 02 Sep 2025 02:15:16 GMT</lastBuildDate><atom:link href="https://blog.baut.bm/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Colorful Google Calendar]]></title><description><![CDATA[<p>I find it useful to color-code my calendar.  In my case anything starting with a bracket <strong>[ ]</strong> is about work. It may be [c] for communications, [cl] for some client, etc.  I also have entries starting with <strong>#</strong> for personal things (family, learning, etc).  And finally, those with <strong>!</strong> are things I tend</p>]]></description><link>https://blog.baut.bm/colorful-google-calendar/</link><guid isPermaLink="false">67c5eff77993d944bfd31616</guid><dc:creator><![CDATA[Alvaro Feito Boirac]]></dc:creator><pubDate>Mon, 03 Mar 2025 18:31:37 GMT</pubDate><content:encoded><![CDATA[<p>I find it useful to color-code my calendar.  In my case anything starting with a bracket <strong>[ ]</strong> is about work. It may be [c] for communications, [cl] for some client, etc.  I also have entries starting with <strong>#</strong> for personal things (family, learning, etc).  And finally, those with <strong>!</strong> are things I tend to postpone or forget (exercise, stretching, etc).</p><figure class="kg-card kg-image-card"><img src="https://blog.baut.bm/content/images/2025/03/image.png" class="kg-image" alt srcset="https://blog.baut.bm/content/images/size/w600/2025/03/image.png 600w, https://blog.baut.bm/content/images/size/w1000/2025/03/image.png 1000w, https://blog.baut.bm/content/images/2025/03/image.png 1349w" sizes="(min-width: 720px) 720px"></figure><p>I found a little google script that I adapted to do this automatically.  The script essentially says:</p><ul><li>If an entry on the calendar starts with <strong>[ </strong>give it a certain colour</li><li>If it starts with <strong># </strong>some other colour</li><li>If it starts with ! another colour.</li></ul><p>If you want to use it yourself, go to <a href="https://script.google.com/">https://script.google.com/</a>, and create a new project.  You should see something like this:</p><figure class="kg-card kg-image-card"><img src="https://blog.baut.bm/content/images/2025/03/image-1.png" class="kg-image" alt srcset="https://blog.baut.bm/content/images/size/w600/2025/03/image-1.png 600w, https://blog.baut.bm/content/images/size/w1000/2025/03/image-1.png 1000w, https://blog.baut.bm/content/images/2025/03/image-1.png 1582w" sizes="(min-width: 720px) 720px"></figure><p>Rename the "Untitled project" to something like "Google Calendar Auto-Color".  Instead of <code>function myFunction() {}</code> we are going to write our own function.  Copy paste the following:</p><pre><code>function ColorEvents() {

  var today = new Date();
  var nextweek = new Date();
  nextweek.setDate(nextweek.getDate() + 7);

  var calendars = CalendarApp.getAllOwnedCalendars();

  for (var i=0; i&lt;calendars.length; i++) {
    var calendar = calendars[i];
    var events = calendar.getEvents(today, nextweek);
    for (var j=0; j&lt;events.length; j++) {
      var e = events[j];
      var title = e.getTitle();
      if (title[0] == "[") { // work related
        // other colours: https://developers.google.com/apps-script/reference/calendar/event-color
        e.setColor(CalendarApp.EventColor.PALE_BLUE);
      }
      if (title[0] == "!") { // fitness &amp; health
        e.setColor(CalendarApp.EventColor.YELLOW);
      }
      if (title[0] == '#') { // Family &amp; free time events
        e.setColor(CalendarApp.EventColor.PALE_GREEN);
      }
    }
  }
}</code></pre><p>What does it do?</p><p>It checks what day is today, and opens your calendars (associated to the google account that has created the script).  It then gets all events between today and next week.  The key section happens in these three lines:</p><pre><code>if (title[0] == "[") { // work related
        e.setColor(CalendarApp.EventColor.PALE_BLUE);
      }
if (title[0] == "!") { // fitness &amp; health
        e.setColor(CalendarApp.EventColor.YELLOW);
      }
if (title[0] == '#') { // Family &amp; free time events
        e.setColor(CalendarApp.EventColor.PALE_GREEN);
      }</code></pre><p>You can of course, change it. For example, if your calendar item starts with <code>"f:"</code> that may be how you label items for family.  Edit it according to your needs, and check <a href="https://developers.google.com/apps-script/reference/calendar/event-color">https://developers.google.com/apps-script/reference/calendar/event-color</a> for your favorite colours.  Then save it.  When ready, go to the left and select "Triggers":</p><figure class="kg-card kg-image-card"><img src="https://blog.baut.bm/content/images/2025/03/image-2.png" class="kg-image" alt></figure><p>You can, for example, make it run every hour with the following settings:</p><figure class="kg-card kg-image-card"><img src="https://blog.baut.bm/content/images/2025/03/image-3.png" class="kg-image" alt srcset="https://blog.baut.bm/content/images/size/w600/2025/03/image-3.png 600w, https://blog.baut.bm/content/images/size/w1000/2025/03/image-3.png 1000w, https://blog.baut.bm/content/images/2025/03/image-3.png 1455w" sizes="(min-width: 720px) 720px"></figure><p>You are good to go.  Go back to your editor and click "&gt; Run" to see if it worked.  (You may need to approve the script from your google account).  You don't need to hit "Deploy" (that is for running an app for others).</p><p>Enjoy!</p>]]></content:encoded></item><item><title><![CDATA[Dogfooding at Baut]]></title><description><![CDATA[<p>There is a well known expression in software called <a href="https://en.wikipedia.org/wiki/Eating_your_own_dog_food">dog-fooding</a>, or eating-your-own-dogfood.  If you are a company making dog food but you would not feed it to your pets, how can the customers trust you?</p><p>The concept is similar in IT.  If you sell project management software, but don't use</p>]]></description><link>https://blog.baut.bm/dog-food-at-baut/</link><guid isPermaLink="false">603d00f12bb34f525ebecd27</guid><category><![CDATA[automation]]></category><category><![CDATA[google]]></category><dc:creator><![CDATA[Alvaro Feito Boirac]]></dc:creator><pubDate>Mon, 01 Mar 2021 15:28:47 GMT</pubDate><media:content url="https://blog.baut.bm/content/images/2021/03/google_scripts.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.baut.bm/content/images/2021/03/google_scripts.png" alt="Dogfooding at Baut"><p>There is a well known expression in software called <a href="https://en.wikipedia.org/wiki/Eating_your_own_dog_food">dog-fooding</a>, or eating-your-own-dogfood.  If you are a company making dog food but you would not feed it to your pets, how can the customers trust you?</p><p>The concept is similar in IT.  If you sell project management software, but don't use it internally to manage your projects, why not?</p><p>At Bermuda Automation, we also automate our internal processes.  But just like we tell our clients, we strike a balance between full automation and cost-effectiveness.  </p><p>On the 1st of the month, I get 2 emails automated with <code>Google Apps Scripts</code>.</p><h3 id="1-pay-contractors-">1. Pay Contractors:</h3><p>Importantly, the email is actionable:</p><ul><li>It contains a template email to forward to the contractor.</li><li>It has a link to their time tracking profile </li><li>It has a link to my internal accounting to update it straight away.</li></ul><p>For the coders out there, here is what the code does:    </p><pre><code class="language- Google Apps Script">function pay_contractor_reminder(sheet_name){
  
    var todayis = new Date()
    var six_days_ago = new Date(todayis.getTime() - 6*(24*3600*1000)); // a day 5 days ago
    var last_month = Utilities.formatDate(six_days_ago, Session.getScriptTimeZone(), "MMMM");
    var mes_pasado = LanguageApp.translate(last_month, 'en', 'es');
  
     var toggle_link = "https://track.toggl.com/reports/detailed/XXXX/period/prevMonth/users/XXXX"
     var time_accounting = "https://docs.google.com/spreadsheets/d/XXXXXXX-YYYYYYY/edit#gid=ZZZZ"
     var accounting = "https://docs.google.com/spreadsheets/d/XXXXXX-YYYY/edit#gid=0"
     
    // get email information from sheet
    var em_address = "alvaro@baut.bm";
  var em_title = "Getting Paid: " + last_month;
  var em_message = "Please review the hours worked last month: &lt;br&gt;" +
                    "&lt;a href='" + toggle_link + "' target='_blank'&gt; Toggle for Joe Bloggs&lt;/a&gt; &lt;br&gt;&lt;br&gt;" +
                      "And update the Time Tracking Spreadsheet&lt;br&gt;" +
                     "&lt;a href='" + time_accounting + "' target='_blank'&gt; Time Tracking &lt;/a&gt; &lt;br&gt;&lt;br&gt;" +
                     "And update the Accounting Spreadsheet&lt;br&gt;" +
                     "&lt;a href='" + accounting + "' target='_blank'&gt; Baut Accounting &lt;/a&gt; &lt;br&gt;&lt;br&gt;" +
                       "&lt;hr&gt; Hola Joe, &lt;br&gt; &lt;p&gt; ¿Me puedes confirmar que has trabajado __h en " + mes_pasado +
                         ", equivalente a __ EUR? &lt;/p&gt;&lt;br&gt; ¿Alguna preferencia para el pago? &lt;br&gt; Gracias,&lt;br&gt;" +
                     "Alvaro"
    
                     MailApp.sendEmail({
                       to: em_address, 
                       subject: em_title, 
                       htmlBody: em_message
                     }); 
}</code></pre><h3 id="2-getting-paid">2. Getting Paid</h3><p>Following a similar template as the code above, I get an email with:</p><ul><li>Hours billed to each client this month</li><li>The invoice template</li><li>The internal accounting that needs to be updated</li><li>A pre-filled email template for the clients</li></ul><p>Could it be automated further?  Absolutely.  I could get a button on my phone saying: <strong>Confirm you want to bill $XX to ClientX this month.  </strong></p><p>But with 3 or 4 clients per month, the scale still tilts towards half-manual / half-automated.</p>]]></content:encoded></item><item><title><![CDATA[Automatic Injury Diagnostic]]></title><description><![CDATA[Talking to chiropractors and physiotherapists we discovered that they can benefit from the latest developments in Machine Learning and image processing.]]></description><link>https://blog.baut.bm/automatic-injury-diagnostic/</link><guid isPermaLink="false">5fb067f86fa35844ea42e6ed</guid><category><![CDATA[automation]]></category><category><![CDATA[machine-learning]]></category><category><![CDATA[ML]]></category><category><![CDATA[email]]></category><category><![CDATA[automatic]]></category><category><![CDATA[chiropractice]]></category><category><![CDATA[physiotherapy]]></category><dc:creator><![CDATA[Alvaro Feito Boirac]]></dc:creator><pubDate>Mon, 28 Sep 2020 15:58:19 GMT</pubDate><content:encoded><![CDATA[<p>Talking to chiropractors and physiotherapists we discovered that they can benefit from the latest developments in Machine Learning and image processing.</p><p>With a simple webcam or a tablet, it is possible to measure and record the range of motion of your joints.  With this technology, healthcare professionals can assess your joints and track the progress during therapy.</p><figure class="kg-card kg-image-card"><img src="https://blog.baut.bm/content/images/2020/09/Demo_Chiro_Pose.gif" class="kg-image" alt></figure><p> It also becomes possible for patients to self-assess at home, which undoubtedly has advantages in the face of <em>sars-cov-2</em>.  </p><figure class="kg-card kg-image-card"><img src="https://blog.baut.bm/content/images/2020/09/Demo_Chiro_Pose_neck.gif" class="kg-image" alt></figure><p>If you think your organization can benefit from machine learning and video-processing, <a href="https://baut.bm/about/">get in touch</a>.</p>]]></content:encoded></item><item><title><![CDATA[Robot: Do my online shopping!]]></title><description><![CDATA[COVID reminded us that most of our shopping can be done online.  However, after a long day at work, who wants to spend another hour on the computer planning groceries and browsing ingredients? ]]></description><link>https://blog.baut.bm/robot-do-my-groceries/</link><guid isPermaLink="false">5fb067f86fa35844ea42e6ec</guid><category><![CDATA[automation]]></category><category><![CDATA[browser]]></category><category><![CDATA[shoppin]]></category><category><![CDATA[shopping]]></category><category><![CDATA[real-world]]></category><category><![CDATA[API]]></category><category><![CDATA[food]]></category><category><![CDATA[cooking]]></category><dc:creator><![CDATA[Alvaro Feito Boirac]]></dc:creator><pubDate>Mon, 28 Sep 2020 01:06:24 GMT</pubDate><content:encoded><![CDATA[<p>COVID reminded us that most of our shopping can be done online.  However, after a long day at work, who wants to spend another hour on the computer planning groceries and browsing ingredients?  I, for one, have automated our shopping at home:</p><h2 id="step-1-drag-drop-a-weekly-menu">Step 1: Drag &amp; Drop a weekly menu</h2><figure class="kg-card kg-image-card"><img src="https://blog.baut.bm/content/images/2020/09/out-min.gif" class="kg-image" alt></figure><h2 id="step-2-enter-your-credit-card-details">Step 2: Enter your credit card details</h2><p>The app above is <a href="https://spoonacular.com/">spoonacular.com</a>:  Based on the recipes it creates a shopping list.  If Monday needs <strong>2 </strong>tomatoes, and Thursday needs <strong>1 </strong>tomato, it knows to add <strong>3</strong> tomatoes to your list:</p><figure class="kg-card kg-image-card"><img src="https://blog.baut.bm/content/images/2020/09/shopping_list.png" class="kg-image" alt srcset="https://blog.baut.bm/content/images/size/w600/2020/09/shopping_list.png 600w, https://blog.baut.bm/content/images/2020/09/shopping_list.png 944w" sizes="(min-width: 720px) 720px"></figure><p>You then add by hand any additions (for example soap) and hit <strong>run</strong>!</p><p>Our robot will read the shopping list and translate items into the brands <em>we</em> like at the supermarket:  So <code>2 yoghurts</code> turns into <code>2 tubs x 32oz La yoghurt probiotic</code>.  Next, it will open <a href="https://order.lindos.bm/">order.lindos.bm</a>, fill in your details, the shopping list and it's done.</p><p>The browser then hands control over to you to double-check and pay.</p><p>All in all, my shopping takes 15 minutes.</p><p>If you need help automating your business, <a href="https://baut.bm/about/">send us an email</a>.</p>]]></content:encoded></item><item><title><![CDATA[Car Licensing Reminders]]></title><description><![CDATA[Who hasn't left their car licensing to the last minute?  Here we built a system to send ourselves actionable emails with instructions exactly when we need them.]]></description><link>https://blog.baut.bm/car-inspection-reminders/</link><guid isPermaLink="false">5fb067f86fa35844ea42e6eb</guid><category><![CDATA[automation]]></category><category><![CDATA[automate]]></category><category><![CDATA[browser]]></category><category><![CDATA[google]]></category><category><![CDATA[google drive]]></category><category><![CDATA[google sheets]]></category><category><![CDATA[email]]></category><dc:creator><![CDATA[Alvaro Feito Boirac]]></dc:creator><pubDate>Fri, 25 Sep 2020 16:32:33 GMT</pubDate><content:encoded><![CDATA[<p>Who has never left their insurance renewal and car licensing to the last minute?  With it comes the stress of coordinating insurance, paperwork, landlord signature and a visit to <a href="https://www.gov.bm/department/transport-control">TCD</a> (MOT in the UK).</p><p>One option is to set oneself reminders in the calendar each year.  However, if the reminder arrives at the wrong time, we often don't act on it.  Where was the licence number? What's the phone for the insurance? etc.</p><p>To automate the process, I created a simple spreadsheet (Google Sheet) that emails me:</p><figure class="kg-card kg-image-card"><img src="https://blog.baut.bm/content/images/2020/09/spreadsheet.png" class="kg-image" alt></figure><p>Each row will automatically send an email.  But more importantly it is immediately actionable:</p><figure class="kg-card kg-image-card"><img src="https://blog.baut.bm/content/images/2020/09/email.png" class="kg-image" alt></figure><p>I have the link, the phone &amp; the details to renew it straight away.  As the deadline approaches emails highlight the sense of <strong>Urgency:</strong></p><figure class="kg-card kg-image-card"><img src="https://blog.baut.bm/content/images/2020/09/email_deadline.png" class="kg-image" alt></figure><p>Once done, I only need to change a single cell:  <code>2021</code> -&gt; <code>2022</code> and the notifications will run the following year.</p><p><a href="https://baut.bm/about/">Get in touch</a> if you need help automating your work or your life.</p><p></p><hr><p>For the developers out there, here is the google script that runs it all:</p><pre><code class="language-Google Apps Script">function email_if_due(sheet_name)
{
  // var sheet = SpreadsheetApp.getActiveSheet();
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheet_name); 
  
  var data_range = sheet.getDataRange();
  var last_row = data_range.getLastRow();
  var today= new Date();
  today.setHours(0,0,0,0);
  
  sheet.getRange('B4:B15').clearContent(); // clear column of due emails
  for(var r=4;r&lt;=last_row;r++)
  {
    var start_string = data_range.getCell(r,4).getValue();
    var end_string = data_range.getCell(r,5).getValue();
    // convert date string to date
    var start_date = new Date(start_string).setHours(0,0,0,0)
    var end_date = new Date(end_string).setHours(0,0,0,0)
    
    // get email information from sheet
    var em_address = data_range.getCell(r,3).getValue();
    var em_title = data_range.getCell(r,6).getValue();
    var em_message = data_range.getCell(r,7).getValue();
    
      
    if(today &gt;= start_date &amp;&amp; today &lt;= end_date)
    {
     MailApp.sendEmail(em_address, em_title, em_message)
     sheet.getRange(r, 2).setValue("SEND");
    }
  }
}

function sendNotifications(){
email_if_due("Car");
email_if_due("Bike");
}</code></pre>]]></content:encoded></item><item><title><![CDATA[Automatic Industry Reports]]></title><description><![CDATA[This project turned data on the internet into a report on Real Estate trends. Using real estate data and hundreds of searches online we gathered numerous insights.]]></description><link>https://blog.baut.bm/automatic-industry-reports/</link><guid isPermaLink="false">5fb067f86fa35844ea42e6ea</guid><category><![CDATA[automation]]></category><category><![CDATA[reports]]></category><category><![CDATA[pdf]]></category><category><![CDATA[workflow]]></category><category><![CDATA[excel]]></category><category><![CDATA[automate]]></category><dc:creator><![CDATA[Dr Alvaro Feito Boirac]]></dc:creator><pubDate>Fri, 25 Sep 2020 13:53:54 GMT</pubDate><content:encoded><![CDATA[<p>This project turned data on the internet into a report on the Real Estate trends in Bermuda.</p><figure class="kg-card kg-image-card"><img src="https://blog.baut.bm/content/images/2020/09/image-1.png" class="kg-image" alt></figure><p>There were multiple inputs to this project:</p><ul><li>Real estate sales data</li><li>Map &amp; geographic data</li><li>Annual Rental Value data</li></ul><p>The data came from different sources (excel sheets, websites, google).  To obtain some of the data, we built an <em>internet robot</em> to open nearly 500 pages online and read the numbers and addresses there.   Once all the data was gathered into a single spreadsheet, graphs and statistics could be compiled automatically.  The initial work allowed the customer to create a quarterly report which can produce itself in 1/2h.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.baut.bm/content/images/2020/09/image-2.png" class="kg-image" alt><figcaption>An example graph for the Annual Rental Value per Parish</figcaption></figure><p>In projects like this one, the biggest challenge is the quality of the input data.  Did someone misspell the Parish? Or add an extra zero to the price? Maybe they put the address in the wrong column?  We automatically catch the most common errors and run sanity checks or flag them for the expert to review.</p><p>If you need to <strong>increase the quality</strong> of your data and <strong>save employee time</strong>, <a href="https://baut.bm/about/">we can probably help you</a>.</p>]]></content:encoded></item><item><title><![CDATA[Reading & Sorting PDFs]]></title><description><![CDATA[How do you read 550 PDF pages without ever opening them? Here we break up PDFs into hundreds of sub-files and classify them.]]></description><link>https://blog.baut.bm/reading-sorting-pdfs/</link><guid isPermaLink="false">5fb067f86fa35844ea42e6e9</guid><category><![CDATA[pdf]]></category><category><![CDATA[documents]]></category><category><![CDATA[classification]]></category><category><![CDATA[sorting]]></category><category><![CDATA[document-management]]></category><category><![CDATA[automation]]></category><category><![CDATA[automatic]]></category><dc:creator><![CDATA[Dr Alvaro Feito Boirac]]></dc:creator><pubDate>Fri, 25 Sep 2020 12:58:59 GMT</pubDate><content:encoded><![CDATA[<p>This problem arose to help students prepare for their exams.  The idea was to create a collection of problems sorted by topic and sub-topic.  So for example the folder  <code>Electromagnetism / Magnets</code> would contain all problems about <code>drawing magnetic fields</code>, <code>hard and soft magnetic materials</code>, etc.  But how do we extract a given exercise out of a PDF and find the corresponding folder?</p><figure class="kg-card kg-image-card"><img src="https://blog.baut.bm/content/images/2020/09/pdf_categorizing.png" class="kg-image" alt></figure><p>Available were 22 PDFs with exams from the last 10 years.  Each file containing about 25 pages.  So all in all 550 pages.   The job was to break-up those 550 pages into 1,2 or 3 page sub-documents, and save them to one of 20 folders corresponding to their topic.</p><p>The automation was not very sophisticated, but effective enough for its purpose &amp; budget (pro-bono!).  The robot would do the following:</p><ul><li>Open the PDF &amp; turn it into just text</li><li>Find where problems start and end</li><li>Split the PDF into 10 to 15 new PDFs (one per problem)</li><li>Check a list of  keywords to give it a score:</li></ul><blockquote>for example: If it contains the words "Force", "Acceleration", "accelerates", "distance-time" it probably belongs in <strong>Mechanics.</strong></blockquote><p>Then store it in the corresponding folder.  For more sophisticated jobs with tens of thousands of documents, a <a href="https://www.researchgate.net/publication/266463703_Is_Naive_Bayes_a_Good_Classifier_for_Document_Classification">Naive Bayesian Classifier</a> is a more accurate and effective approach.</p><p>The original solution to this problem can be found on <a href="https://github.com/alphydan/igcse-paper-parser">Github</a> and a more up-to-date version on <a href="https://repl.it/@alphydan/igcse-paper-parser">repl.it</a>.</p>]]></content:encoded></item><item><title><![CDATA[Automatic paper surveys]]></title><description><![CDATA[How do you assign 20 activities to 400 people without an internet connection? Find out how we did it ...]]></description><link>https://blog.baut.bm/automatic-paper-forms/</link><guid isPermaLink="false">5fb067f86fa35844ea42e6e8</guid><category><![CDATA[automation]]></category><category><![CDATA[forms]]></category><category><![CDATA[image-processing]]></category><category><![CDATA[pictures]]></category><dc:creator><![CDATA[Dr Alvaro Feito Boirac]]></dc:creator><pubDate>Thu, 24 Sep 2020 18:32:02 GMT</pubDate><media:content url="https://blog.baut.bm/content/images/2020/09/auto_generated_survey-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.baut.bm/content/images/2020/09/auto_generated_survey-1.png" alt="Automatic paper surveys"><p>Online surveys are quick and convenient, but sometimes you <em>just need paper</em>.  Perhaps your public can't use smartphones or laptops, or your survey happens in a remote location. </p><p>This job involves 400 people having to rank their top 3 choices for a conference. To complicate things, places are limited for each activity.  In addition, not everybody has access to the same events (some are restricted to a subset of them).</p><p>This is how we solved it:</p><h3 id="make-forms">Make forms</h3><p>The first program used the list of participants and restrictions to create 400 PDFs, each tailored to each individual and containing a QR code.  Something like this:</p><figure class="kg-card kg-image-card"><img src="https://blog.baut.bm/content/images/2020/09/auto_generated_survey.png" class="kg-image" alt="Automatic paper surveys"></figure><p>These were then filled out by the participants during an event.  </p><h3 id="autoscan">AutoScan</h3><p>They were then placed on the scanner bed and scanned at once into 400 pictures:</p><figure class="kg-card kg-image-card"><img src="https://blog.baut.bm/content/images/2020/09/scanned_answers.png" class="kg-image" alt="Automatic paper surveys"></figure><h3 id="computer-vision">Computer Vision</h3><p>Our program opened each file, read the QR code (finding name, group and restrictions), and cropped the answers.  All answers were read in a few seconds:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.baut.bm/content/images/2020/09/mini-animation-1.gif" class="kg-image" alt="Automatic paper surveys"><figcaption>Detecting the circles with the most non-white pixels</figcaption></figure><p>In all automation projects, people are expected to make errors or to break the rules.  For example erasing circles with white-out, writing over them or selecting more than 3 circles.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.baut.bm/content/images/2020/09/form_errors.png" class="kg-image" alt="Automatic paper surveys"><figcaption>some issues filling forms</figcaption></figure><p>Such possibilities were caught by the program and sent to a folder for review by an employee.</p><p>Once processed, all users were assigned their activity by a program.  A final processing step checked for over-subscribed activities.  If too many people had signed up, a few random ones were given their 2nd choice, or if not available, their 3rd choice.  Finally it was all automatically writen to a google sheet that participants could check.</p><p>This process had to be done every few months, so a job that would have taken hours of tedious and error-prone transcription and sorting was turned into a 30 minute job.</p><p>If you need to <strong>increase the quality</strong> of your data and <strong>save employee time</strong>, <a href="https://baut.bm/about/">we can probably help you</a>.</p><hr><p>For the mathematically inclined, the general version of this problem is called the <a href="https://blog.baut.bm/automatic-paper-forms/Maximum%20Bi-partite%20assigning%20problem">Maximum Bi-partite assigning problem</a>, or <a href="http://www.cs.cmu.edu/~dabraham/papers/aim04.pdf">Student-Project Allocation problem</a>.</p>]]></content:encoded></item><item><title><![CDATA[Migrating a customer database]]></title><description><![CDATA[One of our clients has a database with 9000 customers.  When their migration failed our browser robot took over.]]></description><link>https://blog.baut.bm/migrating-a-database-with-robots/</link><guid isPermaLink="false">5fb067f86fa35844ea42e6e7</guid><category><![CDATA[automation]]></category><category><![CDATA[browser]]></category><dc:creator><![CDATA[Dr Alvaro Feito Boirac]]></dc:creator><pubDate>Sun, 15 Sep 2019 21:10:25 GMT</pubDate><media:content url="https://blog.baut.bm/content/images/2019/09/form_filling_video.gif" medium="image"/><content:encoded><![CDATA[<img src="https://blog.baut.bm/content/images/2019/09/form_filling_video.gif" alt="Migrating a customer database"><p>One of our clients has a database with 9000 customers.  He recently migrated to a new customer management system (CRM).  Unfortunately, all data pertaining to the insurance did not make it to the new system.</p><p>Furthermore, it did not allow importing the data in any format (excel, <a href="https://en.wikipedia.org/wiki/Comma-separated_values">csv</a>, text).  The client had thus started typing it by hand.  </p><blockquote>9000 customers, 30s per record ⇢ <strong>75h</strong></blockquote><p>Of course, nobody can stare at a screen 75h straight.  So including breaks and corrections they were looking at 100h of work.  But most importantly, would there be no mistakes?</p><p>That is a perfect job for a "<strong>Browser Robot</strong>".</p><figure class="kg-card kg-image-card"><img src="https://blog.baut.bm/content/images/2019/09/image-1.png" class="kg-image" alt="Migrating a customer database"></figure><p>After a 5 minute demonstration of the data entry and a brief clarification about their objectives I took over.  <a href="https://baut.bm/">Bermuda Automation</a> created the bot and let it do its work.  As it was working, it compiled statistics on customers with missing records and printed a report.  And of course, the speed is unmatched.</p><figure class="kg-card kg-image-card"><img src="https://blog.baut.bm/content/images/2019/09/out2.gif" class="kg-image" alt="Migrating a customer database"></figure><p>Practically any interaction that a human can do with a browser can be done by a <strong>browser robot</strong>.  Think:</p><ol><li>Logging in, Logging out, typing passwords</li><li>Filling in forms</li><li>Drop down menus</li><li>Searching and clicking on results</li><li>Saving or sending</li></ol><p>If you need to <strong>increase the quality</strong> of your data and <strong>save employee time</strong>, <a href="https://baut.bm/about/">we can probably help you</a>.</p>]]></content:encoded></item></channel></rss>