text:
Announcing…
W. Town Andrews
Available May 6, 2019
Buy it here on Amazon
My first early reviews are in:
Reviewed By: Romuald Dzemo
Review Rating: 5 Stars
Reviewed By Romuald Dzemo for Readers' Favorite
"Memoirs of a Transferable Soul by W. Town Andrews is a captivating, extraordinary story that centers on a man's experience at the twilight point between life and death. Suffering from a terminal disease that specialists in different fields have failed to diagnose, a bedridden man discovers a door through which his soul leaves his body, thanks to the strange effects of experimental medication and contemplation. The soul wanders and temporarily lives where other souls go. He feels better each time the soul returns, with his abilities improved as well. But the symptoms of the illness eventually return and he must find a way to maintain his health, looking for more terminals to feed his energy, and how he does it is what will surprise and keep readers intrigued."
"W. Town Andrews' writing is lyrical and smooth and it grabs the reader from the very first page. I was literally glued to the pages, exploring the realism with which the author describes patients at a terminal stage. The images of the setting like the medical facility are vividly described. There is an economy of word that sets this author apart; the simplicity in the narrative style and beauty in phrase usage are some of the highlights of the prose. Memoirs of a Transferable Soul features themes of illness, solitude, dark despair, and explores mortality, showcasing a man's struggle with the thought of his own death. The novel has strong elements that will entice fans of the paranormal; intriguing and filled with powerful plot points. The author combines strong narration with humor to transform an already beautiful story into a page-turner."
Reviewed By Divine Zape for Readers' Favorite
"Memoirs of a Transferable Soul by W. Town Andrews follows the path of a man with a rare terminal illness that evades diagnosis. But a combination of experimental medication and contemplation has opened the door to a rare experience, and now his soul can travel out of his body and wander about, taking residence where other souls have gone. Whenever it returns, his illness diminishes and his spiritual skills grow stronger. But he also realizes that his strength cannot endure for long until he seeks out and connects with new terminal partners. Now, he is caught in the dilemma of keeping his unique skill secret and locating the right terminal partners at the same time. Follow the journey of this soul as it drifts between life and death. Can he finally conquer his mysterious illness or be consumed by it?
"The premise is powerful, and just the idea of an illness that can't be diagnosed is in itself a mind-blowing worry, for how can one fight a disease they cannot name? The narrator, the mysterious patient, gives readers an insight into his struggle right away: "Though I was still a young man, the events had taken their toll. I didn't know what was wrong with me, but could see its depth in the doctors' eyes, and feel its invasion wedging into my flesh, my bones, my brain, my spirit—my very soul." The writing is characteristic of a lyrical style. The story is psychologically intense, exploring strong emotions and inviting readers to enter into the spiritual world of the protagonist. W. Town Andrews uses humor to embellish the writing and it comes across in the narrative voice and especially in the protagonist's manner of looking at life and events. There is some form of mockery in the voice that makes complex issues look as though they are light. This lightness in voice combines with the intensity of the emotions captured in the narrative to make it an irresistible story. Memoirs of a Transferable Soul is hugely entertaining."
Reviewed By Christian Sia for Readers' Favorite
Memoirs of a Transferable Soul by W. Town Andrews is a novel with powerful metaphysical underpinnings. The main character has a terminal illness that no medical professional has succeeded in diagnosing. But a combination of his current medication and meditation unlocks hidden skills and he begins to experience a transcendental phenomenon with his spirit leaving his body to occasionally dwell where other souls have departed. It's a phenomenon that reinvigorates him, but every time he has to unlock his soul and wander in search of terminal partners to keep his strength up and stop the illness from getting stronger. Every time he returns from his soulful flights, he notices that his transcendent abilities grow stronger.
W. Town Andrews creates an enigmatic character who is at the same time troubled by his condition and yet eccentric in the way he talks about it. This story will appeal to fans of the paranormal and stories with elaborately and well-crafted characters. The story is told from the perspective of the protagonist, a character who navigates a strange world of terminal illness and extraordinary experiences. The reader is pulled in from the very beginning by the strong narrative voice and the exciting prose, and each page presents surprises, opens a new portal into this character's soul. He does things that he wouldn't want anyone to know, has questions that he can't ask anyone but he goes out of his body to seek answers to them. Memoirs of a Transferable Soul is humorously narrated, one of those books that remind readers of things they could do if only they were unseen. It is exciting, utterly engaging, and thought-provoking.
He's an ordinary man, but he tells an extraordinary tale.
Subscribe to updates via email. Final editiion is live on Amazon, Nook, etc. Still writing descriptions, cover blurbs, summaries, blogging insights, etc. Be first to see covers, front matter, reader 1st chapter samples, blog alerts, etc.
Register here and I'll keep you up to date!


The guide, and at the same time the exhibition which accompanies to and whose content it reflects, presents the institution created in the place where in 1939-1945 was in operation one of the largest camp complexes in Europe – Stalags of Lamsdorf. About 300,000 prisoners-of-war of various nationalities passed through it. It is also a place with a complicated history, which has its origins in the 1860s and goes beyond 1945 year.
The publication presents those stages of history of the Site National Remembrance Site in Łambinowice and also what makes the place today. There are also described various aspects of the museum's work in the scope of collecting, protecting and access to unique collections of the institution as well carried out scientific research and broadly understood issues of two prisoner-of-war systems – the German and Soviet ones, in particular the fate of Polish prisoners-of-war in these systems.


text:
Chris Murchison
Chris Marcell Murchison is a passionate advocate for positive workplace culture. In his broad career spanning the higher education, for-profit, not-for-profit, and foundation sectors, he has focused his energy on developing creative means to build community at work and practices that support an employee experience of deep respect, connection, joy, and generative learning.
As the vice president for staff development and culture at HopeLab, Chris guided the organization's efforts to create an organizational culture that values learning and innovation. Over the course of 11 years at HopeLab, he led a strategic staff expansion to support a portfolio of work focused on the support of resilience in everyday life and the development of principles and practices that embedded HopeLab's values into the everyday experience of the organization.
In 2014, Chris was named the first visiting leader at the Center for Positive Organizations in the University of Michigan's Ross School of Business, where he advises, connects and convenes faculty and students to explore practical applications of Positive Organizational Scholarship. In January of 2018, Chris was additionally appointed to the Advisory Board of the International Positive Psychology Association's Work & Organizations Division. He concurrently serves on the Board of Directors of the Joe Goode Performance Group, a San Francisco-based dance-theater company that uses embodied movement and performance to promote understanding, compassion, and resilience.
Chris currently works as an independent creative thought-partner, experience designer, and advisor to organizations ready to reimagine the possibilities of their cultures.
How to Be a Remarkable Boss During Lockdown
By Chris Murchison | May 13, 2020
Managers need to adapt to coronavirus conditions. Here are some ideas for how to do that.
When to Express Your Gratitude at Work
By Chris Murchison | May 8, 2019
Chris Murchison—an independent organizational culture consultant, coach, and advisor—shares how gratitude can be incorporated into different aspects of work life.
Cultivating Gratitude in the Workplace
By Chris Murchison | October 6, 2014
In this presentation at the Greater Good Gratitude Summit, Chris Murchison describes his efforts to create an organizational culture at HopeLab that values learning, innovation, and the well-being of its employees.

redpajama_set_name: RedPajamaCommonCrawl


text:
import { lastValueFrom, Observable, of } from 'rxjs';
import { createFetchResponse } from 'test/helpers/createFetchResponse';

import {
  ArrayVector,
  DataFrame,
  dataFrameToJSON,
  DataSourceInstanceSettings,
  FieldType,
  getDefaultTimeRange,
  LoadingState,
  MutableDataFrame,
  PluginType,
} from '@grafana/data';
import { BackendDataSourceResponse, FetchResponse, setBackendSrv, setDataSourceSrv } from '@grafana/runtime';
import config from 'app/core/config';

import {
  DEFAULT_LIMIT,
  TempoJsonData,
  TempoDatasource,
  TempoQuery,
  buildExpr,
  buildLinkExpr,
  getRateAlignedValues,
  makeApmRequest,
  makeTempoLink,
  getFieldConfig,
} from './datasource';
import mockJson from './mockJsonResponse.json';
import mockServiceGraph from './mockServiceGraph.json';

jest.mock('@grafana/runtime', () => {
  return {
    ...jest.requireActual('@grafana/runtime'),
    reportInteraction: jest.fn(),
  };
});

