text:
package org.apache.helix.manager.zk;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import org.apache.helix.AccessOption;
import org.apache.helix.BaseDataAccessor;
import org.apache.helix.HelixException;
import org.apache.helix.SystemPropertyKeys;
import org.apache.helix.api.exceptions.HelixMetaDataAccessException;
import org.apache.helix.msdcommon.exception.InvalidRoutingDataException;
import org.apache.helix.store.zk.ZNode;
import org.apache.helix.util.HelixUtil;
import org.apache.helix.zookeeper.api.client.HelixZkClient;
import org.apache.helix.zookeeper.api.client.RealmAwareZkClient;
import org.apache.helix.zookeeper.datamodel.ZNRecord;
import org.apache.helix.zookeeper.exception.ZkClientException;
import org.apache.helix.zookeeper.impl.client.FederatedZkClient;
import org.apache.helix.zookeeper.impl.factory.DedicatedZkClientFactory;
import org.apache.helix.zookeeper.impl.factory.SharedZkClientFactory;
import org.apache.helix.zookeeper.zkclient.DataUpdater;
import org.apache.helix.zookeeper.zkclient.IZkChildListener;
import org.apache.helix.zookeeper.zkclient.IZkDataListener;
import org.apache.helix.zookeeper.zkclient.callback.ZkAsyncCallbacks;
import org.apache.helix.zookeeper.zkclient.exception.ZkBadVersionException;
import org.apache.helix.zookeeper.zkclient.exception.ZkException;
import org.apache.helix.zookeeper.zkclient.exception.ZkNoNodeException;
import org.apache.helix.zookeeper.zkclient.exception.ZkNodeExistsException;
import org.apache.helix.zookeeper.zkclient.serialize.ZkSerializer;
import org.apache.helix.zookeeper.zkclient.serialize.PathBasedZkSerializer;
import org.apache.helix.zookeeper.datamodel.serializer.ZNRecordSerializer;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException.Code;
import org.apache.zookeeper.data.Stat;
import org.apache.zookeeper.server.DataTree;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ZkBaseDataAccessor<T> implements BaseDataAccessor<T> {

  // Designates which mode ZkBaseDataAccessor should be created in. If not specified, it will be
  // created on SHARED mode.
  public enum ZkClientType {
    /**
     * When ZkBaseDataAccessor is created with the DEDICATED type, it supports ephemeral node
     * creation, callback functionality, and session management. But note that this is more
     * resource-heavy since it creates a dedicated ZK connection so should be used sparingly only
     * when the aforementioned features are needed.
     */
    DEDICATED,

    /**
     * When ZkBaseDataAccessor is created with the SHARED type, it only supports CRUD
     * functionalities. This will be the default mode of creation.
     */
    SHARED,

    /**
     * Uses FederatedZkClient (applicable on multi-realm mode only) that queries Metadata Store
     * Directory Service for routing data.
     */
    FEDERATED
  }

  enum RetCode {
    OK,
    NODE_EXISTS,
    ERROR
  }

  /**
   * struct holding return information
   */
  public class AccessResult {
    RetCode _retCode;
    List<String> _pathCreated;

    Stat _stat;

    /**
     * used by update only
     */
    T _updatedValue;

    public AccessResult() {
      _retCode = RetCode.ERROR;
      _pathCreated = new ArrayList<>();
      _stat = new Stat();
      _updatedValue = null;
    }
  }

  private static Logger LOG = LoggerFactory.getLogger(ZkBaseDataAccessor.class);

  private final RealmAwareZkClient _zkClient;

  // true if ZkBaseDataAccessor was instantiated with a RealmAwareZkClient, false otherwise
  // This is used for close() to determine how ZkBaseDataAccessor should close the underlying
  // ZkClient
  private final boolean _usesExternalZkClient;

  /**
   * @deprecated it is recommended to use the builder constructor {@link Builder}
   * instead to avoid having to manually create and maintain a RealmAwareZkClient
   * outside of ZkBaseDataAccessor.
   *
   * @param zkClient A created RealmAwareZkClient
   */
  @Deprecated
  public ZkBaseDataAccessor(RealmAwareZkClient zkClient) {
    if (zkClient == null) {
      throw new NullPointerException("zkclient is null");
    }
    _zkClient = zkClient;
    _usesExternalZkClient = true;
  }

  private ZkBaseDataAccessor(RealmAwareZkClient zkClient, boolean usesExternalZkClient) {
    _zkClient = zkClient;
    _usesExternalZkClient = usesExternalZkClient;
  }

  /**
   * The ZkBaseDataAccessor with custom serializer support of ZkSerializer type.
   * Note: This constructor will use a shared ZkConnection.
   * Do NOT use this for ephemeral node creation/callbacks/session management.
   * Do use this for simple CRUD operations to ZooKeeper.
   * @param zkAddress The zookeeper address
   *
   * @deprecated it is recommended to use the builder constructor {@link Builder}
   */
  @Deprecated
  public ZkBaseDataAccessor(String zkAddress, ZkSerializer zkSerializer) {
    this(zkAddress, zkSerializer, ZkClientType.SHARED);
  }

  /**
   * The ZkBaseDataAccessor with custom serializer support of PathBasedZkSerializer type.
   * Note: This constructor will use a shared ZkConnection.
   * Do NOT use this for ephemeral node creation/callbacks/session management.
   * Do use this for simple CRUD operations to ZooKeeper.
   * @param zkAddress The zookeeper address
   *
   * @deprecated it is recommended to use the builder constructor {@link Builder}
   */
  @Deprecated
  public ZkBaseDataAccessor(String zkAddress, PathBasedZkSerializer pathBasedZkSerializer) {
    this(zkAddress, pathBasedZkSerializer, ZkClientType.SHARED);
  }

  /**
   * Creates a ZkBaseDataAccessor with {@link ZNRecord} as the data model.
   * Uses a shared ZkConnection resource.
   * Does NOT support ephemeral node creation, callbacks, or session management.
   * Uses {@link ZNRecordSerializer} serializer
   * @param zkAddress The zookeeper address
   *
   * @deprecated it is recommended to use the builder constructor {@link Builder}
   */
  @Deprecated
  public ZkBaseDataAccessor(String zkAddress) {
    this(zkAddress, new ZNRecordSerializer());
  }

  /**
   * Creates a ZkBaseDataAccessor with {@link ZNRecord} as the data model.
   * If DEDICATED, it will use a dedicated ZkConnection, which allows ephemeral
   * node creation, callbacks, and session management.
   * If SHARED, it will use a shared ZkConnection, which only allows simple
   * CRUD operations to ZooKeeper.
   * @param zkAddress
   * @param zkClientType
   *
   * @deprecated it is recommended to use the builder constructor {@link Builder}
   */
  @Deprecated
  public ZkBaseDataAccessor(String zkAddress, ZkClientType zkClientType) {
    this(zkAddress, new ZNRecordSerializer(), zkClientType);
  }

  /**
   * Creates a ZkBaseDataAccessor with a custom implementation of ZkSerializer.
   * If DEDICATED, it will use a dedicated ZkConnection, which allows ephemeral
   * node creation, callbacks, and session management.
   * If SHARED, it will use a shared ZkConnection, which only allows simple
   * CRUD operations to ZooKeeper.
   * @param zkAddress
   * @param zkSerializer
   *
   * @deprecated it is recommended to use the builder constructor {@link Builder}
   */
  @Deprecated
  public ZkBaseDataAccessor(String zkAddress, ZkSerializer zkSerializer,
      ZkClientType zkClientType) {
    _zkClient = buildRealmAwareZkClientWithDefaultConfigs(
        new RealmAwareZkClient.RealmAwareZkClientConfig().setZkSerializer(zkSerializer), zkAddress,
        zkClientType);
    _usesExternalZkClient = false;
  }

  /**
   * Creates a ZkBaseDataAccessor with a custom implementation of PathBasedZkSerializer.
   * If created with DEDICATED mode, it will use a dedicated ZkConnection, which allows ephemeral
   * node creation, callbacks, and session management.
   * If SHARED, it will use a shared ZkConnection, which only allows simple
   * CRUD operations to ZooKeeper.
   * @param zkAddress
   * @param pathBasedZkSerializer
   * @param zkClientType
   *
   * @deprecated it is recommended to use the builder constructor {@link Builder}
   */
  @Deprecated
  public ZkBaseDataAccessor(String zkAddress, PathBasedZkSerializer pathBasedZkSerializer,
      ZkClientType zkClientType) {
    _zkClient = buildRealmAwareZkClientWithDefaultConfigs(
        new RealmAwareZkClient.RealmAwareZkClientConfig().setZkSerializer(pathBasedZkSerializer),
        zkAddress, zkClientType);
    _usesExternalZkClient = false;
  }

  /**
   * sync create
   */
  @Override
  public boolean create(String path, T record, int options) {
    AccessResult result = doCreate(path, record, options);
    return result._retCode == RetCode.OK;
  }

  /**
   * sync create
   */
  public AccessResult doCreate(String path, T record, int options) {
    AccessResult result = new AccessResult();
    CreateMode mode = AccessOption.getMode(options);
    if (mode == null) {
      LOG.error("Invalid create mode. options: " + options);
      result._retCode = RetCode.ERROR;
      return result;
    }

    boolean retry;
    do {
      retry = false;
      try {
        _zkClient.create(path, record, mode);
        result._pathCreated.add(path);

        result._retCode = RetCode.OK;
        return result;
      } catch (ZkNoNodeException e) {
        // this will happen if parent node does not exist
        String parentPath = HelixUtil.getZkParentPath(path);
        try {
          AccessResult res = doCreate(parentPath, null, AccessOption.PERSISTENT);
          result._pathCreated.addAll(res._pathCreated);
          RetCode rc = res._retCode;
          if (rc == RetCode.OK || rc == RetCode.NODE_EXISTS) {
            // if parent node created/exists, retry
            retry = true;
          }
        } catch (Exception e1) {
          LOG.error("Exception while creating path: " + parentPath, e1);
          result._retCode = RetCode.ERROR;
          return result;
        }
      } catch (ZkNodeExistsException e) {
        LOG.warn("Node already exists. path: " + path);
        result._retCode = RetCode.NODE_EXISTS;
        return result;
      } catch (Exception e) {
        LOG.error("Exception while creating path: " + path, e);
        result._retCode = RetCode.ERROR;
        return result;
      }
    } while (retry);

    result._retCode = RetCode.OK;
    return result;
  }

  /**
   * sync set
   */
  @Override
  public boolean set(String path, T record, int options) {
    return set(path, record, -1, options);
  }

  /**
   * sync set
   */
  @Override
  public boolean set(String path, T record, int expectVersion, int options) {
    AccessResult result = doSet(path, record, expectVersion, options);
    return result._retCode == RetCode.OK;
  }

  /**
   * sync set
   */
  public AccessResult doSet(String path, T record, int expectVersion, int options) {
    AccessResult result = new AccessResult();

    CreateMode mode = AccessOption.getMode(options);
    if (mode == null) {
      LOG.error("Invalid set mode. options: " + options);
      result._retCode = RetCode.ERROR;
      return result;
    }

    boolean retry;
    do {
      retry = false;
      try {
        Stat stat = _zkClient.writeDataGetStat(path, record, expectVersion);
        DataTree.copyStat(stat, result._stat);
      } catch (ZkNoNodeException e) {
        // node not exists, try create if expectedVersion == -1; in this case, stat will not be set
        if (expectVersion != -1) {
          LOG.error("Could not create node if expectVersion != -1, was " + expectVersion);
          result._retCode = RetCode.ERROR;
          return result;
        }
        try {
          // may create recursively
          AccessResult res = doCreate(path, record, options);
          result._pathCreated.addAll(res._pathCreated);
          RetCode rc = res._retCode;
          switch (rc) {
            case OK:
              // not set stat if node is created (instead of set)
              break;
            case NODE_EXISTS:
              retry = true;
              break;
            default:
              LOG.error("Fail to set path by creating: " + path);
              result._retCode = RetCode.ERROR;
              return result;
          }
        } catch (Exception e1) {
          LOG.error("Exception while setting path by creating: " + path, e);
          result._retCode = RetCode.ERROR;
          return result;
        }
      } catch (ZkBadVersionException e) {
        LOG.debug("Exception while setting path: " + path, e);
        throw e;
      } catch (Exception e) {
        LOG.error("Exception while setting path: " + path, e);
        result._retCode = RetCode.ERROR;
        return result;
      }
    } while (retry);

    result._retCode = RetCode.OK;
    return result;
  }

  /**
   * sync update
   */
  @Override
  public boolean update(String path, DataUpdater<T> updater, int options) {
    AccessResult result = doUpdate(path, updater, options);
    return result._retCode == RetCode.OK;
  }

  /**
   * sync update
   */
  public AccessResult doUpdate(String path, DataUpdater<T> updater, int options) {
    AccessResult result = new AccessResult();
    CreateMode mode = AccessOption.getMode(options);
    if (mode == null) {
      LOG.error("Invalid update mode. options: " + options);
      result._retCode = RetCode.ERROR;
      return result;
    }

    boolean retry;
    T updatedData = null;
    do {
      retry = false;
      try {
        Stat readStat = new Stat();
        T oldData = (T) _zkClient.readData(path, readStat);
        T newData = updater.update(oldData);
        if (newData != null) {
          Stat setStat = _zkClient.writeDataGetStat(path, newData, readStat.getVersion());
          DataTree.copyStat(setStat, result._stat);
        }
        updatedData = newData;
      } catch (ZkBadVersionException e) {
        retry = true;
      } catch (ZkNoNodeException e) {
        // node not exist, try create, pass null to updater
        try {
          T newData = updater.update(null);
          RetCode rc;
          if (newData != null) {
            AccessResult res = doCreate(path, newData, options);
            result._pathCreated.addAll(res._pathCreated);
            rc = res._retCode;
          } else {
            // If update returns null, no need to create.
            rc = RetCode.OK;
          }
          switch (rc) {
            case OK:
              updatedData = newData;
              break;
            case NODE_EXISTS:
              retry = true;
              break;
            default:
              LOG.error("Fail to update path by creating: " + path);
              result._retCode = RetCode.ERROR;
              return result;
          }
        } catch (Exception e1) {
          LOG.error("Exception while updating path by creating: " + path, e1);
          result._retCode = RetCode.ERROR;
          return result;
        }
      } catch (Exception e) {
        LOG.error("Exception while updating path: " + path, e);
        result._retCode = RetCode.ERROR;
        return result;
      }
    } while (retry);

    result._retCode = RetCode.OK;
    result._updatedValue = updatedData;
    return result;
  }

  /**
   * sync get
   */
  @Override
  public T get(String path, Stat stat, int options) {
    T data = null;
    try {
      data = (T) _zkClient.readData(path, stat);
    } catch (ZkNoNodeException e) {
      if (AccessOption.isThrowExceptionIfNotExist(options)) {
        throw e;
      }
    }
    return data;
  }

  /**
   * async get
   */
  @Deprecated
  @Override
  public List<T> get(List<String> paths, List<Stat> stats, int options) {
    boolean[] needRead = new boolean[paths.size()];
    Arrays.fill(needRead, true);

    return get(paths, stats, needRead, false);
  }

  @Override
  public List<T> get(List<String> paths, List<Stat> stats, int options, boolean throwException)
      throws HelixException {
    boolean[] needRead = new boolean[paths.size()];
    Arrays.fill(needRead, true);

    return get(paths, stats, needRead, throwException);
  }

  /**
   * async get
   */
  List<T> get(List<String> paths, List<Stat> stats, boolean[] needRead, boolean throwException)
      throws HelixException {
    if (paths == null || paths.size() == 0) {
      return Collections.emptyList();
    }

    // init stats
    if (stats != null) {
      stats.clear();
      stats.addAll(Collections.<Stat>nCopies(paths.size(), null));
    }

    long startT = System.nanoTime();

    try {
      // issue asyn get requests
      ZkAsyncCallbacks.GetDataCallbackHandler[] cbList =
          new ZkAsyncCallbacks.GetDataCallbackHandler[paths.size()];
      for (int i = 0; i < paths.size(); i++) {
        if (!needRead[i]) {
          continue;
        }

        String path = paths.get(i);
        cbList[i] = new ZkAsyncCallbacks.GetDataCallbackHandler();
        _zkClient.asyncGetData(path, cbList[i]);
      }

      // wait for completion
      for (int i = 0; i < cbList.length; i++) {
        if (!needRead[i]) {
          continue;
        }

        ZkAsyncCallbacks.GetDataCallbackHandler cb = cbList[i];
        cb.waitForSuccess();
      }

      // construct return results
      List<T> records = new ArrayList<T>(Collections.<T>nCopies(paths.size(), null));
      Map<String, Integer> pathFailToRead = new HashMap<>();
      for (int i = 0; i < paths.size(); i++) {
        if (!needRead[i]) {
          continue;
        }

        ZkAsyncCallbacks.GetDataCallbackHandler cb = cbList[i];
        if (Code.get(cb.getRc()) == Code.OK) {
          @SuppressWarnings("unchecked")
          T record = (T) _zkClient.deserialize(cb._data, paths.get(i));
          records.set(i, record);
          if (stats != null) {
            stats.set(i, cb._stat);
          }
        } else if (Code.get(cb.getRc()) != Code.NONODE && throwException) {
          throw new HelixMetaDataAccessException(
              String.format("Failed to read node %s", paths.get(i)));
        } else {
          pathFailToRead.put(paths.get(i), cb.getRc());
        }
      }
      if (pathFailToRead.size() > 0) {
        LOG.warn("Fail to read record for paths: " + pathFailToRead);
      }
      return records;
    } catch (Exception e) {
      throw new HelixMetaDataAccessException(String.format("Fail to read nodes for %s", paths));
    } finally {
      long endT = System.nanoTime();
      if (LOG.isTraceEnabled()) {
        LOG.trace(
            "getData_async, size: " + paths.size() + ", paths: " + paths.get(0) + ",... time: " + (
                endT - startT) + " ns");
      }
    }
  }

  /**
   * asyn getChildren
   * The retryCount and retryInterval will be ignored.
   */
  // TODO: Change the behavior of getChildren when Helix starts migrating API.
  @Deprecated
  @Override
  public List<T> getChildren(String parentPath, List<Stat> stats, int options) {
    return getChildren(parentPath, stats, options, false);
  }

  @Override
  public List<T> getChildren(String parentPath, List<Stat> stats, int options, int retryCount,
      int retryInterval) throws HelixException {
    int readCount = retryCount + 1;
    while (readCount > 0) {
      try {
        readCount--;
        List<T> records = getChildren(parentPath, stats, options, true);
        return records;
      } catch (HelixMetaDataAccessException e) {
        if (readCount == 0) {
          throw new HelixMetaDataAccessException(
              String.format("Failed to get full list of %s", parentPath), e);
        }
        try {
          Thread.sleep(retryInterval);
        } catch (InterruptedException interruptedException) {
          throw new HelixMetaDataAccessException("Fail to interrupt the sleep",
              interruptedException);
        }
      }
    }

    // Impossible to reach end
    return null;
  }

  private List<T> getChildren(String parentPath, List<Stat> stats, int options,
      boolean throwException) {
    try {
      // prepare child paths
      List<String> childNames = getChildNames(parentPath, options);
      if (childNames == null || childNames.size() == 0) {
        return Collections.emptyList();
      }

      List<String> paths = new ArrayList<>();
      for (String childName : childNames) {
        String path = parentPath + "/" + childName;
        paths.add(path);
      }

      // remove null record
      List<Stat> curStats = new ArrayList<>(paths.size());
      boolean[] needRead = new boolean[paths.size()];
      Arrays.fill(needRead, true);
      List<T> records = get(paths, curStats, needRead, throwException);
      Iterator<T> recordIter = records.iterator();
      Iterator<Stat> statIter = curStats.iterator();
      while (statIter.hasNext()) {
        recordIter.next();
        if (statIter.next() == null) {
          statIter.remove();
          recordIter.remove();
        }
      }

      if (stats != null) {
        stats.clear();
        stats.addAll(curStats);
      }

      return records;
    } catch (ZkNoNodeException e) {
      return Collections.emptyList();
    }
  }

  /**
   * sync getChildNames
   * @return null if parentPath doesn't exist
   */
  @Override
  public List<String> getChildNames(String parentPath, int options) {
    try {
      List<String> childNames = _zkClient.getChildren(parentPath);
      Collections.sort(childNames);
      return childNames;
    } catch (ZkNoNodeException e) {
      return null;
    }
  }

  /**
   * sync exists
   */
  @Override
  public boolean exists(String path, int options) {
    return _zkClient.exists(path);
  }

  /**
   * sync getStat
   */
  @Override
  public Stat getStat(String path, int options) {
    return _zkClient.getStat(path);
  }

  /**
   * Sync remove. it tries to remove the ZNode and all its descendants if any, node does not exist
   * is regarded as success
   */
  @Override
  public boolean remove(String path, int options) {
    try {
      // operation will not throw exception when path successfully deleted or does not exist
      // despite real error, operation will throw exception when path not empty, and in this
      // case, we try to delete recursively
      _zkClient.delete(path);
    } catch (ZkException e) {
      LOG.debug("Failed to delete {} with opts {}, err: {}. Try recursive delete", path, options,
          e.getMessage());
      try {
        _zkClient.deleteRecursively(path);
      } catch (ZkClientException zce) {
        LOG.error("Failed to delete {} recursively with opts {}.", path, options, zce);
        return false;
      }
    }
    return true;
  }

  /**
   * async create. give up on error other than NONODE
   */
  ZkAsyncCallbacks.CreateCallbackHandler[] create(List<String> paths, List<T> records,
      boolean[] needCreate, List<List<String>> pathsCreated, int options) {
    if ((records != null && records.size() != paths.size()) || needCreate.length != paths.size()
        || (pathsCreated != null && pathsCreated.size() != paths.size())) {
      throw new IllegalArgumentException(
          "paths, records, needCreate, and pathsCreated should be of same size");
    }

    ZkAsyncCallbacks.CreateCallbackHandler[] cbList =
        new ZkAsyncCallbacks.CreateCallbackHandler[paths.size()];

    CreateMode mode = AccessOption.getMode(options);
    if (mode == null) {
      LOG.error("Invalid async set mode. options: " + options);
      return cbList;
    }

    boolean retry;
    do {
      retry = false;

      for (int i = 0; i < paths.size(); i++) {
        if (!needCreate[i]) {
          continue;
        }

        String path = paths.get(i);
        T record = records == null ? null : records.get(i);
        cbList[i] = new ZkAsyncCallbacks.CreateCallbackHandler();
        _zkClient.asyncCreate(path, record, mode, cbList[i]);
      }

      List<String> parentPaths = new ArrayList<>(Collections.<String>nCopies(paths.size(), null));
      boolean failOnNoNode = false;

      for (int i = 0; i < paths.size(); i++) {
        if (!needCreate[i]) {
          continue;
        }

        ZkAsyncCallbacks.CreateCallbackHandler cb = cbList[i];
        cb.waitForSuccess();
        String path = paths.get(i);

        if (Code.get(cb.getRc()) == Code.NONODE) {
          String parentPath = HelixUtil.getZkParentPath(path);
          parentPaths.set(i, parentPath);
          failOnNoNode = true;
        } else {
          // if create succeed or fail on error other than NONODE,
          // give up
          needCreate[i] = false;

          // if succeeds, record what paths we've created
          if (Code.get(cb.getRc()) == Code.OK && pathsCreated != null) {
            if (pathsCreated.get(i) == null) {
              pathsCreated.set(i, new ArrayList<String>());
            }
            pathsCreated.get(i).add(path);
          }
        }
      }

      if (failOnNoNode) {
        boolean[] needCreateParent = Arrays.copyOf(needCreate, needCreate.length);

        ZkAsyncCallbacks.CreateCallbackHandler[] parentCbList =
            create(parentPaths, null, needCreateParent, pathsCreated, AccessOption.PERSISTENT);
        for (int i = 0; i < parentCbList.length; i++) {
          ZkAsyncCallbacks.CreateCallbackHandler parentCb = parentCbList[i];
          if (parentCb == null) {
            continue;
          }

          Code rc = Code.get(parentCb.getRc());

          // if parent is created, retry create child
          if (rc == Code.OK || rc == Code.NODEEXISTS) {
            retry = true;
            break;
          }
        }
      }
    } while (retry);

    return cbList;
  }

  /**
   * async create
   * TODO: rename to create
   */
  @Override
  public boolean[] createChildren(List<String> paths, List<T> records, int options) {
    boolean[] success = new boolean[paths.size()];

    CreateMode mode = AccessOption.getMode(options);
    if (mode == null) {
      LOG.error("Invalid async create mode. options: " + options);
      return success;
    }

    boolean[] needCreate = new boolean[paths.size()];
    Arrays.fill(needCreate, true);
    List<List<String>> pathsCreated =
        new ArrayList<>(Collections.<List<String>>nCopies(paths.size(), null));

    long startT = System.nanoTime();
    try {

      ZkAsyncCallbacks.CreateCallbackHandler[] cbList =
          create(paths, records, needCreate, pathsCreated, options);

      for (int i = 0; i < cbList.length; i++) {
        ZkAsyncCallbacks.CreateCallbackHandler cb = cbList[i];
        success[i] = (Code.get(cb.getRc()) == Code.OK);
      }

      return success;
    } finally {
      long endT = System.nanoTime();
      if (LOG.isTraceEnabled()) {
        LOG.trace(
            "create_async, size: " + paths.size() + ", paths: " + paths.get(0) + ",... time: " + (
                endT - startT) + " ns");
      }
    }
  }

  /**
   * async set
   * TODO: rename to set
   */
  @Override
  public boolean[] setChildren(List<String> paths, List<T> records, int options) {
    return set(paths, records, null, null, options);
  }

  /**
   * async set, give up on error other than NoNode
   */
  boolean[] set(List<String> paths, List<T> records, List<List<String>> pathsCreated,
      List<Stat> stats, int options) {
    if (paths == null || paths.size() == 0) {
      return new boolean[0];
    }

    if ((records != null && records.size() != paths.size()) || (pathsCreated != null
        && pathsCreated.size() != paths.size())) {
      throw new IllegalArgumentException("paths, records, and pathsCreated should be of same size");
    }

    boolean[] success = new boolean[paths.size()];

    CreateMode mode = AccessOption.getMode(options);
    if (mode == null) {
      LOG.error("Invalid async set mode. options: " + options);
      return success;
    }

    List<Stat> setStats = new ArrayList<>(Collections.<Stat>nCopies(paths.size(), null));
    ZkAsyncCallbacks.SetDataCallbackHandler[] cbList =
        new ZkAsyncCallbacks.SetDataCallbackHandler[paths.size()];
    ZkAsyncCallbacks.CreateCallbackHandler[] createCbList = null;
    boolean[] needSet = new boolean[paths.size()];
    Arrays.fill(needSet, true);

    long startT = System.nanoTime();

    try {
      boolean retry;
      do {
        retry = false;

        for (int i = 0; i < paths.size(); i++) {
          if (!needSet[i]) {
            continue;
          }

          String path = paths.get(i);
          T record = records.get(i);
          cbList[i] = new ZkAsyncCallbacks.SetDataCallbackHandler();
          _zkClient.asyncSetData(path, record, -1, cbList[i]);
        }

        boolean failOnNoNode = false;

        for (int i = 0; i < cbList.length; i++) {
          ZkAsyncCallbacks.SetDataCallbackHandler cb = cbList[i];
          cb.waitForSuccess();
          Code rc = Code.get(cb.getRc());
          switch (rc) {
            case OK:
              setStats.set(i, cb.getStat());
              needSet[i] = false;
              break;
            case NONODE:
              // if fail on NoNode, try create the node
              failOnNoNode = true;
              break;
            default:
              // if fail on error other than NoNode, give up
              needSet[i] = false;
              break;
          }
        }

        // if failOnNoNode, try create
        if (failOnNoNode) {
          boolean[] needCreate = Arrays.copyOf(needSet, needSet.length);
          createCbList = create(paths, records, needCreate, pathsCreated, options);
          for (int i = 0; i < createCbList.length; i++) {
            ZkAsyncCallbacks.CreateCallbackHandler createCb = createCbList[i];
            if (createCb == null) {
              continue;
            }

            Code rc = Code.get(createCb.getRc());
            switch (rc) {
              case OK:
                setStats.set(i, ZNode.ZERO_STAT);
                needSet[i] = false;
                break;
              case NODEEXISTS:
                retry = true;
                break;
              default:
                // if creation fails on error other than NodeExists
                // no need to retry set
                needSet[i] = false;
                break;
            }
          }
        }
      } while (retry);

      // construct return results
      for (int i = 0; i < cbList.length; i++) {
        ZkAsyncCallbacks.SetDataCallbackHandler cb = cbList[i];

        Code rc = Code.get(cb.getRc());
        if (rc == Code.OK) {
          success[i] = true;
        } else if (rc == Code.NONODE) {
          ZkAsyncCallbacks.CreateCallbackHandler createCb = createCbList[i];
          if (Code.get(createCb.getRc()) == Code.OK) {
            success[i] = true;
          }
        }
      }

      if (stats != null) {
        stats.clear();
        stats.addAll(setStats);
      }

      return success;
    } finally {
      long endT = System.nanoTime();
      if (LOG.isTraceEnabled()) {
        LOG.trace(
            "setData_async, size: " + paths.size() + ", paths: " + paths.get(0) + ",... time: " + (
                endT - startT) + " ns");
      }
    }
  }

  // TODO: rename to update

  /**
   * async update
   */
  @Override
  public boolean[] updateChildren(List<String> paths, List<DataUpdater<T>> updaters, int options) {

    List<T> updateData = update(paths, updaters, null, null, options);
    boolean[] success = new boolean[paths.size()]; // init to false
    for (int i = 0; i < paths.size(); i++) {
      T data = updateData.get(i);
      success[i] = (data != null);
    }
    return success;
  }

  /**
   * async update
   * return: updatedData on success or null on fail
   */
  List<T> update(List<String> paths, List<DataUpdater<T>> updaters, List<List<String>> pathsCreated,
      List<Stat> stats, int options) {
    if (paths == null || paths.size() == 0) {
      LOG.error("paths is null or empty");
      return Collections.emptyList();
    }

    if (updaters.size() != paths.size() || (pathsCreated != null && pathsCreated.size() != paths
        .size())) {
      throw new IllegalArgumentException(
          "paths, updaters, and pathsCreated should be of same size");
    }

    List<Stat> setStats = new ArrayList<Stat>(Collections.<Stat>nCopies(paths.size(), null));
    List<T> updateData = new ArrayList<T>(Collections.<T>nCopies(paths.size(), null));

    CreateMode mode = AccessOption.getMode(options);
    if (mode == null) {
      LOG.error("Invalid update mode. options: " + options);
      return updateData;
    }

    ZkAsyncCallbacks.SetDataCallbackHandler[] cbList =
        new ZkAsyncCallbacks.SetDataCallbackHandler[paths.size()];
    ZkAsyncCallbacks.CreateCallbackHandler[] createCbList = null;
    boolean[] needUpdate = new boolean[paths.size()];
    Arrays.fill(needUpdate, true);

    long startT = System.nanoTime();

    try {
      boolean retry;
      do {
        retry = false;
        boolean[] needCreate = new boolean[paths.size()]; // init'ed with false
        boolean failOnNoNode = false;

        // asycn read all data
        List<Stat> curStats = new ArrayList<Stat>();
        List<T> curDataList =
            get(paths, curStats, Arrays.copyOf(needUpdate, needUpdate.length), false);

        // async update
        List<T> newDataList = new ArrayList<T>();
        for (int i = 0; i < paths.size(); i++) {
          if (!needUpdate[i]) {
            newDataList.add(null);
            continue;
          }
          String path = paths.get(i);
          DataUpdater<T> updater = updaters.get(i);
          T newData = updater.update(curDataList.get(i));
          newDataList.add(newData);
          if (newData == null) {
            // No need to create or update if the updater does not return a new version
            continue;
          }
          Stat curStat = curStats.get(i);
          if (curStat == null) {
            // node not exists
            failOnNoNode = true;
            needCreate[i] = true;
          } else {
            cbList[i] = new ZkAsyncCallbacks.SetDataCallbackHandler();
            _zkClient.asyncSetData(path, newData, curStat.getVersion(), cbList[i]);
          }
        }

        // wait for completion
        boolean failOnBadVersion = false;

        for (int i = 0; i < paths.size(); i++) {
          ZkAsyncCallbacks.SetDataCallbackHandler cb = cbList[i];
          if (cb == null) {
            continue;
          }

          cb.waitForSuccess();

          switch (Code.get(cb.getRc())) {
            case OK:
              updateData.set(i, newDataList.get(i));
              setStats.set(i, cb.getStat());
              needUpdate[i] = false;
              break;
            case NONODE:
              failOnNoNode = true;
              needCreate[i] = true;
              break;
            case BADVERSION:
              failOnBadVersion = true;
              break;
            default:
              // if fail on error other than NoNode or BadVersion
              // will not retry
              needUpdate[i] = false;
              break;
          }
        }

        // if failOnNoNode, try create
        if (failOnNoNode) {
          createCbList = create(paths, newDataList, needCreate, pathsCreated, options);
          for (int i = 0; i < paths.size(); i++) {
            ZkAsyncCallbacks.CreateCallbackHandler createCb = createCbList[i];
            if (createCb == null) {
              continue;
            }

            switch (Code.get(createCb.getRc())) {
              case OK:
                needUpdate[i] = false;
                updateData.set(i, newDataList.get(i));
                setStats.set(i, ZNode.ZERO_STAT);
                break;
              case NODEEXISTS:
                retry = true;
                break;
              default:
                // if fail on error other than NodeExists
                // will not retry
                needUpdate[i] = false;
                break;
            }
          }
        }

        // if failOnBadVersion, retry
        if (failOnBadVersion) {
          retry = true;
        }
      } while (retry);

      if (stats != null) {
        stats.clear();
        stats.addAll(setStats);
      }

      return updateData;
    } finally {
      long endT = System.nanoTime();
      if (LOG.isTraceEnabled()) {
        LOG.trace(
            "setData_async, size: " + paths.size() + ", paths: " + paths.get(0) + ",... time: " + (
                endT - startT) + " ns");
      }
    }
  }

  /**
   * async exists
   */
  @Override
  public boolean[] exists(List<String> paths, int options) {
    Stat[] stats = getStats(paths, options);

    boolean[] exists = new boolean[paths.size()];
    for (int i = 0; i < paths.size(); i++) {
      exists[i] = (stats[i] != null);
    }

    return exists;
  }

  /**
   * async getStat
   */
  @Override
  public Stat[] getStats(List<String> paths, int options) {
    if (paths == null || paths.size() == 0) {
      LOG.error("paths is null or empty");
      return new Stat[0];
    }

    Stat[] stats = new Stat[paths.size()];

    long startT = System.nanoTime();

    try {
      ZkAsyncCallbacks.ExistsCallbackHandler[] cbList =
          new ZkAsyncCallbacks.ExistsCallbackHandler[paths.size()];
      for (int i = 0; i < paths.size(); i++) {
        String path = paths.get(i);
        cbList[i] = new ZkAsyncCallbacks.ExistsCallbackHandler();
        _zkClient.asyncExists(path, cbList[i]);
      }

      for (int i = 0; i < cbList.length; i++) {
        ZkAsyncCallbacks.ExistsCallbackHandler cb = cbList[i];
        cb.waitForSuccess();
        stats[i] = cb._stat;
      }

      return stats;
    } finally {
      long endT = System.nanoTime();
      if (LOG.isTraceEnabled()) {
        LOG.trace(
            "exists_async, size: " + paths.size() + ", paths: " + paths.get(0) + ",... time: " + (
                endT - startT) + " ns");
      }
    }
  }

  /**
   * async remove
   */
  @Override
  public boolean[] remove(List<String> paths, int options) {
    if (paths == null || paths.size() == 0) {
      return new boolean[0];
    }

    boolean[] success = new boolean[paths.size()];

    ZkAsyncCallbacks.DeleteCallbackHandler[] cbList =
        new ZkAsyncCallbacks.DeleteCallbackHandler[paths.size()];

    long startT = System.nanoTime();

    try {
      for (int i = 0; i < paths.size(); i++) {
        String path = paths.get(i);
        cbList[i] = new ZkAsyncCallbacks.DeleteCallbackHandler();
        _zkClient.asyncDelete(path, cbList[i]);
      }

      for (int i = 0; i < cbList.length; i++) {
        ZkAsyncCallbacks.DeleteCallbackHandler cb = cbList[i];
        cb.waitForSuccess();
        success[i] = (cb.getRc() == 0);
      }

      return success;
    } finally {
      long endT = System.nanoTime();
      if (LOG.isTraceEnabled()) {
        LOG.trace(
            "delete_async, size: " + paths.size() + ", paths: " + paths.get(0) + ",... time: " + (
                endT - startT) + " ns");
      }
    }
  }

  /**
   * Subscribe to zookeeper data changes
   */
  @Override
  public void subscribeDataChanges(String path, IZkDataListener listener) {
    _zkClient.subscribeDataChanges(path, listener);
  }

  /**
   * Unsubscribe to zookeeper data changes
   */
  @Override
  public void unsubscribeDataChanges(String path, IZkDataListener dataListener) {
    _zkClient.unsubscribeDataChanges(path, dataListener);
  }

  /**
   * Subscribe to zookeeper data changes
   */
  @Override
  public List<String> subscribeChildChanges(String path, IZkChildListener listener) {
    return _zkClient.subscribeChildChanges(path, listener);
  }

  /**
   * Unsubscribe to zookeeper data changes
   */
  @Override
  public void unsubscribeChildChanges(String path, IZkChildListener childListener) {
    _zkClient.unsubscribeChildChanges(path, childListener);
  }

  /**
   * Reset
   */
  @Override
  public void reset() {
    // Nothing to do
  }

  /**
   * {@inheritDoc}
   */
  @Override
  public void close() {
    if (_zkClient != null && !_usesExternalZkClient) {
      _zkClient.close();
    }
  }

  @Override
  public void finalize() {
    close();
  }

  public static class Builder<T> extends GenericBaseDataAccessorBuilder<Builder<T>> {
    public Builder() {
    }

    /**
     * Returns a <code>ZkBaseDataAccessor</code> instance.
     * <p>
     * Note: ZK client type must be set to <code>FEDERATED</code> in order for
     * <code>ZkBaseDataAccessor</code> can access multiple ZKs. Otherwise, it can only access
     * single-ZK.
     */
    public ZkBaseDataAccessor<T> build() {
      validate();
      return new ZkBaseDataAccessor<>(
          createZkClient(_realmMode, _realmAwareZkConnectionConfig, _realmAwareZkClientConfig,
              _zkAddress));
    }
  }

  /**
   * This method is used for constructors that are not based on the Builder for
   * backward-compatibility.
   * It checks if there is a System Property config set for Multi-ZK mode and determines if a
   * FederatedZkClient should be created.
   * @param clientConfig default RealmAwareZkClientConfig with ZK serializer set
   * @param zkAddress
   * @param zkClientType
   * @return
   */
  static RealmAwareZkClient buildRealmAwareZkClientWithDefaultConfigs(
      RealmAwareZkClient.RealmAwareZkClientConfig clientConfig, String zkAddress,
      ZkClientType zkClientType) {
    if (Boolean.getBoolean(SystemPropertyKeys.MULTI_ZK_ENABLED)) {
      // If the multi ZK config is enabled, use multi-realm mode with FederatedZkClient
      try {
        return new FederatedZkClient(
            new RealmAwareZkClient.RealmAwareZkConnectionConfig.Builder().build(), clientConfig);
      } catch (IllegalStateException | IOException | InvalidRoutingDataException e) {
        throw new HelixException("Not able to connect on multi-realm mode.", e);
      }
    }

    RealmAwareZkClient zkClient;
    switch (zkClientType) {
      case DEDICATED:
        zkClient = DedicatedZkClientFactory.getInstance()
            .buildZkClient(new HelixZkClient.ZkConnectionConfig(zkAddress),
                clientConfig.createHelixZkClientConfig());
        break;
      case SHARED:
      default:
        zkClient = SharedZkClientFactory.getInstance()
            .buildZkClient(new HelixZkClient.ZkConnectionConfig(zkAddress),
                clientConfig.createHelixZkClientConfig());

        zkClient
            .waitUntilConnected(HelixZkClient.DEFAULT_CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS);
        break;
    }
    return zkClient;
  }
}

