live

Liverpool surprise young Derry girl after exercise video goes viral

Eight-year-old Grace O'Reilly was left "buzzing" after the European champions sent her a special gift.




live

UFC 249 TV info, live stream, start time and full fight card

It is being headlined by the interim lightweight title bout between Tony Ferguson and Justin Gaethje




live

The Lumineers Present ‘Colorado Gives Back’ Live Stream Benefit

COLORADO-based THE LUMINEERS are presenting TODAY (5/8) COLORADO GIVES BACK, a live stream benefit concert from 1-4p MT for the COLORADO RESTAURANT WORKERS and NATIONAL MUSIC COMMUNITY. The … more




live

Fearless Records Presents Livestream Event 'Fearless At Home'

FEARLESS RECORDS is presenting a livestream event called "FEARLESS AT HOME" this SATURDAY, MAY 9th at 3p (ET), featuring acoustic performances from FEARLESS artists like ICE NINE … more




live

Volbeat Streaming 'Live From Beyond Hell/Above Heaven' Concert Film

REPUBLIC Rockers VOLBEAT are treating their fans to a live stream of their concert film "Live from Beyond Hell/Above Heaven" on their YOUTUBE channel FRIDAY, MAY 8th at 10a (ET). … more




live

Global DJ Live-Stream Fundraiser 'Set For Love' Planned For May 8-10

U.K.'s BRIGHTON MUSIC CONFERENCE has partnered with the charity LAST NIGHT A DJ SAVED MY LIFE (LNADJ) and issued an invitation to DJ's around the world to take part in Set For Love, … more




live

88rising Presents Asia Rising Forever Live Stream

88RISING presented ASIA RISING FOREVER, an online live stream fundraising festival last night (5/6) featuring performances by many of their artists and other ASIAN recording acts from around … more




live

Public health CEOs: Open health care enrollment to save lives

AHA COVID-19 newsroom DALLAS, April 10, 2020 — Nancy Brown, CEO of the American Heart Association, the world’s leading voluntary organization focused on heart and brain health, joined the chief executives of other leading national public...




live

For older adults, more physical activity could mean longer, healthier lives




live

Consuming more olive oil associated with less heart disease in Americans

Research Highlights: Consuming more than half a tablespoon of olive oil daily was associated with a 15% lower risk of having any type of cardiovascular disease and a 21% lower risk of having coronary heart disease. Replacing one teaspoon of butter, ...




live

The lives of Vietnamese Women

From warriors to "butterflies on wheels," Vietnamese women have inspired generations.




live

Modern Website Deliverables

You’re hiring a web designer or providing web design services, what’s included in a normal project? In other words, what are the deliverables, and the use of a membership website builder could be essential for this. Let’s start by defining what a deliverable is. Wikipedia defines a deliverable as: …a tangible or intangible good or […]

The post Modern Website Deliverables appeared first on Psychology of Web Design | 3.7 Blog.




live

IP Warming – An Overlooked Email Deliverability Influence

For many marketers, emails are the lifeline for most marketing efforts. Every SPAM complaint, unsubscribe, or bounce has an impact on the current ROI as well as on the sender’s reputation which affects the ROI of the future campaigns. Yet the sender reputation, that you accumulate over the period of multiple email campaigns, is only...




live

CSS & JS Auto-Refreshing with Live.js

I want to share a fantastic little tool that I've only recently come across; Live.js, written by Martin Kool. This JavaScript file automatically checks for changes to your CSS and JavaScript files, and refreshes them. That means you can have your text editor in one half of the screen, and a web browser in the other. When you save changes in the editor, the updates are reflected immediately in your browser. It really helps to speed up your development time.




live

1969 Buick Century Cruiser: The Concept Car That Believed You Only Live Twice

Someday you will be able to drive a superhighway, turn the controls over to a guidance system, and travel across...




live

Places I’d Love To Live In: Beautiful Illustrations Of Lovely Places By Darya Shnykina

In these times of confinement, the time is for the mind to escape. Today we invite you to discover the...




live

Coronavirus in Iowa, live updates for May 7: Gazette awards more than $60,000 in marketing grants, FEMA awards $78 million to Iowa

