es

Best Alexa Skills That Will Actually Surprise You

Technology has changed the way we live. A few decades back, we couldn’t even imagine making a video call to a person sitting in another corner of the world. With every technological advancement, mankind is treading towards greater development. From smart gadgets to machines, every invention has leveraged the human lifestyle.  There’s no doubt in […]

Original post: Best Alexa Skills That Will Actually Surprise You

The post Best Alexa Skills That Will Actually Surprise You appeared first on Daily Blog Tips.





es

Every Day A Post of WordPress Tips and Tricks until Christmas!

The time has come and our loyal reader know already our traditional Advents Calendar. For the people who don’t know, […]




es

New hooks in WordPress 3.8

WordPress 3.8 introduced one new action and five new filters: automatic_updates_complete Action triggered after all automatic updates have run. (wp-admin/includes/class-wp-upgrader.php) […]




es

Escaping the maintenance mode trap

WordPress makes upgrading very easy . You simply click “Update now”, wait for a minute or two and your system […]




es

Test or Meet at WordCamp San Francisco and Win a Plugin License!

Next week I will be at WordCamp San Francisco and a week later at the WooConf! Maybe one or antoher […]




es

Download older plugin versions from wordpress.org

So you’ve updated your plugins… … and your blog doesn’t work anymore … and you have no backup … … […]




es

Download older plugin versions from wordpress.org

There’s a simple way to get hold of previous versions of your WordPress plugins, for example if a current version […]




es

Article: 25 Beautifully Dark-Schemed Landing Pages for Inspiration

There is something instantly remarkable about a website with a strong, dark color scheme.




es

How to Help Someone With Post-Traumatic Stress Disorder

Listening without judgement is one of the best things you can do for someone with PTSD.




es

Troops to receive Purple Hearts for injuries during Iranian missile barrage on al-Asad airbase in Iraq

There will be Purple Hearts awarded to troops injured during the Jan. 8 Iranian missile barrage on the al-Asad airbase in Iraq, a defense official told Military Times.




es

When Your Veteran Spouse Battles More Than PTSD

For many veterans’ spouses, we’ve watched our partners struggle not only with post-traumatic stress disorder (PTSD) but with other mental health conditions, as well. Around 80 percent of people with PTSD wrestle with at least one other co-occurring mental health condition in their lifetime.What many people don’t see is the impact PTSD and comorbidity have on vets’ spouses.







es

How pottering about in the garden creates a time warp

By Harriet Gross Courtesy of Aeon What’s not to like about gardening? It’s a great way to get outdoors, away from everyday routines, and to exercise your creativity. It’s good for your health, whatever your age, and gardeners tend to be … Continue reading




es

School District Switches to Local and Organic Meals, Cuts Carbon Footprint—and Saves Money

By Melissa Hellmann Yes! Magazine A new report revealed surprising results when Oakland overhauled its lunch menu at 100-plus schools by serving less meat and more fruits and vegetables. When her eldest son was in elementary school in the Oakland … Continue reading




es

Can Business Save the World From Climate Change?

By Bianca Nogrady Ensia A growing number of initiatives are giving corporations the resources to help achieve global climate goals regardless of government support “We are still in.” On June 5, 2017, with these four words a group of U.S. … Continue reading




es

Nature Offers Solutions to Water Woes and Flood Risks

By David Suzuki David Suzuki Foundation When the Aztecs founded Tenochtitlán in 1325, they built it on a large island on Lake Texcoco. Its eventual 200,000-plus inhabitants relied on canals, levees, dikes, floating gardens, aqueducts and bridges for defence, transportation, … Continue reading




es

Children’s Exposure to Secondhand Smoke May Be Vastly Underestimated by Parents

Tel Aviv University Press Release Smoking parents misperceive where and when their kids are exposed to cigarette smoke, Tel Aviv University researchers say Four out of 10 children in the US are exposed to secondhand smoke, according to the American … Continue reading




es

Mobility Pricing Relieves Congestion, Helps People Breathe Easier

By David Suzuki with contributions from Senior Editor Ian Hanington David Suzuki Foundation By 2002, drivers in London, England, were spending as much as half their commuting time stalled in traffic, contributing to much of the city centre’s dangerous particulate … Continue reading




es

The DOJ's Lawless Reversal on Michael Flynn

Randall D. Eliason: The government's motion to dismiss the case against former national security adviser Michael Flynn is like nothing I've ever seen. It's a political screed dressed up as legal analysis, promoting the "deep state" conspiracy fantasies of President Trump. It epitomizes the politicization of the Justice Department under Attorney General William P. Barr. It is, in the truest sense of the word, lawless.




es

Mysterious Sharks Dance Away Bethel's COVID-19 Blues

A couple of mysterious sharks have caught the fancy of the town. Maybe it's the cabin fever finally setting in, or perhaps this is what happens when you go too long without washing your mask, but Bethelites are going wild for two people in inflatable shark suits who pop up randomly around town.




es

Trump Declares, 'I Learned a Lot from Nixon'

During an interview on "Fox and Friends," Trump explained why he chose not to go on a firing spree amid Special Counsel Robert Mueller's Russia investigation a la Nixon's Saturday Night Massacre during the Watergate scandal. "I learned a lot from Richard Nixon: Don't fire people," the President said. "I learned a lot. I study history, and the firing of everybody ... .I should've, in one way," he continued. "But I'm glad I didn't because look at the way it turned out."




es

Roy Horn of 'Siegfried and Roy' Dies of COVID-19 Complications

Roy Horn, famed tiger handler and co-star of the magic duo known as Siegfried and Roy, died of complications from the coronavirus in a hospital in Las Vegas on Friday. He was 75 years old. "Today, the world has lost one of the greats of magic, but I have lost my best friend," Siegfried Fischbacher said in a statement. "From the moment we met, I knew Roy and I, together, would change the world." "There could be no Siegfried without Roy, and no Roy without Siegfried." This is a developing story. Please check back for updates.




es

Top Colorado Republican Pressures Official to Report False Election Results

U.S. Rep. Ken Buck, who is also the chairman of the Colorado Republican Party, was captured ordering a local party official to report false election results in a primary race for a state Senate seat in a leaked audio recording released earlier this week.




es

DHS: Secret Service has 11 Current Virus Cases