redpajama_set_name: RedPajamaGithub


text:
Q: samba netlogon_creds_server_check failed. Rejecting auth request from client After an upgrade Windows 7 clients are denied access to samba.
The OS is Debian wheezy. After the upgrade to samba 2:3.6.6-6+deb7u9 no Windows client can access. I see this in the logs:

rpc_server/netlogon/srv_netlog_nt.c:976(_netr_ServerAuthenticate3)
  _netr_ServerAuthenticate3: netlogon_creds_server_check failed. Rejecting auth request from client

Access to the windows share from linux clients using nautilus works fine.
I tried removing a PC from the domain and entering again. It is granted access to the domain but the users still can't log in.
Any hints ?

A: Thanks to Francesc Guasch, you pointed to into the right direction. There is a problem with package 7u9 for samba on wheezy that hopefully debian will find and fix it. At the moment, to fix the domain trust is to rollback your samba version to the previous version you had installed. Look into /var/log/apt/history.log to find exactly which packages you have upgrade. This is what i ran to fix my problem. Please change the version numbers below to match your logs.
apt-get install smbclient=2:3.6.6-6+deb7u7 \
    libwbclient0=2:3.6.6-6+deb7u7 \
    samba-common=2:3.6.6-6+deb7u7 \
    samba=2:3.6.6-6+deb7u7 \
    samba-common-bin=2:3.6.6-6+deb7u7 \
    winbind=2:3.6.6-6+deb7u7 libnss-winbind=2:3.6.6-6+deb7u7

