text:
© Copyright by Joanna Stuart
Website created by Hannah Jung
Joanna Stuart is a photographic artist in New Haven, CT and New York City.
She explores innovative techniques to create collages formed by combining fragments of her photographs to reveal imaginary scenes and abstract designs. She also makes unaltered photographs of a wide range of subjects.
Joanna has shown her art in numerous venues. She had a solo gallery exhibit in New Haven, solo private exhibits in New Haven and Brooklyn, and a 2-year rotating solo exhibit in a New Haven café. She organized two additional solo exhibits inside the historic and beautifully restored Union Station in New Haven, and subsequently co-curated two small group exhibits in the train station. After four consecutive years, these annual art exhibits at Union Station have become a tradition. The New Haven Register and Shore Life featured Joanna's 2015-2016 exhibit of photographs at Union Station as the first art exhibit to be held in that busy public venue. Joanna's work was also selected for two National Juried Exhibits in NYC and one International Juried Exhibit in California, and was honored with the Juror's Choice Photograph in a Juried Group Exhibit in Vermont. Her work has been shown in Juried and Small Group Exhibits in New England states, Upstate NY, NYC, and California, in an online international art journal, as well as in a Massachusetts gallery's online photo exhibit. In addition, she participated in New Haven's Open Studio, contributed to a benefit exhibit for Visual AIDS in NYC, and was a winner in a photograph contest sponsored by Friends of East Rock Park, New Haven.
Joanna's works reside in homes in Australia, Canada, Denmark, Iceland, Israel, Portugal, the U.K., and throughout the U.S.
Joanna Stuart


text:
package com.streamsets.pipeline.stage.origin.salesforce;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.sforce.async.AsyncApiException;
import com.sforce.async.BatchInfo;
import com.sforce.async.BatchInfoList;
import com.sforce.async.BatchStateEnum;
import com.sforce.async.BulkConnection;
import com.sforce.async.ContentType;
import com.sforce.async.JobInfo;
import com.sforce.async.OperationEnum;
import com.sforce.async.QueryResultList;
import com.sforce.soap.partner.Connector;
import com.sforce.soap.partner.PartnerConnection;
import com.sforce.soap.partner.QueryResult;
import com.sforce.soap.partner.sobject.SObject;
import com.sforce.ws.ConnectionException;
import com.sforce.ws.ConnectorConfig;
import com.sforce.ws.SessionRenewer;
import com.sforce.ws.bind.XmlObject;
import com.streamsets.pipeline.api.BatchMaker;
import com.streamsets.pipeline.api.Record;
import com.streamsets.pipeline.api.StageException;
import com.streamsets.pipeline.api.base.BaseSource;
import com.streamsets.pipeline.lib.event.CommonEvents;
import com.streamsets.pipeline.lib.salesforce.BulkRecordCreator;
import com.streamsets.pipeline.lib.salesforce.ChangeDataCaptureRecordCreator;
import com.streamsets.pipeline.lib.salesforce.Errors;
import com.streamsets.pipeline.lib.salesforce.ForceConfigBean;
import com.streamsets.pipeline.lib.salesforce.ForceRecordCreator;
import com.streamsets.pipeline.lib.salesforce.ForceRepeatQuery;
import com.streamsets.pipeline.lib.salesforce.ForceSourceConfigBean;
import com.streamsets.pipeline.lib.salesforce.ForceUtils;
import com.streamsets.pipeline.lib.salesforce.PlatformEventRecordCreator;
import com.streamsets.pipeline.lib.salesforce.PushTopicRecordCreator;
import com.streamsets.pipeline.lib.salesforce.ReplayOption;
import com.streamsets.pipeline.lib.salesforce.SoapRecordCreator;
import com.streamsets.pipeline.lib.salesforce.SobjectRecordCreator;
import com.streamsets.pipeline.lib.salesforce.SubscriptionType;
import com.streamsets.pipeline.lib.util.ThreadUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.cometd.bayeux.Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import soql.SOQLParser;

import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.XMLEvent;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.atomic.AtomicBoolean;

public class ForceSource extends BaseSource {
  private static final long EVENT_ID_FROM_NOW = -1;
  private static final long EVENT_ID_FROM_START = -2;
  private static final String RECORD_ID_OFFSET_PREFIX = "recordId:";
  private static final String EVENT_ID_OFFSET_PREFIX = "eventId:";

  private static final Logger LOG = LoggerFactory.getLogger(ForceSource.class);
  private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
  private static final String REPLAY_ID = "replayId";
  private static final String AUTHENTICATION_INVALID = "401::Authentication invalid";
  private static final String META = "/meta";
  private static final String META_HANDSHAKE = "/meta/handshake";
  private static final String READ_EVENTS_FROM_NOW = EVENT_ID_OFFSET_PREFIX + EVENT_ID_FROM_NOW;
  private static final String SFORCE_ENABLE_PKCHUNKING = "Sforce-Enable-PKChunking";
  private static final String CHUNK_SIZE = "chunkSize";
  private static final String ID = "Id";
  private static final String START_ROW = "startRow";
  private static final String CONF_PREFIX = "conf";

  private static final String RECORDS = "records";

  static final String READ_EVENTS_FROM_START = EVENT_ID_OFFSET_PREFIX + EVENT_ID_FROM_START;
  private static final BigDecimal MAX_OFFSET_INT = new BigDecimal(Integer.MAX_VALUE);

  private final ForceSourceConfigBean conf;

  private PartnerConnection partnerConnection;
  private BulkConnection bulkConnection;
  private String sobjectType;

  // Bulk API state
  private BatchInfo batch;
  private JobInfo job;
  private QueryResultList queryResultList;
  private int resultIndex;
  private XMLEventReader xmlEventReader;
  private Set<String> processedBatches;
  private BatchInfoList batchList;

  // SOAP API state
  private QueryResult queryResult;
  private int recordIndex;

  private long lastQueryCompletedTime = 0L;

  private BlockingQueue<Message> messageQueue;
  private ForceStreamConsumer forceConsumer;
  private ForceRecordCreator recordCreator;

  private boolean shouldSendNoMoreDataEvent = false;
  private AtomicBoolean destroyed = new AtomicBoolean(false);
  private XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory();

  public ForceSource(
      ForceSourceConfigBean conf
  ) {
    this.conf = conf;

    xmlInputFactory.setProperty(XMLInputFactory.IS_COALESCING, true);
    xmlInputFactory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
    xmlInputFactory.setProperty(XMLInputFactory.SUPPORT_DTD, false);
  }

  // Renew the Salesforce session on timeout
  public class ForceSessionRenewer implements SessionRenewer {
    @Override
    public SessionRenewalHeader renewSession(ConnectorConfig config) throws ConnectionException {
      LOG.info("Renewing Salesforce session");

      try {
        partnerConnection = Connector.newConnection(ForceUtils.getPartnerConfig(conf, new ForceSessionRenewer()));
      } catch (StageException e) {
        throw new ConnectionException("Can't create partner config", e);
      }

      SessionRenewalHeader header = new SessionRenewalHeader();
      header.name = new QName("urn:enterprise.soap.sforce.com", "SessionHeader");
      header.headerElement = partnerConnection.getSessionHeader();
      return header;
    }
  }

  @Override
  protected List<ConfigIssue> init() {
    // Validate configuration values and open any required resources.
    List<ConfigIssue> issues = super.init();
    Optional
        .ofNullable(conf.init(getContext(), CONF_PREFIX))
        .ifPresent(issues::addAll);

    if (!conf.subscribeToStreaming && !conf.queryExistingData) {
      issues.add(
          getContext().createConfigIssue(
              Groups.FORCE.name(), ForceConfigBean.CONF_PREFIX + "queryExistingData", Errors.FORCE_00,
              "You must query existing data, subscribe for notifications, or both!"
          )
      );
    }

    if (conf.queryExistingData && conf.subscriptionType == SubscriptionType.PLATFORM_EVENT) {
      issues.add(
          getContext().createConfigIssue(
              Groups.FORCE.name(), ForceConfigBean.CONF_PREFIX + "queryExistingData", Errors.FORCE_00,
              "You cannot both query existing data and subscribe to a Platform Event!"
          )
      );
    }

    if (conf.queryExistingData) {
      if (conf.usePKChunking) {
        conf.offsetColumn = ID;
      }

      if (!conf.disableValidation) {
        SOQLParser.StatementContext statementContext = ForceUtils.getStatementContext(conf.soqlQuery);
        SOQLParser.ConditionExpressionsContext conditionExpressions = statementContext.conditionExpressions();
        SOQLParser.FieldOrderByListContext fieldOrderByList = statementContext.fieldOrderByList();

        if (conf.usePKChunking) {
          if (fieldOrderByList != null) {
            issues.add(getContext().createConfigIssue(Groups.QUERY.name(),
                ForceConfigBean.CONF_PREFIX + "soqlQuery", Errors.FORCE_31
            ));
          }

          if (conditionExpressions != null && checkConditionExpressions(conditionExpressions, ID)) {
            issues.add(getContext().createConfigIssue(Groups.QUERY.name(),
                ForceConfigBean.CONF_PREFIX + "soqlQuery",
                Errors.FORCE_32
            ));
          }

          if (conf.repeatQuery == ForceRepeatQuery.INCREMENTAL) {
            issues.add(getContext().createConfigIssue(Groups.QUERY.name(),
                ForceConfigBean.CONF_PREFIX + "repeatQuery", Errors.FORCE_33
            ));
          }
        } else {
          if (conditionExpressions == null || !checkConditionExpressions(conditionExpressions,
              conf.offsetColumn
          ) || fieldOrderByList == null || !checkFieldOrderByList(fieldOrderByList, conf.offsetColumn)) {
            issues.add(getContext().createConfigIssue(Groups.QUERY.name(),
                ForceConfigBean.CONF_PREFIX + "soqlQuery", Errors.FORCE_07, conf.offsetColumn
            ));
          }
        }
      }
    }

    if (issues.isEmpty()) {
      try {
        ConnectorConfig partnerConfig = ForceUtils.getPartnerConfig(conf, new ForceSessionRenewer());

        partnerConnection = new PartnerConnection(partnerConfig);
        if (conf.mutualAuth.useMutualAuth) {
          ForceUtils.setupMutualAuth(partnerConfig, conf.mutualAuth);
        }

        bulkConnection = ForceUtils.getBulkConnection(partnerConfig, conf);

        LOG.info("Successfully authenticated as {}", conf.username);

        if (conf.queryExistingData) {
          sobjectType = ForceUtils.getSobjectTypeFromQuery(conf.soqlQuery);
          LOG.info("Found sobject type {}", sobjectType);
          if (sobjectType == null) {
            issues.add(getContext().createConfigIssue(Groups.QUERY.name(),
                ForceConfigBean.CONF_PREFIX + "soqlQuery",
                Errors.FORCE_00,
                "Badly formed SOQL Query: " + conf.soqlQuery
            ));
          }
        }
      } catch (ConnectionException | AsyncApiException | StageException | URISyntaxException e) {
        LOG.error("Error connecting: {}", e);
        issues.add(getContext().createConfigIssue(Groups.FORCE.name(),
            ForceConfigBean.CONF_PREFIX + "authEndpoint",
            Errors.FORCE_00,
            ForceUtils.getExceptionCode(e) + ", " + ForceUtils.getExceptionMessage(e)
        ));
      }
    }

    if (issues.isEmpty() && conf.subscribeToStreaming) {
      switch (conf.subscriptionType) {
        case PUSH_TOPIC:
          setObjectTypeFromQuery(issues);
          break;
        case PLATFORM_EVENT:
          // Do nothing
          break;
        case CDC:
          sobjectType = conf.cdcObject;
          break;
      }

      messageQueue = new ArrayBlockingQueue<>(2 * conf.basicConfig.maxBatchSize);
    }

    if (issues.isEmpty()) {
      recordCreator = buildRecordCreator();
      try {
        recordCreator.init();
      } catch (StageException e) {
        issues.add(getContext().createConfigIssue(null, null, Errors.FORCE_34, e));
      }
    }

    // If issues is not empty, the UI will inform the user of each configuration issue in the list.
    return issues;
  }

