Creating useful visualizations is an important skill for data scientists. They allow us to gain new insights into our data. Dashboards are powerful tools for creating complex and interactive visualizations. You can explore data in ways static charts cannot. Bowtie is a Python library that makes it easy to create dashboards. This talk will introduce Bowtie and focus on creating dashboards and interesting features. I will also discuss deploying them, the tech stack, and future work and goals.
Talk delivered at the Munich PHP User Group. An overview of the features of Elixir that may be more interesting for a PHP developer, so we focus in the platform, the cheap processes of the Erlang Virtual Machine, the philosophy of Let It Crash and how to model problems with trees of processes, and possible use cases.
Twig: Friendly Curly Braces Invade Your Templates!Ryan Weaver
Video: http://youtu.be/Jikkiqt-nBo
Twig! Yep, it's that fancy magic that's supposed to make theming in Drupal 8 as much fun as eating beef brisket at Rudy's Country Store in Austin (apologies to my veggie friends!). And in fact, Twig was *born* for this: a language that was created with one job in mind: making writing templates awesome and powerful. Oh, and to make you love using it.
In this talk, we'll learn about Twig from the ground-up: syntax, filters, inheritance and other tricks you can learn now to be ready for Drupal 8. We'll also look at how Twig looks inside Drupal, and how it compares to what you're used to in Drupal 7.
By the end, you'll know everything to start getting your Drupal 8 theme on and be shouting its praises from the hills! Ok, maybe not that last part (but I do love how excited Drupalers get), but you'll definitely have a new friend in your world: Twig.
Details on how we capture application data in our access and error logs, as well as how to generate quick reports and graphs from these logs.
This talk was presented at O'Reilly's Velocity Online Conference on October 26, 2011.
You do not need automation engineer - Sqa Days - 2015 - ENIakiv Kramarenko
English Version of presentation for the "You don't need automation engineer" talk, given (in russian) at SQA Days 2015.
You can watch the "screencast" try-out cut at https://youtu.be/TZhbI-JPdG0
Talk delivered at the Munich PHP User Group. An overview of the features of Elixir that may be more interesting for a PHP developer, so we focus in the platform, the cheap processes of the Erlang Virtual Machine, the philosophy of Let It Crash and how to model problems with trees of processes, and possible use cases.
Twig: Friendly Curly Braces Invade Your Templates!Ryan Weaver
Video: http://youtu.be/Jikkiqt-nBo
Twig! Yep, it's that fancy magic that's supposed to make theming in Drupal 8 as much fun as eating beef brisket at Rudy's Country Store in Austin (apologies to my veggie friends!). And in fact, Twig was *born* for this: a language that was created with one job in mind: making writing templates awesome and powerful. Oh, and to make you love using it.
In this talk, we'll learn about Twig from the ground-up: syntax, filters, inheritance and other tricks you can learn now to be ready for Drupal 8. We'll also look at how Twig looks inside Drupal, and how it compares to what you're used to in Drupal 7.
By the end, you'll know everything to start getting your Drupal 8 theme on and be shouting its praises from the hills! Ok, maybe not that last part (but I do love how excited Drupalers get), but you'll definitely have a new friend in your world: Twig.
Details on how we capture application data in our access and error logs, as well as how to generate quick reports and graphs from these logs.
This talk was presented at O'Reilly's Velocity Online Conference on October 26, 2011.
You do not need automation engineer - Sqa Days - 2015 - ENIakiv Kramarenko
English Version of presentation for the "You don't need automation engineer" talk, given (in russian) at SQA Days 2015.
You can watch the "screencast" try-out cut at https://youtu.be/TZhbI-JPdG0
Best Practices in Plugin Development (WordCamp Seattle)andrewnacin
My talk -- officially named "Y U NO CODE WELL" -- at WordCamp Seattle 2011 on best practices during plugin development. Find the video, as it provides some good context and conversation.
A talk given at ElixirConf2017.
Automation is hard, but the benefits can be phenomenal. This can be especially challenging when working on your Elixir side project, as you want to see results quickly, so maybe a zero-click deploy and continuous delivery are not on your mind.
In this talk, I will help show you that even on a budget, even on a team of one you can streamline your software development to achieve some lofty goals including
This is an adaptation of the presentation given at the SpringOne 2008 conference in Hollywood, FL. It contains some updates on project status, and also information about the recently published book "Spring Python 1.1"
This slideshow is licensed under a Creative Commons Attribution 3.0 United States License.
Ultimate Node.js countdown: the coolest Application Express examplesAlan Arentsen
Node.js is hot and that's not without a reason. There are numerous examples of large websites using Node.js and there is some pretty cool stuff out there.
Since Application Express is officially 'Awesome' and Node.js is 'hot', why not combine the two? With node-oracledb and websockets you can do awesome things, but there is more Node.js has to offer!
In this presentation you will get a short introduction on Node.js. After that I will show you a handful of Node.js applications in Application Express sorted on awesomeness from cool to sub zero.
Testing Ember Apps: Managing DependencyMatthew Beale
Ember has an amazing testing story built upon the fundamentals of encapsulation and OO programming central to the framework. Despite this, every web application will be dependent upon and need to interact with native and network APIs that are hostile: Unreliable, slow, under-documented, and not to be trusted. The challenge in testing Ember applications lies with how to handle these external entities.
Remote controlling Parrot AR drone with Vaadin & Spring Boot @ GWT.createPeter Lehto
Wouldn't it be crazy to fly a small drone or helicopter with your phone or tablet running nothing but a web browser? This session will tell you all about it!
Imagine a fully functional touch based user interface for remote controlling a small drone or a helicopter. This is doable with latest experimental integrations around drone controlling backend applications over WIFI with touch based control interface built with GWT or Vaadin. During the session such a system will be presented with full technology stack starting from GWT based frontend to the actual backend controller application.
A live drone will also be flown during the talk maintaining a safe distance from the audience.
Selenide alternative in Python - Introducing Selene [SeleniumCamp 2016]Iakiv Kramarenko
Talk given on SeleniumCamp 2016 about:
- What features should a "general web test automation tool" have
- Why Selenide is the one Java
- And Selene is the other in Python
- And how to use the latter
Zend Framework and Doctrine 1 are bundled in many applications although no formal integration between both existed up to now. This talk shows how we integrated both Doctrines as a possible modelling layer for the latest Zend Framework release and merged together the combined wisdom of both communities. An in-depth preview of Doctrine 2 and ZF integration completes the topic of this talk.
After years of promoting PHPUnit I still hear it's hard to get started with unit testing. So instead of showing nice step-by-step examples on how to use PHPUnit, we're going to take an example straight from github. So I've taken the challenge to start writing tests for PHP projects that don't have unit tests in place and explain how I decide where to begin, how I approach my test strategy and how I ensure I’m covering each possible use-case (and covering the CRAP index). The goal of this presentation is to show everyone that even legacy code, spaghetti code and complex code bases can be tested. After this talk you can immediately apply my examples on your own codebase (even if it's a clean code base) and get started with testing. To follow along a basic knowledge unit testing with PHPUnit is required.
Towards the Cloud: Event-driven Architectures in PHPBenjamin Eberlei
Are you fed up with all the interdependencies in your applications? Want to be able to scale your business application across multiple servers without hassle? Event-driven architectures to the rescue! In this talk I show how to divide your tasks into small, perfectly scalable parts, empowering you to either scale with your own servers or benefit from cloud computing technologies.
Fullstack Conference - Proxies before proxies: The hidden gems of Javascript...Tim Chaplin
Tired of console.logging your way through applications? Want a way to slice through your application without adding complexity? AOP has been the answer to these questions for object oriented languages, such as Java and C#, but is not available in Javascript. ScarletJS(https://github.com/scarletjs/scarlet) is a project that tackles AOP using a clean, fluent, performant interface.
The ScarletJS project provides Javascript developers a different way of thinking about traditional javascript problems. The project is still growing and looking into the future of what ES6 proxies will open up to the Javascript community.
The talk will highlight the problems that javascript developers face with logging application behavior, security, and more. It will discuss the benefits of identifying a cross cutting concern, and programming using aspects. The talk will highlight how thinking about a project and cross cutting concerns can lead to cleaner more SOLID code. It will also discuss the future of ES6 proxies and the benefits that they will bring.
Web Performance Culture and Tools at EtsyMike Brittain
This talk covers some of the tools that Etsy uses for measuring performance, how to instill a culture of performance, how Etsy tracks performance wins and regressions, and where to get started if you don't have a formalized performance team in your company.
Originally presented at the Boston Web Performance Meetup on Aug 24, 2011.
JQuery is awesome, but with all major browsers following the ES and HTML5 specs, the library has become more of a convenience than a necessity for browser compatibility. While the library is useful and ubiquitous, it does distract us from learning the language that it's built on. This talk will outline functionalities that pure javascript provides, and also provide steps we can take to begin writing vanilla javascript applications and start appreciating the power and uniqueness of javascript.
Given at TechMaine's Java Users Group on Feb 26 2008
Why do we need another build tool when we already have Ant? By focusing on convention over configuration, Maven allows you to declaratively define how your project is built, which reduces a lot of the procedural code that you'd need to implement in every build file if you were using Ant. This, along with Maven's built-in management of repositories for project dependencies, allows you to streamline your build process. Ultimately Maven can reduce the amount of time that would otherwise be wasted hunting down jar files and fiddling with boilerplate build scripts.
This presentation covers Maven's core concepts. It introduces the Plugin architecture, and explain how the most popular plugins are used. It also covers the POM concept and how it relates to dependency tracking and repositories.
Best Practices in Plugin Development (WordCamp Seattle)andrewnacin
My talk -- officially named "Y U NO CODE WELL" -- at WordCamp Seattle 2011 on best practices during plugin development. Find the video, as it provides some good context and conversation.
A talk given at ElixirConf2017.
Automation is hard, but the benefits can be phenomenal. This can be especially challenging when working on your Elixir side project, as you want to see results quickly, so maybe a zero-click deploy and continuous delivery are not on your mind.
In this talk, I will help show you that even on a budget, even on a team of one you can streamline your software development to achieve some lofty goals including
This is an adaptation of the presentation given at the SpringOne 2008 conference in Hollywood, FL. It contains some updates on project status, and also information about the recently published book "Spring Python 1.1"
This slideshow is licensed under a Creative Commons Attribution 3.0 United States License.
Ultimate Node.js countdown: the coolest Application Express examplesAlan Arentsen
Node.js is hot and that's not without a reason. There are numerous examples of large websites using Node.js and there is some pretty cool stuff out there.
Since Application Express is officially 'Awesome' and Node.js is 'hot', why not combine the two? With node-oracledb and websockets you can do awesome things, but there is more Node.js has to offer!
In this presentation you will get a short introduction on Node.js. After that I will show you a handful of Node.js applications in Application Express sorted on awesomeness from cool to sub zero.
Testing Ember Apps: Managing DependencyMatthew Beale
Ember has an amazing testing story built upon the fundamentals of encapsulation and OO programming central to the framework. Despite this, every web application will be dependent upon and need to interact with native and network APIs that are hostile: Unreliable, slow, under-documented, and not to be trusted. The challenge in testing Ember applications lies with how to handle these external entities.
Remote controlling Parrot AR drone with Vaadin & Spring Boot @ GWT.createPeter Lehto
Wouldn't it be crazy to fly a small drone or helicopter with your phone or tablet running nothing but a web browser? This session will tell you all about it!
Imagine a fully functional touch based user interface for remote controlling a small drone or a helicopter. This is doable with latest experimental integrations around drone controlling backend applications over WIFI with touch based control interface built with GWT or Vaadin. During the session such a system will be presented with full technology stack starting from GWT based frontend to the actual backend controller application.
A live drone will also be flown during the talk maintaining a safe distance from the audience.
Selenide alternative in Python - Introducing Selene [SeleniumCamp 2016]Iakiv Kramarenko
Talk given on SeleniumCamp 2016 about:
- What features should a "general web test automation tool" have
- Why Selenide is the one Java
- And Selene is the other in Python
- And how to use the latter
Zend Framework and Doctrine 1 are bundled in many applications although no formal integration between both existed up to now. This talk shows how we integrated both Doctrines as a possible modelling layer for the latest Zend Framework release and merged together the combined wisdom of both communities. An in-depth preview of Doctrine 2 and ZF integration completes the topic of this talk.
After years of promoting PHPUnit I still hear it's hard to get started with unit testing. So instead of showing nice step-by-step examples on how to use PHPUnit, we're going to take an example straight from github. So I've taken the challenge to start writing tests for PHP projects that don't have unit tests in place and explain how I decide where to begin, how I approach my test strategy and how I ensure I’m covering each possible use-case (and covering the CRAP index). The goal of this presentation is to show everyone that even legacy code, spaghetti code and complex code bases can be tested. After this talk you can immediately apply my examples on your own codebase (even if it's a clean code base) and get started with testing. To follow along a basic knowledge unit testing with PHPUnit is required.
Towards the Cloud: Event-driven Architectures in PHPBenjamin Eberlei
Are you fed up with all the interdependencies in your applications? Want to be able to scale your business application across multiple servers without hassle? Event-driven architectures to the rescue! In this talk I show how to divide your tasks into small, perfectly scalable parts, empowering you to either scale with your own servers or benefit from cloud computing technologies.
Fullstack Conference - Proxies before proxies: The hidden gems of Javascript...Tim Chaplin
Tired of console.logging your way through applications? Want a way to slice through your application without adding complexity? AOP has been the answer to these questions for object oriented languages, such as Java and C#, but is not available in Javascript. ScarletJS(https://github.com/scarletjs/scarlet) is a project that tackles AOP using a clean, fluent, performant interface.
The ScarletJS project provides Javascript developers a different way of thinking about traditional javascript problems. The project is still growing and looking into the future of what ES6 proxies will open up to the Javascript community.
The talk will highlight the problems that javascript developers face with logging application behavior, security, and more. It will discuss the benefits of identifying a cross cutting concern, and programming using aspects. The talk will highlight how thinking about a project and cross cutting concerns can lead to cleaner more SOLID code. It will also discuss the future of ES6 proxies and the benefits that they will bring.
Web Performance Culture and Tools at EtsyMike Brittain
This talk covers some of the tools that Etsy uses for measuring performance, how to instill a culture of performance, how Etsy tracks performance wins and regressions, and where to get started if you don't have a formalized performance team in your company.
Originally presented at the Boston Web Performance Meetup on Aug 24, 2011.
JQuery is awesome, but with all major browsers following the ES and HTML5 specs, the library has become more of a convenience than a necessity for browser compatibility. While the library is useful and ubiquitous, it does distract us from learning the language that it's built on. This talk will outline functionalities that pure javascript provides, and also provide steps we can take to begin writing vanilla javascript applications and start appreciating the power and uniqueness of javascript.
Given at TechMaine's Java Users Group on Feb 26 2008
Why do we need another build tool when we already have Ant? By focusing on convention over configuration, Maven allows you to declaratively define how your project is built, which reduces a lot of the procedural code that you'd need to implement in every build file if you were using Ant. This, along with Maven's built-in management of repositories for project dependencies, allows you to streamline your build process. Ultimately Maven can reduce the amount of time that would otherwise be wasted hunting down jar files and fiddling with boilerplate build scripts.
This presentation covers Maven's core concepts. It introduces the Plugin architecture, and explain how the most popular plugins are used. It also covers the POM concept and how it relates to dependency tracking and repositories.
React is a UI library that is changing the way web applications are written. While there are many benefits to using React, managing an application's complexity as it scales is one of the most powerful.
Adding a modern twist to legacy web applicationsJeff Durta
Avoid misery of working with legacy code
We will see how you can add independent and isolated components to existing pages; pages that may be difficult to change
React and Flux allow you to make self-contained additions that handle their own data access/persistence
Marcel Prasetya (Software Engineer, Google Wave APIs Team) talks about "Google Wave API: Now and Beyond" as part of San Francisco Java User Group's November 10th, 2009 meetup event held in San Francisco, CA at Google Inc.
http://www.sfjava.org/calendar/11573532/
Sponsored By: TEKsystems Inc., Marakana Inc., Packt Publishing Ltd., and JetBrains Inc.
Organized and Recorded By: Marakana Inc.
Using prime[31] to connect your unity game to azure mobile servicesDavid Voyles
Using prime[31] to connect your unity game to azure mobile services. More info at my blog: http://davevoyles.azurewebsites.net/prime31-azure-plugin-win8-wp8-unity-games-part-3/
Shift Remote: Mobile - Devops-ify your life with Github Actions - Nicola Cort...Shift Conference
What's the first thing you should do when starting a new project...? Setup a good CI system! With Github Actions you can do it in a couple of seconds. You can easily setup a workflow to build your project, test it on different machines, and deploy the results. In this talk we're going to see how you can setup a simple Github Action for your repository and start enjoying it right after.
Modern Release Engineering in a Nutshell - Why Researchers should Care!Bram Adams
Invited talk at the Leaders of Tomorrow Symposium of the 23rd IEEE International Conference on Software Analysis, Evolution, and Reengineering (SANER 2016).
The presentation (and its accompanying paper, see http://mcis.polymtl.ca/publications/2016/fose.pdf) explain the basics of release engineering pipelines, common challenges industry is facing as well as pitfalls software engineering researchers are falling into.
Speakers are Bram Adams (MCIS, http://mcis.polymtl.ca) and Shane McIntosh (McGill University, http://shanemcintosh.org).
A video-taped version of the talk will be available soon at https://www.youtube.com/channel/UCL8yG6qpHk7V66l1Jt3aZrA/featured.
Meteor Deep Dive – Reactive Programming With Tracker
As a Meteor developer, I believe that everyone who has worked with Meteor all had experience with Tracker, or at least used it through some kinds of interfaces like getMeteordata or createContainer which come with the react-meteor-data package.
However, not all people know how Tracker works its magic. In this post, I’m going to dig into every facet of this case as well as bring to you a little bit of background knowledge.
Esta charla comprende las lecciones aprendidas convirtiendo la app de Android de Teambox (una app repleta de deuda técnica y con un alto nivel de acoplamiento entre clases), en la versión actual de Redbooth, que intenta cumplir la arquitectura Hexagonal y los principios SOLID. Durante la exposición explicaremos como fuimos desenredando el código paso a paso; como aplicamos por partes los conceptos de la arquitectura hexagonal; como dejamos de lado componentes del framework de Android que dificultaban el mantenimiento de la app; y que errores cometimos, como los solucionamos y como se podrían haber evitado.
"Full Stack frameworks or a story about how to reconcile Front (good) and Bac...Fwdays
Probably every backend developer had to face the frontend. I am sure that this interaction did not always end without mental trauma. However, today, thanks to Full Stack frameworks, we can forget about this headache, because we have the opportunity to describe and generate a frontend on the PHP side.
This is the support of a course to teach React programming for Java and C# programmers. It covers from its origins in Facebook til separation of presentational and container components. What is JSX, rules, state, props, refactoring, conditionals, repeats, forms, synchronizing values, composition, and so on.
Understanding Framework Architecture using Eclipseanshunjain
Talk on Framework architectures given at SAP Labs India for Eclipse Day India 2011 - Code attached Here: https://sites.google.com/site/anshunjain/eclipse-presentations
React-Native components are awesome. But you can also extend the library yourself by creating a native component, using a bridge between the platform API (iOS, Android) and Javascript.
Demo code is here: https://github.com/jgrancher/talk-rncc
Levelwise PageRank with Loop-Based Dead End Handling Strategy : SHORT REPORT ...Subhajit Sahu
Abstract — Levelwise PageRank is an alternative method of PageRank computation which decomposes the input graph into a directed acyclic block-graph of strongly connected components, and processes them in topological order, one level at a time. This enables calculation for ranks in a distributed fashion without per-iteration communication, unlike the standard method where all vertices are processed in each iteration. It however comes with a precondition of the absence of dead ends in the input graph. Here, the native non-distributed performance of Levelwise PageRank was compared against Monolithic PageRank on a CPU as well as a GPU. To ensure a fair comparison, Monolithic PageRank was also performed on a graph where vertices were split by components. Results indicate that Levelwise PageRank is about as fast as Monolithic PageRank on the CPU, but quite a bit slower on the GPU. Slowdown on the GPU is likely caused by a large submission of small workloads, and expected to be non-issue when the computation is performed on massive graphs.
Opendatabay - Open Data Marketplace.pptxOpendatabay
Opendatabay.com unlocks the power of data for everyone. Open Data Marketplace fosters a collaborative hub for data enthusiasts to explore, share, and contribute to a vast collection of datasets.
First ever open hub for data enthusiasts to collaborate and innovate. A platform to explore, share, and contribute to a vast collection of datasets. Through robust quality control and innovative technologies like blockchain verification, opendatabay ensures the authenticity and reliability of datasets, empowering users to make data-driven decisions with confidence. Leverage cutting-edge AI technologies to enhance the data exploration, analysis, and discovery experience.
From intelligent search and recommendations to automated data productisation and quotation, Opendatabay AI-driven features streamline the data workflow. Finding the data you need shouldn't be a complex. Opendatabay simplifies the data acquisition process with an intuitive interface and robust search tools. Effortlessly explore, discover, and access the data you need, allowing you to focus on extracting valuable insights. Opendatabay breaks new ground with a dedicated, AI-generated, synthetic datasets.
Leverage these privacy-preserving datasets for training and testing AI models without compromising sensitive information. Opendatabay prioritizes transparency by providing detailed metadata, provenance information, and usage guidelines for each dataset, ensuring users have a comprehensive understanding of the data they're working with. By leveraging a powerful combination of distributed ledger technology and rigorous third-party audits Opendatabay ensures the authenticity and reliability of every dataset. Security is at the core of Opendatabay. Marketplace implements stringent security measures, including encryption, access controls, and regular vulnerability assessments, to safeguard your data and protect your privacy.
Data Centers - Striving Within A Narrow Range - Research Report - MCG - May 2...pchutichetpong
M Capital Group (“MCG”) expects to see demand and the changing evolution of supply, facilitated through institutional investment rotation out of offices and into work from home (“WFH”), while the ever-expanding need for data storage as global internet usage expands, with experts predicting 5.3 billion users by 2023. These market factors will be underpinned by technological changes, such as progressing cloud services and edge sites, allowing the industry to see strong expected annual growth of 13% over the next 4 years.
Whilst competitive headwinds remain, represented through the recent second bankruptcy filing of Sungard, which blames “COVID-19 and other macroeconomic trends including delayed customer spending decisions, insourcing and reductions in IT spending, energy inflation and reduction in demand for certain services”, the industry has seen key adjustments, where MCG believes that engineering cost management and technological innovation will be paramount to success.
MCG reports that the more favorable market conditions expected over the next few years, helped by the winding down of pandemic restrictions and a hybrid working environment will be driving market momentum forward. The continuous injection of capital by alternative investment firms, as well as the growing infrastructural investment from cloud service providers and social media companies, whose revenues are expected to grow over 3.6x larger by value in 2026, will likely help propel center provision and innovation. These factors paint a promising picture for the industry players that offset rising input costs and adapt to new technologies.
According to M Capital Group: “Specifically, the long-term cost-saving opportunities available from the rise of remote managing will likely aid value growth for the industry. Through margin optimization and further availability of capital for reinvestment, strong players will maintain their competitive foothold, while weaker players exit the market to balance supply and demand.”
06-04-2024 - NYC Tech Week - Discussion on Vector Databases, Unstructured Data and AI
Discussion on Vector Databases, Unstructured Data and AI
https://www.meetup.com/unstructured-data-meetup-new-york/
This meetup is for people working in unstructured data. Speakers will come present about related topics such as vector databases, LLMs, and managing data at scale. The intended audience of this group includes roles like machine learning engineers, data scientists, data engineers, software engineers, and PMs.This meetup was formerly Milvus Meetup, and is sponsored by Zilliz maintainers of Milvus.
Chatty Kathy - UNC Bootcamp Final Project Presentation - Final Version - 5.23...John Andrews
SlideShare Description for "Chatty Kathy - UNC Bootcamp Final Project Presentation"
Title: Chatty Kathy: Enhancing Physical Activity Among Older Adults
Description:
Discover how Chatty Kathy, an innovative project developed at the UNC Bootcamp, aims to tackle the challenge of low physical activity among older adults. Our AI-driven solution uses peer interaction to boost and sustain exercise levels, significantly improving health outcomes. This presentation covers our problem statement, the rationale behind Chatty Kathy, synthetic data and persona creation, model performance metrics, a visual demonstration of the project, and potential future developments. Join us for an insightful Q&A session to explore the potential of this groundbreaking project.
Project Team: Jay Requarth, Jana Avery, John Andrews, Dr. Dick Davis II, Nee Buntoum, Nam Yeongjin & Mat Nicholas
Quantitative Data AnalysisReliability Analysis (Cronbach Alpha) Common Method...2023240532
Quantitative data Analysis
Overview
Reliability Analysis (Cronbach Alpha)
Common Method Bias (Harman Single Factor Test)
Frequency Analysis (Demographic)
Descriptive Analysis
5. Who am I?
Computer Engineer turned "Data Scientist".
Work at energy analytics startup, Verdigris Technologies.
3 / 50
6. Who am I?
Computer Engineer turned "Data Scientist".
Work at energy analytics startup, Verdigris Technologies.
Heavy Python user for 3-5 years.
3 / 50
7. Who am I?
Computer Engineer turned "Data Scientist".
Work at energy analytics startup, Verdigris Technologies.
Heavy Python user for 3-5 years.
I'm not a frontend developer.
3 / 50
16. Agenda
Motivation
A quick start
Rapid prototyping tips
Advanced features
How to deploy
Tech stack
Future work and goals
Will not be discussing similar tools.
4 / 50
28. Initial Thoughts
Plotly charts have lots of events: selection, click, and hover.
Just need to communicate between Python and JS in browser.
8 / 50
29. Initial Thoughts
Plotly charts have lots of events: selection, click, and hover.
Just need to communicate between Python and JS in browser.
Socket.io seems like it could do the trick.
8 / 50
30. Initial Thoughts
Plotly charts have lots of events: selection, click, and hover.
Just need to communicate between Python and JS in browser.
Socket.io seems like it could do the trick.
That's good enough for a proof of concept.
8 / 50
34. Your First Bowtie App
Each app has three parts
Choose the components in your app.
10 / 50
35. Your First Bowtie App
Each app has three parts
Choose the components in your app.
Write the callbacks (in response to events).
10 / 50
36. Your First Bowtie App
Each app has three parts
Choose the components in your app.
Write the callbacks (in response to events).
Layout the components and connect everything.
10 / 50
38. First we need some prereqs
Need Node to get us yarn and webpack.
$ brew install node
$ npm install -g webpack
$ brew install yarn
Sorry for the MacOS bias.
11 / 50
39. First we need some prereqs
Need Node to get us yarn and webpack.
$ brew install node
$ npm install -g webpack
$ brew install yarn
Sorry for the MacOS bias.
Install Bowtie.
$ pip install bowtie
Works on Python 2 and 3
11 / 50
43. Select the components
These are the widgets that exist in your app.
Full list of components on readthedocs.
13 / 50
44. Select the components
These are the widgets that exist in your app.
Full list of components on readthedocs.
Split into two categories: visual widgets and controller widgets.
13 / 50
45. Select the components
These are the widgets that exist in your app.
Full list of components on readthedocs.
Split into two categories: visual widgets and controller widgets.
Visual: Plotly, SVG (matplotlib), Tables
13 / 50
46. Select the components
These are the widgets that exist in your app.
Full list of components on readthedocs.
Split into two categories: visual widgets and controller widgets.
Visual: Plotly, SVG (matplotlib), Tables
Controllers: DatePickers, Dropdown, Text, Sliders, Toggle, and a Button.
13 / 50
47. Select the components
These are the widgets that exist in your app.
Full list of components on readthedocs.
Split into two categories: visual widgets and controller widgets.
Visual: Plotly, SVG (matplotlib), Tables
Controllers: DatePickers, Dropdown, Text, Sliders, Toggle, and a Button.
from bowtie.visual import Plotly
from bowtie.control import Dropdown
plot = Plotly()
ddown = Dropdown()
13 / 50
49. What do these components do?
Instructions for displaying itself in a webpage.
14 / 50
50. What do these components do?
Instructions for displaying itself in a webpage.
Commands, pre xed with do_, to update the state of the widget.
14 / 50
51. What do these components do?
Instructions for displaying itself in a webpage.
Commands, pre xed with do_, to update the state of the widget.
Events, pre xed with on_, to run python in response to.
14 / 50
52. What do these components do?
Instructions for displaying itself in a webpage.
Commands, pre xed with do_, to update the state of the widget.
Events, pre xed with on_, to run python in response to.
Getters, pre xed with get, gets the current states of the widget.
14 / 50
53. What do these components do?
Instructions for displaying itself in a webpage.
Commands, pre xed with do_, to update the state of the widget.
Events, pre xed with on_, to run python in response to.
Getters, pre xed with get, gets the current states of the widget.
For example: Dropdown docs.
14 / 50
55. De ne the callbacks
We'll de ne functions to get run when events happen.
15 / 50
56. De ne the callbacks
We'll de ne functions to get run when events happen.
import plotlywrapper as pw
def callback(item):
chart = pw.line(range(item['value']))
plot.do_all(chart.dict)
15 / 50
57. De ne the callbacks
We'll de ne functions to get run when events happen.
import plotlywrapper as pw
def callback(item):
chart = pw.line(range(item['value']))
plot.do_all(chart.dict)
We'll run this function in response to a dropdown event.
15 / 50
58. De ne the callbacks
We'll de ne functions to get run when events happen.
import plotlywrapper as pw
def callback(item):
chart = pw.line(range(item['value']))
plot.do_all(chart.dict)
We'll run this function in response to a dropdown event.
The passed object for this dropdown is a dictionary with two keys: "label" and "value".
15 / 50
59. De ne the callbacks
We'll de ne functions to get run when events happen.
import plotlywrapper as pw
def callback(item):
chart = pw.line(range(item['value']))
plot.do_all(chart.dict)
We'll run this function in response to a dropdown event.
The passed object for this dropdown is a dictionary with two keys: "label" and "value".
To update the plot we call the do_all method.
15 / 50
61. Layout the App
We've chosen the components and de ned the functionality. Now we just need to connect events to
functions and lay out the widgets.
16 / 50
62. Layout the App
We've chosen the components and de ned the functionality. Now we just need to connect events to
functions and lay out the widgets.
from bowtie import command
@command
def build():
from bowtie import Layout
layout = Layout()
layout.add(plot)
layout.add_sidebar(ddown)
layout.subscribe(callback, ddown.on_change)
layout.build()
16 / 50
63. Layout the App
from bowtie import command
The command decorator turns this function into a command line interface.
@command
def build():
from bowtie import Layout
layout = Layout()
layout.add(plot)
layout.add_sidebar(ddown)
layout.subscribe(callback, ddown.on_change)
layout.build()
17 / 50
64. Layout the App
from bowtie import command
@command
def build():
from bowtie import Layout
layout = Layout()
These add* calls place widgets into our app.
layout.add(plot)
layout.add_sidebar(ddown)
layout.subscribe(callback, ddown.on_change)
layout.build()
18 / 50
65. Layout the App
from bowtie import command
@command
def build():
from bowtie import Layout
layout = Layout()
layout.add(plot)
layout.add_sidebar(ddown)
subscribe makes sure the callback gets run in response to the given event.
layout.subscribe(callback, ddown.on_change)
layout.build()
19 / 50
66. Layout the App
from bowtie import command
@command
def build():
from bowtie import Layout
layout = Layout(debug=True)
layout.add(plot)
layout.add_sidebar(ddown)
layout.subscribe(callback, ddown.on_change)
Finally, build compiles the app for us.
layout.build()
20 / 50
69. Build and Serve
We're done writing the app, time to build and run it.
The CLI we have gives us these commands:
Commands:
build Write the app, downloads the packages, and...
dev Recompile the app for development.
prod Recompile the app for production.
serve Serve the Bowtie app.
21 / 50
70. Build and Serve
We're done writing the app, time to build and run it.
The CLI we have gives us these commands:
Commands:
build Write the app, downloads the packages, and...
dev Recompile the app for development.
prod Recompile the app for production.
serve Serve the Bowtie app.
$ ./app.py build
21 / 50
71. Build and Serve
We're done writing the app, time to build and run it.
The CLI we have gives us these commands:
Commands:
build Write the app, downloads the packages, and...
dev Recompile the app for development.
prod Recompile the app for production.
serve Serve the Bowtie app.
$ ./app.py build
$ ./app.py serve
21 / 50
77. Rapid prototyping
Set Layout(debug=True)! Enables live code reloading on write.
Minimize builds by architecting app at the beginning.
Use debuggers or prints to learn the payload.
def select(points):
one of the following:
print(points)
import ipdb; ipdb.set_trace()
import IPython; IPython.embed()
import wdb; wdb.set_trace()
25 / 50
80. Listening to Plotly Events
Plotly is a featureful Javascript charting library.
27 / 50
81. Listening to Plotly Events
Plotly is a featureful Javascript charting library.
It has several events and Bowtie exposes three event types: selection, click, and hover.
27 / 50
82. Listening to Plotly Events
Plotly is a featureful Javascript charting library.
It has several events and Bowtie exposes three event types: selection, click, and hover.
The data it returns is not well documented, but it's not too hard to gure out.
27 / 50
84. Subscribe to Multiple Events
A common use-case is for a function to use the output from several widgets.
28 / 50
85. Subscribe to Multiple Events
A common use-case is for a function to use the output from several widgets.
Cumbersome to write individual callbacks for each event and get the other widgets' states.
def foo(a,b):
pass
def cb1(a):
b = b.get()
foo(a,b)
def cb2(b):
a = a.get()
foo(a,b)
28 / 50
86. Subscribe to Multiple Events
A common use-case is for a function to use the output from several widgets.
Cumbersome to write individual callbacks for each event and get the other widgets' states.
def foo(a,b):
pass
def cb1(a):
b = b.get()
foo(a,b)
def cb2(b):
a = a.get()
foo(a,b)
A better way is to subscribe callbacks to multiple events.
28 / 50
87. Subscribe to Multiple Events
A common use-case is for a function to use the output from several widgets.
Cumbersome to write individual callbacks for each event and get the other widgets' states.
def foo(a,b):
pass
def cb1(a):
b = b.get()
foo(a,b)
def cb2(b):
a = a.get()
foo(a,b)
A better way is to subscribe callbacks to multiple events.
def func(item1, item2, switch):
cool_stuff()
...
layout.subscribe(func, ddown1.on_select, ddown2.on_select, switch.on_switch)
28 / 50
90. Scheduling and Loading Events
Bowtie also de nes intrinsic event types.
Instruct a function to run when a user loads the page.
layout.load(func)
29 / 50
91. Scheduling and Loading Events
Bowtie also de nes intrinsic event types.
Instruct a function to run when a user loads the page.
layout.load(func)
Instruct a function to run periodically.
layout.schedule(5, func) # call func every 5 seconds
29 / 50
93. Storing data with the client
In some cases it's helpful to be able to store data with the client.
30 / 50
94. Storing data with the client
In some cases it's helpful to be able to store data with the client.
Could store it server-side, but that's more setup.
30 / 50
95. Storing data with the client
In some cases it's helpful to be able to store data with the client.
Could store it server-side, but that's more setup.
So we'll just send the data to the client and have them hold it.
30 / 50
96. Storing data with the client
In some cases it's helpful to be able to store data with the client.
Could store it server-side, but that's more setup.
So we'll just send the data to the client and have them hold it.
bowtie.cache gives a "key-value" store to save any python objects.
30 / 50
97. Storing data with the client
In some cases it's helpful to be able to store data with the client.
Could store it server-side, but that's more setup.
So we'll just send the data to the client and have them hold it.
bowtie.cache gives a "key-value" store to save any python objects.
Helpful to store results from expensive computations or client speci c data.
bowtie.cache.save(key, value)
value = bowtie.cache.load(key)
30 / 50
100. Progress Indicators
All visual widgets have an attached progress indicator.
By default they are invisible so they don't get in your way.
31 / 50
101. Progress Indicators
All visual widgets have an attached progress indicator.
By default they are invisible so they don't get in your way.
Really helpful for long computations or slow I/O.
31 / 50
102. Progress Indicators
All visual widgets have an attached progress indicator.
By default they are invisible so they don't get in your way.
Really helpful for long computations or slow I/O.
Can also indicate error states.
31 / 50
105. Leverage CSS Grid
New web standard to de ne grids on a page.
Bowtie uses this and makes a "pythonic" API.
32 / 50
106. Leverage CSS Grid
New web standard to de ne grids on a page.
Bowtie uses this and makes a "pythonic" API.
CSS Grid was just released onto major browsers.
32 / 50
107. Leverage CSS Grid
New web standard to de ne grids on a page.
Bowtie uses this and makes a "pythonic" API.
CSS Grid was just released onto major browsers.
Chrome >= 57, Firefox >= 52, Safari >= 10.1, Opera >= 44
32 / 50
109. Leverage CSS Grid
Layout class lets you specify how many rows and columns in the grid.
call .add method and optionally specify which cells in the grid.
33 / 50
110. Leverage CSS Grid
Layout class lets you specify how many rows and columns in the grid.
call .add method and optionally specify which cells in the grid.
Widgets can span 1 or multiple cells.
33 / 50
111. Leverage CSS Grid
Layout class lets you specify how many rows and columns in the grid.
call .add method and optionally specify which cells in the grid.
Widgets can span 1 or multiple cells.
Rows and columns can be sized on pixels, percentage, and fraction of available space.
33 / 50
114. Authentication
Flask makes it easy to support basic authentication.
Want to have a generic authentication solution.
34 / 50
115. Authentication
Flask makes it easy to support basic authentication.
Want to have a generic authentication solution.
I'm not a security expert so don't trust me.
34 / 50
121. Deploying
Heroku is an easy option.
Set Layout(debug=False)
Compile with production.
$ python app.py prod
Reduces JS bundle size by a factor of ~30 (from 30MB to 1MB).
37 / 50
122. Deploying
Heroku is an easy option.
Set Layout(debug=False)
Compile with production.
$ python app.py prod
Reduces JS bundle size by a factor of ~30 (from 30MB to 1MB).
Commit the following les
build/src/server.py
build/src/templates/index.html
build/src/static/bundle.js.gz
37 / 50
127. Flask-SocketIO
Bowtie is built on Flask and Flask-SocketIO.
Bowtie abstracts away most of Flask.
You can still bene t from the Flask ecosystem.
39 / 50
128. Flask-SocketIO
Bowtie is built on Flask and Flask-SocketIO.
Bowtie abstracts away most of Flask.
You can still bene t from the Flask ecosystem.
Kind of wish the user still touched Flask because it's a great API.
39 / 50
131. React
Nick Kridler (author of Pyxley) wrote about using React with Python.
Frontend is written entirely in React.
40 / 50
132. React
Nick Kridler (author of Pyxley) wrote about using React with Python.
Frontend is written entirely in React.
Making a new widget means making a new React class that communicates via socket.io.
40 / 50
135. Talking through SocketIO
All communication between Python and Javascript is through SocketIO
Unique events are created by combining the component id with the type of message.
41 / 50
136. Talking through SocketIO
All communication between Python and Javascript is through SocketIO
Unique events are created by combining the component id with the type of message.
For example: the event for updating Plotly is "{id}#all"
41 / 50
137. Talking through SocketIO
All communication between Python and Javascript is through SocketIO
Unique events are created by combining the component id with the type of message.
For example: the event for updating Plotly is "{id}#all"
Message payloads are encoded with msgpack to reduce payload size.
41 / 50
141. Javascript Tools
Yarn: for installing npm packages.
Webpack: for bundling the npm packages.
Leaky abstraction, but I don't want to turn bowtie into a node delivery device.
42 / 50
144. Some things I don't like
You need to recompile your app to run it (when you make architectural changes) which takes a minute.
44 / 50
145. Some things I don't like
You need to recompile your app to run it (when you make architectural changes) which takes a minute.
Compared to some other tools, Bowtie is not as snappy.
44 / 50
146. Some things I don't like
You need to recompile your app to run it (when you make architectural changes) which takes a minute.
Compared to some other tools, Bowtie is not as snappy.
Perhaps too much magic happening behind the scenes, harder for users to change things and x issues.
44 / 50
156. Goals and Future Work
Become Shiny!
Okay, but seriously.
47 / 50
157. Goals and Future Work
Become Shiny!
Okay, but seriously.
Needs to be more robust, have better testing.
47 / 50
158. Goals and Future Work
Become Shiny!
Okay, but seriously.
Needs to be more robust, have better testing.
Make it easier to scale and deploy.
47 / 50
159. Goals and Future Work
Become Shiny!
Okay, but seriously.
Needs to be more robust, have better testing.
Make it easier to scale and deploy.
More charting libraries.
47 / 50
160. Goals and Future Work
Become Shiny!
Okay, but seriously.
Needs to be more robust, have better testing.
Make it easier to scale and deploy.
More charting libraries.
More widgets.
47 / 50
161. Goals and Future Work
Become Shiny!
Okay, but seriously.
Needs to be more robust, have better testing.
Make it easier to scale and deploy.
More charting libraries.
More widgets.
Make it look nicer?
47 / 50
162. Goals and Future Work
Become Shiny!
Okay, but seriously.
Needs to be more robust, have better testing.
Make it easier to scale and deploy.
More charting libraries.
More widgets.
Make it look nicer?
Jupyter integration (possible?)
47 / 50
163. My Real Goal
Whether Bowtie becomes the Shiny of Python or not, I simply
want to move the bar forward.
48 / 50
164. Thanks
To my Verdigris colleagues for feedback.
Danny Servén
Jared Kruzek
Martin Chang
Michael Roberts
To Je for letting me present.
49 / 50