• I tried the mayo instead of butter trick and it worked out.

  • Using Pick<T,K> in TypeScript

    I used Pick<T,K> for the first time today in TypeScript. I had been using Partial<T> for a while to allow some properties of a class/interface to be used in other places in my application. After doing a lot more reading on TypeScript lately I decided to find a way to grab specific properties from a class/interface and lo and behold that’s what Pick<T,K> is for. I was going to do a write up on how I am using it but I found a post that sums it up quite nicely.

  • A friend just showed something cool their son made and it got me thinking about all the kids out there just getting totally obsessed with this virus. Kids who have no idea yet that this is a passion that will stick with them the rest of their lives. Future doctors, scientists, nurses, and teachers.

  • Rearranging for WFH

    Did some rearranging of my office area yesterday to accommodate my newish coworkers and classmates. I separated desks and now my side desks sits behind me with my iMac and 3D printer (and my Nanoleaf until I get more command tape). My son’s gaming PC and desk will be in front so we will share this space when he is done with school work. He’ll be in his room during school hours. I have to put together my wife’s desk and put it in the living room where my son’s desk used to be. Anyone else have to make arrangements for better WFH for all?

  • Returning Observable objects from combineLatest()

    In trying to use more Reactive patterns in Angular I have been using the combineLatest() RxJs method to combine several Observables into one Observable and using the async pipe to use the data in the template. This ensures that all of the data is available in the template by using *ngIf. One thing I did not like about using combineLatest() is that it returns an array of results back based on the array of Observables you handed to it. This made accessing this data in the template look messy and made it harder to understand what data you were accessing.

    cousePageData$: Observable<[User, Course]>;
    const user$ = getCurrentUser(); // get the current user
    const course$ = getCourse(courseId); // get course by course id
    this.cousePageData$ = combineLatest([user$, course$]);

    In the template this would result in array([ user, course ]) as a result of using the async pipe (<div *ngIf="cousePageData$ | async as cousePageData>) and you would have to access user and course using the index on the array (cousePageData[0] and cousePageData[1]). As you can see, this obfuscates what data is actually being accessed at this indexes.

    So I set out this morning to get this cleaned up in our repository and found a pretty easy solution in RxJs, using pipe and map to return the results of combineLatest() as an object.

    cousePageData$: Observable<{user: User; Course: Course;}>;
    const user$ = getCurrentUser(); // get the current user
    const course$ = getCourse(courseId); // get course by course id
    const cousePageData$ = combineLatest([user$, course$]).pipe(map(([user, course]) => ({ user, course })));

    In the template this would result in object({user: userData, course: courseData }) as a result of using the same async pipe and you can now access user and course using the property name on the object (cousePageData.user and cousePageData.course).

    Yay for less obsfucation! Let me know if you have any other ideas regarding this!

  • What is this style?

    Design and Dev friends, what is this style called?

    To me the common thread is the fonts used, the big color areas, the illustrations.




  • Do you want to develop an app?

  • We have a pandemonium of wild parrots that fly around town. Sometimes they sit outside our office and squak up a storm.

  • I love catching up with Marc and Lee on Mondays.

  • Trying out Aircar on the Oculus Link

  • Most days: “Doesn’t anybody work in this town?”

    Today: “Look all those suckas going to work”


  • Face Changing Projection Mask

    I ran across this interesting project where someone designed and built a 3D printed mask that could have whatever you want projected onto it.

  • Tachikoma From Ghost In The Shell

    I guess I hit the upper limit of my 3D printer. I’ll look into print the missing part and gluing it on. It came out great besides that part.


  • Lazy 😻

    Willow's paws peeking from under the coversEmily laying on the couch

  • My Blender experiment is looking better now. I went back into Graphic and divided the paths into just a handful of layers and layers exported each layer as an SVG. This made combining in Blender much easier. Also, converting to a mesh removed the weird blending problem that was showing up before.

  • Trying out Blender by creating a 3D model from an SVG. It’s doesn’t look right so far. 🤔

  • Millennium Falcon

    The first 3D print of the new year. The first one came out misshapen because I forgot to add supports. It came out much better this time.

    File on Thingiverse

  • New Year, Same Blog, New Posts

  • My Hour of Code Project

    Codecraft Works - Hour of Code

    Yesterday was the beginning of Computer Science Education Week. To kick things off at Codecraft Works we did a live stream from our office. I taught a lesson on CSS Filters and how you can create Instagram-like filters using them. My co-workers taught lessons on making a piano and on making a game.

  • Firebase Summit 2019
- What’s New for Firebase Web?

    I gave a lightning talk yesterday at an event I helped organize for GDG Space Coast covering what was new in Firebase for Web Applications from the Firebase Summit back in September.

    Adventures in Making Slides

    I originally did my slides in Keynote to tryout the transitions that it provides. I ran into an error when my iCloud save presentation didn't sync properly so I was stuck having to redo my slides just before and during the beginning of the event. I went to share them in this blog post and I realized with the videos I included I would need to remake my slides once again. First I had to export the slides as PowerPoint from Keynote as Google Slides doesn't support importing Keynote slides. After I imported I decided to take a look at the branding guidelines Google Developers recently pushed out to organizers of Google Developer Groups. I copied over some of the slides for my intro and thank you slide. I'll have to remember to use the provided templates as a basis for future slides.

  • Bitbucket Pipeline Failure Deploying to Firebase

    Bitbucket Pipeline Failure Deploying to Firebase

    After a recent push in our develop branch our Bitbucket pipeline was complaining that it could not deploy to Firebase. The dev team was perplexed because we had built the branch several times locally and manually deployed with no problems. Here is the command we were running:

    firebase deploy --token=$FIREBASE_DEPLOY_TOKEN --project project-name --non-interactive

    Here is the error we were receiving:

    Error: Error occurred while parsing your function triggers. Error: @grpc/grpc-js only works on Node ^8.13.0 || >=10.10.0
    at Object.
    (/opt/atlassian/pipelines/agent/build/functions/node_modules/@grpc/grpc-js/build/src/index.js:47:11)     at Module._compile
    (internal/modules/cjs/loader.js:689:30)     at Object.Module._extensions..js
    (internal/modules/cjs/loader.js:700:10)     at Module.load
    (internal/modules/cjs/loader.js:599:32)     at tryModuleLoad
    (internal/modules/cjs/loader.js:538:12)     at Function.Module._load
    (internal/modules/cjs/loader.js:530:3)     at Module.require
    (internal/modules/cjs/loader.js:637:17)     at require
    (internal/modules/cjs/helpers.js:20:18)     at Object.
    (/opt/atlassian/pipelines/agent/build/functions/node_modules/google-gax/build/src/grpc.js:37:14)     at Module._compile

    We started barking up the wrong tree and thought maybe the version of Node set in our Firebase functions was the issue. It actually turned out to be the version of Node set in our Bitbucket Pipeline YAML. We had recently updated our local dev environments to use Node v10.17.0, the LTS for version 10 of Node (Firebase is maxed out at using 10 for now). We had forgotten to update the Bitbucket image. We fixed it by updating our bitbucket-pipelines.yml in our project like so:

    image: node:10.17.0

    The new deploy ran perfectly!

  • I'll be leading 2 events this week

    First, on Thursday evening, I’ll be going over what new services and tools were announced at Google Cloud Next ‘19

    Second, on late Saturday morning, I’ll be leading a Google Study Jam where you can earn Google Cloud badges while learning how to use Google Cloud’s services. You’ll get access to free training material from Google and access to other free training if you complete the Study Jam material I share.

  • bat, a Substitute cat Command

    While watching Suz Hinton/noopkat’s Twitch stream today I noticed that when she ran the cat command it looked a little different than what I was used to. It has some subtle styling to it I had never seen before. I found out from the #noopkrew that it was the bat command, a substitute cat command with some superpowers. I brew installed it immediately and set up an alias to replace cat. Think of it as Apple’s Quick Look but for the command line. It does syntax highlighting for several filetypes including JSON and Markdown. It is also git aware and can show diffs in files. Amazing!!

  • Prevent Accidental Quitting in Chrome and VS Code

    I had already taken of this problem in Google Chrome by choosing to be warned before quitting from the Chrome menu.

    This stops Chrome from immediately quitting when you hit CMD+Q. I would do this by accident usually when trying to select all (CMD+A). I was running across this in VS Code and found an extension that will do the same thing.


  • Faster Internet…Who Dis?

    From my iPhone X

    From the iMac

subscribe via RSS