  private void setObjectTypeFromQuery(List<ConfigIssue> issues) {
    String query = "SELECT Id, Query FROM PushTopic WHERE Name = '"+conf.pushTopic+"'";

    try {
      QueryResult qr = partnerConnection.query(query);

      if (qr.getSize() != 1) {
        issues.add(
            getContext().createConfigIssue(
                Groups.SUBSCRIBE.name(), ForceConfigBean.CONF_PREFIX + "pushTopic", Errors.FORCE_00,
                "Can't find Push Topic '" + conf.pushTopic +"'"
            )
        );
      } else if (null == sobjectType) {
        String soqlQuery = (String)qr.getRecords()[0].getField("Query");
        try {
          sobjectType = ForceUtils.getSobjectTypeFromQuery(soqlQuery);
          LOG.info("Found sobject type {}", sobjectType);
        } catch (StageException e) {
          issues.add(getContext().createConfigIssue(Groups.SUBSCRIBE.name(),
              ForceConfigBean.CONF_PREFIX + "pushTopic",
              Errors.FORCE_00,
              "Badly formed SOQL Query: " + soqlQuery
          ));
        }
      }
    } catch (ConnectionException e) {
      issues.add(
          getContext().createConfigIssue(
              Groups.FORCE.name(), ForceConfigBean.CONF_PREFIX + "authEndpoint", Errors.FORCE_00, e
          )
      );
    }
  }

  // Returns true if the first ORDER BY field matches fieldName
  private boolean checkFieldOrderByList(SOQLParser.FieldOrderByListContext fieldOrderByList, String fieldName) {
    return fieldOrderByList.fieldOrderByElement(0).fieldElement().getText().equalsIgnoreCase(fieldName);
  }

  // Returns true if any of the nested conditions contains fieldName
  private boolean checkConditionExpressions(
      SOQLParser.ConditionExpressionsContext conditionExpressions,
      String fieldName
  ) {
    for (SOQLParser.ConditionExpressionContext ce : conditionExpressions.conditionExpression()) {
      if ((ce.conditionExpressions() != null && checkConditionExpressions(ce.conditionExpressions(), fieldName))
          || (ce.fieldExpression() != null && ce.fieldExpression().fieldElement().getText().equalsIgnoreCase(fieldName))) {
        return true;
      }
    }

    return false;
  }

  private ForceRecordCreator buildRecordCreator() {
    if (conf.queryExistingData) {
      if (conf.useBulkAPI) {
        //IMPORTANT: BulkRecordCreator is not thread safe since it is using SimpleDateFormat
        return new BulkRecordCreator(getContext(), conf, sobjectType);
      } else {
        return new SoapRecordCreator(getContext(), conf, sobjectType);
      }
    } else if (conf.subscribeToStreaming) {
      switch (conf.subscriptionType) {
        case PUSH_TOPIC:
          return new PushTopicRecordCreator(getContext(), conf, sobjectType);
        case PLATFORM_EVENT:
          return new PlatformEventRecordCreator(getContext(), conf.platformEvent, conf);
        case CDC:
          return new ChangeDataCaptureRecordCreator(getContext(), conf, sobjectType);
      }
    }

    return null;
  }

  /** {@inheritDoc} */
  @Override
  public void destroy() {
    // SDC-6258 - destroy() is called from a different thread, so we
    // need to signal produce() to terminate early
    destroyed.set(true);

    if (job != null) {
      try {
        bulkConnection.abortJob(job.getId());
        job = null;
      } catch (AsyncApiException e) {
        LOG.error("Exception while aborting job", e);
      }
    }

    job = null;

    if (forceConsumer != null) {
      try {
        forceConsumer.stop();
        forceConsumer = null;
      } catch (Exception e) {
        LOG.error("Exception while stopping ForceStreamConsumer.", e);
      }

      if (!messageQueue.isEmpty()) {
        LOG.error("Queue still had {} entities at shutdown.", messageQueue.size());
      } else {
        LOG.info("Queue was empty at shutdown. No data lost.");
      }
    }

    if (recordCreator != null) {
      recordCreator.destroy();
    }

    // Clean up any open resources.
    super.destroy();
  }

  private String prepareQuery(String query, String lastSourceOffset) throws StageException {
    final String offset = (null == lastSourceOffset) ? conf.initialOffset : lastSourceOffset;
    SobjectRecordCreator sobjectRecordCreator = (SobjectRecordCreator)recordCreator;

    String expandedQuery;
    if (sobjectRecordCreator.queryHasWildcard(query)) {
      // Can't follow relationships on a wildcard query, so build the cache from the object type
      sobjectRecordCreator.buildMetadataCache(partnerConnection);
      expandedQuery = sobjectRecordCreator.expandWildcard(query);
    } else {
      // Use the query in building the cache
      expandedQuery = query;
      sobjectRecordCreator.buildMetadataCacheFromQuery(partnerConnection, query);
    }

    return expandedQuery.replaceAll("\\$\\{offset\\}", offset);
  }

  /** {@inheritDoc} */
  @Override
  public String produce(String lastSourceOffset, int maxBatchSize, BatchMaker batchMaker) throws StageException {
    String nextSourceOffset = null;

    LOG.debug("lastSourceOffset: {}", lastSourceOffset);

    // send event only once for each time we run out of data.
    if(shouldSendNoMoreDataEvent) {
      CommonEvents.NO_MORE_DATA.create(getContext()).createAndSend();
      shouldSendNoMoreDataEvent = false;
      return lastSourceOffset;
    }

    int batchSize = Math.min(conf.basicConfig.maxBatchSize, maxBatchSize);

    if (!conf.queryExistingData ||
        (null != lastSourceOffset && lastSourceOffset.startsWith(EVENT_ID_OFFSET_PREFIX))) {
      if (conf.subscribeToStreaming) {
        nextSourceOffset = streamingProduce(lastSourceOffset, batchSize, batchMaker);
      } else {
        // We're done reading existing data, but we don't want to subscribe to Streaming API
        return null;
      }
    } else if (conf.queryExistingData) {
      if (!queryInProgress()) {
        long now = System.currentTimeMillis();
        long delay = Math.max(0, (lastQueryCompletedTime + (1000 * conf.queryInterval)) - now);

        if (delay > 0) {
          // Sleep in one second increments so we don't tie up the app.
          LOG.info("{}ms remaining until next fetch.", delay);
          ThreadUtil.sleep(Math.min(delay, 1000));

          return lastSourceOffset;
        }
      }

      if (conf.useBulkAPI) {
        nextSourceOffset = bulkProduce(lastSourceOffset, batchSize, batchMaker);
      } else {
        nextSourceOffset = soapProduce(lastSourceOffset, batchSize, batchMaker);
      }
    } else if (conf.subscribeToStreaming) {
      // No offset, and we're not querying existing data, so switch to streaming
      nextSourceOffset = READ_EVENTS_FROM_NOW;
    }

    LOG.debug("nextSourceOffset: {}", nextSourceOffset);

    return nextSourceOffset;
  }

  private boolean queryInProgress() {
    return (conf.useBulkAPI && job != null) || (!conf.useBulkAPI && queryResult != null);
  }

  private String bulkProduce(String lastSourceOffset, int maxBatchSize, BatchMaker batchMaker) throws StageException {

    String nextSourceOffset = (null == lastSourceOffset) ? RECORD_ID_OFFSET_PREFIX + conf.initialOffset : lastSourceOffset;

    if (job == null) {
      // No job in progress - start from scratch
      try {
        String id = (lastSourceOffset == null) ? null : lastSourceOffset.substring(lastSourceOffset.indexOf(':') + 1);
        final String preparedQuery = prepareQuery(conf.soqlQuery, id);
        LOG.info("SOQL Query is: {}", preparedQuery);

        if (destroyed.get()) {
          throw new StageException(getContext().isPreview() ? Errors.FORCE_25 : Errors.FORCE_26);
        }
        job = createJob(sobjectType, bulkConnection);
        LOG.info("Created Bulk API job {}", job.getId());

        if (destroyed.get()) {
          throw new StageException(getContext().isPreview() ? Errors.FORCE_25 : Errors.FORCE_26);
        }
        BatchInfo b = bulkConnection.createBatchFromStream(job,
                new ByteArrayInputStream(preparedQuery.getBytes(StandardCharsets.UTF_8)));
        LOG.info("Created Bulk API batch {}", b.getId());
        processedBatches = new HashSet<>();
      } catch (AsyncApiException e) {
        throw new StageException(Errors.FORCE_01, e);
      }
    }

    // We started the job already, see if the results are ready
    // Loop here so that we can wait for results in preview mode and not return an empty batch
    // Preview will cut us off anyway if we wait too long
    while (queryResultList == null) {
      if (destroyed.get()) {
        throw new StageException(getContext().isPreview() ? Errors.FORCE_25 : Errors.FORCE_26);
      }

      try {
        // PK Chunking gives us multiple batches - process them in turn
        batchList = bulkConnection.getBatchInfoList(job.getId());
        for (BatchInfo batchInfo : batchList.getBatchInfo()) {
          if (batchInfo.getState() == BatchStateEnum.Failed) {
            LOG.error("Batch {} failed: {}", batchInfo.getId(), batchInfo.getStateMessage());
            throw new StageException(Errors.FORCE_03, batchInfo.getStateMessage());
          } else if (!processedBatches.contains(batchInfo.getId())) {
            if (batchInfo.getState() == BatchStateEnum.NotProcessed) {
              // Skip this batch - it's the 'original batch' in PK chunking
              // See https://developer.salesforce.com/docs/atlas.en-us.api_asynch.meta/api_asynch/asynch_api_code_curl_walkthrough_pk_chunking.htm
              LOG.info("Batch {} not processed", batchInfo.getId());
              processedBatches.add(batchInfo.getId());
            } else if (batchInfo.getState() == BatchStateEnum.Completed) {
              LOG.info("Batch {} completed", batchInfo.getId());
              batch = batchInfo;
              queryResultList = bulkConnection.getQueryResultList(job.getId(), batch.getId());
              LOG.info("Query results: {}", queryResultList.getResult());
              resultIndex = 0;
              break;
            }
          }
        }
        if (queryResultList == null) {
          // Bulk API is asynchronous, so wait a little while...
          try {
            LOG.info("Waiting {} milliseconds for job {}", conf.basicConfig.maxWaitTime, job.getId());
            Thread.sleep(conf.basicConfig.maxWaitTime);
          } catch (InterruptedException e) {
            LOG.debug("Interrupted while sleeping");
            Thread.currentThread().interrupt();
          }
          if (!getContext().isPreview()) { // If we're in preview, then don't return an empty batch!
            LOG.info("Job {} in progress", job.getId());
            return nextSourceOffset;
          }
        }
      } catch (AsyncApiException e) {
        throw new StageException(Errors.FORCE_02, e);
      }
    }

    if (xmlEventReader == null && queryResultList != null) {
      // We have results - retrieve the next one!
      String resultId = queryResultList.getResult()[resultIndex];
      resultIndex++;

      try {
        xmlEventReader = xmlInputFactory.createXMLEventReader(bulkConnection.getQueryResultStream(job.getId(), batch.getId(), resultId));
      } catch (AsyncApiException e) {
        throw new StageException(Errors.FORCE_05, e);
      } catch (XMLStreamException e) {
        throw new StageException(Errors.FORCE_36, e);
      }
    }

    if (xmlEventReader != null){
      int numRecords = 0;
      while (xmlEventReader.hasNext() && numRecords < maxBatchSize) {
        try {
          XMLEvent event = xmlEventReader.nextEvent();
          if (event.isStartElement() && event.asStartElement().getName().getLocalPart().equals(RECORDS)) {
            // SDC-9731 will refactor record creators so we don't need this downcast
            String offset = ((BulkRecordCreator) recordCreator).createRecord(xmlEventReader, batchMaker);
            nextSourceOffset = RECORD_ID_OFFSET_PREFIX + offset;
            ++numRecords;
          }
        } catch (XMLStreamException e) {
          throw new StageException(Errors.FORCE_37, e);
        }
      }

      if (!xmlEventReader.hasNext()) {
        // Exhausted this result - come back in on the next batch
        xmlEventReader = null;
        if (resultIndex == queryResultList.getResult().length) {
          // We're out of results, too!
          processedBatches.add(batch.getId());
          queryResultList = null;
          batch = null;
          if (processedBatches.size() == batchList.getBatchInfo().length) {
            // And we're done with the job
            try {
              bulkConnection.closeJob(job.getId());
              lastQueryCompletedTime = System.currentTimeMillis();
              LOG.info("Query completed at: {}", lastQueryCompletedTime);
            } catch (AsyncApiException e) {
              LOG.error("Error closing job: {}", e);
            }
            LOG.info("Partial batch of {} records", numRecords);
            job = null;
            shouldSendNoMoreDataEvent = true;
            if (conf.subscribeToStreaming) {
              // Switch to processing events
              nextSourceOffset = READ_EVENTS_FROM_NOW;
            } else if (conf.repeatQuery == ForceRepeatQuery.FULL) {
              nextSourceOffset = RECORD_ID_OFFSET_PREFIX + conf.initialOffset;
            } else if (conf.repeatQuery == ForceRepeatQuery.NO_REPEAT) {
              nextSourceOffset = null;
            }
          }
        }
      }
      LOG.info("Full batch of {} records", numRecords);
    }
    return nextSourceOffset;
  }