A: Andrew Bartlett from Catalyst IT gave me the hint to install "winbind". You don't have to use nss_winbind or pam_winbind. Just running winbindd is enough.
Of course, this is not a real fix, but it worked for me on two machines and I don't have to downgrade to u7.
See https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=820981 for details.

A: I have the same problem. I use samba as domains controller and all windows clients were unable to login to domain today. Maybe this is some kind of regression with this update. I just did downgrade to deb7u7 version of these packages: libnss-winbind libpam-winbind libwbclient0 samba samba-common samba-common-bin smbclient winbind. Now I have working configuration, but I would like to see better solution.

redpajama_set_name: RedPajamaStackExchange


This entry was posted on June 15, 2012 at 9:16 pm and is filed under couch potato.	You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.


Like many of the romantic poets, especially William Wordsworth, Shelley demonstrates a great reverence for the beauty of nature, and he feels closely connected to nature's power. In his early poetry, Shelley shares the romantic interest in pantheism—the belief that God, or a divine, unifying spirit, runs through everything in the universe. He refers to this unifying natural force in many poems, describing it as the "spirit of beauty" in "Hymn to Intellectual Beauty" and identifying it with Mont Blanc and the Arve River in "Mont Blanc." This force is the cause of all human joy, faith, goodness, and pleasure, and it is also the source of poetic inspiration and divine truth. Shelley asserts several times that this force can influence people to change the world for the better. However, Shelley simultaneously recognizes that nature's power is not wholly positive. Nature destroys as often as it inspires or creates, and it destroys cruelly and indiscriminately. For this reason, Shelley's delight in nature is mitigated by an awareness of its dark side.


