text:
import {assert} from "chai";
import * as dotenv from "dotenv";
import {shallow, ShallowWrapper} from "enzyme";
import * as sleep from "es7-sleep";
import * as fetchMock from "fetch-mock";
import * as React from "react";
import {Button, FormControl} from "react-bootstrap";
import Jwt from "../../src/api/Jwt";
import LoginApi from "../../src/api/LoginApi";
import LoginForm, {ILoginForm} from "../../src/components/LoginForm";
import {ILoginState} from "../../src/reducers/LoginReducer";

describe("LoginForm component", () => {
  beforeEach(() => {
    dotenv.config({path: "config/development.env"});
    fetchMock.spy();
  });
  afterEach(() => {
    fetchMock.restore();
  });
  test("should render login form", async () => {
    const loginWrapper: ShallowWrapper<any, ILoginForm> =
      shallow(<LoginForm/>);
    assert.equal(loginWrapper.find(FormControl).length, 2);
    assert.equal(loginWrapper.find(Button).length, 1);
  });
  test("should change state", () => {
    // test("should change state", async (done) => {
    // @ts-ignore: Argument of type
    // const spy: SinonSpy = sinon.spy(LoginForm.prototype, "login");
    const loginWrapper: ShallowWrapper<any, ILoginForm> =
      shallow(<LoginForm/>);
    // username
    let formControl: ShallowWrapper<any, any> = loginWrapper.find(FormControl).at(0);
    formControl.simulate("change", {target: {value: "user1"}});
    assert.equal(loginWrapper.state().username, "user1");
    // password
    formControl = loginWrapper.find(FormControl).at(1);
    formControl.simulate("change", {target: {value: "password1"}});
    assert.equal(loginWrapper.state().password, "password1");
    // // submit
    // TODO how to reset sinon.spy so that does not affect other tests?
    // await loginWrapper.find(Button).at(0).simulate("click");
    // assert.isTrue(spy.calledOnce);
    // spy.reset();
    // done();
  });
  test("should dispatch login action", async (done) => {
    const loginState: ILoginState = {isAuthenticated: true, token: "token"};
    fetchMock.postOnce(LoginApi.getApiUrl(), loginState);
    const loginWrapper: ShallowWrapper<any, ILoginForm> =
      shallow(<LoginForm/>);
    // username
    let formControl: ShallowWrapper<any, any> = loginWrapper.find(FormControl).at(0);
    formControl.simulate("change", {target: {value: "user1"}});
    assert.equal(loginWrapper.state().username, "user1");
    // password
    formControl = loginWrapper.find(FormControl).at(1);
    formControl.simulate("change", {target: {value: "password1"}});
    // submit
    await loginWrapper.find(Button).at(0).simulate("click");
    await sleep(100);
    assert.equal(sessionStorage.getItem(Jwt.JWT_TOKEN_KEY), "token");
    done();
  });
});


Hayley and Alison are the people who make it happen and are always happy to help you with any questions you may have about caravan or motorhome hire - from technical caravanning advice to holiday hire prices!
Call us on 01362 696434 for advice and availability.
If you prefer to make an online enquiry, simply browse our caravans or motorhomes and click on 'Make a Booking' for that vehicle.
Hire periods are Monday to Friday, Friday to Monday or a combination of both. Collection times are available between 1pm-4pm on Monday or Friday. Return time is between 9-11am Monday or Friday.
Hayley joins Greentrees with good all round retail experience and has shown great aptitude for the job of accessory shop assistant. She went caravanning as a child with her family and is now learning all there is to know about awnings, caravanning accessories and general camping kit.


text:
Shaquille O'Neal Plans a Chicken Restaurant on the Eastside
Plus robots deliver at Vdara, new beers at Pub 365, a 90-pound lasagna, and more
by Susan Stapleton Jul 10, 2018, 9:00am PDT
Share All sharing options for: Shaquille O'Neal Plans a Chicken Restaurant on the Eastside
EASTSIDE — Former NBA player Shaquille O'Neal gets into the chicken business when he opens Big Chicken in the former Origin India space in October. The retired center teamed up with JRS Hospitality — the company behind Hexx Kitchen & Bar and Alexxa's Bar at Paris Las Vegas, and Chayo Mexican Kitchen & Tequila Bar at The Linq Promenade — on the 2,800-square-foot restaurant, where Shaq plans to film a reality show for Facebook. [LVRJ]
VDARA — Robot overlords now deliver snacks and more to guests staying at the non-gaming hotel. Fetch and Jett, two Relay robots transport things forgotten at home, such as shaving and dental kits, as well as food and drinks from Market Café. The robots can navigate around people and objects, prioritize multiple requests, and even wirelessly communicate with the hotel's elevators. Sundries travel via a compartment on the robots with a tamper-proof lid that automatically unlocks for guests to retrieve their snacks and travel kits once delivered. [EaterWire]
FORUM SHOPS AT CAESARS — Carmine's celebrates five years in Las Vegas with $5 meatball sliders and a $5 anniversary aperitivo every day in July during happy hour from 2 to 6 p.m. and from 9:30 p.m. to close at the bar. On July 29, the massive Italian restaurant plans to serve free slices of lasagna from a 5-foot-long version of the dish made with 162 noodles, 42 combined cups of marinara and meat sauces, and more than 54 cups of ricotta, mozzarella, and Romano cheeses. That dish weighs in at 90 pounds. [EaterWire]
PARIS LAS VEGAS — Beer Park has a free sausage with the purchase of an $8 beer on Wednesday, July 18. [EaterWire]
TUSCANY — Pub 365 adds 20 new taps from breweries such as 8-Bit, Kings, Pizza Port, Ale Smith, Pure, Project, and Beachwood. From 11:30 a.m. to 2 a.m. on July 13, diners can pay $20 for five tasting tokens, each redeemable for a 3-ounce sample and event glass. Additional tokens can be purchased. [EaterWire]
• All Morning Briefings [ELV]
4480 Paradise Road, Las Vegas, Nevada 89169 702-734-6342
Pub 365
255 East Flamingo Road, , NV 89169 (702) 944-5288 Visit Website
The Linq Promenade
3545 South Las Vegas Boulevard, , NV 89109 (702) 322-0550 Visit Website
Beer Park
Hexx Kitchen & Bar
3655 Las Vegas Blvd. S. , Las Vegas, NV 89109 (702) 331-5100 Visit Website
Carmine's
3500 Las Vegas Blvd. South, Las Vegas, NV 89109 (702) 473-9700 Visit Website

redpajama_set_name: RedPajamaCommonCrawl


Chicago claims the United State's 44th president as its own.
Though not born here, Chicago became Barack Obama's home as he began his career in law and politics and started his family.
Southside Hyde Park is "Obama Territory". This is where he courted and married Michelle, made his home, was a community activist and on the faculty at the University of Chicago Law School.
Downtown Chicago holds many special places as well.
These include the law firm where he met his future wife in 1989 and follows his journey to the triumphant acceptance speech in Grant Park on November 4, 2008.
Barack Obama's remarkable story comes alive through the commentary and experiences of the day.


text:
import {Action, createReducer, on} from '@ngrx/store';
import * as actions from '../actions';
import {
  ExecutionDataResponse,
  ExecutionDigestsResponse,
  GraphExecutionDataResponse,
  SourceFileResponse,
} from '../data_source/tfdbg2_data_source';
import {getFocusedStackFramesHelper} from './debugger_store_helpers';
import {
  computeBottommostLineSpec,
  findBeginEndRangeIndex,
  findFileIndex,
  isFrameBottommostInStackTrace,
} from './debugger_store_utils';
import {
  AlertsByIndex,
  AlertType,
  CodeLocationType,
  DataLoadState,
  DebuggerState,
  Executions,
  GraphExecutions,
  Graphs,
  InfNanAlert,
  SourceFileSpec,
  StackFrame,
  StackFramesById,
} from './debugger_types';

const DEFAULT_EXECUTION_PAGE_SIZE = 100;
const DEFAULT_GRAPH_EXECUTION_PAGE_SIZE = 200;

export function createInitialExecutionsState(): Executions {
  return {
    numExecutionsLoaded: {
      state: DataLoadState.NOT_LOADED,
      lastLoadedTimeInMs: null,
    },
    executionDigestsLoaded: {
      loadingRanges: [],
      numExecutions: 0,
      pageLoadedSizes: {},
    },
    // TODO(cais) Remove the hardcoding of this, which is coupled with css width
    // properties.
    displayCount: 50,
    pageSize: DEFAULT_EXECUTION_PAGE_SIZE,
    scrollBeginIndex: 0,
    focusIndex: null,
    executionDigests: {},
    executionData: {},
  };
}

export function createInitialGraphExecutionsState(): GraphExecutions {
  return {
    numExecutionsLoaded: {
      state: DataLoadState.NOT_LOADED,
      lastLoadedTimeInMs: null,
    },
    executionDigestsLoaded: {
      loadingRanges: [],
      numExecutions: 0,
      pageLoadedSizes: {},
    },
    // TODO(cais) Remove the hardcoding of this, which is coupled with css width
    // properties.
    displayCount: 100,
    pageSize: DEFAULT_GRAPH_EXECUTION_PAGE_SIZE,
    scrollBeginIndex: 0,
    focusIndex: null,
    graphExecutionDigests: {},
    graphExecutionDataLoadingPages: [],
    graphExecutionDataPageLoadedSizes: {},
    graphExecutionData: {},
  };
}

export function createInitialGraphsState(): Graphs {
  return {
    ops: {},
    loadingOps: {},
    focusedOp: null,
  };
}

