Skip to content

Commit

Permalink
Update landing page
Browse files Browse the repository at this point in the history
  • Loading branch information
GABurns committed Jun 21, 2023
1 parent 121eef7 commit faabffa
Show file tree
Hide file tree
Showing 8 changed files with 63 additions and 46 deletions.
9 changes: 5 additions & 4 deletions _site/blog.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">


<title>Data Burns - Welcome</title>
<title>Data Burns - Blog</title>
<style>
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
Expand Down Expand Up @@ -85,11 +85,11 @@
</li>
<li class="nav-item">
<a class="nav-link" href="./about.html">
<span class="menu-text">Welcome</span></a>
<span class="menu-text">About Me</span></a>
</li>
<li class="nav-item">
<a class="nav-link active" href="./blog.html" aria-current="page">
<span class="menu-text">Welcome</span></a>
<span class="menu-text">Blog</span></a>
</li>
</ul>
<div id="quarto-search" class="" title="Search"></div>
Expand Down Expand Up @@ -119,7 +119,7 @@ <h2 id="toc-title">On this page</h2>

<header id="title-block-header" class="quarto-title-block default">
<div class="quarto-title">
<h1 class="title">Welcome</h1>
<h1 class="title">Blog</h1>
</div>


Expand All @@ -138,6 +138,7 @@ <h1 class="title">Welcome</h1>
<p>The premise of our app was simply to act as a hook to encourage attendees to visit the <a href="https://exploristics.com/">Exploristics</a> stand and learn more about the products and services we offer. The challenge was to gather requirements, design, develop, implement, test and deploy an application that was a simple game in <strong>only a few days!</strong></p>
<p>The Higher of Lower game is based on the classic card game: an initial card is drawn from a standard deck of cards. Another card is then drawn from the deck and the player must guess if this drawn card will be of higher or lower value than the initial card. From a statistical perspective this is quite a simple process – random sampling without replacement of the deck and a logic-based approach of the guess. Although the statistical method and issues faced may seem trivial, they provide tangible examples of many of common issues faced and I attempt to generalize the solutions. When you attempt to deploy more complex statistical models it’ll be easier to identify the issues you’re facing, how to debug your code and solver your problems.</p>
<p>At <a href="https://exploristics.com/">Exploristics</a> we use Shiny apps to provide dynamic and interactive visualization tools to enable clients to interpret the complex multi-dimensional data or models generated by <a href="https://exploristics.com/keruscloud-platform-overview/">KerusCloud</a>. At the Jumping Rivers Shiny in Production conference, I spoke about the experiences and technology to create robust enterprise grade Shiny applications. However, the remit for the Higher or Lower application was very different from how we usually develop software – this was to be a one-off application to be used at the PSI conference and we only had a couple of days for development. This mean that many of our usual processes needed to be accelerated and we had to accept some trade-offs.</p>
<div class="quarto-video ratio ratio-16x9"><iframe src="https://www.youtube.com/embed/pHLT5IfgfM0" title="" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></div>
<p>Although we have experience in developing Shiny apps using a new technology such as <a href="https://www.shinyapps.io/">Shinyapps.io</a> usually leads to unexpected changes that take time to resolve. The time frame was extremely short to deal with any technology issues and &nbsp;address any feedback from stakeholders. However, as our preliminary research into <a href="https://www.shinyapps.io/">Shinyapps.io</a> looked promising we decided to have a go!.</p>
<p>“If I have seen further than others, it is by standing upon the shoulders of giants.”</p>
<p>Isaac Newton</p>
Expand Down
61 changes: 30 additions & 31 deletions _site/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@
<script src="site_libs/quarto-html/quarto.js"></script>
<script src="site_libs/quarto-html/popper.min.js"></script>
<script src="site_libs/quarto-html/tippy.umd.min.js"></script>
<script src="site_libs/quarto-html/anchor.min.js"></script>
<link href="site_libs/quarto-html/tippy.css" rel="stylesheet">
<link href="site_libs/quarto-html/quarto-syntax-highlighting.css" rel="stylesheet" id="quarto-text-highlighting-styles">
<script src="site_libs/bootstrap/bootstrap.min.js"></script>
Expand Down Expand Up @@ -63,7 +62,7 @@
<link rel="stylesheet" href="styles.css">
</head>