describe('Tempo data source', () => {
  // Mock the console error so that running the test suite doesnt throw the error
  const origError = console.error;
  const consoleErrorMock = jest.fn();
  afterEach(() => (console.error = origError));
  beforeEach(() => (console.error = consoleErrorMock));

  it('returns empty response when traceId is empty', async () => {
    const ds = new TempoDatasource(defaultSettings);
    const response = await lastValueFrom(
      ds.query({ targets: [{ refId: 'refid1', queryType: 'traceId', query: '' } as Partial<TempoQuery>] } as any),
      { defaultValue: 'empty' }
    );
    expect(response).toBe('empty');
  });

  describe('Variables should be interpolated correctly', () => {
    function getQuery(): TempoQuery {
      return {
        refId: 'x',
        queryType: 'traceId',
        linkedQuery: {
          refId: 'linked',
          expr: '{instance="$interpolationVar"}',
        },
        query: '$interpolationVar',
        search: '$interpolationVar',
        minDuration: '$interpolationVar',
        maxDuration: '$interpolationVar',
      };
    }

    it('when traceId query for dashboard->explore', async () => {
      const templateSrv: any = { replace: jest.fn() };
      const ds = new TempoDatasource(defaultSettings, templateSrv);
      const text = 'interpolationText';
      templateSrv.replace.mockReturnValue(text);

      const queries = ds.interpolateVariablesInQueries([getQuery()], {
        interpolationVar: { text: text, value: text },
      });
      expect(templateSrv.replace).toBeCalledTimes(7);
      expect(queries[0].linkedQuery?.expr).toBe(text);
      expect(queries[0].query).toBe(text);
      expect(queries[0].serviceName).toBe(text);
      expect(queries[0].spanName).toBe(text);
      expect(queries[0].search).toBe(text);
      expect(queries[0].minDuration).toBe(text);
      expect(queries[0].maxDuration).toBe(text);
    });

    it('when traceId query for template variable', async () => {
      const templateSrv: any = { replace: jest.fn() };
      const ds = new TempoDatasource(defaultSettings, templateSrv);
      const text = 'interpolationText';
      templateSrv.replace.mockReturnValue(text);

      const resp = ds.applyTemplateVariables(getQuery(), {
        interpolationVar: { text: text, value: text },
      });
      expect(templateSrv.replace).toBeCalledTimes(7);
      expect(resp.linkedQuery?.expr).toBe(text);
      expect(resp.query).toBe(text);
      expect(resp.serviceName).toBe(text);
      expect(resp.spanName).toBe(text);
      expect(resp.search).toBe(text);
      expect(resp.minDuration).toBe(text);
      expect(resp.maxDuration).toBe(text);
    });
  });

  it('parses json fields from backend', async () => {
    setupBackendSrv(
      new MutableDataFrame({
        fields: [
          { name: 'traceID', values: ['04450900759028499335'] },
          { name: 'spanID', values: ['4322526419282105830'] },
          { name: 'parentSpanID', values: [''] },
          { name: 'operationName', values: ['store.validateQueryTimeRange'] },
          { name: 'startTime', values: [1619712655875.4539] },
          { name: 'duration', values: [14.984] },
          { name: 'serviceTags', values: [{ key: 'servicetag1', value: 'service' }] },
          { name: 'logs', values: [{ timestamp: 12345, fields: [{ key: 'count', value: 1 }] }] },
          { name: 'tags', values: [{ key: 'tag1', value: 'val1' }] },
          { name: 'serviceName', values: ['service'] },
        ],
      })
    );
    const templateSrv: any = { replace: jest.fn() };
    const ds = new TempoDatasource(defaultSettings, templateSrv);
    const response = await lastValueFrom(ds.query({ targets: [{ refId: 'refid1', query: '12345' }] } as any));

    expect(
      (response.data[0] as DataFrame).fields.map((f) => ({
        name: f.name,
        values: f.values.toArray(),
      }))
    ).toMatchObject([
      { name: 'traceID', values: ['04450900759028499335'] },
      { name: 'spanID', values: ['4322526419282105830'] },
      { name: 'parentSpanID', values: [''] },
      { name: 'operationName', values: ['store.validateQueryTimeRange'] },
      { name: 'startTime', values: [1619712655875.4539] },
      { name: 'duration', values: [14.984] },
      { name: 'serviceTags', values: [{ key: 'servicetag1', value: 'service' }] },
      { name: 'logs', values: [{ timestamp: 12345, fields: [{ key: 'count', value: 1 }] }] },
      { name: 'tags', values: [{ key: 'tag1', value: 'val1' }] },
      { name: 'serviceName', values: ['service'] },
    ]);

    expect(
      (response.data[1] as DataFrame).fields.map((f) => ({
        name: f.name,
        values: f.values.toArray(),
      }))
    ).toMatchObject([
      { name: 'id', values: ['4322526419282105830'] },
      { name: 'title', values: ['service'] },
      { name: 'subtitle', values: ['store.validateQueryTimeRange'] },
      { name: 'mainstat', values: ['14.98ms (100%)'] },
      { name: 'secondarystat', values: ['14.98ms (100%)'] },
      { name: 'color', values: [1.000007560204647] },
    ]);

    expect(
      (response.data[2] as DataFrame).fields.map((f) => ({
        name: f.name,
        values: f.values.toArray(),
      }))
    ).toMatchObject([
      { name: 'id', values: [] },
      { name: 'target', values: [] },
      { name: 'source', values: [] },
    ]);
  });

  it('should handle json file upload', async () => {
    const ds = new TempoDatasource(defaultSettings);
    ds.uploadedJson = JSON.stringify(mockJson);
    const response = await lastValueFrom(
      ds.query({
        targets: [{ queryType: 'upload', refId: 'A' }],
      } as any)
    );
    const field = response.data[0].fields[0];
    expect(field.name).toBe('traceID');
    expect(field.type).toBe(FieldType.string);
    expect(field.values.get(0)).toBe('60ba2abb44f13eae');
    expect(field.values.length).toBe(6);
  });

  it('should fail on invalid json file upload', async () => {
    const ds = new TempoDatasource(defaultSettings);
    ds.uploadedJson = JSON.stringify(mockInvalidJson);
    const response = await lastValueFrom(
      ds.query({
        targets: [{ queryType: 'upload', refId: 'A' }],
      } as any)
    );
    expect(response.error?.message).toBeDefined();
    expect(response.data.length).toBe(0);
  });

  it('should handle service graph upload', async () => {
    const ds = new TempoDatasource(defaultSettings);
    ds.uploadedJson = JSON.stringify(mockServiceGraph);
    const response = await lastValueFrom(
      ds.query({
        targets: [{ queryType: 'upload', refId: 'A' }],
      } as any)
    );
    expect(response.data).toHaveLength(2);
    const nodesFrame = response.data[0];
    expect(nodesFrame.name).toBe('Nodes');
    expect(nodesFrame.meta.preferredVisualisationType).toBe('nodeGraph');

    const edgesFrame = response.data[1];
    expect(edgesFrame.name).toBe('Edges');
    expect(edgesFrame.meta.preferredVisualisationType).toBe('nodeGraph');
  });

  it('should build search query correctly', () => {
    const templateSrv: any = { replace: jest.fn() };
    const ds = new TempoDatasource(defaultSettings, templateSrv);
    const duration = '10ms';
    templateSrv.replace.mockReturnValue(duration);
    const tempoQuery: TempoQuery = {
      queryType: 'search',
      refId: 'A',
      query: '',
      serviceName: 'frontend',
      spanName: '/config',
      search: 'root.http.status_code=500',
      minDuration: '$interpolationVar',
      maxDuration: '$interpolationVar',
      limit: 10,
    };
    const builtQuery = ds.buildSearchQuery(tempoQuery);
    expect(builtQuery).toStrictEqual({
      tags: 'root.http.status_code=500 service.name="frontend" name="/config"',
      minDuration: duration,
      maxDuration: duration,
      limit: 10,
    });
  });

  it('should include a default limit', () => {
    const ds = new TempoDatasource(defaultSettings);
    const tempoQuery: TempoQuery = {
      queryType: 'search',
      refId: 'A',
      query: '',
      search: '',
    };
    const builtQuery = ds.buildSearchQuery(tempoQuery);
    expect(builtQuery).toStrictEqual({
      tags: '',
      limit: DEFAULT_LIMIT,
    });
  });

  it('should include time range if provided', () => {
    const ds = new TempoDatasource(defaultSettings);
    const tempoQuery: TempoQuery = {
      queryType: 'search',
      refId: 'A',
      query: '',
      search: '',
    };
    const timeRange = { startTime: 0, endTime: 1000 };
    const builtQuery = ds.buildSearchQuery(tempoQuery, timeRange);
    expect(builtQuery).toStrictEqual({
      tags: '',
      limit: DEFAULT_LIMIT,
      start: timeRange.startTime,
      end: timeRange.endTime,
    });
  });

  it('formats native search query history correctly', () => {
    const ds = new TempoDatasource(defaultSettings);
    const tempoQuery: TempoQuery = {
      queryType: 'nativeSearch',
      refId: 'A',
      query: '',
      serviceName: 'frontend',
      spanName: '/config',
      search: 'root.http.status_code=500',
      minDuration: '1ms',
      maxDuration: '100s',
      limit: 10,
    };
    const result = ds.getQueryDisplayText(tempoQuery);
    expect(result).toBe(
      'Service Name: frontend, Span Name: /config, Search: root.http.status_code=500, Min Duration: 1ms, Max Duration: 100s, Limit: 10'
    );
  });

  it('should get loki search datasource', () => {
    // 1. Get lokiSearch.datasource if present
    const ds1 = new TempoDatasource({
      ...defaultSettings,
      jsonData: {
        lokiSearch: {
          datasourceUid: 'loki-1',
        },
      },
    });
    const lokiDS1 = ds1.getLokiSearchDS();
    expect(lokiDS1).toBe('loki-1');

    // 2. Get traceToLogs.datasource
    const ds2 = new TempoDatasource({
      ...defaultSettings,
      jsonData: {
        tracesToLogs: {
          lokiSearch: true,
          datasourceUid: 'loki-2',
        },
      },
    });
    const lokiDS2 = ds2.getLokiSearchDS();
    expect(lokiDS2).toBe('loki-2');

    // 3. Return undefined if neither is available
    const ds3 = new TempoDatasource(defaultSettings);
    const lokiDS3 = ds3.getLokiSearchDS();
    expect(lokiDS3).toBe(undefined);

    // 4. Return undefined if lokiSearch is undefined, even if traceToLogs is present
    // since this indicates the user cleared the fallback setting
    const ds4 = new TempoDatasource({
      ...defaultSettings,
      jsonData: {
        tracesToLogs: {
          lokiSearch: true,
          datasourceUid: 'loki-2',
        },
        lokiSearch: {
          datasourceUid: undefined,
        },
      },
    });
    const lokiDS4 = ds4.getLokiSearchDS();
    expect(lokiDS4).toBe(undefined);
  });
});