text:
OPP spent more than $16M policing 1492 Land Back Lane: Records
The Ontario Provincial Police (OPP) spent $16.3 million in just half a year policing the Haudenosaunee-led occupation of the McKenzie Meadows housing development in Caledonia, Ont., according to provincial government records obtained by APTN News through freedom of information.
The figures reveal the OPP were spending between $2 million and $3 million per month on salaries, round-the-clock overtime, food, hotels, travel costs, supplies, equipment, building rentals and other related expenses between July 2020 and January 2021.
"I'm absolutely flabbergasted by this number," said Skyler Williams, spokesperson for the occupation, in a phone interview. "That's painful to think that we're spending that on 20 people sitting in a field singing songs around the fire."
Six Nations members and supporters moved onto the construction site — about 20 km south of Hamilton — on July 19, 2020 and dubbed it 1492 Land Back Lane. A few weeks later, a police crowd-control unit raided the encampment and made arrests using stun guns and rubber bullets.
Supporters of the group promptly retaliated by lighting tires on fire and erecting blockades on roads and train tracks. About 50 people soon overwhelmed police at the camp's back entrance and retook the site later that evening, according to an OPP court filing.
The group reached a consensus to dismantle the barricades at the end of August. A court battle over injunctions ensued while police continued making arrests.
https://www.aptnnews.ca/national-news/opp-spent-more-than-16m-policing-1492-land…
Ville où l'événement s'est produit:

redpajama_set_name: RedPajamaCommonCrawl


text:
By Gnoccis December 11, 2018
Morbid fascination is an intrinsic part of the human condition. It could be argued that it is this curiosity that heightens our sense of suspicion and prudence, and serves to make us more vigilant in dubious situations. As a result of this proclivity, vicious evil doers, like Ted Bundy and Charles Manson, have found their way into the collective psyche, and everybody knows their names, and are familiar with their crimes. A 2014 study estimated that, at any given time, there are between 25 and 50 active serial killers in operation in the United States. Serial killers seem to be as much a part of our society as the law makers, and the peace keepers are. With this in mind, who, aside from the Bundys' and Mansons' are you aware of? If you are interested in whetting your macabre appetite, read on. We have compiled a list of some of the most barbarous, perverse and brutal serial killers ever caught, but who failed to achieve the infamy of the aforementioned psychos and sociopaths. Be warned, what you are about to read is both 100% true and 100% unsettling. Readers should continue on with caution, this is not for the faint of heart, and definitely not for younger readers.
Robert 'Willy' Pickton
Source: globalnews.com
Canadian serial killer Robert Pickton is described as being one of the worst serial killers in the world. He was a pig farmer based in Port Coquitlam, in British Columbia, and his crimes are known as The Pig Farm Murders. Outwardly quiet and introverted, Pickton was harborouing a terrible and savage secret. By the time of his arrest in 2002 he had viciously butchered 49 women on his farm, before grounding their remains into mince, at a meat rendering plant. Most of it was fed to his pigs, however, he sold some of it for human consumption. The depraved killer was arrested in 2002, after items belonging to a number of missing women were found on his farm. Officers made the discovery after a chance visit to the farm, in search of illegal firearms. Following his arrest, DNA of at least 26 women who had been reported missing were found at the property. Many of these women were thought to be prostitutes who Pickton had picked up in Vancouver's Red Light District. It is alleged that he brought them back to his farm to have sex, before brutally murdering them. He unintentionally confessed to the murders after he was put in a cell with an undercover police officer. Irritated at being caught, he complained to his cellmate: "I made my own grave by being sloppy. Doesn't that just kick you in the ass now. I was just gonna [expletive] do one more, make it even, I wanted one more to make the big 5-0."
Alexander Pichushkin
Source: famouspeople.com
Alexander Pichushkin is a Russian serial killer nicknamed The Chessboard Killer. He was caught in 2007, in Moscow, and convicted of killing 48 people. During the investigation, detectives found a chessboard with dates on all but two of the squares. These dates were connected to the murders Pichushkin had already committed. Pichushkin said he wanted to kill one person for each of the 64 squares on a chessboard, and crossed out a square for every kill, earning him his nickname. At the time, Russian authorities considered reinstating the death penalty, due to the gruesomeness and number of murders. Pichushkin targeted the weak, elderly and hopeless. He would lure his victims to a local park, to reportedly drink with him at his dead dog's grave. He would then wait until his intended victim was drunk, then he would begin his attack. He would hit them repeatedly with a blunt object until they were dead or lost consciousness. He would then, often, throw his victims into a sewer pit. On occasion, some of his tragic victims were alive when thrown in, and died from drowning, rather than from blunt force trauma. Over time, Pichushkin's attacks grew even more savage. He began leaving a broken vodka bottle, protruding from the skulls of some of his victims. He also became more lackadaisical when it came to disposing of the bodies. He left many of them out in the open, without bothering to try to conceal them. Authorities finally caught up with Pichushkin in June 2006, after he murdered a female colleague from his job at a supermarket. She had left a note for her son to tell him that she was taking a walk with Pichushkin. Chillingly, Pichushkin's confession was aired on Russian television. In it, he went into great detail about his need to kill, he said: "For me, a life without murder is like a life without food for you." He also later claimed that there were in fact more than 48 murders. He said that he had in fact killed 61 or 63 people, (his story varied), On this he said: "I thought it would be unfair to forget about the other 11 people."
Donald Henry 'Pee-Wee' Gaskins
Source: thestate.com
Donald Henry Gaskins, known as Pee Wee Gaskins, has gone down in the annals of serial killer history as the most prolific killer South Carolina has ever known. He was executed in 1991 by electric chair, after being convicted of 9 murders, however it is thought that he murdered far more people than that. His own claims bring his death toll to over 100 people, and a litany of other vile and depraved crimes can also be attributed to this seemingly unassuming man. Up until 1968, Gaskins spent most of his life in and out of prison for various crimes, from theft to gang rape. In 1969 he moved to the town of Sumter in South Carolina, and it is here that he would begin his true reign of terror. His first murder in Sumter was a hitchhiker that he picked up, tortured, and murdered, then sunk her body in a local swamp. In the book he wrote in prison, detailing his life and crimes, he wrote: "All I could think about is how I could do anything I wanted to her." This woman was the first of many in what Gaskins referred to as his 'coastal kills'. He would torture and mutilate his victims, while attempting to keep them alive for as long as possible. He confessed to killing these victims using a variety of methods including stabbing, suffocation, mutilation, and even claimed to have cannibalized some of them. He would go on to confess to over 80 of these types of murders, although none of these claims have ever been corroborated. Then, in 1970, Gaskins committed the first of his so-called 'serious murders, which were people he knew and killed for personal reasons. Some of these victims included his own niece, Janice Kirby, aged 15, and her friend Patricia Ann Alsbrook, aged 17. He beat both of the girls to death, after attempting to sexually assault them. One of his most shocking murders was that of two of his neighbours, Doreen Dempsey, who was 23 and pregnant, and her two year old daughter. He drove Doreen and her little girl out to a secluded, wooded area, and violently raped, sodomized, and killed both her and her little girl. Gaskins was eventually arrested in 1975, and was found guilty in 1976, and sentenced to death. However, this was later commuted to life in prison when the South Carolina General Assembly's 1974 ruling on capital punishment was changed to conform to the U.S. Supreme Court guidelines for the death penalty in other states. On September 2, 1982, Gaskins committed another murder. While incarcerated in the high security block at the South Carolina Correctional Institution, Gaskins killed a death row inmate named Rudolph Tyner, he was tried for the Tyner's murder and sentenced to death. While on death row, Gaskins told his life story to a journalist named Wilton Earle. He claimed to have committed between 100 and 110 murders, however, law enforcement sources found his claims impossible to verify.
Patrick Kearney, 'The Trashbag Killer'
Source: dailybreeze,com
In Los Angeles, in the mid 70's, Homosexual men were being murdered and dumped in trashbags along the highways between LA and the Mexican border. The investigation centered around Patrick Wayne Kearney, an electronics engineer from LA. Kearney would eventually end his murder spree, when he walked into the Redondo Beach police station, and gave himself up. He plead guilty to killing three men, and was sentenced to life in prison, however, police knew there was much more to Kearney's story than met the eye. They offered him a no death penalty deal, in exchange for a complete list of victims. Shockingly, it was worse than they had imagined, and Kearney initially confessed to eighteen more killings. He would later admit to a further eleven murders, which would bring his total to 32 killings. Kearney's first known murder victim was an unidentified 19-year-old man, in 1962. Kearney claimed that he took the young man to a secluded area on his motorcycle, shot him in the head, and proceeded to engage in acts of necrophilia with the man's corpse. Kearney would mostly pick up male hitchhikers, or homosexual men from gay bars. He would almost always shoot them in the temple, above the ear, with a .22-caliber derringer. After murdering them, he would take the bodies to a secluded place, and engage in acts of necrophilia, then take them home, where they would be sodomized with X-Acto knives. They were then mutilated, and dismembered with hacksaws. He would dispose of the bodies in various ways, including, dumping them in trash bags, earning him his nick name. He would also leave them out for wild animals to eat, throw them off cliffs into local creeks and would even drain some of the bodies of all their blood, to eliminate odors. Kearney, now 79, continues to serve his life sentence at Mule Creek State Prison, California.
Danny Rolling, 'The Gainesville Ripper'
Source: news.com.au
Known as the Gainesville Ripper, Danny Rolling murdered four University of Florida students and a Santa Fe Community College student in their apartments in 1990. He is known to have decapitated one victim, posed with the bodies, and removed skin and body parts and arranged the murder scenes using props that included broken mirrors. Rolling's reign of terror began when he broke into the apartment of 17-year-old university freshmen Sonja Larson and Christina Powell. They were found mutilated and stabbed to death. He had raped both women, one after she was dead. The next day, Rolling killed Christa Hoyt, 18. Her body was found propped up, sitting on her bed bent over at the waist. Rolling had sliced off her nipples and left them on the bed next to her, and police discovered that her torso was sliced open, from her chest to her pubic bone. Her severed head perched on a shelf across the room. Two days later, Rolling killed roommates Tracy Paules and Manuel Taboada, both 23. Rolling remained at large until September 8, when he was arrested after a botched robbery in the central Florida town of Ocala. He was later linked by DNA to three more killings in Shreveport, Louisiana, in 1989. He was not charged in the Gainesville slayings until 1992, while serving a life sentence for armed robbery and other crimes. He pleaded guilty to all five murders as the jury was being selected for trial in 1994. He attributed his behavior to abuse by his father, a police officer, and to an evil alter ego. In prison, he drew disturbing pictures and wrote a graphic book, 'The Making of a Serial Killer', with a woman who was his fiancée for a time. Rolling was executed by lethal injection at Florida State Prison on October 25, 2006
Arthur John Shawcross
Source: allthatsinteresting.com
Arthur John Shawcross was an American serial killer who was in operation between 1972 and 1990 around Rochester, New York. Shawcross is known to have killed at least 14 people, as well as being a known cannibal and mutilator. He was also known as, 'The Genesee River Killer' and 'The Rochester Strangler', all due to how he would carry out his murders and where he would frequently dump the bodies of his victims. In 1967 he was drafted by the US Army at age 21. He served one tour in Vietnam, and loved to brag about the violent, gruesome atrocities he committed, like raping and cannibalizing children and, according to a police interview: "beheading mama-sans and nailing their heads to trees as a warning to the Vietcong." After his release and discharge from the army, Shawcross and his second wife would move to Clayton, New York, where Shawcross would terrorize the surrounding counties, until his final arrest. In the Spring of 1972, 10-year-old Jack Owen Blake disappeared after going out to play near the Cloverdale apartments, where Shawcross lived. Shawcross had gone fishing with the boy a few days earlier, but denied knowing where he was. When Jack's body was eventually found (after Shawcross's arrest) months later, he had been suffocated, mutilated, and molested. Shawcross would later admit to luring the boy into the woods, forcing him to strip naked and run, before murdering him, and consuming his heart and genitals. Months after Jack's murder, 8-year-old Karen Ann Hill disappeared, while on a Labor Day vacation with her mother. Her body was found under a bridge near the Black River, and she had been raped, mutilated and strangled. After reports surfaced detailing that Shawcross had been seen with Karen before she disappeared, and he was later seen eating ice cream cones, on the bridge where the body was found, Shawcross was brought in for questioning. After being arrested for both children's murder, Shawcross confessed, and agreed to reveal the location of Jack's body, in order to have his charges dropped from homicide to manslaughter. He was sentenced to 25 years in prison, but would only serve 12. Unfortunately, staff and social workers made the call to grant him parole, stating he was: "no longer dangerous", despite numerous psychiatrists warning that he was a schizoid psychopath. His parole officer would later be quoted as saying: "At the risk of being melodramatic, the writer considers this mant to be possibly the most dangerous individual to be released to this community for many years." These words would ring tragically true when in 1988, Shawcross began a bloody, depraved murder campaign, that would claim 11 victims. Most were prostitutes and all were strangled and battered to death. They were also posthumously mutilated, and sexually assaulted. After the last victim's body was found in January 1990, the police decided not to remove it and instead keep surveillance on the area. Based on a psychological profile that suggested the killer would return to the scene of the crime, police figured this would be the best way to catch their killer. Sure enough, Shawcross was spotted masturbating as he sat in his car, on a bridge over the creek in which the body of his final victim was floating. He was arrested and eventually confessed in custody. In November 1990, Shawcross was tried for 10 murders in Monroe County. He was found guilty and sentenced to 250 years imprisonment. On November 10th, 2008 Shawcross complained to officers about a pain in his leg. He was taken to the Albany Medical Center where he went into cardiac arrest and died that night.
Louis Garavito
Source: rebelcircus.com
In 1999, Luis Alfredo Garavito Cubillos was arrested in Colombia and he confessed to murdering 140 children. He was charged with killing 172 altogether, but some of the cases are still ongoing. It's thought he could have been responsible for hundreds more deaths, with the number potentially estimated as being higher than 400. Better known as "La Bestia" or "The Beast", Luis Alfredo Garavito Cubillos was one of the most ruthless serial killers of all time. Garavito's victims were poor children, peasant children, or street children, between the ages of 6 and 16. He would approach them on the street or countryside and offer them gifts or small amounts of money. Once he had gained their trust, he would take them for a walk, and as soon as they began to get tired, he would pounce. He would rape them, slit their throats and dismember the corpses. As if this wasn't bad enough, he would often mutilate the corpses, and many of the bodies found showed signs of prolonged torture and abuse. In 1997, police uncovered a mass grave. Suddenly, a widespread investigation into the missing children began. In February 1998, the bodies of 2 naked children were discovered lying next to each other on a hill in Genoa, Colombia. The next day, another child's naked body was found, just a few meters away. Garavito was captured on 22 April 1999. He confessed to murdering 140 children. However, he is still under investigation for the murder of 172 children in more than 59 towns in Colombia. During his imprisonment, Garavito helped police to find the bodies of his victims. This, along with his confessions, allowed him to win a reduction in sentence by 8 years, thereby making the effective sentence 22 years. Colombian law does not have life imprisonment or death penalty options, and the possibility of serial killings was completely ignored in Colombian law. However, with increased public unrest, the law was revisited, and the maximum sentence for murder was increased to 60 years of imprisonment.
Joseph James DeAngelo, 'The Golden State Killer', and 'The East Area Rapist'
Source: law&crime.com
The Golden State Killer is a serial killer, rapist, and burglar who committed at least 13 murders, more than 50 rapes, and over 100 burglaries in California from 1974 to 1986. What was initially a search for the East Area Rapist, ended up being a 40-year manhunt for a killer, rapist and home invader. The reawakening of this cold case decades later led to the April 2018 arrest of suspect Joseph James DeAngelo, now dubbed as the Golden State Killer. DeAngelo was born in New York but went to Folsom High School, in suburban Sacramento, and was a former California Police Officer. In 2016, around the 40th anniversary of the first known attack, the search for the culprit of a suspected 12 homicides and about 50 rapes was renewed. Thanks to the advancement of DNA techniques and databases, DNA from a discarded item, and genetic information on a consumer genealogy website, guided police to the missing piece with DeAngelo as the suspect. DNA evidence linked the Golden State Killer to eight murders in Goleta, Ventura, Dana Point and Irvine; two other murders in Goleta, were lacking DNA evidence, but were linked by the killers usual modus operandi. His initial modus operandi was to stalk middle-class neighborhoods at night, in search of women who were alone in one-storey homes, usually near a school, creek, trail or other open space, that would provide a quick escape. He was seen a number of times, but always successfully fled; on one occasion, he shot and seriously wounded a young pursuer. Although he originally targeted women alone in their homes or with children, he eventually evolved to attacking couples. He would break in through a window or sliding glass door and awaken the sleeping occupants with a flashlight He would then begin threatening them with a handgun. Victims were bound with ligatures, and gagged. The male victim was beaten and left in a different room, while the female victim would be raped repeatedly for hours. In 1979, he moved on from rape, and began to murder his victims by gunshot or bludgeoning. After 1986 the case would go cold, until April 24, 2018, when the Sacramento County Sheriff's Department arrested 72-year-old Joseph James DeAngelo in connection with the crimes. DeAngelo, was charged with eight counts of first-degree murder. On May 10, the Santa Barbara County District Attorney's office charged DeAngelo with four additional counts of first-degree murder. Unfortunately, DeAngelo cannot be charged with rapes due to the statute of limitations expiring for those offenses. Identification of DeAngelo had begun four months earlier when officials uploaded the killer's DNA profile from a Ventura County rape kit to a personal genomics website. The website identified 10 to 20 distant relatives of the Golden State Killer, from whom a team of five investigators working with genealogist Barbara Rae-Venter, constructed a large family tree. They identified two suspects in the case (one of whom was ruled out by a relative's DNA test), leaving DeAngelo the main suspect.