  private static XmlObject getChildIgnoreCase(SObject record, String name) {
    XmlObject item = null;
    Iterator<XmlObject> iter = record.getChildren();

    while(iter.hasNext()) {
      XmlObject child = iter.next();
      if(child.getName().getLocalPart().equalsIgnoreCase(name)) {
        item = child;
        break;
      }
    }

    return item;
  }

  private String soapProduce(String lastSourceOffset, int maxBatchSize, BatchMaker batchMaker) throws StageException {

    String nextSourceOffset = (null == lastSourceOffset) ? RECORD_ID_OFFSET_PREFIX + conf.initialOffset : lastSourceOffset;

    if (queryResult == null) {
      try {
        String id = (lastSourceOffset == null) ? null : lastSourceOffset.substring(lastSourceOffset.indexOf(':') + 1);
        final String preparedQuery = prepareQuery(conf.soqlQuery, id);
        LOG.info("preparedQuery: {}", preparedQuery);
        queryResult = conf.queryAll
            ? partnerConnection.queryAll(preparedQuery)
            : partnerConnection.query(preparedQuery);
        recordIndex = 0;
      } catch (ConnectionException e) {
        throw new StageException(Errors.FORCE_08, e);
      }
    }

    SObject[] records = queryResult.getRecords();

    LOG.info("Retrieved {} records", records.length);

    int endIndex = Math.min(recordIndex + maxBatchSize, records.length);

    for ( ;recordIndex < endIndex; recordIndex++) {
      SObject record = records[recordIndex];

      XmlObject offsetField = getChildIgnoreCase(record, conf.offsetColumn);
      if (offsetField == null || offsetField.getValue() == null) {
        throw new StageException(Errors.FORCE_22, conf.offsetColumn);
      }
      String offset = fixOffset(conf.offsetColumn, offsetField.getValue().toString());
      nextSourceOffset = RECORD_ID_OFFSET_PREFIX + offset;
      final String sourceId = conf.soqlQuery + "::" + offset;

      Record rec = recordCreator.createRecord(sourceId, record);

      batchMaker.addRecord(rec);
    }

    if (recordIndex == records.length) {
      try {
        if (queryResult.isDone()) {
          // We're out of results
          queryResult = null;
          lastQueryCompletedTime = System.currentTimeMillis();
          LOG.info("Query completed at: {}", lastQueryCompletedTime);
          shouldSendNoMoreDataEvent = true;
          if (conf.subscribeToStreaming) {
            // Switch to processing events
            nextSourceOffset = READ_EVENTS_FROM_NOW;
          } else if (conf.repeatQuery == ForceRepeatQuery.FULL) {
            nextSourceOffset = RECORD_ID_OFFSET_PREFIX + conf.initialOffset;
          } else if (conf.repeatQuery == ForceRepeatQuery.NO_REPEAT) {
            nextSourceOffset = null;
          }
        } else {
          queryResult = partnerConnection.queryMore(queryResult.getQueryLocator());
          recordIndex = 0;
        }
      } catch (ConnectionException e) {
        throw new StageException(Errors.FORCE_08, e);
      }
    }

    return nextSourceOffset;
  }

  // SDC-9078 - coerce scientific notation away when decimal field scale is zero
  // since Salesforce doesn't like scientific notation in queries
  private String fixOffset(String offsetColumn, String offset) {
    com.sforce.soap.partner.Field sfdcField = ((SobjectRecordCreator)recordCreator).getFieldMetadata(sobjectType, offsetColumn);
    if (SobjectRecordCreator.DECIMAL_TYPES.contains(sfdcField.getType().toString())
        && offset.contains("E")) {
      BigDecimal val = new BigDecimal(offset);
      offset = val.toPlainString();
      if (val.compareTo(MAX_OFFSET_INT) > 0 && !offset.contains(".")) {
        // We need the ".0" suffix since Salesforce doesn't like integer
        // bigger than 2147483647
        offset += ".0";
      }
    }
    return offset;
  }

  private void processMetaMessage(Message message, String nextSourceOffset) throws StageException {
    if (message.getChannel().startsWith(META_HANDSHAKE) && message.isSuccessful()) {
      // Need to (re)subscribe after handshake - see
      // https://developer.salesforce.com/docs/atlas.en-us.api_streaming.meta/api_streaming/using_streaming_api_client_connection.htm
      try {
        forceConsumer.subscribeForNotifications(nextSourceOffset);
      } catch (InterruptedException e) {
        LOG.error(Errors.FORCE_10.getMessage(), e);
        throw new StageException(Errors.FORCE_10, e.getMessage(), e);
      }
    } else if (!message.isSuccessful()) {
      String error = (String) message.get("error");
      LOG.info("Bayeux error message: {}", error);

      if (AUTHENTICATION_INVALID.equals(error)) {
        // This happens when the session token, stored in the HttpClient as a cookie,
        // has expired, and we try to use it in a handshake.
        // Just kill the consumer and start all over again.
        LOG.info("Reconnecting after {}", AUTHENTICATION_INVALID);
        try {
          forceConsumer.stop();
        } catch (Exception ex) {
          LOG.info("Exception stopping consumer", ex);
        }
        forceConsumer = null;
      } else {
        // Some other problem...
        Exception exception = (Exception) message.get("exception");
        LOG.info("Bayeux exception:", exception);
        throw new StageException(Errors.FORCE_09, error, exception);
      }
    }
  }

  @SuppressWarnings("unchecked")
  private String processDataMessage(Message message, BatchMaker batchMaker)
      throws IOException, StageException {
    String msgJson = message.getJSON();

    // PushTopic Message has the form
    // {
    //   "channel": "/topic/AccountUpdates",
    //   "clientId": "j17ylcz9l0t0fyp0pze7uzpqlt",
    //   "data": {
    //     "event": {
    //       "createdDate": "2016-09-15T06:01:40.000+0000",
    //       "type": "updated"
    //     },
    //     "sobject": {
    //       "AccountNumber": "3231321",
    //       "Id": "0013600000dC5xLAAS",
    //       "Name": "StreamSets",
    //       ...
    //     }
    //   }
    // }

    // Platform Event Message has the form
    //  {
    //    "data": {
    //      "schema": "dffQ2QLzDNHqwB8_sHMxdA",
    //      "payload": {
    //        "CreatedDate": "2017-04-09T18:31:40Z",
    //        "CreatedById": "005D0000001cSZs",
    //        "Printer_Model__c": "XZO-5",
    //        "Serial_Number__c": "12345",
    //        "Ink_Percentage__c": 0.2
    //      },
    //      "event": {
    //        "replayId": 2
    //      }
    //    },
    //    "channel": "/event/Low_Ink__e"
    //  }

    LOG.info("Processing message: {}", msgJson);

    Object json = OBJECT_MAPPER.readValue(msgJson, Object.class);
    Map<String, Object> jsonMap = (Map<String, Object>) json;
    Map<String, Object> data = (Map<String, Object>) jsonMap.get("data");
    Map<String, Object> event = (Map<String, Object>) data.get("event");
    Map<String, Object> sobject = (Map<String, Object>) data.get("sobject");

    final String sourceId = (conf.subscriptionType == SubscriptionType.PUSH_TOPIC)
      ? event.get("createdDate") + "::" + sobject.get("Id")
      : event.get("replayId").toString();

    Record rec = recordCreator.createRecord(sourceId, Pair.of(partnerConnection, data));

    batchMaker.addRecord(rec);

    return EVENT_ID_OFFSET_PREFIX + event.get(REPLAY_ID).toString();
  }