describe('Tempo apm table', () => {
  it('runs service graph queries', async () => {
    const ds = new TempoDatasource({
      ...defaultSettings,
      jsonData: {
        serviceMap: {
          datasourceUid: 'prom',
        },
      },
    });
    config.featureToggles.tempoApmTable = true;
    setDataSourceSrv(backendSrvWithPrometheus as any);
    const response = await lastValueFrom(
      ds.query({ targets: [{ queryType: 'serviceMap' }], range: getDefaultTimeRange() } as any)
    );

    expect(response.data).toHaveLength(3);
    expect(response.state).toBe(LoadingState.Done);

    // APM table
    expect(response.data[0].fields[0].name).toBe('Name');
    expect(response.data[0].fields[0].values.toArray().length).toBe(2);
    expect(response.data[0].fields[0].values.toArray()[0]).toBe('HTTP Client');
    expect(response.data[0].fields[0].values.toArray()[1]).toBe('HTTP GET - root');

    expect(response.data[0].fields[1].name).toBe('Rate');
    expect(response.data[0].fields[1].values.toArray().length).toBe(2);
    expect(response.data[0].fields[1].values.toArray()[0]).toBe(12.75164671814457);
    expect(response.data[0].fields[1].values.toArray()[1]).toBe(12.121331111401608);
    expect(response.data[0].fields[1].config.decimals).toBe(2);
    expect(response.data[0].fields[1].config.links[0].title).toBe('Rate');
    expect(response.data[0].fields[1].config.links[0].internal.query.expr).toBe(
      'sum(rate(traces_spanmetrics_calls_total{span_name="${__data.fields[0]}"}[$__rate_interval]))'
    );
    expect(response.data[0].fields[1].config.links[0].internal.query.range).toBe(true);
    expect(response.data[0].fields[1].config.links[0].internal.query.exemplar).toBe(true);
    expect(response.data[0].fields[1].config.links[0].internal.query.instant).toBe(false);

    expect(response.data[0].fields[2].values.toArray().length).toBe(2);
    expect(response.data[0].fields[2].values.toArray()[0]).toBe(12.75164671814457);
    expect(response.data[0].fields[2].values.toArray()[1]).toBe(12.121331111401608);
    expect(response.data[0].fields[2].config.color.mode).toBe('continuous-BlPu');
    expect(response.data[0].fields[2].config.custom.displayMode).toBe('lcd-gauge');
    expect(response.data[0].fields[2].config.decimals).toBe(3);

    expect(response.data[0].fields[3].name).toBe('Error Rate');
    expect(response.data[0].fields[3].values.length).toBe(2);
    expect(response.data[0].fields[3].values[0]).toBe(3.75164671814457);
    expect(response.data[0].fields[3].values[1]).toBe(3.121331111401608);
    expect(response.data[0].fields[3].config.decimals).toBe(2);
    expect(response.data[0].fields[3].config.links[0].title).toBe('Error Rate');
    expect(response.data[0].fields[3].config.links[0].internal.query.expr).toBe(
      'sum(rate(traces_spanmetrics_calls_total{status_code="STATUS_CODE_ERROR",span_name="${__data.fields[0]}"}[$__rate_interval]))'
    );
    expect(response.data[0].fields[3].config.links[0].internal.query.range).toBe(true);
    expect(response.data[0].fields[3].config.links[0].internal.query.exemplar).toBe(true);
    expect(response.data[0].fields[3].config.links[0].internal.query.instant).toBe(false);

    expect(response.data[0].fields[4].values.length).toBe(2);
    expect(response.data[0].fields[4].values[0]).toBe(3.75164671814457);
    expect(response.data[0].fields[4].values[1]).toBe(3.121331111401608);
    expect(response.data[0].fields[4].config.color.mode).toBe('continuous-RdYlGr');
    expect(response.data[0].fields[4].config.custom.displayMode).toBe('lcd-gauge');
    expect(response.data[0].fields[4].config.decimals).toBe(3);

    expect(response.data[0].fields[5].name).toBe('Duration (p90)');
    expect(response.data[0].fields[5].values.length).toBe(2);
    expect(response.data[0].fields[5].values[0]).toBe('0');
    expect(response.data[0].fields[5].values[1]).toBe(0.12003505696757232);
    expect(response.data[0].fields[5].config.unit).toBe('s');
    expect(response.data[0].fields[5].config.links[0].title).toBe('Duration');
    expect(response.data[0].fields[5].config.links[0].internal.query.expr).toBe(
      'histogram_quantile(.9, sum(rate(traces_spanmetrics_latency_bucket{span_name="${__data.fields[0]}"}[$__rate_interval])) by (le))'
    );
    expect(response.data[0].fields[5].config.links[0].internal.query.range).toBe(true);
    expect(response.data[0].fields[5].config.links[0].internal.query.exemplar).toBe(true);
    expect(response.data[0].fields[5].config.links[0].internal.query.instant).toBe(false);

    expect(response.data[0].fields[6].config.links[0].url).toBe('');
    expect(response.data[0].fields[6].config.links[0].title).toBe('Tempo');
    expect(response.data[0].fields[6].config.links[0].internal.query.queryType).toBe('nativeSearch');
    expect(response.data[0].fields[6].config.links[0].internal.query.spanName).toBe('${__data.fields[0]}');

    // Service graph
    expect(response.data[1].name).toBe('Nodes');
    expect(response.data[1].fields[0].values.length).toBe(3);
    expect(response.data[1].fields[0].config.links.length).toBeGreaterThan(0);
    expect(response.data[1].fields[0].config.links).toEqual(serviceGraphLinks);

    expect(response.data[2].name).toBe('Edges');
    expect(response.data[2].fields[0].values.length).toBe(2);
  });

  it('should build expr correctly', () => {
    let targets = { targets: [{ queryType: 'serviceMap' }] } as any;
    let builtQuery = buildExpr(
      { expr: 'topk(5, sum(rate(traces_spanmetrics_calls_total{}[$__range])) by (span_name))', params: [] },
      '',
      targets
    );
    expect(builtQuery).toBe('topk(5, sum(rate(traces_spanmetrics_calls_total{}[$__range])) by (span_name))');

    builtQuery = buildExpr(
      {
        expr: 'topk(5, sum(rate(traces_spanmetrics_calls_total{}[$__range])) by (span_name))',
        params: ['status_code="STATUS_CODE_ERROR"'],
      },
      'span_name=~"HTTP Client|HTTP GET|HTTP GET - root|HTTP POST|HTTP POST - post"',
      targets
    );
    expect(builtQuery).toBe(
      'topk(5, sum(rate(traces_spanmetrics_calls_total{status_code="STATUS_CODE_ERROR",span_name=~"HTTP Client|HTTP GET|HTTP GET - root|HTTP POST|HTTP POST - post"}[$__range])) by (span_name))'
    );

    builtQuery = buildExpr(
      {
        expr: 'histogram_quantile(.9, sum(rate(traces_spanmetrics_latency_bucket{}[$__range])) by (le))',
        params: ['status_code="STATUS_CODE_ERROR"'],
      },
      'span_name=~"HTTP Client"',
      targets
    );
    expect(builtQuery).toBe(
      'histogram_quantile(.9, sum(rate(traces_spanmetrics_latency_bucket{status_code="STATUS_CODE_ERROR",span_name=~"HTTP Client"}[$__range])) by (le))'
    );

    targets = { targets: [{ queryType: 'serviceMap', serviceMapQuery: '{client="app",service="app"}' }] } as any;
    builtQuery = buildExpr(
      { expr: 'topk(5, sum(rate(traces_spanmetrics_calls_total{}[$__range])) by (span_name))', params: [] },
      '',
      targets
    );
    expect(builtQuery).toBe(
      'topk(5, sum(rate(traces_spanmetrics_calls_total{service="app",service="app"}[$__range])) by (span_name))'
    );
  });

  it('should build link expr correctly', () => {
    let builtQuery = buildLinkExpr('topk(5, sum(rate(traces_spanmetrics_calls_total{}[$__range])) by (span_name))');
    expect(builtQuery).toBe('sum(rate(traces_spanmetrics_calls_total{}[$__rate_interval]))');
  });

  it('should get field config correctly', () => {
    let datasourceUid = 's4Jvz8Qnk';
    let tempoDatasourceUid = 'EbPO1fYnz';
    let targetField = '__data.fields.target';
    let tempoField = '__data.fields.target';
    let sourceField = '__data.fields.source';

    let fieldConfig = getFieldConfig(datasourceUid, tempoDatasourceUid, targetField, tempoField, sourceField);

    let resultObj = {
      links: [
        {
          url: '',
          title: 'Request rate',
          internal: {
            query: {
              expr: 'sum by (client, server)(rate(traces_service_graph_request_total{client="${__data.fields.source}",server="${__data.fields.target}"}[$__rate_interval]))',
              range: true,
              exemplar: true,
              instant: false,
            },
            datasourceUid: 's4Jvz8Qnk',
            datasourceName: '',
          },
        },
        {
          url: '',
          title: 'Request histogram',
          internal: {
            query: {
              expr: 'histogram_quantile(0.9, sum(rate(traces_service_graph_request_server_seconds_bucket{client="${__data.fields.source}",server="${__data.fields.target}"}[$__rate_interval])) by (le, client, server))',
              range: true,
              exemplar: true,
              instant: false,
            },
            datasourceUid: 's4Jvz8Qnk',
            datasourceName: '',
          },
        },
        {
          url: '',
          title: 'Failed request rate',
          internal: {
            query: {
              expr: 'sum by (client, server)(rate(traces_service_graph_request_failed_total{client="${__data.fields.source}",server="${__data.fields.target}"}[$__rate_interval]))',
              range: true,
              exemplar: true,
              instant: false,
            },
            datasourceUid: 's4Jvz8Qnk',
            datasourceName: '',
          },
        },
        {
          url: '',
          title: 'View traces',
          internal: {
            query: {
              queryType: 'nativeSearch',
              serviceName: '${__data.fields.target}',
            },
            datasourceUid: 'EbPO1fYnz',
            datasourceName: '',
          },
        },
      ],
    };
    expect(fieldConfig).toStrictEqual(resultObj);
  });

  it('should get rate aligned values correctly', () => {
    const resp = [
      {
        refId:
          'topk(5, sum(rate(traces_spanmetrics_calls_total{service="app",service="app"}[$__range])) by (span_name))',
        fields: [
          {
            name: 'Time',
            type: 'time',
            config: {},
            values: [1653828275000, 1653828275000, 1653828275000, 1653828275000, 1653828275000],
          },
          {
            name: 'span_name',
            config: {
              filterable: true,
            },
            type: 'string',
            values: new ArrayVector(['HTTP Client', 'HTTP GET', 'HTTP GET - root', 'HTTP POST', 'HTTP POST - post']),
          },
        ],
      },
    ];
    const objToAlign = {
      'HTTP GET - root': {
        value: 0.1234,
      },
      'HTTP GET': {
        value: 0.6789,
      },
      'HTTP POST - post': {
        value: 0.4321,
      },
    };

    let value = getRateAlignedValues(resp, objToAlign as any);
    expect(value.toString()).toBe('0,0.6789,0.1234,0,0.4321');
  });

  it('should make apm request correctly', () => {
    const apmRequest = makeApmRequest([
      'topk(5, sum(rate(traces_spanmetrics_calls_total{service="app"}[$__range])) by (span_name))"',
      'histogram_quantile(.9, sum(rate(traces_spanmetrics_latency_bucket{status_code="STATUS_CODE_ERROR",service="app",service="app",span_name=~"HTTP Client"}[$__range])) by (le))',
    ]);
    expect(apmRequest).toEqual([
      {
        refId: 'topk(5, sum(rate(traces_spanmetrics_calls_total{service="app"}[$__range])) by (span_name))"',
        expr: 'topk(5, sum(rate(traces_spanmetrics_calls_total{service="app"}[$__range])) by (span_name))"',
        instant: true,
      },
      {
        refId:
          'histogram_quantile(.9, sum(rate(traces_spanmetrics_latency_bucket{status_code="STATUS_CODE_ERROR",service="app",service="app",span_name=~"HTTP Client"}[$__range])) by (le))',
        expr: 'histogram_quantile(.9, sum(rate(traces_spanmetrics_latency_bucket{status_code="STATUS_CODE_ERROR",service="app",service="app",span_name=~"HTTP Client"}[$__range])) by (le))',
        instant: true,
      },
    ]);
  });

  it('should make tempo link correctly', () => {
    const tempoLink = makeTempoLink('Tempo', '', '"${__data.fields[0]}"', 'gdev-tempo');
    expect(tempoLink).toEqual({
      url: '',
      title: 'Tempo',
      internal: {
        query: {
          queryType: 'nativeSearch',
          spanName: '"${__data.fields[0]}"',
        },
        datasourceUid: 'gdev-tempo',
        datasourceName: 'Tempo',
      },
    });
  });
});

const backendSrvWithPrometheus = {
  async get(uid: string) {
    if (uid === 'prom') {
      return {
        query() {
          return of({
            data: [rateMetric, errorRateMetric, durationMetric, totalsPromMetric, secondsPromMetric, failedPromMetric],
          });
        },
      };
    }
    throw new Error('unexpected uid');
  },
  getDataSourceSettingsByUid(uid: string) {
    if (uid === 'prom') {
      return { name: 'Prometheus' };
    } else if (uid === 'gdev-tempo') {
      return { name: 'Tempo' };
    }
    return '';
  },
};

function setupBackendSrv(frame: DataFrame) {
  setBackendSrv({
    fetch(): Observable<FetchResponse<BackendDataSourceResponse>> {
      return of(
        createFetchResponse({
          results: {
            refid1: {
              frames: [dataFrameToJSON(frame)],
            },
          },
        })
      );
    },
  } as any);
}

const defaultSettings: DataSourceInstanceSettings<TempoJsonData> = {
  id: 0,
  uid: 'gdev-tempo',
  type: 'tracing',
  name: 'tempo',
  access: 'proxy',
  meta: {
    id: 'tempo',
    name: 'tempo',
    type: PluginType.datasource,
    info: {} as any,
    module: '',
    baseUrl: '',
  },
  jsonData: {
    nodeGraph: {
      enabled: true,
    },
  },
};

const rateMetric = new MutableDataFrame({
  refId: 'topk(5, sum(rate(traces_spanmetrics_calls_total{span_kind="SPAN_KIND_SERVER"}[$__range])) by (span_name))',
  fields: [
    { name: 'Time', values: [1653725618609, 1653725618609] },
    { name: 'span_name', values: ['HTTP Client', 'HTTP GET - root'] },
    {
      name: 'Value #topk(5, sum(rate(traces_spanmetrics_calls_total{span_kind="SPAN_KIND_SERVER"}[$__range])) by (span_name))',
      values: [12.75164671814457, 12.121331111401608],
    },
  ],
});