Start planning your next trip to discover more about Best Western in Japan! Our hotels are located at convenient access for sightseeing or business.
We are located 7 minutes walk from Odori station. It faces Odori Park which serves as the venue for Sapporo's signature event, the Sapporo Snow Festival.
We are located 7 minutes by JR Rapid Airport Express from Shin-chitose Airport. We have 4 types room including 4 beds room and a Japanese Tatami room.
Our hotel is a 2-minutes walk from JR Sakurambo-Higashine station. Be it our business travelers, or leisure travelers, we are confident that our hotel's convenient location and extensive facilities will be satisfactory to all guests.
We are just a 3-minutes walk from JR Yonezawa station. We offer high-performance massage chair and artificial hot-springs(for men) for guests. Relax and refresh your tired body!
We are about 70 minutes away from Narita Airport, and about 60 minutes from Haneda Airport. It's the ideal location for both business and leisure travelers.
We are located at the best place where you are available to access to downtown with a variety of business facilities and amusement spots such as the Tokyo Bay area.
We offer an elegant hotel experience with the feel of the seasons through a "Japanese modern" style appearance. And you can take the free shuttle services.
We have a wide range of room selections for both business matters and family trips. We also offer 3 restaurants, Japanese, Western and Chinese.
For both business and leisure travelers, we surely meet your expectations. we are located at the best place where you are available to access to downtown.
We are located in Sakae which is the most popular entertainment area in Nagoya City. Our restaurant "Shima" is a fine Japanese restaurant serving the freshest seafood from Ise Bay.
You can walk to Dotonbori which is the most popular entertainment and gourmet area in Osaka from our hotel. We offer 2 types of rooms with full equipment.
We are the ideal location in Osaka for business and leisure travelers. All guest rooms are fully equipped with comfortable Simmons beds, rich amenities, and Wi-Fi access.
We are located in the central Osaka, at 2-minutes walk from Kitahama station. We welcome you to a quality atmosphere accompanied by our higher-than-ordinary service.
From business matters to family trips, we surely meet your expectations. We have a wide range of room selections to suit your various needs, and a restaurant and a conference room.
All Twin and Double rooms and Suites have a full view of Mt. Sakurajima and peaceful Kinko bay. We offer 2 restaurants, a banquet for conference and wedding, and pool & spa.
Perched just a few steps from gorgeous beaches, all kinds of watersports and other fun activities await. Get beautiful views from all of the oceanfront guest rooms.
Every one of our guest rooms offers a gorgeous ocean view balcony. You can also enjoy the pool with your family and children.


text:
Q: Read a word from a file and store the value next to it in c I am writing a program in C where i have a text file with the following contents:
City- 12
Temp- 78
Info1- blahblah blahblah
Info2- blahblah blahblah
Now i want to read the file line by line and after the first word (e.g "City-" )read the value next to it until i find the next interesting word (Info1, Temp) etc. My code looks like this so far:
    File * fp;
    char * buf[1024];
    while(fscanf(fp, "%s[^-]s", buf) ==1){
      if(buf == "City-"){
       /*Do something here and read until you find next interesting word */
      }
     }

Now, i know that this is pretty simple but i have trouble understanding how to procceed after i have read the first word. Thanks!


