al

CSS Vertical Centering – Everything You Need To Know

Getting content to center perfectly within an element and then ensuring it responds properly at different screen sizes is one of the biggest challenges that still face front-end designers. It is not that it is difficult, but because there are several ways to go about it, figuring out which method is best can be confusing. […]


The post CSS Vertical Centering – Everything You Need To Know appeared first on Web Designer Wall.




al

Tutorial: Trendy Splitscreen Layout With CSS3 Animations (Pt. 1)

There is no better time than the end of the year for some fresh inspiration! One of the most popular trends this year, features splitscreen layouts, lots of white space, clean typography and subtle effects. With this playful trend in mind, I’ve created a two-part tutorial to show you how to use flexbox, 3D transforms […]


The post Tutorial: Trendy Splitscreen Layout With CSS3 Animations (Pt. 1) appeared first on Web Designer Wall.




al

Tutorial: Duo Layout With CSS3 Animations & Transitions (Pt. 2)

Last week I demonstrated how to build a split-screen website layout using CSS flexbox and viewport units that offers an alternative way to present a brand’s featured content. Clicking on one side or the other navigates further into the site without a page load, using CSS transitions and 3d transforms. This week, I’ll show you […]


The post Tutorial: Duo Layout With CSS3 Animations & Transitions (Pt. 2) appeared first on Web Designer Wall.




al

Upper Yosemite Falls & Half Dome Moonbow

This past week was the optimal time to photograph moonbows in Yosemite Valley. I revisited photographing the moonbow at Upper Yosemite Falls as I had last year, but this time there was considerable more water and as a result the moonbow (rainbow by moonlight) was more easily seen. It was considerably larger, more vivid in color and wider arching. Conditions were great and at times a little too good as the 3 cameras I set up were completely drenched. If you’d like to read about what it took to get this photo be sure to check out my last blog post, Upper Yosemite Falls Moonbow – Getting The Shot, as it goes into a lot of detail about the hike and the challenges I faced.  If you’re curious about gear and settings this was taken with a Canon 5D Mark IV and Canon 11-24mm f/4 lens. Settings were ISO 640, 15 seconds at f/4.





al

Best Photos of 2017 by JMG-Galleries Blog Readers

Get ready to start 2018 off on the right foot with some creative inspiration. The results of my 11th annual Best of Photos project hopefully will provide just that by introducing you to photographers and their work from all over the world. Get ready to travel around the world in 100+ links. For those who are new to my blog project, photographers taking part span the gamut of photo enthusiasts to professionals. The great thing about photography is that no matter what your skill level we all can relate equally in our love for the art of photography and visually exploring. With that in mind I encourage you to reach out to photographers whose work you enjoy to keep sharing & growing as an artist.  I am incredibly thankful that this tradition has been embraced and enjoy seeing how familiar faces have evolved their work & grown over the years.  I hope reviewing your best photos of the year and comparing them to years pasts keeps you inspired and aware of your progress as a photographer. If you’d like to take part next year and be informed when submissions open for the “Best Photos of 2017? blog project add your name to my mail list. You won’t be spammed. I send out newsletters quite infrequently. Thank to everyone who took part!  I invite you to visit each link below as I have and introduce yourself to many of the participating photographers. Best Photos of 2017 Jim M. Goldstein – Best Photos of 2017 by Jim M. Goldstein Randy Langstraat – My Ten Favorite Photos of 2017 Michael Russell – My Top 10 Photos of 2017 Phil Colla – Best Natural History Photos of 2017 Greg Russell | Alpenglow Images – 2017 year in review Mike Matenkosky – My Favorite Photos from 2017 Khürt Williams – 2017 Favourites Carl Donohue – Expeditions Alaska Kevin Ly – Kevin Ly | Best of 2017 Martin Quinn – Quinn Images – Best of 2017 Robin Mayoff – RHM Images Best of 2017 Craig L. Howe – On the Move Johann A. Briffa – 2017: A Photographic Retrospective Harold Davis – Harold Davis—My Best of 2017 Denise Goldberg – top photos :: 2017 William Bean – Bill’s Blog Greg Clure – Best Images of 2017 Rick Holliday – Best Images of 2017 Peter Carroll – Peter Carroll – Favourites of 2017 Mike Chowla – My 10 Best Photos of 2017 Wendy M. Seagren – wendy seagrens best photography 2017 QT Luong – 2017 in Review, Favorites, and Seasons Greetings Jenni Brehm – Changing Perspectives Rachel Cohen – Rachel Cohen Photography Brian Knott (FMKphoto) – 2017 year in review Shikha Shrivastava – My favorite photos of 2017 Dave Wilson – Dave Wilson Photography – Best of 2017 Larry Millican – Millican Photography Alexander S. Kunz – My Favorite Photos from 2017 Mark Duffy – 500px Stefan Baeurle – Top 10 Favorites of 2017 Adrian Klein – Favorite Photos of 2017 Alan Majchrowicz – Photo Highlights 2017 Russ Bishop – Russ Bishop Photography | 2017 – The Year in Pictures Todd Henson – Best Photos of 2017: My Favorites of the Year Peter Tellone – My 2017 Top Ten Best Images Aaron Hockley – thisGruntled – Best Photos of 2017 Tony Wu – Favorite Photos of 2017 T.M. Schultze – T.M. Schultze Website Andrew S. Gibson – My Favorite Photos From 2017 John Pemberton – JPSquared – Images of 2017 Scott Thompson – Scott Shots Photography’s Top 10 Tahoe photos of 2017 ElDuro Tuco – ElDuro Tuco The DarkSlides – The DarkSlides Jon McCormack – From Ancient Cities to Endangered Animals – 2017 in Photographs Fred Mertz Photography – Fred Mertz Photography Richard Valenti – Richard Valenti Photography Jeff Hubbard – My Favorite Photos of 2017 Andrew Scharlot – 2017 Best Pictures Deb Snelson – Favorite Photos of 2017 Richard Wong – Favorite Photos From 2017 – Richard Wong Caleb Weston – Dubland Gary Crabbe / Enlightened Images – My Favorite Landscape Photos of 2017 – A Year-End Retrospective Tom Whelan – Nature Diary Robert Varley – Robert Varley Kyle Jones – Favorites from 2017 Neil Creek – Neil Creek – Photographer tim fiddimore – North Devon 2017 Richard Murphy Photography – Best of 2017 Alan Dahl – Favorites of 2017 Gabor Ruff – Natural History Photography – Highlights from 2017 Kevin Ebi – Living Wilderness: Best of 2017 Clint Losee – 10 Best Landscape and Scenic Photos of 2017 Mark Hespenheide – Best of ’17 Ilias Katsouras – Okrivadas David J Grenier – 2017 Top 12 Photographs J. J. RAIA – 2017 Jim Goldstein Project Rob Tilley – Best of 2017 – My Favorite Images of the Year Björn Göhringer – Top 14 From 2017 Bernt-Inge Madsen – Bernt-Inge.com USKestrel Photography (Pete Miller) – My favorite images of 2017: A Different Perspective Milan Hutera – 2017 in Pictures Fred Murphy – Fred Murphy Photography Harry Hitzeman – My Top Photographs of 2017 Andrew Thomas – Best of 2017 – Aerials Dean Foster – 2017: Year in Review Simon Ng – 2017 A Year of Water Michael Katz – Michael Katz Photography Drake Dyck – Top Ten (favourite) Images of 2017 Jose Manuel Santos – The Magnificent Douro Valley Gary Buzel – Gary Buzel Studios Bryan William Jones – Top Photos of 2017 Peter Knott – 2017 Favourites Kamala Venkatesh – Kamala Venkatesh Jason Frye – My Top 10 of 2017 Jackson Frishman – Favorites of 2017 Thomas Yackley – Top Ten Landscape and Nature Photos of 2017 Mark Graf – 2017 – A Year of Despair and Dragons Kurt Lawson – 10ish Favorites of 2017 Jorge Ramirez – Selection 2017 William Neill – William Neill’s Light on the Landscape Photoblog Daniel Leu – Favorites – 2017 Derrald Farnsworth-Livingston – Top 10 Favorite Images from 2017 ~ Journey of Light Photography Mike Christoferson – 2017 Has Come and Gone Carol Schiraldi – Best of 2017 – My Top Images Robin Black – My 10 best photos (or personal favorites, anyway) of 2017 Bryn Tassell – […]




al

Best Photos of 2018 by JMG-Galleries Blog Readers