const errorRateMetric = new MutableDataFrame({
  refId:
    'topk(5, sum(rate(traces_spanmetrics_calls_total{status_code="STATUS_CODE_ERROR",span_name=~"HTTP Client|HTTP GET - root"}[$__range])) by (span_name))',
  fields: [
    { name: 'Time', values: [1653725618609, 1653725618609] },
    { name: 'span_name', values: ['HTTP Client', 'HTTP GET - root'] },
    {
      name: 'Value #topk(5, sum(rate(traces_spanmetrics_calls_total{status_code="STATUS_CODE_ERROR"}[$__range])) by (span_name))',
      values: [3.75164671814457, 3.121331111401608],
    },
  ],
});

const durationMetric = new MutableDataFrame({
  refId:
    'histogram_quantile(.9, sum(rate(traces_spanmetrics_latency_bucket{span_name=~"HTTP GET - root"}[$__range])) by (le))',
  fields: [
    { name: 'Time', values: [1653725618609] },
    {
      name: 'Value #histogram_quantile(.9, sum(rate(traces_spanmetrics_latency_bucket{span_name=~"HTTP GET - root"}[$__range])) by (le))',
      values: [0.12003505696757232],
    },
  ],
});

const totalsPromMetric = new MutableDataFrame({
  refId: 'traces_service_graph_request_total',
  fields: [
    { name: 'Time', values: [1628169788000, 1628169788000] },
    { name: 'client', values: ['app', 'lb'] },
    { name: 'instance', values: ['127.0.0.1:12345', '127.0.0.1:12345'] },
    { name: 'job', values: ['local_scrape', 'local_scrape'] },
    { name: 'server', values: ['db', 'app'] },
    { name: 'tempo_config', values: ['default', 'default'] },
    { name: 'Value #traces_service_graph_request_total', values: [10, 20] },
  ],
});

const secondsPromMetric = new MutableDataFrame({
  refId: 'traces_service_graph_request_server_seconds_sum',
  fields: [
    { name: 'Time', values: [1628169788000, 1628169788000] },
    { name: 'client', values: ['app', 'lb'] },
    { name: 'instance', values: ['127.0.0.1:12345', '127.0.0.1:12345'] },
    { name: 'job', values: ['local_scrape', 'local_scrape'] },
    { name: 'server', values: ['db', 'app'] },
    { name: 'tempo_config', values: ['default', 'default'] },
    { name: 'Value #traces_service_graph_request_server_seconds_sum', values: [10, 40] },
  ],
});

const failedPromMetric = new MutableDataFrame({
  refId: 'traces_service_graph_request_failed_total',
  fields: [
    { name: 'Time', values: [1628169788000, 1628169788000] },
    { name: 'client', values: ['app', 'lb'] },
    { name: 'instance', values: ['127.0.0.1:12345', '127.0.0.1:12345'] },
    { name: 'job', values: ['local_scrape', 'local_scrape'] },
    { name: 'server', values: ['db', 'app'] },
    { name: 'tempo_config', values: ['default', 'default'] },
    { name: 'Value #traces_service_graph_request_failed_total', values: [2, 15] },
  ],
});

const mockInvalidJson = {
  batches: [
    {
      resource: {
        attributes: [],
      },
      instrumentation_library_spans: [
        {
          instrumentation_library: {},
          spans: [
            {
              trace_id: 'AAAAAAAAAABguiq7RPE+rg==',
              span_id: 'cmteMBAvwNA=',
              parentSpanId: 'OY8PIaPbma4=',
              name: 'HTTP GET - root',
              kind: 'SPAN_KIND_SERVER',
              startTimeUnixNano: '1627471657255809000',
              endTimeUnixNano: '1627471657256268000',
              attributes: [
                { key: 'http.status_code', value: { intValue: '200' } },
                { key: 'http.method', value: { stringValue: 'GET' } },
                { key: 'http.url', value: { stringValue: '/' } },
                { key: 'component', value: { stringValue: 'net/http' } },
              ],
              status: {},
            },
          ],
        },
      ],
    },
  ],
};

const serviceGraphLinks = [
  {
    url: '',
    title: 'Request rate',
    internal: {
      query: {
        expr: 'sum by (client, server)(rate(traces_service_graph_request_total{server="${__data.fields.id}"}[$__rate_interval]))',
        instant: false,
        range: true,
        exemplar: true,
      },
      datasourceUid: 'prom',
      datasourceName: 'Prometheus',
    },
  },
  {
    url: '',
    title: 'Request histogram',
    internal: {
      query: {
        expr: 'histogram_quantile(0.9, sum(rate(traces_service_graph_request_server_seconds_bucket{server="${__data.fields.id}"}[$__rate_interval])) by (le, client, server))',
        instant: false,
        range: true,
        exemplar: true,
      },
      datasourceUid: 'prom',
      datasourceName: 'Prometheus',
    },
  },
  {
    url: '',
    title: 'Failed request rate',
    internal: {
      query: {
        expr: 'sum by (client, server)(rate(traces_service_graph_request_failed_total{server="${__data.fields.id}"}[$__rate_interval]))',
        instant: false,
        range: true,
        exemplar: true,
      },
      datasourceUid: 'prom',
      datasourceName: 'Prometheus',
    },
  },
  {
    url: '',
    title: 'View traces',
    internal: {
      query: {
        queryType: 'nativeSearch',
        serviceName: '${__data.fields[0]}',
      } as TempoQuery,
      datasourceUid: 'gdev-tempo',
      datasourceName: 'Tempo',
    },
  },
];

redpajama_set_name: RedPajamaGithub