<body class="nav-fixed">
<body class="nav-fixed fullcontent">

<div id="quarto-search-results"></div>
<header id="quarto-header" class="headroom fixed-top">
Expand Down Expand Up @@ -101,36 +100,43 @@
<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-article page-navbar">
<!-- sidebar -->
<!-- margin-sidebar -->
<div id="quarto-margin-sidebar" class="sidebar margin-sidebar">

</div>

<!-- main -->
<main class="content" id="quarto-document-content">

<header id="title-block-header" class="quarto-title-block default">
<div class="quarto-about-jolla">
<img src="profile.jpg" class="about-image
round " style="height: 15em; width: 15em;">
<header id="title-block-header" class="quarto-title-block default">
<div class="quarto-title">
<h1 class="title">Gareth Burns</h1>
</div>



<div class="quarto-title-meta">




</div>


</header>

<p>Welcome!</p>
<p>This is a my personal website that is still under construction but feel free to use the existing resources, whilst it’s being set up.</p>
<p>If you have any feedback please DM me on <a href="https://twitter.com/GarethBurns4">Twitter</a> or <a href="https://www.linkedin.com/in/drgarethburns/">LinkedIn</a>.</p>

</header><main class="content" id="quarto-document-content">
<section id="education" class="level2">
<h2 data-anchor-id="education">Education</h2>
<p>Queen’s University, Belfast | Belfast, UK PhD in Computational Biology | Sept 2009 - December 2012</p>
<p>Queen’s University, Belfast | Belfast, UK B.Sc Hons in Environmental Biology | Sept 2004 - June 2007</p>