I’m excited to share the results of my 12th annual Best of Photos project.  115 photographers from around the world (amateur and professional alike) have shared their best photos of 2018.  I’m always amazed at the quality of work shared and I hope it’s a source inspiration to you for the coming year. For those who are new to my blog project, photographers taking part span the gamut of photo enthusiasts to professionals. The great thing about photography is that no matter what your skill level we all can relate equally in our love for the art of photography and visually exploring. With that in mind I encourage you to reach out to photographers whose work you enjoy to keep sharing & growing as an artist.  I am incredibly thankful that this tradition has been embraced and enjoy seeing how familiar faces have evolved their work & grown over the years.  I hope reviewing your best photos of the year and comparing them to years pasts keeps you inspired and aware of your progress as a photographer. If you’d like to take part next year and be informed when submissions open for the “Best Photos of 2019” blog project add your name to my mail list. You won’t be spammed. I send out newsletters quite infrequently. Thank to everyone who took part!  I invite you to visit each link below as I have and introduce yourself to many of the participating photographers. Best Photos of 2018 Jim Goldstein – Best Photos of 2018 by Jim M. Goldstein Michael Russell – My Top 10 Photographs Of 2018 Dave Wilson – Best of 2018 Joseph Smith – 2018 Favorites – A Baker’s Dozen Randy Langstraat – My Ten Favorite Photos of 2018 Chuq Von Rospach – Chuqui 2018 Best Of Photos Rachel Cohen – Best of 2018 Lucy Autrey Wilson – A Thousand Words Romain Guy – Best of 2018 Alexander S. Kunz – My Favorite Photos from 2018 Stefan Baeurle – Top 10 Favorites of 2018 QT Luong – 2018 in Review Jenni Brehm – Best pf 2018 – Changing Perspectives Sean Bagshaw – My Favorite Photos Of 2018 Johann A. Briffa – 2018: A Photographic Retrospective Exploring Light – 2018: A Year In Review Drake Dyck – Top Ten (favourite) Images of 2018 Richard Wong – Fine Art Photography Prints – 2018 Ramen Saha – 2018 – Ten moments Martin Quinn – Quinn Images 2018 Favorites TheDarkSlides – TheDarkSlides Best of 2018 Denise Goldberg – top photos :: 2018 Peter Carroll – Favourites of 2018 Jeff Hubbard – Ten Favorite Photos 2018 Gary Crabbe – My Favorite Landscape Photos of 2018 – A Year-End Retrospective Harold Davis – Harold Davis – Best of 2018 Werner Priller – My Favorite Images of 2018/ Phil Colla – Natural History Photography – Best Photos Of 2018 Aaron Hockley – Tech Photo Guy: Best Photos of 2018 Dan Baumbach – 2018 in Review Jao van de Lagemaat – Jao’s best images of 2018 Pete Miller-USKestrel Photography – Favorite Images of 2018 Shikha – Eastern Sierra – My favorite images of 2018 Bruce Leventhal – Reflecting on 2018 Christopher Sheppard – The Stories Behind My Favorite Photographs of 2018 Alan Majchrowicz – Photo Highlights 2018 Tom Whelan – Nature Diary Todd Henson – Best Photos of 2018: My Favorites of the Year Khürt Williams – Island in the Net Patricia Davidson – My Top 10 Favorite Photos of 2018 Russ Bishop – 2018 – The Year in Pictures Jim Coda – Some of My Favorite Images from 2018 Steve Cole – Birds Eye View of 2018 Fred Mertz Photography – Best Photos of 2018 Martijn van der Nat – Best of 2018 Graf Nature Photography – Twenty Eighteen Wanderings Scott Thompson – My Top 10 Tahoe Area Photos of 2018 Kyle Jones – 2018 Favorites Clint Losee – My Best Landscape and Nature Photos of 2018 Caleb Weston – Caleb Weston – Dubland Media Greg Clure – Best of 2018 Rick Holliday – Favorites from 2018 J.J. RAIA – J.J. RAIA Best Photos of 2018 Francis Gagnon – Francis Gagnon Best Photos of 2018 Mike Chowla – My Ten Best of Images of 2018 Carl Donohue – 2018 in photos Kurt Lawson – 10 Favorites of 2018: From Lava Rivers in Hawaii to Yosemite Snowstorms William Bean – William Bean T.M. Schultze – My Favorite Photographs of 2018 Andrew Thomas – Aerial Adventures – Best of 2018 Matt Conti – 2018 Top 20 Photos Daniel Leu – Favorites – 2018 Carol Schiraldi – Best of 2018 from Carol’s Little World Alan Dahl – 2018 Favorite Photos Milan Hutera – 2018 in Pictures Kathy Barnhart – Flickr Sensing Light Best of 2018 Album Greg Russell – Alpenglow Images 2018 Year in Review Derrald Farnsworth-Livingston – Top 10 Favorite Images from 2018 Kevin Ebi – Living Wilderness: Best of 2018 Jackson Frishman – Favorites of 2018 Greg A. Lato – My Favorite Photos of 2018 Mike Shipman – Mike Shipman’s Best of 2018 Beth Young – Best Photos of 2018 Dale Grosbach – My Favorites – 2018 Brent Huntley – Photography and Travel Charlie Russell – Best Wildflower Photos for 2018 Bryan William Jones – Jonesblog Tony Wu – Favorite Photos of 2018 Adrian Klein – 2018 Photo Retrospective Scott McGee – Top 10 of 2018 William Neill – My Favorite Photographs of 2018 Thomas Yackley – Yackley Photo Anne McKinnell – Best Photos of 2018 Holly Davison – Top Ten of 2018 Brian Knott – Brian Knott Photography 2018 Year In Review Anna DeStefano – Affirmation Photography’s Best of 2018 Ingeborg Fernau – Magicalglow Photography Blog Emil Powella – Top 10 of 2018 Elduro Tuco – Elduro Tuco Eric Chan – Favorites From 2018 TP Chapman – Best of 2018 Ilias Katsouras – Okrivadas Molly Dean – Best Photos of 2018 Sarah Marino – 2018 Wrap-Up and a Few Favorite Photographs Michael Frye – My Top Photographs of 2018 Jim Stamates – Memories of 2018 Tim Aston – Favorites from 2018 Samantha Decker – My Best […]




al

Best Photos of 2019 by JMG-Galleries Blog Readers