text:
#096: Jennifer Hicks – What Happens When Companies Do Not Have a Customer-centric Focus
My next guest originally began her career looking after the crown jewels at the Tower of London. After a career shift, she moved into sales, discovered a passion for coaching. She has been working for a number of SaaS technologies, coaching and scaling the SDR teams to success. Welcome to Scale Your Sales Podcast Jennifer Hicks
Really good to be here, as I know you've been chasing me down for a while, I have been you have no idea, people I've been wanting, it's actually been about 18 months, isn't it? Remember I know it's shocking this is how impressed, there's not a lot of people I harass for a whole 18. In fact, it's more than 18 months because it's almost 18 months in lockdown, it's about two years, there are not many people, you're all already in for a treat. Let me talk to you about your view on the way B2B Sale, if it's shifted to be customer-centric enough? It's a really interesting question, funnily enough, it's something that we obviously chatted a little bit about goodness a couple of months ago, I thought wow what a really interesting question to pose. From my perspective, I think it's a really interesting thing because I think there's a lot, we can learn from B2C. There's a very customer-centric focus, it's very much about being driven by what the customer wants, how they perceive your product, what direction they want it to move in.
For the B2B market, I think there is this tendency that you can get very het up in say the marketing aspect of the sales aspect, it's quite interesting to see a lot of new companies going back to their roots and really thinking about what is it I'm delivering to my customer, how am I delivering it, what channels do I have available for them to give me feedback, just to continue building on what impressed them in the first place. We were just talking off-camera about the event that's going on for your company at the moment as well. Talk to us about how your organization is remaining close to the customer, how are you doing it? Oh goodness, for those of you that haven't pre-googled me before the podcast, I work for a company called Gearset. We're leading in the space of DevOps solutions for salesforce users, at the moment, I'm very naughty because I've just snuck out of our second ever DevOps summit which is going exceedingly at the moment. One of the things that I'm always really impressed with Gearset, is how we keep an ear to the ground for our customer feedback. At the moment while that event's
running, there is a very active chat going on but pretty much. I'd say about 90% of our company are on that chat, listening to the feedback, responding to customers, and answering questions. We try make ourselves as transparent as possible to have that ear of the customer, we have everybody on our in-app chat, you might get responded to by some from customer care, it's an interesting enough question that's going to get pinged up to our CEO and co-founder, those were the guys that built the product, they want to hear what our customers have got to say. I would imagine there's a lot of potential co-creation and innovation that comes out of creating a space where people can ask questions, facilitating the innovation of ideas, if you're holding that space this could be your next product innovation. That's right, I think it's just really interesting to see how an end-user does something, when I joined the company, I was very honest about my levels of technical skills with salesforce, I'm definitely not a newbie by any stretch of the imagination, but I wouldn't want to hold my own with maybe a developer that's been doing that for 20 years. I had a really interesting experience where I was using our tool that we sell; everyone goes through a training program to make sure that they're really up to skill and really knowledgeable about our product. I had one of the engineers jump on me using it because he said that would be really
interesting for me to see somebody who might be new to the tool, what might they be experiencing, what things might they click on that doesn't make sense to them. There's always that sense of what can we keep doing to keep being innovative, to really try and think very broadly about who our end-user base is going to be That reminds me I worked for a customer experience consultancy, that's where my focus on customers in sales really came from because I realized that they are the best innovators and creators. I remember setting up a customer experience journey for AOL, we had their engineers marketers, it was really across the functions sit with customers, the customers had a journey, they were not allowed to say anything. All of the engineers came back said we didn't design it that way but the customers found the loopholes, the quickest and best way to do it, we hadn't thought about that, it can put completely blew their minds. They're thinking, well we're the technical team, we know what we're doing. Customers they don't
work logically but it doesn't mean that's the shortest method, it's often the quickest route. It's really interesting to actually have that as part of your development system. Definitely, I think I've mentioned this to you before I really love it when there's the opportunity for customers to get in touch with a sales team via non-traditional means. Now maybe I might speak to somebody who's been in the sales business
longer than me, they'd say oh non-traditional is LinkedIn for me. We have a lot of people speak to us via Reddit, speak to us on Discord, I have used Discord for computer gaming, I never would have considered using it as part of a business but it just really works for us. That's been really interesting, there are some great conversations going on there as well, we're very fortunate, we've got an amazing marketing team who are constantly manning these channels to really keep that ear to the ground, see what's going on, but it sort of puts a new spin on that idea of social interaction with your customer base exactly, no limitations to it, we'll go wherever the customer wants to have the conversation, we'll actually put investment behind it to make sure that we are supporting it as well.
I was on over the weekend, I just decided I wanted to just pay off this a bit of a credit card, it wasn't very much but they have an app, I went onto the app, it said that you could do this, I kept coming up with a block, it just wouldn't do what I wanted to do. On Monday, I rang the telephone line, they said to me, oh that's why we have a dedicated team of people to take payments, they know that the app doesn't work very well because a lot of people like me come through it, you think well why would you frustrate your customer in that way? They were thinking they're doing a great job for the customer but actually do not create something that doesn't work, you're only frustrating your customers. You think of the additional investment that they need to have; they think it's quite logical to actually do that they're doing a great job but it really is madness. Let me ask you about your practical strategy that you would offer listeners to enable them, to enable their buyers to buy? I'm slightly biased obviously as I'm an SDR manager, my answer to this is always to have a really dedicated, invested team of SDRs. I will caveat that it's not always appropriate for necessarily a startup business, you're often going to build that out with an account executive, but I think some of these rules still apply for me. Personally, I want every interaction that my business has to reflect that highlight
level customer experience because it's going to be a touchpoint on that buyer's journey. For me having an SDR team who shares that same passion of ethos as the people in your customer care team, in the marketing team as the account executives or the direct sales that doing the demo, they're really going to make that journey a partnership for the customer, rather than just ship them up, package them up, off to the next person, which I think is the sales experience that we all least enjoy pretty much. How does that happen? I think a big part of it is don't take yourself too seriously, there are far too many salespeople that want to have an interaction with a potential prospect with the end goal of I'm going to get the sale in there. Yes obviously, we are salespeople, we're going to want to have that chat thinking am I going to qualify this person, am I going to qualify this person out? But there's also nothing wrong with having a chat, getting to know that other person as a human being as well. Because that's really what's going to build up that trust barrier where they then see you as a consultant for the business. There's an analogy that I always use with my SDRs, which is imagine you go to a fairly generic branded store that is selling computer equipment, I could go in and want to buy a laptop, I could have the salesperson that comes up to me, says hey you want to buy a laptop there, this one's on sale for 450 quid, now showing that I don't know how much a laptop cost, you should buy this one.
They don't really know anything about me, whereas yourself a salesperson's like hey you've been wandering around for a bit, can I help you? I'd like to buy a laptop, I'm going to university next year, oh really, lots of students buy this laptop do, why it's got really good security settings, it's got extended memory, you'll probably need that because otherwise, you're going to have to buy memory sticks upgrades etc. Now suddenly I've had a completely different experience, but that second interaction really felt like somebody just wanted to get to know me because I looked lost, then I decided to share some additional info, and it creates because you're sharing that additional info, it creates the opportunity to upsell the person, because you're more able to align what their needs are as opposed to just selling something because it's quick and easy. That's right, I think it is a part of an understanding because I would say, I've probably dealt with hundreds maybe nearly thousands of prospects in my time back when I was in SDR, I could probably remember a good 40 - 50 percent of them, the great conversations I had. I really wanted to get to know them as a person, because of that I would then feel terrible if I knew, I'd push the solution on them that wasn't a fit or I hadn't had a really transparent experience with them, it makes again that upselling process so much easier because what you're telling them is going to bring them success, help their business to expand.
You're not doing a hit and run like if they've got a problem because maybe the technology is a little bit more advanced, they need additional support or something. You're not going to not answer the call because you absolutely believe that is the right solution for them. There's always a certain amount of onboarding, you welcome that person as a customer, that's right, I have a small analogy for this it's not a great one. I'm sure my dad is going to listen to this podcast at some point, be like oh goodness Jen, I can't believe you said this, but the one I like to think about is sometimes we're in quite a rush to do something, especially in the B2B space where it's another company it wants to purchase really fast, you're standing in this space where you think I don't want to be friction to that purchase, but equally I know that this company is going to have a terrible experience, if they don't go through probably quite a significant discovery process with us, it's frustrating. I like this to learning to drive a motorbike if you already have said a car driver's license, some people might think oh a motorbike is a bit of a new thing for me, I want to have some training, I want to have a little bit of coaching, then I know how to drive on the road I know the traffic signals, etc. or they might be a little bit like my dad, who loves to turn his hand to new things,
would say I've got a car license, I'm going to give this motorbike a go. Let's hope that nothing goes wrong, i would be the salesperson in that instance saying maybe we should just do a bit of practice and do a bit of training and onboarding before you give that motorbike ago. I can imagine your dad racing down the road on his motorbike, i think he would love it at the moment especially in this nice weather, but you're probably a bit bundled up in all the safety gear Definitely lovely, what is it about coaching that fires you up because I know that you love to develop your team what is it? I think it's lots of things really, funnily enough, I would have said that when I first got into sales, I didn't necessarily know that coaching was going to be my bag, the thing that I enjoyed so much, but I started to just really get a kick out of the people I worked with, watching them develop or really overcome a hurdle that was something that was grating on them for a long time.
I decided to invest in going on a couple of training courses, I read a couple of great books which was amazing, I still cannot recommend more the book by Kim Scott Radical Candor because that is amazing coaching tips in there, that's just grown alongside the role. I think part of the reason I ended up in SDR management was I tended to work with a lot of grads, who were straight out of university. This really was a chance not just to impact what they were doing now but help coach them for the future as well. I hope a lot of my team would agree with me that many of the conversations we have, they're not just about them being successful at the company they're at the moment. But should they decide to move on or maybe move to
another country, take on another job, how could they be successful in a new role there as well? When you made the shift into sales? How did that actually happen? Almost by accident I will say, I had left the tower, I decided to take a bit of a sabbatical, I'd gone straight from education to work, I thought maybe I'll do the reverse, I'll earn a bit of cash, I'll travel around a bit ended up not traveling around a bit was helping out a few people at home, then decided what I think I might just move my industry around. There was probably a level of arrogance there that I'd done some operational leadership, because of just the place that I worked it didn't really translate very well on my CV, I thought what let's just see what industries are out there. I got the typical spiel Jen, you're quite a personable person, why don't you give sales ago? I was like I can do this, went to a couple of horrific interviews, my goodness I went to one of those sneaky interviews where they say it's a marketing job, it's a knock on the doors one that was a bit naughty. Then I went to a really amazing sales recruitment day, it was wonderful if anyone's looking for a company to help them support recruit SDRs thoroughly recommend BMS, they're a really great partner, they educate people throughout the day as well as get them on to interviews, I went through that process, I found my previous employer event, I had a great time working for that company, really grew up there through that SDR got to learn the business before moving into management Fantastic, that's where we met at Tert's event, it is at the end of women in leadership day, that's it absolutely, talking about women in leadership. Let's talk about diversity what's your view on because if we were having a big conversation about that, I'm really interested what's your view on diversity and in the sales industry, what do you think where we are, what more needs to be done? I definitely feel there are a lot more needs to be done but for me, diversity can just mean, many things I think depending on who you ask they might pinpoint a particular aspect, you may speak to one company, they'll say oh we need to have more women in sales but it can even be some stuff that's quite hidden like maybe we need to have more people, who didn't graduate from a university that went for apprenticeship programs, maybe we need people who come from a different part of the country or come from abroad.
There's just so much varying perspective that you can bring to an organization through diversity. One thing I have to say I'm very passionately against is those exams that you have to take where they do a personality assessment before your interview but then the outcome of the interview is solely based on that assessment. I think those assessments are a great tool once you've onboarded, somebody to really understand how you can get the best out of them, how they need to work but if you're hiring an entire group of people that fits just one particular candidacy model. You're never going to hear what the problems are, you're going to bump up against the same friction, I'll be honest, I'm a bit of a victim for this myself when I first moved into management, I probably hired a lot of people that I thought hey they have a really similar personality to me. I mean this was 12 odd years ago, you just think after you've unfortunately had to let maybe the third or fourth person go, why do I keep doing this to myself? It was a kick in my backside to go because I'm not thinking about what diversity truly means.
Now anytime I'm interviewing I really like to make sure that I've got other people there, I get a broad 360-degree perspective on candidates coming through, I really challenge any unconscious bias that I might be bringing to the table. My HR team knows that I'll pretty much telescreen anybody that wants to interview for our company because I really want to see who's going to put in the effort, come through the door, bring the next great thing is, a lot of those assessment tests are actually biased that even though hr. people don't really realize. I remember when the testing that they did for my masters, I was so furious because they had things, it was like an international audience but they had things in recognizing the UK or British landmarks. there are some psychologists that thought this was a great idea I would have felt that why don't we use language or signage as well, what is unusual me in one culture is not unusual in another, so many of those tests are actually biased, they're created by Oxford or Cambridge Deans. They have the same group think, they can be quite dangerous can't they can be, my recommendation is anyone who's maybe got roles advertised, at the moment that they're concerned that they're not attracting a diverse pool of candidates is I would say put it out there to some other organizations.
A colleague of mine from the US reached out on LinkedIn a while ago, said I'm really looking for more women to apply for this role, they just aren't, I hit him up privately and said have you sent this to any women that doing this job or other companies, ask them what they think of this job spec because they may turn around, tell you something that you can't see, I can't see that's putting people off. I think that that can be something really powerful, I think that's a brilliant idea, thank you for sharing that because we don't know our own bright blind spots, we just can't see them that's why they're called blind spots, that's it in my case it means walking into doors and lampposts but in terms of business it could be something a little bit more dangerous that's all the people looking down at their phones Who is your hero or shero? Let me ask you that Oh goodness well it's a soppy one for me, my shero is my partner Ann, I could not live without her. Honestly, she's the yin to my yang. Why would I say that I think because she's the perfect complement to my personality, which is great, all of us are looking for that one person that picks up everything that they do badly, then they support that other person in things that they necessarily don't do quite well. We're a really great team, I think we also broke, I don't know if you can say, it's an old adage but we met at work, there's this thing of like oh no two people that are in a relationship can't work together, we were awesome.
I know that if I was on a desert island or something with her, she'd be organizing me building a shack, we'd always have food to eat and clean water. I know I'd survive If you were taking going on a desert island on your own, would your item to take be Ann? It would be if I wasn't allowed to take a human, I'd have to take something I could play audible on. I'm a big audiobook fan, I do love a cheeky podcast as well, that would keep me going Brilliant, it's been an absolute pleasure, tell listeners how they can get hold of you? The best way to get hold of me is on LinkedIn because at the moment I'm a bit rubbish at replying to emails in my inbox for you, lovely salespeople that have been messaging me, catch me on LinkedIn. I try my best to reply to every message, I'm logged as Jennifer Hicks SDR manager as I'm sure there's a few other Jennifer Hicks's out there or you can catch me floating around at Gearset, if you're ever in the Cambridge area please come, say hi, I love meeting new people. Excellent, thank you, finally I've got you, I'm trapped now, we've just got to hope that everything I've said is awesome, it doesn't get heavily edited in post-production.
It won't be at all; it won't be at all, you are absolutely brilliant Thank you for being a guest on Scale Your Sales Podcast Jennifer No worries, thank you so much Janice
Preparing and Designing the Data Lakehouse for Artificial Intelligence — Vini Jaiswal, Databricks 2022-01-20 14:06
Ford BlueCruise First Impressions | Talking Cars #342 2022-01-17 11:08
It's My Job Podcast Episode 24 2022-01-15 02:06


text:
Q: jQuery ID and class selector on click function I have this code with click function with a selector of id checkbox input and a class radio button input if either if the two inputs is checked a button will add a attribute of disabled else it will removed the attrib, unfortunately it is not working how can you make it work with different selector when you click either of them it will add a attribute?
Here's the code:

$("#callbackReq input.callbackopt").on("click", function() {
  if ($("#callbackReq input.callbackopt").is(":checked")) {
    $("#submitBtn").attr('disabled','disabled');
  } else {
    $("#submitBtn").removeAttr('disabled');
  }
});

  <input type="checkbox" value="" id="callbackReq" name="callbackReq">
  Call back

  <input class="callbackopt" type="radio" name="acceptedModr" id="approved" value="Y" checked />
  Approved

  <input class="callbackopt" type="radio" name="acceptedModr" id="rejected" value="N"/>
  Rejected

<button class="btn btn-primary move-right" type="submit" value="ENTER" id="submitBtn" name="submitBtn" disabled>
  Save and Next
</button>

A: Inside the If statemnt should refer to current element that was clicked. Try change the code inside the if statement like this :

