text:
package org.apache.hadoop.hbase.replication.regionserver;

import java.io.EOFException;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.ConnectException;
import java.net.SocketTimeoutException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.NavigableMap;
import java.util.UUID;
import java.util.concurrent.PriorityBlockingQueue;
import java.util.concurrent.TimeUnit;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.Stoppable;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.TableNotFoundException;
import org.apache.hadoop.hbase.client.HConnection;
import org.apache.hadoop.hbase.client.HConnectionManager;
import org.apache.hadoop.hbase.protobuf.ReplicationProtbufUtil;
import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.AdminService.BlockingInterface;
import org.apache.hadoop.hbase.regionserver.wal.HLog;
import org.apache.hadoop.hbase.regionserver.wal.HLogKey;
import org.apache.hadoop.hbase.regionserver.wal.WALEdit;
import org.apache.hadoop.hbase.replication.ReplicationException;
import org.apache.hadoop.hbase.replication.ReplicationPeers;
import org.apache.hadoop.hbase.replication.ReplicationQueueInfo;
import org.apache.hadoop.hbase.replication.ReplicationQueues;
import org.apache.hadoop.hbase.replication.regionserver.ReplicationSinkManager.SinkPeer;
import org.apache.hadoop.hbase.util.Threads;
import org.apache.hadoop.ipc.RemoteException;

/**
 * Class that handles the source of a replication stream.
 * Currently does not handle more than 1 slave
 * For each slave cluster it selects a random number of peers
 * using a replication ratio. For example, if replication ration = 0.1
 * and slave cluster has 100 region servers, 10 will be selected.
 *

 * A stream is considered down when we cannot contact a region server on the
 * peer cluster for more than 55 seconds by default.
 *

 *
 */