According to the DHS document, along with the 11 active cases there are 23 members of the Secret Service who have recovered from COVID-19 and an additional 60 employees who are self-quarantining. No details have been provided about which members of the Secret Service are infected or if any have recently been on detail with the president or vice president.




es

Say Yes, Figure It Out Later. Starting from the Start with Tyler Babin

“It’s impossible to move forward while staying the same”. That’s what motivated Tyler Babin, a 25 year old up & coming filmmaker, who hustled his way into his dream job only to leave it to pursue the riskier thing, an even bigger bet – on himself. I’ve had literally hundreds of requests over the years to have someone on the show who isn’t Richard Branson or Brene Brown or {fill in the blank star}…ie. host someone who hasn’t “made it big” and is, instead, on the come-up themselves…someone from within our very own community who has been listening for years, connecting dots, gleaning knowledge and is now taking major action on that.  Well THIS is Tyler’s story. If you’ve  followed my pal Gary Vaynerchuk, it’s likely you’ve actually seen some of Tyler’s work. For the last 3-4 years, he’s been a whirlwind tour traveling the world with Gary, shooting photo + video, creative directing projects at Vayner… and it all started right here on this show nearly 8 years ago.  This episode goes full circle, friends. Also – instead of the usual studio conversation, Tyler and I recorded the show while grabbing a burger & margarita just around the corner […]

The post Say Yes, Figure It Out Later. Starting from the Start with Tyler Babin appeared first on Chase Jarvis Photography.




es

the quest for personal style (with pal Alex Strohl)

One of the most common questions I get is about how to stand out + how to develop personal style. So when fellow photographer Alex Strohl stopped by the studio, I wanted to get his take on this ever-popular question. If you’re not familiar with Alex’s work, a quick spin on instagram will fill in the blanks. He’s a photographer that tells stories through pictures and film. And when you see his work, there is a distinct thumbprint on it. Developing a personal style is critical. It’s the reason why someone would seek you out vs someone else. It’s the thing that differentiates your work from everyone else. There’s a thousand ways to develop your personal style. In our conversation, Alex shares some of his insights he’s gained along the way. Though each of us may take a different path to get there, there is one constant, and that’s doing a lot of work. So take a listen and then get back to work. ???? Enjoy and subscribe to the podcast below if you dig.  Please give Alex a shout on social @alexstrohl ???? FOLLOW ALEX: twitter | instagram | website Listen to the Podcast Subscribe   Watch the Episode  […]

The post the quest for personal style (with pal Alex Strohl) appeared first on Chase Jarvis Photography.




es

Independence and the Art of Timeless Work with Zoë Keating

A cellist since the age of eight, Zoë Keating pursued electronic music and contemporary composition as part of her Liberal Arts studies at Sarah Lawrence College in New York. I came across her music almost 10 years ago and love it so much I reached out to see if she would be interested on being on the show. Not only did she respond, she left us reeling from her incredible live performance and chat on art + entrepreneurship. Now she’s back on tour with her latest album Snowmelt. In this episode, we go deep into personal growth, dealing with incredible loss, balancing parenthood and career, and landscape for independent artists. Enjoy! FOLLOW ZOË: instagram | twitter | website Listen to the Podcast Subscribe   Watch the Episode  This podcast is brought to you by CreativeLive. CreativeLive is the world’s largest hub for online creative education in photo/video, art/design, music/audio, craft/maker, money/life and the ability to make a living in any of those disciplines. They are high quality, highly curated classes taught by the world’s top experts — Pulitzer, Oscar, Grammy Award winners, New York Times best selling authors and the best entrepreneurs of our times.

The post Independence and the Art of Timeless Work with Zoë Keating appeared first on Chase Jarvis Photography.




es

Adaptation, Self-Awareness and Art of the Side Hustle with Chris Guillebeau

Chris Guillebeau has traveled to 193 countries. And just to be clear, that is all of the countries recognized on the planet. He is the first person to do it before the age of 35. More importantly, he has built online businesses, side hustles, and mastered the art of a non-conforming lifestyle since he was 19 years old. There’s almost nobody better person equipped to talk about starting lots of businesses. He has a daily podcast called Side Hustle School where he’s featured more than 850 different side hustle businesses + featured many in his new book called 100 Side Hustles. Chris also started half a dozen or more himself, started one of my favorite conferences, The World Domination Summit, and is a New York Times bestselling author of books like the $100 Start Up and The Art of Non-Conformity and many others. This guy is a beast and he’s so savvy, so humble. In this episode: We go into details about some of Chris’ favorite side hustle businesses he’s come across in his podcast & writing this book – what are some of the most common traits and failures. Chris shares his experience with depression, how he’s faced it, […]

The post Adaptation, Self-Awareness and Art of the Side Hustle with Chris Guillebeau appeared first on Chase Jarvis Photography.




es

How To Get UN-STUCK From Anything in Life That’s Got You Down [with Lewis Howes]

Ever felt STUCK with something in your life? Blocked, like you can’t get past this mental state, this hurdle, this creative block, this bad habit, this… Wait a minute. Why am I even asking that question? Of course you’ve been stuck before. We’ve literally ALL been stuck before. And by extension we all know how much it sucks to be in this state of mind. AND – on the flipside – how amazing it is when you can reclaim your life and get back to the things you want to be thinking, doing, and becoming. I’m obsessed with overcoming the mental blockers that try to keep me down – and I think it’s been a big piece of my personal success. Which is why I thought this little nugget might help. ENTER: Lewis Howes. My good friend Lewis Howes was in the studio shooting his newest CreativeLive course last week and I was able to snag him for a few minutes to chat about his new book and his amazingly simple, yet powerful process for reclaiming our lives and live our biggest dreams. In this episode, Lewis shares a powerful experience from his life and how- on reflection – it helped […]

The post How To Get UN-STUCK From Anything in Life That’s Got You Down [with Lewis Howes] appeared first on Chase Jarvis Photography.




es

Finding Stillness in a Fast Paced World with Ryan Holiday