$("#callbackReq,input.callbackopt").on("click", function() {
  if (($(this).is(':checkbox') && $(this).is(":checked")) || $(this).val() == 'Y') {
    $("#submitBtn").prop('disabled', false);
  } else {
    $("#submitBtn").prop('disabled', true);
  }
});

// or this if want radio button only
/*$("#callbackReq,input.callbackopt").on("click", function() {
  if ($(this).val() == 'Y') {
    $("#submitBtn").prop('disabled', false);
  } else {
    $("#submitBtn").prop('disabled', true);
  }
});*/

  <input type="checkbox" value="" id="callbackReq" name="callbackReq">Call back

  <input class="callbackopt" type="radio" name="acceptedModr" id="approved" value="Y" />Approved

  <input class="callbackopt" type="radio" name="acceptedModr" id="rejected" value="N" checked/>Rejected

<button class="btn btn-primary move-right" type="submit" value="ENTER" id="submitBtn" name="submitBtn" disabled>Save and Next</button>

A: Here's a working solution :). Hope it helps!

$(document).ready(function(){
 $("#callbackReq, input.callbackopt").on("click", function(){
  if ($(this).is(":checked")) {
   $("#submitBtn").prop('disabled','disabled');
  }
  else if ($("input[name='acceptedModr']").is(":checked")) {
   $("#submitBtn").prop('disabled','disabled');
  }
  else if(!$(this).is(":checked"))  {
   $("#submitBtn").removeAttr('disabled');
  }
 });
});

 <input type="checkbox" value="" id="callbackReq" name="callbackReq" >Call back

 <input class="callbackopt" type="radio" name="acceptedModr" id="approved" value="Y"/>Approved

 <input class="callbackopt" type="radio" name="acceptedModr" id="rejected" value="N"/>Rejected

<button class="btn btn-primary move-right" type="submit" value="ENTER" id="submitBtn" name="submitBtn">Save and Next</button>

redpajama_set_name: RedPajamaStackExchange


I have never liked the term multiculturalism applied in our country. It implies that we do not have a Canadian culture.
Apr. 8, 2009 7:47 p.m.
Multiculturalism is the policy or practice of giving equal attention or representation to the cultural needs and contributions of all the groups in a society.
This was a Liberal term forced on us for political correctness.
To be totally honest, there is nothing to celebrate about many cultures in this world. They have stupid traditions, persecutions, radical religions and unstable politics.
We built a country forged on the beliefs of our pioneers.
People come here because we have a culture of equality, respect for laws and fairness. Not to mention maple syrup, Canadian bacon, rodeos, skiing, hockey, native heritage and art, wide-open spaces, horses, cows, fishing, all kinds of wildlife, beautiful lakes and mountains, etc.
Yes, we have a culture.
Of course, immigrants come because of opportunity and a better way of life for them and their family based on this culture.
If you want to celebrate Chinese culture, go to China; if you want to celebrate East Indian culture, go to India; if you want to experience Swedish culture, go to Sweden.
We should only celebrate Canadian culture on Canadian soil.
Celebrating one's heritage is a different matter.
Many groups such as the Ukrainians, Scottish, Germans, etc. have celebrations. That can be a good thing.
I have told the minster of citizenship, immigration and multiculturalism to drop the term multiculturalism and replace it with Canadian culture.


text:
*****************************************************************************************************************************
Terms to use when searching (Remember to use quotation marks (" ") around phrases when the database allows. Use advanced search when you can. Try combinations of the following search terms:)
"King Arthur"
"King Arthur's knights"
"knights of the round table"
Morgan LaFay
Knighthhood
These links are purchased databases: (citations provided for you)
ABC-CLIO: Username: studentpass22 Password: studentpass22
All of these databases include Primary Resources, research and reference information with in-depth coverage.
Britannica Academic Edition: Provides articles written by Nobel laureates, historians, curators, professors and other distinguished contributors. Grades 9-12.
Britannica School Edition: Geared for school-related research topics, this group of 4 encyclopedias includes 3 levels: elementary, middle or high school.
Discovering Collection: This Gale database covers history, literature, science, social studies, and more, providing a premium selection of reference, primary sources, creative works, and multimedia, including hours of video and audio clips.
Britannica Academic Edition: Provides articles written by Nobel laureates, historians, curators, professors and other distinguished contributors. Grades 9-12. Be sure to check out the "web links" on the left side of each article!
EBSCOhost Student Research Center:
Encyclopedia of World Biography: Part of the Gale Virtual Reference Library - contains thousands of biographies from ancient through modern times. Note: To get back to the ROR webpage, you need to click "Return to Library" in top blue bar.
Gale Group: Provided by ELM, this group of databases includes reference books, full-text magazine and newspaper articles, photos, audio and video clips for students of all ages as well as professional materials for teachers. Titles: Discovering Collection, Educator's Reference Complete, Expanded Academic ASAP, General Science, Informe, Junior Edition, Junior Reference Collection, Kids Edition, Kids InfoBits, Professional Collection, Student Edition and Student Resources in Context.
If you select Gale Group Power Search, you are able to search all of these databases at once.
InfoTrac Student Edition: This Gale database is designed for high-school students and provides access to a variety of indexed and full-text magazines, newspapers, podcasts, and reference books for information on current events, the arts, science, popular culture, health, people, government, history, sports and more.
Caerleon Net ( "King Arthur - the legend")
Castles: Knight of the Round Table
eHow: Stages of Knighthood
King Arthur & the Knights of the Round Table
King Arthur and the Legend of the Knights of the Round Table
Knights' Code of Chivalry
Knights' Tournaments
Mediaval Tournaments
Middle Age. org: "Steps to Knighthood"
Wikipedia: Chivalry


In addition to maintaining The Trollish Delver, I also write for the monthly videogames magazine Thirteen1. The original review can be found in the latest issue.
Have you managed to recover from taking in that behemoth of a title? From now on, the game will be referred to as Cognition, just to save everyone's sanity and my fingers, but don't let the lengthy name put you off. This is indie studio Phoenix Online's first commercial output, having already worked on The Silver Lining, a spiritual successor to the King's Quest series; and it's always refreshing to see a new studio begin with an adventure title, which is something of a rarity these days. But for a commercial debut, Cognition is a good effort that will keep fans of classic adventure games happy and newcomers enthralled in the story.
There's a reason why Cognition is such a strong game, as the story has had a helping hand from adventure guru Jane Jensen. For a new studio, Phoenix were massively lucky to have Jensen on board with the project and her golden touch really shines through. But she's not the only big gun the developers have on their side, as the stunning artwork was done by none other than Romano Molenaar, a comic book artist who has worked on big titles like Hellboy, Spider-Man, The Darkness and Conan. Truly these are some formidable allies to have on your game.
So it's only natural that Cognition has gone for a comic book inspired visual style, with gorgeous 3D cell-shaded graphics layer on top of beautiful background paintings. Speech boxes appear in conversation using a comic style font, making it seem like you're playing a motion comic rather than a game. The visuals are incredibly effective and one of the game's strongest assets.
The titular Erica Reed is an FBI agent based in Boston who begins the game tracking down a mystery figure who has taken her brother, Scott. But she ends up being too late, and becomes haunted by her brother's death. This may sound like generic crime fodder, but Erica has a secret of a supernatural bent: she's a post-cog - she can see images of past events by studying the aura of objects. The thing is, it becomes apparent that someone knows her secret and Erica must unravel what they want from her and how they know. The whole prologue sets the tone for the game really well, showing that we're dealing with a mature game with a violent and dark edge to it.
The post cognition power, which is actually one of three powers that Erica has, including projection and regression, presents an interesting game mechanic that turns what could have been a run-of-the-mill detective game into something more layered. All three powers are used effectively in conjunction with puzzles, which are varied and sometimes complex, but still exciting. These powers mean that you're not just stuck doing repetitive inventory-based puzzles, a pitfall that is so easy for an adventure title to fall into. However, there are some instances where the puzzles are bafflingly strange, such as having to break into Davies' office as covertly as a rhino sneaking into a pub. Adventure veterans may find most puzzles a little easy for their tastes, but they're challenging enough to keep you going.
This premiere episode introduces a number of characters, most of which currently lack much depth. John, the useless partner, likes donuts and isn't particularly helpful; Davies, Erica's boss, is the typical brash and shouty boss, and Terence is a gadget-adoring nerd who is all about being a gadget-adoring nerd. Maybe future episodes with expand on these characters to make them more three dimensional and, to put it bluntly, interesting.
As stated before, the art in Cognition is astounding. The expertly painted backgrounds drip with dark atmosphere, with creepy shadows, detailed textures and an eerie use of lighting that will make you feel uneasy while playing.
The plot of Cognition actually builds up really well, ending in a climax that will make you wish you could go straight into playing the next installment of the series. While its characters are, for the moment anyway, paper thin and some of the puzzles a bit illogical, the incredible art, decent plot and cognitive powers do make for an interesting and fun adventure thriller. Roll on episode two.
"Post-cognition"? I wonder why the designers didn't go with psychometry?


text:
At the 1900 Summer Olympics, five equestrian events were contested. The competition was held from 29 May to 2 June at the Place de Breteuil in the 7th arrondissement of Paris, as part of the Exposition Universelle in Paris. The equestrian events were organised by the Société Hippique Française and titled as the Concours Hippique International (English: International Horse Show), with competitors from eight countries competing in three jumping and two driving events.

Only the three jumping events had been considered "Olympic" by the International Olympic Committee in the past. The IOC website currently has affirmed a total of 95 medal events, after accepting, as it appears, the recommendation of Olympic historian Bill Mallon for events that should be considered "Olympic". These additional events include two equestrian driving events. It is not certain how many competitors there were, but it is likely that there were between 37 and 64. Five nations competed in the Olympic jumping events, with three more (Germany, Spain, and Austria) in the two driving events. There were two female riders, both of whom competed in the hacks and hunter combined event: Italian Elvira Guerra and Frenchwoman Jane Moulin.

Schedule

Medal table

Medal summary

See also
List of Olympic medalists in equestrian

Notes

References

Sources

 International Olympic Committee medal winners database
 De Wael, Herman. Herman's Full Olympians: "Equestrian 1900".  Accessed 19 January 2006. Available electronically at .

1900 Summer Olympics events
1900s

redpajama_set_name: RedPajamaWikipedia


Hey guys and girls have an gsxr600 brought it about a year or so ago second hand how ever when taking off 0-15 you can walk the thing quicker but from 15ks and up it moves any ideas ?
Can you try again, but without the horrendously vague description this time?
Fuel delivery issue?? possible. More info needed, describe it better. Do you mean 1500 rpms?
Twist the top of the right hand grip toward you.
The physics of that picture would indicate a stoppie- so the opposite of twisting the wrist.