@InterfaceAudience.Private
public class ReplicationSource extends Thread
    implements ReplicationSourceInterface {

  public static final Log LOG = LogFactory.getLog(ReplicationSource.class);
  // Queue of logs to process
  private PriorityBlockingQueue<Path> queue;
  private HConnection conn;
  private ReplicationQueues replicationQueues;
  private ReplicationPeers replicationPeers;
  private Configuration conf;
  private ReplicationQueueInfo replicationQueueInfo;
  // id of the peer cluster this source replicates to
  private String peerId;
  // The manager of all sources to which we ping back our progress
  private ReplicationSourceManager manager;
  // Should we stop everything?
  private Stoppable stopper;
  // How long should we sleep for each retry
  private long sleepForRetries;
  // Max size in bytes of entriesArray
  private long replicationQueueSizeCapacity;
  // Max number of entries in entriesArray
  private int replicationQueueNbCapacity;
  // Our reader for the current log
  private HLog.Reader reader;
  // Last position in the log that we sent to ZooKeeper
  private long lastLoggedPosition = -1;
  // Path of the current log
  private volatile Path currentPath;
  private FileSystem fs;
  // id of this cluster
  private UUID clusterId;
  // id of the other cluster
  private UUID peerClusterId;
  // total number of edits we replicated
  private long totalReplicatedEdits = 0;
  // total number of edits we replicated
  private long totalReplicatedOperations = 0;
  // The znode we currently play with
  private String peerClusterZnode;
  // Maximum number of retries before taking bold actions
  private int maxRetriesMultiplier;
  // Socket timeouts require even bolder actions since we don't want to DDOS
  private int socketTimeoutMultiplier;
  // Current number of operations (Put/Delete) that we need to replicate
  private int currentNbOperations = 0;
  // Current size of data we need to replicate
  private int currentSize = 0;
  // Indicates if this particular source is running
  private volatile boolean running = true;
  // Metrics for this source
  private MetricsSource metrics;
  // Handle on the log reader helper
  private ReplicationHLogReaderManager repLogReader;
  // Handles connecting to peer region servers
  private ReplicationSinkManager replicationSinkMgr;
  //WARN threshold for the number of queued logs, defaults to 2
  private int logQueueWarnThreshold;

  /**
   * Instantiation method used by region servers
   *
   * @param conf configuration to use
   * @param fs file system to use
   * @param manager replication manager to ping to
   * @param stopper     the atomic boolean to use to stop the regionserver
   * @param peerClusterZnode the name of our znode
   * @throws IOException
   */
  public void init(final Configuration conf, final FileSystem fs,
      final ReplicationSourceManager manager, final ReplicationQueues replicationQueues,
      final ReplicationPeers replicationPeers, final Stoppable stopper,
      final String peerClusterZnode, final UUID clusterId) throws IOException {
    this.stopper = stopper;
    this.conf = conf;
    this.replicationQueueSizeCapacity =
        this.conf.getLong("replication.source.size.capacity", 1024*1024*64);
    this.replicationQueueNbCapacity =
        this.conf.getInt("replication.source.nb.capacity", 25000);
    this.maxRetriesMultiplier = this.conf.getInt("replication.source.maxretriesmultiplier", 10);
    this.socketTimeoutMultiplier = this.conf.getInt("replication.source.socketTimeoutMultiplier",
        maxRetriesMultiplier * maxRetriesMultiplier);
    this.queue =
        new PriorityBlockingQueue<Path>(
            conf.getInt("hbase.regionserver.maxlogs", 32),
            new LogsComparator());
    // TODO: This connection is replication specific or we should make it particular to
    // replication and make replication specific settings such as compression or codec to use
    // passing Cells.
    this.conn = HConnectionManager.getConnection(conf);
    this.replicationQueues = replicationQueues;
    this.replicationPeers = replicationPeers;
    this.manager = manager;
    this.sleepForRetries =
        this.conf.getLong("replication.source.sleepforretries", 1000);
    this.fs = fs;
    this.metrics = new MetricsSource(peerClusterZnode);
    this.repLogReader = new ReplicationHLogReaderManager(this.fs, this.conf);
    this.clusterId = clusterId;

    this.peerClusterZnode = peerClusterZnode;
    this.replicationQueueInfo = new ReplicationQueueInfo(peerClusterZnode);
    // ReplicationQueueInfo parses the peerId out of the znode for us
    this.peerId = this.replicationQueueInfo.getPeerId();
    this.replicationSinkMgr = new ReplicationSinkManager(conn, peerId, replicationPeers, conf);
    this.logQueueWarnThreshold = this.conf.getInt("replication.source.log.queue.warn", 2);
  }

  @Override
  public void enqueueLog(Path log) {
    this.queue.put(log);
    int queueSize = queue.size();
    this.metrics.setSizeOfLogQueue(queueSize);
    // This will log a warning for each new log that gets created above the warn threshold
    if (queueSize > this.logQueueWarnThreshold) {
      LOG.warn("Queue size: " + queueSize +
        " exceeds value of replication.source.log.queue.warn: " + logQueueWarnThreshold);
    }
  }

  private void uninitialize() {
    if (this.conn != null) {
      try {
        this.conn.close();
      } catch (IOException e) {
        LOG.debug("Attempt to close connection failed", e);
      }
    }
    LOG.debug("Source exiting " + this.peerId);
    metrics.clear();
  }

  @Override
  public void run() {
    connectToPeers();
    // We were stopped while looping to connect to sinks, just abort
    if (!this.isActive()) {
      uninitialize();
      return;
    }

    int sleepMultiplier = 1;
    // delay this until we are in an asynchronous thread
    while (this.isActive() && this.peerClusterId == null) {
      this.peerClusterId = replicationPeers.getPeerUUID(this.peerId);
      if (this.isActive() && this.peerClusterId == null) {
        if (sleepForRetries("Cannot contact the peer's zk ensemble", sleepMultiplier)) {
          sleepMultiplier++;
        }
      }
    }
    // We were stopped while looping to contact peer's zk ensemble, just abort
    if (!this.isActive()) {
      uninitialize();
      return;
    }

    // resetting to 1 to reuse later
    sleepMultiplier = 1;

    // In rare case, zookeeper setting may be messed up. That leads to the incorrect
    // peerClusterId value, which is the same as the source clusterId
    if (clusterId.equals(peerClusterId)) {
      this.terminate("ClusterId " + clusterId + " is replicating to itself: peerClusterId "
          + peerClusterId);
    }
    LOG.info("Replicating "+clusterId + " -> " + peerClusterId);

    // If this is recovered, the queue is already full and the first log
    // normally has a position (unless the RS failed between 2 logs)
    if (this.replicationQueueInfo.isQueueRecovered()) {
      try {
        this.repLogReader.setPosition(this.replicationQueues.getLogPosition(this.peerClusterZnode,
          this.queue.peek().getName()));
        if (LOG.isTraceEnabled()) {
          LOG.trace("Recovered queue started with log " + this.queue.peek() +
              " at position " + this.repLogReader.getPosition());
        }
      } catch (ReplicationException e) {
        this.terminate("Couldn't get the position of this recovered queue " +
            this.peerClusterZnode, e);
      }
    }
    // Loop until we close down
    while (isActive()) {
      // Sleep until replication is enabled again
      if (!isPeerEnabled()) {
        if (sleepForRetries("Replication is disabled", sleepMultiplier)) {
          sleepMultiplier++;
        }
        continue;
      }
      Path oldPath = getCurrentPath(); //note that in the current scenario,
                                       //oldPath will be null when a log roll
                                       //happens.
      // Get a new path
      boolean hasCurrentPath = getNextPath();
      if (getCurrentPath() != null && oldPath == null) {
        sleepMultiplier = 1; //reset the sleepMultiplier on a path change
      }
      if (!hasCurrentPath) {
        if (sleepForRetries("No log to process", sleepMultiplier)) {
          sleepMultiplier++;
        }
        continue;
      }
      boolean currentWALisBeingWrittenTo = false;
      //For WAL files we own (rather than recovered), take a snapshot of whether the
      //current WAL file (this.currentPath) is in use (for writing) NOW!
      //Since the new WAL paths are enqueued only after the prev WAL file
      //is 'closed', presence of an element in the queue means that
      //the previous WAL file was closed, else the file is in use (currentPath)
      //We take the snapshot now so that we are protected against races
      //where a new file gets enqueued while the current file is being processed
      //(and where we just finished reading the current file).
      if (!this.replicationQueueInfo.isQueueRecovered() && queue.size() == 0) {
        currentWALisBeingWrittenTo = true;
      }
      // Open a reader on it
      if (!openReader(sleepMultiplier)) {
        // Reset the sleep multiplier, else it'd be reused for the next file
        sleepMultiplier = 1;
        continue;
      }

      // If we got a null reader but didn't continue, then sleep and continue
      if (this.reader == null) {
        if (sleepForRetries("Unable to open a reader", sleepMultiplier)) {
          sleepMultiplier++;
        }
        continue;
      }

      boolean gotIOE = false;
      currentNbOperations = 0;
      List<HLog.Entry> entries = new ArrayList<HLog.Entry>(1);
      currentSize = 0;
      try {
        if (readAllEntriesToReplicateOrNextFile(currentWALisBeingWrittenTo, entries)) {
          continue;
        }
      } catch (IOException ioe) {
        LOG.warn(this.peerClusterZnode + " Got: ", ioe);
        gotIOE = true;
        if (ioe.getCause() instanceof EOFException) {

          boolean considerDumping = false;
          if (this.replicationQueueInfo.isQueueRecovered()) {
            try {
              FileStatus stat = this.fs.getFileStatus(this.currentPath);
              if (stat.getLen() == 0) {
                LOG.warn(this.peerClusterZnode + " Got EOF and the file was empty");
              }
              considerDumping = true;
            } catch (IOException e) {
              LOG.warn(this.peerClusterZnode + " Got while getting file size: ", e);
            }
          }

          if (considerDumping &&
              sleepMultiplier == this.maxRetriesMultiplier &&
              processEndOfFile()) {
            continue;
          }
        }
      } finally {
        try {
          this.reader = null;
          this.repLogReader.closeReader();
        } catch (IOException e) {
          gotIOE = true;
          LOG.warn("Unable to finalize the tailing of a file", e);
        }
      }

      // If we didn't get anything to replicate, or if we hit a IOE,
      // wait a bit and retry.
      // But if we need to stop, don't bother sleeping
      if (this.isActive() && (gotIOE || entries.isEmpty())) {
        if (this.lastLoggedPosition != this.repLogReader.getPosition()) {
          this.manager.logPositionAndCleanOldLogs(this.currentPath,
              this.peerClusterZnode, this.repLogReader.getPosition(),
              this.replicationQueueInfo.isQueueRecovered(), currentWALisBeingWrittenTo);
          this.lastLoggedPosition = this.repLogReader.getPosition();
        }
        // Reset the sleep multiplier if nothing has actually gone wrong
        if (!gotIOE) {
          sleepMultiplier = 1;
        }
        if (sleepForRetries("Nothing to replicate", sleepMultiplier)) {
          sleepMultiplier++;
        }
        continue;
      }
      sleepMultiplier = 1;
      shipEdits(currentWALisBeingWrittenTo, entries);
    }
    uninitialize();
  }

  /**
   * Read all the entries from the current log files and retain those
   * that need to be replicated. Else, process the end of the current file.
   * @param currentWALisBeingWrittenTo is the current WAL being written to
   * @param entries resulting entries to be replicated
   * @return true if we got nothing and went to the next file, false if we got
   * entries
   * @throws IOException
   */
  protected boolean readAllEntriesToReplicateOrNextFile(boolean currentWALisBeingWrittenTo, List<HLog.Entry> entries)
      throws IOException{
    long seenEntries = 0;
    if (LOG.isTraceEnabled()) {
      LOG.trace("Seeking in " + this.currentPath + " at position "
          + this.repLogReader.getPosition());
    }
    this.repLogReader.seek();
    HLog.Entry entry =
        this.repLogReader.readNextAndSetPosition();
    while (entry != null) {
      WALEdit edit = entry.getEdit();
      this.metrics.incrLogEditsRead();
      seenEntries++;
      // Remove all KVs that should not be replicated
      HLogKey logKey = entry.getKey();
      // don't replicate if the log entries have already been consumed by the cluster
      if (!logKey.getClusterIds().contains(peerClusterId)) {
        removeNonReplicableEdits(entry);
        // Don't replicate catalog entries, if the WALEdit wasn't
        // containing anything to replicate and if we're currently not set to replicate
        if (!logKey.getTablename().equals(TableName.META_TABLE_NAME) &&
            edit.size() != 0) {
          //Mark that the current cluster has the change
          logKey.addClusterId(clusterId);
          currentNbOperations += countDistinctRowKeys(edit);
          entries.add(entry);
          currentSize += entry.getEdit().heapSize();
        } else {
          this.metrics.incrLogEditsFiltered();
        }
      }
      // Stop if too many entries or too big
      if (currentSize >= this.replicationQueueSizeCapacity ||
          entries.size() >= this.replicationQueueNbCapacity) {
        break;
      }
      try {
        entry = this.repLogReader.readNextAndSetPosition();
      } catch (IOException ie) {
        LOG.debug("Break on IOE: " + ie.getMessage());
        break;
      }
    }
    if (currentWALisBeingWrittenTo) {
      return false;
    }
    // If we didn't get anything and the queue has an object, it means we
    // hit the end of the file for sure
    return seenEntries == 0 && processEndOfFile();
  }

  private void connectToPeers() {
    int sleepMultiplier = 1;

    // Connect to peer cluster first, unless we have to stop
    while (this.isActive() && replicationSinkMgr.getSinks().size() == 0) {
      replicationSinkMgr.chooseSinks();
      if (this.isActive() && replicationSinkMgr.getSinks().size() == 0) {
        if (sleepForRetries("Waiting for peers", sleepMultiplier)) {
          sleepMultiplier++;
        }
      }
    }
  }

  /**
   * Poll for the next path
   * @return true if a path was obtained, false if not
   */
  protected boolean getNextPath() {
    try {
      if (this.currentPath == null) {
        this.currentPath = queue.poll(this.sleepForRetries, TimeUnit.MILLISECONDS);
        this.metrics.setSizeOfLogQueue(queue.size());
        if (this.currentPath != null) {
          this.manager.cleanOldLogs(this.currentPath.getName(),
              this.peerId,
              this.replicationQueueInfo.isQueueRecovered());
          if (LOG.isTraceEnabled()) {
            LOG.trace("New log: " + this.currentPath);
          }
        }
      }
    } catch (InterruptedException e) {
      LOG.warn("Interrupted while reading edits", e);
    }
    return this.currentPath != null;
  }

  /**
   * Open a reader on the current path
   *
   * @param sleepMultiplier by how many times the default sleeping time is augmented
   * @return true if we should continue with that file, false if we are over with it
   */
  protected boolean openReader(int sleepMultiplier) {
    try {
      try {
        if (LOG.isTraceEnabled()) {
          LOG.trace("Opening log " + this.currentPath);
        }
        this.reader = repLogReader.openReader(this.currentPath);
      } catch (FileNotFoundException fnfe) {
        if (this.replicationQueueInfo.isQueueRecovered()) {
          // We didn't find the log in the archive directory, look if it still
          // exists in the dead RS folder (there could be a chain of failures
          // to look at)
          List<String> deadRegionServers = this.replicationQueueInfo.getDeadRegionServers();
          LOG.info("NB dead servers : " + deadRegionServers.size());
          for (String curDeadServerName : deadRegionServers) {
            Path deadRsDirectory =
                new Path(manager.getLogDir().getParent(), curDeadServerName);
            Path[] locs = new Path[] {
                new Path(deadRsDirectory, currentPath.getName()),
                new Path(deadRsDirectory.suffix(HLog.SPLITTING_EXT),
                                          currentPath.getName()),
            };
            for (Path possibleLogLocation : locs) {
              LOG.info("Possible location " + possibleLogLocation.toUri().toString());
              if (this.manager.getFs().exists(possibleLogLocation)) {
                // We found the right new location
                LOG.info("Log " + this.currentPath + " still exists at " +
                    possibleLogLocation);
                // Breaking here will make us sleep since reader is null
                return true;
              }
            }
          }
          // In the case of disaster/recovery, HMaster may be shutdown/crashed before flush data
          // from .logs to .oldlogs. Loop into .logs folders and check whether a match exists
          if (stopper instanceof ReplicationSyncUp.DummyServer) {
            FileStatus[] rss = fs.listStatus(manager.getLogDir());
            for (FileStatus rs : rss) {
              Path p = rs.getPath();
              FileStatus[] logs = fs.listStatus(p);
              for (FileStatus log : logs) {
                p = new Path(p, log.getPath().getName());
                if (p.getName().equals(currentPath.getName())) {
                  currentPath = p;
                  LOG.info("Log " + this.currentPath + " exists under " + manager.getLogDir());
                  // Open the log at the new location
                  this.openReader(sleepMultiplier);
                  return true;
                }
              }
            }
          }

          // TODO What happens if the log was missing from every single location?
          // Although we need to check a couple of times as the log could have
          // been moved by the master between the checks
          // It can also happen if a recovered queue wasn't properly cleaned,
          // such that the znode pointing to a log exists but the log was
          // deleted a long time ago.
          // For the moment, we'll throw the IO and processEndOfFile
          throw new IOException("File from recovered queue is " +
              "nowhere to be found", fnfe);
        } else {
          // If the log was archived, continue reading from there
          Path archivedLogLocation =
              new Path(manager.getOldLogDir(), currentPath.getName());
          if (this.manager.getFs().exists(archivedLogLocation)) {
            currentPath = archivedLogLocation;
            LOG.info("Log " + this.currentPath + " was moved to " +
                archivedLogLocation);
            // Open the log at the new location
            this.openReader(sleepMultiplier);

          }
          // TODO What happens the log is missing in both places?
        }
      }
    } catch (IOException ioe) {
      if (ioe instanceof EOFException && isCurrentLogEmpty()) return true;
      LOG.warn(this.peerClusterZnode + " Got: ", ioe);
      this.reader = null;
      if (ioe.getCause() instanceof NullPointerException) {
        // Workaround for race condition in HDFS-4380
        // which throws a NPE if we open a file before any data node has the most recent block
        // Just sleep and retry. Will require re-reading compressed HLogs for compressionContext.
        LOG.warn("Got NPE opening reader, will retry.");
      } else if (sleepMultiplier == this.maxRetriesMultiplier) {
        // TODO Need a better way to determine if a file is really gone but
        // TODO without scanning all logs dir
        LOG.warn("Waited too long for this file, considering dumping");
        return !processEndOfFile();
      }
    }
    return true;
  }

  /*
   * Checks whether the current log file is empty, and it is not a recovered queue. This is to
   * handle scenario when in an idle cluster, there is no entry in the current log and we keep on
   * trying to read the log file and get EOFEception. In case of a recovered queue the last log file
   * may be empty, and we don't want to retry that.
   */
  private boolean isCurrentLogEmpty() {
    return (this.repLogReader.getPosition() == 0 &&
        !this.replicationQueueInfo.isQueueRecovered() && queue.size() == 0);
  }

  /**
   * Do the sleeping logic
   * @param msg Why we sleep
   * @param sleepMultiplier by how many times the default sleeping time is augmented
   * @return True if sleepMultiplier is < maxRetriesMultiplier
   */
  protected boolean sleepForRetries(String msg, int sleepMultiplier) {
    try {
      if (LOG.isTraceEnabled()) {
        LOG.trace(msg + ", sleeping " + sleepForRetries + " times " + sleepMultiplier);
      }
      Thread.sleep(this.sleepForRetries * sleepMultiplier);
    } catch (InterruptedException e) {
      LOG.debug("Interrupted while sleeping between retries");
    }
    return sleepMultiplier < maxRetriesMultiplier;
  }

  /**
   * We only want KVs that are scoped other than local
   * @param entry The entry to check for replication
   */
  protected void removeNonReplicableEdits(HLog.Entry entry) {
    NavigableMap<byte[], Integer> scopes = entry.getKey().getScopes();
    ArrayList<KeyValue> kvs = entry.getEdit().getKeyValues();
    int size = kvs.size();
    for (int i = size-1; i >= 0; i--) {
      KeyValue kv = kvs.get(i);
      // The scope will be null or empty if
      // there's nothing to replicate in that WALEdit
      if (scopes == null || !scopes.containsKey(kv.getFamily())) {
        kvs.remove(i);
      }
    }
    if (kvs.size() < size/2) {
      kvs.trimToSize();
    }
  }

  /**
   * Count the number of different row keys in the given edit because of
   * mini-batching. We assume that there's at least one KV in the WALEdit.
   * @param edit edit to count row keys from
   * @return number of different row keys
   */
  private int countDistinctRowKeys(WALEdit edit) {
    List<KeyValue> kvs = edit.getKeyValues();
    int distinctRowKeys = 1;
    KeyValue lastKV = kvs.get(0);
    for (int i = 0; i < edit.size(); i++) {
      if (!kvs.get(i).matchingRow(lastKV)) {
        distinctRowKeys++;
      }
    }
    return distinctRowKeys;
  }

  /**
   * Do the shipping logic
   * @param currentWALisBeingWrittenTo was the current WAL being (seemingly)
   * written to when this method was called
   */
  protected void shipEdits(boolean currentWALisBeingWrittenTo, List<HLog.Entry> entries) {
    int sleepMultiplier = 1;
    if (entries.isEmpty()) {
      LOG.warn("Was given 0 edits to ship");
      return;
    }
    while (this.isActive()) {
      if (!isPeerEnabled()) {
        if (sleepForRetries("Replication is disabled", sleepMultiplier)) {
          sleepMultiplier++;
        }
        continue;
      }
      SinkPeer sinkPeer = null;
      try {
        sinkPeer = replicationSinkMgr.getReplicationSink();
        BlockingInterface rrs = sinkPeer.getRegionServer();
        if (LOG.isTraceEnabled()) {
          LOG.trace("Replicating " + entries.size() +
              " entries of total size " + currentSize);
        }
        ReplicationProtbufUtil.replicateWALEntry(rrs,
            entries.toArray(new HLog.Entry[entries.size()]));
        if (this.lastLoggedPosition != this.repLogReader.getPosition()) {
          this.manager.logPositionAndCleanOldLogs(this.currentPath,
              this.peerClusterZnode, this.repLogReader.getPosition(),
              this.replicationQueueInfo.isQueueRecovered(), currentWALisBeingWrittenTo);
          this.lastLoggedPosition = this.repLogReader.getPosition();
        }
        this.totalReplicatedEdits += entries.size();
        this.totalReplicatedOperations += currentNbOperations;
        this.metrics.shipBatch(this.currentNbOperations);
        this.metrics.setAgeOfLastShippedOp(entries.get(entries.size()-1).getKey().getWriteTime());
        if (LOG.isTraceEnabled()) {
          LOG.trace("Replicated " + this.totalReplicatedEdits + " entries in total, or "
              + this.totalReplicatedOperations + " operations");
        }
        break;

      } catch (IOException ioe) {
        // Didn't ship anything, but must still age the last time we did
        this.metrics.refreshAgeOfLastShippedOp();
        if (ioe instanceof RemoteException) {
          ioe = ((RemoteException) ioe).unwrapRemoteException();
          LOG.warn("Can't replicate because of an error on the remote cluster: ", ioe);
          if (ioe instanceof TableNotFoundException) {
            if (sleepForRetries("A table is missing in the peer cluster. "
                + "Replication cannot proceed without losing data.", sleepMultiplier)) {
              sleepMultiplier++;
            }
          }
        } else {
          if (ioe instanceof SocketTimeoutException) {
            // This exception means we waited for more than 60s and nothing
            // happened, the cluster is alive and calling it right away
            // even for a test just makes things worse.
            sleepForRetries("Encountered a SocketTimeoutException. Since the " +
              "call to the remote cluster timed out, which is usually " +
              "caused by a machine failure or a massive slowdown",
              this.socketTimeoutMultiplier);
          } else if (ioe instanceof ConnectException) {
            LOG.warn("Peer is unavailable, rechecking all sinks: ", ioe);
            replicationSinkMgr.chooseSinks();
          } else {
            LOG.warn("Can't replicate because of a local or network error: ", ioe);
          }
        }

        if (sinkPeer != null) {
          replicationSinkMgr.reportBadSink(sinkPeer);
        }
        if (sleepForRetries("Since we are unable to replicate", sleepMultiplier)) {
          sleepMultiplier++;
        }
      }
    }
  }

  /**
   * check whether the peer is enabled or not
   *
   * @return true if the peer is enabled, otherwise false
   */
  protected boolean isPeerEnabled() {
    return this.replicationPeers.getStatusOfConnectedPeer(this.peerId);
  }

  /**
   * If the queue isn't empty, switch to the next one
   * Else if this is a recovered queue, it means we're done!
   * Else we'll just continue to try reading the log file
   * @return true if we're done with the current file, false if we should
   * continue trying to read from it
   */
  protected boolean processEndOfFile() {
    if (this.queue.size() != 0) {
      if (LOG.isTraceEnabled()) {
        String filesize = "N/A";
        try {
          FileStatus stat = this.fs.getFileStatus(this.currentPath);
          filesize = stat.getLen()+"";
        } catch (IOException ex) {}
        LOG.trace("Reached the end of a log, stats: " + getStats() +
            ", and the length of the file is " + filesize);
      }
      this.currentPath = null;
      this.repLogReader.finishCurrentFile();
      this.reader = null;
      return true;
    } else if (this.replicationQueueInfo.isQueueRecovered()) {
      this.manager.closeRecoveredQueue(this);
      LOG.info("Finished recovering the queue with the following stats " + getStats());
      this.running = false;
      return true;
    }
    return false;
  }

  public void startup() {
    String n = Thread.currentThread().getName();
    Thread.UncaughtExceptionHandler handler =
        new Thread.UncaughtExceptionHandler() {
          public void uncaughtException(final Thread t, final Throwable e) {
            LOG.error("Unexpected exception in ReplicationSource," +
              " currentPath=" + currentPath, e);
          }
        };
    Threads.setDaemonThreadRunning(
        this, n + ".replicationSource," +
        this.peerClusterZnode, handler);
  }

  public void terminate(String reason) {
    terminate(reason, null);
  }

  public void terminate(String reason, Exception cause) {
    if (cause == null) {
      LOG.info("Closing source "
          + this.peerClusterZnode + " because: " + reason);

    } else {
      LOG.error("Closing source " + this.peerClusterZnode
          + " because an error occurred: " + reason, cause);
    }
    this.running = false;
    Threads.shutdown(this, this.sleepForRetries);
  }

  public String getPeerClusterZnode() {
    return this.peerClusterZnode;
  }

  public String getPeerClusterId() {
    return this.peerId;
  }

  public Path getCurrentPath() {
    return this.currentPath;
  }

  private boolean isActive() {
    return !this.stopper.isStopped() && this.running;
  }

  /**
   * Comparator used to compare logs together based on their start time
   */
  public static class LogsComparator implements Comparator<Path> {

    @Override
    public int compare(Path o1, Path o2) {
      return Long.valueOf(getTS(o1)).compareTo(getTS(o2));
    }

    /**
     * Split a path to get the start time
     * For example: 10.20.20.171%3A60020.1277499063250
     * @param p path to split
     * @return start time
     */
    private long getTS(Path p) {
      String[] parts = p.getName().split("\\.");
      return Long.parseLong(parts[parts.length-1]);
    }
  }

  @Override
  public String getStats() {
    long position = this.repLogReader.getPosition();
    return "Total replicated edits: " + totalReplicatedEdits +
      ", currently replicating from: " + this.currentPath +
      " at position: " + position;
  }
}