Ryan Holiday is described by the New York Times as popularizing stoicism, a philosophy of personal ethics which has been practiced by Kings, presidents, artists, writers, and entrepreneurs. His career started at 19 when he dropped out of college at 19 to work with author Robert Greene. Today, he’s a NYT Bestselling author, with 9 books under his belt, including his latest book: Stillness Is the Key which hit #1 on its first week. In this episode: Stillness isn’t a monk-like existence only reserved for the enlightened. Stillness is the idea of being still in a chaotic world and where our best work will come from. Ryan’s personal habits and process during the creation process to find stillness and it doesn’t include meditation. How to say no and build a practice around managing your time. Enjoy! FOLLOW RYAN: instagram | twitter | website Listen to the Podcast Subscribe   Watch the Episode  This podcast is brought to you by CreativeLive. CreativeLive is the world’s largest hub for online creative education in photo/video, art/design, music/audio, craft/maker, money/life and the ability to make a living in any of those disciplines. They are high quality, highly curated classes taught by the world’s top […]

The post Finding Stillness in a Fast Paced World with Ryan Holiday appeared first on Chase Jarvis Photography.




es

Resilience and Going Untouchable with Neil Pasricha

Neil Pasricha is a bestselling author and podcaster whose work focuses on topics core to all of our lives: gratitude, happiness, failure, resilience, and trust. He’s the author of six books including The Book of Awesome, The Happiness Equation, Awesome Is Everywhere, and his latest book: You Are Awesome.  In this episode: We are too thin skinned. No matter how great our achievements, we’re crushed by the simplest things. Neil shares some practical advice to navigate through pain and build resiliency Always do something you’re learning… Or as I like to say, how to give yourself permission to suck There’s a reason why they call something a “practice”. We get into how to let go and allow yourself to be human. and much more Enjoy! FOLLOW NEIL: twitter | website Listen to the Podcast Subscribe   This podcast is brought to you by CreativeLive. CreativeLive is the world’s largest hub for online creative education in photo/video, art/design, music/audio, craft/maker, money/life and the ability to make a living in any of those disciplines. They are high quality, highly curated classes taught by the world’s top experts — Pulitzer, Oscar, Grammy Award winners, New York Times best selling authors and the best entrepreneurs […]

The post Resilience and Going Untouchable with Neil Pasricha appeared first on Chase Jarvis Photography.




es

Design Your Life with Creative Calling + Debbie Millman

Debbie Millman is one of my dear friends, a powerhouse creative and someone who inspires me every day. When I was developing my online companion class to the Creative Calling book, of course I had to ask Debbie to join me on stage for a conversation around designing our life with intention. Debbie’s insight is pure gold. AND – this is just one of the segments from the class. If you already have my book, you can access the entire class for free. All you need to do is visit www.creativelive.com/creativecalling and sign up there. Enjoy! FOLLOW DEBBIE: instagram | twitter | website Listen to the Podcast Subscribe   This podcast is brought to you by CreativeLive. CreativeLive is the world’s largest hub for online creative education in photo/video, art/design, music/audio, craft/maker, money/life and the ability to make a living in any of those disciplines. They are high quality, highly curated classes taught by the world’s top experts — Pulitzer, Oscar, Grammy Award winners, New York Times best selling authors and the best entrepreneurs of our times.

The post Design Your Life with Creative Calling + Debbie Millman appeared first on Chase Jarvis Photography.




es

Chris Burkard: Say Yes to What You Want

Today’s guest is one many of you have been asking for oh-so-long. He’s one of the top travel, outdoor, and landscape photographers in the world, bringing us to some of the most untamed and powerful landscapes in the pursuit of powerful stories, hidden surf, and a good adventure. Of course in this episode we get into his new book, At Glacier’s End, but we also get into some meaty topics such as: the power of exploring personal projects and how it can shape new opportunities the sacrifice that comes as pursing your passions personal growth and how it evolves over time and so much more Enjoy! FOLLOW CHRIS: instagram | twitter | website Listen to the Podcast Subscribe   Watch the Episode  This podcast is brought to you by CreativeLive. CreativeLive is the world’s largest hub for online creative education in photo/video, art/design, music/audio, craft/maker, money/life and the ability to make a living in any of those disciplines. They are high quality, highly curated classes taught by the world’s top experts — Pulitzer, Oscar, Grammy Award winners, New York Times best selling authors and the best entrepreneurs of our times.

The post Chris Burkard: Say Yes to What You Want appeared first on Chase Jarvis Photography.




es

Pay Attention to What Ignites You with Jody MacDonald

Imagine this: Your job is good, and safe, but it’s not fueling you anymore. You decide to quit your “real” job and sell all your belongings to live a life of adventure. And just as you are waving your last goodbye, the unthinkable happens and it changes everything. Like most of us, award winning photographer Jody MacDonald didn’t know what her path would be. Yet when her wake up call came, she listened. From train hopping in the Sahara to paragliding in the Himalaya, she’s no stranger to adventure and exploration. Her work blends insightful storytelling, big adventure expeditions and social change in the hopes of promoting the preservation of wild places. Men’s Journal named her “One of the 25 Most Adventures Women in the Past 25 Years and National Geographic said she’s one of the top female adventure photographers pushing the limits. I’ve admired Jody’s work from afar for years. Her life story and career arc is remarkable. It set her on a path to tackle some of the life’s biggest questions and what she has learned is pure gold. In this episode: Why waste your time on things that make you unhappy? What Jody does to tune into […]

The post Pay Attention to What Ignites You with Jody MacDonald appeared first on Chase Jarvis Photography.




es

Finance Fireside Chat with Ramit Sethi

In this episode I’m chatting with my long time friend and financial guru, Ramit Sethi. Ramit has been on the show a number of times, and this time we’re connecting virtually from our living rooms during the quarantine. Of course we get into finances during these uncertain times, but more importantly: adaptation and resilience. Over the years, no one has single-handedly given me better insight about the business side of art than the New York Times bestselling author, Ramit Sethi. Take a listen and let us know what you think. Enjoy! This episode was part of CreativeLive TV, a brand-new, free, 24/7 variety show, live-streamed from the very casual living rooms, studios, and kitchen tables of our worldwide community of legendary creators. You can expect musical performances, Q&As, cooking, spoken word, drawing, and more – featuring many of our favorite personalities – all in a safe, virtual space full of joy, shared experiences, and connection via live, interactive chat. The schedule and upcoming broadcasts can be seen at http://creativelive.com/tv FOLLOW RAMIT: instagram | twitter | website Listen to the Podcast  Subscribe   Watch the Episode This podcast is brought to you by CreativeLive. CreativeLive is the world’s largest hub […]

