2023-12-26 Weekly Links

2023-12-26 Weekly Links

Enjoy some fresh weekly links!

via MikeTroy81

A new year is upon us. The links below reflect that. Until we have a LeBron, the rest of us need to plan and work. Happy 2024!

To achieve great things, two things are needed; a plan, and not quite enough time.
  • Leonard Bernstein.

1. Screenwriting Tips From A Tune-up Legend

How a Script Doctor Found His Own Voice | The New Yorker - Link - DB

A profile of Scott Frank, a prolific screenwriter who gets up to $300k per week to fix scripts. Another nod to writing being more workman-like and less enchanted inspiration. It also highlights that not having a unique voice (think Sorkin) may actually be a benefit.

My work doesn’t so much change the aesthetic as it does provoke adjectives like ‘solid’ and ‘dependable.’

Screenwriting is also tedious and demands clarity of character and dialogue.

how can he introduce a character with a few deft strokes so that the audience is immediately invested in what happens to her? He has devoted entire months just to cracking an opening scene. But he also excels at endings.

Additional References

2. Planning The Year

How to Plan Your Life When the Future Is Foggy at Best - Link - DB

Planning sucks. According to “science”, 92% of people don’t achieve their goals. See Science Says Only 8 Percent of People Actually Achieve Their Goals. Here Are 7 Things They Do Differently | Inc.com - Link - DB. But planning and writing your goals down then reviewing them often leads to a much higher likelihood of success.

The benefits of planning - even if you don’t perfectly stick to the plan - are worth it.

Having a plan is one of the best stress-reduction strategies out there. As humans, we crave feeling like we’re in control and that we have certainty. In fact, research shows that a sense of control helps us stave off symptoms of depression and anxietyand can even decrease mortality risk

The key to overcome planning anxiety? Microplanning!

Micro-planning is simple. It takes a larger vision and breaks it down into yearly, quarterly, monthly, weekly, and daily check-in practices to plan and adjust as necessary.

Breaking down the year into smaller, manageable chunks is the focus of the book The 12 Week Year.

Completing a weekly review and then keeping score plus being accountable is crucial.

Focusing on little efficiencies can also add up. For example, saving 30 minutes on a task you do weekly adds up to 5 full days over a 5 year period.

Here are some boots on the ground examples of how people plan and track their year:

Additional References

3. How Stern Does Interviews

Why Howard Stern Is The King of All Interviewers - Tracy Johnson Media Group - Link - DB

Hate him or love him, you can’t argue with Stern’s success. The article does a good job of categorizing why he is so good at getting people to open up. Much like a therapist, he does his prep work, makes guests comfortable, asks direct questions and actually listens.

Prep work is key. Have an organized workflow and stick with it.

Great interviewers aren’t necessarily clever, but do a good job of asking the right questions in the right context. See The Interview Magic of Stern, Gross, Simmons, Glass, & More: 9 of Their Best Questions - Link - DB. Listeners don’t necessarily want entertainment as much as they want connection and emotion.

Guests and listeners are smart and can easily spot phonies. The best interviewers are genuinely interested in their subjects and the topics they ask about. See What Makes Howard Stern a Great Communicator? - Therapy Spot - Link - DB.

Trying to connect with another person is the real key - not because you want listens or views, but because it allows the audience to feel voyeuristic and engaged. See 7 Ways To Make Your Interviews As Good As Howard Stern And Charlie Rose | by Mitch Joel | Medium - Link - DB.

Additional References

4. Dropping Log(Books)

Logbook Your Year. I’ve been keeping a logbook since 2014… | by Mike Rohde | Medium - Link - DB

Tryna actually keep a daily log, since I forget EVERYTHING. Is 2024 my year?

Logging IS NOT simply keeping a journal or writing in a diary.

Logging IS:

Be creative, do you.

Additional References

5. Odds Change Notifier

How to Use GitHub Actions with R to Run Code Automatically - Link - DB

I am in search of an app that will notify me of a change in odds from the open for specific leagues. For example, a favorite opens at -7 then moves to -3.

Main features I am looking for:

Options currently available:

Of course, none of these options match the goal features that I want. So why not create our own! Here are the rough steps to implement:

  1. Setup a github repository and github action to run an R file on a defined chron schedule. See Running R Scripts on a Schedule with GitHub Actions | Simon P. Couch - Link - DB and GitHub - r-lib/actions: GitHub Actions for the R community - Link.
  1. Odds and game information will be sourced from The Odds API - Link
  1. The Odds API provides a free account with up to 500 requests per month.
    1. “A single request returns live and upcoming games for a given sport, betting market, and bookmaker region. Each game includes a start time, participants, and bookmaker odds for the specified region. Example: if you request odds for basketball NBA, from US-region bookmakers, and moneyline betting markets, the API will return live and upcoming NBA games, showing moneyline odds from US bookmakers. This will count as 1 request from your plan's usage quota.“ See FAQs on The Odds API - Link.
    1. Updates prior to game time occur roughly every 2 minutes. See Odds API Update Interval - Link
  1. The R file will connect to The Odds API using either:
    1. an R package called oddsapiR - Link
    1. the httr2 package - Perform HTTP Requests and Process the Responses - Link
  1. Region Selection. Select a list of US bookmakers to monitor. Bookmaker APIs - Link.
  1. Sport Selection. Select a list of sports to monitor. Sports APIs - Link.
  1. Market Selection. Select from a list of betting markets to monitor. List of API Betting Markets - Link.

Reviewing The Odds API Documentation:

  • The URL is in the format https://api.the-odds-api.com/v4/sports/{sport}/odds/?apiKey={apiKey}&regions={regions}&markets={markets}
  • All endpoints return JSON data.

For example, the R code might look like this:

# load libraries
library(httr)
library(tidyverse)
library(jsonlite)
library(rvest)

# save the odds api key
api.key <- '{insert_api_key}'

# general API call function
fn.api.call <- 
    function(url){  
        res <-    httr::RETRY("GET", url)    
        json <- 
            res$content %>%    
                rawToChar() %>%    
                jsonlite::fromJSON(simplifyVector = T)    
        return(json)}

# call to sports odds
fn.sports.odds <- 
    function(sport.key,                             
    regions='us',                             
    markets = 'totals',                             
    odds.format = 'decimal',                             
    date.format = 'iso'){    
        base.url = glue::glue('https://api.the-odds-api.com/v4/sports/{sport.key}/odds')    
        query.params <- list(    
            apiKey = as.character(api.key),    
            regions = regions,    
            markets = markets,    
            oddsFormat = odds.format,    
            dateFormat = date.format)    
        toa.endpoint <- httr::modify_url(base.url, query = query.params)    
        tryCatch(    
            expr = {            
                resp <-  
                    fn.api.call(url = toa.endpoint) %>%         
                        tidyr::unnest("bookmakers") %>%         
                        dplyr::rename(
                            "bookmaker_key" = "key",
                            "bookmaker" = "title",          
                            "bookmaker_last_update" = "last_update") %>%         
                        tidyr::unnest("markets") %>%        
                        dplyr::rename(
                            "market_key" = "key",                      
                            "market_last_update" = "last_update") %>%         
                        tidyr::unnest("outcomes", names_sep = "_") %>%         
                        tidyr::as_tibble()          
            },    
            error = function(e) {      
                message(glue::glue("{Sys.time()}: Invalid arguments provided"))    
            },    
            warning = function(w) {    
            },    
            finally = {    
            }  
    )  
return(resp)
}

Additional References