const initialState: DebuggerState = {
  runs: {},
  runsLoaded: {
    state: DataLoadState.NOT_LOADED,
    lastLoadedTimeInMs: null,
  },
  activeRunId: null,
  // The initial values of lastDataPollOnsetTimeMs and
  // lastNonEmptyPollDataTimeMs ensures that initially, before
  // the onset of any data polling, the difference of the two
  // is 0, which causes a backing-off polling algorithm to use
  // the lower-bound polling interval.
  lastDataPollOnsetTimeMs: -1,
  lastNonEmptyPollDataTimeMs: 1,
  alerts: {
    alertsLoaded: {
      state: DataLoadState.NOT_LOADED,
      lastLoadedTimeInMs: null,
    },
    numAlerts: 0,
    alertsBreakdown: {},
    alerts: {},
    executionIndices: {},
    graphExecutionIndices: {},
    focusType: null,
  },
  executions: createInitialExecutionsState(),
  graphExecutions: createInitialGraphExecutionsState(),
  graphs: createInitialGraphsState(),
  stackFrames: {},
  codeLocationFocusType: null,
  stickToBottommostFrameInFocusedFile: false,
  sourceCode: {
    sourceFileListLoaded: {
      state: DataLoadState.NOT_LOADED,
      lastLoadedTimeInMs: null,
    },
    sourceFileList: [],
    fileContents: [],
    focusLineSpec: null,
  },
};
// TODO(cais): As `executions` is getting large, create a subreducer for it.