Gazette awards more than $60,000 in marketing grants The Gazette has awarded more than $60,000 in grants to help local businesses market themselves during the coronavirus pandemic, and there’s...




live

Coronavirus in Iowa, live updates for May 8: Cedar Rapids to host virtual City Council meeting

4:43 P.M.: GOODWILL PLANS TO REOPEN 11 EASTERN IOWA RETAIL LOCATIONS Goodwill of the Heartland will reopen 11 retail locations in Eastern Iowa next week, including all its Cedar Rapids stores,...




live

Coronavirus in Iowa, live updates for May 9: 214 more positive tests reported

11 a.m. Iowa sees 214 more positive tests for coronavirus The Iowa Department of Public Health on Saturday reported nine more deaths from COVID-19, for a total of 252 since March 8. An additional 214...




live

How to Migrate a Local WordPress Install to a Live Site. Duplicator plugin

Using a local server environment will save you a bunch of time if you regularly develop new WordPress websites. Local development has many advantages – it’s faster and more secure than constantly uploading files to a server.




live

Coronavirus in Iowa, live updates for May 7: Gazette awards more than $60,000 in marketing grants, FEMA awards $78 million to Iowa

Gazette awards more than $60,000 in marketing grants

The Gazette has awarded more than $60,000 in grants to help local businesses market themselves during the coronavirus pandemic, and there’s more help available.

“We awarded $50,000 in the first 10 days,” said Kelly Homewood, Director of Operations at The Gazette. “That tells us the need is real. The help necessary. We’re a locally owned business too, and in Iowa we lift each other up in challenging times.”

The grant program, which launched April 17, awarded $50,393 to more than 60 businesses in the first 10 days. To date, almost $68,000 has been awarded to 75 businesses.

“The Gazette’s Matching Program is a true testament to their commitment to our community and their small business advertisers,” said Annie Hills, marketing manager at Destinations Unlimited. “As a local small business, this program will be a huge benefit to our agency in such an unprecedented time so that we can continue to connect with our clients.”

The program allocates up to $100,000 in matching advertising dollars to assist local businesses that apply. There’s still approximately $32,000 in matching grants still available to award by July 31. Businesses can apply online at www.thegazette.com/marketinggrant.

FEMA awards $78 million to Iowa for COVID-19 response

The Federal Emergency Management Agency (FEMA) has obligated $78 million to the state of Iowa to help reimburse eligible expenses for emergency protective measures that the state has incurred as a result of its response to COVID-19.

The grant funds, awarded by FEMA’s Public Assistance (PA) Grant Program, were made available Thursday. FEMA has provided nearly $150 million to date in support of the state’s COVID-19 efforts.

The money reimburses 75 percent of projected eligible costs associated with buying essential Personal Protective Equipment (PPE), and medical supplies and equipment during the months of May and June 2020.

This obligation also includes: $19.5 million in contract services for TestIowa, $35,000 in contract services associated with overseas PPE purchases and $13.7 million for additional medical supplies and equipment for the month of April. All figures represent the 75 percent federal share. The 25 percent is paid by the grant recipient.

Linn County Conservation campgrounds to open Friday

Iowa Gov. Kim Reynolds issued a new proclamation allowing campgrounds in the state of Iowa to open.

The proclamation states:

“Any public or private campground may reopen provided that the campground implements reasonable measures under the circumstances of each campground to ensure social distancing, increased hygiene practices, and other public health measures to reduce the risk of transmission of COVID-19 consistent with guidance issued by the Iowa Department of Public Health (5/6/20).”

Linn County Conservation has continued to seek guidance from local and state health officials and are announcing that campgrounds will open Friday with certain restrictions and limitations.

At 5 a.m. on May 8, Buffalo Creek Park, Morgan Creek Park, Pinicon Ridge Park and Squaw Creek Park campgrounds will open to campers in self-contained units. This also includes primitive (non-electric) camping areas at Matsell Bridge Natural Area (including Mount Hope) and Wakpicada Natural Area.