The post Finance Fireside Chat with Ramit Sethi appeared first on Chase Jarvis Photography.




es

Resilience + Reinvention with Canlis Restaurateurs

In any uncertain time there, we can both feel anxious, upset, curious and we can also look for opportunities. Opportunities for reinvention, for connection, and community in ways we haven’t seen before. That’s the theme of today’s episode with some of my good friends Mark and Brian Canlis + James Beard Award Winning Chef Brady Williams in a conversation we recorded for CreativeLive TV. Mark and Brian run an iconic restaurant in Seattle named Canlis. It’s been a family business for over 70 years. Faced with these uncertain times, they share how they’ve reinvented their business 3 times over the last couple of months. No matter what industry you’re in, their story of overcoming obstacles, problem solving and heart is wisdom for all of us. Enjoy! FOLLOW CANLIS: instagram | website Listen to the Podcast Subscribe   Watch the Episode This podcast is brought to you by CreativeLive. CreativeLive is the world’s largest hub for online creative education in photo/video, art/design, music/audio, craft/maker, money/life and the ability to make a living in any of those disciplines. They are high quality, highly curated classes taught by the world’s top experts — Pulitzer, Oscar, Grammy Award winners, New York Times best selling authors […]

The post Resilience + Reinvention with Canlis Restaurateurs appeared first on Chase Jarvis Photography.




es

Hope in a Sea of Endless Calamity with Mark Manson

Today on the show, I’m chatting with New York Times bestselling author Mark Manson. He is the #1 New York Times Bestselling author of Everything is F*cked and The Subtle Art of Not Giving a F*ck, the mega-bestseller that reached #1 in fourteen different countries. Mark also runs one of the largest personal growth websites in the world, MarkManson.net, a blog with more than two million monthly readers and half a million subscribers, making him one of the largest and most successful independent publishers in the world. In this episode, we take a deep dive into the creative process. How to spend your time when you’re trying get comfortable with being uncomfortable. Mark helps bring into focus the up-side that this moment has created for us while also sharing some of the tactics he while quarantined. Enjoy! FOLLOW MARK: instagram | twitter | website Listen to the Podcast Subscribe   This podcast is brought to you by CreativeLive. CreativeLive is the world’s largest hub for online creative education in photo/video, art/design, music/audio, craft/maker, money/life and the ability to make a living in any of those disciplines. They are high quality, highly curated classes taught by the world’s top experts — Pulitzer, Oscar, […]

The post Hope in a Sea of Endless Calamity with Mark Manson appeared first on Chase Jarvis Photography.




es

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.




es

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

es

Committed to the wrong branch? -, @{upstream}, and @{-1} to the rescue

I get into this situation sometimes. Maybe you do too. I merge feature work into a branch used to collect features, and then continue development but on that branch instead of back on the feature branch

git checkout feature
# ... bunch of feature commits ...
git push
git checkout qa-environment
git merge --no-ff --no-edit feature
git push
# deploy qa-environment to the QA remote environment
# ... more feature commits ...
# oh. I'm not committing in the feature branch like I should be

and have to move those commits to the feature branch they belong in and take them out of the throwaway accumulator branch

git checkout feature
git cherry-pick origin/qa-environment..qa-environment
git push
git checkout qa-environment
git reset --hard origin/qa-environment
git merge --no-ff --no-edit feature
git checkout feature
# ready for more feature commits

Maybe you prefer

git branch -D qa-environment
git checkout qa-environment

over

git checkout qa-environment
git reset --hard origin/qa-environment

Either way, that works. But it'd be nicer if we didn't have to type or even remember the branches' names and the remote's name. They are what is keeping this from being a context-independent string of commands you run any time this mistake happens. That's what we're going to solve here.

Shorthands for longevity

I like to use all possible natively supported shorthands. There are two broad motivations for that.

  1. Fingers have a limited number of movements in them. Save as many as possible left late in life.
  2. Current research suggests that multitasking has detrimental effects on memory. Development tends to be very heavy on multitasking. Maybe relieving some of the pressure on quick-access short term memory (like knowing all relevant branch names) add up to leave a healthier memory down the line.

First up for our scenario: the - shorthand, which refers to the previously checked out branch. There are a few places we can't use it, but it helps a lot:

Bash
# USING -

git checkout feature
# hack hack hack
git push
git checkout qa-environment
git merge --no-ff --no-edit -        # ????
git push
# hack hack hack
# whoops
git checkout -        # now on feature ???? 
git cherry-pick origin/qa-environment..qa-environment
git push
git checkout - # now on qa-environment ????
git reset --hard origin/qa-environment
git merge --no-ff --no-edit -        # ????
git checkout -                       # ????
# on feature and ready for more feature commits
Bash
# ORIGINAL

git checkout feature
# hack hack hack
git push
git checkout qa-environment
git merge --no-ff --no-edit feature
git push
# hack hack hack
# whoops
git checkout feature
git cherry-pick origin/qa-environment..qa-environment
git push
git checkout qa-environment
git reset --hard origin/qa-environment
git merge --no-ff --no-edit feature
git checkout feature
# ready for more feature commits

We cannot use - when cherry-picking a range

> git cherry-pick origin/-..-
fatal: bad revision 'origin/-..-'

> git cherry-pick origin/qa-environment..-
fatal: bad revision 'origin/qa-environment..-'

and even if we could we'd still have provide the remote's name (here, origin).

That shorthand doesn't apply in the later reset --hard command, and we cannot use it in the branch -D && checkout approach either. branch -D does not support the - shorthand and once the branch is deleted checkout can't reach it with -:

# assuming that branch-a has an upstream origin/branch-a
> git checkout branch-a
> git checkout branch-b
> git checkout -
> git branch -D -
error: branch '-' not found.
> git branch -D branch-a
> git checkout -
error: pathspec '-' did not match any file(s) known to git

So we have to remember the remote's name (we know it's origin because we are devoting memory space to knowing that this isn't one of those times it's something else), the remote tracking branch's name, the local branch's name, and we're typing those all out. No good! Let's figure out some shorthands.