const reducer = createReducer(
  initialState,
  on(actions.debuggerRunsRequested, (state: DebuggerState): DebuggerState => {
    return {
      ...state,
      runsLoaded: {
        ...state.runsLoaded,
        state: DataLoadState.LOADING,
      },
    };
  }),
  on(
    actions.debuggerRunsRequestFailed,
    (state: DebuggerState): DebuggerState => {
      return {
        ...state,
        runsLoaded: {
          ...state.runsLoaded,
          state: DataLoadState.FAILED,
        },
      };
    }
  ),
  on(
    actions.debuggerRunsLoaded,
    (state: DebuggerState, {runs}): DebuggerState => {
      const runIds = Object.keys(runs);
      const activeRunChanged = runIds.length > 0 && state.activeRunId === null;
      return {
        ...state,
        lastNonEmptyPollDataTimeMs: activeRunChanged
          ? Date.now()
          : state.lastNonEmptyPollDataTimeMs,
        runs,
        runsLoaded: {
          state: DataLoadState.LOADED,
          lastLoadedTimeInMs: Date.now(),
        },
        activeRunId: runIds.length > 0 ? runIds[0] : null,
        // TODO(cais): Handle multiple runs. We currently assumes there is only
        // one run, which is okay because the backend supports only one run
        // per experiment.
      };
    }
  ),
  on(actions.debuggerDataPollOnset, (state: DebuggerState): DebuggerState => {
    return {
      ...state,
      lastDataPollOnsetTimeMs: Date.now(),
    };
  }),
  on(
    actions.numAlertsAndBreakdownRequested,
    (state: DebuggerState): DebuggerState => {
      const runId = state.activeRunId;
      if (runId === null) {
        return state;
      }
      return {
        ...state,
        alerts: {
          ...state.alerts,
          alertsLoaded: {
            ...state.alerts.alertsLoaded,
            state: DataLoadState.LOADING,
          },
        },
      };
    }
  ),
  on(
    actions.numAlertsAndBreakdownLoaded,
    (state: DebuggerState, {numAlerts, alertsBreakdown}): DebuggerState => {
      const runId = state.activeRunId;
      if (runId === null) {
        return state;
      }
      const numAlertsIncreased = numAlerts > state.alerts.numAlerts;
      return {
        ...state,
        lastNonEmptyPollDataTimeMs: numAlertsIncreased
          ? Date.now()
          : state.lastNonEmptyPollDataTimeMs,
        alerts: {
          ...state.alerts,
          alertsLoaded: {
            ...state.alerts.alertsLoaded,
            state: DataLoadState.LOADED,
            lastLoadedTimeInMs: Date.now(),
          },
          numAlerts,
          alertsBreakdown,
        },
      };
    }
  ),
  on(
    actions.alertsOfTypeLoaded,
    (
      state: DebuggerState,
      {numAlerts, alertsBreakdown, alertType, begin, alerts}
    ): DebuggerState => {
      const runId = state.activeRunId;
      if (runId === null) {
        return state;
      }

      const updatedAlerts: AlertsByIndex = {};
      const executionIndices: number[] = state.alerts.executionIndices[
        alertType
      ]
        ? state.alerts.executionIndices[alertType].slice()
        : [];
      const graphExecutionIndices: number[] = state.alerts
        .graphExecutionIndices[alertType]
        ? state.alerts.graphExecutionIndices[alertType].slice()
        : [];
      for (let i = 0; i < alerts.length; ++i) {
        const alertIndex = begin + i;
        const alert = alerts[i];
        updatedAlerts[alertIndex] = alert;
        if (alert.alert_type === AlertType.INF_NAN_ALERT) {
          // TOOD(cais): Deal with other alert types with execution index.
          const infNanAlert = alert as InfNanAlert;
          executionIndices[alertIndex] = infNanAlert.execution_index;
          if (infNanAlert.graph_execution_trace_index !== null) {
            graphExecutionIndices[alertIndex] =
              infNanAlert.graph_execution_trace_index;
          }
        }
      }
      if (state.alerts.alerts[alertType] !== undefined) {
        Object.assign(updatedAlerts, state.alerts.alerts[alertType]);
      }

      let scrollBeginIndex = state.executions.scrollBeginIndex;
      let graphExecutionFocusIndex = state.graphExecutions.focusIndex;
      if (alertType === AlertType.INF_NAN_ALERT && begin === 0) {
        // TOOD(cais): Deal with other alert types with execution index.
        const alert = alerts[0] as InfNanAlert;
        const executionIndex = alert.execution_index;
        // Try to scroll the first alert to the center of the view.
        scrollBeginIndex = Math.max(
          0,
          executionIndex - Math.floor(state.executions.displayCount / 2)
        );
        if (alert.graph_execution_trace_index !== null) {
          graphExecutionFocusIndex = alert.graph_execution_trace_index;
        }
      }

      return {
        ...state,
        executions: {
          ...state.executions,
          scrollBeginIndex,
        },
        graphExecutions: {
          ...state.graphExecutions,
          focusIndex: graphExecutionFocusIndex,
        },
        alerts: {
          ...state.alerts,
          alertsLoaded: {
            ...state.alerts.alertsLoaded,
            state: DataLoadState.LOADED,
            lastLoadedTimeInMs: Date.now(),
          },
          numAlerts,
          alertsBreakdown,
          alerts: {
            ...state.alerts.alerts,
            [alertType]: updatedAlerts,
          },
          executionIndices: {
            ...state.alerts.executionIndices,
            [alertType]: executionIndices,
          },
          graphExecutionIndices: {
            ...state.alerts.graphExecutionIndices,
            [alertType]: graphExecutionIndices,
          },
        },
      };
    }
  ),
  on(
    actions.alertTypeFocusToggled,
    (state: DebuggerState, {alertType}): DebuggerState => {
      const newState = {
        ...state,
        alerts: {
          ...state.alerts,
          focusType: state.alerts.focusType === alertType ? null : alertType,
        },
      };
      // If alert data is available, focus onto the execution digest that
      // corresponds to the first alert.
      const currentFocusType = newState.alerts.focusType;
      if (currentFocusType !== null) {
        const executionIndices =
          newState.alerts.executionIndices[currentFocusType] || [];
        // Try to put the execution digest that corresponds to the first
        // alert at the center of the view.
        if (executionIndices[0] !== undefined) {
          newState.executions = {
            ...newState.executions,
            scrollBeginIndex: Math.max(
              0,
              Number(executionIndices[0]) -
                Math.floor(newState.executions.displayCount / 2)
            ),
          };
        }
      }
      return newState;
    }
  ),
  //////////////////////////////////////////////
  // Reducers related to top-level execution. //
  //////////////////////////////////////////////
  on(actions.numExecutionsRequested, (state: DebuggerState): DebuggerState => {
    const runId = state.activeRunId;
    if (runId === null) {
      return state;
    }
    return {
      ...state,
      executions: {
        ...state.executions,
        numExecutionsLoaded: {
          ...state.executions.numExecutionsLoaded,
          state: DataLoadState.LOADING,
        },
      },
    };
  }),
  on(
    actions.numExecutionsLoaded,
    (state: DebuggerState, {numExecutions}): DebuggerState => {
      const runId = state.activeRunId;
      if (runId === null) {
        return state;
      }
      const numExecutionsIncreased =
        numExecutions > state.executions.executionDigestsLoaded.numExecutions;
      const newState = {
        ...state,
        lastNonEmptyPollDataTimeMs: numExecutionsIncreased
          ? Date.now()
          : state.lastNonEmptyPollDataTimeMs,
        executions: {
          ...state.executions,
          numExecutionsLoaded: {
            ...state.executions.numExecutionsLoaded,
            state: DataLoadState.LOADED,
            lastLoadedTimeInMs: Date.now(),
          },
          executionDigestsLoaded: {
            ...state.executions.executionDigestsLoaded,
            numExecutions,
          },
        },
      };
      if (numExecutions > 0 && state.executions.focusIndex === null) {
        newState.executions.focusIndex = 0;
      }
      return newState;
    }
  ),
  on(
    actions.executionDigestsRequested,
    (
      state: DebuggerState,
      range: {begin: number; end: number}
    ): DebuggerState => {
      const runId = state.activeRunId;
      if (runId === null) {
        return state;
      }
      const loadingRanges = [
        ...state.executions.executionDigestsLoaded.loadingRanges,
      ];
      const match = findBeginEndRangeIndex(
        loadingRanges,
        range.begin,
        range.end
      );
      if (match === -1) {
        loadingRanges.push({begin: range.begin, end: range.end});
      }
      const newState = {
        ...state,
        executions: {
          ...state.executions,
          executionDigestsLoaded: {
            ...state.executions.executionDigestsLoaded,
            loadingRanges,
          },
        },
      };
      return newState;
    }
  ),
  on(
    actions.executionDigestsLoaded,
    (
      state: DebuggerState,
      digests: ExecutionDigestsResponse
    ): DebuggerState => {
      const runId = state.activeRunId;
      if (runId === null) {
        return state;
      }
      const loadingRanges = [
        ...state.executions.executionDigestsLoaded.loadingRanges,
      ];
      const matchIndex = findBeginEndRangeIndex(
        loadingRanges,
        digests.begin,
        digests.end
      );
      if (matchIndex !== -1) {
        loadingRanges.splice(matchIndex, 1);
      }
      const newState: DebuggerState = {
        ...state,
        executions: {
          ...state.executions,
          executionDigestsLoaded: {
            ...state.executions.executionDigestsLoaded,
            numExecutions: digests.num_digests,
            loadingRanges,
          },
          executionDigests: {...state.executions.executionDigests},
        },
      };
      for (let i = digests.begin; i < digests.end; ++i) {
        newState.executions.executionDigests[i] =
          digests.execution_digests[i - digests.begin];
      }
      // Update pagesLoadedInFull.
      if (digests.end > digests.begin) {
        const pageIndex = digests.begin / state.executions.pageSize;
        newState.executions.executionDigestsLoaded.pageLoadedSizes = {
          ...newState.executions.executionDigestsLoaded.pageLoadedSizes,
          [pageIndex]: digests.end - digests.begin,
        };
      }
      return newState;
    }
  ),
  on(actions.executionScrollLeft, (state: DebuggerState): DebuggerState => {
    // TODO(cais): Left-right navigation should have more context-depedent
    // behavior, e.g., when alerts are present.
    const runId = state.activeRunId;
    if (runId === null) {
      return state;
    }
    let scrollBeginIndex = state.executions.scrollBeginIndex;
    if (scrollBeginIndex > 0) {
      scrollBeginIndex--;
    }
    return {
      ...state,
      executions: {
        ...state.executions,
        scrollBeginIndex,
      },
    };
  }),
  on(actions.executionScrollRight, (state: DebuggerState): DebuggerState => {
    // TODO(cais): Left-right navigation should have more context-depedent
    // behavior, e.g., when alerts are present.
    const runId = state.activeRunId;
    if (runId === null) {
      return state;
    }
    let scrollBeginIndex = state.executions.scrollBeginIndex;
    if (
      scrollBeginIndex + state.executions.displayCount + 1 <=
      state.executions.executionDigestsLoaded.numExecutions
    ) {
      scrollBeginIndex++;
    }
    return {
      ...state,
      executions: {
        ...state.executions,
        scrollBeginIndex,
      },
    };
  }),
  on(
    actions.executionScrollToIndex,
    (state: DebuggerState, action: {index: number}): DebuggerState => {
      if (action.index < 0 || !Number.isInteger(action.index)) {
        throw new Error(
          `Attempt to scroll to negative or non-integer execution index ` +
            `(${action.index})`
        );
      }
      const {displayCount} = state.executions;
      const {numExecutions} = state.executions.executionDigestsLoaded;
      if (action.index > Math.max(0, numExecutions - displayCount)) {
        throw new Error(
          `Attempt to scroll to execution index (${action.index}), ` +
            `which exceeds maximum allowed index ` +
            `(numExecutions=${numExecutions}; displayCount=${displayCount})`
        );
      }
      return {
        ...state,
        executions: {
          ...state.executions,
          scrollBeginIndex: action.index,
        },
      };
    }
  ),
  on(
    actions.executionDigestFocused,
    (state: DebuggerState, action): DebuggerState => {
      const newState = {
        ...state,
        executions: {
          ...state.executions,
          focusIndex: state.executions.scrollBeginIndex + action.displayIndex,
        },
        // An eager-execution event was last focused on, update the
        // code-location focus type to `EXECUTION`.
        codeLocationFocusType: CodeLocationType.EXECUTION,
        sourceCode: {
          ...state.sourceCode,
        },
      };
      newState.sourceCode.focusLineSpec = computeBottommostLineSpec(newState);
      return newState;
    }
  ),
  on(
    actions.executionDataLoaded,
    (state: DebuggerState, data: ExecutionDataResponse): DebuggerState => {
      const runId = state.activeRunId;
      if (runId === null) {
        return state;
      }
      const newState: DebuggerState = {
        ...state,
        executions: {
          ...state.executions,
          executionData: {...state.executions.executionData},
        },
      };
      for (let i = data.begin; i < data.end; ++i) {
        newState.executions.executionData[i] = data.executions[i - data.begin];
      }
      return newState;
    }
  ),
  ////////////////////////////////////////////////
  // Reducers related to intra-graph execution. //
  ////////////////////////////////////////////////
  on(
    actions.numGraphExecutionsRequested,
    (state: DebuggerState): DebuggerState => {
      if (state.activeRunId === null) {
        return state;
      }
      return {
        ...state,
        graphExecutions: {
          ...state.graphExecutions,
          numExecutionsLoaded: {
            ...state.graphExecutions.numExecutionsLoaded,
            state: DataLoadState.LOADING,
          },
        },
      };
    }
  ),
  on(
    actions.numGraphExecutionsLoaded,
    (state: DebuggerState, {numGraphExecutions}): DebuggerState => {
      if (state.activeRunId === null) {
        return state;
      }
      const numGraphExecutionsIncreased =
        numGraphExecutions >
        state.graphExecutions.executionDigestsLoaded.numExecutions;
      const newState = {
        ...state,
        lastNonEmptyPollDataTimeMs: numGraphExecutionsIncreased
          ? Date.now()
          : state.lastNonEmptyPollDataTimeMs,
        graphExecutions: {
          ...state.graphExecutions,
          numExecutionsLoaded: {
            ...state.graphExecutions.numExecutionsLoaded,
            state: DataLoadState.LOADED,
            lastLoadedTimeInMs: Date.now(),
          },
          executionDigestsLoaded: {
            ...state.graphExecutions.executionDigestsLoaded,
            numExecutions: numGraphExecutions,
          },
        },
      };
      if (numGraphExecutions > 0 && state.graphExecutions.focusIndex === null) {
        newState.graphExecutions.focusIndex = 0;
      }
      return newState;
    }
  ),
  on(
    actions.graphExecutionDataRequested,
    (state: DebuggerState, {pageIndex}): DebuggerState => {
      if (state.activeRunId === null) {
        return state;
      }
      const graphExecutionDataLoadingPages =
        state.graphExecutions.graphExecutionDataLoadingPages.slice();
      if (graphExecutionDataLoadingPages.indexOf(pageIndex) === -1) {
        graphExecutionDataLoadingPages.push(pageIndex);
      }
      return {
        ...state,
        graphExecutions: {
          ...state.graphExecutions,
          graphExecutionDataLoadingPages,
        },
      };
    }
  ),
  on(
    actions.graphExecutionDataLoaded,
    (state: DebuggerState, data: GraphExecutionDataResponse): DebuggerState => {
      if (state.activeRunId === null) {
        return state;
      }
      const {pageSize} = state.graphExecutions;
      const graphExecutionDataLoadingPages =
        state.graphExecutions.graphExecutionDataLoadingPages.slice();
      const graphExecutionDataPageLoadedSizes = {
        ...state.graphExecutions.graphExecutionDataPageLoadedSizes,
      };
      const graphExecutionData = {...state.graphExecutions.graphExecutionData};
      for (let i = data.begin; i < data.end; ++i) {
        const pageIndex = Math.floor(i / pageSize);
        if (graphExecutionDataLoadingPages.indexOf(pageIndex) !== -1) {
          graphExecutionDataLoadingPages.splice(
            graphExecutionDataLoadingPages.indexOf(pageIndex),
            1
          );
        }
        if (graphExecutionDataPageLoadedSizes[pageIndex] === undefined) {
          graphExecutionDataPageLoadedSizes[pageIndex] = 0;
        }
        if (graphExecutionData[i] === undefined) {
          graphExecutionDataPageLoadedSizes[pageIndex]++;
        }
        graphExecutionData[i] = data.graph_executions[i - data.begin];
      }
      return {
        ...state,
        graphExecutions: {
          ...state.graphExecutions,
          graphExecutionDataLoadingPages,
          graphExecutionDataPageLoadedSizes,
          graphExecutionData,
        },
      };
    }
  ),
  on(
    actions.graphExecutionScrollToIndex,
    (state: DebuggerState, action: {index: number}): DebuggerState => {
      if (action.index < 0 || !Number.isInteger(action.index)) {
        throw new Error(
          `Attempt to scroll to negative or non-integer graph-execution ` +
            `index (${action.index})`
        );
      }
      return {
        ...state,
        graphExecutions: {
          ...state.graphExecutions,
          scrollBeginIndex: action.index,
        },
      };
    }
  ),
  on(
    actions.graphExecutionFocused,
    (
      state: DebuggerState,
      action: {index: number; graph_id: string; op_name: string}
    ): DebuggerState => {
      return graphOpFocusReducerHelper(
        state,
        action.graph_id,
        action.op_name,
        action.index
      );
    }
  ),
  ////////////////////////////////////////////////
  // Reducers related to graph structures.      //
  ////////////////////////////////////////////////
  on(
    actions.graphOpFocused,
    (
      state: DebuggerState,
      action: {graph_id: string; op_name: string}
    ): DebuggerState => {
      return graphOpFocusReducerHelper(state, action.graph_id, action.op_name);
    }
  ),
  on(
    actions.graphOpInfoRequested,
    (
      state: DebuggerState,
      data: {graph_id: string; op_name: string}
    ): DebuggerState => {
      const {graph_id, op_name} = data;
      const newState: DebuggerState = {
        ...state,
        graphs: {
          ...state.graphs,
          loadingOps: {
            ...state.graphs.loadingOps,
          },
        },
      };
      if (newState.graphs.loadingOps[graph_id] === undefined) {
        newState.graphs.loadingOps[graph_id] = new Map<string, DataLoadState>();
      }
      if (!newState.graphs.loadingOps[graph_id].has(op_name)) {
        newState.graphs.loadingOps[graph_id].set(
          op_name,
          DataLoadState.LOADING
        );
      }
      return newState;
    }
  ),
  on(actions.graphOpInfoLoaded, (state: DebuggerState, data): DebuggerState => {
    const {graphOpInfoResponse} = data;
    const {graph_ids} = graphOpInfoResponse;
    const graphId = graph_ids[graph_ids.length - 1];
    const newState: DebuggerState = {
      ...state,
      graphs: {
        ...state.graphs,
        ops: {
          ...state.graphs.ops,
          [graphId]: new Map(state.graphs.ops[graphId]),
        },
        loadingOps: {
          ...state.graphs.loadingOps,
          [graphId]: new Map(state.graphs.loadingOps[graphId]),
        },
      },
    };
    for (const input of graphOpInfoResponse.inputs) {
      if (!input.data) {
        // `input.data` can be undefined when the backend fails to look up
        // detailed information regarding the input op (e.g., for certain
        // TF-internal ops such as StatefulPartitionedCall).
        // Same for `consumer.data` below.
        continue;
      }
      newState.graphs.ops[graphId].set(input.op_name, input.data);
    }
    for (let i = 0; i < graphOpInfoResponse.consumers.length; ++i) {
      for (const consumer of graphOpInfoResponse.consumers[i]) {
        if (!consumer.data) {
          continue;
        }
        newState.graphs.ops[graphId].set(consumer.op_name, consumer.data);
      }
    }
    newState.graphs.ops[graphId].set(graphOpInfoResponse.op_name, {
      ...graphOpInfoResponse,
      // Remove `input.data` to avoid duplicated data in `opInfo`,
      // which is put into `newState.graphs.ops[graphId][opInfo.op_name]`
      // later.d
      // Same for `consumer.data` below.
      inputs: graphOpInfoResponse.inputs.map((input) => ({
        op_name: input.op_name,
        output_slot: input.output_slot,
      })),
      consumers: graphOpInfoResponse.consumers.map((slotConsumers) => {
        return slotConsumers.map((consumer) => ({
          op_name: consumer.op_name,
          input_slot: consumer.input_slot,
        }));
      }),
    });
    // Remove the loading marker for the op.
    newState.graphs.loadingOps[graphId].set(
      graphOpInfoResponse.op_name,
      DataLoadState.LOADED
    );
    return newState;
  }),
  ////////////////////////////////////////////////////////
  // Reducers related to source files and stack traces. //
  ////////////////////////////////////////////////////////
  on(actions.sourceFileListRequested, (state: DebuggerState): DebuggerState => {
    return {
      ...state,
      sourceCode: {
        ...state.sourceCode,
        sourceFileListLoaded: {
          ...state.sourceCode.sourceFileListLoaded,
          state: DataLoadState.LOADING,
        },
      },
    };
  }),
  on(
    actions.sourceFileListLoaded,
    (state: DebuggerState, sourceFileList): DebuggerState => {
      const newState: DebuggerState = {
        ...state,
        sourceCode: {
          ...state.sourceCode,
          sourceFileListLoaded: {
            ...state.sourceCode.sourceFileListLoaded,
            state: DataLoadState.LOADED,
            lastLoadedTimeInMs: Date.now(),
          },
          sourceFileList: sourceFileList.sourceFiles,
          fileContents: state.sourceCode.fileContents.slice(),
        },
      };
      const newNumFiles = sourceFileList.sourceFiles.length;
      const {fileContents} = newState.sourceCode;
      for (let i = 0; i < newNumFiles; ++i) {
        fileContents[i] = state.sourceCode.fileContents[i] ?? {
          loadState: DataLoadState.NOT_LOADED,
          lines: null,
        };
      }
      return newState;
    }
  ),
  on(
    actions.sourceLineFocused,
    (state: DebuggerState, focus: {stackFrame: StackFrame}): DebuggerState => {
      const focusedStackTrace = getFocusedStackFramesHelper(state);
      const newState = {
        ...state,
        sourceCode: {
          ...state.sourceCode,
          focusLineSpec: focus.stackFrame,
        },
      };
      if (focusedStackTrace !== null) {
        newState.stickToBottommostFrameInFocusedFile =
          isFrameBottommostInStackTrace(focusedStackTrace, focus.stackFrame);
      }
      return newState;
    }
  ),
  on(
    actions.sourceFileRequested,
    (state: DebuggerState, sourceFileSpec: SourceFileSpec): DebuggerState => {
      const newState: DebuggerState = {
        ...state,
        sourceCode: {
          ...state.sourceCode,
          fileContents: state.sourceCode.fileContents.slice(),
        },
      };
      const fileIndex = findFileIndex(
        newState.sourceCode.sourceFileList,
        sourceFileSpec
      );
      if (fileIndex >= 0) {
        newState.sourceCode.fileContents.splice(fileIndex, 1, {
          ...newState.sourceCode.fileContents[fileIndex],
          loadState: DataLoadState.LOADING,
        });
      } else {
        throw new Error(
          `Cannot find the following file in file list: ` +
            `host_name="${sourceFileSpec.host_name}", ` +
            `file_path="${sourceFileSpec.file_path}"`
        );
      }
      return newState;
    }
  ),
  on(
    actions.sourceFileLoaded,
    (
      state: DebuggerState,
      sourceFileResponse: SourceFileResponse
    ): DebuggerState => {
      const newState: DebuggerState = {
        ...state,
        sourceCode: {
          ...state.sourceCode,
          fileContents: state.sourceCode.fileContents.slice(),
        },
      };
      const fileIndex = findFileIndex(
        newState.sourceCode.sourceFileList,
        sourceFileResponse
      );
      if (fileIndex >= 0) {
        newState.sourceCode.fileContents.splice(fileIndex, 1, {
          loadState: DataLoadState.LOADED,
          lines: sourceFileResponse.lines,
        });
      } else {
        throw new Error(
          `Cannot find the following file in file list: ` +
            `host_name="${sourceFileResponse.host_name}", ` +
            `file_path="${sourceFileResponse.file_path}"`
        );
      }
      return newState;
    }
  ),
  on(
    actions.stackFramesLoaded,
    (
      state: DebuggerState,
      stackFrames: {stackFrames: StackFramesById}
    ): DebuggerState => {
      const runId = state.activeRunId;
      if (runId === null) {
        return state;
      }
      const newState: DebuggerState = {
        ...state,
        stackFrames: {...state.stackFrames, ...stackFrames.stackFrames},
        sourceCode: {
          ...state.sourceCode,
        },
      };
      newState.sourceCode.focusLineSpec = computeBottommostLineSpec(newState);
      return newState;
    }
  )
);