UKCHO - The UK Confederation of Hypnotherapy Organisations.
"With a unified Register of Members, patients and members of the public would then have a single, reliable point of reference for standards, and would be protected against the risk of poorly-trained practitioners and have redress for poor service". (House of Lords Select Committee on Science and Technology Report on CAM').
CNHC is the UK regulator for complementary healthcare practitioners.
Its key function is to enhance public protection by giving the general public and commissioners of services access to a list of practitioners that have been assessed as meeting national standards of competence and practice.
The Department of Health recommends that members of the public consult with CNHC-registered practitioners, where CNHC registers the professional discipline concerned.
UKCHO are pleased to announce the opening of the CNHC Register to Hypnotherapists on 1st December 2010.
UKCHO Member Organisations – HA, NRAH, APHP, BAThH, BIH, SSM, CAH, NACHP, NCH, and NCSAG have been approved by the CNHC to verify applications for registration and we do encourage members to register.


Quartz Conch, Buddhist Auspicious Symbol 6 1/2"
In Buddhism, the conch shell is a symbol of the proclamation of the Buddha's teachings. The conch represents the sound of the Dharma reaching far and wide, awakening beings from ignorance. It is one of the 7 auspicious symbols in Buddhism.
In Asia, the conch has long been used as a battle horn. In the Hindu epic The Mahabharata, the sound of the hero Arjuna's conch terrorized his enemies. In ancient Hindu times a white conch also represented the Brahmin caste.
Quartz crystal clusters are strong amplifiers of energy and are often used in healing rooms by alchemical healing practitioners. Its metaphysical purposes are vast, from helping to expand consciousness to facilitating open communication and stimulating the chakras.
This conch is decorated with filigree, an ornamental work of fine electric plated silver wire which is formed into delicate tracery.
Tell a friend about Quartz Conch, Buddhist Auspicious Symbol 6 1/2"


commuter/touring miles since Oct 13, 2004 31,869 - REALLY ?! Over 30,000 miles in 9+ years? I never dreamed I'd get that far, starting out I thought if I got 1,000 miles a year that would be awesome.
I'm Geoff, and this site is for you if bike riding is an important part of your life, or you want it to be. I am a bike commuter, about 17 miles round trip most days. Bike commuting for nearly 9 years now, and I've been riding about 18 seriously. My goal is to help more people get on bikes by showing examples of what I and others are doing, and to connect you to helpful resources.
What I'm not... a racer, a fitness fanatic, a tri-athlete. I cycle for transportation, health, and to interact with other humans and the outdoors. I'm a plow horse, not a thoroughbred. I have a cycle computer and keep track of miles and time...which I track in a daily journal. Along with weight and consumption of food and beverages, the journal tells a lot about myself at the end of the month and year.
I save about $7,000 a year by not owning a car. I rent a few times a year, and "enjoy the thrill" of a new car for a couple days or weekends. It took a couple years to realize how much more sense a bike makes. Now in my 10th year without a car, I don't miss having one at all.
It helps to strategically buy a home within a mile or two of everything you need, on a bus line (rail too here in Phoenix). For us, with our last 2 homes, that's a priority when we choose where to live, it's our lifestyle, I HAVE to be able to get to work without a car!
YOU CAN DO IT, YES YOU CAN! WHO's stopping you? ONLY YOU.


Morgan makes no illusions as to what it is. The initial teaser trailer made it look original, intriguing, and it had an air of mystery. Cue the following trailers, and the target audience may have already figured the whole film out prior to minute one.


text:
CACI 2811 Co-Employee's Willful and Unprovoked Physical Act of Aggression—Essential Factual Elements (Lab. Code, § 3601(a)(1))
2811 Co-Employee's Willful and Unprovoked Physical Act of Aggression—Essential Factual Elements (Lab. Code, § 3601(a)(1))
[Name of plaintiff] claims that [he/she/nonbinary pronoun] was harmed because [name of defendant] assaulted [him/her/nonbinary pronoun]. To establish this claim, [name of plaintiff] must prove all of the following:
1.That [name of defendant] [insert one of the following:]
[engaged in physical conduct that a reasonable person would perceive to be a real, present and apparent threat of bodily harm;]
[touched [name of plaintiff] [or caused [name of plaintiff] to be touched] in a harmful or offensive manner;]
[insert other act of physical aggression];
2.That [name of defendant]'s conduct was unprovoked;
3.That [name of defendant] intended to harm [name of plaintiff];
4.That [name of plaintiff] was harmed; and
5.That [name of defendant]'s conduct was a substantial factor in causing [name of plaintiff]'s harm.
New September 2003
This instruction is intended for use in cases where a co-employee is the defendant and the plaintiff alleges that the case falls outside of the workers' compensation exclusivity rule. If this instruction is used, do not use standard tort instructions on assault and battery.
•Exclusive Remedy: Exception for Coemployee's Willful and Unprovoked Physical Act. Labor Code section 3601(a)(1).
•"As relevant here, a civil suit is permissible when an employee proximately causes another employee's injury or death by a 'willful and unprovoked physical act of aggression' or by intoxication. If an employee brings a lawsuit against a coemployee based on either of these exceptions, the employer is not 'held liable, directly or indirectly, for damages awarded against, or for a liability incurred by the other employee … .' This provision is consistent with the view that a coemployee is immune from suit to the extent necessary to prevent an end-run against the employer under the exclusivity rule. 'It is self-evident that Labor Code section 3601 did not establish or create a new right or cause of action in the employee but severely limited a preexisting right to freely sue a fellow employee for damages.' " (Torres v. Parkhouse Tire Service, Inc. (2001) 26 Cal.4th 995, 1002 [111 Cal.Rptr.2d 564, 30 P.3d 57], internal citations and footnotes omitted.)
•"[W]e conclude an 'unprovoked physical act of aggression' is unprovoked conduct intended to convey an actual, present, and apparent threat of bodily injury. A 'threat,' of course, is commonly understood as 'an expression of intention to inflict evil, injury, or damage' and as '[a] communicated intent to inflict harm or loss on another … .' Thus, 'unprovoked physical act of aggression' logically contemplates intended injurious conduct. By adding the term 'willful,' the Legislature has underscored the need for an intent to bring about the consequences of that expression, i.e., an intent to inflict injury or harm." (Torres, supra, 26 Cal.4th at p. 1005, internal citations omitted.)
•"As with other mental states, plaintiffs may rely on circumstantial evidence to prove the intent to injure." (Torres, supra, 26 Cal.4th at p. 1009.)
•"[T]o invoke civil liability under section 3601, subdivision (a)(1), a physical act causing a reasonable fear of harm must be pleaded and proved, but the resulting harm need not also be physical." (Iverson v. Atlas Pacific Engineering (1983) 143 Cal.App.3d 219, 225 [191 Cal.Rptr. 696].)
•"We agree that conduct constituting a common law assault may be actionable under section 3601(a)(1), provided that the conduct was intended to injure … ." (Soares v. City of Oakland (1992) 9 Cal.App.4th 1822, 1829 [12 Cal.Rptr.2d 405].)
•"In general, if an employer condones what courts have described as 'horseplay' among its employees, an employee who engages in it is within the scope of employment under section 3601, subdivision (a), and is thus immune from suit, unless exceptions apply." (Torres, supra, 26 Cal.4th at p. 1006, internal citations omitted.)
2 Witkin, Summary of California Law (11th ed. 2017) Workers' Compensation, §§ 73, 74
Chin et al., California Practice Guide: Employment Litigation, Ch. 5(I)-F, Intentional Interference with Contract or Prospective Economic Advantage, ¶ 5:624 (The Rutter Group)
Chin et al., California Practice Guide: Employment Litigation, Ch. 13-I, Collateral (Non-OSHA) Actions Relating to Occupational Safety and Health, ¶¶ 13:951, 13:962 (The Rutter Group)
Chin et al., California Practice Guide: Employment Litigation, Ch. 15-F, California Workers' Compensation Act Preemption, ¶¶ 15:546, 15:569, 15:632 (The Rutter Group)
1 Herlick, California Workers' Compensation Law (6th ed.), Ch. 12, Tort Actions—Subrogation, § 12.22 (Matthew Bender)
1 California Employment Law, Ch. 20, Liability for Work-Related Injuries, § 20.43 (Matthew Bender)
1 Levy et al., California Torts, Ch. 10, Effect of Workers' Compensation Law, § 10.13 (Matthew Bender)
51 California Forms of Pleading and Practice, Ch. 577, Workers' Compensation, § 577.316 (Matthew Bender)
23 California Points and Authorities, Ch. 239, Workers' Compensation Exclusive Remedy Doctrine (Matthew Bender)

redpajama_set_name: RedPajamaCommonCrawl


text:
Alex Cross (2012)
Doesn't work as a film; so much of what we see and hear is so lacking in context and logistics, it's almost as if the filmmakers expected us to take these events for granted.
Written by: Chris Pandolfi | October 20, 2012
Alex Cross doesn't work as a film, although it does prove that Tyler Perry can be a successful leading man in projects he has no creative and/or financial control over. He takes the reins from Morgan Freeman as the title character and is about as convincing as he can be in what's essentially nothing more than an action/crime thriller. The issue here isn't his casting or his performance; it's the way director Rob Cohen and writers Marc Moss and Kerry Williamson restructure the character into someone we won't especially like when the movie is over. It's also the plot and the development of the other characters. So much of what we see and hear is so lacking in context and logistics, it's almost as if the filmmakers expected us to take the film for granted. I suspect that only those intimately familiar with James Patterson's original novels – including Cross, this film's inspiration – would be able to do that.
Taking place almost entirely in Detroit, we find Detective Cross on the trail of a serial killer (Matthew Fox), whose real name isn't known but who's referred to both as Picasso and The Butcher. He earns the first nickname for his charcoal drawings of his victims, some lifelike, others abstract. The second nickname, which he bestows on himself during an unnecessary MMA sequence early on, stems from his compulsion to torture his victims to death after injecting them with a newly developed toxin, one that keeps the recipient physically paralyzed yet mentally aware. He claims to be fascinated by pain, and indeed, we see him cutting the fingers off of a woman and cauterizing the wounds with a mini blowtorch. He's not some random psychopath; he has the expert skills of a marksman and a fighter, suggesting a military background, and he's technically savvy, able to manipulate highly advanced electronic equipment.
Cross isn't quite a modern-day Sherlock Holmes, although his powers of observation are remarkably keen. His deductive reasoning skills, on the other hand, are a little rusty, which is astonishing given the fact that he's also a psychologist. He isn't able to foresee, for example, that The Butcher will come after Cross and the team assigned to his case. For Cross and his partner/best friend, Tommy Kane (Edward Burns), what begins as a case of international intrigue will soon become excruciatingly personal. This is the point at which both men, Cross especially, drop the dutiful police act and become vigilantes hell bent on having their revenge. No doubt they're both suffering, but some of the lengths they go to are so unpleasant that we find we can't root for them anymore – certainly not to the extent the filmmakers want us to.
Regarding the international intrigue, it's surprisingly difficult to make heads or tails of. This isn't to suggest it's needlessly convoluted. Simply put, it never feels as if we're being given enough information; it's a little like entering a conversation that's halfway finished. This makes the ending especially problematic, as that's the point at which all is revealed. If there aren't enough clues left behind, how can we be expected to piece them together and make sense of the obligatory explanation? The character of The Butcher presents a similar problem, since we're given no real insight as to who he is. What kind of background did he have? What could have possibly led to his unhealthy fascination with pain and torture? Perhaps we could have overlooked this had Fox's performance not been so exaggerated. The way he delivers certain lines, you'd swear he was a descendant of a James Bond villain.
An attempt is made at examining Cross' personal life, and to a much lesser extent, Kane's. I cannot reveal too much about either man's life, as their actions and behaviors late in the film depend on events that cannot be spoiled, predictable though they may be. I can say that Cross is introduced as having a pregnant wife named Maria (Carmen Ejogo), as well as son, a daughter, and an elderly mother (Cicely Tyson), who serves no real purpose other than being a firm, no-nonsense grandmother and her son's voice of reason. I can also say that Kane is secretly dating another detective named Monica Ashe (Rachel Nichols); both of them know that their being romantically involved is dangerous, not only to themselves but also to their department.
As we all know, Tyler Perry is primarily known for his comedic Madea films, the vast majority of which star and are written, produced, and directed by himself. On the basis of this film, I have no doubt that he can be a reliable and entertaining leading man in films he did not have a hand in creating – an actor that could believably be featured in a wide variety of movies, from character-driven dramas to escapist summer blockbusters. His performance in Alex Cross is competent enough, even though the film itself fell short of that goal. If by some miracle this movie spawns a new series of James Patterson adaptations with Perry as the star, I can only hope more of an effort will be made to ensure that each new chapter is more original, more comprehensible, and more interesting. And with any luck, his character will be developed in such a way that he's actually likeable.
[vc_row][vc_column width="1/3″][vc_tabs][vc_tab title="Release Date" tab_id=""][vc_column_text]
[/vc_column_text][/vc_tab][/vc_tabs][/vc_column][vc_column width="1/3″][vc_tabs][vc_tab title="Rating" tab_id=""][vc_column_text]
[/vc_column_text][/vc_tab][/vc_tabs][/vc_column][vc_column width="1/3″][vc_tabs][vc_tab title="Studio" tab_id=""][vc_column_text]
[/vc_column_text][/vc_tab][/vc_tabs][/vc_column][/vc_row]
About the Author: Chris Pandolfi
Chris Pandolfi is Los Angeles-based freelance film critic trying to make sense of this crazy, topsy-turvy world.
Newcomer (2018)
Teenage Mutant Ninja Turtles: Out of the Shadows (4K Blu-ray)
Teenage Mutant Ninja Turtles: Out of the Shadows (2016)
by Chris Pandolfi
Emperor (2013)
Friends With Kids (2012)


Like my Facebook page and follow me on Instagram by clicking the links below!
I have been working behind the chair for about 6 years, and I absolutely love what I do! After obtaining my education from Paul Mitchell the School Columbus, I went on to work and continue my training at one of the top salons in Columbus. I have extensive training in French cutting techniques, and create custom color for my clients using the Wella coloring system. I specialize in blondes, balayage, and dimensional color!
Additionally, I am a licensed distributor of HALOCOUTURE Extensions! One of the best things about being my own boss is I can pick and choose the services and products I offer to clients! In my search to offer clients affordable, good quality, non-damaging extensions, I found Halocouture! Halocouture extensions are self-applied, damage-free, and made of the highest quality 100% Remy Human Hair. I have been educated to color match and choose the appropriate length/thickness for my clients' hair needs!
My goal as a stylist is to send my clients out the door with hair that will not only get them compliments, but a style that they have the ability and know-how to recreate at home. I think that an in-depth consultation is crucial when determining a style that is right for my clients. I believe that hair styling is both a science and an art, and it is the combination of both that lead to stunning results!
Sandy is amazing! I went to several stylists before I found her and no one else was able to make my balayage look as beautiful and natural as Sandy. She really has an eye for what will look good, and she is very dedicated to making sure her clients are happy! I now live 2 hours away from Columbus, but continue to come back here to see Sandy. I always leave feeling so happy with my hair- can't wait for my next appointment!
Sandy is a miracle worker... the best! I was lucky enough to snag Sandy for my wedding (I live in NYC, but our wedding was in Ohio) and from start to finish she was beyond flexible, doing my trial run based on my limited schedule, traveling to our hotel to finish the entire bridal party (with plenty of time to spare) - the list goes on! Not to be forgotten, the most important part, the hair! She listened to all of my thoughts on what I was envisioning and gave me the perfect look to match my dress. She also tailored each hairstyle of the bridesmaids to fit their request/personality. Sandy knows what's in style - you cannot go wrong with her. On top of that, her sweet personality gave us the calm (but fun) pre-wedding vibes we were looking for. If I got married 100 times, I'd pick her every single time.
Where do I even start?! Sandy is THE best hairstylist I've found and trust me when I say I've been through a lot. She's knowledgeable fun personable and always makes me feel great.
Sandy did a great job! She talked over some options with me after I gave her a rough idea of what I wanted. She ran with it and my hair turned out great! Sandy was also really fun to talk to and the time flew by. I would highly recommend Sandy especially to someone who isn't quite sure what they're looking for. Sandy will take the time to discuss options and makes sure you get what you want.
I walked into Sandys chair about a year ago- I couldn't quite pinpoint what I wanted, but knew what I DIDNT want. I let Sandy do what she thought was best for my hair and face shape. She nailed it. I've never liked a color or cut better.
Sandy always does an AWESOME job on my hair! Since coming to her, my hair has looked and felt awesome, and I receive so many compliments. Sandy will definitely take the time to make sure you are happy with what she is doing. She does an amazing job with my color and trim every time. I would recommend her to anyone!
Sandy is fantastic! i always leave with beautiful hair that feels fantastic. i love my hair so I'm very picky about it and sandy always does exactly what i want! it took me a long time to find someone that I really trusted and liked and i finally found it with Sandy! thank goodness! :) i definitely recommend her for everyone!
I had an appointment recently with Sandy, and I must say I loved the entire experience. She was very informative and definitely helped me pick the right style for me. I really enjoyed the how to she gave me a few pointers on how to style my hair better once I went to shorter hair. I have always been in love with my new cuts from Sandy and will most certainly be back for another appointment in the next couple months!
I did not have a hair stylist for over a year and was in desperate need!! I am so glad I chose to go to Sandy! She did an amazing job! She helped me understand what could and couldn't work well with my hair and made it look fabulous! Thank you bunches!!!
Sandy did such an amazing job with the cut, color, and styling of my hair! I was very happy with the way my hair looked when I left the salon. The color looked better than it has ever looked before. The highlights she did on my hair were blended so well and looked very natural, which is exactly what I wanted. I have received so many compliments on both the cut and color of my hair from my friends and family. I have already recommended Sandy to some of my friends and would refer her to anyone who wants a great cut and color. I am very excited for Sandy to do my hair again! -Audrey M.
Sandy did an AMAZING job with the cut and color of my hair. I have received so many compliments on the style, and could not be happier! I would recommend Sandy to anyone. She's great at what she does and I will definitely be going back for a long time!
I have been going to Sandy for a while now and would NEVER trust anyone else with my hair. Sandy has taken me from a bright red ombré , to purple, and now to a crazy blue/green. She is absolutely amazing and knows exactly what to do with my hair to make it perfect every time !
I was referred to Sandy by a couple mutual friends. Sandy and I hit it off from the start. We spoke the same "hair language". I knew I was going to be in good hands. She demonstrated complete confidence and enthusiasm behind the chair. I would recommend Sandy for someone looking for something fun, edgy and easy to maintain. My cut has great movement thanks to interior layering and soft ends. Thanks Sandy!!
Sandy was amazing! I came in having no clue of how I actually wanted my hair cut. I basically only gave her some vague guidelines and it turned out great! She is also very nice and personable. She gave me some suggestions on my hair that I definitely intend to come back and take her up on. Thanks Sandy!
Sandy has been cutting my hair since she was in cosmotilogy school! Prior to trying Sandy, I was still driving 2 hours back to my college town to get my hair cut and colored because I didn't trust anyone in town! She has done everything from a simple trim to hand painted balayage on me. She even got me back to my natural color (dirty blonde) after going super dark with minimal damage to my hair. Every time I get s super consistent cut that I love! She knows her stuff, cut, color you name it!


text:
Parts and Service - The Full Story
by Sean Ruck, Contributing Editor | November 04, 2014
Rating saved
From the August 2014 issue of HealthCare Business News magazine
When even preventative maintenance can't fend off an unforeseen system failure, the service also offers equipment repair options, onsite support and loaner equipment as well as a troubleshooting helpline for service- related questions, according to Rizzolo.
Rizzolo says the ProCare service team undergoes a rigorous training program in order to be ready to repair equipment according to OEM standards. "For all medical equipment, but especially those used in direct patient care, it is important that the devices being repaired are working in compliance with the highest OEM standards," she says. "Stryker ProCare service providers are specially trained and certified to handle and repair parts according to the manufacturer's instructions. They also have access to OEM original parts and the tools specifically designed to repair that equipment, which can elevate health care provider's confidence in the repair and reduce the risk of malfunction or the need for additional repairs and services."
Rizzolo says it's common for hospitals to make the mistake of thinking that all service contracts provide them with the full line of services they need. That's not necessarily the case, she says. "Hospitals should first evaluate their equipment service needs before selecting a service provider. Once a hospital has identified the breadth, volume and criticality of supplies in their facility, they can make an informed decision regarding what level of service they require and which provider can best match their needs."
During the negotiating process, it's also important for decision makers to ask questions about the level of experience the service techs will bring to the table as well as finding out what certifications they hold and how accessible they are. After all, even the most experienced and knowledgeable technician is of little use if they can't be reached in a timely manner.
In the future, Rizzolo expects to see more hospitals partnering with quality service providers and service providers working hard to keep staff abreast of the latest in medical equipment updates as the equipment continues to evolve at a rapid pace. She believes the relationship will only grow deeper between hospitals and service providers as the need to provide better care at a reduced cost becomes even more of a priority.
The role of Bayer's arms
Bayer Healthcare has two distinct service arms that deliver support to customers. The first, Bayer HealthCare service strictly focuses on providing preventive maintenance and repair for Bayer radiology and interventional equipment. Anne Osbourn, U.S. service marketing at Bayer, says it's important to note that service on those products is not limited to theU.S., with service on devices in other parts of the world supported through Bayer Medical Care's hub in Maastricht in the Netherlands and through a large network of distributors.
Sign up for Weekly Top stories
If you've already created an account, use your email address and password to sign in using the form below.
Login Problems?
View our Legal Notice and Privacy Notice
Enjoy the benefits of The World's Leading New & Used Medical Equipment Marketplace.
August 2014 Magazine
Read more stories from the August 2014 issue
More Industry Reports
Patient Monitors – Fighting alarm fatigue, EMR integration and going wireless
C-arm sector features new models, improvements in technology
OEMs roll out new offerings for special procedures
RTLS market for health care to exceed $3 billion by 2022
PACS and RIS: Surviving a consolidated enterprise in the EMR era
Ex-Ohio State University radiologist wins $100,000 discrimination lawsuit
Bearing the load: What to consider when installing ceiling-mounted equipment
Bringing it all in-house: Intermountain Healthcare blazes the trail in Utah, Idaho
Hospitals can save millions of dollars with MES contracts


Emerald polymer clay round pavé bead inlaid over the whole surface with foil backed emerald coloured crystal rhinestones. Approximate measurements diameter10 mm, hole 1.5 mm. Great for making Shamaballa style bracelets.


Do you know the difference between a phillips and flat screwdriver? How many different types of wrenches and hammers are there. Want to learn the basics of Tools? Come join Dipsy Doodle and learn how to fix things without asking for help. This two hour workshop will give you basic knowledge of tools and how to use them. Please call the store at 706-867-4908 or drop by to sign up. This class should fill up quickly.
1 3/4 miles from the intersection of GA 400 and Highway 60 going toward Murraryville.
Only $5.00 for this workshop.


An-10 is a unique wireless system designed to control lighting.
An-10 switch module. This module is used to connect switches to the An-10 system. The modules transmits signals to any An-10 sensor or relay in the system. The module has inputs for up to 7 push buttons.
An-10 wireless module for Vitesse modular quick connection system. The module creates a wireless extension to the modular quick connection system. As the An-10 sensor or sensors can be positioned anywhere and communicate wirelessly with the module relay, a high level of flexibility is created.
Wireless lighting relay for installation in fixture. The relay is installed in the fixture and receives a wireless signal from one or more An-10 sensors. Has two-way communication with other An-10 units in the system, providing a high level of reliability. One benefit is that the lighting control system can combine on/off, Dali, Dsi and 1-10 V products. Suitable for installation in all kinds of fixtures.
Wireless HF corridor sensor with a detection range of up to 30 m. Flexible system to create advanced lighting control systems with simple programming and without extensive installation work. The system can be easily extended as the property is automated. If required, the sensor's detection range can be targeted for corridor like detection areas, see diagram. Suitable for larger rooms, corridors, etc.
Wireless Compact PIR sensor with modular quick connector for efficient installation. The sensor is available in three different models. The sensor has two-way communication with other An-10 units. Suitable for installation in small areas, or an infinite number of sensors can be connected in parallel.


Vintage 586 Silver Modern Rug is a new collection of transitional & Modern patterns in muted tones. Machine woven using soft feel Polyester yarn, Design 586 has a floral and decorative pattern that resembles traditional Persian Rugs. Available in 6 patterns and 3 sizes, it is an ideal rug to sit with both modern and traditional room-setting.


The Colloquium on MSP & Science aims to discuss about the actual challenges and demands about science for MSP, in order to identify key needs that research should address in the coming future. MSP initiatives are growing worldwide, and there is a need for science to support MSP elaboration and implementation for effective actions towards sustainable development of the oceans.
The colloquium will see the participation of scientists and policy makers, discussing and brainstorming on the needs and challenges that science for MSP should address. The dialogue will start from the contribution of some invited MSP experts, in order to understand the current state of the art about research on MSP, and to define key concerns for research arising from MSP initiatives. The discussion will be nourished by the participation of decision makers and actors from the maritime industry, in order to reflect on the real demands rising from agents operating on Blue Growth and MSP.
The Colloquium on MSP & Science is part of the activities financed by JPI Oceans and CSA Oceans 2. The Colloquium is part on the Work Package on "Science support to coastal and maritime planning and management: Building an efficient interdisciplinary scientific community for policy relevant knowledge", lead by Italy.


text:
Posts tagged Sam Sparro
#skoaradio 10/24/2015 liner notes
artist rendition of my convo with Alex from Kingswood after I shut the mic off post-interview.lol
Hey fam!
Things refuse to slow down in SKOA HQ, but I'm not complaining! I wrapped up CMJ with a day in Aussie Heaven where we interviewed KINGSWOOD prior to watching them totally kill it. I can't believe how much fun I had. Kinda wish it had never ended tbh. Oh well. Time to prep for Brooklyn Electronic Music Festival, which is coming up super fast. I've got a couple of new tracks on this week's show. As always would love to hear your thoughts so @ me bb if you liked what you heard!
kibbe!
Battle Tapes - "Valkyrie"
Debut album Polygon drops on November 20th!
BOOTS - "Bombs Away"
New track "C.U.R.E." out now
Debut full length Aquaria drops November 23th!
BOOTS is playing Rough Trade for his release show! You've officially missed your chance to get tix :(
Good Morning - "You"
Official writeup of my interview with them from last week's CMJ show coming soon!
Car Seat Headrest - "Times To Die"
New album Teens of Style drops October 30th!
Shows coming up in the UK & US.
Weaves - "Motorcycle"
Did you know that THE NEW YORK TIMES reviewed one of their CMJ shows!?! AMAZING!!
Monarchy - "Black Widow"
These guys just wrapped up their final shows for 2015 (</3).
Have you picked up Abnocto or ReVision yet!?
Sam Sparro - "Hands Up"
Sam's new EP Quantum Physical Vol 2 is out now! GO GET IT!
Kenna - "Sleep When We Die"
Dude just finished up 35 days of traveling to shoot his "Sleep When We Die" video. The NYC Core got some hugs with him while he was here.
Go help fund Songs For Flight!
JR JR - "Gone"
JR JR available now.
Slum Sociable - "All Night"
Go grab TQ now
You can also see pitchas of these guys from my CMJ coverage. I may or may not have seen them three times :)
Little May - "Boardwalks"
Caught these little darlings this week at Mercury Lounge. Show review coming soon!
Go grab their album For The Company asap okay
Don Diablo & Matt Nash - "Starlight (Could You Be Mine)"
Don Diablo moved up like a gazillion slots to NUMBER 30 IN DJ MAG'S TOP 100 DJS LIST OMG YAYYYY!!
Interpol - "All Fired Up"
If you don't have their latest record, El Pintor well then shame on you (this track is from Our Love To Admire tho)
The Dead Weather - "I Feel Love(Every Million Miles)"
Dodge and Burn is good fam, you needs it.
KINGSWOOD Interview!
KINGSWOOD - "Ohio"
Hope you enjoyed this interview. Don't worry, imma pull out the good bits to write up all official :)
Mr. Hudson - "Dancing Thru It"
I'M. SO. HAPPY. HE'S. BACK!!!!!!!!!
Can't be too mad considering he was off working on the new Duran Duran album, which is great tbh.
Also the Souncloud page for this says MORE MUSIC COMING. YES YES YES YES YES.
Magic Sword - "Battlefield"
Have you read the comic for this btw? Pretty cool stuff.
Official write up for this interview is coming soon too. :)
Sami Switch - "Self Destruct"
This guy's story is so cool. You have to watch this mini docu about his trajectory in the past few years. He's gone from homeless to selling out shows in London. Good for him.
Wrabel - "I Want You"
Still tryna figure out why "bae-bel" still hasn't upped this to iTunes/Spotify/Whatever yet. It's on YouTube and Soundcloud at least? And you can haz for $FREE.99
Anyway you can grab his first EP Sideways to show love. I think that's fair right?
THINGS I TALKED ABOUT ON THE SHOW THIS WEEK INCLUDE:
Spotify pulled all of Victory Records catalog (oof).
Not Convinced That Spotify Is A Music Discovery Platform? Check Out These Mercury Prize Streaming Bumps
Apple has a third as many paying subscribers as Spotify
SKOA Radio, interviewkibbe! October 24, 2015 Battle Tapes, BOOTS, Good Morning, Car Seat Headrest, Weaves, Monarchy, Sam Sparro, Kenna, JR JR, Slum Sociable, Little May, Don Diablo, Interpol, Kingswood, Mr Hudson, Magic Sword, Wrabel
[Watch] Sam Sparro - "I Wish I Never Met You" (Video)
After four long years Sam Sparro is back! He's dropped a few tracks in the past few months (not in the US though, unfortunately) as we all anticipate his forthcoming sophomore album Return To Paradise, which follows up his 2008 self-titled release. Today we have the video for his latest single, "I Wish I Never Met You", which looks something straight out of Boardwalk Empire with its Prohibition-esque scenes directed by Mike Rosenthal.
Just this past weekend I ended my Record Store Day catching Mr. Sparro over at Highline Ballroom where he played a ton of the new material including this song. He intro'd a lot of songs explaining that he went through a really nasty breakup and wrote his way out of the bad place it had put him in. "I Wish I Never Met You" resonated well in the room and from the looks that the crowd was giving Sparro they had all felt the same way he did when he wrote this song.
Return To Paradise is slated for a June 11th release in the UK. No word on a US release yet. More on that in the coming months.
Also, please be patient with this video while it loads in all of it's non-geo-locking glory.
upcoming releases, Reviewskibbe! April 23, 2012 Sam Sparro
[Watch] Lyrics Born - "Coulda, Woulda, Shoulda (feat. Sam Sparro)"
Check out this funky little number from Lyrics Born featuring vocal stylings courtesy of the super talented Sam Sparro. "Coulda, Woulda, Shoulda" is from Lyrics Born's As U Were, which dropped late last year.
I love how this video makes me think of Soul Train, am I right?
Reviewskibbe! May 23, 2011 Lyrics Born, Sam Sparro
[Listen] Lyrics Born - "Coulda Woulda Shoulda" Feat. Sam Sparro
At the start of the week Lyrics Born released his new album As U Were and we have a funky as funk track for you to give a good listening to below. It features Sam Sparro who last night tweeted that he was finishing up the last track on his new record... Something else to look out for in the coming months. This track is really nice, check it out for yourself down below. You can pick up Lyrics Born's new album over here.
Lyrics Born - "Coulda Woulda Shoulda" Feat. Sam Sparro by Some Kind of Awesome
ReviewsShey October 29, 2010 Lyrics Born, Sam Sparro
[Download] Ok Go - "White Knuckles (Boys Like Us Remix) & (Sam Sparro Remix) "This Too Shall Pass (Ra Ra Riot Remix)"
Here's a fun little treat for you! There's an Ok Go promo disc floating around called Twelve Remixes Of Four Songs and because we love you guys we're going to toss a few of the remixes your way.
Two remixes are of "White Knuckles", one from Boys Like Us (aka Rostam Batmanglij of Vampire Weekend fame) and the other is from the well loved Sam Sparro, who is currently working with Theophilus London and Mark Ronson on a project called Chauffeur. The other track, "This Too Shall Pass" was remixed by Ra Ra Riot, whose album The Orchard drops tomorrow.
OK GO - Twelve Remixes Of Four Songs by Some Kind of Awesome
Reviewskibbe! August 23, 2010 Mark Ronson, Ra Ra Riot, Sam Sparro, Theophilus London, vampire weekend


text:
<?php

namespace backend\controllers;

use Yii;
use common\models\Districts;
use backend\models\DistrictsSearch;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;
use yii\web\ForbiddenHttpException;
use yii\data\ActiveDataProvider;

/**
 * DistrictsController implements the CRUD actions for Districts model.
 */
class DistrictsController extends Controller
{
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'rules' => [
                    [
                        'allow' => TRUE,
                        'matchCallback' => '\common\models\User::hasBackendAccess'
                    ],
                    [
                        'allow' => FALSE,
                    ],
                ],
            ],
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'delete' => ['post'],
                ],
            ],
        ];
    }

    /**
     * Lists all Districts models.
     * @return mixed
     */
    public function actionIndex()
    {
        $searchModel = new DistrictsSearch();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

        return $this->render('index', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
        ]);
    }

    /**
     * Creates a new Districts model.
     * If creation is successful, the browser will be redirected to the 'view' page.
     * @return mixed
     */
    public function actionCreate()
    {
        $model = new Districts();

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->redirect(['index']);
        } else {
            return $this->render('create', [
                'model' => $model,
            ]);
        }
    }

    /**
     * Updates an existing Districts model.
     * If update is successful, the browser will be redirected to the 'view' page.
     * @param integer $id
     * @return mixed
     */
    public function actionUpdate($id)
    {
        $model = $this->findModel($id);

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->redirect(['index']);
        } else {
            return $this->render('update', [
                'model' => $model,
            ]);
        }
    }

    /**
     * Deletes an existing Districts model.
     * If deletion is successful, the browser will be redirected to the 'index' page.
     * @param integer $id
     * @return mixed
     */
    public function actionDelete($id)
    {
        $model = $this->findModel($id);
        if(count($model->sectors)){
            throw new ForbiddenHttpException('Sectors related to this district still exist. It can not be deleted.');
        }
        $model->delete();

        return $this->redirect(['index']);
    }

    /**
     * Finds the Districts model based on its primary key value.
     * If the model is not found, a 404 HTTP exception will be thrown.
     * @param integer $id
     * @return Districts the loaded model
     * @throws NotFoundHttpException if the model cannot be found
     */
    protected function findModel($id)
    {
        if (($model = Districts::findOne($id)) !== null) {
            return $model;
        } else {
            throw new NotFoundHttpException('The requested page does not exist.');
        }
    }
}