@{-<n>} is hard to say but easy to fall in love with

We can do a little better by using @{-<n>} (you'll also sometimes see it referred to be the older @{-N}). It is a special construct for referring to the nth previously checked out ref.

> git checkout branch-a
> git checkout branch-b
> git rev-parse --abbrev-rev @{-1} # the name of the previously checked out branch
branch-a
> git checkout branch-c
> git rev-parse --abbrev-rev @{-2} # the name of branch checked out before the previously checked out one
branch-a

Back in our scenario, we're on qa-environment, we switch to feature, and then want to refer to qa-environment. That's @{-1}! So instead of

git cherry-pick origin/qa-environment..qa-environment

We can do

git cherry-pick origin/qa-environment..@{-1}

Here's where we are (🎉 marks wins from -, 💥 marks the win from @{-1})

Bash
# USING - AND @{-1}

git checkout feature
# hack hack hack
git push
git checkout qa-environment
git merge --no-ff --no-edit -                # ????
git push
# hack hack hack
# whoops
git checkout -                               # ????
git cherry-pick origin/qa-environment..@{-1} # ????
git push
git checkout -                               # ????
git reset --hard origin/qa-environment
git merge --no-ff --no-edit -                # ????
git checkout -                               # ????
# ready for more feature commits
Bash
# ORIGINAL

git checkout feature
# hack hack hack
git push
git checkout qa-environment
git merge --no-ff --no-edit feature
git push
# hack hack hack
# whoops
git checkout feature
git cherry-pick origin/qa-environment..qa-environment
git push
git checkout qa-environment
git reset --hard origin/qa-environment
git merge --no-ff --no-edit feature
git checkout feature
# ready for more feature commits

One down, two to go: we're still relying on memory for the remote's name and the remote branch's name and we're still typing both out in full. Can we replace those with generic shorthands?

@{-1} is the ref itself, not the ref's name, we can't do

> git cherry-pick origin/@{-1}..@{-1}
origin/@{-1}
fatal: ambiguous argument 'origin/@{-1}': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

because there is no branch origin/@{-1}. For the same reason, @{-1} does not give us a generalized shorthand for the scenario's later git reset --hard origin/qa-environment command.

But good news!

Do @{u} @{push}

@{upstream} or its shorthand @{u} is the remote branch a that would be pulled from if git pull were run. @{push} is the remote branch that would be pushed to if git push was run.

> git checkout branch-a
Switched to branch 'branch-a'
Your branch is ahead of 'origin/branch-a' by 3 commits.
  (use "git push" to publish your local commits)
> git reset --hard origin/branch-a
HEAD is now at <the SHA origin/branch-a is at>

we can

> git checkout branch-a
Switched to branch 'branch-a'
Your branch is ahead of 'origin/branch-a' by 3 commits.
  (use "git push" to publish your local commits)
> git reset --hard @{u}                                # <-- So Cool!
HEAD is now at <the SHA origin/branch-a is at>

Tacking either onto a branch name will give that branch's @{upstream} or @{push}. For example

git checkout branch-a@{u}

is the branch branch-a pulls from.

In the common workflow where a branch pulls from and pushes to the same branch, @{upstream} and @{push} will be the same, leaving @{u} as preferable for its terseness. @{push} shines in triangular workflows where you pull from one remote and push to another (see the external links below).

Going back to our scenario, it means short, portable commands with a minimum human memory footprint. (🎉 marks wins from -, 💥 marks the win from @{-1}, 😎 marks the wins from @{u}.)

Bash
# USING - AND @{-1} AND @{u}

git checkout feature
# hack hack hack
git push
git checkout qa-environment
git merge --no-ff --no-edit -    # ????
git push
# hack hack hack
# whoops
git checkout -                   # ????
git cherry-pick @{-1}@{u}..@{-1} # ????????
git push
git checkout -                   # ????
git reset --hard @{u}            # ????
git merge --no-ff --no-edit -    # ????
git checkout -                   # ????
# ready for more feature commits
Bash
# ORIGINAL

git checkout feature
# hack hack hack
git push
git checkout qa-environment
git merge --no-ff --no-edit feature
git push
# hack hack hack
# whoops
git checkout feature
git cherry-pick origin/qa-environment..qa-environment
git push
git checkout qa-environment
git reset --hard origin/qa-environment
git merge --no-ff --no-edit feature
git checkout feature
# ready for more feature commits

Make the things you repeat the easiest to do

Because these commands are generalized, we can run some series of them once, maybe

git checkout - && git reset --hard @{u} && git checkout -

or

git checkout - && git cherry-pick @{-1}@{u}.. @{-1} && git checkout - && git reset --hard @{u} && git checkout -

and then those will be in the shell history just waiting to be retrieved and run again the next time, whether with CtrlR incremental search or history substring searching bound to the up arrow or however your interactive shell is configured. Or make it an alias, or even better an abbreviation if your interactive shell supports them. Save the body wear and tear, give memory a break, and level up in Git.

And keep going

The GitHub blog has a good primer on triangular workflows and how they can polish your process of contributing to external projects.

The FreeBSD Wiki has a more in-depth article on triangular workflow process (though it doesn't know about @{push} and @{upstream}).

The construct @{-<n>} and the suffixes @{push} and @{upstream} are all part of the gitrevisions spec. Direct links to each:



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

    es

    Setting New Project Managers Up for Success

    At Viget, we’ve brought on more than a few new Project Managers over the past couple of years, as we continue to grow. The awesome new people we’ve hired have ranged in their levels of experience, but some of them are earlier in their careers and need support from more experienced PMs to develop their skills and flourish.

    We have different levels of training and support for new PMs. These broadly fall into four categories:

    • Onboarding: Learning about Viget tools and processes
    • Shadowing: Learning by watching others
    • Pairing: Learning by doing collaboratively
    • Leading: Learning by doing solo

    Onboarding

    In addition to conducting intro sessions to each discipline at Viget, new Viget PMs go through a lengthy set of training sessions that are specific to the PM lab. These include intros to:

    PM tools and resourcesProject processes
    Project typesProject checklists
    Project taskingProject planning
    Budgets, schedules, and resourcingRetrospectives
    Working with remote teamsProject kickoffs
    Thinking about developmentGithub and development workflow
    Tickets, definition, and documentationQA testing
    Account management

    Shadowing

    After PMs complete the onboarding process, they start shadowing other PMs’ projects to get exposure to the different types of projects we run (since the variety is large). We cater length and depth of shadowing based on how much experience a PM has coming in. We also try to expose PMs to multiple project managers, so they can see how PM style differs person-to-person.

    We’ve found that it can be most effective to have PMs shadow activities that are more difficult to teach in theory, such as shadowing a PM having a difficult conversation with a client, or shadowing a front-end build-out demo to see how the PM positions the meeting and our process to the client. More straightforward tasks like setting up a Harvest project could be done via pairing, since it’s easy to get the hang of with a little guidance.

    Pairing

    While shadowing is certainly helpful, we try to get PMs into pairing mode pretty quickly, since we’ve found that most folks learn better by doing than by watching. Sometimes this might mean having a new PM setting up an invoice or budget sheet for a client while a more experienced PM sits next to them, talking them through the process. We’ve found that having a newer PM lead straightforward activities with guidance tends to be more effective than the newer PM merely watching the more experienced PM do that activity.

    Another tactic we take is to have both PMs complete a task independently, and then meet and talk through their work, with the more experienced PM giving the less experienced PM feedback. That helps the newer PM think through a task on their own, and gain experience, but still have the chance to see how someone else would have approached the task and get meaningful feedback.

    Leading

    Once new PMs are ready to be in the driver’s seat, they are staffed as the lead on projects. The timing of when someone shifts into a lead role depends on how much prior experience that person has, as well as what types of projects are actively ready to be worked on.

    Most early-career project managers have a behind-the-scenes project mentor (another PM) on at least their first couple projects, so they have a dedicated person to ask questions and get advice from who also has more detailed context than that person’s manager would. For example, mentors often shadow key client and internal meetings and have more frequent check-ins with mentees. This might be less necessary at a company where all the projects are fairly similar, but at Viget, our projects vary widely in scale and services provided, as well as client needs. Because of this, there’s no “one size fits all” process and we have a significant amount of customization per project, which can be daunting to new PMs who are still getting the hang of things.

    For these mentorship pairings, we use a mentorship plan document (template here) to help the mentor and mentee work together to define goals, mentorship focuses, and touchpoints. Sometimes the mentee’s manager will take a first stab at filling out the plan, other times, the mentor will start that process.

    Management Touchpoints

    Along the way, we make sure new PMs have touchpoints with their managers to get the level of support they need to grow and succeed. Managers have regular 1:1s with PMs that are referred to as “project 1:1s”, and are used for the managee to talk through and get advice on challenges or questions related to the projects they’re working on—though really, they can be used for whatever topics are on the managee’s mind. PMs typically have 1:1s with managers daily the first week, two to three times per week after that for the first month or so, then scale down to once per week, and then scale down to bi-weekly after the first six months.

    In addition to project 1:1s, we also have monthly 1:1s that are more bigger-picture and focused on goal-setting and progress, project feedback from that person’s peers, reflection on how satisfied and fulfilled they’re feeling in their role, and talking through project/industry interests which informs what projects we should advocate for them to be staffed on. We have a progress log template that we customize per PM to keep track of goals and progress.

    We try to foster a supportive environment that encourages growth, feedback, and experiential learning, but also that lets folks have the autonomy to get in the driver’s seat as soon as they’re comfortable. Interested in learning more about what it’s like to work at Viget? Check out our open positions here.




    es

    Our WFH Best Practices

    Our first remote office opened in 2007 when a designer and a developer left our HQ office and moved to Durham. Ever since we've been fine-tuning our ability to collaborate across locations. Today, we have team members across the country in our four offices, and we have fully remote employees in Charleston, Kansas City, New York City, Dallas, and Charlottesville.

    Because of the coronavirus outbreak, a lot of people recently started working from their homes across the world, the country, and Viget. We wanted to share some of our best practices for being great teammates and doing great work, regardless of locale, and we’d love to hear yours in the comments.

    Communicate Often and Write It Down

    We want every person at Viget to be informed and connected. We do this in a few ways. We have a company Knowledge Base, which contains critical information including HR policies, office processes, brand guidelines, project resources, etc. We also have a well-organized Google Drive that everyone can access.

    My favorite communication tool we use, however, is our Internal Lab Report. Every week, we create a Google Doc with HR updates, birthdays, upcoming events we’re attending, relevant publicity we or a client received, and timely updates on projects, sales, and recruiting. This report allows the entire team to have the same information, regardless of PTO schedules, and it provides a record that can be referenced weeks, months, or years later.

    I have also found our Slack habits really helpful. We try to make our availability easily known, mostly via a passive Slack status. We each update our status daily, sometimes multiple times, so people can see if we’re working from home, out of the office for an appointment, in a meeting, or offline for a personal phone call. We also have a few Slack Channels we use very specifically to announce PTO, important announcements, and recently, one that is specific to the updating coronavirus situation.

    My work from home station.

    Figure Out Your Boundaries

    This looks different for everyone and can be an ever-changing target. Understanding your boundaries requires you to be honest with yourself – Are you easily distracted? Can you successfully work in pajama pants? Will your dog actually allow you to get work done? Does working from the couch result in good work, or do you need a designated work spot? For some, working from home requires setting boundaries to ensure the work gets done. For others, working from home requires setting a start and stop times to ensure you don’t overwork yourself.

    Viget has a flexible work policy, so many of us work from home fairly often and have gotten our routines set up. As such, we have written about this before! Check out Trevor’s article about working remotely.

    Show Your Face

    When I first started at Viget, I’d never worked anywhere that used a Google Hangout for nearly every meeting. At first, I was tempted to call into meetings and leave the camera off because I found it exposing. Now, I can’t imagine not using it, and I’ve even embraced it in my personal life with friends and family. I realized the value in face-to-face conversations even in virtual form, the ability to see body language, and the connection you establish when you see each other's faces — even if your hair isn't perfect or you haven't arranged your plants just-so in the view behind you. Whenever possible, use your camera during a meeting. It increases trust, communication, and in my personal-not-backed-by-science-opinion, lightness, which frankly, I think we can all use a bit more of right now.

    Here's a screen shot from our Saint Patrick's Day Happy Hour.

    Create Shared Experiences

    As a company with project teams often distributed across our four locations, cross-office experiences are vital to our culture, and we’ve spent years working to keep our remote offices in sync. A few of our ongoing group activities include a monthly virtual Book Club, our weekly full-team Free Lunch Friday tradition, Donut for Slack, and, of course, our Pointless Weekends.

    The current global health crisis now requires almost all of the company to work remote, so we’ve gotten creative with our attempts to increase non-project time together, in order to keep up the vibes we’ve worked hard to create.

    What we’ve recently started:

      • Last Weekend this Morning - Monday mornings, we have an optional virtual coffee, where anyone who’d like to chat can join and share the latest gardening lesson or bingeable tv show. It lets us start our week off as we would when we’re all in the office — saying hello to each other.
      • Virtual Happy Hours - We are a company that likes to socialize, and a bit of distance doesn’t stop us. This week, we set up an after-hours Happy Hour for St. Patrick’s Day.
      • Daily Lunch Table- If you’ve ever visited our HQ office in Falls Church, you’ll notice our large kitchen table. We have an informal tradition of gathering around noon to eat together, whether it’s just a couple folks or the whole team. We now do this lunch virtually. So far, we’re mostly taking turns discussing who is eating what, and of course, sharing said recipes.

    I crowdsourced some ideas from the Viget team, and here are some noteworthy takeaways:

    "In remote meetings, minimize all your other windows and be fully present. It’s easy to allow your attention to accidentally drift if you see a new Slack channel light up, especially if you’re in a larger meeting. Suddenly, you find yourself multitasking. Treat the meeting as if you were there in person: unless you’re taking notes, minimize your other tabs, and give the conversation your full attention."
    - Paul Koch

    “I try to reach out to more folks I don’t consistently work with. Since there’s less interaction in general, I want to be more intentional about staying connected.”
    - Laura Sweltz

    “Good habits are hard to form and bad habits are hard to break, and it’s often hard to find the right time to make a change. Most of us are experiencing a disruption to our usual behaviors right now, but that doesn’t have to be entirely bad. Be deliberate now and when this is over, we might all end up with some new work habits worth keeping.”
    - Emily Bloom

    “I’ve found it helpful to create a physical space similar to the one I had at work. While this isn’t exactly possible, small things like setting up a laptop stand and second screen make it so I’m less likely to get distracted and wander to the couch or kitchen (aka the snack danger zone.).”
    - Aubrey Lear

    “It’s easy to get stuck in one spot all day, so be proactive about moving around, or creating excuses to do so. Whether that’s making yourself a cup of coffee, eating lunch away from your computer, or going for a quick walk outside for some fresh air. This will help reduce the risk of going stir crazy.”
    -Zach Robbins

    True to Viget form, our remote work is all about “Progress, Not Perfection.” While remote collaboration is ingrained in our company, we’re looking for opportunities to fine-tune our approach and improve our habits.

    We’d love to hear from you: What are your best practices? Lessons learned?




    es

    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.




    es

    Unsolved Zoom Mysteries: Why We Have to Say “You’re Muted” So Much

    Video conference tools are an indispensable part of the Plague Times. Google Meet, Microsoft Teams, Zoom, and their compatriots are keeping us close and connected in a physically distanced world.

    As tech-savvy folks with years of cross-office collaboration, we’ve laughed at the sketches and memes about vidconf mishaps. We practice good Zoomiquette, including muting ourselves when we’re not talking.

    Yet even we can’t escape one vidconf pitfall. (There but for the grace of Zoom go I.) On nearly every vidconf, someone starts to talk, and then someone else says: “Oop, you’re muted.” And, inevitably: “Oop, you’re still muted.”

    That’s right: we’re trying to follow Zoomiquette by muting, but then we forget or struggle to unmute when we do want to talk.

    In this post, I’ll share my theories for why the You’re Muted Problems are so pervasive, using Google Meet, Microsoft Teams, and Zoom as examples. Spoiler alert: While I hope this will help you be more mindful of the problem, I can’t offer a good solution. It still happens to me. All. The. Time.

    Skip the why and go straight to the vidconf app keyboard shortcuts you should memorize right now.

    Why we don't realize we’re muted before talking

    Why does this keep happening?!?

    Simply put: UX and design decisions make it harder to remember that you’re muted before you start to talk.

    Here’s a common scenario: You haven’t talked for a bit, so you haven’t interacted with the Zoom screen for a few seconds. Then you start to talk — and that’s when someone tells you, “You’re muted.”

    We forget so easily in these scenarios because when our mouse has been idle for a few seconds, the apps hide or downplay the UI elements that tell us we’re muted.

    Zoom and Teams are the worst offenders:

    • Zoom hides both the toolbar with the main in-app controls (the big mute button) and the mute status indicator on your video pane thumbnail.
    • Teams hides the toolbar, and doesn't show a mute status indicator on your video thumbnail in the first place.

    Meet is only slightly better:

    • Meet hides the toolbar, and shows only a small mute status icon in your video thumbnail.

    Even when our mouse is active, the apps’ subtle approach to muted state UI can make it easy to forget that we’re muted:

    Teams is the worst offender:

    • The mute button is an icon rather than words.
    • The muted-state icon's styling could be confused with unmuted state: Teams does not follow the common pattern of using red to denote muted state.
    • The mute button is not differentiated in visual hierarchy from all the other controls.
    • As mentioned above, Teams never shows a secondary mute status indicator.

    Zoom is a bit better, but still makes it pretty easy to forget that you’re muted:

    • Pros:
      • Zoom is the only app to use words on the mute button, in this case to denote the button action (rather than the muted state).
      • The muted-state icon’s styling (red line) is less likely to be confused with the unmuted-state icon.
    • Cons:
      • The mute button’s placement (bottom left corner of the page) is easy to overlook.
      • The mute button is not differentiated in visual hierarchy from the other toolbar buttons — and Zoom has a lot of toolbar buttons, especially when logged in as host.
      • The secondary mute status indicator is a small icon.
      • The mute button’s muted-state icon is styled slightly differently from the secondary mute status indicator.
    • Potential Cons:
      • While words denote the button action, only an icon denotes the muted state.

    Meet is probably the clearest of the three apps, but still has pitfalls:

    • Pros:
      • The mute button is visually prominent in the UI: It’s clearly differentiated in the visual hierarchy relative to other controls (styled as a primary button); is a large button; and is placed closer to the center of the controls bar.
      • The muted-state icon’s styling (red fill) is less likely to be confused with the unmuted-state icon.
    • Cons:
      • Uses only an icon rather than words to denote the muted state.
    • Unrelated Con:
      • While the mute button is visually prominent, it’s also placed next to the hang-up button. So in Meet’s active state you might be less likely to forget you’re muted … but more likely to accidentally hang up when trying to unmute. 😬

    I know modern app design leans toward minimalism. There’s often good rationale to use icons rather than words, or to de-emphasize controls and indicators when not in use.

    But again: This happens on basically every call! Often multiple times per call!! And we’re supposed to be tech-savvy!!! Imagine what it’s like for the tens of millions of vidconf newbs.

    I would argue that “knowing your muted state” has turned out to be a major vidconf user need. At this point, it’s certainly worth rethinking UX patterns for.

    Why we keep unsuccessfully unmuting once we realize we’re muted

    So we can blame the You’re Muted Problem on UX and design. But what causes the You’re Still Muted Problem? Once we know we’re muted, why do we sometimes fail to unmute before talking again?

    This one is more complicated — and definitely more speculative. To start making sense of this scenario, here’s the sequence I’m guessing most commonly plays out (I did this a couple times before I became aware of it):

    The crucial part is when the person tries to unmute by pressing the keyboard Volume On/Off key.

    If that’s in fact what’s happening (again, this is just a hypothesis), I’m guessing they did that because when someone says “You’re muted” or “I can’t hear you,” our subconscious thought process is: “Oh, Audio is Off. Press the keyboard key that I usually press when I want to change Audio Off to Audio On.”

    There are two traps in this reflexive thought process:

    First, the keyboard volume keys control the speaker volume, not the microphone volume. (More specifically, they control the system sound output settings, rather than the system sound input settings or the vidconf app’s sound input settings.)

    In fact, there isn’t a keyboard key to control the microphone volume. You can’t unmute your mic via a dedicated keyboard key, the way that you can turn the speaker volume on/off via a keyboard key while watching a movie or listening to music.

    Second, I think we reflexively press the keyboard key anyway because our mental model of the keyboard audio keys is just: Audio. Not microphone vs. speaker.

    This fuzzy mental model makes sense: There’s only one set of keyboard keys related to audio, so why would I think to distinguish between microphone and speaker? 

    So my best guess is hardware design causes the You’re Still Muted Problem. After all, keyboard designs are from a pre-Zoom era, when the average person rarely used the computer’s microphone.

    If that is the cause, one potential solution is for hardware manufacturers to start including dedicated keys to control microphone volume:

    Video conference keyboard shortcuts you should memorize right now

    Let me know if you have other theories for the You’re Still Muted Problem!

    In the meantime, the best alternative is to learn all of the vidconf app keyboard shortcuts for muting/unmuting:

    • Meet
      • Mac: Command(⌘) + D
      • Windows: Control + D
    • Teams
      • Mac: Command(⌘) + Shift + M
      • Windows: Ctrl + Shift + M
    • Zoom
      • Mac: Command(⌘) + Shift + A
      • Windows: Alt + A
      • Hold Spacebar: Temporarily unmute

    Other vidconf apps not included in my analysis:

    • Cisco Webex Meetings
      • Mac: Ctrl + Alt + M
      • Windows: Ctrl + Shift + M
    • GoToMeeting

    Bonus protip from Jackson Fox: If you use multiple vidconf apps, pick a keyboard shortcut that you like and manually change each app’s mute/unmute shortcut to that. Then you only have to remember one shortcut!




    es

    So You've Written a Bad Design Take

    So you’ve just written a blog post or tweet about why wireframes are becoming obsolete, the dangers of “too accessible” design, or how a certain style of icon creates “cognitive fatigue.”

    Your post went viral, but now you’re getting ratioed by rude people on the Internet. That sucks! You were just trying to start a conversation and you probably didn’t deserve all that negativity (except for you, “too accessible” guy).

    Most likely, you made one of these common mistakes:

    1. You made generalizations about “design”

    You, a good user-centered designer, know that you are not your user. Nor are you every designer.

    First of all, let's acknowledge that there is no universal definition of design. Even if we narrow it down to software design, it’s still hard to make generalizations. Agency, in-house, product, startup, enterprise, non-profit, website, app, connected hardware, etc. – there are a lot of different work contexts and cultures for people with “designer” in their titles.

    "The Design Industry" is not a thing, but even if it were, you don't speak for it. Don’t assume that the kind of design work you do is the universal default.

    2. You didn’t share enough context

    There are many great design books and few great design blog posts. (There are, to my knowledge, no great design tweets, but I am open to your suggestions.) Writing about design is not well suited to short formats, because context plays such an important role and there’s always a lot of it to cover.

    Writing about your work should include as much context as you would include if you were presenting your portfolio for a job interview. What kind of organization did you work for? Who was your client and/or your stakeholders? What was the goal of the project? Your timeline? What was the makeup of your team? What were the notable business rules and constraints? How are you defining effectiveness and success?

    Without these kinds of details, it’s not possible for other designers to know if what you’ve written is credible or applicable to them.

    3. You were too certain

    A blog post doesn’t need to be a dissertation. It’s okay to share hunches and anecdotes, but give the necessary caveats. And if you're making claims about science, bruh, you gotta cite your sources.

    Be humble in your takes. Your account of what worked for you and why is more valuable to your peers than making sweeping claims and reheating the same old arguments. Be prepared to be told you’re wrong, and have the humility to realize that your perspective is just your perspective. Real conversations, like good design, are built on feedback and diverse viewpoints.

    Together, we can improve the discourse in our information ecosystems. Don't generalize. Give context. Be humble.




    es

    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!




    es

    Five Aspects of a Successful Blog Post

    It’s 2018, and traditional marketing concept has shifted. We often hear that content marketing is taking the top and is the future of marketing. While content marketing doesn’t only mean blogging, blog posts on a product, service or about your business, should be a big part of your content marketing strategy. There are vast amounts …

    Five Aspects of a Successful Blog Post Read More »