text:
Tag Archives: Stephen Sondheim
WE GOT COAL IN THE THEATERS THIS YEAR
1. The Hobbit: Battle of the 5 Armies Wknd/$ 41.4 Total/$ 168.5
2. Unbroken/Universal Wknd/$ 31.7 Total/$ 47.3
3. Into the Woods/Disney Wknd/$ 31.0 Total/$ 46.1
4. Night at the Museum: Secret… Wknd/$ 20.6 Total/$ 55.3
5. Annie/Sony Wknd/$ 16.6 Total/$ 45.8
6. The Hunger Games: Mockingjay Pt. 1 Wknd/$ 10.8 Total/$ 306.7
7. The Gambler/Paramount Wknd/$ 9.3 Total/$ 14.3
8. The Imitation Game/Weinstein Wknd/$ 7.9 Total/$ 14.6
9. Exodus: Gods and Kings/Fox Wknd/$ 6.8 Total/$ 52.5
10. Wild/FoxSearchlight Wknd/$ 5.4 Total/$ 16.4
I'LL TAKE "QUESTIONS NO ONE EVER ASKED" FOR A $100, ALEX
The Hobbit: Battle of the Five Armies holds at number one and it's bad enough that they stretched this out to three movies but they include a scene to set up the first Lord of the Rings movie, because it was killing you not knowing how Orlando Bloom and Viggo Mortensen met. It's so painfully contrived I'm surprised that Liv Tyler's character doesn't get mentioned as well.
WHILE I COMPLAIN HOW THE CABLE GOING OUT AGAIN IS KILLING ME
Unbroken opens at number two and this is the true story of a man who not only survived inhuman hardships (WWII, being shot down, Japanese prison camp), but also excelled in his personal life (Olympian). It's supposed to be inspirational, but honestly it just kind of reminds you of what a loser you are. Yeah, you!
TO BE FAIR I DIDN'T SEE THE NON-SINGING LITTLE RIDING HOOD EITHER
Into the Wood opens at number three and I thought and considered seeing this given the obvious fantasy element (after all I did see that lame Jack & The Beanstalk movie last year), but I simply could not get over the musical part. Sorry, but if Gene Kelly isn't dancing, I'm not down. I hate it even in animated movies. Somewhere down the line, for people to stop and start singing just began to rub me the wrong way. Bear in mind if I could sing my way though life I most certainly would. "Stop, wait a minute Mr. Postman/Did my package come from eBay/I was hoping to get it today…" I just don't want to watch other people do it. Especially in that "musical theater" style.
THE SKILLS THAT PAY THE BILLS
Night at the Museum: Secret of the Tomb is down to number four and honestly I can't blame Ben Stiller for doing either these or those horrible Meet the Parents movies when films like The Secret Life of Walter Mitty just die on the vine. You tried, the public said no so you give them the crap they deserve and make sure your kids go to a nice college. I ain't mad atcha.
ALSO KENNY ROGERS ISN'T IN IT
Speaking of musicals I will never see, Annie is down to number five, followed by The Hunger Games: Mockingjay Part 1 at six and The Gambler opening up at number seven and this briefly interested me, but I have a problem with movies whose plotlines are based solely on the protagonist stops making mistakes. If he stops being stupid, you have no movie. Needless to say, a movie about a man with a gambling addiction simply isn't going to work for me. Yeah, I know it's a compulsion he can't help and I'm being uncharitable, but it's not like he's struggling with cancer or even a drug addiction where the body physically suffers. He's just getting off on the rush. Not to mention any movie where Mark Wahlberg is playing a good-looking professor is straining my suspension of disbelief, starting with that good-looking part. Call him sexy, call him charismatic, but do not pretend he's good looking, 'cause he ain't. He ain't by his own admission, which, ironically, is one of the reasons I do like him. But in other movies.
ALTERNATE TITLE: UNGRATEFUL
The Imitation Game enters the top ten at number eight and this is based on the true story of the man who helped break he Nazi spy code and was later destroyed by a seriously ungrateful British government for being gay. Yep, nothing like that uplifting Oscar bait. Remember the Oscar requirements: mentally or physically disabled, addicted to something, gay or die. It helps in you can combine them and do it with an accent. This has at least three of those for star Benedict Cumberbatch.
TRIVA: IN THE 50'S THE EGYTIAN ARMY WAS USED IN THE FILM
Down to number nine, Exodus: Gods & Kings is getting hated all over the globe it seems. The Egyptian government just banned it for sucking. Okay, that's not entirely true because then Transformers wouldn't play there. It was banned for taking too many liberties with The Bible, aka "Enough with the lily white historical stories. No one in this damn thing looks like us and it takes place here!" On one hand I'd delighted to Ridley Scott fail, but on the other this will just push him back to trying to make more Alien movies for money.
CUTE BLONDE GOES FOR A WALK. PEOPLE PAY TO SEE IT.
Finally, Wild holds at number ten.
THE ORIGINAL ANGRYGEEK.COM
Tags: Angelina Jolie, Annie (2014), Ben Stiller, Benedict Cumberbatch, Exodus: Gods and Kings, Into the Woods, Mark Wahlberg, Night at the Musuem Secret of the Tomb, reese witherspoon, Stephen Sondheim, The Gambler, The Hobbit Battle of the Five Armies, The Hunger Games Mockingjay Pt 1, The Imitation Game, Unbroken, Wild


German marines have rescued 200 (now over 400) refugees shortly after launching two ships to scour waters between Africa and Europe.
The ship "Hessen" evacuated the boat in distress about 250 kilometers south of the Italian island Lampedusa. The refugees were brought to an Italian port, the German army said after discussions with Italian marine rescue officials.
The "Hessen," along with the "Berlin," also a Bundeswehr ship, were warned of a refugee distress situation on Monday morning. The ships had begun their search mission on Tuesday, when they sailed from Crete towards the sea area between Libya and Italy.
Or at least that's what the Greek parliament just figured out.
However, Italy also suddenly owes Greece $216 billion for its invasion in 1940, too, they said.
After that you've got the Ottoman Empire owing the Greeks $197 billion for, well, for being Turks.
Then the Roman Empire will also still need to shell out an additional $116 billion for those nasty Macedonian wars.
And then, of course, Iran will have to step up and pay Greece $97 billion for the ugly Persian Invasion back in 484 BC.
This will still leave Greece with a humungous debt, of course, the parliamentarians noted, but nothing that another little loan from their friends in the European Union won't fix.
I mean with debt. Go with God, Greece, but go (to Russia for more dough). I'm sure they'll make you an offer you can't refuse.
Greece's energy minister is visiting Russia today after calling for a confrontation with a "Germanised Europe" in the country's stalling bailout negotiations.
The visit comes less than a fortnight before Greek prime minister Alexis Tsipras is due to visit Russian president Vladimir Putin, the date of which was reportedly brought forward because of Greece's financial disputes with the European Union.
The rest of you guys out there in Europe are just too weak. Like start doing more push-ups or something.
German dominance is in part a consequence of others' retreat. That may be why complaints have been muted. "If the Italians don't bring pasta and the French don't bring pâté," says a diplomat, "you can't complain about Mrs Merkel's cabbage soup.
PS: And speaking of getting stronger, you folks over at the FDP should learn to smile a little already. Polls indicate that you're back over that magical 5 percent line and could get back in the saddle again – if elections were to be held today.
Verblüffender Befund (an amazing finding)? I don't see how it could amaze anyone here – anyone who has ever gone shopping in Germany and then compared those prices to those you would pay in other European countries, that is.
Germans apparently aren't aware of the fact that they have some of the lowest Lebenshaltungskosten (living costs or cost of living) in all of Europe. Of their immediate neighbors, it's only cheaper to live in Poland and Czechia.
What is really amazing I find, however, is the fact that the Germans are able to enjoy these cheap prices while still having a higher per capita GDP than a lot of the European countries with a higher cost of living (Belgium, Denmark, France).
Beats the hell out of me. Hey, es darf eben nichts kosten here.
Verbraucher in Deutschland bekommen für ihren Euro mehr als die Menschen in den Nachbarländern. Lediglich bei den Nachbarn in Polen und Tschechien sind die Lebenshaltungskosten niedriger.
Denmark's Loreen and 19 others sang crappy songs that took in way more votes.
Böse Zungen (malicious tongues) have even suggested that Germany's crappy Eurovision showing last night might not be entirely the fault of its crappy Cascada entry.
PS: It wasn't all bad news for Germany this weekend, however. Justin Bieber's monkey will now become a German citizen.
The issues at stake are not trivial ones. At the core of the Franco-German conflict is no less a matter than the question of how Europe can shake off the current crisis. Merkel is convinced this can only be achieved by implementing reforms — austerity, liberalization of the labor market and restructuring of social welfare systems.
But Hollande is unwilling to let Germany impose its model on France. He fears the European recession will only worsen if Berlin succeeds in implementing its austerity plans.
Even in the euro crisis, Germany is reluctant to be seen as sole leader. It badly needs a French economic revival to have a plausible partner at the top again.
German Chancellor Angela Merkel rejected again today claims that her country was seeking hegemony in the European Union.
But gets caught at Athens International Airport attempting to smuggle half a ton of gold and silver out of Greece to Germany instead.
Wait a second. Aren't the Germans the ones who are supposed to be smuggling their gold (as in Geld) into Greece these days?
The man was trying to board a Lufthansa flight back to Germany when the airline uncovered nearly 1,000 lbs. of what the BBC calls silver "tablets" in a cargo container.
But once they take a nap and rest a little bit, they won't be so tired anymore.
The question is whether Germany can use its power by unapologetically leading. Given Germany's past, its political culture militates against even trying.