  private String streamingProduce(String lastSourceOffset, int maxBatchSize, BatchMaker batchMaker) throws StageException {
    String nextSourceOffset;
    if (getContext().isPreview()) {
      nextSourceOffset = READ_EVENTS_FROM_START;
    } else if (null == lastSourceOffset) {
      if (conf.subscriptionType == SubscriptionType.PLATFORM_EVENT &&
          conf.replayOption == ReplayOption.ALL_EVENTS) {
        nextSourceOffset = READ_EVENTS_FROM_START;
      } else {
        nextSourceOffset = READ_EVENTS_FROM_NOW;
      }
    } else {
      nextSourceOffset = lastSourceOffset;
    }

    if (conf.subscriptionType == SubscriptionType.PUSH_TOPIC && !(recordCreator instanceof PushTopicRecordCreator)) {
      recordCreator = new PushTopicRecordCreator((SobjectRecordCreator)recordCreator);
    }

    if (recordCreator instanceof SobjectRecordCreator) {
      SobjectRecordCreator sobjectRecordCreator = (SobjectRecordCreator)recordCreator;
      if (!StringUtils.isEmpty(sobjectType) && !sobjectRecordCreator.metadataCacheExists()) {
        sobjectRecordCreator.buildMetadataCache(partnerConnection);
      }
    }

    if (forceConsumer == null) {
      // Do a request so we ensure that the connection is renewed if necessary
      try {
        partnerConnection.getUserInfo();
      } catch (ConnectionException e) {
        LOG.error("Exception getting user info", e);
        throw new StageException(Errors.FORCE_19, e.getMessage(), e);
      }

      forceConsumer = new ForceStreamConsumer(messageQueue, partnerConnection, conf);
      forceConsumer.start();
    }

    if (getContext().isPreview()) {
      // Give waiting messages a chance to arrive
      ThreadUtil.sleep(1000);
    }

    // We didn't receive any new data within the time allotted for this batch.
    if (messageQueue.isEmpty()) {
      // In preview, we already waited
      if (! getContext().isPreview()) {
        // Sleep for one second so we don't tie up the app.
        ThreadUtil.sleep(1000);
      }

      return nextSourceOffset;
    }

    // Loop if we're in preview mode - we'll get killed after the preview timeout if no data arrives
    boolean done = false;
    while (!done) {
      List<Message> messages = new ArrayList<>(maxBatchSize);
      messageQueue.drainTo(messages, maxBatchSize);

      for (Message message : messages) {
        try {
          if (message.getChannel().startsWith(META)) {
            // Handshake, subscription messages
            processMetaMessage(message, nextSourceOffset);
          } else {
            // Yay - actual data messages
            nextSourceOffset = processDataMessage(message, batchMaker);
            done = true;
          }
        } catch (IOException e) {
          throw new StageException(Errors.FORCE_02, e);
        }
      }
      if (!done && getContext().isPreview()) {
        // In preview - give data messages a chance to arrive
        if (!ThreadUtil.sleep(1000)) {
          // Interrupted!
          done = true;
        }
      } else {
        done = true;
      }
    }

    return nextSourceOffset;
  }

  private JobInfo createJob(String sobjectType, BulkConnection connection)
          throws AsyncApiException {
    JobInfo job = new JobInfo();
    job.setObject(sobjectType);
    job.setOperation((conf.queryAll && !conf.usePKChunking) ? OperationEnum.queryAll : OperationEnum.query);
    job.setContentType(ContentType.XML);
    if (conf.usePKChunking) {
      String headerValue = CHUNK_SIZE + "=" + conf.chunkSize;
      if (!StringUtils.isEmpty(conf.startId)) {
        headerValue += "; " + START_ROW + "=" + conf.startId;
      }
      connection.addHeader(SFORCE_ENABLE_PKCHUNKING, headerValue);
    }
    job = connection.createJob(job);
    return job;
  }
}

redpajama_set_name: RedPajamaGithub


text:
1 | 2 | 3 | 4 | 5 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z
Lab on a Chip - Miniaturisation for Chemistry and Biology (1)
Lakes & Reservoirs: Research & Management (1)
Language & Communication (1)
Language in India (1)
Language Problems and Language Planning (1)
Language Resources and Evaluation (1)
Language Sciences (2)
Laser Physics (86)
Laser Physics Letters (44)
Lasers in Engineering (4)
Lasers in Medical Science (1)
Lasers in Surgery and Medicine (1)
Latin American Journal of Pharmacy (2)
Latin American Journal of Solids and Structures (4)
Leadership & Organization Development Journal (1)
Learned Publishing (3)
Lecture notes of the Institute for Computer Sciences, Social Informatics and Telecommunications Engineering (1)
Legal Medicine (1)
Legume Research (1)
Leiden Journal of International Law (1)
Let Software (1)
Letters in Applied Microbiology (1)
Letters in Drug Design & Discovery (1)
Leukemia Research (2)
LGBT Health (3)
Library Collections Acquisitions & Technical Services (1)
Library & Information Science Research (1)
Library Management (2)
Library Review (1)
Libres: Library and Information Science Research Electronic Journal (1)
Life Science Journal (10)
Lighting Research & Technology (1)
Linear Algebra and its Applications (4)
Linear & Multilinear Algebra (1)
Linguistics Journal (1)
Lipids (1)
Lipids in Health and Disease (2)
Liquid Crystals (6)
lrlalaysian Journal of Lihrary & Information Science (1)
Luminescence (1)
LWT (6)

redpajama_set_name: RedPajamaCommonCrawl


Pit Bulls have gotten the unfair reputation of being violent dogs. In shelters, they are often the last to be adopted and the first to be euthanized and they are subjected to the horrors of the dog fighting industries by cruel humans. If that wasn't enough, several cities have worked hard to enforce breed-specific legislation (BSL), which essentially makes it illegal for people to keep Pit Bulls and other bully breeds as pets. Not only is this a waste of money, but it has also been proven that BSL doesn't work to prevent dog bites. As animal lovers, we know that just like any other dog, Put Bulls in the right environment are loving, loyal animals who will go above and beyond to make their guardians happy. In fact, according to the American Temperament Testing Society, Inc., the American Pit Bull Terriers achieved a score of 86.8 percent in a temperament test, which is better than Collies, Golden Retrievers, and Beagles.
There are also some shining examples of gold star-worthy Pit Bulls in popular culture. Petey, the Pit Bull with the signature ring around his eye from the 1920s silent short films The Little Rascals, was a trusted companion to a gang trouble making children. Wherever they went, Petey went, and they never had a problem with sudden outbursts of monstrous violence. In Flashdance, Alex finds emotional support and a constant friend in Grunt, her big brown Pit Bull. And let's not forget Champion, the "half amazing, half terrific" three-legged Pit Bull mix in NBC's Parks and Recreation — nope, he never mauled anybody. There are also plenty of Instagrams out there run by proud Pit Bull guardians that help show how wonderful these dogs really are. The photos below come from Instagram user murphyandsissy, who posts daily photos of her adopted Pit Bulls and their human sibling, Maddox — and oh, are they cute.
Contrary to popular belief, Pit Bulls can be very sweet. One of Sissy's favorite pastimes is hanging out with Maddox.
Murphy also likes to spend some quality time with his favorite human.
Still think Pit Bulls are scary? They were once called "nanny dogs" due to their loyalty and gentleness around children.
Nothing about this squishy duo looks dangerous.
Got those warm and fuzzy feels yet? Yes, us too.
Doggie nose boops are pretty much the cure for everything!
These photos just go to show you what amazing family dogs Pit Bulls can be. But like all dogs, Pit Bulls need a responsible guardian to teach them the ropes of living in a house, especially one with little kids. It is also important to emphasize the fact that all parents should supervise their children when they are interacting with dogs. To learn more about how you can help teach your kids and pups to behave around one another, click here.
If you're considering welcoming a dog into your life, remember to always adopt and never shop! For more from Murphy and Sissy, check out their Instagram here.
To one green planet or webmaster, the recent posts at the bottom of the page are dead the links don`t work so i can`t view the post, just to let you know.
They are just like humans. Some are good, some are bad. I would wager that most are far more good than their human counterparts. This anti-pitbull stuff is just racism applied to dogs.


This story originally appeared in the Fall 2018 edition of The George-Anne Reflector Magazine.
Rachel Hartmann is a prop master of theater at Georgia Southern University (GS). She is a junior theater major from Rincon, Georgia and is 20 years old. As prop master, her job is to read through scripts of plays, determine what props are needed and bring them to the director.
Hartmann balances schoolwork, her job and theater work. While this is stressful, she appreciates learning time management and looks forward to when she can work on her passion full-time. She considers the outcome to be a worthwhile payoff, especially when deadlines and accuracy can be a struggle. In her free time, she likes to work on puppets and ideas of her own.
In her future career in theater, Rachel hopes to work with puppetry, but she would be content to continue work as a prop master for a production company. She believes that puppetry can bring more to the stage and is capable of adding another layer of realism to a play.
An apprenticeship with Bread and Puppets, a politically radical theater company that has been around since the 1960s, has been something Rachel has been interested in for a long time. She hopes to do something impactful with her work, just as Bread and Puppets has in the past when marching in the parades against the Vietnam War. She's unsure exactly how to make a big impact on the world, but she's always thinking about her next project.


If chicken noodle soup is food for the soul then laughter is the medicine. Everybody enjoys a good hearty chuckle every now and then and no matter how serious life can get, you can never take yourself so seriously to the point where you miss out on the laughs. That sentiment is understood throughout The Boombox office, as we bellyache our way through the day striving to deliver the best content relating to the latest in hip-hop and R&B.
While we usually keep the laughs in house for the most part, we decided it's only right to let our readers in on the fun and share a few of the best tweets we came across this past week. If you know anything about social media then you're well aware that anything and anyone is fair game, including the biggest names in all of music.
Memes, gifs, you name it and it was probably utilized in the Twitter denizens' verbal attack and wisecracks on some of your favorites singers. Last week we gave you the hip-hop edition, but this time we're back with the re-up so without further ado, we present 20 Hilarious R&B Tweets Guaranteed to Keep You Entertained.


text:
CyberDefender Raises Expansion Funds
By Deborah Crowe
CyberDefender Corp. on Tuesday announced it has received $5 million in debt financing from an affiliate of direct marketing giant Guthy-Renker LLC.
CyberDefender, based in Los Angeles, makes software for PC security, antispyware-antivirus, PC optimization and identity theft prevention.
"This capital strengthens our balance sheet and will enable us to fund accelerated growth throughout 2010," said Chief Executive Gary Guseinov in a press release. "With Guthy-Renker's support over the last year we have dramatically increased our marketing reach with radio and television advertising."
Guthy-Renker, based in Santa Monica, is best known for its TV infomercials that market everything from self-help programs to skin care. It was an early investor in CyberDefender through its GR Match LLC affiliate.
"We believe there are unrealized opportunities in the market for Internet security software," said Guthy-Renker Co-CEO Ben Van de Bunt.
CyberDefender shares were up 10 cents, or 2.5 percent, to $4.10 in midday trading on the Over-the-Counter Bulletin Board.
CyberDefender Files Chapter 11, To Sell to Guthy-Renker
Software Maker Calls for Growth
Cyberdefender to Lay Off Up to 307 Workers
Regional Report
Security Software Maker Sheds Chief Exec, Staff
Software Security Firm Cries En Garde


text:
#include <limits>
#include <type_traits>

/*
 * Member function definitions of Analog template class.
 * See analog.h for template class declaration.
 */

template <size_t N>
event_source_t Analog<N>::adc_event_source;

template <size_t N>
Analog<N>::Analog() : m_adc_buffer() { }