function graphOpFocusReducerHelper(
  state: DebuggerState,
  graphId: string,
  opName: string,
  graphExecutionIndex?: number
): DebuggerState {
  const newState: DebuggerState = {
    ...state,
    graphs: {
      ...state.graphs,
      focusedOp: {
        graphId,
        opName,
      },
    },
    // An graph event was last focused on, update the
    // code-location focus type to `GRAPH_OP_CREATION`.
    codeLocationFocusType: CodeLocationType.GRAPH_OP_CREATION,
    sourceCode: {
      ...state.sourceCode,
    },
  };
  newState.sourceCode.focusLineSpec = computeBottommostLineSpec(newState);
  if (graphExecutionIndex !== undefined) {
    newState.graphExecutions = {
      ...state.graphExecutions,
      focusIndex: graphExecutionIndex,
    };
  }
  return newState;
}

// TODO(cais): Refactor the reducers into separate child reducers and
// move them to separate files. Combine them with `combineReducers()`
// for better maintainability.
export function reducers(state: DebuggerState, action: Action) {
  return reducer(state, action);
}

redpajama_set_name: RedPajamaGithub


text:
How Different Countries Celebrate Valentine's Day
By Olivia Richman : more posts
Valentine's Day is coming — to the joy of some and saltiness of others — and you've probably seen the boxes of chocolates popping up in grocery stores, the sappy cards, and the rom coms highlighted on Netflix's home page. But not every country celebrates Valentine's Day the same way, with a box of chocolates and flowers. Here is how different countries celebrate Valentine's Day.
While each country has their own unique traditions, the history of this romantic day is the one constant. Valentine's Day is celebrated in honor of Saint Valentine, a priest who served in 3rd century Rome. At this time, emperor Claudius II declared that young soldiers could no longer get married since single men made better soldiers. But Valentine went against this and performed secret marriage ceremonies. When the emperor found out, he had Valentine executed.
With Valentine viewed as such a passionate and brave man during times of great adversity — helping people get married despite the risk of death! — it's no wonder that his memory has lived on. Saint Valentine is so popular that he is now celebrated all over the world. And while every country celebrates him differently, it's always all about love!
Valentine's Day Traditions Around the World
Ever wondered how other countries go about this romantic holiday? Get inspired with some of these international traditions.
Valentine's Day in Israel
In Israel, Jews celebrate their own version of Valentine's Day called Tu B'Av. It falls on August 1 this year since, like other Jewish holidays, it follows the lunar cycle. A beautiful candle-lit dinner under the full moon? This is already straight out of a romance novel, let's be real.
So Tu B'Av actually started as a matchmaking day for unmarried women. But in more modern history, Tu B'Av is similar to Valentine's Day, with romantic dates, flowers, cards, and even festivals. Everyone will often wear white to these celebrations to honor the long-standing traditions. You can often find Jewish communities throwing Tu B'Av parties and dinners all over the world!
If you want to learn more about unique Israeli traditions and locations, check out Lost Tribe's blog. We highlight interesting locations like beaches, arcades, and even fast food!
Valentine's Day in Argentina
Is one day of romance not enough for you? If you're a hopeless romantic, you'll want to celebrate Sweetness Week in Argentina. Falling in July, this week-long celebration has couples exchanging candies for kisses for seven days.
Valentine's Day in France
No romance-related blog would be complete without mentioning France. It's actually believed that the first-ever Valentine's Day card originated in France when Charles, the Duke of Orleans, sent a love letter to his wife while he was in prison back in 1415. Between February 12—14, visit Valentine, a French village that is decked out with stunning, romance-inspired decorations. You'll find lit up trees, roses, and couples proposing all over.
Valentine's Day in South Korea
One month of romantic gestures isn't enough for some people. In South Korea, couples have the chance to celebrate their love every single month. Ranging from The Day of Roses to The Day of Hugs, each mini-holiday falls on the 14th of every month, so couples will always have a cute tradition to look forward to. One of the most unique traditions is The Black Day in April, which encourages singles to get together and eat black noodles.
Valentine's Day in Philippines
Valentine's Day is more than just a nice dinner for people in the Philippines. On this day, the government will sponsor an event where multiple couples all get married at the same time! This is probably one of the most romantic events you'll ever experience. Many people will take Valentine's Day off of work and entire cities will be decorated extravagantly.
Valentine's Day in Brazil
Brazil had to move Valentine's Day to June 12 since February is already packed with the Carnival celebration. Known as Dia dos Namorados, Brazilians celebrate this romantic holiday with a beautiful dinner, exchanging gifts, and going out dancing.
If you're single, don't worry! Dia dos Namorados also includes a ritual called "simpatias" that has single women writing the names of eligible bachelors on pieces of paper and then folding them up the night before. On the day of, they will choose a paper at random to determine who is the right man to pursue for marriage. It's sort of like an advanced game of M.A.S.H!
Valentine's Day in Nigeria
If your love language is gifts, Nigeria may be your Valentine's Day destination. In this country, the biggest tradition is to come up with the most extravagant and exorbitant gift you can think of! It's not uncommon for people to spend some of their savings on finding the perfect present.
Valentine's Day in ROmania
In February, couples in Romania have their own unique way of celebrating love that feels right out of an indie romance. February 24th is the day when couples get engaged. To propose, the couple will go out in the forest to pick beautiful flowers to make a colorful bouquet. Then the couples will wash their face with snow to signify good luck for the upcoming spring season.
Valentine's Day in Estonia
On February 14, Estonia celebrates Valentine's Day in a more inclusive fashion. It's known as Sobrapaev and is a day all about friendship. Singles, couples, friends, and family will all celebrate their love for each other with gifts, parties, and dinners. Nobody will feel left out on Sobrapaev!
Valentine's Day in Spain
Spain's version of Valentine's Day is in October, known as the feast of Saint Dionysus. But this isn't your usual romantic dinner. This festival is actually all about marzipan figures known as macadora. Men will make these cute, quirky figures for their partners. To add to the vibrant fun, there is also a whimsical parade in various villages throughout Spain.
Nosh Or Noise? Accent — The Lost Tribe Review January 26, 2023
How Different Countries Celebrate Valentine's Day January 21, 2023
Is Doja Cat Jewish? All About the Talented Artist's Career & Identity January 12, 2023
Comedian Tiffany Haddish Has Bat Mitzvah at 40: "This Is Where I'm Supposed To Be" January 11, 2023
Akrew Wins LTCS 2.0, One Of The Biggest Off-Season Rocket League Tourneys January 11, 2023
a community of over 4,500
losttribe
The Jewish community for content, gaming, sports & entertainment.
Streams, Podcasts, Community, and more!🔥
@losttribeathletics @losttribegaming
The resident #swiftie failed the @taylorswift test
LostTribeTV