</main> <!-- /main -->
</section>
</main>
<hr class="about-sep">
<div class="about-links">
<a href="https://twitter.com/GarethBurns4.com" class="about-link">
<i class="bi bi-twitter"></i>
<span class="about-link-text">twitter</span>
</a>
<a href="https://github.com/GABurns" class="about-link">
<i class="bi bi-github"></i>
<span class="about-link-text">Github</span>
</a>
<a href="https://www.linkedin.com/in/drgarethburns/" class="about-link">
<i class="bi bi-linkedin"></i>
<span class="about-link-text">LinkedIn</span>
</a>
</div>
</div>
<!-- /main -->
<script id="quarto-html-after-body" type="application/javascript">
window.document.addEventListener("DOMContentLoaded", function (event) {
const toggleBodyColorMode = (bsSheetEl) => {
Expand All @@ -151,13 +157,6 @@ <h1 class="title">Gareth Burns</h1>
}
}
toggleBodyColorPrimary();
const icon = "";
const anchorJS = new window.AnchorJS();
anchorJS.options = {
placement: 'right',
icon: icon
};
anchorJS.add('.anchored');
const clipboard = new window.ClipboardJS('.code-copy-button', {
target: function(trigger) {
return trigger.previousElementSibling;
Expand Down
Binary file added _site/profile.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
14 changes: 7 additions & 7 deletions _site/search.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,42 +2,42 @@
{
"objectID": "blog.html",
"href": "blog.html",
"title": "Welcome",
"title": "Blog",
"section": "",
"text": "Over 150 attendees at the PSI conference player the Exploristics Higher or Lower web app - and didn’t they all do well!? I was delighted to see the game generated so much interest, many people expressed an interest in the how we deployed the app on the cloud and that’s the motivation for this blog. This app is a microcosm of developing and deploying a Statistical Shiny app on the cloud. This blog is aimed at people who are experienced in developing desktop R scripts and have a desire to take the next step to create a Shiny app and deploy on the cloud.\nThe premise of our app was simply to act as a hook to encourage attendees to visit the Exploristics stand and learn more about the products and services we offer. The challenge was to gather requirements, design, develop, implement, test and deploy an application that was a simple game in only a few days!\nThe Higher of Lower game is based on the classic card game: an initial card is drawn from a standard deck of cards. Another card is then drawn from the deck and the player must guess if this drawn card will be of higher or lower value than the initial card. From a statistical perspective this is quite a simple process – random sampling without replacement of the deck and a logic-based approach of the guess. Although the statistical method and issues faced may seem trivial, they provide tangible examples of many of common issues faced and I attempt to generalize the solutions. When you attempt to deploy more complex statistical models it’ll be easier to identify the issues you’re facing, how to debug your code and solver your problems.\nAt Exploristics we use Shiny apps to provide dynamic and interactive visualization tools to enable clients to interpret the complex multi-dimensional data or models generated by KerusCloud. At the Jumping Rivers Shiny in Production conference, I spoke about the experiences and technology to create robust enterprise grade Shiny applications. However, the remit for the Higher or Lower application was very different from how we usually develop software – this was to be a one-off application to be used at the PSI conference and we only had a couple of days for development. This mean that many of our usual processes needed to be accelerated and we had to accept some trade-offs.\nAlthough we have experience in developing Shiny apps using a new technology such as Shinyapps.io usually leads to unexpected changes that take time to resolve. The time frame was extremely short to deal with any technology issues and  address any feedback from stakeholders. However, as our preliminary research into Shinyapps.io looked promising we decided to have a go!.\n“If I have seen further than others, it is by standing upon the shoulders of giants.”\nIsaac Newton\nR and Shiny are open source and supported by a vibrant and passionate community of individuals. Without the years of effort and innovation from these individuals I would not have been able to deliver the app within our timescales. Any difficulty I faced on my part is not a criticism of these individuals but rather my experience under extremely tight time constraints that resulted in a limited amount of time to research appropriate solutions."
},
{
"objectID": "blog.html#how-should-i-structure-my-code",
"href": "blog.html#how-should-i-structure-my-code",
"title": "Welcome",
"title": "Blog",
"section": "How should I structure my code?",
"text": "How should I structure my code?\nThere are multiple ways to structure the files of a Shiny application and deciding which is the best often comes with experience or researching the best approach based upon your use case. I’d previously had the privilege of presenting along with Colin Fay at the Jumping Rivers Shiny in Production Conference and have read his book Engineering Production Grade Shiny apps but had never formally used the golem 📦. This provided me an opportunity to test out this framework and bring any lessons learnt into other Shiny apps.\nUsing the golem 📦 package for the first time was a delight, it created much of the boiler plate code for the application, provided functions to carry out common tasks and laid out the process in a systematic order to follow. This enforced good practice such as modularization of code and enabled me to rapidly write production quality code. I’ve previously developed production grade Shiny apps and was already very familiar concepts such as Shiny modules. I’d really recommend reading Colins book as it articulates and conceptualizes many of the issues I have faced. My biggest take home message from the book is – “Don’t jump straight into coding!”"
},
{
"objectID": "blog.html#how-do-i-store-and-retrieve-data",
"href": "blog.html#how-do-i-store-and-retrieve-data",
"title": "Welcome",
"title": "Blog",
"section": "How do I store and retrieve data?",
"text": "How do I store and retrieve data?\nShiny apps are transient by design and sessions don’t persist.  This means that all information is lost between using the app. Therefore, if you wish to store information that the app needs to access in the future or provide a central data store you need to provide your own persistent data storage. There’s a great article on Posit for doing providing persistent data storage. For someone used to working on a desktop computer this is an unusual concept as you always have access to your hard-drive and by in large don’t need to worry about access.\nUsually, we use AWS S3 as our storage solution, but we didn’t want set up and manage access credentials for a one off project so decided to use Googlesheets as it was well documented and the package was actively developed. Whilst we got this to work locally, we could not get the authorization to work on Shinyapps.io and so decided to use rdrop2 📦 instead.\nThe rdrop2 📦 has no maintainer on CRAN so we had some initial reservations and we had to write some custom functionality to have refresh-able credentials. This cost us over a day’s development time which in the timescales of our project was huge!\nGoing forward we will assess the Pins 📦 or use AWS S3, though the AWS solutions is not be suitable for people wanting to avoid a paid for service, although it has a free tier with limited usage."
},
{
"objectID": "blog.html#failure-to-build.what-do-you-mean",
"href": "blog.html#failure-to-build.what-do-you-mean",
"title": "Welcome",
"title": "Blog",
"section": "Failure to build….what do you mean!?",
"text": "Failure to build….what do you mean!?\nWhen working with an application, it’s a very iterative process and when you are inexperienced with the technology or rushing this can lead to lots of simple mistakes. Within a Shiny application this can mean the package fails to build, or a failure at the deployment stage or the application crashing when in use. This can be a frustrating process to those not used to it as it can take several minutes to go through these processes before realizing you’ve just nested a bracket in the wrong place!\nThis can lead to taking shortcuts in manual testing of an application which allows bugs to creep in and only manifest when in production. Structuring your application as a package allows you to leverage resources such as unit testing using testthat 📦 or shinytest2 📦 and automate the testing process, saving time and enforcing that these tests are carried out.\nIn this project, I often found that I would add a package on my computer but forget to add it to the DESCRIPTION file, this would result in the package not being accessible to the app on Shinyapps.io and failing to build and deploy. To the uninitiated this can be a frustrating experience as identifying the issue often takes much longer than implementing a solution."
},
{
"objectID": "blog.html#but-it-works-on-my-machine",
"href": "blog.html#but-it-works-on-my-machine",
"title": "Welcome",
"title": "Blog",
"section": "But it works on my machine!",
"text": "But it works on my machine!\nAnother issue that is conceptually different for those used to developing on the desktop is that different environments can result in an app working on your computer but not in the cloud. This is a very common occurrence in software development which can arise from having different or missing environment variables or the file system being different.\nOne issue that I had was that the setting of options required for the “gargle” package were silently being dropped when deployed on Shinyapps.io . This mean that locally I could get security tokens to work but they were failing on Shinyapps.io. This was a difficult issue to identify especially as the interactive debugging methods on a desktop can’t be used on a cloud-based environment. This requires the use of the logs to identify the issue."
},
{
"objectID": "blog.html#youre-not-meant-to-use-the-app-that-way",
"href": "blog.html#youre-not-meant-to-use-the-app-that-way",
"title": "Welcome",
"title": "Blog",
"section": "You’re not meant to use the app that way!",
"text": "You’re not meant to use the app that way!\nWhen you develop and subsequently test an application you have an inherent idea of how it should be used. Different people will have a range of IT abilities or understanding of terminology. This often leads to the application being used in a way you hadn’t anticipated, or they hit an unusual use case from a scenario that your testing hadn’t encountered.\nWhen testing the game I’d only played from start to finish and then redeployed with subsequent changes. What I hadn’t realized was that my application had state, I’d reset the user details after each game but not the deck of cards.  Effectively this meant a single deck of cards was used across games and eventually there were no more cards to draw from the deck – and this caused the game to crash.\nI really enjoyed making the Exploristics Higher or Lower app and I hope everyone enjoyed playing it too. Hopefully the lessons learnt by me will help you on your journey to creating interactive tools for your clients!\nFollow Exploristics on Twitter or LinkedIn to get the latest updates clinical trail simulation, interactive data visualization and the"
},
Expand All @@ -53,6 +53,6 @@
"href": "index.html",
"title": "Gareth Burns",
"section": "",
"text": "Welcome!\nThis is a my personal website that is still under construction but feel free to use the existing resources, whilst it’s being set up.\nIf you have any feedback please DM me on Twitter or LinkedIn."
"text": "Queen’s University, Belfast | Belfast, UK PhD in Computational Biology | Sept 2009 - December 2012\nQueen’s University, Belfast | Belfast, UK B.Sc Hons in Environmental Biology | Sept 2004 - June 2007"
}
]
2 changes: 1 addition & 1 deletion about.qmd
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@ There's a lot of good technical resources online but what I've found when speaki

I've found software development is a very risk averse industry. Requirements are gathered up front and making a seemingly simple change can have cascading effects on the software which leads to individuals wanting to work within very defined boundaries. Having two children of my own I've learnt that the only way to learn is to make mistakes! If you only did what you know you could do, you'd never learn to crawl, walk or talk. Children will happily fall over a dozen times in a row but eventually they'll be walking.

I've done a lot of in-house lunchtime knowledge transfer sessions, these were generally aimed at novice R users wanting to improve their analysis scripts through writing functions or packages. Bringing these together online will hopefully be of use to novice users. They're not aimed at being a definitive resource but an alternative explanation to technical documentation, providing the minimal steps people require to get a functional benefit .
I've done a lot of in-house lunchtime knowledge transfer sessions, these were generally aimed at novice R users wanting to improve their analysis scripts through writing functions or packages. Bringing these together online will hopefully be of use to novice users. They're not aimed at being a definitive resource but an alternative explanation to technical documentation, providing the minimal steps people require to get a functional benefit.
Loading

0 comments on commit faabffa

Please sign in to comment.