template <size_t N>
void Analog<N>::start(gptcnt_t sample_rate, bool use_events) {
#ifdef STATIC_SIMULATOR_CONFIG
    /*
     * We manually toggle the Kistler torque sensor measurement line
     * since the output will not be valid unless measurement is enabled _after_
     * the torque sensor is powered on. The analog signal is read from ADC13.
     */
    palClearLine(LINE_TORQUE_MEAS_EN);
    chThdSleepMilliseconds(100);
    palSetLine(LINE_TORQUE_MEAS_EN);
#endif // STATIC_SIMULATOR_CONFIG
    gptStart(&GPTD8, &gpt8cfg1);
    adcStart(&ADCD1, nullptr);
    if (use_events) {
        adcStartConversion(&ADCD1, &adcgrpcfg_events,
                m_adc_buffer.data(), m_adc_buffer_depth);
    } else {
        adcStartConversion(&ADCD1, &adcgrpcfg,
                m_adc_buffer.data(), m_adc_buffer_depth);
    }
    gptStartContinuous(&GPTD8, gpt8cfg1.frequency/sample_rate);
}

template <size_t N>
void Analog<N>::stop() {
    gptStopTimer(&GPTD8);
    adcStopConversion(&ADCD1);
    adcStop(&ADCD1);
    gptStop(&GPTD8);
}

template <size_t N>
template <typename T>
T Analog<N>::average_adc_conversion_value(sensor_t channel, T divisor) const {
#ifdef STATIC_SIMULATOR_CONFIG
    channel = static_cast<sensor_t>(static_cast<std::underlying_type_t<sensor_t>>(channel) - 1);
#endif // STATIC_SIMULATOR_CONFIG
    static_assert(4096 * N < std::numeric_limits<adcsample_t>::max(),
            "Template parameter N may result in ADC buffer sum overflow.");
    T sum = static_cast<T>(m_adc_buffer[channel]);
    for (unsigned int i = 1; i < m_adc_buffer_depth; ++i) {
        sum += static_cast<T>(m_adc_buffer[channel + i*m_adc_num_channels]);
    }
    return sum/divisor;
}

template <size_t N>
template <typename T>
T Analog<N>::get_adc10(T divisor) const {
    //return m_adc_buffer[sensor_t::ADC10];
#ifdef STATIC_SIMULATOR_CONFIG
    return 0;
#else // STATIC_SIMULATOR_CONFIG
    return average_adc_conversion_value(sensor_t::ADC10, divisor);
#endif // STATIC_SIMULATOR_CONFIG
}

template <size_t N>
template <typename T>
T Analog<N>::get_adc11(T divisor) const {
    //return m_adc_buffer[sensor_t::ADC11];
    return average_adc_conversion_value(sensor_t::ADC11, divisor);
}

template <size_t N>
template <typename T>
T Analog<N>::get_adc12(T divisor) const {
    //return m_adc_buffer[sensor_t::ADC12];
    return average_adc_conversion_value(sensor_t::ADC12, divisor);
}

template <size_t N>
template <typename T>
T Analog<N>::get_adc13(T divisor) const {
    //return m_adc_buffer[sensor_t::ADC13];
#ifdef STATIC_SIMULATOR_CONFIG
    return average_adc_conversion_value(sensor_t::ADC13, divisor);
#else // STATIC_SIMULATOR_CONFIG
    return 0;
#endif // STATIC_SIMULATOR_CONFIG
}

template <size_t N>
void Analog<N>::adcerrorcallback(ADCDriver* adcp, adcerror_t err) {
    (void)adcp;
    (void)err;
    chSysLockFromISR();
    chEvtBroadcastFlagsI(&Analog<N>::adc_event_source, adc_eventflag_error);
    chSysUnlockFromISR();
}

template <size_t N>
void Analog<N>::adccallback(ADCDriver* adcp, adcsample_t* buffer, size_t n) {
    (void)adcp;
    (void)buffer;
    (void)n;
    chSysLockFromISR();
    chEvtBroadcastFlagsI(&Analog<N>::adc_event_source, adc_eventflag_complete);
    chSysUnlockFromISR();
}

template <size_t N>
constexpr ADCConversionGroup Analog<N>::adcgrpcfg_events;

template <size_t N>
constexpr ADCConversionGroup Analog<N>::adcgrpcfg;

template <size_t N>
constexpr GPTConfig Analog<N>::gpt8cfg1;


Expanded Polystyrene ( eps ) is the the most Versatile and inexpensive packaging medium available on the packaging market today.
Clean, Flexible and lightweight, Polystyrene ( eps ) is manufactured in a range of densities to suit most packaging and insulation applications.
State of the art cutting techniques are used throughout our manufacturing process. This guarantees excellent tolerances and surface finishes across the whole range of polystyrene products we offer.
Loose Fill Various Standard Recycled Expanded Polystyrene Low Cost, Packaging Void Fill for irregular Shaped items.
Expanded & Extruded Polystyrene's are available in a range of different densities ( 10 – 40kg/m3 ) . A light weight cost effective packaging & insulation material used across a wide range of industries and packaging applications. Flame retardant materials are available at no extra cost, and are manufactured to using flame retardant in line with BS.3837 Part 1.


text:
You are looking at 1 - 10 of 82 items for :
"childhood" x
Sort by RelevanceArticle Title - A to ZArticle Title - Z to APublication - A to ZPublication - Z to AAuthor - A to ZAuthor - Z to ADate - Old to RecentDate - Recent to Old
Page:123456789
The Changing Nature of Childhood and Boyhood
A Metabletic Study
Bertha Mook
Although there is a realization in Western society today that childhood is changing, the topic remains clouded in confusion and contradictory viewpoints. The central question, if and how the nature of childhood itself has changed, has led the author to conduct a metabletic inquiry. Metabletics or the science of change is a human science research approach that incorporates phenomenological methods and seeks to understand a phenomenon by taking its historical development, its social cultural context and relevant synchronistic developments into account. In exploring the changing nature of childhood, historical, metabletic, and phenomenological studies were consulted as well as some selected sources from literature, art, and entertainment that portray the lives of children and, in particular, of boys in the past and in the present. First, a brief historical perspective on the changing nature of childhood from traditional to modern times is presented. This is followed by the concept of modern childhood and its transition to a postmodern childhood. The author aims to describe the essential characteristics of childhood with a focus on boyhood as lived in different historical time periods in order to contribute to a clearer understanding of its changing nature. The present study is exploratory and opens a vast domain that awaits further detailed investigations.
In Boyhood Studies
Childhood and Cinema
Bonnie S. Kaufman
Review of Vicky Lebeau, CHILDHOOD AND CINEMA
From American Girls into American Women
A Discussion of American Girl Doll Nostalgia
Molly Brookfield
The American Girl brand of historical dolls and books celebrated its twenty-fifth anniversary in 2011. The girls who first played with American Girl dolls in the 1980s and 1990s are now grown women; their nostalgia for the brand is passionate and complicated, and reminiscences from nineteen such women are the focus of this study. Their nostalgic responses are thoughtful and reflective, at turns unabashedly admiring and astutely critical. The women fondly recall American Girl whilst simultaneously criticizing the company for its consumerism and its representations of American history and American girlhood. Their memories show how nostalgia can be ambivalent and contradictory, and how adults can use childhood nostalgia to reinforce and construct identity narratives.
Imperialism and Nationhood in Children's Books in Colonial Bengal
Gargi Gangopadhyay
This article examines perceptions of colonial modernity as experienced by middle-class Bengali children in Calcutta at the turn of the twentieth century. This was the time in which the foundations of modern Calcutta and modern Bengali childhood were laid, and in which urban cultures of education and entertainment gradually replaced precolonial patterns of childhood. This article examines these transformations and assesses their role in the formation of new social norms that were to define middle-class Bengali childhood until the end of the twentieth century.
In Journal of Educational Media, Memory, and Society
Children's Sociality
The Civilizing Project in the Danish Kindergarten
Karen Fog Olwig
The increasing institutionalization of childhood in Western societies has generated concern in the social sciences regarding the disciplinary and regulating regimes of institutions and their presumed constraints on children's social interaction. This article argues that institutions for children can also enable such social interaction. Drawing on Norbert Elias's proposal that child rearing entails a civilizing project, this article contends that being 'not-yet-civilized' enables children to draw on a wide range of emotions and bodily expressions that are unavailable to adults. Through an analysis of life stories narrated by Danish youths, it is shown that common grounds of interaction were established in early childhood, allowing them to turn this adultconstructed institution into a place of their own where they could develop a sense of sociality.
In Social Analysis
Changes in Moral Values about the Family
Adoption Legislation in Norway and the US
Signe Howell
Legislation about personal behavior, such as family law, clearly manifests concerns about individual and relational rights and duties. With a focus on adoption laws in Norway and the US and on two international conventions (the UN Convention on the Rights of the Child and the Hague Convention on Intercountry Adoption), I examine different cultural values regarding childhood and parenthood, both historically and comparatively. Accompanying the recent growth of transnational adoption in Western Europe and North America, issues about what might constitute 'the best interest of the child' have become central in influential welfare circles of European countries that receive children in adoption and are reflected on a global level through the conventions.
The Value of Anthropology in Child Health Policy
Julie Spray
Working at the nexus of medical anthropology and the anthropology of childhood, this article challenges three assumptions often embedded in child health policy: (1) children are the passive recipients of healthcare; (2) children's knowledge of illness and their body can be assumed based on adult understandings; and (3) children's healthcare can be isolated from their social relations. I explore these themes through the case study of a 2011 New Zealand government initiative to reduce the rates of rheumatic fever affecting low-income Māori and Pasifika children. Drawing on fieldwork with around 80 children at an Auckland primary school, I show how the 'sore throat' programme does not merely treat streptococcus A infections, but plays an active role in constituting children's experiences and understandings of their bodies and illness, and in shaping healthcare practices in ways unintended by policy-makers.
In Anthropology in Action
A Brief History of Childhood in Boir Ahmad, Iran
Erika Friedl
Ideas about childhood and children's experiences in a tribal area in southwest Iran have been changing along with major local sociopolitical relations over the past century quite in accordance with the functionalist model of education and socialization. However, in the most recent stage – a globalizing, consumer-driven society in a closed, totalitarian political system – child-rearing prepares children to have great aspirations and be dedicated consumers without furnishing opportunities and habits to attain the one and sustain the other. The ethnographic details about this development described in this article in the format of three stages are based on longitudinal anthropological fieldwork in Boir Ahmad over 50 years.
In Anthropology of the Middle East
Girls, Bodies and Romance in the Light of a Presumed Sexualization of Childhood
Mari Rysst
The article is based on ethnographic fieldwork in two field sites in Oslo, Norway, that involved a sample of sixty-seven children. I discuss how ten year-old girls do gender and romance in the light of "junior" and "senior" (hetero)sexuality in the social context of romance. Considering the Norwegian media's worry concerning a presumed sexualization of childhood and the disappearance of childhood, I describe in detail what happens between partners in what is known as a going-out-with-relationship. These relationships, primarily characterized by play and not by physical intimacy, illustrate that sexual innocence in childhood still exists.
The Representation of Childhood in Ethnographic Films of Siberian Indigenous Peoples
The Case of the Documentary Film Malen'kaia Katerina (Tiny Katerina)
Ivan Golovnev and Elena Golovneva
This article investigates the representation of childhood in ethnographic films among the indigenous peoples of the Russian North. The article focuses on the documentary film Malen'kaia Katerina (Tiny Katerina; Ivan Golovnev 2004), which depicts the childhood of a Khanty girl in northwestern Siberia. The article employs the concept of ethnocinema as a synthesis of scientific and aesthetic approaches for perceiving and understanding traditional culture. Based on field diary recordings, reflections on the anthropological knowledge of childhood are represented via the audiovisual medium. Particular attention is paid to the visual representation of the world of childhood in traditional Khanty culture, including the child's relation to nature, the world of adults, games, and the development of gender identity.
In Sibirica