Campers may camp only with a self-contained camping unit that has a functioning restroom, as showerhouses with flushable restrooms will remain closed. Self-contained is defined as a tent or pop-up camper with a portable toilet or an RV or camping trailer with a functioning, self-contained bathroom.

Occupants are limited to six or less per camp site (unless household is more than six). No visitors are allowed. Campground showerhouses with restrooms will remain closed.

Reserving campsites is not allowed as campgrounds continue to be first-come, first-served. The exception to this is Squaw Creek Park A-Loop which normally accepts online reservations at LinnCountyParks.com, starting Friday at 1 p.m.

Linn County Conservation’s lodges, shelters, cabins and group camps remain closed.

Hy-Vee offers two-hour express grocery pickup

Hy-Vee Inc., announced Friday that it is now offering a two-hour express pickup option as part of its Hy-Vee Aisles Online grocery ordering service, allowing customers to pay a fee to pick up their order faster.

Customers will see a “Get It Faster” option on Aisles Online time slots where the two-hour pickup option is available. A limited number of two-hour pickup orders will be available for $9.95, from 8 a.m. until 8 p.m. daily, at all Hy-Vee store locations offering Aisles Online services.

Cedar Rapids-area students honored with light display during Graduation Week

The lights on Alliant Energy’s Cedar Rapids Tower will change colors to recognize area high schools and honor the Class of 2020.

“In this time of uncertainty, it’s important to remember that brighter days are up ahead,”

said Linda Mattes, Vice President of IT and Customer Operations. “Changing the lights on our tower is our way of celebrating this important milestone in the lives of these students and their families.”

Each Cedar Rapids-area high school’s colors will be on display. The schedule:

May 21 — Washington High School — Red and blue

May 22 — Jefferson High School — Blue and white

May 23 — Kennedy High School — Green and gold

May 24 — Linn-Mar High School — Red and black

May 25 — Marion High School — Crimson and gold

May 26 — Prairie High School — Orange and black

May 27 — Xavier High School — Navy and silver

May 28 — Metro High School — Purple and black

MusicIC Festival cancels June in-person programming

What was planned to be the 10th annual MusicIC Festival has been canceled. Programming planned for June 18-20 will be pushed to summer 2021.

The festival, presented by the Iowa City UNESCO City of Literature, will offer alternate programming. In place of the in-person performances this year, the festival will offer video performances from musicians to be highlighted in the 2021 season.

Details about these video performances will be forthcoming.

Grounds and grandstand entertainment canceled at 2020 Linn County Fair

Due to the ongoing social distancing guidelines and additional precautions taking place to help slow and reduce the spread of COVID-19, the Linn County Fair Association is canceling the grounds and grandstand entertainment for the 2020 Linn County Fair, scheduled for June 24-28.

The Linn County Fair Association, in partnership with the Iowa State University Extension and Outreach of Linn County and Linn County 4-H, still plan on providing opportunities to 4-Her’s, FFA members, and youth of Linn County to showcase their talents and accomplishments at this year’s fair.

Details regarding the 4-H/FFA exhibits and events are still being finalized and Linn County 4-H plans to email details to 4-H/FFA members in mid-May.

Bike to Work Week Postponed Until September

To encourage safe and responsible social distancing practices during the COVID-19 pandemic, Cedar Rapids’ Bike to Work Week activities — traditionally held in May — will be postponed and are tentatively scheduled for September 21-27.

This will include events such as the Mayor’s bike ride and proclamation, pit stops, group rides, and wrap-up party.

Von Maur stores reopening Friday

Von Maur announced it will reopen stores in Cedar Rapids, Coralville and Cedar Falls using reduced hours and safety measures starting Friday.

The reduced hours will be from 11 a.m. to 7 p.m. Monday through Saturday and 12 p.m. to 6 p.m. on Sundays.

Von Maur said it will be implementing daily employee health screenings, social distancing measures, contactless payments, curbside service options and sanitizing and cleaning procedures in common areas and after each customer transaction. Its aforementioned stores are at Lindale Plaza, Iowa River Landing and College Square Mall.

Online Czech language lessons offered