I’m excited to share the results of my 13th annual Best of Photos project.  112 photographers from around the world (amateur and professional alike) have shared their best photos of 2019.  I’m always amazed at the quality of work shared and I hope it’s a source inspiration to you for the coming year. For those who are new to my blog project, photographers taking part span the gamut of photo enthusiasts to professionals. The great thing about photography is that no matter what your skill level we all can relate equally in our love for the art of photography and visually exploring. With that in mind I encourage you to reach out to photographers whose work you enjoy to keep sharing & growing as an artist.  I am incredibly thankful that this tradition has been embraced and enjoy seeing how familiar faces have evolved their work & grown over the years.  I hope reviewing your best photos of the year and comparing them to years pasts keeps you inspired and aware of your progress as a photographer. If you’d like to take part next year and be informed when submissions open for the “Best Photos of 2020” blog project add your name to my mail list. You won’t be spammed. I send out newsletters quite infrequently. Thank to everyone who took part!  I invite you to visit each link below as I have and introduce yourself to many of the participating photographers. Best Photos of 2019 Best Photos of 2019 – JMG-Galleries – Jim M. Goldstein My Top 10 Photographs Of 2019 – Michael Russell My Ten Favorite Photos of 2019 – ADVENTR – Randy Langstraat Favorite Photos of 2019 – T.M. Schultze My Favorite Photos from 2019 – Alexander S. Kunz Best of 2019 – Dave Wilson Harold Davis—Best of 2019 – Harold Davis 2019: A Photographic Retrospective – Johann A. Briffa Top 10 Favorites of 2019 – Stefan Baeurle My Best Natural History Photos of 2019 – Phil Colla My Best Photos From 2019 – Daniel Brinneman Best Photos of 2019 – Peter Tellone Rétrospective des meilleures photos de l’année 2019 – Francis Gagnon Best of 2019 by Rachel Cohen – Rachel Cohen Photo Highlights 2019 – Alan Majchrowicz My Top 10 Nature Photos of 2019 – Greg Vaughn 2019 – The Year in Pictures | Russ Bishop Photography – Russ Bishop 2019 Favorites – A Split Year – Joseph Smith My 12 Favorite Photos of 2019 – Chuq Von Rospach Wild Drake Photography – Drake Dyck Matt Payne Photography – Matt Payne My Favorite Images Of 2019 – Werner Priller Favourites from 2019 – Bryn Tassell My Favorite Photos of 2019 – A Year-End Retrospective – Gary Crabbe / Enlightened Images 2019 Favorite Photographs – Pat Ulrich Without reflection we go blindly on our way – Bjorn Kleemann 2019 – Ten moments – Ramen Saha top photos :: 2019 – Denise Goldberg Changing Perspectives – Best of 2019 – Jenni Brehm Island in the Net – Khürt Williams Best Photos of 2019: My Favorites of the Year – Todd Henson My Ten Best of Images of 2019 – Mike Chowla 2019 Favorite Photos – Alan Dahl Tech Photo Guy – Best Photos 2019 – Aaron Hockley 2019 Favorites – Martin Quinn Best of TheDarkSlides 2019 – TheDarkSlides 2019 Jim Goldstein Project – J.J. RAIA My Favorites of 2019 – Rich Greene My Favorite Images of 2019 (aka ‘Best of 2019’) – Pete Miller 2019 Year in Review, Decade in Review – Robin Black Photography Under Pressure Photography – Scott McGee My favorite Slovenia photos of 2019 – Luka Esenko 5 Moments in Time – 2019 – Gavin Crook My favorite photos of the decade – Matt Payne My Ten Favourite Images of 2019 – Jens Preshaw 2019 in Pictures – Milan Hutera Twelve from 2019 – Tom Whelan My Favorite Photos of 2019 – Jeff Hubbard 2019 Favorites – Rick Holliday Best of the Best 2019 – Richard Valenti Best Landscape and Nature Photos of 2019 – Clint Losee Best of 2019 – My Favorite Images of the Year – Rob Tilley 2019 Year in Review – Greg Russell | Alpenglow Images Best of The Decade Including 2019 – Adrian Klein Best of 2019 – Brian Knott Natural History Photography – Highlights from 2019 – Gabor Ruff Best of 2019 – Jeff Dupuie Top 2019 – Eric Chan Best of 2019 – Greg Clure Twenty Nineteen: In retrospect – Charlotte Gibb Favorite Blog Photos of 2019 – Jim Coda My Favorites 2019 – Beth Young Living Wilderness: Best of 2019 – Kevin Ebi 2019 Favorites – Mike Cleron Best of 2019 – Romain Guy 2019 Favorite Images – Sam Folsom Michael Katz Photography – Michael Katz Twenty Nineteen – Mark Graf 2019 in Review – and Happy New Year” Photography & Travel – brent huntley Top 10 Favorite Images from 2019 – Derrald Farnsworth-Livingston My Photo Highlights of 2019 – Caleb Weston Lagemaat Photography – Best images of 2019 – Jao van de Lagemaat Favorites from 2019 – Kyle Jones A Baker’s Dozen – Mike Christoferson 10 Favorites of 2019: An Amazing Year – Kurt Lawson Top 20 Photographs of 2019 – Year-End-Retrospective – Landscape Photography Reader/David Leland Hyde Favorite Photos of 2019 – Deb Snelson Favorites – 2019 – Daniel Leu Best of 2019 – Steve Cozad Fog from Above in 2019 – Andrew Thomas Favorites of 2019 – Mick McMurray Some Favorites from 2019 – Josh Meier Top 10 Images of 2019 – Stephen L. Kapp Top Ten of 2019 – Holly Davison Best 2019 – Barbara Michalowska The Creative Photographer – Andrew S. Gibson My Favorite Photos of 2019 – Patricia Davidson A Thousand Words – Lucy Autrey Wilson 2019 Top Twelve Photographs – David J Grenier Urban Dinosaurs – Steven M. Bellovin Best of 2019 – Thomas Yackley Carol’s Little World – Best of 2019 – Carol Schiraldi My favourite shots of 2019 – Catalin Marin Top 2019 Photos – Matt Conti Top Ten 2019 – Phyllis Whitman Hunter Favorites from […]




al

Record-Low 2016 Antarctic Sea Ice Due to ‘Perfect Storm’ of Tropical, Polar Conditions

By Hannah Hickey UWNEWS While winter sea ice in the Arctic is declining so dramatically that ships can now navigate those waters without any icebreaker escort, the scene in the Southern Hemisphere is very different. Sea ice area around Antarctica … Continue reading




al

Unwell: The Public Health Implications of Unregulated Drinking Water

By Nate Seltenrich Environmental Health Perspectives Roughly one in seven U.S. residents relies on a private well for drinking water.1 Unlike the rest of the population served by the nation’s many public water systems,2 these 44.5 million Americans are not … Continue reading





al

Top 15 Digital Scrapbooking Downloads (Free & Paid)

Scrapbooking can be a fun way to capture important moments in life and with our list of the Top 15 Scrapbooking Resources, you can start right away!




al

How to Grow Your Sales and Leads During the Coronavirus Pandemic

Try these 10 actionable steps for streamlined, cost-effective marketing during the lockdown. Shed costs and embrace innovation to drive leads and conversions.




al

The Strategic Pyramid – Brand Purpose, Mission, Vision & Values

Do you know the difference between a mission and a vision? Or the difference between a purpose and a goal? Don’t worry, you’re not the only one. Let's clarify!




al

7 Vital Components of a Successful Brand Strategy

A brand strategy is a long-term plan that affects every facet of your business, but creating one can be confusing. We break it down into 7 essential components.




al

Why Use A Digital Marketing Agency?

Outsourcing your marketing when you're running a small or medium sized business is often seen as an expensive option, one that can be done yourself. It might even be seen as something that's...




al

What Are The Essential Tools For Painting?

Painting a room can be a scary venture. Once you have got chosen on the unused color for the room, you’re prepared to begin. Maler has prepared a list of necessary equipment you may need during...




al

5 Tips That You Absolutely Must Know To Design A Unique Metal Business Card

Every day thousands of business cards exchange hands, and these business cards often get lost in mounds of other cards. Often, clients are unable to reach you just because they couldn't find your...



  • Design Roud-up

al

Why Choosing The Best Web Hosting Is Crucial For Your Business

Not many business owners think about hosting when building a new website for their business. But failing to choose the right web hosting can have a great impact on your website and, of course, your...




al

Creative Marketing Strategies For Law Firms To Engage With Potential Clients

The success of any organization strongly depends on the marketing strategies they use to reach their potential customers. Law firms are no exception since they also operate in a competitive field...




al

Where To Find Some Papers For Sale

If you look for a place to find academic papers for sale, you should know that there are lots of writing services on the Internet. But your task is to find a reliable online resource that would offer...







al

How to Foster Real-Time Client Engagement During Moderated Research

When we conduct moderated research, like user interviews or usability tests, for our clients, we encourage them to observe as many sessions as possible. We find when clients see us interview their users, and get real-time responses, they’re able to learn about the needs of their users in real-time and be more active participants in the process. One way we help clients feel engaged with the process during remote sessions is to establish a real-time communication backchannel that empowers clients to flag responses they’d like to dig into further and to share their ideas for follow-up questions.

There are several benefits to establishing a communication backchannel for moderated sessions:

  • Everyone on the team, including both internal and client team members, can be actively involved throughout the data collection process rather than waiting to passively consume findings.
  • Team members can identify follow-up questions in real-time which allows the moderator to incorporate those questions during the current session, rather than just considering them for future sessions.
  • Subject matter experts can identify more detailed and specific follow-up questions that the moderator may not think to ask.
  • Even though the whole team is engaged, a single moderator still maintains control over the conversation which creates a consistent experience for the participant.

If you’re interested in creating your own backchannel, here are some tips to make the process work smoothly:

  • Use the chat tool that is already being used on the project. In most cases, we use a joint Slack workspace for the session backchannel but we’ve also used Microsoft Teams.
  • Create a dedicated channel like #moderated-sessions. Conversation in this channel should be limited to backchannel discussions during sessions. This keeps the communication consolidated and makes it easier for the moderator to stay focused during the session.
  • Keep communication limited. Channel participants should ask basic questions that are easy to consume quickly. Supplemental commentary and analysis should not take place in the dedicated channel.
  • Use emoji responses. The moderator can add a quick thumbs up to indicate that they’ve seen a question.

Introducing backchannels for communication during remote moderated sessions has been a beneficial change to our research process. It not only provides an easy way for clients to stay engaged during the data collection process but also increases the moderator’s ability to focus on the most important topics and to ask the most useful follow-up questions.




al