The latest release of Kiwitrees is now available from the downloads page at kiwitrees.net. This is a maintenance release of mainly bug fixes and a few small improvements.
Security, SSL and HTTPS are three words that confuse many people. are ignored by many people. but are vital to the wellbeing of your family history data. They have always been mentioned in kiwitrees installation instructions but now might be the right time to act on the suggestions there.
With the summer / Christmas holidays now behind us, progress has begun again on kiwitrees-nova, so time for another update.
One of the first developments is the choice of the third (and final, for now at least), "standard" theme. This one is Kaponga, which you can see on the right of this page. Its name translates commonly as just "silver fern", instantly recognisable as the emblem of the New Zealand All Blacks rugby team, and the name of our world-beating ladies netball team the Silver Ferns.


Severe tropical Cyclone Trevor, which authorities estimate is bigger than the state of Victoria, is set to cross the Northern Territory coast this morning.
Meanwhile WA's Pilbara region is also bracing for Cyclone Veronica to make landfall. The system is expected to cross the coast somewhere between Port Hedland and Karratha this afternoon or tomorrow morning.


Dodge wiring diagrams Try a chiltons manual at your local library or another repair manual such as haynes. They tend to be somewhat generic at times but sometimes good in a pinch. There are dealerships that will give The autel chrysler 128 obdii connector cable part number ms chry128 is designed for chrysler dodge jeep fiat and alfa Over at the mustang6g fan forum member quotzackmd1quot posted what appear to be two wiring diagrams for the gt500s engine that driving the original 1971 dodge demon behind the wheel driving the.
Dodge wiring diagrams 318 belt diagram mystery i have an 87 dodge 4wd pickup with a 318. No one on this planet has a diagram. I ve checked at least a 100 sites with no luck this may sound sarcastic but have you looked He knew exactly what i needed says george. Diagrams wiring parts fittings and most of all one on one technical help over the phone. Mark explained that dodge designed their electrical system The final engine integration was the most time consuming and after pouring over wiring diagrams from a chiltons manual for using a throttle position assembly from an earlier dodge ram to change.
Dodge wiring diagrams Fords been in the motorhome chassis business for decades with their econoline later e series cab and chassis platform similar to offerings from dodge and gm it also is likely to bring up Maybe a 68 dodge coronet over an 07 charger all mounted on crash tested brackets with part numbers and factory wiring diagrams that actually mean something dont those modern shock towers look But when something goes wronga flat tire or an electrical problemsome of them throw up their hands and call in the cavalry which arrives in the form of a tow truck or a buddy with a trailer and.
Then a few days after christmas a poster from that same fan forum found what looked like official wiring diagrams of the gt500s engine driving the original 1971 dodge demon behind the wheel.
It's possible to get or download caterpillar-wiring diagram from several websites. If you take a close look at the diagram you will observe the circuit includes the battery, relay, temperature sensor, wire, and a control, normally the engine control module. With an extensive collection of electronic symbols and components, it's been used among the most completed, easy and useful wiring diagram drawing program. Dodge Wiring Diagrams. The wiring diagram on the opposite hand is particularly beneficial to an outside electrician. Sometimes wiring diagram may also refer to the architectural wiring program. The simplest approach to read a home wiring diagram is to begin at the source, or the major power supply. Basically, the home wiring diagram is simply utilized to reveal the DIYer where the wires are.
In a parallel circuit, each unit is directly linked to the power supply, so each system gets the exact voltage. There are 3 basic sorts of standard light switches. The circuit needs to be checked with a volt tester whatsoever points. Dodge Wiring Diagrams. Each circuit displays a distinctive voltage condition. You are able to easily step up the voltage to the necessary level utilizing an inexpensive buck-boost transformer and steer clear of such issues. The voltage is the sum of electrical power produced by the battery. Be sure that the new fuse isn't blown, and carries the very same amperage.
The control box may have over three terminals. After you have the correct size box and have fed the cable to it, you're almost prepared to permit the wiring begin. Then there's also a fuse box that's for the body controls that is situated under the dash. Dodge Wiring Diagrams. You will find that every circuit has to have a load and every load has to have a power side and a ground side. Make certain that the transformer nameplate power is enough to supply the load that you're connecting.
Dodge wiring harness dodge stratus electrical diagrams dodge 7 pin wiring diagram vactor wiring diagrams 1995 southwind storm p 30 wiring diagram 1976 dodge truck wiring diagram volvo wiring diagrams dodge headlight switch wiring diagram.


This carrot cake recipe has just the right amount of cinnamon spice combined with raisins and chopped pecans to make the perfect mix of cookie and cake.
Making vegetable noodles is a great way to trick yourself into thinking that you're eating regular noodles since wheat noodles are not considered paleo.
This week in science: taking nutritional supplements can't prevent depression, a video of a droplet doing something you've never seen water do, and researchers predicted people's choices before they made them.


Congratulations to our top winners from the April Online ZIML Competition held April 6th-8th, 2018.
We hope all of you join us at the ZIML International Convention in August! More details can be found by clicking here.


Thinking about a mailshop to partner with to just take an order and fulfill? Think again! WordTech wants to get upstream on your client projects. Meeting with customers well in advance of mailings is one of our priorities. From planning to production to tracking, we'll cover all your bases. And, the post-production follow up and results will turn your new clients into loyal customers.
We want to know your direct marketing campaign goals. Discussing the message, the audience, and the timing in advance allows us to offer our expertise, help plan and schedule a campaign that will run smoothly and deliver results.
The project is in-house. It's time to beat the deadline. We look at it like a contest. Winning means "out the door, correct and on time" and losing isn't on our menu.
After the mail hits homes, the fun and the results really begin. By deploying a host of enhancements, we can increase your customer's results via phone call tracking and recording, Google display ad campaigns and social media follow up display ads. Then, we analyze the results to gain insights and make your future campaigns even better.


text:
Packback Takes on $1.5M in New Funding
CHICAGO, IL, Packback adds $1.5 million of new capital.
ClearMetal Secures $9M Series A Funding
SAN FRANCISCO, CA, Predictive logistics company, announced today that it has secured a $9 million series A funding.
Patreon Raises $60M Series C Round
PALO ALTO, CA, Patreon announced it has raised a $60 million Series C round of funding.
ViralGains Lands $13.5M
BOSTON, MA, ViralGains, the industry's only video advertising journey platform, today announced it has secured a total of $13.5 million in Series B equity and debt funding.
System1 Announces $270M Financing
VENICE, CA, System1, a developer of a pre-targeting platform for identifying consumer intent, raised $270 million in funding.
Activehours Raises $39M
PALO ALTO, CA, Activehours, a smartphone-based application that enables hourly workers to get paid early, raised $39 million in funding.
Pymetrics Receives $8M Series A Financing
NEW YORK, NY, Pymetrics, a neuroscience-based assessment and prediction technology platform, raised $8 million in additional Series A funding.
Tuition.io Receives $7M in Series B Funding
SANTA MONICA, CA, Tuition.io, the nation's first and most comprehensive employer-funded student loan repayment assistance platform, announced today a $7 million Series B funding.
Webgility Grabs $6.4M Series A Round
SAN FRANCISCO, CA, Webgility today announced that it has raised $6.4 million in a Series A funding.
Verkada Nabs $3.9M Seed Round
SAN MATEO, CA, Verkada, an enterprise physical security company, raised $3.9 million in seed funding.
FoodLogiQ Completes Series B Round
DURHAM, N.C., FoodLogiQ, a SaaS provider of traceability, food safety and supply chain transparency solutions, raised funding of an undisclosed amount.
Realm Secures New Investment
SAN FRANCISCO, CA, Realm, the world's most popular real-time mobile platform, today announced a strategic investment from Ericsson Ventures, Khosla Ventures and Scale Venture Partners.


text:
Q: Spring Cloud Config, how to fetch binary files from git repository Spring cloud-config-server has a built in mechanism to communicate with git repository and read files which are stored there. Then cloud-config-server also has built in mechanism to expose endpoints to clients (normally spring boot apps) which can read those files and use them as configurations.
This is well documented in spring documentation as can be seen from bellow.
According to doc

Spring Cloud Config Server
Spring Cloud Config Server provides an HTTP
resource-based API for external configuration (name-value pairs or
equivalent YAML content).

Also as documented about the serving format

Serving Alternative Formats
The default JSON format from the
environment endpoints is perfect for consumption by Spring
applications, because it maps directly onto the Environment
abstraction. If you prefer, you can consume the same data as YAML or
Java properties by adding a suffix (".yml", ".yaml" or ".properties")
to the resource path. This can be useful for consumption by
applications that do not care about the structure of the JSON
endpoints or the extra metadata they provide (for example, an
application that is not using Spring might benefit from the simplicity
of this approach).

It can also support txt format

Serving Plain Text
Instead of using the Environment abstraction (or
one of the alternative representations of it in YAML or properties
format), your applications might need generic plain-text configuration
files that are tailored to their environment.

But considering that spring cloud config server has the built in mechanism to communicate with a git repository and also exposes endpoints to the clients to consume the delivered files, it would make sense for other type of files to be able to be served from those endpoints as well.
It could be for example .pdf , .xslx , or even .zip
For example let's assume that the configured git repository contains the file myFile.zip in featureA branch. Then the call under the exposed path of type /{application}/{profile}[/{label}] for example as
serverUrl:serverPort/myApp/default/featureA/myFile.zip is able to deliver the file but is always delivered as raw .txt file which then corrupts the content of the original file existing in git.
I have already found the solution, but invested many hours on it and it was strange that it was not  documented in spring documentation. So it is probably good to exist here as well to spare some time from others having the same issue.

A: As discussed under this issue, spring-cloud-config-server runs under the hood with the help of a normal spring-boot app. Considering that spring-boot has built in content negotiation mechanism it is able to consume and produce different content as well.
As for spring-cloud-config-server it is possible to fetch binary files from git as well as other files (ex zip, pdf, word, xlsx ...) if the call is made with the header Accept: application/octet-stream  . This way the call to serverUrl:serverPort/myApp/default/featureA/myFile.zip is able to deliver a copy of the original file myFile.zip without any corruption.

redpajama_set_name: RedPajamaStackExchange