Therapeutic ultrasound for chronic low-back pain. Ultrasound is a treatment that uses vibration to deliver heat and energy to parts of the lower back. back pain.
Aug 11, 2010. And unlike CT scan, ultrasound is far less likely to reveal an alternative. white cell count normal, urinalysis normal; right-sided low back pain; CT scan read:. Pain in lower abdomen and tender spot on the right side.
Nov 9, 2012. Back to TopHow the Test Is Performed. Unlike with x-rays or CT scans, this test does not expose you to ionizing radiation. Find the cause of abdominal pain; Find the cause of kidney infections; Diagnose a. Medicaid Expansion May Lower Death Rate, Study Says · Insurance Rebates Seen as Early.
Learn about ultrasound therapy as a treatment option for back pain caused by a spine condition.
Radiographic assessments for low back pain involve the use of X-rays to determine. If you have had lower back pain for only six to eight weeks, have treated it with rest, resonance imaging (MRI) and computerized tomography ( CT) scans.
Sep 30, 2014. Because the pancreas lies at the back of the abdominal cavity, diseases of. It can be difficult to distinguish pain caused by pancreatitis from pain caused. Endoscopic ultrasound scan (EUS). Risk of addiction is also lower.
Ultrasound therapy uses sound waves to penetrate soft tissues. It's used by therapists to treat chronic pain conditions and to promote tissue healing.
The radiologists at Radia have developed the following scanning guidelines for our referring providers to. Thyroid nodule: neck ultrasound. MRI lumbar spine without contrast. For pain localization in setting of prior surgery or multiple.
Back Pain And Neck Pain Exercises Back pain is pain felt in the back. Episodes of back pain may be acute, sub-acute, or chronic. Capsule tissue damage has been proposed in people with neck pain following whiplash. In people with spinal. However, one study found that exercise is effective for chronic back pain, but not for acute pain. Another study found.
Back pain is very common, affecting most adults at some point in their lives. Low back pain is an ache or discomfort in the area of the lower part of the back and spinal column. The lower spinal. X-rays · MRI scan · CT scan; Ultrasound.
Back Pain – diagnostic and treatment options available at Melbourne Radiology Clinic. Digital X-ray · Ultrasound · MRI · Multi-Slice CT. Pain in the lower aspect of the lumbar spine may also be due to inflammation or arthritis of. A CT scan can be substituted for an MRI if the patient is unable to undergo MRI evaluation.
A Step-By-Step Plan for Treating Low Back Pain. What is an ultrasound scan (USS)? Ultrasound scans use sound waves to build up a picture of the inside of the body.
When someone complains of lower stomach pain, he is typically not experiencing pain in the stomach at all, but rather somewhere lower in the abdomen. Since.
Ultrasound for back pain is a type of heat therapy used to treat many diagnosed conditions. Learn about deep heat treatment for chronic back ache or injury.
Low back pain at presentation in a newly diagnosed diabetic. Free. to complain of widespread left sided abdominal and flank pain as well as lower back and bilateral buttock pain. Abdominal ultrasound scan was also reported as normal.
Abstract. Injection therapies play a major role in the treatment of low back pain and radiculopathy and are becoming integral parts. Ultrasound-guided injections in the lumbar spine. 1) In an exact midline scan along the spinous proc-.
19.12.2010 · Eingebettetes Video · A video excerpt from our Sonography e-Learning suite. Each module covers a different sonography scan and provides a.
MRI lumbar spine w/ & w/o contrast. *If prior lumbar. Ankle pain with concern for unstable osteochondral lesion. • Hip pain with. duplex scan of veins, UNILATERAL upper. estimated date of delivery for OB ultrasound (more than 14 weeks.
Imaging Modalities for Back Pain. MRI is the best tool for diagnosing patients with lower back pain because it picks. Ultrasound scans have been able to.
Before a doctor makes a diagnosis of hip bursitis he or she must rule out other common problems that could cause hip pain, including lower back problems such.
Mar 15, 2000. Acute low back pain is commonly encountered in primary care practice. Exaggeration of the lumbar curve, palpable "step off" (defect. Compared with MRI, CT scanning is less sensitive to patient movement and is also less expensive. Superficial heat (hydrocolloid packs), ultrasound (deep heat), cold.
Low back pain is pain and stiffness in the lower back. It affects 80% of. Some of these tests might be: x-rays, CT scan, MRI, myelogram, or EMG. Your doctor will.
Continued Why It Is Done. Abdominal ultrasound is done to: Find the cause of belly pain. Find, measure, or monitor an aneurysm in the aorta. An aneurysm.
Pain, frozen shoulder, rotator cuff injury, swelling or masses , impingement and instability. Muscle or tendon tears, pain, swelling/masses. Lower back Scan.
We answer your questions about abdominal and pelvic ultrasound scans of your. pelvic or abdominal pain or needing to wee more often or more urgently than.
Ultrasound Scan For Lower Back Pain 2019 4 out of 5 based on 95 ratings.


text:
Олександр Семенович Пономарьов (23 квітня 1918, село Корсунь — 7 червня 1973, Москва) — український радянський футболіст і  футбольний тренер. Заслужений майстер спорту СРСР з футболу — 1946 рік. Старший тренер: «Шахтар» (Сталіно), «Авангард» (Харків), «Торпедо»(Москва) та збірної СРСР. Заслужений тренер СРСР — 1964 рік.

Клубна кар'єра

Ранні роки

«Динамо» (Горлівка)
Вихованець горлівського футболу. Розпочав виступати в 1933 році на любительскому рівні в одній з виробничих команд Донецької області.

«Шахтар»
З весни розпочав свої виступи на професійному рівні, у головній команді області — сталінському «Шахтарі». Провів одну гру в складі команди.

Переходи протягом 1936 —1941 років
Несподівано опинився в сталінградському «Тракторі». Потім на короткий час був харківський «Спартак», знову «Трактор». Забив у «Тракторі» понад 50 голів. 1941 року були реорганізовані профспілкові команди, Пономарьов був направлений до московського клубу «Профспілки-1». Зіграв за цей клуб 9 матчів чемпіонату СРСР і виникла пауза на кілька років через початок Німецько-радянської війни.

«Торпедо»
У 1944 було поновлено змагання у Кубку СРСР, в якому Пономарьов вже виступає в складі московського «Торпедо». В автозаводській команді він зіграв сім років і був у її складі капітаном та головним атакуючим наконечником. За цей період у її складі забив, понад 100 голів в різних змаганнях.

Повернення в «Шахтар»
У 1951 році повернувся до рідного сталінського «Шахтаря», де провів останні два сезони в чемпіонатах СРСР та допоміг здобути гірникам перші медалі чемпіонату. У 1953 році вирішив повісити бутси на цвях.

Стиль гри
Ігрова характеристика: Фізично міцний, сміливий, завжди спрямований на ворота суперників. Володів різким, швидкісним ривком та могутніми ударами з обох ніг.

Досягнення
Гравець
 Бронзовий призер чемпіонату СРСР: 1945, 1951
 Володар Кубка СРСР: 1949
 Найкращий бомбардир чемпіонату СРСР: 1946
 Третій бомбардир московського «Торпедо» в чемпіонатах СРСР: 83 голи.
  Член Клубу бомбардирів Олега Блохіна — 175 голів
  Член Клубу бомбардирів Григорія Федотова — 168 голів
Тренер
  Бронзовий олімпійський призер: 1972
 Віце-чемпіон Європи: 1972

Статистика виступів
Навесні 2018 року на офіційному сайті Української Прем'єр-Ліги був опублікований матеріал із реєстром забитих м'ячів Олександра Пономарьова. Як зазначено у статті, визначальним при укладанні таблиці був орієнтир на дані, які можна документально підтвердити: йдеться про протоколи матчів і газетні звіти. Спогади ветеранів та очевидців не враховувалися.

Усі підтверджені документально забиті м'ячі Олександра Пономарьова в офіційних турнірах найвищого рангу
Всі голи за професійні клуби
Умовні позначення і примітки: кві, тра, чер, лип, сер, вер, жов — квітень, травень, червень, липень, серпень, вересень, жовтень; п — пенальті, т — тайм, дч — додатковий час; жирним виділено команди, за які виступав Олександр Пономарьов; зі сумарної кількості голів 134 проведено за «Торпедо», 47 у лавах «Дзержинця» / «Трактора», 21 — «Шахтаря», 2 — «Профспілок-1»; найрезультативнішим виявився сезон 1949-го — 25 точних влучань.

Див. також
 Українські рекордсмени чемпіонатів СРСР з футболу

Посилання
 Профіль на сайті «Сборная России по футболу»
 Прима клуба Федотова
 Статистика на сайті КЛИСФ
 Царь-пушка Александра Пономарева
 Александр Пономарев — лучший кубковый бомбардир Союза
 Олександр Пономарьов: як відзначимо століття легенди?

Література
 Олексій Бабешко, Андрій Бабешко: «"Шахтарю" — 70 років. Хто є хто. Футболісти "Шахтаря" (Донецьк) 1936–2005». м. Донецьк-2005 р.
 Олексій Бабешко, Андрій Бабешко: «"Шахтар" (Донецьк). Історія команди 1936–2006» м. Донецьк-2006 р.
 Віктор Хохлюк: «Бомбардири України» стор. 10. Ровеньки. 2011 рік. ISBN 978-966-534-344-8
 Віктор Хохлюк: «Голеадори» стор. 48. Луганськ. 2012 рік. ISBN 978-966-158-934-5
 Віктор Стріха: «Футбольно-хокейний альманах. Україна та сусідні держави 1863-1954». стор. 190. Черкаси. 2013 рік.

Уродженці Горлівського району
Українські футболісти
Радянські футболісти
Футболісти «Шахтаря» (Донецьк)
Футболісти «Торпедо» (Москва)
Футболісти «Ротора»
Футболісти «Шахтаря» (Горлівка)
Футболісти «Спартака» (Харків)
Футболісти «Профспілок» (Москва)
Футбольні тренери СРСР
Тренери ФК «Упон Палло»
Тренери ФК «Арарат» Єреван
Члени клубу Олега Блохіна
Померли в Москві
Поховані на Ваганьковському кладовищі


Did you know that 1 in 5 Canadians will experience a mental health problem or illness in a given year?
No one should have to feel alone on the road to recovery.
And let's face it, most roads are hard to find, without some kind of waymarker, sign, or helpful person to ask for directions.
So let's be brave and vulnerable, and acknowledge the prevalence, and the impact, of mental illness, in our lives and communities.
Join Vancouver Coastal Health and the Pemberton Local Action Team outside the Pemberton Valley Supermarket today, between 11am and 3pm, for coffee, snacks, cake, and conversation.
Nancy Lee, the outgoing program coordinator for the Local Pemberton Action Team for the Child Youth Mental Health Substance Use (CYMHSU) Collaborative will be on hand to demonstrate PlanY.ca, the wellness app that was created as a key resource for youth in Pemberton, LIl'wat Nation and the Lower Lakes communities, Area C and N'Quatqua.
Unfortunately, the funding for Nancy's position and the CMHYSU project, ends in December.
The Child Youth Mental Health Substance Use collaborative project began in BC in 2013 with eight Local Action Teams (LATs) aiming to do something about the lack of coordination in response systems for child and youth mental health.
developed a web-based resource for youth in the area called Plan-Y.
All this was possible because of the funding that allows us to get together, discuss and plan, instead of juggling the needs of local children and youth off the sides of their desks.
If you care about this issue, or care about someone who may need to navigate the mental health system, stop by and say hi to the team, and find out what resources are available or how you can become one.


and especially by their technical innovations.
is an example of these innovations.
the Polish motorcycle SFM "Junak"
Still relatively unknown machine to promoting and exchangeing.
repair, and the sociability among the Junak-owners and enthusiasts to maintain.


The Sunday Times published its annual Rich List on 24 April.
Total net worth of Britain's wealthiest 1,000 residents - the top 0.002%.
Minimum you need to be admitted to the 2016 Rich List.
Gross lifetime earnings of a worker on the average UK salary of £26,500 over a 50-year career. It would take 77 lifetimes for a worker on average pay to earn the equivalent needed for Rich List entry. Of course, you'd have lost most of it in rent and necessities to people already on the Rich List anyway.
Property billionaire brothers David and Simon Reuben, top of the 2016 Rich List. They also have investments in tech, metal and banking. The pair owns Millbank Tower, Oxford Airport, shops on London's ultra-posh Sloane Street, and more. Net worth: £13.1 billion.
Homelessness charity Shelter's estimate of the numbers caught in the UK's 'rent trap' in 2014. These renters - 66% - permanently subsidise private landlords, never able to afford a deposit on their own homes.
Ernesto Bertarello's net worth, with wife Kirsty. Ernesto mainly races yachts these days. But he earned his money the hard way: by cleverly and industriously inheriting a pharmaceutical firm. When that sold, he took home a well-deserved $8.6 billion.
Total net cost of ingredients in NHS prescriptions in 2014 (Health and Social Care Information Centre). Private drugs companies, like Ernesto's former plaything Serono, demand obscene mark-ups. 'Dasatinib', for example, is a leukaemia treatment. Its manufacturer, Bristol-Myers Squibb, sells it to the NHS at 100 times what it costs to make.
Steel magnate Lakshi Mittal has suffered, now only worth £7.12 billion after his stake in steel crashed due to overcapacity in China. Oil barons and retail bosses have also lost out. The Socialist will be dropping round the UK's 1.68 million unemployed workers to see if they can spare a quid.
Trade Union Bill concessions made - now fight to scrap the lot!