The National Czech & Slovak Museum & Library recently partnered with Anna Cooková, an instructor with CzechTalk, to offer online Czech language and culture lessons.

Beginner’s Czech Language & Culture I begins on Thursday, June 4. Each class will be held from 8 to 9:30 p.m. every Thursday from June 4 through August 6. During the 15 hours of instruction over 10 weeks, participants will learned to read, write, and speak in Czech.

The cost is $210 for NCSML members, $235 for non-members. This fee includes all course materials. The class size is limited to 20 students, so interested individuals are encouraged to register early to secure a spot.

Contact Cooková for a registration form at annacookova@gmail.com or 715-651-7044.




live

Coronavirus in Iowa, live updates for May 8: Cedar Rapids to host virtual City Council meeting

4:43 P.M.: GOODWILL PLANS TO REOPEN 11 EASTERN IOWA RETAIL LOCATIONS

Goodwill of the Heartland will reopen 11 retail locations in Eastern Iowa next week, including all its Cedar Rapids stores, according to an announcement on the Goodwill Facebook page. Stores in Marion, Coralville, Iowa City, Washington, Bettendorf, Davenport and Muscatine also will resume business Monday, starting with accepting donations only.

Locations will be open to shoppers, beginning Friday, May 15, and run from 11 a.m.-6 p.m. Monday through Saturday and from noon-5 p.m. Sunday.

All customers are required to wear face masks to enter the store. For more information, including safety guidelines, visit the Goodwill website.

3:02 p.m.: IOWA DNR URGES CAMPERS TO CHECK WEBSITE BEFORE TRAVEL

The Iowa Department of Natural Resources encourage visitors to recently reopened campgrounds to check the DNR website for temporary closures before traveling to any of the areas. Campgrounds started to open Friday for walk-in, first come, first served campers with self-contained restrooms, according to a news release.

Some parks and campgrounds have closures due construction or other maintenance projects. Staff will monitor the areas closely, reminding visitors to practice physical distancing guidelines and other policies issued by the DNR earlier this week.

Some pit latrines in high-use areas will be open, but all other restrooms, drinking fountains and shower facilities will be closed. Park visitors are asked to use designated parking areas and follow all park signs.

The DNR’s reservation system for reservable campgrounds is available online, taking reservations for Monday and later.

Iowa has 68 state parks and four state forests, including hiking trails, lake recreation and camping. For more information, visit the DNR website.

10:23 a.m.: CEDAR RAPIDS TO HOST VIRTUAL CITY COUNCIL MEETING

The next Cedar Rapids City Council meeting will be hosted virtually. The meeting will be held May 12, beginning at noon. The livestream is available at the city’s Facebook page. Indexed videos can be accessed on the City of Cedar Rapids website.

The public is invited to provide comments, submitting written comments via email to cityclerk@cedar-rapids.org before the meeting or joining the Zoom conference call and registering here before 2 p.m. Tuesday. Registrants will receive an email with instructions to participate. Written comments received before 2 p.m. the day of the meeting will be given to City Council members before the event.

The public will only be invited to speak during designated public comment sections of the meeting. Please visit the City’s website for speaking guidelines. City Hall remains closed to the public. No in-person participation is available.

Tuesday’s meeting agenda will be posted to the website by 4 p.m. Friday.

MICHAEL BUBLE PERFORMANCES IN MOLINE, DES MOINES MOVED TO 2021

Michael Buble’s “An Evening with Michael Buble” Tour has rescheduled dates to 2021. The 26-date series of concerts will begin February 6 in Salt Lake City and conclude March 25 in Jacksonville, Fla., according to a news release Friday.

Bubble’s shows at TaxSlayer Center in Moline, Ill., has been switched to Feb. 20, 2021. He will perform at Wells Fargo Arena in Des Moines the following day.

Tickets for previously scheduled dates will be honored.

“I am so looking forward to getting back on stage,” Buble said in the release. “I’ve missed my fans and my touring family. Meantime, I hope everyone stays safe. We can all look forward to a great night out.”

Buble also just completed a series of Facebook Live shows while in quarantine with his family in Vancouver.