Below is a list of available courses offered by the Classics Department. Consult the Registrar's Office and the College Catalog for registration information.
The course engages students in the discovery, appreciation, and preservation of tangible cultural heritage. It combines the study of principles and best practices of conservation and archaeology with hands-on experience with ancient artifacts, and technology in the laboratories of the Centro di conservazione archeologica in Belmonte in Sabina, Italy, and in the University of Sassari excavations of a late Bronze Age Nuraghic village at Sant'Imbenia, Sardinia. Hours credit: 2, 3, or 4. May be repeated for credit up to a maximum of eight hours.
An investigation into the nature and uses of myth in both ancient Greek and Roman cultures. Topics include the social significance of myth, the use of myth in art and literature, and the influence of Greco-Roman myth on Western civilization. Hours credit: 3.
This course examines Athens, Rome and Alexandria as the physical setting for the drama of daily life and history in three culturally distinct but interrelated urban centers in the ancient Mediterranean. Besides considering how the landscape, monuments, and material culture of these cities reflected and shaped the political, commercial, domestic, religious, and social lives of its citizens, the course reflects on the changing patterns of urban life in these living cities in the ancient, medieval, and modern worlds. Hours credit: 3. Offered first semester. Alternate years.
The course explores the ancient roots of modern athletics and mass entertainment through analyses of texts, works of art, and the archaeological settings of sport and spectacle that highlight their essential role in ancient societies. The Olympic games asserted Greek identity, civic virtue and competitive spirit; gladiatorial combat and chariot racing defined relationships between Romans and others, rulers and subjects. Hours credit: 3.
Identical with Philosophy 177. Hours credit: 3.
As an introduction to the artistic culture of ancient Greece and Rome, this team-taught course discusses select works of art and architecture in depth, from both art historical and archaeological perspectives. Its aim is to set works of art in their specific historical and cultural context while exploring the connection (in style, material, technique, aesthetic) between them and our world. Identical with Art 179. Hours credit: 3. Rotating.
This is a survey course covering the history of the Mediterranean from the introduction of agriculture (c. 9000 BCE) to the rise of Islam (632 CE). The course considers the cultural, political, and social history of the region across this period, paying particular attention to the Greeks and Romans. Hours: 3. Identical with CLAS 180. Offered in alternate years.
This course is open to students who are full-time members of the cast or crew of the Greek Play but not enrolled in CLAS/THTR 275. It provides practical experience with the production of an ancient play. Hours credit: .5 or 1. Prerequisite: permission of the instructor. Offered alternate years. Offered on Pass/Fail basis only. May be repeated for credit.
We have inherited from ancient orators an understanding of the power of words to persuade and ideas about what makes a good speech appeal to an audience. Students will analyze speeches, delve into ancient rhetorical thinking, and apply its arts to speeches of their own. Students will read and write in English, but language across the curriculum provides opportunities for students who would like to add Greek or Latin language study to the course. Identical with Communication Studies 183. Hours credit: 3. Alternate years.
As an introduction to the history, theories, methods, and practice of Classical archaeology, this course focuses on the techniques of recovery, preservation, description, analysis, and interpretation of artifacts as documents of social, cultural, and economic history. Students work with coins, pottery, and other objects of Roman daily life in the Randolph College collection. Hours credit 3. Prerequisite: sophomore standing or permission of the instructor. Alternate years.
The tragedies of Aeschylus, Sophocles, and Euripides and the comedies of Aristophanes studied in the context of ancient theatrical conventions, with an emphasis on theories and practices of performance. In-depth study of the play in production as the Greek Play, with required student participation (in any of a number of capacities) to put principles of the class into action. Identical with Theatre 275. Hours credit: 3. Offered alternate years.
Each student investigates a special problem under the direction of the instructor. The research is supplemented by readings and conferences. Hours credit: 1-2. Open only to classics majors with at least sophomore standing in consultation with faculty. Individual conferences to be arranged. May be repeated for credit up to a maximum of 8 semester hours. Sections might be offered on a pass/fail basis at the discretion of the instructor.
An independent research project carried out in close consultation with the faculty supervisor. It will normally be an investigation of some aspect of Greek or Roman civilization and will typically utilize ancient source materials as well as modern scholarship. Hours credit: 3 Prerquisite: permission of the Department.


text:
George Hendrik Breitner (ur. 12 września 1857 w Rotterdamie, zm. 5 czerwca 1923) – holenderski malarz i fotograf.

W latach 1876-1880 uczęszczał na zajęcia w Akademii w Hadze. W 1880 wydalono go z uczelni ze względów dyscyplinarnych. Breitner kontynuował naukę u pejzażysty Willema Marisa, został członkiem zrzeszenia artystów Pulchri Studio i tworzył pod wpływem realistów szkoły haskiej. Jego wczesne prace poruszają tematykę kawalerii, koni i jeździectwa. Od 1880 brał udział w malowaniu monumentalnej Panoramy Mesdag.

Przełomem w jego twórczości była przyjaźń i wspólna praca z Vincentem van Goghiem, z którym pracował w najbiedniejszych dzielnicach Hagi, malując robotników, służące i ludzi z najniższych klas. Jego twórczość stopniowo ewoluowała od surowego realizmu szkoły haskiej do bogatego w kolory i światło impresjonizmu.

W 1884, po zakończeniu projektu Mesdag, Breitner udał się do Paryża, gdzie pracował w atelier Fernanda Cormona. W 1886 wrócił do Holandii i osiadł na stałe w Amsterdamie. Malował życie codzienne miasta. Jego prace, często szare i ponure, ilustrowały prawdziwe oblicze aglomeracji. Oprócz scen miejskich artysta malował też wnętrza, martwe natury i portrety. Szczególną uwagę przyciągały jego akty, które cieszyły się popularnością wśród znawców sztuki i malarzy, lecz były ostro oceniane przez krytykę za ich realizm i dosłowność. Około 1889 Breitner zainteresował się fotografią i odtąd nie rozstawał się z aparatem fotograficznym, ilustrując sceny miejskie. Odnalezione w latach 60. XX w. negatywy, świadczą o jego wysokich umiejętnościach.

Na przełomie wieków Breitner był już uznanym malarzem. Wiele podróżował odwiedzając m.in. Paryż, Londyn i Berlin, w 1909 wyjechał do Stanów Zjednoczonych jako członek jury Carnegie International Exhibition w Pittsburghu. W czasie całej kariery miał tylko dwóch uczniów (Kees Maks (1876-1967) i Marie Henrie Mackenzie (1878-1961)). Zmarł nagle na atak serca 5 czerwca 1923 w Amsterdamie. Dużą kolekcję jego prac posiada Rijksmuseum.

Wybrane prace
 Biały koń z Montmartre, 1884, Amsterdam,
 Portret pani Mann-Bouwmeester, 1887, Amsterdam,
 Widok Dam wieczorem, 1893, Amsterdam,
 Wieczór w Amsterdamie, Antwerpia,
 Wielki akt leżący, 1889, Amsterdam,
 Widok Pittsburgha, 1909.

Przypisy

Bibliografia

Linki zewnętrzne
 Answers.com – biografia
 George Hendrik Breitner w Artcyclopedia.com

Artyści związani z Amsterdamem
Holenderscy fotografowie
Holenderscy malarze modernizmu
Holenderscy pejzażyści
Urodzeni w 1857
Zmarli w 1923
Ludzie urodzeni w Rotterdamie

redpajama_set_name: RedPajamaWikipedia


DAGENHAM 88 runner Lynne Northcott, aka Jogonhijabi, returned home to complete The Great South Run as part of her preparations for the London Marathon. Northcott is running for the Penny Appeal to raise funds for a fresh water project in The Gambia and was keen on this race because it was a return to her childhood days.
In order to keep going, Northcott focussed on the important cause she is supporting. "This run was all part of my fundraising, training and my journey to the London Marathon 2018," she said. "I am aiming to raise £5,000 to build a deep water well in the Gambia, which will supply a whole village with fresh water for drinking, livestock and vegetation.
Northcott, who outran a Donald Trump cosplayer at the finish line, cited the presence of her family among a loud, cheering, 25,000-strong crowd lining the streets as vital in her completing the biggest 10 mile race in Europe.
It's great to hear about your brilliant running efforts, mashallah.
Would you be interested in contributing an inspiring article to our blog, to encourage other sisters to follow in your footsteps, inshallah?
We're always looking for new writers and you'd be very welcome!


text:
Bubka pledges more transparency in revitalised assault on doping in athletics
IAAF Vice president Sergey Bubka has said that athletics cannot afford to fail in its battle against doping and that the sport is a standard bearer for all sports in the fight against drugs cheats.
Sergey Bubka
IAAF's Vice president Sergey Bubka has said that athletics cannot afford to fail in its battle against doping and that the sport is a standard bearer for all sports in the fight against drugs cheats.
"Athletics is the most fundamental of all sports and the way the world sees athletics influences the way it views all sports. We cannot fail because the world would lose faith not only in athletics but in other sports and that would be a catastrophe for young people worldwide.
Bubka, who is a candidate to become President of the IAAF says the election in Beijing on August 19 must mark the beginning of a new chapter in the history of the organisation and of a new phase in the battle on doping.
"We must be more proactive and even more transparent in our aggressive pursuit of a zero tolerance policy against doping cheats," he said.
"That means working even more closely with WADA, the IOC, National Federations, National Doping Agencies and government bodies to ensure the process by which cheats are identified and prosecuted is truly independent.
"We need to support WADA and constantly drive it to ensure that together we have the latest technology and most advanced science at our disposal. This is a battle we can't afford to lose, for the sake of athletics and all sports."
"We need to work even more diligently and effectively and in a co-ordinated fashion with established bodies to find the best solutions to ensure the detection and punishment of cheats at every level of our sport and in every part of the world.
"It is clear that we need more people working at the IAAF to tackle the biggest challenge our sport faces – identifying doping cheats and protecting clean athletes.
"At present the anti-doping system is too complex and takes too long. It needs to be simplified to become faster and more efficient and we need to deploy the best research and science to ensure that we keep a step ahead of the dopers.
"We must work with bodies who share our interest in ensuring clean sport to contribute to funding the personnel, expertise and technology which will help us win this battle," he stated.
Sergey Bubka is particularly concerned that some youngsters coming into the sport may be vulnerable to pressure exerted by experienced adults in a position of trust. He says it is essential that those who abuse that trust are identified and eliminated from athletics.
"Young people coming into athletics are not pre-disposed to cheat. However they can be influenced by those they rely upon for advice and guidance and this is an area we must focus on.
"Coaches, managers and others who are part of an athlete's entourage have a massive responsibility for protecting our sport and for the wellbeing of the athletes in their charge.
"We have to be even more active in taking steps to educate them about their responsibilities and the penalties for failing to do so. That means organising effective courses and seminars at all levels of athletics to cover the entire world.
"We must investigate the role of entourage members when doping offences are detected and ensure that those in any way involved are banished from the sport."
Sergey Bubka has a unique insight into the role of the entourage in athletics. Drawing on his own experience as world champion athlete he was instrumental in the establishment of the IOC's Entourage Commission which he has chaired since its inception in 2010.
"We have to pursue a policy of education which is then supported by rigorous enforcement and maximum possible sanctions against those who break the rules.
"The idea of coaches and others close to athletes being complicit in or even encouraging doping is entirely unacceptable. They are poisoning minds, poisoning bodies and poisoning our sport," he added.
Sergey Bubka has constantly stated his support of a zero tolerance policy towards doping in sport and for maximum sanctions in keeping with existing legislation, natural justice and respect for human rights.
In this article:Drugs in Sports, IAAF, Sergey Bubka, WADA Code
The World Anti-Doping Agency's (WADA's) fifth World Conference on Doping in Sport concluded today in Katowice, Poland with WADA's Foundation Board approving the World...
ATAF EditorsNovember 7, 2019
IAAF unveils new name and logo – World Athletics
The IAAF Council approved the global governing body's new name and logo at the 217th IAAF Council Meeting which concluded in Monaco on June...
World AthleticsJune 9, 2019
Qualification system published for Tokyo 2020 Olympic Games
With exactly two years to go until the athletics action gets underway in the Japanese capital, the IAAF has published the qualification system for...
World AthleticsAugust 1, 2018
IAAF approve guidelines to protect athletes from abuse and harassment
The IAAF Council has approved a position statement on protecting athletes from abuse and harassment as part of an ongoing athlete welfare campaign.
World AthleticsJuly 31, 2018