Part III: Zeus rebuilt and configured!
I've spent the last month working with the newly built zeus server which is now powered by OpenSolaris (2009.06).
Maybe in a future release. Make sure you update the BIOS as OpenSolaris may have an issue with the USB controller being 'mis-configured' otherwise.
Just for kicks I went to Jaycar and bought myself a power usage meter to measure the watts used by the new boxen (see a review of the Mains Power Meter on DansData).
Nice, with an Intel Atom based server it could go _a lot_ lower, but I'm happy with this.
It only feels last last month Fedora 11 was released, alas Fedora 12 is out now. Read about the changes and updates found in Fedora 12 or maybe just view the summary or a full list if your ubber keen.
RPMs on the fly for all the updates.
policy where needed. IPv6 support has also been improved.
Skeggs (Nouveau driver for NVIDIA).
easily with just a couple of clicks.
Jeremy Katz, Dave Jones, and many others.
active use. Thanks to Red Hat's Bastien Nocera.
improve the security of Fedora.
available out of the box on some Broadcom chipsets.
writes. Thanks to Jeremy Katz.
a single, shared root file system.
I'm torn between using the latest Ubuntu or Fedora on the client.
Ubuntu 9.10 & Mozilla Firefox 3.6 Beta 1!
Unless you've been living under a rock (or near a very large one in the middle of no where) Canonical released the eagerly awaited Ubuntu 9.10 Karmic Koala on Friday. This is probably one of the biggest and coolest release of Ubuntu yet! Make sure you try the Server edition and setup an EC2 private cloud for tinkering – Cloud is where its at! But thanks to Mark Wolfe make sure you see this blog post about some things to do after installing.
Get it from the main download server or from iinet or internode mirrors if your in Australia.
Then there's Mozilla who released Firefox 3.6 Beta 1 recently too – based on Gecko 1.9.2, download a copy and try it out, its got Windows 7 integration and CTRL+TAB previews which are finally in!
If that wasn't enough I finally turned 25 today, quarter of a century. Its nice to have a birthday on a weekend – especially a long weekend!
CentOS 5.4 has been released! Woo yeah, its been a while since RHEL 5.4 has been out but checkout the release notes for a list of changes.
Download mirrors are being updated but if your local, here are a couple of Australian Mirrors.
I just did a inplace 5.3->5.4 upgrade with a yum update. With a localised mirror, blindingly fast too!


Up to 14 MP or 751 Frames/Second Area Scan Camera—Basler Ace cameras are available with various resolutions and speeds as well as a range of interfaces and sensors from all leading manufacturers. They support frame rates up to 751 frames per second and a broad range of sensors, including CCD, CMOS, and NIR variants. The Basler ace communicates using either a USB3 Vision, GigE Vision, or Camera Link interface. These cameras are fully quality tested and calibrated for consistently high performance and reliability.