text:
Nice Incontinent Lady In The Van Outside — Stinks A Bit, Ill-Mannered, Conservative Viewpoints, Gotta Love Her
I'm sorry but I have this aversion to Nicholas Hytner and Alan Bennett's The Lady In The Van (TriStar Pictures). I know that my respect for Hytner, Bennett and Maggie Smith, who plays the title role, requires that I catch it when it plays at the Toronto Film Festival. But I really don't want to hang with a homeless lady who lives in a van outside a playwright's (i.e., Bennett's) London home for 15 years. Only in plays or films are homeless people semi-endearing; the ones I've run into have all been an obnoxious pain of one kind or another, and you really want to spare yourself the aroma if at all possible.
I recognize the game that The Lady In The Van is playing. It's testing the viewer's compassion. If you wind up feeling some measure of affection for Miss Shepherd, you're a decent person, and if you find her tedious or repellent then you're a shit. Can I just call myself a shit right now and spare myself from watching it?
The film is based on Bennett's 1999 West End play, which Hytner also directed. Here's the book version.
The Lady in the Van "is a completely true story," it says here. "In the 1970s and '80s outside Alan Bennett's own house in Camden an old lady (Miss Shepherd) lived in a van in the street. After a time she could no longer stay on the street. Amazingly, Bennett allowed her to move her van into his garden and there she remained until she died."
The Lady in the Van "is about the playwright's divided life, for which all real experience is grist for the writerly mill. It's about living gay and closeted in suburbia (the suburbs of London) in an age when coming out could get you arrested. It's about coming to terms with your own mum, about having bores for neighbors, who don't know when to leave you alone.
"It's about a disturbed woman's mania and grief, and becoming friends of a sort with her — at least, a concerned neighbor — though she was chronically ungrateful and encroaching, but when her health fails after she has driven him near mad with her impossible demands for years, he doesn't want her to change, he wants her to stay like she is, mad but indomitable to the end. Pick as many from the list above as you want and that's what The Lady in the Van is about.
"It's based on actual events. In 1974, a woman who lived in her van pulled it up Alan Bennett's driveway. She was only supposed to stay for a few days while she decided where to move next, but she ended up staying for fifteen years and was both a demanding tenant — can you be a tenant if you never pay rent? — and clearly insane. She also stinks. Continence is arguably a problem with her and her van has no toilet. Bennett wrote about his struggles with the mad Miss Shepherd, first in memoir form and then as a play. Maggie Smith played her on-stage in London."
Tarantino Waves Off Blanchett Brand, Dismisses Affleck's The Town, Praises David O. Russell
Which Films, If Any, Will Turn Out To Be This Year's Unbroken, Selma and Boyhood?


If something is good, you will just have to appreciate it right? Well, this is just the case with the Waste King 9980 garbage disposer, if you are looking for something that has a low price but could do a great work then this is the best garbage disposal unit you need to have. This is the Waste King 9980 review and we are going to look at some of the things that make it one of the best garbage disposals available.
This unit, unlike the others, has a 3-Bolt Mount when it comes to the installation part and can always be compared to the InSinkErator Evolution Excel. The waste king 9980 is a continuous feed garbage disposal unit with a 1.0 horsepower motor. This is also an upgrade of the waste king legend 9950. With that being said, let us now look at some of the features that this product has.
Unlike the other waste king legend products, this one has a 3-bolt sink mount system which can be a little bit difficult to install when you are alone and you are doing it for the first time. However, look at it on the bright side, the mount is usually stainless steel thus giving you a durable product that you can use for a longer period of time without thinking about its replacement. You can also refer to the manufacture's manual for more instructions on how to install the unit. There are also some video tutorials on this which you can also watch to help you do the installation.
One advantage about this product is that it always comes with a lifetime warranty. I do believe that this is one of the features that makes the waste king legend 9980 to be among the best garbage disposal units on the market today. This means that when your unit suffers any material or mechanical defect during the time you will be using it, the company will come to your home and repair the damaged parts or just replace the whole unit.
It is usually said that this is the most powerful garbage disposal you can ever find in this range. With a 1.0 horsepower motor, this is the fastest motor for all the garbage disposals. The waste king legend 9980 garbage disposal has a motor that operates at a high speed of 2800 rpm and it also uses less power for its operation hence it is an energy efficient product. With this power and speed, this disposal can grind almost anything. It is also a continuous feed disposer which means that you can always add food waste continuously while it is in operation. This should include water too. The unit also has a sound insulated shell to prevent it from producing a loud sound when being used.
Another advantage of having a disposal with this type of motor is that it doesn't leave behind any debris. A lot of users usually fear for this which forces you to do a constant cleaning to remove the debris. With this kind of speed produced by the motor, all your worries will be taken care of since everything will be grinded even the onion skins which are usually known to block your sink. They will not only be grinded, they will also be liquefied and be disposed of.
The waste king 9980 has many amazing features. One of them being, the fact that it has its grinding components made of stainless steel material. This means that it cannot be affected by rust. I tend to think that it is because of this that the company is happy to provide the customers with a lifetime corrosion warranty. The steel grinders are always efficient and durable and this enables you to dispose of any type of food in the sink. Even the shredder ring and the swivel impeller are both made of steel.
The waste king legend 9980 usually produces a relatively quiet sound when being used. However, I cannot say that it's that much silent. Even with the sound insulation shell, it is still noisy. Well, the noise is usually at some reasonable level but you need to put in mind that this is a garbage disposal that can grind the tough foods and even small bones. With this, you can be sure to hear some sound emanating from the unit and the sound level increases when grinding a greater amount of food waste in the disposer or when the food waste is a bit difficult to grind. You can even hear some loud click when the motor starts up. This alone can be annoying to some noise sensitive users.
Waste king 9980 might not necessarily be the best garbage disposal but for sure it is rated to be among the best garbage disposal around. This is the kind of product that will always suit those users who prefer to save some cash by purchasing a quality product at a relatively cheaper price.
However, I can say that you must be ready to adjust to the noise level produced by this disposal when being used. This product even though it has a powerful grinder, it is still prone to clogging occasionally. It also has a small size which can perfectly fit under your sink, saving you some space. Get your Waste King Legend 9980 today and discover the secret your neighbour is not telling you about.
Hope you have got the best information about Waste King 9980 Legend Series. If you like this review, then never forget to share on social media.


Official Twitch app for Xbox One has been updated after a very long time. The latest update to the Twitch app comes with some bug fixes and performance improvements to the application. The users of the Twitch app were affected by the streamer listing on pretty much every page of the app.
While the app would show up-to-date status' of streamers (i.e. Live, Hosting, or Offline), the lists would never refresh when switching between the different pages within the app. Users would have to quit the app and re-open it to see any changed statuses and it made for a very poor and frustrating user experience.
The users have been having the issues to the Twitch app for sometime now and with the latest update the bug seems to have been fixed. Other than the bug fixes no other changes have been noticed after the latest update.
The Twitch app still lacks support for many of the features. No other changes appear to have been made to the app with this update which is a shame as it's currently lacking support for a variety of features which are available on the web version and have become integral to the Twitch experience such subscriptions, bits, and communities.


text:
Rivers, Fresno State top Arizona State in Las Vegas Bowl
Sábado, 15 de Diciembre de 2018 18:54
Usar puntuación: / 0
LAS VEGAS (AP) Ronnie Rivers rushed for 212 yards and two touchdowns, Anthoula "Tank" Kelly had a 70-yard interception return for a touchdown and No. 19 Fresno State beat Arizona State 31-20 in the Las Vegas Bowl on Saturday.
Marcus McMaryion rushed for a touchdown and was 15-of-29 passing for 176 yards to help the Bulldogs (12-2) set a school record for wins in a season. He also threw two interceptions.
Eno Benjamin rushed for 118 yards a one touchdown for the Sun Devils (7-6) in their third straight bowl loss. Manny Wilkins threw for 129 yards, with a 3-yard scoring pass to Kyle Williams and two interceptions.
Rivers put Fresno State back in front 24-20 with a 68-yard touchdown run up the middle in the third quarter and had a 5-yard scoring run in the fourth quarter to seal Fresno State's second win over a Pac-12 opponent this season.
Wilkins sustained an apparent knee injury on the final pass of his college career, which was intercepted by Juju Hughes.
Arizona State took a 20-17 lead on Brandon Ruiz's 44-yard field goal in the third quarter after Asashari Crosswell intercepted McMaryion at the Fresno State 39.
McMaryion's pass was intercepted by Chase Lucas on his next throw, an ill-fated heave downfield after reversing field under pressure. The senior had thrown three interceptions in 398 pass attempts during the regular season and Mountain West title game.
With the teams tied at 17 after the first half, it looked as if Fresno State was going to go back in front on its first possession of the third quarter on a throwback screen from McMaryion to Dejonte O'Neal but video review showed the senior wide receiver lost possession of the ball diving for the pylon and Shannon Forman recovered in the end zone.
Benjamin set the record with a 13-yard run in the second quarter, passing Woody Green's mark of 1,565 yards rushing in 1972. Benjamin scored his 16th rushing touchdown of the season on the following play from scrimmage, giving Arizona State its first lead at 14-10.
Arizona State: The Sun Devils will be disappointed to finish with the exact same record as last season, but signs of progress under first-year coach Herm Edwards are evident. The defense found several young playmakers and mostly played well without freshman linebacker Merlin Robertson. The offense, which played without star wide receiver N'Keal Harry after he declared for the NFL draft, will have to be upgraded to contend in the Pac-12.
Fresno State: It wasn't pretty, but the Bulldogs used a strong second half to secure its best season in school history. The senior-heavy offensive line led the way for Rivers, who will be the focal point of the offense in 2019 considering the upcoming turnover in the passing game. With a 22-6 record in two seasons at Fresno State, Jeff Tedford has reminded everyone why he is one of the best coaches in college football.
Fresno State could finish the season ranked for the third time in school history and should earn its highest final-ranking ever. Arizona State could merit consideration from voters in the preseason poll.
Arizona State: The Sun Devils need to replace Wilkins, and with commitments from three top high school quarterbacks, it seems his successor might not have been in uniform at the Las Vegas Bowl. If Arizona State can find stability there quickly, the pieces look to be in place to challenge Utah and Southern California in the Pac-12 South.
Fresno State: The Bulldogs are looking at a major roster overhaul, losing McMaryion, all three starting wide receivers, four of five starting offensive linemen and four defensive starters. However, a return to the Mountain West Conference title game isn't an unreasonable expectation based on what Tedford has accomplished in his first two seasons at Fresno State.


CCP has released a new devblog today about the state of the chat system. For the last 11 months, the system has been having issues, including incorrect population count and incorrect pilot data in the local member's list. These issues stemmed from problems connecting to the chat cluster.
Last month on January 9, CCP released a New Year update covering the new chat system and their future plans. In that devblog, CCP promised to see how well fixes could be applied and how much progress could be made before the end of February. That would inform the decision to either roll back to the old chat system or to press forward, knowing that enough progress has been made to expand and stabilize the new chat system. Today's blog focused on the strides taken since then.
On the 8th and the 16th of January, two major updates were applied in an attempt to bring stability to the chat cluster and improve performance, primarily dealing with how the system works with pilot switching channels from one system to another and how initial presence is delivered when pilots join large chat channel such as Jita. After deployment of the second update, there's been a decrease in the number of bug reports and support tickets which dropped to an old baseline since the new system was initially deployed in March 2018.
Issues surrounding chat have brought up a lot of questions and discussions within CCP. These focused on matters from how the new system was developed and deployed, to how communication was carried out between the players and the developers. As a result, CCP feels like they have failed on multiple fronts and now understand the gravity of the situation and how it affects pilots on day-to-day activity. They confirmed that considering the amount of progress in stabilizing the chat server, and the reduction of ongoing ticket issues, it is their intention now to continue using and developing the current chat system. This is because of the future-proofing abilities of the XMPP chat system with how it expands the possibilities in future development.
However, CCP is also offering a bit of reimbursement for the difficulties players suffered. In the coming weeks, the highest skill point character on every account that held Omega clone status as of the start of daily downtime on March 20th, 2018 (the day the chat system was deployed) will receive a gift of 500,000 skill points in their unallocated skill point pool. For characters in the 15 million+ skill point range, this is the equivalent of over 3 Large Skill Injectors' worth of SP. INN will endeavour to let you know when skill points are released.
CCP asks that any feedback be made in the associated thread, and encourages players to continue reporting any issues with the chat system or other parts of the game.
Bit off topic but im really looking forward to Eve mobile and by extension if it will have similar issues to this or different ones.


"These are repercussions that step over into the area of social policy," says Michael Heise, chief economist at insurance and.
. comprehensive insurance (as provided by e.g. Axa or Allianz) into the digital age. Customers can buy, change or cancel an insurance policy paper-free and in real time in the Getsafe app.
Labeling it on-demand, employer-sponsored health insurance. electric car development, and personal wellness. While U.S. tr.


Verizon Wireless plans to increase fees it charges customers when they activate a new line of service or upgrade to a new device. On Feb. 5, Verizon will increase the activation fee from $35 to $40 and increase the upgrade fee from $30 to $40. "These fees are not unique to Verizon and help offset costs associated with upgrades, activations, and other operational costs," said Verizon spokesperson David Samberg in an email to Phone Scoop. "Verizon Wireless is committed to the fees remaining competitive within the wireless industry." According to Verizon, it hasn't increased the activation fee in more than 10 years. It last increased the upgrade fee in 2012.
Verizon has repriced its phone activation fees, lowering the cost for online and in-app phone purchases, while raising the fee for in-store and over-the-phone activations. Previously, all new phone activations incurred a $30 fee.
Apple has removed a tool within iCloud that allowed people to easily check the Activation Lock status of iPhones, iPods, and iPads. Activation Lock was introduced as a part of iOS 7's Find My iPhone feature in 2014.
First they're not going to follow TMO & ATT with data roll over. Now they're raising prices for activation's & upgrades.
They're really trying to win customers over with their "We're the best and most expensive. Take it or leave it" motto.
Pretty much industry standard. I don't think they charge upgrade or activation fees on their EDGE program.
Yep, the costs were killing me, I dumped verizon and went prepaid with PagePlus, using the same network with no contracts and less than half the bill, it works for me.
Yep, don't compete to give your customers at least competitive rates and features, as was already mentioned, but instead increase fees. That sounds wonderful.
I love when their salespeople pull up my account with UNLIMITED DATA and know I'm NOT buying ANYTHING they are selling! I use the heck out of my data now and my teenage son uses 50gb a month!


text:
@class IDEContainer;

@protocol IDEContainerReloadingDelegate
- (int)responseToExternalChangesToBackingFileForContainer:(IDEContainer *)arg1 fileWasRemoved:(BOOL)arg2;
@end


text:
Dear Evan Hansen By Val Emmich
Dear Evan Hansen Summary
Read the book before you see the musical, coming to the West End Autumn 2019!
'Even in book form, Evan Hansen's story sings. Required reading, especially for anyone who's ever needed to be found' - Becky Albertalli, author of Love Simon
Dear Evan Hansen,
Today's going to be an amazing day and here's why...
When a letter that was never meant to be seen draws high school senior Evan Hansen into the Murphy family's grief over the loss of their son, he is given the chance of a lifetime: to belong.
He just has to stick to a lie he never meant to tell.
That the notoriously troubled Connor Murphy was his secret best friend.
Suddenly, Evan isn't invisible anymore. And Connor's wealthy parents have taken him in like he was their own, desperate to know more about their enigmatic son from his 'closest friend'.
As Evan gets pulled deeper into their family, he knows that what he's doing may not be right, but if he's helping people, how wrong can it be?
No longer tangled in his once-incapacitating anxiety, this new Evan has a purpose.
He's confident. He's a viral phenomenon. Every day is amazing. But when everything is in danger of unravelling, he comes face to face with his greatest obstacle: himself.
A simple lie leads to complicated truths in this big-hearted coming-of-age story of grief, authenticity and the struggle to belong in an age of instant connectivity and profound isolation.
Praise for Dear Evan Hansen:
'Dear Evan Hansen: The Novel is a terrific reinvention of an already brilliant piece of art.' -Jodi Picoult, author of My Sister's Keeper
'Today's going to be an amazing day, and here's why: because you're holding this book.' - David Arnold, author of Mosquitoland
'The writers of Dear Evan Hansen have given fans a rare gift' - Teen Vogue
'Yep, the hit musical will make you cry just as much in book form' - Entertainment Weekly
Customer Reviews - Dear Evan Hansen
Dear Evan Hansen Reviews
A must-read for teens and those who care about them * Publishers Weekly *
A gorgeous new musical for anyone with a beating heart
* The New York Times *
One of the most remarkable shows in musical theatre history * The Washington Post *
As eagerly awaited as Hamilton * Baz Bamingboye, Mail on Sunday *
About Val Emmich
Val Emmich (Author)
Val Emmich is a writer, singer-songwriter, and actor whowas dubbed a 'Renaissance man' by the New York Post. He has hadrecurring roles on Vinyl and Ugly Betty as well as a memorableguest role as Liz Lemon's coffee-boy fling, Jamie, on 30 Rock. His debutnovel, The Reminders, received rave reviews, with Popsugar deeming it'beautiful and beguiling' and Huffington Post saying "Emmichperforms a bit of creative magic...in his warm and winning debut'. Emmich livesin Jersey City, New Jersey, with his wife and their two children.
Justin Paul (Author)
Benj Pasek andJustin Paul are the Tony,Oscar (R), and Golden Globe-winning songwriting team behind the Broadway musicals DearEvan Hansen (Tony Award, Drama Desk Award, Obie Award, Outer Critics CircleAward, Helen Hayes Award) and A Christmas Story: The Musical (Tony,Drama Desk, Outer Critics Circle, London Evening Standard award nominations), Jamesand the Giant Peach, and Edges. Film projects include La La Land(Lionsgate); and Trolls (DreamWorks Animation). Recent and upcoming filmprojects include The Greatest Showman (20thCentury Fox); Snow White (Walt Disney Pictures); Medusa (SonyPictures Animation); and Aladdin (Walt Disney Pictures). TV creditsinclude Smash, Sesame Street, The Flash, and Johnny and the Sprites,and FOX's A Christmas Story Live! musical. Additional honours: RichardRodgers Award (American Academy of Arts and Letters); ASCAP Foundation RichardRodgers New Horizons Award; Jonathan Larson Award. Both are graduates of theUniversity of Michigan Musical Theatre program and members of the DramatistsGuild of America, Inc.
Steven Levenson (Author)
Steven Levenson is the Tony Award-winning book writer of DearEvan Hansen. His plays include If I Forget, The Unavoidable Disappearnceof Tom Durnin, Core Values, The Language of Trees, and Seven Minutes inHeaven. Honors include the Obie Award, Outer Critics Circle Award, OuterCritics John Gassner Playwriting Award, Drama League Award, Drama Desknomination, Hull-Warriner nomination, Lucille Lortel nomination, and the HelenHayes Award. A former Artist in Residence at Ars Nova and a member of theRoundabout Leadership Council, he worked for three seasons as a writer andproducer on Showtime's Masters of Sex and is a founding member of ColtCoeur and an alumnus of MCC's Playwrights Coalition and Ars Nova's Play Group.His plays are published by Dramatists Play Service and Playscripts. A graduateof Brown University, he is a member of the Dramatists Guild of America, Inc.,and the WGA.
Penguin Random House Children's UK


text:
Bucs' Chandler Catanzaro emotional after making longest-ever OT field goal
By Jenna Laine ESPN Staff Writer
TAMPA, Fla. -- Buccaneers kicker Chandler Catanzaro's voice started to quiver and his icy-blue eyes grew misty. He'd just nailed the 59-yard game-winning field goal -- the longest field goal in overtime history -- and all he could think about were those who didn't give up on him after he missed what would have been the game-winner.
"They mean a lot," Catanzaro said of teammates who rushed to give him a hero's welcome. "As a kicker, you never want to go in there [and miss] when they set you up so well. ... I'm just so thankful it worked out like it did. God is good."
The previous long was Oakland's Sebastian Janikowski from 57 yards on Oct. 19, 2008.
"I almost passed out. I stood up and got dizzy trying to scream too much," said Bryan Anger, the Bucs' punter who was the holder on Catanzaro's kick. "It's tough to keep your head down and push through that.
"He played the wind well. The wind was kind of going in our faces and cross from right to left, so that's tough because he [had to] start outside the uprights. ... So he started outside the uprights and let it draw back in. The wind was a little tricky today. Up top, the wind was going one way and below, it was going the other."
With 4 seconds to go with the game tied 23-23, Catanzaro saw his 40-yard kick sail wide right. In the second quarter, he also missed an extra point -- all from the same hashmark. Anger wasn't sure if that contributed to the misses.
"I was extremely upset with myself. I told the guys earlier, 'This team deserved to win this game,'" Catanzaro said. "They played their tails off all game, and for me to miss a kick like that, it was very frustrating for me, especially after the prep I had this week."
Defensive line coach Brenston Buckner, a fellow Clemson alum who was with Catanzaro when he was with the Arizona Cardinals, said he told him: "Stick with it. You've been here."
Quarterback Jameis Winston told him: "We're gonna give it to you again. Stay in it. Do your thing."
Because of the new NFL overtime rules -- which if the game is tied at the end of the overtime period, it will result in a tie -- head coach Dirk Koetter felt he had to pull the trigger. He had also witnessed Catanzaro drill a 61-yarder in practice this week. Catanzaro made a 57-yarder when he was with the New York Jets last season and was 62.5 percent on kicks of 50-plus yards since 2016.
"I knew he had the distance in him," Koetter said. "If we didn't make that one, we weren't getting it back. You either go for the win or hope you tie. The way the game was going, we were going for the win. But I knew he could make it if he hit it."
Browns head coach Hue Jackson said he was surprised to see the Bucs line up for a 59-yard field goal in overtime.
"I said there's no way he was going to make that. He did. So they won," Jackson said.
Defensive back Damarious Randall was expecting to see the punt team.
"I saw the kicker come out and I thought, 'He just missed a [40]-yarder, there's no way he's going to make a 58- or 59-yarder,'" Randall said. "That's just the nature of the game. He just missed a kick and he just made a hell of a kick. Just tip your hat to him. That's a hell of a kick."
Added Baker Mayfield: "I'm thinking if he doesn't make it, we're getting the ball at midfield, we have less than 20 yards until our kicker is in comfortable reaching distance at that. That's a great kick. You don't see that often."
Posted by NC Sports on Monday, October 22, 2018
Labels: chandler catanzaro, NC Sports Athletes in the News
Patriots DE Trey Flowers rated as NFL's top edge d...
Trey Flowers was in full bloom setting a hard defe...
PNJ Top 50 Greatest Athletes: 31-40
Coon pins his way to World finals, guarantees USA ...
Redskins vs Giants Jay Gruden Presser: Brandon Sch...
Packers-Rams Preview: RG Austin Blythe is an under...
Special Teams Player of the Week
Bucs' Chandler Catanzaro emotional after making lo...
The Perfect Wrestler
Matt Nagy: Flowers might not be a big name, but he...
Winners and losers from Patriots' thrilling win ov...
Week 5 NFL Team of the Week
Cardinals kicker Phil Dawson entering rare company...
Mike Vrabel an early Coach of the Year candidate f...
The Award Section: Coaches of the Week
Trey Flowers Return, John Simon Arrival Key to New...