redpajama_set_name: RedPajamaGithub


The tube ride from Waterloo on my way to another museum was crowded. Oh yeah, I love museums now, they somehow prod my dormant brain neurons to perk up a bit. Lots of people were out today, the weather's great. I glanced in a newspaper headline that winter is gone, which is abnormal because it's way too soon. It's the effect of global warming, I guess. Huhuhu what have we done to our Mother Earth?!?
Okay back to the tube ride. Like I said it was crowded. I was standing in the middle holding on a rail when I noticed that I was squeezed in the middle of 3 couples. Aside from feeling small and so Asian because they were so tall, I felt more lonely than ever. And what's even more deppressing was that all the three guys were uber handsome --- arrrgghhh! I even had difficulty deciding which among them was more eye-candyish among them. Cruel, cruel world! There I was all alone, in the midst of three eye-candies cuddling and so touchy-touchy with their gfs, while all I had was the rail to hold on to.
You can feast the gorgeous English guys all you want with your eyes but I'm afraid they're not lifetime partner material. Oh most English guys are nice, kind and always behave gentlemanly. But they're also flirty... too flirty. I have this colleague that I sit next to in the office whom I had thought was a great guy. He always talked praises about his wife - he always goes "Lara this, Lara that". I had thought awww he's so sweet, that I didn't give malice when he started sending me IMs that he liked my wiggle (the way I walk daw) and my legs (which I don't believe). But that night we went to a pub, I was already at home when I received a text from him saying that he liked me a lot and that he's afraid that it wouldn't go away. I was aghast, I had thought he was a perfect husband! Oh it must be the effect of the beer but still I wouldn't want a partner who goes hitting on other women everytime he gets a drink... no way! Or that creep maybe just wanted to test if papatulan ko sya. Heller, okay lang sya?!? No wonder the divorce rate here is so high.
Therefore, I conclude sa Pinoy pa rin ako. Because of the influence of religion, the fear of eternal damnation if one commits mortal sin, most Pinoys are faithful to their wives... I guess. So yeah Pinoy pa rin ako.