text:
Beneath the Subsurface
The COVID Effect: An Honest Discussion about People and Business
Home Media & Events Beneath the Subsurface The COVID Effect: An Honest Discussion about People and Business
Season 2 : Episode 1
Kicking off season two of Beneath the Subsurface podcast, we tackle some lingering questions and concerns that businesses are facing in the wake of the COVID crisis as well as the downturn in our industry. This double whammy has led traditionally office-based companies into remote work, challenging both individuals and teams to innovate differently. We'll discuss the growing gap between people and companies and how we can all work to bridge it.
Join Jaclyn Townsend, Tanya Herwanger, and Carl Neuhaus as they discuss the changes that this year has brought to businesses, people, and our industry.
00:00 - Intro
01:17 - Virtual Relationships & Getting Personal
07:04 - The Growing Gap: Remote Limbo
13:32 - Remote Work & Teams
17:17 - Disconnection & Culture Shifts
19:34 - Innovation Challenges - Define the Problem
24:55 - Simulating the Virtual Water Cooler
27:02 - Relieving the Anxiety
34:46 - A Way Forward
37:45 – Conclusion
EXPLORE MORE FROM THE EPISODE
Building Productive Relationships
New Rules of Dating (Virtually)
Virtual Sales amid COVID-19 and after
5 Ways Sales Teams Can Adapt During COVID-19
Mastering the Virtual Practice: Why Your Clients will Prefer Virtual Meetings
How to Dramatically Improve Work-Live Balance
Forget Work-Life Balance: It's all about Integration in the age of COVID-19
Online Gaming and Teamwork
How online gamers' participation fosters their team commitment: Perspective of social identity theory
Does trust promote more teamwork? Modeling online game players teamwork using team experience as a moderator
How I Use Online Games to Skyrocket My Remote Team's Productivity
Host Jaclyn 00:00:
Welcome to season two episode seven of TGS' Beneath the Subsurface podcast. This season, we're tackling the bigger picture problems facing the energy industry today. I'm Jaclyn Townsend and your moderator for today's chat with guest speakers, Tanya, Herwanger, EVP of Staff and Support and Carl Neuhaus VP of Well Data Products. Today, we're talking about the COVID effect and the growing gap we see between people and companies. We know this disruption will have long lasting effects, but what does it look like specific to business and how we work? It's been a good five to six months since the pandemic threw the world, a significant curve ball. And now that most of us are past the initial shock period. We're almost in this new phase of acceptance and testing while most of us are still trying to understand how to work, how to collaborate and simply how to live our lives. Amidst regulations, guidelines, and new rules. We're starting to see some clear gaps between people and companies.
So moving past the response and actions that companies have set in motion to maintain business continuity, you know, you've received all those emails from your business connections. Let's talk about what's happening now during this phase. What have we learned and what are we learning? So here to kick things off are Tanya and Carl, welcome to you both.
Tanya 01:14:
Hi Jaclyn. Hi Carl.
Carl 01:16:
Hi everyone. Good morning.
So further to the introduction we're in this learning and testing phase, if you will, and what I want to know, and probably what our audience wants to know is from your perspective, what effect is COVID having on people, economics and innovation in the business setting. Carl, we'll kick things off with you. We've got virtual barriers and all sorts of other restrictions that are preventing us from meeting and interacting the way that we used to pre COVID. How do you build stronger relationships with customers, for instance, especially when meeting someone new?
Thank you, Jaclyn. That's a really good question. I want to start off by saying that we're very fortunate because we do have strong relationships with our existing customers. They're built on working together for a long time, and there's a, a lot of trust on both sides. So there's a lot of open communication and I think that it's helped us greatly. And now that everybody's gone remote, but we still have to go about our day-to-day business. Now with resources moving around on the customer side and moving around on our side, you do find yourself talking to people that you haven't met before, where you need to quickly establish rapport with that person, because ultimately you're trying to either solve the problem or you're trying to provide a service to them, to help our customers go about their, their day to day business. So I think in general, there's three things, three aspects to this. I want to briefly touch on.
Number one is any relationship is really built on trust. And when you don't know somebody, I think a good way to establish that trust. If you're not in the same room with that person and you can't kind of pick up on some of the soft body language cues is just acknowledging the situation that we're all in. And through that finding some common ground. If you have common ground, that really helps you establish your relationship with a person. And as we are going through some interesting times, our customers are doing the same thing. We have lots of customers who are facing reductions in their staff, and, there's uncertainty about their job, but they also have to go about their day-to-day business. Some customers have gone through bankruptcy. So just start the meeting by acknowledging that this is a new situation for all of us, but we still have to find ways to work together, helps relieve some of that pressure. And then all of a sudden, you're basically on the same team.
The second aspect is communication. When you meet somebody in person, it's really easy to understand how the conversation is going, how the conversation is progressing by somebody's body language or the way they hold their head or the way they gesticulate with their hands. On a video conference, that's a lot harder to pick up. So I think over communication is the keyword here. I encourage people to interrupt, to ask for clarification, to ask questions and also very honestly, and transparently say that something doesn't work for them. So before you go into a long discussion about something that the customer may not be interested in, I think it's totally okay for them to say that this is not something that's going to work. So there's no need to spend time on that. So by being overly transparent, if you will, that eliminates miscommunication and also quickly gets you back on track to where you have that common ground.
And then the third thing I think that's important is creative solutions. We're in an environment in terms of the market, in terms of the, the virus and pandemic. I don't think we've had that we've been in before. So you need to find solutions that you didn't think of before customers still need to go about their business. We need to go about our business. So how do we find overlap in the two? And the onus is really on us to understanding customer needs and then coming up with a creative solution on our end.
Thanks, Carl, you touched a little bit on communication, which is a really great point. How can we find ways to be genuine and add that personal touch when we have, you know, a screen in between us now, right? We're not able to meet in person anymore. What can we do to add those personal touches in our conversations to gain that trust?
I think it goes back to being open and transparent in a way you're, you're getting insight to somebody's home. So people are a little bit more exposed than they would be in a business setting in a meeting room. And I think it's okay to acknowledge that. You talk about, your dog that's yapping, or if you hear background noise, maybe that's your kids. So you can, you can create that common ground to make light of it in a way to establish that we're all really in the same boat and we're all facing the same challenges and that's, you know, making fun of not being able to hear the other person or I don't know, tech issues or stuff like that. There's are things there's ways to lighten things up to where you can make the other person feel at ease in the conversation.
Tanya do you have anything to add on this subject?
You know, I think it's almost counter-intuitively you have to not ignore the fact that you're on screen. So clearly you need to speak differently when you're on screen. You need to maybe leave longer pauses at the end of your sentence to account for that milliseconds of lag until the other person hears what you're saying. So I think just being mindful of that, that you are communicating via a different medium is important. And I think it goes a long way to smoothing out the bumps of communicating via these virtual means that we have now.
That's a good point. So moving on, there are a lot of obvious benefits and downsides from remote working that we've all become familiar with in the past few months, enjoying flexible work hours, being able to multitask, getting laundry done per se, or prepping a more intricate meal for dinner throughout the day. But equally there are more available distractions. The kids are at home, running around, it can be harder to separate or achieve that work life balance. Tanya, what are some of the major challenges for people and companies in this remote limbo and how are people enabled to do their best work in this environment?
I think the introduction you just gave to that question captures rather well, one of the main challenges I have observed, and this is both for individuals and companies, and that is how do you balance work and home when you're working remotely? From the individual's perspective, how do you ensure that work doesn't consume your entire day? And I mean, that quite literally. So we all saw meetings getting earlier and earlier or later and later, or both, we all experienced weekdays blurring into weekends and public holidays, all but disappeared because they just became another day in front of your computer, on teams. Clearly this encroaches, on your family life. If you have a family and on your personal life, if you don't have a family.
It also makes for longer workdays, there are lots of reports published. I'm sure you've seen them as well. That point to longer work days during lockdown periods, as well as more emails and more meetings, albeit shorter ones, apparently. From the company's perspective, it's fair to ask, are you really producing your best work? If you are prepping, a more intricate, dinner, or stepping away to change the laundry. And if you're working longer hours and staying up late or getting up ultra early to attend those off the schedule meetings, are you not just running yourself to the ground and actually not bringing your best self to the task? You may be busier. You may be working longer hours and you may feel like you're getting through all of your tasks, but are you delivering the value that the company needs from you?
I think this is a really interesting development. And it's something that you touched on or hinted at in your introduction when you spoke about the growing gap between people and companies. And I can tell you it's a really delicate point. Most of the surveys that I have seen show that employees are saying that they're equally or even more productive working remotely, and many people want to keep it that way. Many people want to remain remote. I have no doubt. People actually feel more productive. I mean, I certainly do when I have a day at home and I'm sure people are ticking more items off of their to do lists. But the challenge is, if you're ticking off items from your to do list, does this automatically mean that you're delivering value to the company or the value that the company needs? It's a really difficult discussion to have, and it's not helped by the fact that I certainly haven't seen as many surveys testing the point of how individual productivity matches what the company needs. And it would be great to see some more surveys in that area.
Beyond this thorny issue, there are many others, like how do you onboard new employees so that they can pick up on and adopt company culture? How do you bond the team virtually, particularly if you have a new person joining the team that hasn't met anybody else, how do you deal with the new hybrid situation when you've got some people in the office and some people still remote, these are all things that we're still trying to work out. And, you know, all I can throw in is that there's no one size fits all solution. It's just really important to acknowledge the challenges, to see what other companies are doing, to try things out and then to keep what serves you and your company and your situation, and to drop the rest.
Yeah, some very deep points that will probably be addressed further on as we go into this, Carl, you have a large team. How, how are you dealing with some of the challenges and pain points that Tanya just touched on?
I think what Tanya said about people being more productive in checking off more of their things on their to do list that certainly contributes to days starting earlier and days getting longer. So when I look at my team, I think I'm very fortunate because everybody in the team really cares about the business and they care about their work and they care about their customers. So they, they want to be as productive as possible. They're really motivated. Now the flip side of that is that you're slowly burning yourself out. If you keep doing that for months and months and months where, you know, days blend into weekends, blend to holidays. So what we've been very open about, especially as the size of our team has been reduced to less than half of what we were at the beginning of the year. We've gotten really good at high grading, the things that we need to do.
So if there is a task, we decide as a team, what value that brings to the organization and how it moves us further ahead. And if there is a list of 20 things that we want to get done in the next couple of weeks, maybe there are five that we can actually postpone because they could be done, but don't really add value in the way that other tasks have value, that way you can make sure that the energy that you do spend, you actually spent on a high level and you produce a high quality result for the company, but also for customers.
I know from our perspective too, working at TGS, we're struggling with those same things and we have to find that balance for sure. So Carl, this is kind of a bigger question, in your perspective, how does remote limbo affect company culture?
That's a really good question. I think part of the TGS culture is open communication. So if there are things that aren't working, as well as they should for individuals, we usually bring those issues up and we discuss them with our peers. We discuss them with our managers and we move that information up the chain so that collectively we can do something about it. So in that way, I don't think that there's a specific effect on company culture. I think our company culture enables us very well to deal with these things because we have open communication and transparency and we can tackle challenges as a team because we lay those challenges out in the open. And I think people feel comfortable giving honest feedback about how they can be more productive and provide more value to the company and also to customers so that as managers and as senior leaders, we can address them in a way that provides solution that's most effective for the company as a whole.
I find, your response really interesting, your take on transparency and open communication and willingness to share, you know, where we are, productivity, challenges, et cetera. It's, actually one of the things that I've identified more as an issue at this particular point in time with respect to the, you know, people not feeling confident to do that because they're concerned about their jobs.
More so in our industry too, I think, right? Than any other industry.
Yeah, I think, no, I think that's a good point. There's this added layer of anxiety because of the market then because of the oil and gas industry specifically. So you don't want to be perceived as somebody who says no to something, if you can't do something. I've- so I'm aware of that, but I think at least for my team, we're not, I'm not really seeing that. I think we built a culture to where people feel comfortable speaking up because that's actually key to staying innovative. So people bring up 10 ideas and nine of them are bad, but there's one, that's a real gem, but if they didn't feel comfortable throwing these things out there, we wouldn't ever get to the gem one. Right. And I think that's a culture that each manager needs to cultivate and contribute to individually within their teams to make sure that teams are comfortable speaking up because ultimately the other consequences that if you, if you don't speak up, if you have an no transparency, it kind of works from the outside until it really doesn't work until you have some kind of catastrophic failure and you burn, you burn people out or people leave because they don't feel appreciated. So I think by allowing people to challenge certain things or ask for clarification and ask for context, you can create an environment where people do feel comfortable asking questions. We're just being honest and transparent without the risk of repercussions.
I know that if I had not been at TGS for six years already, when we went into this crisis and went into lock down and started working remotely, I would have struggled more than I actually did. I definitely called on those existing relationships and that existing understanding of how the company works and what its DNA is to navigate through the remote working period. And even with that knowledge, I've found that I was beginning to feel increasingly disconnected. And I found that actually interesting because I have a large team. I spoke to people every day. I spoke to my colleagues, but I had this growing sense of not being part of the bigger picture or not being, not always having as crisp a view of the bigger picture as I did before the remote working period. And I think if you don't have that cultural orientation, if you haven't absorbed a company's culture already, it's challenged during remote working or prolonged periods of remote working. And I'm not sure how you then transfer culture. How do I share my experience of what TGS is, with somebody else in this virtual world. And that goes hand in hand with bonding, I guess, you know, how do you, how do you bond in this remote environment? So I don't have a full answer. I can only share my perspective and my experience on, on culture and what I felt during the lockdown period.
Definitely a, I guess, a continuing topic that I think one of you guys touched on that we're not, we're not alone in this. It's not just TGS. It's lots of companies dealing with the same struggles. So it'll be interesting to see how TGS and, and other companies take these issues head on.
So this is a nice segue to move into a different topic, related to what we were just talking about, about productivity and innovation. We've learned that productivity, isn't the real challenge for teams. It's not difficult to remain task oriented when we're all in our own productivity, bubbles, if you will typically only meeting with coworkers when there's something to be done in any downturn, innovation is often the make or break driver for success. So Carl, what effect is this situation having on teams and the expectation to continue to collaborate and innovate? How does the lack of face to face interaction affect innovation?
Thank you, Jaclyn. I think it ties back a little bit to the culture issue that we just talked about in order to be innovative, you have to challenge the status quo. You have to throw things out there that you might not be sure of if, they actually work and just have to try a lot of different things. So you have to have a culture where that's permitted and encouraged, and that's what drives innovation. So I think from that perspective, TGS is actually fairly well positioned to stay innovative in the current environment.
Now, the one thing that's much harder to replicate is the face-to-face interaction. So when we have a difficult problem to solve the easiest way to solve it is to get a bunch of people into a meeting room, everybody with a marker and people talk and they draw something on the whiteboard and the setting can be a little bit chaotic at times because people talk over each other or they erase somebody else's picture, and then they draw something new or add onto it. And in the meeting room setting, that all works really well in a very short amount of time. You actually got a lot of ideas out there and probably focused in on few that that could really work and probably have a concrete plan of how to make them work.
Now, when you're all remote and on screen, that's a lot harder to replicate. So some of the meeting applications do actually have whiteboard apps that you can use, but if you have a mouse and not a stylus, doesn't really work as well. So it might work for context, but generally it changes the way people interact in this mess of figuring out the right solution.
So what I found works with my team, again, this just personal experience, we probably work harder on defining the problem statement. So invest a little more time into what it is you're actually trying to solve because people need to put some thought into it before they go into the meeting, instead of figuring out while you're talking over the other person. And then when you start the meeting, when you start the discussion with a well-defined problem statement, you actually have to give everybody the time to provide their input or raise their questions. And that goes back to Tanya's point a little bit. You have to speak more slowly. You have to, allow for that delay in the transmission. And you have to provide a little bit of space at the end for people to chime in so that people don't talk over each other. So if you then go around the room and everybody can present their input, then people collect their thoughts and again, provide their input to what was being said. And it's probably a little bit of a longer process at the end. You also need to write down, the main points and take notes and then circulate them and probably have a followup. So I think it's, it's possible to stay innovative, but you have to be very mindful of what you could call meeting etiquette, letting people finish. And just again, over-communicating asking for clarification.
Tanya, do you have anything to add on this subject?
Yes. I agree with what Carl has said. I think it requires a bit more effort in terms of facilitating the conversation or the collaboration and the sharing of ideas. And it takes a little more effort as well to ensure the flow. I think a lot of my experiences in sessions where we've, you know, tackled difficult subjects or come up with new ideas, there's a kind of energy that settles into the discussion, the kind of flow where people build on comment or an idea or a contribution from one of the other team members, and then takes that to the next level. And that it's a race until you arrive at it, the better solution, or the best solution. And that's a little, can be a little clumsy in the virtual setting. But as Carl said, if you manage that, if you anticipate for that and you manage that, I think it is still possible to achieve that kind of energy and outcome.
Yeah, I couldn't agree, I couldn't agree more. It takes more time or effort to do things, but it is definitely achievable.
So another aspect of this, if, if I, me personally thinking about how I arrive at solutions. Yes, it's through scheduled meetings where you talk about that solution. But a lot I actually get from talking to people that may not be directly involved. And those can be casual conversations over lunch or at the copy machine or the water cooler, so that you just kind of discuss things in passing. This is what's going on here. And then somebody else brings up an interesting point and you pursue that and you think about it a lot.
So one thing that's missing when you're all remote is the casual conversation that happens as you run into people. So if you think about your day and what's structured and what's kind of unstructured, how do you in an office setting, How do you replicate that when you're all remote? So I really make an effort with my team, for example, to have personal check-ins every day and have these daily stand up meetings, but also make an effort to call other people in other business units throughout the day, to where I check in with them. I talk about what's going on in, in my business, learn about what's going on in their business and just casually talk about this and that doesn't have to be a lot of time. Most of those calls are five minute conversations and you actually replicate a little bit of the atmosphere that you would have in an office setting.
And I guess another aspect is to, to one of the points that Tanya brought up earlier, feeling disconnected. It helps me feel connected to the rest of the business, that when you're all in the same office, you kind of have an understanding of what's going on, but when you're all remote, it's really easy to feel like you're inside of this bubble and you're not connected to what the company is doing as a whole. So just making an effort to talk to people. And in my experience, nobody, nobody minds taking a phone call and nobody minds talking to you. It doesn't matter who it is in the company.
Yep. All great points. So moving on, we've talked a lot about relationships, communication, culture, innovation, and there is this, there is a subject that plays a role in all of those things that, that some might actually gloss over and forget to mention. And that is the psychology behind everything we've discussed. Earlier I said that productivity wasn't the issue. And as far as performance goes, it's not, but Tanya, there seems to be this no-frills just stay productive no matter what attitude. And probably more so in the oil and gas sector, since we've been hit with this double whammy of COVID plus the industry downturn, as we mentioned, how is this affecting us?
You know, Jaclyn I think there's a lot of anxiety as a result of what we've seen and experienced in the last five months. And in fact, what we continue to experience from what you rightly describe as a double whammy situation or a double crisis, people are worried about their jobs.
Many have seen colleagues leave over the past few months. They're not sure whether, you know, they themselves will, continue to have a job in the future. And companies are worried about their financial stability. I mean, I don't mean to be doom and gloom, but that is kind of our reality in this moment. And I think when you're in a crisis, you default to this all hands on deck. And I think companies are looking to employees and expecting them to be fully focused on driving results right now. And that's totally understandable. Employees on the other hand will be eager to be seen, to be doing everything that they can and everything that they're being asked to do. And what I have observed is that people are reluctant to take time off, for example, or they're reluctant to say that they need support or reluctant to say, you know, I've worked 12 hours everyday this week and it's Friday. And I have a commitment with my family.
There's a certain reluctance to bring that forward because you're concerned about your job and, and that's a legitimate concern in the environment that we're at. So I think it's important. And Carl has touched on this. It's important and it's incumbent on managers to foster an honest and supportive environment. I think that's really key to how we deal with the situation. I think employees need to feel safe to raise concerns. They need to feel safe to ask for support and they need to feel okay to take time off, for example. I also think the little things make a difference just every day humanity, if I can use that expression, I think we need to pause to celebrate the successes, whether those successes are big or small.
I think when you're in a crisis, it's really easy to just focus on the shortfalls. The, the bits we didn't get done. The, you know, project was a little late or we didn't hit the targets or I don't know that kind of stuff, whatever didn't happen, it's just easier to focus on that. But that actually only adds to the anxiety. So I think it's important to just pause and to celebrate all of the things we did accomplish. I think it's also important to acknowledge people's contributions and people's sacrifices I spoke about earlier meetings and later meetings, a few minutes ago, I think if somebody accepts your invite to a meeting at 10 o'clock, you should start that meeting by saying thank you. And you shouldn't take it for granted that that person was obligated to take that call at 10 o'clock. And I think we don't do enough of that. And by we, I mean the collective we, because we're just, you know, we just want to get into that discussion to talk about the reason why we set up the meeting.
As team members. We can check in on each other, just give your colleague a call and say, Hey, how are you doing? I don't have a reason to call. I'm just calling to check in on you, stand up for each other if we need to and offer practical help. I mean, lots of times I've learned from other people going, you know what, that's how I handled this situation, sharing our own experiences and offering practical help. It's not a high tech answer. I know not a high tech solution, but bringing a little everyday humanity to the situation diffuses what is legitimate anxiety as a result of the double whammy or the double crisis that we find ourselves in.
Yeah, I think that was a real answer. And like you said, a very human point of view because some, a lot of times we do forget were in work mode and, you know, we forget there are other humans on the other side of the screen, Carl, what say you?
I completely agree with, with what Tanya said. Two things I want to touch on the everyday humanity? I think it starts by acknowledging that our individual situations are different and somebody may have had a really rough day for reasons that you don't know and you don't need to know. And I think it's okay to just acknowledge that and cut people some slack. So when we come together, we all come together from a completely different background. We've had a different course of the day. So at that 10 o'clock meeting, just be nice to each other. I think that's, I guess that's an easy way to put it, on the flip side of that, because everybody's situation is different. I think the company as a whole can implement policies to ameliorate some of the anxiety, but we're not going to be able to make it go away completely because the market is still the market our businesses is the business. Our customers are going through difficult times. So this is just a difficult time and we can try to smooth things over, but at the end of the day, this is just the situation we're in.
So the way you could use that, or what you do about that is what Tanya touched on in terms of highlighting our successes. If we look at the last five to six months, we've probably been more innovative, more creative and have accelerated a few really important initiatives that we would not have done otherwise. So if you look back, yes, it was really stressful, long days, weekends, et cetera. But I feel proud of what we've accomplished as a team and how we've managed, as a team again, to navigate the company through this situation. And how we've actually done really well in certain areas, because it highlighted things that were critical that we had to focus a hundred percent of our attention on. And now we solve those really, really important challenges that may have taken us a year or two in a different situation. And you can highlight individual contributions to that. And you can just, I guess, remind people of the fact that, yes, this is very stressful, but we've all risen to the occasion and if your team have risen to the occasion and they've delivered some really, really good things, I think that's something to be proud of, you know, something to highlight.
Thanks and a final few questions for both of you. What's the solution now, is there one? And what are the tools to bring everything back together? And what are other, what do you see other companies doing and what is TGS doing? Tanya, you want to go first?
Sure. I think the situation is fluid. So we're still learning. We're still trying to implement the lessons from the early phase of this. I don't think there's a one size fits all solution. I think it very much depends how you bring your pieces back together. It depends on what your starting point was, what your culture is, how you manage the period remote and how you want to piece them back together. It isn't a given you want to piece them back together, exactly as they were before. Maybe there are some bits that's Carl has said that you want to keep because they worked well and you want to transfer those into the next phase. So I think we're all just really working on how the picture is gonna look like post this situation. And it's a work in progress. I think you have, you know, you have some solutions for some issues that you've been clearly able to identify. You've responded to, but the whole piecing the bits together, I think it's still a work in progress.
Carl final words?
I agree with Tanya that this is definitely a work in progress. So for us as a company and as senior leaders, that means that we can provide some general guidelines, but then really need to allow for some flexibility, as we're implementing those guidelines navigating through this, towards a normal that might look a little bit different than the normal that we started with. Now, the question that remains is how you continue to build team cohesion in light of all of this. And even though we are an international company with people in different parts of the world, connecting to BUs remotely, for the most part, we've relied on in person events for team building and creating these shared experiences to where we bond as a team.
And the, question that we need to ask ourselves is can we replicate that? Can we recreate that virtually? And the answer seems to be yes, because if you look at some of the companies where most of the employee base is actually remote, one of the tools that they use to make new team members connected to each other, but also make them feel connected to the teams that they're joining. They're making groups of people solve an online challenge in kind of a video game setting. And based on the surveys that they take after this, it actually shows that you can create this sense of cohesion and sense of belonging with an online experience. So I think that's very encouraging and going forward. That's definitely one of the tools that we need to look at as we navigate towards whatever the new normal looks like.
Well, Carl and Tanya, thank you for a very open and honest conversation. That's all the time we have today. Things are changing weekly, even daily in some cases. So we'll just have to wait and see how things pan out, but there are obvious actions and items that companies and employees alike should be aware of during this unprecedented time. I think a key takeaway is to not get left behind as change happens and to address issues as they arise head on. I also think people are seeking authenticity during this time from their colleagues and their leadership. So again, thank you for that today. And thanks to our audience for tuning in. If you're hungry for more resources from the topics of this episode, be sure to check out the show notes where we've included some insightful links and food for thought. And of course, if you liked this episode, don't forget to subscribe to this podcast wherever you listen to podcasts. And you can also sign up to be notified by email for every episode on tgs.com. Thanks for listening to another episode of Beneath the Subsurface.
Recent Beneath the Subsurface Episodes
The IAGC's Ghost Net Initiative: A Quick Dive
The Rapid Rise of ESG: Environmental, Social, and Governance Impact
Beyond the Well Log: Production, Forecasting & Completion Data
Unlocking Latin America
Subscribe to Beneath the Subsurface
Subscribe to receive a notification when new Beneath the Subsurface episodes are available!


