// from the libflitter project - app/FlitterApp.jsclass FlitterApp {constructor(unit_classes){  this.express = express()  this.units = unit_classes  this.target = unit_classes['App']  if ( !this.target ) throw new Error('Missing application start target in Units.flitter.')  this.services = []  this.directories = {}  this.d = {}  this.global = new Context(this)  this.global.bind('directories', this.directories)  this.global.bind('services', this.services)  this.global.bind('has', this.has)  this.global.bind('daemon', this.d)  this.global.bind('stop', this.stop)  this.global.bind('app', this)    global['_flitter'] = this.global.serialize()}async up(){  console.log(color.blue('Starting Flitter...'))    for (let unit_name in this.units){  const unit = this.units[unit_name]  const unit_context = new Context(this)  if ( unit === this.target ) continue  try {  this.services.push(unit.name())  this.directories = {...this.directories, ...unit.directories()}  this.global.bind('directories', this.directories)  await this.init_unit(unit, unit_context)  }  catch (error){  this.present_error(error, {  type: 'unit',  operation: 'starting',  name: unit_name,  })    // if fatal error, exit immediately  if ( error instanceof FatalError ){  process.exit(1)  }  // if stop error, try to stop gracefully  else if ( error instanceof StopError ){  process.exitCode = 1  break  }  }  }}// from the libflitter project - app/FlitterApp.jsclass FlitterApp {constructor(unit_classes){  this.express = express()  this.units = unit_classes  this.target = unit_classes['App']  if ( !this.target ) throw new Error('Missing application start target in Units.flitter.')  this.services = []  this.directories = {}  this.d = {}  this.global = new Context(this)  this.global.bind('directories', this.directories)  this.global.bind('services', this.services)  this.global.bind('has', this.has)  this.global.bind('daemon', this.d)  this.global.bind('stop', this.stop)  this.global.bind('app', this)    global['_flitter'] = this.global.serialize()}async up(){  console.log(color.blue('Starting Flitter...'))    for (let unit_name in this.units){  const unit = this.units[unit_name]  const unit_context = new Context(this)  if ( unit === this.target ) continue  try {  this.services.push(unit.name())  this.directories = {...this.directories, ...unit.directories()}  this.global.bind('directories', this.directories)  await this.init_unit(unit, unit_context)  }  catch (error){  this.present_error(error, {  type: 'unit',  operation: 'starting',  name: unit_name,  })    // if fatal error, exit immediately  if ( error instanceof FatalError ){  process.exit(1)  }  // if stop error, try to stop gracefully  else if ( error instanceof StopError ){  process.exitCode = 1  break  }  }  }}// from the libflitter project - app/FlitterApp.jsclass FlitterApp {constructor(unit_classes){  this.express = express()  this.units = unit_classes  this.target = unit_classes['App']  if ( !this.target ) throw new Error('Missing application start target in Units.flitter.')  this.services = []  this.directories = {}  this.d = {}  this.global = new Context(this)  this.global.bind('directories', this.directories)  this.global.bind('services', this.services)  this.global.bind('has', this.has)  this.global.bind('daemon', this.d)  this.global.bind('stop', this.stop)  this.global.bind('app', this)    global['_flitter'] = this.global.serialize()}async up(){  console.log(color.blue('Starting Flitter...'))    for (let unit_name in this.units){  const unit = this.units[unit_name]  const unit_context = new Context(this)  if ( unit === this.target ) continue  try {  this.services.push(unit.name())  this.directories = {...this.directories, ...unit.directories()}  this.global.bind('directories', this.directories)  await this.init_unit(unit, unit_context)  }  catch (error){  this.present_error(error, {  type: 'unit',  operation: 'starting',  name: unit_name,  })    // if fatal error, exit immediately  if ( error instanceof FatalError ){  process.exit(1)  }  // if stop error, try to stop gracefully  else if ( error instanceof StopError ){  process.exitCode = 1  break  }  }  }}

Hi, there.

My name is Garrett.

I'm a speaker, developer, and designer.

about me

Hi! My name is Garrett. Welcome to my little corner of the internet. I'm a self-taught developer and tech-nerd. I create software that I hope makes people's lives better. I created the Flitter web framework, and a couple other fun projects. I love to communicate my work, and help others pursue their projects, which is why I've got a long history of sharing about my passion. I write blog posts, create video tutorials, hold talks, and publish code from my projects in the hope that others will find it useful.

A bit more background: I grew up in the rural mid-west, so I taught myself everything I know. I'm a big fan of learning to code this way. I'm currently studying computer science at the University of Kansas.

about me

Hi! My name is Garrett. Welcome to my little corner of the internet. I'm a self-taught developer and tech-nerd. I create software that I hope makes people's lives better. I created the Flitter web framework, and a couple other fun projects. I love to communicate my work, and help others pursue their projects, which is why I've got a long history of sharing about my passion. I write blog posts, create video tutorials, hold talks, and publish code from my projects in the hope that others will find it useful.

A bit more background: I grew up in the rural mid-west, so I taught myself everything I know. I'm a big fan of learning to code this way. I'm currently studying computer science at the University of Kansas.

get in touch

I'd love to hear from you if you have questions or inquiries related to me or my projects. You can get in touch by text, e-mail, or using this form. I also tweet sometimes, and share thoughts on my blog.

E-Mail: [email protected]
Phone: (913) 730-7124

I'd love to hear from you if you have questions or inquiries related to me or my projects. You can get in touch by text, e-mail, or using this form. I also tweet sometimes, and share thoughts on my blog.

E-Mail: [email protected]
Phone: (913) 730-7124

what I've been up to

Blog Post

Blog Post

Dependency Injection in Less Than 100 Lines of Pure JavaScript

DI is a powerful pattern for segmenting code to keep it efficient and easy to reuse. In this article, we're going to build a basic DI in <100 lines of pure ES6. Read about it here.

11/16/2019, 7:18:49 PM

Blog Post

Blog Post

A New Platform - My Relentless Pursuit of Privacy

I've finally moved the home of my blog from Medium.com over to a self-hosted Hexo blog. Why? Read more here.

11/15/2019, 7:49:14 AM

Code Release

Code Release

[email protected]

This release of Flitter's auth provider brings an OAuth2 server, OAuth2 client, and refinements to the login flow structure. More details here.

11/1/2019, 4:19:46 PM

Speaking

Speaking

Computing in the Kubernetes Framework

Recently I had the pleasure of presenting at the University of Kansas' Center for Research Methods and Data Analysis Weekly Colloquium. You can find resources from my talk on using k8s for scientific computing here.

11/1/2019, 3:49:18 PM

Blog Post

Blog Post

Building a Raspberry Pi Cluster - Part 3

In the third installment of my miniature-HPC series, we discuss OpenMPI, Python3, and running parallel jobs. Read more here.

11/1/2019, 3:46:47 PM

Garrett Mills
Copyright © 2019 Garrett Mills