Markdown Comes Alive! Part 1, Basic Editor

In my last post, I covered what LiveView is at a high level. In this series, we’re going to dive deeper and implement a LiveView powered Markdown editor called Frampton. This series assumes you have some familiarity with Phoenix and Elixir, including having them set up locally. Check out Elizabeth’s three-part series on getting started with Phoenix for a refresher.

This series has a companion repository published on GitHub. Get started by cloning it down and switching to the starter branch. You can see the completed application on master. Our goal today is to make a Markdown editor, which allows a user to enter Markdown text on a page and see it rendered as HTML next to it in real-time. We’ll make use of LiveView for the interaction and the Earmark package for rendering Markdown. The starter branch provides some styles and installs LiveView.

Rendering Markdown

Let’s set aside the LiveView portion and start with our data structures and the functions that operate on them. To begin, a Post will have a body, which holds the rendered HTML string, and title. A string of markdown can be turned into HTML by calling Post.render(post, markdown). I think that just about covers it!

First, let’s define our struct in lib/frampton/post.ex:

defmodule Frampton.Post do
  defstruct body: "", title: ""

  def render(%__MODULE{} = post, markdown) do
    # Fill me in!
  end
end

Now the failing test (in test/frampton/post_test.exs):

describe "render/2" do
  test "returns our post with the body set" do
    markdown = "# Hello world!"                                                                                                                 
    assert Post.render(%Post{}, markdown) == {:ok, %Post{body: "<h1>Hello World</h1>
"}}
  end
end

Our render method will just be a wrapper around Earmark.as_html!/2 that puts the result into the body of the post. Add {:earmark, "~> 1.4.3"} to your deps in mix.exs, run mix deps.get and fill out render function:

def render(%__MODULE{} = post, markdown) do
  html = Earmark.as_html!(markdown)
  {:ok, Map.put(post, :body, html)}
end

Our test should now pass, and we can render posts! [Note: we’re using the as_html! method, which prints error messages instead of passing them back to the user. A smarter version of this would handle any errors and show them to the user. I leave that as an exercise for the reader…] Time to play around with this in an IEx prompt (run iex -S mix in your terminal):

iex(1)> alias Frampton.Post
Frampton.Post
iex(2)> post = %Post{}
%Frampton.Post{body: "", title: ""}
iex(3)> {:ok, updated_post} = Post.render(post, "# Hello world!")
{:ok, %Frampton.Post{body: "<h1>Hello world!</h1>
", title: ""}}
iex(4)> updated_post
%Frampton.Post{body: "<h1>Hello world!</h1>
", title: ""}

Great! That’s exactly what we’d expect. You can find the final code for this in the render_post branch.

LiveView Editor

Now for the fun part: Editing this live!

First, we’ll need a route for the editor to live at: /editor sounds good to me. LiveViews can be rendered from a controller, or directly in the router. We don’t have any initial state, so let's go straight from a router.

First, let's put up a minimal test. In test/frampton_web/live/editor_live_test.exs:

defmodule FramptonWeb.EditorLiveTest do
  use FramptonWeb.ConnCase
  import Phoenix.LiveViewTest

  test "the editor renders" do
    conn = get(build_conn(), "/editor")
    assert html_response(conn, 200) =~ "data-test="editor""
  end
end

This test doesn’t do much yet, but notice that it isn’t live view specific. Our first render is just the same as any other controller test we’d write. The page’s content is there right from the beginning, without the need to parse JavaScript or make API calls back to the server. Nice.

To make that test pass, add a route to lib/frampton_web/router.ex. First, we import the LiveView code, then we render our Editor:

import Phoenix.LiveView.Router
# … Code skipped ...
# Inside of `scope "/"`:
live "/editor", EditorLive

Now place a minimal EditorLive module, in lib/frampton_web/live/editor_live.ex:

defmodule FramptonWeb.EditorLive do
  use Phoenix.LiveView

  def render(assigns) do
    ~L"""
      <div data-test=”editor”>
        <h1>Hello world!</h1>
      </div>
      """
  end

  def mount(_params, _session, socket) do
    {:ok, socket}
  end
end

And we have a passing test suite! The ~L sigil designates that LiveView should track changes to the content inside. We could keep all of our markup in this render/1 method, but let’s break it out into its own template for demonstration purposes.

Move the contents of render into lib/frampton_web/templates/editor/show.html.leex, and replace EditorLive.render/1 with this one liner: def render(assigns), do: FramptonWeb.EditorView.render("show.html", assigns). And finally, make an EditorView module in lib/frampton_web/views/editor_view.ex:

defmodule FramptonWeb.EditorView do
  use FramptonWeb, :view
  import Phoenix.LiveView
end

Our test should now be passing, and we’ve got a nicely separated out template, view and “live” server. We can keep markup in the template, helper functions in the view, and reactive code on the server. Now let’s move forward to actually render some posts!

Handling User Input

We’ve got four tasks to accomplish before we are done:

  1. Take markdown input from the textarea
  2. Send that input to the LiveServer
  3. Turn that raw markdown into HTML
  4. Return the rendered HTML to the page.

Event binding

To start with, we need to annotate our textarea with an event binding. This tells the liveview.js framework to forward DOM events to the server, using our liveview channel. Open up lib/frampton_web/templates/editor/show.html.leex and annotate our textarea:

<textarea phx-keyup="render_post"></textarea>

This names the event (render_post) and sends it on each keyup. Let’s crack open our web inspector and look at the web socket traffic. Using Chrome, open the developer tools, navigate to the network tab and click WS. In development you’ll see two socket connections: one is Phoenix LiveReload, which polls your filesystem and reloads pages appropriately. The second one is our LiveView connection. If you let it sit for a while, you’ll see that it's emitting a “heartbeat” call. If your server is running, you’ll see that it responds with an “ok” message. This lets LiveView clients know when they've lost connection to the server and respond appropriately.

Now, type some text and watch as it sends down each keystroke. However, you’ll also notice that the server responds with a “phx_error” message and wipes out our entered text. That's because our server doesn’t know how to handle the event yet and is throwing an error. Let's fix that next.

Event handling

We’ll catch the event in our EditorLive module. The LiveView behavior defines a handle_event/3 callback that we need to implement. Open up lib/frampton_web/live/editor_live.ex and key in a basic implementation that lets us catch events:

def handle_event("render_post", params, socket) do
  IO.inspect(params)

  {:noreply, socket}
end

The first argument is the name we gave to our event in the template, the second is the data from that event, and finally the socket we’re currently talking through. Give it a try, typing in a few characters. Look at your running server and you should see a stream of events that look something like this:

There’s our keystrokes! Next, let’s pull out that value and use it to render HTML.

Rendering Markdown

Lets adjust our handle_event to pattern match out the value of the textarea:

def handle_event("render_post", %{"value" => raw}, socket) do

Now that we’ve got the raw markdown string, turning it into HTML is easy thanks to the work we did earlier in our Post module. Fill out the body of the function like this:

{:ok, post} = Post.render(%Post{}, raw)
IO.inspect(post)

If you type into the textarea you should see output that looks something like this:

Perfect! Lastly, it’s time to send that rendered html back to the page.

Returning HTML to the page

In a LiveView template, we can identify bits of dynamic data that will change over time. When they change, LiveView will compare what has changed and send over a diff. In our case, the dynamic content is the post body.

Open up show.html.leex again and modify it like so:

<div class="rendered-output">
  <%= @post.body %>
</div>

Refresh the page and see:

Whoops!

The @post variable will only be available after we put it into the socket’s assigns. Let’s initialize it with a blank post. Open editor_live.ex and modify our mount/3 function:

def mount(_params, _session, socket) do
  post = %Post{}
  {:ok, assign(socket, post: post)}
end

In the future, we could retrieve this from some kind of storage, but for now, let's just create a new one each time the page refreshes. Finally, we need to update the Post struct with user input. Update our event handler like this:

def handle_event("render_post", %{"value" => raw}, %{assigns: %{post: post}} = socket) do
  {:ok, post} = Post.render(post, raw)
  {:noreply, assign(socket, post: post)
end

Let's load up http://localhost:4000/editor and see it in action.

Nope, that's not quite right! Phoenix won’t render this as HTML because it’s unsafe user input. We can get around this (very good and useful) security feature by wrapping our content in a raw/1 call. We don’t have a database and user processes are isolated from each other by Elixir. The worst thing a malicious user could do would be crash their own session, which doesn’t bother me one bit.

Check the edit_posts branch for the final version.

Conclusion

That’s a good place to stop for today. We’ve accomplished a lot! We’ve got a dynamically rendering editor that takes user input, processes it and updates the page. And we haven’t written any JavaScript, which means we don’t have to maintain or update any JavaScript. Our server code is built on the rock-solid foundation of the BEAM virtual machine, giving us a great deal of confidence in its reliability and resilience.

In the next post, we’ll tackle making a shared editor, allowing multiple users to edit the same post. This project will highlight Elixir’s concurrency capabilities and demonstrate how LiveView builds on them to enable some incredible user experiences.



  • Code
  • Back-end Engineering

al

Our New Normal, Together

As the world works to mitigate the impact of the COVID-19 pandemic, our thoughts are foremost with those already ill from the virus and those on the frontlines, slowing its spread. The bravery and commitment of healthcare workers everywhere is an inspiration.

While Viget’s physical offices are effectively closed, we’re continuing to work with our clients on projects that evolve by the day. Viget has been working with distributed teams to varying degrees for most of our 20-year history, and while we’re comfortable with the tools and best practices that make doing so effective, we realize that some of our clients are learning as they go. We’re here to help.

These are unprecedented times, but our business playbook is clear: Take care of each other. We’re in this together.

Our People Team is meeting with everyone on our staff to confirm their work-from-home situation. Do they have family or roommates they can rely on in an emergency? How are they feeling physically and mentally? Do they have what they need to be productive? As a team, we’re working extra hard to communicate. Andy hosts and records video calls to answer questions anyone has about the crisis, and our weekly staff meeting schedule will continue. Recognizing that our daily informal group lunches are a vital social glue in our offices, Aubrey has organized a virtual lunch table Hangout, allowing our now fully-distributed team to catch up over video. It ensures we have some laughs and helps keep us feeling connected.

Our project teams are well-versed in remote collaboration, but we understand that not all client projects can proceed as planned. We’re doing our best to accommodate evolving schedules while keeping the momentum on as many projects as possible. For all of our clients, we’re making clear that we think long-term. We’re partners through this, and can adapt to help our clients not just weather the storm, but come through it stronger when possible. Some clients have been forced to pause work entirely, while others are busier than ever.

Viget has persevered through many downturns -- the dot com crash, 9/11, the 2008 financial crisis, and a few self-inflicted close-calls. In retrospect, it’s easy to reflect on how these situations made us stronger, but mid-crisis it can be hard to stay positive. The consistent lesson has been that taking care of each other -- co-workers, clients, partners, community peers -- is what gets us through. It motivates our hard work, it focuses our priorities and collaboration, and inspires us to do what needs to be done.

I don’t know for certain how this crisis will play out, but I know that all of us at Viget will be doing everything we can to support each other as we go through it together.



  • News & Culture

al

CLI Equivalents for Common MAMP PRO and Sequel Pro Tasks

Working on website front ends I sometimes use MAMP PRO to manage local hosts and Sequel Pro to manage databases. Living primarily in my text editor, a terminal, and a browser window, moving to these click-heavy dedicated apps can feel clunky. Happily, the tasks I have most frequently turned to those apps for —starting and stopping servers, creating new hosts, and importing, exporting, deleting, and creating databases— can be done from the command line.

I still pull up MAMP PRO if I need to change a host's PHP version or work with its other more specialized settings, or Sequel Pro to quickly inspect a database, but for the most part I can stay on the keyboard and in my terminal. Here's how:

Command Line MAMP PRO

You can start and stop MAMP PRO's servers from the command line. You can even do this when the MAMP PRO desktop app isn't open.

Note: MAMP PRO's menu icon will not change color to reflect the running/stopped status when the status is changed via the command line.

  • Start the MAMP PRO servers:
/Applications/MAMP PRO.app/Contents/MacOS/MAMP PRO cmd startServers
  • Stop the MAMP PRO servers:
/Applications/MAMP PRO.app/Contents/MacOS/MAMP PRO cmd stopServers
  • Create a host (replace host_name and root_path):
/Applications/MAMP PRO.app/Contents/MacOS/MAMP PRO cmd createHost host_name root_path

MAMP PRO-friendly Command Line Sequel Pro

Note: if you don't use MAMP PRO, just replace the /Applications/MAMP/Library/bin/mysql with mysql.

In all of the following commands, replace username with your user name (locally this is likely root) and database_name with your database name. The -p (password) flag with no argument will trigger an interactive password prompt. This is more secure than including your password in the command itself (like -pYourPasswordHere). Of course, if you're using the default password root is not particular secure to begin with so you might just do -pYourPasswordHere.

Setting the -h (host) flag to localhost or 127.0.0.1 tells mysql to look at what's on localhost. With the MAMP PRO servers running, that will be the MAMP PRO databases.

# with the MAMP PRO servers running, these are equivalent:
# /Applications/MAMP/Library/bin/mysql -h 127.0.0.1 other_options
# and
# /Applications/MAMP/Library/bin/mysql -h localhost other_options

/Applications/MAMP/Library/bin/mysql mysql_options # enter. opens an interactive mysql session
mysql> some command; # don't forget the semicolon
mysql> exit;
  • Create a local database
# with the MAMP PRO servers running
# replace `username` with your username, which is `root` by default
/Applications/MAMP/Library/bin/mysql -h localhost -u username -p -e "create database database_name"

or

# with the MAMP PRO servers running
# replace `username` (`root` by default) and `database_name`
/Applications/MAMP/Library/bin/mysql -h localhost -u username -p # and then enter
mysql> create database database_name; # don't forget the semicolon
mysql> exit

    MAMP PRO's databases are stored in /Library/Application Support/appsolute/MAMP PRO/db so to confirm that it worked you can

ls /Library/Application Support/appsolute/MAMP PRO/db
# will output the available mysql versions. For example I have
mysql56_2018-11-05_16-25-13     mysql57

# If it isn't clear which one you're after, open the main MAMP PRO and click
# on the MySQL "servers and services" item. In my case it shows "Version: 5.7.26"

# Now look in the relevant MySQL directory
ls /Library/Application Support/appsolute/MAMP PRO/db/mysql57
# the newly created database should be in the list
  • Delete a local database
# with the MAMP PRO servers running
# replace `username` (`root` by default) and `database_name`
/Applications/MAMP/Library/bin/mysql -h localhost -u username -p -e "drop database database_name"
  • Export a dump of a local database. Note that this uses mysqldump not mysql.
# to export an uncompressed file
# replace `username` (`root` by default) and `database_name`
/Applications/MAMP/Library/bin/mysqldump -h localhost -u username -p database_name > the/output/path.sql

# to export a compressed file
# replace `username` (`root` by default) and `database_name`
/Applications/MAMP/Library/bin/mysqldump -h localhost -u username -p database_name | gzip -c > the/output/path.gz

  • Export a local dump from an external database over SSH. Note that this uses mysqldump not mysql.

# replace `ssh-user`, `ssh_host`, `mysql_user`, `database_name`, and the output path

# to end up with an uncompressed file
ssh ssh_user@ssh_host "mysqldump -u mysql_user -p database_name | gzip -c" | gunzip > the/output/path.sql

# to end up with a compressed file
ssh ssh_user@ssh_host "mysqldump -u mysql_user -p database_name | gzip -c" > the/output/path.gz
  • Import a local database dump into a local database
# with the MAMP PRO servers running
# replace `username` (`root` by default) and `database_name`
/Applications/MAMP/Library/bin/mysql -h localhost -u username -p database_name < the/dump/path.sql
  • Import a local database dump into a remote database over SSH. Use care with this one. But if you are doing it with Sequel Pro —maybe you are copying a Craft site's database from a production server to a QA server— you might as well be able to do it on the command line.
ssh ssh_user@ssh_host "mysql -u username -p remote_database_name" < the/local/dump/path.sql


For me, using the command line instead of the MAMP PRO and Sequel Pro GUI means less switching between keyboard and mouse, less opening up GUI features that aren't typically visible on my screen, and generally better DX. Give it a try! And while MAMP Pro's CLI is limited to the essentials, command line mysql of course knows no limits. If there's something else you use Sequel Pro for, you may be able to come up with a mysql CLI equivalent you like even better.



  • Code
  • Front-end Engineering
  • Back-end Engineering

al

Pursuing A Professional Certification In Scrum

Professional certifications have become increasingly popular in this age of career switchers and the freelance gig economy. A certification can be a useful way to advance your skill set quickly or make your resume stand out, which can be especially important for those trying to break into a new industry or attract business while self-employed. Whatever your reason may be for pursuing a professional certificate, there is one question only you can answer for yourself: is it worth it?

Finding first-hand experiences from professionals with similar career goals and passions was the most helpful research I used to answer that question for myself. So, here’s mine; why I decided to get Scrum certified, how I evaluated my options, and if it was really worth it.

A shift in mindset

My background originates in brand strategy where it’s typical for work to follow a predictable order, each step informing the next. This made linear techniques like water-fall timelines, completing one phase of work in its entirety before moving onto the next, and documenting granular tasks weeks in advance helpful and easy to implement. When I made the move to more digitally focused work, tasks followed a much looser set of ‘typical’ milestones. While the general outline remained the same (strategy, design, development, launch) there was a lot more overlap with how tasks informed each other, and would keep informing and re-informing as an iterative workflow would encourage.

Trying to fit a very fluid process into my very stiff linear approach to project planning didn’t work so well. I didn’t have the right strategies to manage risks in a productive way without feeling like the whole project was off track; with the habit of account for granular details all the time, I struggled to lean on others to help define what we should work on and when, and being okay if that changed once, or twice, or three times. Everything I learned about the process of product development came from learning on the job and making a ton of mistakes—and I knew I wanted to get better.

Photo by Christin Hume on Unsplash

I was fortunate enough to work with a group of developers who were looking to make a change, too. Being ‘agile’-enthusiasts, this group of developers were desperately looking for ways to infuse our approach to product work with agile-minded principles (the broad definition of ‘agile’ comes from ‘The Agile Manifesto’, which has influenced frameworks for organizing people and information, often applied in product development). This not only applied to how I worked with them, but how they worked with each other, and the way we all onboarded clients to these new expectations. This was a huge eye opener to me. Soon enough, I started applying these agile strategies to my day-to-day— running stand-ups, setting up backlogs, and reorganizing the way I thought about work output. It’s from this experience that I decided it may be worth learning these principles more formally.

The choice to get certified

There is a lot of literature out there about agile methodologies and a lot to be learned from casual research. This benefitted me for a while until I started to work on more complicated projects, or projects with more ambitious feature requests. My decision to ultimately pursue a formal agile certification really came down to three things:

  1. An increased use of agile methods across my team. Within my day-to-day I would encounter more team members who were familiar with these tactics and wanted to use them to structure the projects they worked on.
  2. The need for a clear definition of what processes to follow. I needed to grasp a real understanding of how to implement agile processes and stay consistent with using them to be an effective champion of these principles.
  3. Being able to diversify my experience. Finding ways to differentiate my resume from others with similar experience would be an added benefit to getting a certification. If nothing else, it would demonstrate that I’m curious-minded and proactive about my career.

To achieve these things, I gravitated towards a more foundational education in a specific agile-methodology. This made Scrum the most logical choice given it’s the basis for many of the agile strategies out there and its dominance in the field.

Evaluating all the options

For Scrum education and certification, there are really two major players to consider.

  1. Scrum Alliance - Probably the most well known Scrum organization is Scrum Alliance. They are a highly recognizable organization that does a lot to further the broader understanding of Scrum as a practice.
  2. Scrum.org - Led by the original co-founder of Scrum, Ken Schwaber, Scrum.org is well-respected and touted for its authority in the industry.

Each has their own approach to teaching and awarding certifications as well as differences in price point and course style that are important to be aware of.

SCRUM ALLIANCE

Pros

  • Strong name recognition and leaders in the Scrum field
  • Offers both in-person and online courses
  • Hosts in-person events, webinars, and global conferences
  • Provides robust amounts of educational resources for its members
  • Has specialization tracks for folks looking to apply Scrum to their specific discipline
  • Members are required to keep their skills up to date by earning educational credits throughout the year to retain their certification
  • Consistent information across all course administrators ensuring you'll be set up to succeed when taking your certification test.

Cons

  • High cost creates a significant barrier to entry (we’re talking in the thousands of dollars here)
  • Courses are required to take the certification test
  • Certification expires after two years, requiring additional investment in time and/or money to retain credentials
  • Difficult to find sample course material ahead of committing to a course
  • Courses are several days long which may mean taking time away from a day job to complete them

SCRUM.ORG

Pros

  • Strong clout due to its founder, Ken Schwaber, who is the originator of Scrum
  • Offers in-person classes and self-paced options
  • Hosts in-person events and meetups around the world
  • Provides free resources and materials to the public, including practice tests
  • Has specialization tracks for folks looking to apply Scrum to their specific discipline
  • Minimum score on certification test required to pass; certification lasts for life
  • Lower cost for certification when compared to peers

Cons

  • Much lesser known to the general public, as compared to its counterpart
  • Less sophisticated educational resources (mostly confined to PDFs or online forums) making digesting the material challenging
  • Practice tests are slightly out of date making them less effective as a study tool
  • Self-paced education is not structured and therefore can’t ensure you’re learning everything you need to know for the test
  • Lack of active and engaging community will leave something to be desired

Before coming to a decision, it was helpful to me to weigh these pros and cons against a set of criteria. Here’s a helpful scorecard I used to compare the two institutions.

Scrum Alliance Scrum.org
Affordability ⚪⚪⚪
Rigor⚪⚪⚪⚪⚪
Reputation⚪⚪⚪⚪⚪
Recognition⚪⚪⚪
Community⚪⚪⚪
Access⚪⚪⚪⚪⚪
Flexibility⚪⚪⚪
Specialization⚪⚪⚪⚪⚪⚪
Requirements⚪⚪⚪
Longevity⚪⚪⚪

For me, the four areas that were most important to me were:

  • Affordability - I’d be self-funding this certificate so the investment of cost would need to be manageable.
  • Self-paced - Not having a lot of time to devote in one sitting, the ability to chip away at coursework was appealing to me.
  • Reputation - Having a certificate backed by a well-respected institution was important to me if I was going to put in the time to achieve this credential.
  • Access - Because I wanted to be a champion for this framework for others in my organization, having access to resources and materials would help me do that more effectively.

Ultimately, I decided upon a Professional Scrum Master certification from Scrum.org! The price and flexibility of learning course content were most important to me. I found a ton of free materials on Scrum.org that I could study myself and their practice tests gave me a good idea of how well I was progressing before I committed to the cost of actually taking the test. And, the pedigree of certification felt comparable to that of Scrum Alliance, especially considering that the founder of Scrum himself ran the organization.

Putting a certificate to good use

I don’t work in a formal Agile company, and not everyone I work with knows the ins and outs of Scrum. I didn’t use my certification to leverage a career change or new job title. So after all that time, money, and energy, was it worth it?

I think so. I feel like I use my certification every day and employ many of the principles of Scrum in my day-to-day management of projects and people.

  • Self-organizing teams is really important when fostering trust and collaboration among project members. This means leaning on each other’s past experiences and lessons learned to inform our own approach to work. It also means taking a step back as a project manager to recognize the strengths on your team and trust their lead.
  • Approaching things in bite size pieces is also a best practice I use every day. Even when there isn't a mandated sprint rhythm, breaking things down into effort level, goals, and requirements is an excellent way to approach work confidently and avoid getting too overwhelmed.
  • Retrospectives and stand ups are also absolute musts for Scrum practices, and these can be modified to work for companies and project teams of all shapes and sizes. Keeping a practice of collective communication and reflection will keep a team humming and provides a safe space to vent and improve.
Photo by Gautam Lakum on Unsplash

Parting advice

I think furthering your understanding of industry standards and keeping yourself open to new ways of working will always benefit you as a professional. Professional certifications are readily available and may be more relevant than ever.

If you’re on this path, good luck! And here are some things to consider:

  • Do your research – With so many educational institutions out there, you can definitely find the right one for you, with the level of rigor you’re looking for.
  • Look for company credits or incentives – some companies cover part or all of the cost for continuing education.
  • Get started ASAP – You don’t need a full certification to start implementing small tactics to your workflows. Implementing learnings gradually will help you determine if it’s really something you want to pursue more formally.




al

A Parent’s Guide to Working From Home, During a Global Pandemic, Without Going Insane

Though I usually enjoy working from Viget’s lovely Boulder office, during quarantine I am now working from home while simultaneously parenting my 3-year-old daughter Audrey. My husband works in healthcare and though he is not on the front lines battling COVID-19, he is still an essential worker and as such leaves our home to work every day.

Some working/parenting days are great! I somehow get my tasks accomplished, my kid is happy, and we spend some quality time together.

And some days are awful. I have to ignore my daughter having a meltdown and try to focus on meetings, and I wish I wasn’t in this situation at all. Most days are somewhere in the middle; I’m just doing my best to get by.

I’ve seen enough working parent memes and cries for help on social media to know that I’m not alone. There are many parents out there who now get to experience the stress and anxiety of living through a global pandemic while simultaneously navigating ways to stay productive while working from home and being an effective parent. Fun isn’t it?

I’m not an expert on the matter, but I have found a few small things that are making me feel a bit more sane. I hope sharing them will make someone else’s life easier too.

Truths to Accept

First, let’s acknowledge some truths about this new situation we find ourselves in:

Truth 1: We’ve lost something.

Parents have lost more than daycare and schools during this epidemic. We’ve lost any time that we had for ourselves, and that was really valuable. We no longer have small moments in the day to catch up on our personal lives. I no longer have a commute to separate my work duties from my mom duties, or catch up with my friends, or just be quiet.

Truth 2: We’re human.

The reason you can’t be a great employee and a great parent and a great friend and a great partner or spouse all day every day isn’t because you’re doing a bad job, it’s because being constantly wonderful in all aspects of your life is impossible. Pick one or two of those things a day to focus on.

Truth 3: We’re all doing our best.

This is the most important part of this article. Be kind to yourselves. This isn’t easy, and putting so much pressure on yourself that you break isn’t going to make it any easier.

Work from Home Goals

Now that we’ve accepted some truths about our current situation, let’s set some goals.

Goal 1: Do Good Work

At Viget, and wherever you work, with kids or without we all want to make sure that the quality of our work stays up throughout the pandemic and that we can continue to be reliable team members and employees to the best of our abilities.

Goal 2: Stay Sane

We need to figure out ways to do this without sacrificing ourselves entirely. For me, this means fitting my work into normal work hours as much as possible so that I can still have some downtime in the evenings.

Goal 3: Make This Sustainable

None of us knows how long this will last but we may as well begin mentally preparing for a long haul.

Work from Home Rules

Now, there are some great Work from Home Rules that apply to everyone with or without kids. My coworker Paul Koch shared these with the Viget team a Jeremy Bearimy ago and I agree this is also the foundation for working from home with kids.

  1. When you’re in a remote meeting, minimize other windows to stay focused
  2. Set a schedule and avoid chores*
  3. Take breaks away from the screen
  4. Plan your workday on the calendar+
  5. Be mindful of Slack and social media as a distraction
  6. Use timers+
  7. Keep your work area separate from where you relax
  8. Pretend that you’re still WFW
  9. Experiment and figure out what works for you

In the improv spirit I say “Yes, AND….” to these tips. And so, here are my adjusted rules for WFH while kiddos around: These have both been really solid tools for me, so let’s dig in.

Daily flexible schedule for kids

Day Planning: Calendars and Timers

A few small tweaks and adjustments make this even more doable for me and my 3-year-old. First- I don’t avoid chores entirely. If I’m going up and down the stairs all day anyway I might as well throw in a load of laundry while I’m at it. The more I can get done during the day means a greater chance of some down time in the evening.

Each morning I plan my day and Audrey’s day:

My Work Day:

Audrey's Day

Identify times of day you are more likely to be focus and protect them. For me, I know I have a block of time from 5-7a before Audrey wakes up and again during “nap time” from 1-3p.I built a construction paper “schedule” that we update and reorganize daily. We make the schedule together each day. She feels ownership over it and she gets to be the one who tells me what we do next.
Look at your calendar first thing and make adjustments either in your plans or move meetings if you have to.I’m strategic about screen time- I try to schedule it when I have meetings. It also helps to schedule a physical activity before screen time as she is less likely to get bored.
Make goals for your day: Tackle time sensitive tasks first. Take care of things that either your co-workers or clients are waiting on from you first, this will help your day be a lot less stressful. Non-time sensitive tasks come next- these can be done at any time of day.We always include “nap time” even though she rarely naps anymore. This is mostly a time for us both to be alone.

When we make the schedule together it also helps me understand her favorite parts of the day and reminds me to include them.

Once our days are planned, I also use timers to help keep the structure of the day. (I bought a great alarm clock for kids on Amazon that turns colors to signal bedtime and quiet time. It’s been hugely worth it for me.)

Timers for Me:

Timers for Audrey:

More than ever, I rely on a time tracking timer. At Viget we use Harvest to track time, and it has a handy built in timer, but there are many apps or online tools that could help you keep track of your time as well.Audrey knows what time she can come out of her room in the morning. If she wakes up before the light is green she plays quietly in her room.
I need a timer because the days and hours are bleeding together- without tracking as I go it would be really hard for me to remember when I worked on certain projects or know for certain if I gave Viget enough time for the day.She knows how long “nap time” is in the afternoon.
Starting and stopping the timer helps me turn on and off “work mode”, which is a helpful sanity bonus.Perhaps best of all I am not the bad guy! “Sorry honey, the light isn’t green yet and there really isn’t anything mommy can do about it” is my new favorite way to ensure we both get some quiet time.

Work from Home Rules: Updated for Parents

Finally, I have a few more Work from Home Rules for parents to add to the list:

  1. Minimize other windows in remote meetings
  2. Set a schedule and fit in some chores if time allows
  3. Take breaks away from the screen
  4. Schedule both your and your kids’ days
  5. Be mindful of Slack and social media as a distraction
  6. Use timers to track your own time and help your kids understand the day
  7. Keep your work area separate from where you relax
  8. Pretend that you’re still WFW
  9. Experiment and figure out what works for you
  10. Be prepared with a few activities
    • Each morning, have just ONE thing ready to go. This can be a worksheet you printed out, a coloring station setup, a new bag of kinetic sand you just got delivered from Amazon, a kids dance video on YouTube or an iPad game. Recently I started enlisting my mom to read stories on Facetime. The activity doesn’t have to be new each day but (especially for young kids) it has to be handy for you to start up quickly if your schedule changes
  11. Clearly communicate your availability with your team and project PMs
    • Life happens. Some days are going to be hard. Whatever you do, don’t burn yourself out or leave your team hanging. If you need to move a meeting or take a day off, communicate that as early and as clearly as you can.
  12. Take PTO if you can
    • None of us are superheroes. If you’re feeling overwhelmed- take a look at the next few days and figure out which one makes the most sense for you to take a break.
  13. Take breaks to be alone without doing a task
    • Work and family responsibilities have blended together, there’s almost no room for being alone. If you can find some precious alone time don’t use it to fold laundry or clean the bathroom. Just zone out. I think we all really need this.

Last but not least, enjoy your time at home if you can. This is an unusual circumstance and even though it’s really hard, there are parts that are really great too.

If you have some great WFH tips we’d love to hear about them in the comments!




al

Global Gitignore Files Are Cool and So Are You

Setting it up

First, here's the config setup you need to even allow for such a radical concept.

  1. Define the global gitignore file as a global Git configuration:

    git config --global core.excludesfile ~/.gitignore
    

    If you're on OSX, this command will add the following config lines in your ~/.gitconfig file.

    [core]
      excludesfile = /Users/triplegirldad/.gitignore
    
  2. Load that ~/.gitignore file up with whatever you want. It probably doesn't exist as a file yet so you might have to create it first.

Harnessing its incredible power

There are only two lines in my global gitignore file and they are both fairly useful pretty much all the time.

$ cat ~/.gitignore
TODO.md
playground

This 2 line file means that no matter where I am, what project I'm working on, where in the project I'm doing so, I have an easy space to stash notes, thoughts, in progress ideas, spikes, etc.

TODO.md

More often than not, I'm fiddling around with a TODO.md file. Something about writing markdown in your familiar text editor speaks to my soul. It's quick, it's easy, you have all the text editing tricks available to you, and it never does anything you wouldn't expect (looking at you auto-markdown-formatting editors). I use one or two # for headings, I use nested lists, and I ask for nothing more. Nothing more than more TODO.md files that is!

In practice I tend to just have one TODO.md file per project, right at the top, ready to pull up in a few keystrokes. Which I do often. I pull this doc up if:

  • I'm in a meeting and I just said "oh yeah that's a small thing, I'll knock it out this afternoon".
  • I'm halfway through some feature development and realize I want to make a sweeping refactor elsewhere. Toss some thoughts in the doc, and then get back to the task at hand.
  • It's the end of the day and I have to switch my brain into "feed small children" mode, thus obliterating everything work-related from my short term memory. When I open things up the next day and know exactly what the next thing to dive into was.
  • I'm preparing for a big enough refactor and I can't hold it all in my brain at once. What I'd give to have an interactive 3D playground for brain thoughts, but in the meantime a 2D text file isn't a terrible way to plan out dev work.

playground

Sometimes you need more than some human words in a markdown file to move an idea along. This is where my playground directory comes in. I can load this directory up with code that's related to a given project and keep it out of the git history. Because who doesn't like a place to play around.

I find that this directory is more useful for long running maintenance projects over fast moving greenfield ones. On the maintenance projects, I tend to find myself assembling a pile of scripts and experiments for various situations:

  • The client requests a one-time obscure data export. Whip up some CSV generation code and save that code in the playground directory.
  • The client requests a different obscure data export. Pull up the last time you did something vaguely similar and save yourself the startup time.
  • A batch of data needs to be imported just once. Might as well stash that in the chance that "just once" is actually "just a few times".
  • Kicking the tires on an integration with a third party service.

Some of these playground files end up being useful more times than I can count (eg: the ever-changing user_export.rb script). Some items get promoted into application code, which is always fun. But most files here serve their purpose and then wither away. And that's fine. It's a playground, anything goes.

Wrapping up

Having a personal space for project-specific notes and code has been helpful to me over the years as a developer on multiple projects. If you have your own organizational trick, or just want to brag about how you memorize everything without any markdown files, let me know in the comments below!




al

"I always hated that word—marketing—and I hate it now. Because for me, and this may sound simplistic,..."

““I always hated that word—marketing—and I hate it now. Because for me, and this may sound simplistic, the key to marketing is to make something people want. When they want it, they buy it. When they buy it, you have sales. So the product has to speak. The product is what markets things.””

- Interview with Tom Ford.




al

"What is deceptive, especially in the West, is our assumption that repetitive and mindless jobs are..."

What is deceptive, especially in the West, is our assumption that repetitive and mindless jobs are dehumanizing. On the other hand, the jobs that require us to use the abilities that are uniquely human, we assume to be humanizing. This is not necessarily true. The determining factor is not so much the nature of our jobs, but for whom they serve.

‘Burnout’ is a result of consuming yourself for something other than yourself. You could be burnt out for an abstract concept, ideal, or even nothing (predicament). You end up burning yourself as fuel for something or someone else. This is what feels dehumanizing. In repetitive physical jobs, you could burn out your body for something other than yourself. In creative jobs, you could burn out your soul. Either way, it would be dehumanizing. Completely mindless jobs and incessantly mindful jobs could both be harmful to us.



- Dsyke Suematsu from his white paper discussed at Why Ad People Burn Out.




al

"In conceptual art the idea or concept is the most important aspect of the work. When an artist uses..."

“In conceptual art the idea or concept is the most important aspect of the work. When an artist uses a conceptual form of art, it means that all of the planning and decisions are made beforehand and the execution is a perfunctory affair. The idea becomes a machine that makes the art. This kind of art is not theoretical or illustrative of theories; it is intuitive, it is involved with all types of mental processes and it is purposeless. It is usually free from the dependence on the skill of the artist as a craftsman.”

- Artist Sol Lewitt on conceptual art.




al

Illustrator Tutorial: How to Create an iPhone Icon

Welcome back to another Adobe Illustrator based tutorial, in which we're going to take a close look behind the process of creating a simple iPhone icon, using nothing more than some basic geometric shapes that we're going to adjust here and there. 1. Set Up a New Project File As with any new project, we’re […]

The post Illustrator Tutorial: How to Create an iPhone Icon appeared first on Bittbox.




al

Illustrator Tutorial: How to Create a Simple Computer Icon

In today’s tutorial, we're going to take a close look behind the process of creating a simple computer icon, and see how easy it is to build one of our one using nothing more than some basic geometric shapes. 1. Set Up a New Project File As with any new project, we’re going to kick […]

The post Illustrator Tutorial: How to Create a Simple Computer Icon appeared first on Bittbox.




al

Illustrator Tutorial: How to Create a Folder Icon

In today’s tutorial, we’re going to take an in-depth look behind the process of creating a folder icon, and see how easy it is to build one from scratch using nothing more than a couple of basic geometric shapes, which we’re going to adjust here and there. So, assuming you already have Illustrator up and […]

The post Illustrator Tutorial: How to Create a Folder Icon appeared first on Bittbox.




al

5 Essentials To Create Your Own Website Presence

Only a website that has a well-established presence can stand out on the internet. Business owners and individuals hire web designers like yourself to create website presences for them. In order to prove yourself, you need to establish your own presence online first. Get to the point where you can showcase your own website during […]

The post 5 Essentials To Create Your Own Website Presence appeared first on Bittbox.




al

Illustrator Tutorial: How to Create a Watch Icon

Welcome back to another Illustrator based tutorial, in which we’re going to learn how to create a simple watch icon, using nothing more than a couple of basic geometric shapes and tools. So, assuming you already have the software running in the background, bring it up and let’s jump straight into it! 1. Set Up […]

The post Illustrator Tutorial: How to Create a Watch Icon appeared first on Bittbox.




al

Illustrator Tutorial: How to Create an Icognito Icon

Welcome back to another Illustrator based tutorial, in which we’re going to take a close look behind the process of creating an incognito icon, using nothing more than a couple of simple shapes and tools. So, assuming you already have the software running in the background, bring it up and let’s jump straight into it! […]

The post Illustrator Tutorial: How to Create an Icognito Icon appeared first on Bittbox.




al

Illustrator Tutorial: How to Create an Ice Cream icon

In today’s tutorial, we’re going to take a quick look at the process of creating an Ice Cream icon, and learn how easy it is to build one from scratch using nothing more than a couple of basic geometric shapes that we’re going to adjust here and there. So, assuming you already have the software […]

The post Illustrator Tutorial: How to Create an Ice Cream icon appeared first on Bittbox.




al

Illustrator Tutorial: How to Create a Notification Bell Icon

n today’s tutorial, we’re going to take a quick look behind the process of creating a notification bell icon, and see how easy it is to do so using nothing more than a couple of basic geometric shapes and tools. So, assuming you already have the software up and running, let’s jump straight into it! […]

The post Illustrator Tutorial: How to Create a Notification Bell Icon appeared first on Bittbox.




al

Illustrator Tutorial: How to Create a Recycle Bin Notification Icon

Welcome back to another Illustrator based tutorial, in which we’re going to learn how to create a recycle bin notification icon, using nothing more than a couple of basic geometric shapes that we’re going to adjust here and there. So, assuming you already have the software running in the background, bring it up and let’s […]

The post Illustrator Tutorial: How to Create a Recycle Bin Notification Icon appeared first on Bittbox.




al

Intel’s Parallel Extensions for JavaScript

Intel’s Parallel Extensions for JavaScript, code named River Trail, hooks into on-chip vector extensions to improve performance of Web applications. Details of Intel’s attempt to get on the JavaScript juggernaut emerged last month at its developer event. The prototype JavaScript extension offered by Intel is intended to allow JavaScript apps to take advantage of modern parallel Read the rest...




al

HipHop Virtual Machine for PHP

Facebook Software Engineer and HipHop for PHP team member Jason Evans provides details on Facebook’s move to a new high-performance PHP virtual machine. Described by Evans is ”a new PHP execution engine based on the HipHop language runtime that we call the HipHop Virtual Machine (hhvm).” He sees it as replacement for the HipHop PHP Read the rest...




al

Fat Fractal enters the BaaS fray

What has sometimes been described as mobile middleware has taken a new tack. Now, the idea of Backend as a Service (BaaS) has begun to take off in the mobile application development space. Proponents of BaaS say it helps developers easily build mobile apps, or any other applications connected to a cloud backend. Some of Read the rest...




al

Scaling up CSS

CSS has a habit of creeping up on you. If you’re not careful, your humble stylesheet can go from a few flourishes to a giant maintenance tangle. Before you can say “12-deep nested div”, your in a world of duplication and complexity that prevents you from making timely user-interface updates. [Medium’s](https://medium.com) one organisation that’s been Read the rest...






al

Squared Circle Pit #54 - AVATAR Frontman Johannes Eckerström Talks Wrestling Unlocking His Love of Metal Frontmen

We're back and this week, we're talking to Avatar's colorful frontman Johannes Eckerström. If you've ever seen the band live,...

The post Squared Circle Pit #54 - AVATAR Frontman Johannes Eckerström Talks Wrestling Unlocking His Love of Metal Frontmen appeared first on Metal Injection.