I led the WikiSym workshop and am a [[http://video.google.de/videoplay?docid=6572941025419743765|cat herder]] of Creole along with [Christoph Sauer], [Janne Jalkanen] and [Ward Cunningham]. I started this project when I worked for the [i3g Institute|http://www.i3g.hs-heilbronn.de] of the Hochschule Heilbronn, but am now running this project on the side. I am also the founder of the Esperanto Wikipedia and the head developer of the [WikiWizard|http://www.wikiwizard.net/]. On the side, I also run an [[http://www.eklaboru.com/|Esperanto job site]] and an [[http://www.amikumu.com/|Esperanto social networking site]].
I led the WikiSym workshop and am a [[http://video.google.de/videoplay?docid=6572941025419743765|cat herder]] of Creole along with [Christoph Sauer], [Janne Jalkanen] and [Ward Cunningham]. I started this project when I worked for the [i3g Institute|http://www.i3g.hs-heilbronn.de] of the Hochschule Heilbronn, but am now running this project on the side. I am also the founder of the Esperanto Wikipedia and the head developer of the [WikiWizard|http://www.wikiwizard.net/]. On the side, I also run an [[http://www.eklaboru.com/|Esperanto job site]] and an [[http://www.amikumu.com/|Esperanto social networking site]]. I am currently living in Berlin.


Mumbai: The face of salt-to-software conglomerate Tata will change in the next 10 years as it moves forward with adopting new technologies and responds to the needs of a fast-growing nation, former chairman Ratan Tata said in a CNBC TV18 interview on Wednesday.
Hinting at consolidation and possible divestments of certain businesses which once defined the group, Tata said the conglomerate may look very different in the next decade, although the 150-year-old group will always strive to retain its culture.
"There will be companies who were not there earlier and companies that were there, not there 10 years from now, because they may not be relevant or they may be sold off or transferred to other companies," said Tata, who is currently chairman of the trusts that control two-thirds of holding company Tata Sons.
Earlier on Wednesday, one of the conglomerate's oldest companies, Tata Steel, and German rival Thyssenkrupp agreed to merge their European steel assets, creating the continent's Number 2 steelmaker.
It is important to retain the ethical fabric of the Tata group and its current chairman N Chandrasekaran is the "right person" to steer the group in the right direction without losing its historical culture, he said.
Chandra, as the current chairman is commonly called, earlier headed the group's most profitable company -- Tata Consultancy Services. He was named head of Tata Sons, the holding company of the diversified group, in January three months after the surprise ousting of former chairman Cyrus Mistry.
Mistry was fired after differences arose between him and Tata. Mistry had accused Ratan Tata and his associates in Tata Trusts of interference in the running of the various companies of the Tata group. Tata Sons, on the other hand, accused Mistry of failing to turn around ailing companies in the group after almost four years in charge.
Tata said he is currently working towards the transformation of the Tata trusts to address the needs of India which requires technology, automation, healthcare and nutrition.
Tata, 79, said he would continue to engage with start-ups and look for opportunities in younger companies backed by the vision and passion of their promoters.
Tata personally has investments in some start-ups such as mobile wallet Paytm, e-commerce firm Snapdeal and ride-hailing service Ola.


text:
Tag: News/Canada/North
Iqaluit residents can drink tap water again, Nunavut's health department says
Nunavut's Department of Health lifted the do-not-consume order in Iqaluit, meaning residents there can once again drink from the city's water supply.Iqaluit's 8,000 residents have spent the last two months unable to drink the city's water from their taps due to...
7-year-old girl from Sambaa K'e, N.W.T., waits 3 weeks for X-ray after getting injured
When Etoah Lamalice fell off a snowmobile, she had to wait three weeks until she got an X-ray to learn her arm was broken."She was really in pain; her little arm was starting to get blue," said Etoah's mother, Valerie. She thought...
Yukon now has highest opioid death rate in Canada, territory's chief coroner says
With 21 deaths since the start of the year, the Yukon now has the highest rate of deaths due to opioids in the country at 48.4 deaths per 100,000 people, according to Heather Jones, chief coroner for the Yukon."For this office,...
Expectant moms distressed as N.W.T. plans to send them to Alberta
Sara Hatcher, an expectant mom in Yellowknife due just before Christmas, had her plans for the birth of her second child all set.She had a doula she liked. Her parents had booked flights from Atlantic Canada to be with her...
Whapmagoostui clinic incident to be learning lesson, says Cree health board chair
A recent complaint from a northern Quebec family who say police were called on them while at a local medical clinic, will be a learning lesson for the board, says the chairperson of the Cree Board of Health and Social Services of...
Yukoners go to emergency room for basic care, after territory's last walk-in clinic closes
For 23 years, Marianne Blythe didn't worry about getting medical care when she needed it.She was a regular patient of the River Valley Medical walk-in clinic in Whitehorse and never had trouble getting an appointment. But when the doctor she...
Police called on Cree family trying to access care for baby in distress in northern Quebec
Members of a Cree family in northern Quebec say they were in shock after police were called to a local medical clinic where they were trying to get help for a baby in distress in the middle of the night."I was shaking uncontrollably. I...
'I'm begging you: Get vaccinated,' Yukon premier implores public while announcing rise in COVID-19 cases
Yukon Premier Sandy Silver implored all Yukoners on Wednesday to get vaccinated against COVID-19, saying there has been "widespread and untraceable" community transmission in Whitehorse."Please, I'm begging you: Get vaccinated," Silver said. He noted a "high risk of COVID-19 exposure throughout the...
Yukon declares state of emergency over COVID-19
Mr 204 - November 9, 2021
The Yukon government has declared a state of emergency, announcing new health regulations aimed at curbing the spread of COVID-19, including a proof-of-vaccination requirement set to take effect on Saturday.The declaration came after the territory reported 80 new COVID-19 infections diagnosed over...
All adults in N.W.T. now eligible for booster shot, say top docs
Dr. Kami Kandola and Dr. Anne MariePegg answered listeners' questions on The Trailbreaker Thursday morning. "We will be offering booster doses as of today to anyone in the territory 18 or over as of December 31," Pegg said. View original article...
All posts loaded


Fans threw bottles and other projectiles at riot police on the Champs Elysees after the semi-final victory over Belgium.
Football fans celebrating France's win against Belgium in their World Cup semi-final clashed with riot police in Paris in the early hours of Wednesday morning.
Fans were filmed throwing bottles and other projectiles at riot police on the famed Champs Elysees, while officers tried to disperse the crowds with smoke grenades.


text:
Q: ALSA passthrough latency I am working on an embedded Linux application with audio passthrough using ALSA. It has very stringent latency requirements.
The output buffer is as small as possible which results in an occasional (perhaps once an hour) underrun on the output. This is acceptable. However, when it occurs, it causes a "backup" in the capture buffer and the result is a creeping increase in latency.
There doesn't seem to be a reliable way to know how much output data was lost in order to discard the same amount of input. I can experiment, but even though it's an embedded application it needs to be device independent, so we need a reliable solution.
Does anyone know a way to determine how much data was lost, or if it is always one buffer, or have other suggestions?

A: If you do not want the PCM devices to stop on an underrun/overrun, configure them not to stop by setting the stop threshold to the boundary value. Then they will just continue to run, and the number of available frames will continue to increase (for capture) or decrease (for playback). (Not all of those frames will be usable; the ring buffer just wraps around.)

redpajama_set_name: RedPajamaStackExchange


text:
Sports Illustrated Debuts 'Tech & Media' Multiplatform Vertical
Tuesday, June 21, 2016 - 10:13 am
Time Inc.'s Sports Illustrated Group debuted "Tech & Media" (SI.com/tech), a new multi-platform vertical that will explore the rapidly evolving and all-important presence of technology in the sports world. In addition to SI's award-winning reporting and analysis, the new venture will feature daily contributions from SportTechie, a leading site covering the global sports and tech scene.
Also anchoring the vertical will be Richard Deitsch's "Media Circus" columns and breaking sports media news. Deitsch, who is a writer/reporter for SI and an adjunct professor at Columbia's Graduate School of Journalism, is the preeminent journalist on the sports media beat and is renowned for breaking news and his access to every major sports media decision-maker, producer, and A-list talent.
"From video replay to VR, from social media to wearables and the total transformation of the full spectator and athlete experience, the crossroads of sports, media and technology is alive with innovation and is an integral part of the sports landscape today," says Chris Stone, Sports Illustrated Editorial Director. "These are deep-dive stories that no one is telling and we are going to cover them across all of our platforms and in the best tradition of Sports Illustrated. This will only be bolstered by our alliance with SportTechie, the incredibly smart upstart site that will stay one step ahead of the competition and build on the mission to help sports fans understand where technology is taking the future of sports."
Multimedia coverage of game-changing innovations, products and strategies and the latest from Deitsch on emerging trends in sports media will run across SI's digital and social ecosystems. Content will be rich in long and short form video with social media heavily integrated into the storytelling. The vertical will also feature native digital content presented in imaginative and compelling packages.
With this new dedicated editorial platform, sports fans and industry insiders will find the latest on tech innovations, ideas and gear transforming fan experiences, player performance and the sports industry as a whole. SI and SportTechie will deliver a mix of multi-platform content daily, including new offerings like a social-first series spotlighting innovators from the sports and tech industries. Long-form features will explore topics not previously introduced to the sports public yet essential to understanding where sports is going: stories such as the development of FreeD, which could dramatically change instant replay for viewers and pro sports leagues by providing precise 360-degree views of the action; the proliferation of sports betting mutual funds; the 3D printers that are building cartilage that is saving the careers of teen athletes; and how the newest, youngest influencers in sports are leveraging digital media to build the industry's biggest, best audiences. This new partnership will also reach more broadly across the SI Group with collaborations slated for The MMQB and other channels beginning this fall.
SportTechie launched several years ago and has rapidly become one of the industry's leading destinations for coverage of the technology of sports. Established as required reading for many top executives in sports business and tech, the growing operation will complement the established SI Group in new and innovative ways.
"We are thrilled to enter into this robust partnership with such an esteemed outlet. In conjunction with Sports Illustrated, my co-founder, Simon Ogus, and I look forward to amplifying the great work of our writers and the stories of the burgeoning sports technology space across our combined global audiences and platforms," says Taylor Bloom, SportTechie's CEO and co-founder. "Technology will never stop evolving sports, and we look forward to remaining at the forefront of that evolution."
CFP National Championship 2022: College Football Playoff's Digital-Video Push Culminates in Epic Title WeekendEluvio Blockchain Technology Powers Charitable Live Stream of iNDIEFLIX's Angst Documentary


After they heard on Monday about the ten-year preliminary plan to phase out the 70-year-old trolleys on the Ashmont-Mattapan Line in favor of new vehicles, riders showed mixed feelings about the proposal in speaking with the Reporter.
Other riders backed her up forcefully, noting that the rides are bumpy, heating is lacking, and the cars are not ADA compliant.
"The old trolleys are not handicap accessible, not just for people who are handicapped, but for mothers," said Diamond Johnson, 25, who takes the line every day. "We have to carry our stroller all the way up the stairs to get on the trolley. It's a lot of work and it holds up time… It feels unsafe and a lot of people don't want to use it," she said, pointing to the platform in Ashmont station.
"The Green Line updated, the Red Line updated…I think it's about time," Jerome, a Quincy College student, said.
But some riders, both old and new, don't see the need to update just yet.
Chaurice Jones, a homemaker from Mattapan, said she never had a problem with the trolleys. She said the rides are not crowded and the drivers are courteous and friendly.
Weighing in, Coleman, a dishwasher from Hyde Park, said, "There was that year when we've got all the snow that they weren't running, but most parts I think they are reliable." Je added that he loves the history of the trolley and noted that new cars would be expensive.
Coleman is not the only one who's concerned that using new vehicles might cost riders more.
Crystal Dias, an executive assistant from Milton who had just taken her first ride on the Mattapan line, said the trolley seems even better than some of the other trains. She noted that the MBTA is raising fares even though "the service doesn't get any better," and said she hopes trolley riders will not charged more to pay for the new car.
Fans of the Mattapan trolley understand the need for new vehicles, and are relieved that MBTA's study showed that paving the railway for buses not a viable option due to cost.
"What we saw in MBTA's report is what we felt from the beginning, which is that the line is in need of significant public investment," added Cullinane. "At same time, what we saw in report is that preserving trolley vehicles would be most cost-effective way to do that."
"It's not every day in a public policy discussion that doing the right thing is also the cost-effective thing," he said.
In other rider reaction: Nora Manley, a Mattapan resident who has been using the trolley for over 20 years, said she's a fan of the old cars but they won't last forever; Joseph Scolastico, a Weymouth railfan, said it's good that the old PCC cars will still be on the rail for the next eight to ten years, and that the line will not become a busway; Bob Shoring, a San Francisco retiree who used to live in Boston and take the trolley, shares the distaste for buses.
"Streetcars or light rail vehicles are normally smoother and more comfortable to ride than buses. Also, being electric, they don't pollute and can accelerate faster. If they replaced them with buses it is likely that fewer people would ride," he said.
Rep. Cullinane agrees. "Buses are going to mean the line is down for the longest period of time, and given that it's also the most costly, I think it's something that's a non-starter for the community, and the report by the MBTA bears that out," Cullinane said. "I've heard it loud and clear that the community wants to keep trolleys on the track. I don't think that there is any doubt where the community stands."
Reporter staff reporter Dan Sheehan contributed to this report.


In 2006, the city administration of Radebeul awarded the Bauherrenpreis (Clients' Prize) to the Historic Goods Shed at Radebeul Ost station. The building combines tradition with innovation harmoniously and stylishly. The Historic Goods Shed originally was used as a reloading point for various goods of the narrow-gauge railway. Thanks to its renovation, it was transformed into an exceptional event location, featuring at the same time historic and listed narrow-gauge vehicles.
Plan your next event at the Historic Goods Shed!
For your conference, meeting, fair, exhibition, gala dinner, reception, anniversary, summer fair or other celebration, we can provide sufficient space and audiovisual systems, complete with the knowledge of our experienced staff. The historic and listed narrow-gauge vehicles create a unique setting with a sophisticated atmosphere. The Historic Goods Shed in Radebeul Ost is located next to the Lössnitzgrund narrow-gauge railway, which invites its passengers to enjoy an unforgettable steam train ride between Radebeul, Moritzburg and Radeburg. We would be pleased to organise a trip on one of our historic trains in and around Radebeul for your.
No matter where, we can make your event a great experience.
Our event team can tailor your event to your individual wishes and budget and can fully or partially organise it. We are cooperating with competent partners, from catering, event technology and culture. Thanks to our many years of experience, your event will be in good hands with us. We'd love to conceptualise, organise and implement your event no matter whether it is to take place in Dresden, Saxony, Germany or anywhere in Europe.


text:
Women and Sentencing
Name of Publication:
Georgetown Law American Criminal Law Review
57-4-Gertner-Women-and-Sentencing.pdf
"In the spring of 2019, I gave the keynote speech at Georgetown Law for the American Criminal Law Review's symposium on Women's Rights in the Criminal Justice System. As highlighted throughout this Symposium Issue, speakers dis-cussed some of the seemingly endless ways the criminal justice system dispa-rately impacts women. The issue that stood out to me most during my time on the bench was the unfair and often illogical impact the now-advisory Sentencing Guidelines impose on women. As I write below, it is far past time for the Sentencing Commission and Congress to recognize that disparity in sentencing may not be unwarranted at all when it comes to male and female offenders. In fact, it may be critical to reflect the real differences between them—the drivers of their criminality, the triggers for their recidivism, and the mechanisms for their rehabilitation. But sentencing is not the only place in which there must be change. This Symposium Issue sets out to address many of the other issues that lead to inequality at nearly every stage of the criminal process."
To read the full article on the Georgetown Law ACLR website click here
promote to sidebar:
Georgetown Law American Criminal Law Review, May 19 2020 Read more »
Testimony before the Committee To Review the Criminal Justice Act Program
Testimony April 2016.pdf
Complicated Process
The Yale Law Journal, Mar 22 2016 Read more »
Gertner_PDF_tkc98w9s.pdf
What Trump's pardons say about criminal justice
A judicial undoing project
Ruth Bader Ginsburg was all I wanted to be
In Defense of Women: Memoirs of an Unrepentant Advocate »
Senior Lecturer on Law
Office: Langdell Library 328
Assistant: Alyssa Lary alary@law.harvard.edu 617-496-5487
Email: ngertner@law.harvard.edu
1525 Massachusetts Ave., Cambridge, MA, 02239
Langdell Library is on the Harvard Law School campus
Visiting Professor of Law, 1985-86, 2011
Judge, U.S. District Court of Massachusetts, 1994-2011
Professor of Practice, 2011
Senior Lecturer on law 2013
Barnard College, Columbia University B.A. 1967, Political Science
Yale University M.A. 1971, Political Science
Yale University J.D. 1971Biographical Inf
Copyright © 2013 Nancy Gertner All rights reserved. | mgmt | staff | admin


Antonino D'Ambrosio is an author, filmmaker and visual artist. D'Ambrosio's most recent film Frank Serpico, recently premiered to critical acclaim in the Spotlight section of the Tribeca Film Festival and will be released theatrically by IFC Sundance Selects in Fall 2017.
D'Ambrosio has two docu-series in production with Sony Masterworks. The first, The Magic Box, is a multi-part series about socially relevant Broadway musicals including Cabaret, Camelot, Sweeney Todd, among others. The second is When Music Mattered of which D'Ambrosio's Johnny Cash film is the first in a multi-episode series. D'Ambrosio's other film work includes No Free Lunch starring comedian Lewis Black.
D'Ambrosio was New York University's Gallatin Lecturer, an honor bestowed upon a contemporary artist creating innovative and social engaging work and Artist-In-Residence at the Center for Contemporary in Santa Fe, New Mexico where he produced the natural land art installation and multi- media project La Terra Promessa, which included the production of D'Ambrosio's film series In Sun and Shadow. He is the founder of the nonprofit La Lutta NMC, selected by The Nation as one of the top independent media groups.
Raeshem is a CLIO, Shorty and Webby award winning film/tv producer. As Founder and Executive Producer of NYC based media company Fictionless, she manages strategic partnerships and oversees end-to-end production across platforms. Her current roster of clients includes ESPN, Toyota, Microsoft, AT&T, WNBA among others.
Raeshem is a United Nations Global Accelerator Delegate and has held multiple creative leadership positions including Executive Producer of MTV World and Showrunner of MTV's Rebel Music. She has Executive Produced leading edge integrated marketing campaigns including Intel's award-winning The Music Experiment featuring bands like Of Monsters and Men and Arcade Fire. She is currently producing a film with the United Nations and the Gates Foundation about the making of the Global Goals. She is a passionate advocate for women and girls, committed to educating women about sexual health and safety through a partnership with the NYU Department of Population Health. Raeshem sits on the Creative Council for EMILY'S List.