text:
August 14, 2014 News » The Fly-By
Amtrak Looks to Expand Memphis Service
Amtrak considers adding another daily train to Chicago.
Amtrak trains could run between Memphis and Chicago twice daily but not before the city and the state of Tennessee get on board with the plan.
Amtrak officials spoke to the Memphis City Council last week about a plan that could expand rail service into and out of Memphis.
"Our long-term goal would be to get another train coming through Memphis at Central Station," said Memphis Councilmember Myron Lowery. "The markets between Chicago and Memphis and Memphis and New Orleans are very productive markets and are increasing on an annualized basis."
AMTRAK photo/Chuck Gomez
Ridership on the City of New Orleans, the train that runs from Chicago to Memphis to New Orleans and back, rose about 46 percent from 1997 to 2012, according to a study from The Brookings Institution.
Even with the 253,170 passengers riding the route in 2012, the City of New Orleans line lost $22.8 million. That's roughly half of the $41.6 million it cost to run the line that year.
Still, the number of passengers getting on and off Amtrak trains in Memphis is rising. More than 73,000 passengers started or ended their rail trips in Memphis in 2012, according to the Brookings report. Amtrak figures show that number rose to more than 76,000 last year. In 1994, only about 38,000 passengers used Amtrak in Memphis.
The idea to expand service here comes only after an expansion of service in Illinois from Chicago to Champaign and Carbondale. Two more trains are running now on the popular route that links the college towns to Chicago. Those new trains could run farther south to Memphis.
"This is the most likely venue for expanding and adding new service to Memphis," said Charlie Monte Verde, a government affairs official with Amtrak. "So, the future of expanding rail service in Memphis would be having a train in and out of here to Chicago every single day in each direction."
The City of New Orleans currently leaves Memphis daily for Chicago, but it only leaves once a day at 10:40 p.m. The trip takes more than 10 hours. The new schedule could see a morning and evening train going each way.
Before any new service can begin, Amtrak officials told councilmembers they would need to work with state legislators to conduct a feasibility study. That study would show the cost, benefits, and possible ridership numbers for the new service. With approvals in hand, the Tennessee Department of Transportation would work out the details with the Illinois Department of Transportation. Then, they could take the plan to the federal government.
"When the federal government sees an opportunity to work with an aggressive partner or finds a community that really wants to do passenger rail service, that tends to turn on the [financial] faucet," Monte Verde said. "When that faucet is on, it tends to stay on."
Amtrak is now on the other side of a federal government program to improve its finances, management, and operations. The Passenger Rail Investment and Improvement Act gave Amtrak five years (from 2008 to 2013) of oversight from the Office of Inspector General. A report from the probe was published in January to inform future votes in Congress on rail service.
Congress approved nearly $1.4 billion for Amtrak capital and operations in January. Federal legislators also allowed Amtrak to use $81 million from Hurricane Sandy Disaster Supplemental funding to improve service in its Northeast Corridor.
Central Station Plan Makes it "Central" Again
More The Fly-By »
Tags: The Fly-By, amtrak
MEMernet: Rib Rewind, Tweet of the Week, Little Nuke (The Fly-By)
A roundup of Memphis on the World Wide Web.
Jan. 16, 2020, 4:00 AM
'Watching With Them' (The Fly-By)
Volunteers mobilize to monitor ICE raids.
MEMernet: "Frayser Is Wild," "Robbed at Gunpoint," and Waxahatchee (The Fly-By)
Jan. 9, 2020, 4:00 AM
Big Save (The Fly-By)
Memphis Animal Services have made major strides and aren't finished yet.
MEMernet 2019 MVPs: Tittie Rocks, Buns Out, and Memplops (The Fly-By)
Dec. 26, 2019, 4:00 AM
Year That Was: Tom Lee Park, Bluff City Law, and The CA (The Fly-By)
A new park plan, Memphis on the small screen, and turbulence for Gannett.
by Flyer Staff
Music Video Monday: THE PRVLG
Chris McCoy 01/20/2020
Politics Beat Blog
Pence, in Memphis, Pays Homage to MLK and Touts Trump Accomplishments
Jackson Baker 01/20/2020
The Next Generation Grizzlies Appear to Have Arrived
Aimee Stiegemeyer 01/20/2020
Grizzlies Hold Off Cleveland for Seventh Straight Victory
Sharon Brown 01/18/2020
Grizzlies' Mid-Season Check-up
You Have 20 Seconds To Comply With RoboCop at the Time Warp Drive-In
#22 Tigers 60, Cincinnati 49
Frank Murtaugh 01/16/2020
Raiford's is Everywhere, Bishop guest chef dinner, "Charlie and the Chocolate Factory"
Michael Donahue 01/16/2020
Video: Bus Rider Discusses Transit Funding, Challenges, and More
Maya Smith 01/16/2020
Chef Conrad Phillips Is Carving a Niche at Caritas
More by Toby Sells
Carb Wars: Why Are Alternative Diets Becoming So Popular?
LGBTQ Adoption Discrimination Bill Passed by Senate
State lawmakers file bills for guns and castration, but against refugees and transgender children.
Birthing a Center
Choices re-claims feminist health care with new site.


We're one week closer to April 29th, which means we're one week closer to the release of Master The Key: A Story To Free Your Potential, Find Meaning and Live Life On Purpose!
We're celebrating all month by highlighting some of the people who influenced this book, and we have two of the most positive people in the world this week: Greg Amundson and Jon Gordon! Greg is a former DEA special agent, the bestselling author of The Warrior and the Monk, and one of the original crossfitters (he's also my coach here in Santa Cruz). Jon is a prolific author and speaker, the host of Positive University, the author of a number of inspiring books, and I really can't underscore this enough – this man is Mr. Positive!
Jon is also hosting The Power of Positive Summit, a FREE online event, from April 22-28. You can learn more at https://www.powerofpositivesummit.com.
If you want to be one of the first people to receive a copy of the book, subscribe to my newsletter at https://theimpactentrepreneur.net or text the word KEY followed by your first time to 831-607-1818.
We are brought to you by the Lawton Marketing Group, a full-service advertising and design agency serving companies and entrepreneurs at all levels. They are your one-stop shop for all your website, logo, social media, print, app design and reputable management needs.