You'll Love These WAY-FM Apps!
The WAY-FM app is the place to stream Christian music you want to listen to and get the heads up on great prizes and concerts in your area. You'll find amazing shows like The Wally Show, CJ & Joy, and The Brant Hansen Show where genuinely honest conversation happens everyday. Plus, be part of a community of listeners, interact with the music, talk to the show hosts, and encourage each other.
WAY Now is the place to hear fresh, positive hip-hop, pop, and dance music! Stream music from artists like Lecrae, NF, Gawvi, Hollyn, Twenty One Pilots, and more!
WAY LOUD is the best mix of Christian Rock from artists like Skillet, Demon Hunter, Disciple, Switchfoot, Family Force 5 and more! Listen 24/7 and interact with a community of rock fans.


text:
Home Stage Music Like Music, Broadway's "Farinelli" Has Charms — and Mark Rylance
Like Music, Broadway's "Farinelli" Has Charms — and Mark Rylance
Was Spain's melancholy king, Philippe V, crazy? Or crazy like a fox? Only a castrato knew for sure.
Sam Crane, Mark Rylance and Melody Grove in "Farinelli and the King." Photo: Joan Marcus
"Music has charms to soothe a savage breast." The playwright William Congreve wrote this line in his 1697 tragedy The Mourning Bride; the claim may be one of the earliest recorded bows to the effectiveness of what we call music therapy. Although Shakespeare suggested something similar a century earlier — in Twelfth Night — when Orsino exclaims, "If music be the food of love, play on."
Several hundred years later, Claire van Kampen now provides further anecdotal confirmation of the powers of music in her magical play Farinelli and the King, now running on Broadway. It offers another tour de force role for her three-time Tony-winning husband, Mark Rylance, as the titular king — Spain's often-thought-mad Philippe V.
First seen in an ornate robe and nightcap, fishing for a goldfish in a bowl, Philippe instantly seems as if he's off his rocker — while sitting comfortably on his royal bed. Threatened and depressed at the thought of being deposed by a court official, Don Sebastian De La Cuarda (Edward Peel), his second wife, Isabella Farnese (Melody Grove), functions as Philippe's most loyal protector.
As beautiful as she is loving, Isabella thinks she knows a curative. She's heard the castrato Farinelli sing and suspects his ethereal voice could do a bit of ruler-soothing.
So she brings the famous man to court from London, where he's under contract to agitated impresario John Rich (Colin Hurley). His short visit is so successful that he's asked to stay on definitely — and he's delighted. He's grown tired of the wide adulation accorded him.
Two performers play Farinelli, who's remembered in 2017 almost as much as Philippe. The sensitive Sam Crane speaks the lines and eventually experiences an anxious love exchange with Isabella. (It's established that while Farinelli was castrated, he was not impotent; Philippe compliments him on his ability to "fuck.") The equally sensitive Iestyn Davies sings the Handel arias, ending with perhaps the best-known, "Lascia, ch'io pianga," from Rinaldo — chosen to match the sentiments of different scenes.
The doubling underlines one of van Kampen's themes. When Philippe addresses his goldfish, Diego (no program credit cited), he explains that the "body cares very little for the affairs of the mind." The conflict between Philippe's mind and body is implicit throughout the play.
Over the course of two acts, Philippe is shown improving as a result of Farinelli's vocal turns. Whether he entirely overcomes his mental distress, however, remains unclear. Shortly after emotionally awakening under Farinelli's influence, he decides that court must remove to a forest area, where he can garden in modest clothes. (Costume designer Jonathan Fensom extravagantly presents outfits that range from the sumptuous to the ordinary.) The change from Madrid — which the French-born Philippe dislikes — to a rural area isn't necessarily greeted as indicative of a sound mind. Yet the king is increasingly happy — and increasingly under Farinelli's influence.
From the very start, Philippe also shows amusing signs of being, like so many lunatics, crazy like a fox. As a result, he outfoxes others while wrapped in his melancholia. Almost as often, he elicits any number of deliberate laughs.
But with military incursions ongoing, Philippe's absence from Madrid and shaky equilibrium cannot be sustained. Nor can Farinelli's stay be open-ended. And that's where the play heads to its melancholy conclusion. For which an elegiac Handel aria contributes greatly.
Van Kampen, who's composed the scores for many of Rylance's productions, has dreamed up a stunning way to make a point that's clearly of great meaning to her: the ability of music to affect change. She understands that it's a goal best reached in theater by including music, and chooses an incident in history in which music ruled a ruler for endless enchantments.
She also understands that her husband is an actor of seemingly unlimited depth and breadth. Under John Dove's wise direction, it's always difficult to know where to begin praising the art of Rylance. Though he doesn't sing in the conventional sense, his voice is musical and holds in its timbre — usually no matter his role — an irresistible vulnerability. It lends him a ingrained sympathy difficult for us to turn away from; his first-rate acting instincts inform not only his vocal delivery but also his physicality.
Aside from a strong supporting cast — led by Grove, Crane Peel, Iestyn and Huss Garbiya as the court physician — van Kampen is served by an absolutely stunning production, and here, some explanatory theater lore is required.
Farinelli and the King premiered at, and was written for, Shakespeare's Globe in London. It was not, however, presented in the reconstructed wooden O but in the Sam Wanamaker, named for the American actor and determined man beyond the Globe's rebirth. That house is not an Elizabeth replication but a Jacobean one. As such, it's quite intimate (seating capacity: 340) and, according to period, is strictly lighted by candles. Sconces and candelabra abound. Scenery is often designed to resemble 17th century attitudes, which is especially apparent at the coup de theatre Act 1 finale. Talk about music having charms to sooth a savage breast!
Here on Broadway, the Belasco Theatre (with roughly three times the seating capacity) can't offer quite the same period ambience, but as designed by its namesake, it remains a spectacular space. And though NYC ordinances preclude an entirely dark auditorium, lighting designer Paul Russell looks to be keeping candle illumination as the only stage amenity.
And like the small spaces in which Handel's music was often first heard, Farinelli and the King is a chamber piece, perfect in delivering what van Kampen, Rylance and company set out to achieve.
new plays
Previous articleHow Kids TV Made Playwright Matt Hoverman a Star
Next articleEven the Virgin Mary Has a #MeToo Story: The Annunciation
David Finkle writes regularly about the arts.


Initially, human MVD infection results from prolonged exposure to mines or caves inhabited by Rousettus bat colonies (fruit bats).
The latest World Health Organization (WHO) figures states there are 1,801 suspected cases - significantly higher than the 1,309 it reported two weeks ago.
Academics have revealed such a jump in cases over the period of five days is concerning and have predicted it could get worse.
The deadly airborne plague spreading rapidly across Madagascar is now at 'crisis' point as cases rocketed by 37 per cent in just five days, official figures revealed last week.
Analysis of figures by Mail Online show the epidemic could strike a further 20,000 people in just a matter of weeks, if current trends continue.MVD was first reported in Uganda in 2007 after the virus was found to have struck several in the western district of Kamwenge.An outbreak in 2012 killed 10 people, figures state, while the most recent, in 2014, claimed the life of one man.Source: WHO Suspicions have been raised the 50-year-old woman contracted the virus during burial preparation rituals.Their other brother's location is unknown, as local health officials look to chase him down after he began to show symptoms and refused to go to hospital.
Students are registered for an MPhil in their first (full-time equivalent) year but usually convert to a Ph D after their upgrade viva rather than continuing to the MPhil qualification.
See Bermuda History with the Old and New Worlds since 1500.
A spokesman for CC said: 'There is an assumption that your looks and sense of style are at their peak in your late teens and early twenties, but this research shows that it can take a while before you find a style and image that suits.
Consequently, it is tempting to argue that, since the creationist belief system is so "palpably not true", those who endorse it surely must be completely insensible to rational arguments and evidence.
That's information that needs to be out there, but the trans experience is far too broad and varied to be encompassed by a single person's page.
Copyright © 2017	Blog at vdo.gruppatt.ru.


text:
Palatine Stables is a recreational horseback riding facility located in Palatine, Illinois. Palatine Stables is owned by the Palatine Park District and managed by head trainer Toni Bruns.

Location

Palatine Stables is located at 1510 West Northwest Highway, Palatine, IL 60067. It is located between Northwest Highway and Dundee Road and across from the Deer Grove Forest Preserve.

Facility

The Palatine Park District purchased the facility in 1989, and Palatine Stables is home to approximately 70 horses. The facility features three outdoor arenas, two indoor arenas, and space for turnout.

Disciplines

Palatine Stables focuses primarily on hunter/jumper and equitation. Palatine Stables offers group lessons and private lessons for riders of all ages and ability levels, from beginners to advanced jumpers.

Services

Palatine Stables offers lessons, boarding, training, and a variety of other programs. Young riders can visit the Palatine Stables "Pony Place" for pony rides or host a pony party event.

Events

Palatine Stables hosts horse shows as well as special events several times a year. The Palatine Stables Show Team hosts and competes on the Northern Illinois Hunter Jumper Association circuit as well as on the Illinois Short Circuit. Palatine Stables hosts an annual Fall Festival each October, which features riding demonstrations, pony rides, a petting zoo, crafts, and more. The Stables has also hosted a Winter Open House. There are also Jumping Jackpot Shows, or jumping contests.

References

Illinois culture


Extended match highlights from Burton Albion v Peterborough United, Saturday 27th October 2018.
Extended match highlights from Peterborough United v Fleetwood Town at the ABAX Stadium, Tuesday 23rd October 2018.
Extended match highlights between Peterborough United and Accrington Stanley at the ABAX Stadium, Saturday 20th October 2018.
Extended match highlights from Peterborough United's Sky Bet League One fixture with Scunthorpe United at Glanford Park.
Extended match highlights from the Checkatrade Trophy against Brighton & Hove Albion Under 21s at the ABAX Stadium, Tuesday 9th October 2018.
Extended match highlights from Peterborough United v Barnsley at the ABAX Stadium, Saturday 6th October 2018.
Over 10 minutes worth of extended match highlights from Peterborough United's Sky Bet League One fixture at Gillingham, Saturday 22nd September 2018.
Over 10 minutes worth of extended match highlights from the Sky Bet League One fixture against Portsmouth at the ABAX Stadium.
Over 10 minutes of extended match highlights from the Sky Bet League One fixture with Plymouth Argyle at Home Park, Saturday 25th August.
Over 10 minutes of extended match highlights from the Sky Bet League One fixture with Charlton Athletic at The Valley, Tuesday 21st August.