Comments: (319) 368-8679; kj.pilcher@thegazette.com




live

Coronavirus in Iowa, live updates for May 9: 214 more positive tests reported

11 a.m. Iowa sees 214 more positive tests for coronavirus

The Iowa Department of Public Health on Saturday reported nine more deaths from COVID-19, for a total of 252 since March 8.

An additional 214 people tested positive for the virus, bringing the state’s total to 11,671.

A total of 71,476 Iowans have been tested for COVID-19, the department reported.

With Saturday’s new figures from the Department of Public Health, these are the top 10 counties in terms of total cases:

• Polk — 2194

• Woodbury — 1554

• Black Hawk — 1477

• Linn — 819

• Marshall — 702

• Dallas — 660

• Johnson — 549

• Muscatine — 471

• Tama — 327

• Louisa — 282.




live

Facebook Live Streaming and Audio/Video Hosting connected to Auphonic

Facebook is not only a social media giant, the company also provides valuable tools for broadcasting. Today we release a connection to Facebook, which allows to use the Facebook tools for video/audio production and publishing within Auphonic and our connected services.

The following workflows are possible with Facebook and Auphonic:
  • Use Facebook for live streaming, then import, process and distribute the audio/video with Auphonic.
  • Post your Auphonic audio or video productions directly to the news feed of your Facebook Page or User.
  • Use Facebook as a general media hosting service and share the link or embed the audio/video on any webpage (also visible to non-Facebook users).

Connect to Facebook

First you have to connect to a Facebook account at our External Services Page, click on the "Facebook" button.

Select if you want to connect to your personal Facebook User or to a Facebook Page:

It is always possible to remove or edit the connection in your Facebook Settings (Tab Business Integrations).

Import (Live) Videos from Facebook to Auphonic

Facebook Live is an easy (and free) way to stream live videos:

We implemented an interface to use Facebook as an Incoming External Service. Please select a (live or non-live) video from your Facebook Page/User as the source of a production and then process it with Auphonic:

This workflow allows you to use Facebook for live streaming, import and process the audio/video with Auphonic, then publish a podcast and video version of your live video to any of our connected services.

Export from Auphonic to Facebook

Similar to Youtube, it is possible to use Facebook for media file hosting.
Please add your Facebook Page/User as an External Service in your Productions or Presets to upload the Auphonic results directly to Facebook:

Options for the Facebook export:
  • Distribution Settings
    • Post to News Feed: The exported video is posted directly to your news feed / timeline.
    • Exclude from News Feed: The exported video is visible in the videos tab of your Facebook Page/User (see for example Auphonic's video tab), but it is not posted to your news feed (you can do that later if you want).
    • Secret: Only you can see the exported video, it is not shown in the Facebook video tab and it is not posted to your news feed (you can do that later if you want).
  • Embeddable
    Choose if the exported video should be embeddable in third-party websites.

It is always possible to change the distribution/privacy and embeddable options later directly on Facebook. For example, you can export a video to Facebook as Secret and publish it to your news feed whenever you want.


If your production is audio-only, we automatically generate a video track from the Cover Image and (possible) Chapter Images.
Alternatively you can select an Audiogram Output File, if you want to add an Audiogram (audio waveform visualization) to your Facebook video - for details please see Auphonic Audiogram Generator.

Auphonic Title and Description metadata fields are exported to Facebook as well.
If you add Speech Recognition to your production, we create an SRT file with the speech recognition results and add it to your Facebook video as captions.
See the example below.

Facebook Video Hosting Example with Audiogram and Automatic Captions

Facebook can be used as a general video hosting service: even if you export videos as Secret, you will get a direct link to the video which can be shared or embedded in any third-party websites. Users without a Facebook account are also able to view these videos.

In the example below, we automatically generate an Audiogram Video for an audio-only production, use our integrated Speech Recognition system to create captions and export the video as Secret to Facebook.
Afterwards it can be embedded directly into this blog post (enable Captions if they don't show up per default) - for details please see How to embed a video:

It is also possible to just use the generated result URL from Auphonic to share the link to your video (also visible to non-Facebook users):
https://www.facebook.com/auphonic/videos/1687244844638091/

Important Note:
Facebook needs some time to process an exported video (up to a few minutes) and the direct video link won't work before the processing is finished - please try again a bit later!
On Facebook Pages, you can see the processing progress in your Video Library.

Conclusion

Facebook has many broadcasting tools to offer and is a perfect addition to Auphonic.
Both systems and our other external services can be used to create automated processing and publishing workflows. Furthermore, the export and import to/from Facebook is also fully supported in the Auphonic API.

Please contact us if you have any questions or further ideas!




live

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

live

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


live

The invisible injury: How concussions have changed our lives

'It can happen to you anywhere, at any moment, and just change your world'




live

Permainan Situs Sbobet Casino Live Paling Populer

Siapa yang tidak mengenal dengan casino sbobet online? Tentu saja hampir semua orang mengenal permainan-permainan casino. Nah, jika kamu belum mengenal mengenai permainan casino, terutama tentang live casino, tidak usah bingung. Pada artikel yang ada di bawah ini akan menjelaskan tentang permainan live casino. Casino berkembang begitu pesat dan memiliki daya tarik yang sangat kuat …

The post Permainan Situs Sbobet Casino Live Paling Populer appeared first on Situs Agen Judi Live Casino Online Indonesia Terpercaya.



  • Situs Live Casino
  • Agen Casino Sbobet
  • Bandar Casino Sbobet
  • Judi Casino Sbobet

live

Top 5 Best Internet Live Support Extension To Increase Customers Interactions

Creative interactions call for creative measures - numerous extensions reduce, minimize or dilute the frustration of the customers and resolve issues quickly without the customer support team need....




live

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


live

METAL INJECTION LIVECAST #535 - Liddle' Ditch

We kick things off with Rob talking about his favorite albums of the year. We then discuss the shocking news...

The post METAL INJECTION LIVECAST #535 - Liddle' Ditch appeared first on Metal Injection.



  • Metal Injection Livecast








live

METAL INJECTION LIVECAST #542 - Dull By Obb

We kick things off talking about the Motley Crue reunion. Darren shares a story from work. Rob talks about going...

The post METAL INJECTION LIVECAST #542 - Dull By Obb appeared first on Metal Injection.



  • Metal Injection Livecast

live

METAL INJECTION LIVECAST #543 - Gong Solo

We kicked things off with Rob recapping his experience at the Tool concert. We then discussed Dave Mustaine's recent interview...

The post METAL INJECTION LIVECAST #543 - Gong Solo appeared first on Metal Injection.



  • Metal Injection Livecast

live

METAL INJECTION LIVECAST #544 - 33% Drained

This week, we had a very special guest, our Livecastard of the Month, Eric, who actually signed up for our...

The post METAL INJECTION LIVECAST #544 - 33% Drained appeared first on Metal Injection.



  • Metal Injection Livecast


live

METAL INJECTION LIVECAST #546 - Grandma Smoothie

We kick things off talking about annoying holiday commercials. We discuss Christmas music this episode, and why Hanukkah lands on...

The post METAL INJECTION LIVECAST #546 - Grandma Smoothie appeared first on Metal Injection.



  • Metal Injection Livecast

live

METAL INJECTION LIVECAST #547 - Crab Rangoomba

We kick things off talking about how we spent the holiday break and previewing the bonus Patreon episode coming next...

The post METAL INJECTION LIVECAST #547 - Crab Rangoomba appeared first on Metal Injection.



  • Metal Injection Livecast


live

METAL INJECTION LIVECAST #549 - Loose Hot Dog

We kick things off with our New Year's resolutions. Noa explains her future vision board. We discuss climate change and...

The post METAL INJECTION LIVECAST #549 - Loose Hot Dog appeared first on Metal Injection.



  • Metal Injection Livecast

live

METAL INJECTION LIVECAST #550 - Don Docking

We kick things off discussing our Tad's Patreon episode, and our fast food preferences. We then discuss the sad status...

The post METAL INJECTION LIVECAST #550 - Don Docking appeared first on Metal Injection.



  • Metal Injection Livecast