text:
using namespace std;

  NGT::Command::CreateParameters::CreateParameters(Args &args) {
    try {
      index = args.get("#1");
    } catch (...) {
      std::stringstream msg;
      msg << "Command::CreateParameter: Error: An index is not specified.";
      NGTThrowException(msg);
    }

    try {
      objectPath = args.get("#2");
    } catch (...) {}

    property.edgeSizeForCreation = args.getl("E", 10);
    property.edgeSizeForSearch = args.getl("S", 40);
    property.batchSizeForCreation = args.getl("b", 200);
    property.insertionRadiusCoefficient = args.getf("e", 0.1) + 1.0;
    property.truncationThreshold = args.getl("t", 0);
    property.dimension = args.getl("d", 0);
    property.threadPoolSize = args.getl("p", 24);
    property.pathAdjustmentInterval = args.getl("P", 0);
    property.dynamicEdgeSizeBase = args.getl("B", 30);
    property.buildTimeLimit = args.getf("T", 0.0);

    if (property.dimension <= 0) {
      std::stringstream msg;
      msg << "Command::CreateParameter: Error: Specify greater than 0 for # of your data dimension by a parameter -d.";
      NGTThrowException(msg);
    }

    property.objectAlignment = args.getChar("A", 'f') == 't' ? NGT::Property::ObjectAlignmentTrue : NGT::Property::ObjectAlignmentFalse;

    char graphType = args.getChar("g", 'a');
    switch(graphType) {
    case 'a': property.graphType = NGT::Property::GraphType::GraphTypeANNG; break;
    case 'k': property.graphType = NGT::Property::GraphType::GraphTypeKNNG; break;
    case 'b': property.graphType = NGT::Property::GraphType::GraphTypeBKNNG; break;
    case 'd': property.graphType = NGT::Property::GraphType::GraphTypeDNNG; break;
    case 'o': property.graphType = NGT::Property::GraphType::GraphTypeONNG; break;
    case 'i': property.graphType = NGT::Property::GraphType::GraphTypeIANNG; break;
    default:
      std::stringstream msg;
      msg << "Command::CreateParameter: Error: Invalid graph type. " << graphType;
      NGTThrowException(msg);
    }

    if (property.graphType == NGT::Property::GraphType::GraphTypeONNG) {
      property.outgoingEdge = 10;
      property.incomingEdge = 80;
      string str = args.getString("O", "-");
      if (str != "-") {
	vector<string> tokens;
	NGT::Common::tokenize(str, tokens, "x");
	if (str != "-" && tokens.size() != 2) {
	  std::stringstream msg;
	  msg << "Command::CreateParameter: Error: outgoing/incoming edge size specification is invalid. (out)x(in) " << str;
	  NGTThrowException(msg);
	}
	property.outgoingEdge = NGT::Common::strtod(tokens[0]);
	property.incomingEdge = NGT::Common::strtod(tokens[1]);
      }
    }

    char seedType = args.getChar("s", '-');
    switch(seedType) {
    case 'f': property.seedType = NGT::Property::SeedType::SeedTypeFixedNodes; break;
    case '1': property.seedType = NGT::Property::SeedType::SeedTypeFirstNode; break;
    case 'r': property.seedType = NGT::Property::SeedType::SeedTypeRandomNodes; break;
    case 'l': property.seedType = NGT::Property::SeedType::SeedTypeAllLeafNodes; break;
    default:
    case '-': property.seedType = NGT::Property::SeedType::SeedTypeNone; break;
    }

    char objectType = args.getChar("o", 'f');
    char distanceType = args.getChar("D", '2');

    numOfObjects = args.getl("n", 0);
    indexType = args.getChar("i", 't');

    switch (objectType) {
    case 'f':
      property.objectType = NGT::Index::Property::ObjectType::Float;
      break;
    case 'c':
      property.objectType = NGT::Index::Property::ObjectType::Uint8;
      break;
#ifdef NGT_HALF_FLOAT
    case 'h':
      property.objectType = NGT::Index::Property::ObjectType::Float16;
      break;
#endif
    default:
      std::stringstream msg;
      msg << "Command::CreateParameter: Error: Invalid object type. " << objectType;
      NGTThrowException(msg);
    }

    switch (distanceType) {
    case '1':
      property.distanceType = NGT::Index::Property::DistanceType::DistanceTypeL1;
      break;
    case '2':
    case 'e':
      property.distanceType = NGT::Index::Property::DistanceType::DistanceTypeL2;
      break;
    case 'a':
      property.distanceType = NGT::Index::Property::DistanceType::DistanceTypeAngle;
      break;
    case 'A':
      property.distanceType = NGT::Index::Property::DistanceType::DistanceTypeNormalizedAngle;
      break;
    case 'h':
      property.distanceType = NGT::Index::Property::DistanceType::DistanceTypeHamming;
      break;
    case 'j':
      property.distanceType = NGT::Index::Property::DistanceType::DistanceTypeJaccard;
      break;
    case 'J':
      property.distanceType = NGT::Index::Property::DistanceType::DistanceTypeSparseJaccard;
      break;
    case 'c':
      property.distanceType = NGT::Index::Property::DistanceType::DistanceTypeCosine;
      break;
    case 'C':
      property.distanceType = NGT::Index::Property::DistanceType::DistanceTypeNormalizedCosine;
      break;
    case 'E':
      property.distanceType = NGT::Index::Property::DistanceType::DistanceTypeNormalizedL2;
      break;
    case 'p':  // added by Nyapicom
      property.distanceType = NGT::Index::Property::DistanceType::DistanceTypePoincare;
      break;
    case 'l':  // added by Nyapicom
      property.distanceType = NGT::Index::Property::DistanceType::DistanceTypeLorentz;
      break;
    default:
      std::stringstream msg;
      msg << "Command::CreateParameter: Error: Invalid distance type. " << distanceType << endl;
      NGTThrowException(msg);
    }

#ifdef NGT_SHARED_MEMORY_ALLOCATOR
    size_t maxNoOfObjects = args.getl("N", 0);
    if (maxNoOfObjects > 0) {
      property.graphSharedMemorySize
	= property.treeSharedMemorySize
	= property.objectSharedMemorySize = 512 * ceil(maxNoOfObjects / 50000000);
    }
#endif
  }

  void
  NGT::Command::create(Args &args)
  {
    const string usage = "Usage: ngt create "
      "-d dimension [-p #-of-thread] [-i index-type(t|g)] [-g graph-type(a|k|b|o|i)] "
      "[-t truncation-edge-limit] [-E edge-size] [-S edge-size-for-search] [-L edge-size-limit] "
      "[-e epsilon] "
#ifdef NGT_HALF_FLOAT
      "[-o object-type(f|h|c)] "
#else
      "[-o object-type(f|c)] "
#endif
      "[-D distance-function(1|2|a|A|h|j|c|C|E|p|l)] [-n #-of-inserted-objects] "  // added by Nyapicom
      "[-P path-adjustment-interval] [-B dynamic-edge-size-base] [-A object-alignment(t|f)] "
      "[-T build-time-limit] [-O outgoing x incoming] "
#if defined(NGT_SHARED_MEMORY_ALLOCATOR)
      "[-N maximum-#-of-inserted-objects] "
#endif
      "index(output) [data.tsv(input)]";

    try {
      CreateParameters createParameters(args);

      if (debugLevel >= 1) {
	cerr << "edgeSizeForCreation=" << createParameters.property.edgeSizeForCreation << endl;
	cerr << "edgeSizeForSearch=" << createParameters.property.edgeSizeForSearch << endl;
	cerr << "edgeSizeLimit=" << createParameters.property.edgeSizeLimitForCreation << endl;
	cerr << "batch size=" << createParameters.property.batchSizeForCreation << endl;
	cerr << "graphType=" << createParameters.property.graphType << endl;
	cerr << "epsilon=" << createParameters.property.insertionRadiusCoefficient - 1.0 << endl;
	cerr << "thread size=" << createParameters.property.threadPoolSize << endl;
	cerr << "dimension=" << createParameters.property.dimension << endl;
	cerr << "indexType=" << createParameters.indexType << endl;
      }

      switch (createParameters.indexType) {
      case 't':
	NGT::Index::createGraphAndTree(createParameters.index, createParameters.property, createParameters.objectPath, createParameters.numOfObjects);
	break;
      case 'g':
	NGT::Index::createGraph(createParameters.index, createParameters.property, createParameters.objectPath, createParameters.numOfObjects);
	break;
      }
    } catch(NGT::Exception &err) {
      std::cerr << err.what() << std::endl;
      cerr << usage << endl;
    }
  }

  void
  NGT::Command::append(Args &args)
  {
    const string usage = "Usage: ngt append [-p #-of-thread] [-d dimension] [-n data-size] "
      "index(output) [data.tsv(input)]";
    string database;
    try {
      database = args.get("#1");
    } catch (...) {
      cerr << "ngt: Error: DB is not specified." << endl;
      cerr << usage << endl;
      return;
    }
    string data;
    try {
      data = args.get("#2");
    } catch (...) {
      cerr << "ngt: Warning: No specified object file. Just build an index for the existing objects." << endl;
    }

    int threadSize = args.getl("p", 50);
    size_t dimension = args.getl("d", 0);
    size_t dataSize = args.getl("n", 0);

    if (debugLevel >= 1) {
      cerr << "thread size=" << threadSize << endl;
      cerr << "dimension=" << dimension << endl;
    }

    try {
      NGT::Index::append(database, data, threadSize, dataSize);
    } catch (NGT::Exception &err) {
      cerr << "ngt: Error " << err.what() << endl;
      cerr << usage << endl;
    } catch (...) {
      cerr << "ngt: Error" << endl;
      cerr << usage << endl;
    }
  }

  void
  NGT::Command::search(NGT::Index &index, NGT::Command::SearchParameters &searchParameters, istream &is, ostream &stream)
  {

    if (searchParameters.outputMode[0] == 'e') {
      stream << "# Beginning of Evaluation" << endl;
    }

    string line;
    double totalTime	= 0;
    size_t queryCount	= 0;
    while(getline(is, line)) {
      if (searchParameters.querySize > 0 && queryCount >= searchParameters.querySize) {
	break;
      }
      NGT::Object *object = index.allocateObject(line, " \t");
      queryCount++;
      size_t step = searchParameters.step == 0 ? UINT_MAX : searchParameters.step;
      for (size_t n = 0; n <= step; n++) {
	NGT::SearchContainer sc(*object);
	double epsilon;
	if (searchParameters.step != 0) {
	  epsilon = searchParameters.beginOfEpsilon + (searchParameters.endOfEpsilon - searchParameters.beginOfEpsilon) * n / step;
	} else {
	  epsilon = searchParameters.beginOfEpsilon + searchParameters.stepOfEpsilon * n;
	  if (epsilon > searchParameters.endOfEpsilon) {
	    break;
	  }
	}
	NGT::ObjectDistances objects;
	sc.setResults(&objects);
	sc.setSize(searchParameters.size);
	sc.setRadius(searchParameters.radius);
	if (searchParameters.accuracy > 0.0) {
	  sc.setExpectedAccuracy(searchParameters.accuracy);
	} else {
	  sc.setEpsilon(epsilon);
	}
 	sc.setEdgeSize(searchParameters.edgeSize);
	NGT::Timer timer;
	try {
	  if (searchParameters.outputMode[0] == 'e') {
	    double time = 0.0;
	    uint64_t ntime = 0;
	    double minTime = DBL_MAX;
	    size_t trial = searchParameters.trial <= 0 ? 1 : searchParameters.trial;
	    for (size_t t = 0; t < trial; t++) {
	      switch (searchParameters.indexType) {
	      case 't': timer.start(); index.search(sc); timer.stop(); break;
	      case 'g': timer.start(); index.searchUsingOnlyGraph(sc); timer.stop(); break;
	      case 's': timer.start(); index.linearSearch(sc); timer.stop(); break;
	      }
	      if (minTime > timer.time) {
		minTime = timer.time;
	      }
	      time += timer.time;
	      ntime += timer.ntime;
	    }
	    time /= (double)trial;
	    ntime /= trial;
	    timer.time = minTime;
	    timer.ntime = ntime;
	  } else {
	    switch (searchParameters.indexType) {
	    case 't': timer.start(); index.search(sc); timer.stop(); break;
	    case 'g': timer.start(); index.searchUsingOnlyGraph(sc); timer.stop(); break;
	    case 's': timer.start(); index.linearSearch(sc); timer.stop(); break;
	    }
	  }
	} catch (NGT::Exception &err) {
	  if (searchParameters.outputMode != "ei") {
	    // not ignore exceptions
	    throw err;
	  }
	}
	totalTime += timer.time;
	if (searchParameters.outputMode[0] == 'e') {
	  stream << "# Query No.=" << queryCount << endl;
	  stream << "# Query=" << line.substr(0, 20) + " ..." << endl;
	  stream << "# Index Type=" << searchParameters.indexType << endl;
	  stream << "# Size=" << searchParameters.size << endl;
	  stream << "# Radius=" << searchParameters.radius << endl;
	  stream << "# Epsilon=" << epsilon << endl;
	  stream << "# Query Time (msec)=" << timer.time * 1000.0 << endl;
	  stream << "# Distance Computation=" << sc.distanceComputationCount << endl;
	  stream << "# Visit Count=" << sc.visitCount << endl;
	} else {
	  stream << "Query No." << queryCount << endl;
	  stream << "Rank\tID\tDistance" << endl;
	}
	for (size_t i = 0; i < objects.size(); i++) {
	  stream << i + 1 << "\t" << objects[i].id << "\t";
	  stream << objects[i].distance << endl;
	}
	if (searchParameters.outputMode[0] == 'e') {
	  stream << "# End of Search" << endl;
	} else {
	  stream << "Query Time= " << timer.time << " (sec), " << timer.time * 1000.0 << " (msec)" << endl;
	}
      } // for
      index.deleteObject(object);
      if (searchParameters.outputMode[0] == 'e') {
	stream << "# End of Query" << endl;
      }
    } // while
    if (searchParameters.outputMode[0] == 'e') {
      stream << "# Average Query Time (msec)=" << totalTime * 1000.0 / (double)queryCount << endl;
      stream << "# Number of queries=" << queryCount << endl;
      stream << "# End of Evaluation" << endl;

      if (searchParameters.outputMode == "e+") {
	// show graph information
	size_t esize = searchParameters.edgeSize;
	long double distance = 0.0;
	size_t numberOfNodes = 0;
	size_t numberOfEdges = 0;

	NGT::GraphIndex	&graph = (NGT::GraphIndex&)index.getIndex();
	for (size_t id = 1; id < graph.repository.size(); id++) {
	  NGT::GraphNode *node = 0;
	  try {
	    node = graph.getNode(id);
	  } catch(NGT::Exception &err) {
	    cerr << "Graph::search: Warning. Cannot get the node. ID=" << id << ":" << err.what() << " If the node was removed, no problem." << endl;
	    continue;
	  }
	  numberOfNodes++;
	  if (numberOfNodes % 1000000 == 0) {
	    cerr << "Processed " << numberOfNodes << endl;
	  }
	  for (size_t i = 0; i < node->size(); i++) {
	    if (esize != 0 && i >= esize) {
	      break;
	    }
	    numberOfEdges++;
#if defined(NGT_SHARED_MEMORY_ALLOCATOR)
	    distance += (*node).at(i, graph.repository.allocator).distance;
#else
	    distance += (*node)[i].distance;
#endif
	  }
	}

	stream << "# # of nodes=" << numberOfNodes << endl;
	stream << "# # of edges=" << numberOfEdges << endl;
	stream << "# Average number of edges=" << (double)numberOfEdges / (double)numberOfNodes << endl;
	stream << "# Average distance of edges=" << setprecision(10) << distance / (double)numberOfEdges << endl;
      }
    } else {
      stream << "Average Query Time= " << totalTime / (double)queryCount  << " (sec), "
	   << totalTime * 1000.0 / (double)queryCount << " (msec), ("
	   << totalTime << "/" << queryCount << ")" << endl;
    }
  }

  void
  NGT::Command::search(Args &args) {
    const string usage = "Usage: ngt search [-i index-type(g|t|s)] [-n result-size] [-e epsilon] [-E edge-size] "
      "[-m open-mode(r|w)] [-o output-mode] index(input) query.tsv(input)";

    string database;
    try {
      database = args.get("#1");
    } catch (...) {
      cerr << "ngt: Error: DB is not specified" << endl;
      cerr << usage << endl;
      return;
    }

    SearchParameters searchParameters(args);

    if (debugLevel >= 1) {
      cerr << "indexType=" << searchParameters.indexType << endl;
      cerr << "size=" << searchParameters.size << endl;
      cerr << "edgeSize=" << searchParameters.edgeSize << endl;
      cerr << "epsilon=" << searchParameters.beginOfEpsilon << "<->" << searchParameters.endOfEpsilon << ","
	   << searchParameters.stepOfEpsilon << endl;
    }

    try {
      NGT::Index	index(database, searchParameters.openMode == 'r');
      search(index, searchParameters, cout);
    } catch (NGT::Exception &err) {
      cerr << "ngt: Error " << err.what() << endl;
      cerr << usage << endl;
    } catch (...) {
      cerr << "ngt: Error" << endl;
      cerr << usage << endl;
    }

  }

  void
  NGT::Command::remove(Args &args)
  {
    const string usage = "Usage: ngt remove [-d object-ID-type(f|d)] [-m f] index(input) object-ID(input)";
    string database;
    try {
      database = args.get("#1");
    } catch (...) {
      cerr << "ngt: Error: DB is not specified" << endl;
      cerr << usage << endl;
      return;
    }
    try {
      args.get("#2");
    } catch (...) {
      cerr << "ngt: Error: ID is not specified" << endl;
      cerr << usage << endl;
      return;
    }
    char dataType = args.getChar("d", 'f');
    char mode = args.getChar("m", '-');
    bool force = false;
    if (mode == 'f') {
      force = true;
    }
    if (debugLevel >= 1) {
      cerr << "dataType=" << dataType << endl;
    }

    try {
      vector<NGT::ObjectID> objects;
      if (dataType == 'f') {
	string ids;
	try {
	  ids = args.get("#2");
	} catch (...) {
	  cerr << "ngt: Error: Data file is not specified" << endl;
	  cerr << usage << endl;
	  return;
	}
	ifstream is(ids);
	if (!is) {
	  cerr << "ngt: Error: Cannot open the specified file. " << ids << endl;
	  cerr << usage << endl;
	  return;
	}
	string line;
	int count = 0;
	while(getline(is, line)) {
	  count++;
	  vector<string> tokens;
	  NGT::Common::tokenize(line, tokens, "\t ");
	  if (tokens.size() == 0 || tokens[0].size() == 0) {
	    continue;
	  }
	  char *e;
	  size_t id;
	  try {
	    id = strtol(tokens[0].c_str(), &e, 10);
	    objects.push_back(id);
	  } catch (...) {
	    cerr << "Illegal data. " << tokens[0] << endl;
	  }
	  if (*e != 0) {
	    cerr << "Illegal data. " << e << endl;
	  }
	  cerr << "removed ID=" << id << endl;
	}
      } else {
	size_t id = args.getl("#2", 0);
	cerr << "removed ID=" << id << endl;
	objects.push_back(id);
      }
      NGT::Index::remove(database, objects, force);
    } catch (NGT::Exception &err) {
      cerr << "ngt: Error " << err.what() << endl;
      cerr << usage << endl;
    } catch (...) {
      cerr << "ngt: Error" << endl;
      cerr << usage << endl;
    }
  }

  void
  NGT::Command::exportIndex(Args &args)
  {
    const string usage = "Usage: ngt export index(input) export-file(output)";
    string database;
    try {
      database = args.get("#1");
    } catch (...) {
      cerr << "ngt: Error: DB is not specified" << endl;
      cerr << usage << endl;
      return;
    }
    string exportFile;
    try {
      exportFile = args.get("#2");
    } catch (...) {
      cerr << "ngt: Error: ID is not specified" << endl;
      cerr << usage << endl;
      return;
    }
    try {
      NGT::Index::exportIndex(database, exportFile);
    } catch (NGT::Exception &err) {
      cerr << "ngt: Error " << err.what() << endl;
      cerr << usage << endl;
    } catch (...) {
      cerr << "ngt: Error" << endl;
      cerr << usage << endl;
    }
  }

  void
  NGT::Command::importIndex(Args &args)
  {
    const string usage = "Usage: ngt import index(output) import-file(input)";
    string database;
    try {
      database = args.get("#1");
    } catch (...) {
      cerr << "ngt: Error: DB is not specified" << endl;
      cerr << usage << endl;
      return;
    }
    string importFile;
    try {
      importFile = args.get("#2");
    } catch (...) {
      cerr << "ngt: Error: ID is not specified" << endl;
      cerr << usage << endl;
      return;
    }

    try {
      NGT::Index::importIndex(database, importFile);
    } catch (NGT::Exception &err) {
      cerr << "ngt: Error " << err.what() << endl;
      cerr << usage << endl;
    } catch (...) {
      cerr << "ngt: Error" << endl;
      cerr << usage << endl;
    }

  }

  void
  NGT::Command::prune(Args &args)
  {
    const string usage = "Usage: ngt prune -e #-of-forcedly-pruned-edges -s #-of-selecively-pruned-edge index(in/out)";
    string indexName;
    try {
      indexName = args.get("#1");
    } catch (...) {
      cerr << "Index is not specified" << endl;
      cerr << usage << endl;
      return;
    }

    // the number of forcedly pruned edges
    size_t forcedlyPrunedEdgeSize	= args.getl("e", 0);
    // the number of selectively pruned edges
    size_t selectivelyPrunedEdgeSize	= args.getl("s", 0);

    cerr << "forcedly pruned edge size=" << forcedlyPrunedEdgeSize << endl;
    cerr << "selectively pruned edge size=" << selectivelyPrunedEdgeSize << endl;

    if (selectivelyPrunedEdgeSize == 0 && forcedlyPrunedEdgeSize == 0) {
      cerr << "prune: Error! Either of selective edge size or remaining edge size should be specified." << endl;
      cerr << usage << endl;
      return;
    }

    if (forcedlyPrunedEdgeSize != 0 && selectivelyPrunedEdgeSize != 0 && selectivelyPrunedEdgeSize >= forcedlyPrunedEdgeSize) {
      cerr << "prune: Error! selective edge size is less than remaining edge size." << endl;
      cerr << usage << endl;
      return;
    }

    NGT::Index	index(indexName);
    cerr << "loaded the input index." << endl;

    NGT::GraphIndex	&graph = (NGT::GraphIndex&)index.getIndex();

    for (size_t id = 1; id < graph.repository.size(); id++) {
      try {
	NGT::GraphNode &node = *graph.getNode(id);
	if (id % 1000000 == 0) {
	  cerr << "Processed " << id << endl;
	}
	if (forcedlyPrunedEdgeSize > 0 && node.size() >= forcedlyPrunedEdgeSize) {
#ifdef NGT_SHARED_MEMORY_ALLOCATOR
	  node.resize(forcedlyPrunedEdgeSize, graph.repository.allocator);
#else
	  node.resize(forcedlyPrunedEdgeSize);
#endif
	}
	if (selectivelyPrunedEdgeSize > 0 && node.size() >= selectivelyPrunedEdgeSize) {
#ifdef NGT_SHARED_MEMORY_ALLOCATOR
	  cerr << "not implemented" << endl;
	  abort();
#else
	  size_t rank = 0;
	  for (NGT::GraphNode::iterator i = node.begin(); i != node.end(); ++rank) {
	    if (rank >= selectivelyPrunedEdgeSize) {
	      bool found = false;
	      for (size_t t1 = 0; t1 < node.size() && found == false; ++t1) {
		if (t1 >= selectivelyPrunedEdgeSize) {
		  break;
		}
		if (rank == t1) {
		  continue;
		}
		NGT::GraphNode &node2 = *graph.getNode(node[t1].id);
		for (size_t t2 = 0; t2 < node2.size(); ++t2) {
		  if (t2 >= selectivelyPrunedEdgeSize) {
		    break;
		  }
		  if (node2[t2].id == (*i).id) {
		    found = true;
		    break;
		  }
		} // for
	      } // for
	      if (found) {
		//remove
		i = node.erase(i);
		continue;
	      }
	    }
	    i++;
	  } // for
#endif
	}

      } catch(NGT::Exception &err) {
	cerr << "Graph::search: Warning. Cannot get the node. ID=" << id << ":" << err.what() << endl;
	continue;
      }
    }

    graph.saveIndex(indexName);

  }

  void
  NGT::Command::reconstructGraph(Args &args)
  {
    const string usage = "Usage: ngt reconstruct-graph [-m mode] [-P path-adjustment-mode] -o #-of-outgoing-edges -i #-of-incoming(reversed)-edges [-q #-of-queries] [-n #-of-results] [-E minimum-#-of-edges] index(input) index(output)\n"
      "\t-m mode\n"
      "\t\ts: Edge adjustment.\n"
      "\t\tS: Edge adjustment and path adjustment. (default)\n"
      "\t\tc: Edge adjustment with the constraint.\n"
      "\t\tC: Edge adjustment with the constraint and path adjustment.\n"
      "\t\tP: Path adjustment.\n"
      "\t-P path-adjustment-mode\n"
      "\t\ta: Advanced method. High-speed. Not guarantee the paper's method. (default)\n"
      "\t\tothers: Slow and less memory usage, but guarantee the paper's method.\n";

    string inIndexPath;
    try {
      inIndexPath = args.get("#1");
    } catch (...) {
      cerr << "ngt::reconstructGraph: Input index is not specified." << endl;
      cerr << usage << endl;
      return;
    }
    string outIndexPath;
    try {
      outIndexPath = args.get("#2");
    } catch (...) {
      cerr << "ngt::reconstructGraph: Output index is not specified." << endl;
      cerr << usage << endl;
      return;
    }

    char mode = args.getChar("m", 'S');
    size_t nOfQueries = args.getl("q", 100);		// # of query objects
    size_t nOfResults = args.getl("n", 20);		// # of resultant objects
    double gtEpsilon = args.getf("e", 0.1);
    double margin = args.getf("M", 0.2);
    char smode = args.getChar("s", '-');

    // the number (rank) of original edges
    int numOfOutgoingEdges	= args.getl("o", -1);
    // the number (rank) of reverse edges
    int numOfIncomingEdges		= args.getl("i", -1);

    NGT::GraphOptimizer graphOptimizer(false);

    if (mode == 'P') {
      numOfOutgoingEdges = 0;
      numOfIncomingEdges = 0;
      std::cerr << "ngt::reconstructGraph: Warning. \'-m P\' and not zero for # of in/out edges are specified at the same time." << std::endl;
    }
    graphOptimizer.shortcutReduction = (mode == 'S' || mode == 'C' || mode == 'P') ? true : false;
    graphOptimizer.searchParameterOptimization = (smode == '-' || smode == 's') ? true : false;
    graphOptimizer.prefetchParameterOptimization = (smode == '-' || smode == 'p') ? true : false;
    graphOptimizer.accuracyTableGeneration = (smode == '-' || smode == 'a') ? true : false;
    graphOptimizer.margin = margin;
    graphOptimizer.gtEpsilon = gtEpsilon;
    graphOptimizer.minNumOfEdges = args.getl("E", 0);

    graphOptimizer.set(numOfOutgoingEdges, numOfIncomingEdges, nOfQueries, nOfResults);
    graphOptimizer.execute(inIndexPath, outIndexPath);

    std::cout << "Successfully completed." << std::endl;
  }

  void
  NGT::Command::optimizeSearchParameters(Args &args)
  {
    const string usage = "Usage: ngt optimize-search-parameters [-m optimization-target(s|p|a)] [-q #-of-queries] [-n #-of-results] index\n"
      "\t-m mode\n"
      "\t\ts: optimize search parameters (the number of explored edges).\n"
      "\t\tp: optimize prefetch parameters.\n"
      "\t\ta: generate an accuracy table to specify an expected accuracy instead of an epsilon for search.\n";

    string indexPath;
    try {
      indexPath = args.get("#1");
    } catch (...) {
      cerr << "Index is not specified" << endl;
      cerr << usage << endl;
      return;
    }

    char mode = args.getChar("m", '-');

    size_t nOfQueries = args.getl("q", 100);		// # of query objects
    size_t nOfResults = args.getl("n", 20);		// # of resultant objects

    try {
      NGT::GraphOptimizer graphOptimizer(false);

      graphOptimizer.searchParameterOptimization = (mode == '-' || mode == 's') ? true : false;
      graphOptimizer.prefetchParameterOptimization = (mode == '-' || mode == 'p') ? true : false;
      graphOptimizer.accuracyTableGeneration = (mode == '-' || mode == 'a') ? true : false;
      graphOptimizer.numOfQueries = nOfQueries;
      graphOptimizer.numOfResults = nOfResults;

      graphOptimizer.set(0, 0, nOfQueries, nOfResults);
      graphOptimizer.optimizeSearchParameters(indexPath);

      std::cout << "Successfully completed." << std::endl;
    } catch (NGT::Exception &err) {
      cerr << "ngt: Error " << err.what() << endl;
      cerr << usage << endl;
    }

  }

  void
  NGT::Command::refineANNG(Args &args)
  {
#if defined(NGT_SHARED_MEMORY_ALLOCATOR)
    std::cerr << "refineANNG. Not implemented." << std::endl;
    abort();
#else
    const string usage = "Usage: ngt refine-anng [-e epsilon] [-a expected-accuracy] anng-index refined-anng-index";

    string inIndexPath;
    try {
      inIndexPath = args.get("#1");
    } catch (...) {
      cerr << "Input index is not specified" << endl;
      cerr << usage << endl;
      return;
    }

    string outIndexPath;
    try {
      outIndexPath = args.get("#2");
    } catch (...) {
      cerr << "Output index is not specified" << endl;
      cerr << usage << endl;
      return;
    }

    NGT::Index	index(inIndexPath);

    float  epsilon		= args.getf("e", 0.1);
    float  expectedAccuracy	= args.getf("a", 0.0);
    int    noOfEdges		= args.getl("k", 0);	// to reconstruct kNNG
    int    exploreEdgeSize	= args.getf("E", INT_MIN);
    size_t batchSize		= args.getl("b", 10000);

    try {
      GraphReconstructor::refineANNG(index, epsilon, expectedAccuracy, noOfEdges, exploreEdgeSize, batchSize);
    } catch (NGT::Exception &err) {
      std::cerr << "Error!! Cannot refine the index. " << err.what() << std::endl;
      return;
    }
    index.saveIndex(outIndexPath);
#endif
  }

  void
  NGT::Command::repair(Args &args)
  {
    const string usage = "Usage: ng[ [-m c|r|R] repair index \n"
      "\t-m mode\n"
      "\t\tc: Check. (default)\n"
      "\t\tr: Repair and save it as [index].repair.\n"
      "\t\tR: Repair and overwrite into the specified index.\n";

    string indexPath;
    try {
      indexPath = args.get("#1");
    } catch (...) {
      cerr << "Index is not specified" << endl;
      cerr << usage << endl;
      return;
    }

    char mode = args.getChar("m", 'c');

    bool repair = false;
    if (mode == 'r' || mode == 'R') {
      repair = true;
    }
    string path = indexPath;
    if (mode == 'r') {
      path = indexPath + ".repair";
      const string com = "cp -r " + indexPath + " " + path;
      int stat = system(com.c_str());
      if (stat != 0) {
	std::cerr << "ngt::repair: Cannot create the specified index. " << path << std::endl;
	cerr << usage << endl;
	return;
      }
    }

    NGT::Index	index(path);

    NGT::ObjectRepository &objectRepository = index.getObjectSpace().getRepository();
    NGT::GraphIndex &graphIndex = static_cast<GraphIndex&>(index.getIndex());
    NGT::GraphAndTreeIndex &graphAndTreeIndex = static_cast<GraphAndTreeIndex&>(index.getIndex());
    size_t objSize = objectRepository.size();
    std::cerr << "aggregate removed objects from the repository." << std::endl;
    std::set<ObjectID> removedIDs;
    for (ObjectID id = 1; id < objSize; id++) {
      if (objectRepository.isEmpty(id)) {
	removedIDs.insert(id);
      }
    }

    std::cerr << "aggregate objects from the tree." << std::endl;
    std::set<ObjectID> ids;
    graphAndTreeIndex.DVPTree::getAllObjectIDs(ids);
    size_t idsSize = ids.size() == 0 ? 0 : (*ids.rbegin()) + 1;
    if (objSize < idsSize) {
      std::cerr << "The sizes of the repository and tree are inconsistent. " << objSize << ":" << idsSize << std::endl;
    }
    size_t invalidTreeObjectCount = 0;
    size_t uninsertedTreeObjectCount = 0;
    std::cerr << "remove invalid objects from the tree." << std::endl;
    size_t size = objSize > idsSize ? objSize : idsSize;
    for (size_t id = 1; id < size; id++) {
      if (ids.find(id) != ids.end()) {
	if (removedIDs.find(id) != removedIDs.end() || id >= objSize) {
	  if (repair) {
	    graphAndTreeIndex.DVPTree::removeNaively(id);
	    std::cerr << "Found the removed object in the tree. Removed it from the tree. " << id << std::endl;
	  } else {
	    std::cerr << "Found the removed object in the tree. " << id << std::endl;
	  }
	  invalidTreeObjectCount++;
	}
      } else {
	if (removedIDs.find(id) == removedIDs.end() && id < objSize) {
          std::cerr << "Not found an object in the tree. However, it might be a duplicated object. " << id << std::endl;
	  uninsertedTreeObjectCount++;
	  if (repair) {
	    try {
	      graphIndex.repository.remove(id);
	    } catch(...) {}
	  }
	}
      }
    }

    if (objSize != graphIndex.repository.size()) {
      std::cerr << "The sizes of the repository and graph are inconsistent. " << objSize << ":" << graphIndex.repository.size() << std::endl;
    }
    size_t invalidGraphObjectCount = 0;
    size_t uninsertedGraphObjectCount = 0;
    size = objSize > graphIndex.repository.size() ? objSize : graphIndex.repository.size();
    std::cerr << "remove invalid objects from the graph." << std::endl;
    for (size_t id = 1; id < size; id++) {
      try {
	graphIndex.getNode(id);
	if (removedIDs.find(id) != removedIDs.end() || id >= objSize) {
	  if (repair) {
	    graphAndTreeIndex.DVPTree::removeNaively(id);
	    try {
	      graphIndex.repository.remove(id);
	    } catch(...) {}
	    std::cerr << "Found the removed object in the graph. Removed it from the graph. " << id << std::endl;
	  } else {
	    std::cerr << "Found the removed object in the graph. " << id << std::endl;
	  }
	  invalidGraphObjectCount++;
	}
      } catch(NGT::Exception &err) {
        if (removedIDs.find(id) == removedIDs.end() && id < objSize) {
          std::cerr << "Not found an object in the graph. It should be inserted into the graph. " << err.what() << " ID=" << id << std::endl;
	  uninsertedGraphObjectCount++;
	  if (repair) {
	    try {
	      graphAndTreeIndex.DVPTree::removeNaively(id);
	    } catch(...) {}
	  }
	}
      } catch(...) {
	std::cerr << "Unexpected error!" << std::endl;
      }
    }

    size_t invalidEdgeCount = 0;
//#pragma omp parallel for
    for (size_t id = 1; id < graphIndex.repository.size(); id++) {
      try {
        NGT::GraphNode &node = *graphIndex.getNode(id);
#if defined(NGT_SHARED_MEMORY_ALLOCATOR)
	for (auto n = node.begin(graphIndex.repository.allocator); n != node.end(graphIndex.repository.allocator);) {
#else
	for (auto n = node.begin(); n != node.end();) {
#endif
	  if (removedIDs.find((*n).id) != removedIDs.end() || (*n).id >= objSize) {

	    std::cerr << "Not found the destination object of the edge. " << id << ":" << (*n).id << std::endl;
	    invalidEdgeCount++;
            if (repair) {
#if defined(NGT_SHARED_MEMORY_ALLOCATOR)
	      n = node.erase(n, graphIndex.repository.allocator);
#else
	      n = node.erase(n);
#endif
	      continue;
	    }
	  }
	  ++n;
	}
      } catch(...) {}
    }

    if (repair) {
      if (objSize < graphIndex.repository.size()) {
	graphIndex.repository.resize(objSize);
      }
    }

    std::cerr << "The number of invalid tree objects=" << invalidTreeObjectCount << std::endl;
    std::cerr << "The number of invalid graph objects=" << invalidGraphObjectCount << std::endl;
    std::cerr << "The number of uninserted tree objects (Can be ignored)=" << uninsertedTreeObjectCount << std::endl;
    std::cerr << "The number of uninserted graph objects=" << uninsertedGraphObjectCount << std::endl;
    std::cerr << "The number of invalid edges=" << invalidEdgeCount << std::endl;

    if (repair) {
      try {
	if (uninsertedGraphObjectCount > 0) {
	  std::cerr << "Building index." << std::endl;
	  index.createIndex(16);
	}
	std::cerr << "Saving index." << std::endl;
	index.saveIndex(path);
      } catch (NGT::Exception &err) {
	cerr << "ngt: Error " << err.what() << endl;
	cerr << usage << endl;
	return;
      }
    }
  }

  void
  NGT::Command::optimizeNumberOfEdgesForANNG(Args &args)
  {
    const string usage = "Usage: ngt optimize-#-of-edges [-q #-of-queries] [-k #-of-retrieved-objects] "
      "[-p #-of-threads] [-a target-accuracy] [-o target-#-of-objects] [-s #-of-sampe-objects] "
      "[-e maximum-#-of-edges] anng-index";

    string indexPath;
    try {
      indexPath = args.get("#1");
    } catch (...) {
      cerr << "Index is not specified" << endl;
      cerr << usage << endl;
      return;
    }

    GraphOptimizer::ANNGEdgeOptimizationParameter parameter;

    parameter.noOfQueries	= args.getl("q", 200);
    parameter.noOfResults	= args.getl("k", 50);
    parameter.noOfThreads	= args.getl("p", 16);
    parameter.targetAccuracy	= args.getf("a", 0.9);
    parameter.targetNoOfObjects	= args.getl("o", 0);	// zero will replaced # of the repository size.
    parameter.noOfSampleObjects	= args.getl("s", 100000);
    parameter.maxNoOfEdges	= args.getl("e", 100);

    NGT::GraphOptimizer graphOptimizer(false); // false=log
    auto optimizedEdge = graphOptimizer.optimizeNumberOfEdgesForANNG(indexPath, parameter);
    std::cout << "The optimized # of edges=" << optimizedEdge.first << "(" << optimizedEdge.second << ")" << std::endl;
    std::cout << "Successfully completed." << std::endl;
  }

  void
  NGT::Command::info(Args &args)
  {
    const string usage = "Usage: ngt info [-E #-of-edges] [-m h|e] index";

    std::cout << "NGT version: " << NGT::Index::getVersion() << std::endl;
    std::cout << "CPU SIMD types: ";
    CpuInfo::showSimdTypes();

    string database;
    try {
      database = args.get("#1");
    } catch (...) {
      cerr << "ngt: Error: DB is not specified" << endl;
      cerr << usage << endl;
      return;
    }

    size_t edgeSize = args.getl("E", UINT_MAX);
    char mode = args.getChar("m", '-');

    try {
      NGT::Index	index(database);
      NGT::GraphIndex::showStatisticsOfGraph(static_cast<NGT::GraphIndex&>(index.getIndex()), mode, edgeSize);
      if (mode == 'v') {
	vector<uint8_t> status;
	index.verify(status);
      }
    } catch (NGT::Exception &err) {
      cerr << "ngt: Error " << err.what() << endl;
      cerr << usage << endl;
    } catch (...) {
      cerr << "ngt: Error" << endl;
      cerr << usage << endl;
    }
  }

  void NGT::Command::exportGraph(Args &args) {
#if defined(NGT_SHARED_MEMORY_ALLOCATOR)
    std::cerr << "ngt: Error: exportGraph is not implemented." << std::endl;
    abort();
#else
    std::string usage = "ngt export-graph [-k #-of-edges] index";
    string indexPath;
    try {
      indexPath = args.get("#1");
    } catch (...) {
      cerr << "ngt::exportGraph: Index is not specified." << endl;
      cerr << usage << endl;
      return;
    }

    int k = args.getl("k", 0);

    NGT::Index		index(indexPath);
    NGT::GraphIndex	&graph = static_cast<NGT::GraphIndex&>(index.getIndex());

    size_t size = index.getObjectRepositorySize();

    for (size_t id = 1; id < size; ++id) {
      NGT::GraphNode *node = 0;
      try {
	node = graph.getNode(id);
      } catch(...) {
	continue;
      }
      std::cout << id << "\t";
      for (auto ei = (*node).begin(); ei != (*node).end(); ++ei) {
	if (k != 0 && k <= distance((*node).begin(), ei)) {
	  break;
	}
	std::cout << (*ei).id << "\t" << (*ei).distance;
	if (ei + 1 != (*node).end()) {
	  std::cout << "\t";
	}
      }
      std::cout << std::endl;
    }
#endif
  }

  void NGT::Command::exportObjects(Args &args) {
#if defined(NGT_SHARED_MEMORY_ALLOCATOR)
    std::cerr << "ngt: Error: exportObjects is not implemented." << std::endl;
    abort();
#else
    std::string usage = "ngt export-objects index";
    string indexPath;
    try {
      indexPath = args.get("#1");
    } catch (...) {
      cerr << "ngt::exportGraph: Index is not specified." << endl;
      cerr << usage << endl;
      return;
    }

    NGT::Index		index(indexPath);
    auto &objectSpace = index.getObjectSpace();
    size_t size = objectSpace.getRepository().size();

    for (size_t id = 1; id < size; ++id) {
      std::vector<float> object;
      objectSpace.getObject(id, object);
      for (auto v = object.begin(); v != object.end(); ++v) {
	std::cout << *v;
	if (v + 1 != object.end()) {
	  std::cout << "\t";
	}
      }
      std::cout << std::endl;
    }
#endif
  }

redpajama_set_name: RedPajamaGithub


Author's note : This show is cursed. It was supposed to air last week, and didn't, and then the mix broke DMR and it required some manual intervention to run to completion.
In The Evening is a Year Old! Thank you all for listening, and supporting both the show and Dark Mother Radio for hosting the show every week. In honor of this, I'm opening this week with the most Brutal birthday song ever, and following that with the usual mix of metal, electronica, goth, and more. I close with Thank You by The Creatures, because that's what I want to say to everyone every week for listening. But I can't, because you'd get really tired of that song if I ran it every week. Hope you like it, and see you next week!
This entry was posted in Dark Mother Media, In The Evening. Bookmark the permalink.


text:
Home Control Center Local Legends
These are the stories of local personalities – musicians, chefs, street performers, entrepreneurs, bartenders, etc. – who reveal insider information about destinations across the U.S. With a finger soundly on the pulse of their hometown, each "local legend" reflects on their town and what makes it special.
SEARCH THE CONTROL CENTER
Explore Brooklyn with a Local Legend
Join entrepreneur and wine connoisseur André Hueston Mack on a tour of his favorite places in Brooklyn, New York, including Little Mo Wine, the Brooklyn Museum, Blue Marble Ice Cre...
Join entrepreneur and wine connoisseur André Hueston Mack on a tour of his favorite places in Brooklyn, New York, including Little Mo Wine, the Brooklyn Museum, Blue Marble Ice Cream, Franny's Pizza and Grand Army Plaza.
Visit Music City with Bridgette Tatum
Discover Nashville's best-kept secrets with singer-songwriter Bridgette Tatum, including T...
Discover Nashville's best-kept secrets with singer-songwriter Bridgette Tatum, including Two Old Hippies, Betty Boots, and Belcourt Taps.
Best Places to Visit in San Francisco
Join Tom Wolfe, America's first concierge, as he tours San Francisco's best-kept secrets i...
Join Tom Wolfe, America's first concierge, as he tours San Francisco's best-kept secrets including John's Grill, the Vallejo Street Stairs, North Beach Restaurant and the Buena Vista Café.
EHI Standard Tags
Seeing Seattle Through a Local's Eyes Local Legends / 01.17.2017
Experience a different side of the Emerald City with Joel Michelson, chief mate of the Washington State Ferry System. Michelson highlights some of his favorite places in Seattle, i...
Experience a different side of the Emerald City with Joel Michelson, chief mate of the Washington State Ferry System. Michelson highlights some of his favorite places in Seattle, including Bainbridge Island, Classic Cycle, Uli's Famous Sausage, the Fremont neighborhood and the Fremont Troll.
A Chicago Travel Guide by a Local Legend Local Legends / 01.13.2017
Entrepreneur Billy Dec showcases his favorite places in Chicago, including the Lookingglass Theatre, Optimo Hats and the Green Mill Restaurant.
Explore the World of Minnesota Golf Local Legends / 01.12.2017
Legendary pro-golfer Tom Lehman discusses his passion for golf and his favorite courses to play in Minnesota, including Interlachen Country Club, Windsong Farm Golf Club, Troy Burn...
Legendary pro-golfer Tom Lehman discusses his passion for golf and his favorite courses to play in Minnesota, including Interlachen Country Club, Windsong Farm Golf Club, Troy Burne Golf Course, Alexandria Golf Club and Hazeltine National Golf Club.
Austin Local Legend Denise Quintanilla Local Legends / 01.12.2017
"Rockstar" magazine editor Denise Quintanilla gives a tour of her favorite places in Austin, including La Barbecue, Waterloo Records, The White Horse and Blue Starlite Mini Urban D...
"Rockstar" magazine editor Denise Quintanilla gives a tour of her favorite places in Austin, including La Barbecue, Waterloo Records, The White Horse and Blue Starlite Mini Urban Drive-In.
Los Angeles Local Legend Amy Rhodes Local Legends / 01.12.2017
Discover Los Angeles' best-kept secrets with Emmy-winning writer, producer and performer, Amy Rhodes, including the Upright Citizens Brigade Theater, The Last Bookstore and The Cas...
Discover Los Angeles' best-kept secrets with Emmy-winning writer, producer and performer, Amy Rhodes, including the Upright Citizens Brigade Theater, The Last Bookstore and The Castaway Restaurant.
Best Local Places to Visit in Denver Local Legends / 01.12.2017
Join Tariana Navas-Nieves, director of cultural affairs for Denver Arts & Venues, as she tours some of Denver's most remarkable attractions, including The ART – A Hotel, The Source...
Join Tariana Navas-Nieves, director of cultural affairs for Denver Arts & Venues, as she tours some of Denver's most remarkable attractions, including The ART – A Hotel, The Source artisan food market, The Cherry Creek Trail, and Red Rocks Amphitheatre.
Freeways to Fairways
Learn about the world's top golf courses, resorts and amateur golf destinations from The G...
Learn about the world's top golf courses, resorts and amateur golf destinations from The Golf Channel's travel insider Matt Ginella.
Michelle Kwan, Ginni Rometty and other trailblazing women share empowering words of wisdom...
Michelle Kwan, Ginni Rometty and other trailblazing women share empowering words of wisdom during the 2017 KPMG Women's Leadership Summit.
Road warriors, travel experts and lifestyle aficionados share insights on making the most ...
Road warriors, travel experts and lifestyle aficionados share insights on making the most of your next business trip. Get the inside scoop on airports, destinations, enjoying your down time and more.
Entrepreneurs and business professionals write to their younger selves to share advice and...
Entrepreneurs and business professionals write to their younger selves to share advice and lessons they've learned now that they've "made it."
Tech expert Andru Edwards demos the latest gadgets for business pros, and National Emerald...
Tech expert Andru Edwards demos the latest gadgets for business pros, and National Emerald Club members share how these products bring Speed, Choice and Control to their lives.

redpajama_set_name: RedPajamaCommonCrawl


Below are some of the many ways individuals can extend support to the Foundation. To make a gift or a pledge online today, click here. For more information, please contact Pat Ingram, Director of Development.
The Jefferson Scholars Foundation offers its benefactors the opportunity to name Scholarships, Fellowships, and Professorships. A named Jefferson Scholarship or Jefferson Graduate Fellowship may be created with gifts totaling $500,000. Darden Fellowships have a naming level of $1,000,000. The naming level for Professorships is $5,000,000.
Many of the Foundation's benefactors have extended pledges over several years knowing that it will take time for them to achieve their goal. Others have family and friends contribute to their fund with the hopes that over a period of time and with a certain number of commitments, they get their Scholarship, Fellowship or Professorship fully funded. Benefactors who are interested in this type of long-term investment receive status reports on their giving each year and are invited to many of the Foundation's student-donor events throughout the year. For more information, please contact Pat Ingram, Director of Development.
Not all of the Foundation's supporters are in a position to name an endowed Jefferson Scholarship, Fellowship or Professorship. The Foundation invites these donors to make a one-time or a recurring gift to the Foundation at a level that suits their financial situation best. All gifts, no matter the size, are invested in the Foundation's endowment. That means that all gifts have a lasting impact on the Foundation. They can be made at any size, they can be unrestricted, they can be restricted to a particular program (i.e. Jefferson Scholars Program or the Jefferson Fellows Program) or they can be restricted to support one of the Foundation's 62 regions. To make a gift or pledge online, click here. For more information, please contact Pat Ingram, Director of Development.
Planned gifts are often used as part of an overall strategy to meet an individual's particular financial, philanthropic, and estate planning needs. From bequests and life insurance policies to gift annuities and charitable remainder trusts, there are multiple ways to extend support to the Jefferson Scholars Foundation while retaining personal financial benefits. To discuss options that are right for you and your family or for more information, please contact Kevin Murray, Director of Gift Planning.


text:
export interface IPat {
    id: number;
    secret: string;
    description: string;
    userId: number;
    expiresAt?: Date;
    createdAt?: Date;
    seenAt?: Date;
}

export default class Pat implements IPat {
    id: number;

    secret: string;

    description: string;

    userId: number;

    expiresAt: Date;

    seenAt: Date;

    createdAt: Date;

    constructor({
        id,
        userId,
        expiresAt,
        seenAt,
        createdAt,
        secret,
        description,
    }: IPat) {
        this.id = id;
        this.secret = secret;
        this.userId = userId;
        this.expiresAt = expiresAt;
        this.seenAt = seenAt;
        this.createdAt = createdAt;
        this.description = description;
    }
}


text:
Privacy Piolicy
Broadimage/Shutterstock
Pro Dancer Jenna Johnson Is Earning Big Bucks on 'DWTS'! See Her Massive Net Worth
Nov 22, 2021 11:04 am·
By Samantha Agate
Get to Know Betty White's 3 Stepkids With Late Husband Allen Ludden
His Own Airport! Take a Tour of John Travolta's Florida Estate
McDreamy Dad! Get to Know 'Grey's' Star Patrick Dempsey's 3 Children
HGTV's Hilary Farr Loves Her Toronto Home! Take a Tour
Forever Home! Tour Tarek El Moussa and Heather Rae Young's Gorgeous House
Jenna Johnson has remained one of the most popular pro dancers on Dancing with the Stars since she became a member of the troupe in season 18. The five-time U.S. National Latin Champion got her start in the talent show circuit on So You Think You Can Dance. She has since worked her way up to becoming the queen of the ballroom, earning a staggering net worth in the process.
Jenna has an estimated net worth of $7 million, according to Celebnetworth.net. Growing up in Utah, Jenna was inspired by watching her two older sisters pursue dance. At the age of 3, she decided she wanted to be a performer and had her sights set on some of the world's biggest stages. The dance maven trained in all styles before auditioning for So You Think You Can Dance at the age of 18 in 2013.
"At a young age, I knew I wanted dance to be what I did forever," she told Darling in March 2020. "SYTYCD was the first time I performed on camera. I absolutely loved it. It was the 'aha' or epiphany moment that I want to be on camera."
RINGO CHIU/EPA-EFE/Shutterstock
Jenna was one of the final eight dancers left standing before she was eliminated from the show, just missing out on the $125,000 prize. It didn't take long for her to find a new home on television. She joined the roster for Dancing with the Stars in 2014 as a background dancer. Even in the background, Jenna still stole the show.
See 'DWTS' Pro Sharna Burgess' Impressive Net Worth
In season 23, the brunette beauty was promoted to pro status and was partnered with actor Jake T. Austin. Though they were the first couple eliminated from the competition, Jenna proved that she was a force in the ballroom with intricate choreography and an infectious personality. The So You Think You Can Dance producers kept an eye on her newfound success on ABC. She was brought back to mentor the contestants on So You Think You Can Dance: The Next Generation in 2016.
Jenna also joined season 14 of So You Think You Can Dance as an all-star in 2017. She finished in fourth place with her partner, Kiki Nyemchek. She headed back to Dancing with the Stars for season 26 in 2018. This time, Jenna was determined to win. She did just that with Olympic figure skater Adam Rippon, bringing home the Mirrorball Trophy for the first time ever and a hefty paycheck. It was the true underdog story after being eliminated first in her first season as a pro.
A Timeline of Jenna Johnson and Husband Val Chmerkovskiy's Romance
Jenna came close to winning the show again in season 29 with Nev Schulman. Ultimately, they finished in second place. For the 2021 season of Dancing with the Stars, it was announced that Jenna would be competing in the show's first same-sex pair with JoJo Siwa. They became top contenders right away with their synchronization and connection.
Jenna not only found a successful career on Dancing with the Stars, but she also got love out of the deal. She met her husband and fellow pro dancer, Valentin Chmerkovskiy, when she first joined the show in 2014. The couple tied the knot in 2019. Val also has an estimated $7 million net worth of his own.
Jenna Johnson
'Fun Grandma' Marie Osmond Loves 'Spoiling' Her Grandkids
closer Exclusives!
Inside Susan Lucci's Diet and Exercise Routine at 75
Actress Melissa Leo Says Winning Oscar Created New 'Expectations'
Inside Burt Ward's 'Unusual' Relationship With Wife Tracy Posner
Ricky Nelson Balanced 'Difficult' Singing and Television Career
Find Out Marie Osmond's No. 1 Weight Loss Tip After Dropping 50 Pounds
M*A*S*H's Loretta Swit Recalls When She Knew She 'Made It' as an Actress
Former 'Today' Host Kathie Lee Gifford: Becoming a Grandma Is a 'Blessing'
Inside Duchess Kate's 'Modest' Plans for Her 40th Birthday
Closer Weekly logo
Closer Weekly has affiliate partnerships so we may receive compensation for some links to products and services.
Closer Weekly is part of the A360 Media Entertainment Group.
Closer Weekly


The appealing photo below, is other parts of Piercing Gauge Chart write-up which is listed within General Chart, septum piercing gauge size chart, body piercing needle gauge chart, labret piercing gauge chart and published at October 6th, 2018 11:50:39 AM by millerstreefarm.
Here is required recommendation on piercing gauge chart actual size. We have the prime method for piercing gauge chart actual size. Check it out for yourself! You can discover Piercing Gauge Chart Piercing Gauge Chart Beautiful Ear Piercing Types And Styles Things Throughout guide and look the latest Piercing Gauge Chart in here.


Rayne and Matt were married @ St. Joseph's Church in Baton Rouge, LA. What an amazing night!!! Rayne looked flawless in her dress:) Enough to make a grown man cry. You'll see. The reception was held at DeLaronde Hall. A nice open space to get down. The cake was awesome, friends and family were tearing up the dance floor, and Rayne and Matt had the best night ever!! Congrats to the newlyweds. May your days be blessed with love and happiness!!


"I just wanted to thank you for making your clock plans available. . . . I decided to attempt my first wooden clock. I was very much taken with the elegance of your Tranquilty clock and a deciding factor between different designs was that it would run for 24 Hours plus on a single 'wind'. . . . Thanks to your design the clock went together easily, adjustment of pallet entry was simple and the clock was adjusted to come 'on beat' very quickly. . . .The clock has been running beautifully for a few weeks now. How appropriate that you named the design Tranquility for this clock does not 'tick tock' but just makes the gentlest of sounds as the pallets return to their stops. I had great fun building it and hoped that I would end up with an elegant piece of kinetic art. That has happened, and it is difficult to pass by it in the hall without stopping for a moment to watch the grasshopper motion, but I confess that I was not expecting it to keep time so accurately. As mentioned on the video clip it is currently within a minute over a 24 hour period!"
"Got the spool parts and I thank you for the wonderful customer service you have provided me. The old spool that I glued back together has been working great and the clock has ran with no issues for 3 days and is keeping time very well. What an amazing clock. I'm gonna be sad giving it away as it was meant for a X-Mass gift. I feel like I've created a relationship with this clock. 🙂 Anyhow thanks for everything and I'm sure I'll be ordering another here soon. "


Solar power is the energy of the future – more and more people are switching to this clean, green source of energy but there are still a lot of myths around the technology so let's clear them up.
We're not famed for our tropical weather in the UK, it's true. But did you know that solar panels need light to work, not necessarily sunshine. They are more effective on a clear sunny day, for sure, but they still produce electricity and save you money, even on cloudy days.
It's true that solar PV systems only generate electricity during daylight, but storage technology like batteries allow you to store spare power generated during the day and use it at night, ensuring you get the benefit of your solar panels for longer - you can even use it to power your electric vehicle.
We all know that we need to become more environmentally friendly and solar is a great way to do your bit. The more people who have solar panels on their homes, the bigger difference it makes to the UK's overall carbon emissions. Using solar means you rely less on the old oil and gas emissions that are causing climate change, and with solar and battery solutions you can generate renewable power for your home and the grid.
Solar power has been around for decades, and the costs have come down in recent years. Experts at the International Renewable Energy Agency say that the price of solar electricity has fallen by almost three quarters since 2010 and it is set to fall by another 50% by 2020. Solar power is here to stay, we know it works and the sooner you install it, the sooner you start saving.
Many experts believe that solar panels add value to homes because they reduce your electricity bills and the amount of energy you use, making your house greener despite estate agents saying solar panels make no difference to the value of your home. Given that people are becoming increasingly concerned about the environment as well as their energy bills, solar panels are likely to be a selling point, not a sticking point, in future.
From Shanghai to Sao Paolo, from Bangalore to Bogota, solar panels are being installed all over the world at record rates. So, while we're doing our bit to cut emissions in the UK, you can be sure that the same is happening in other countries. And the huge growth in the solar market around the globe is a strong response to the threat of climate change as laid out in the Paris Climate Agreement.
Solar panels work great on houses, but if you run a business and you've got the space, then they will work just as well for you. Indeed, many companies will have more space than the average home, either on their roof or on other land where they can install solar PV systems, and within their premises to install battery packs. So, they may be able to make bigger savings while also giving back to their community.
Homeowners in certain regions can now visit eon-solar.co.uk to use Google's Project Sunroof to learn about the solar potential for their home. The tool not only calculates potential cost savings quickly, it also allows people to sign up and begin their solar panel installation process.
Now that the truth of solar and battery solutions have been resolved, find out how E.ON can help you harness the power of solar energy.


After 18 months of harassment it looks like ADR might be working for me as you suggested. They have indicated no penalties, no previous years and that I might owe the grand total of £340 plus interest. Thanks again for the book and your help!
Thanks chaps, I honestly don't know what I'd have done without you!
What could have been quite complicated was sorted out with a small fine for being 'careless'.
I had yet another of those brown HMRC envelopes today and braced myself for the worst. But guess what – they found that the penalty should be cancelled! I'm still quite stunned by it, somehow I didn't believe that they would rule against their own officers, however inept and unfair they are. Thank you so much for all your help on this.
I received a letter from Ms W yesterday afternoon saying that she has closed the compliance check into my tax affairs! I am so grateful to you - as without your kindness, endless patience and professional expertise this outcome would not have been achieved and could have potentially dragged on for years if I had been unrepresented. Thanks to your help it seems common sense has prevailed.
Without the help of Tax-Hell I would not have been able to achieve the outcome I desired. In fact the eventual result was actually far better than I anything I could have imagined.
This is a huge relief for me. I am so grateful for your time and attention in dealing with this.
I found the Tax Hell ebook easy to read and very informative. I will definitely recommend the book and the website to clients.
Informative for tax professionals and the unrepresented alike – a great read.
Nick says a lot of things in the ebooks that many accountants and tax advisers would probably like to say to the Revenue just before they retired from the profession!
The investigation system is weighted against the unrepresented taxpayer. This book does a great job in explaining the pitfalls.
A good and easy to read guide for anyone caught up in an HMRC tax investigation. A must read for any Self Assessment taxpayer.
Great Book!! I wish I'd known this information 6 years, 4 tax Inspectors and 2 Commissioners' hearings ago!
Brilliant guide. Clear and is to the point, precisely what you need when you are pulling your hair out! Highly recommended!
In late 2011 I received a startling phone call at my place of work from HMRC, claiming that I owed them £17,000 in unpaid taxes. I downloaded Everything you wanted to know about Tax Investigation. It was clear, concise and incredibly helpful. Today HMRC have dropped their case. Needless to say, I'm thrilled to put this whole affair behind me.
Penalties is a very handy companion to the Everything You Wanted to Know book.
Thank you! Very easy to read, unlike most things tax related!
I bought a copy of your book about 5 years ago, best money I ever spent, armed with that and a good accountant I was able to dodge the HMRC bullet. HMRC wanted to go back 43 years – I kid you not - they went into my dead mother and fathers accounts my wife's accounts and also my dead mother and father in-laws accounts.On and on. They had every intention of bankrupting me. Thanks to your book they could not do it. The end result? They gave up and went away with nothing.


text:
Closed petition Save Pigeon Racing - Seek to reinstate racing from Europe
During Brexit negotiations, it would seem that this approval has been overlooked. My plea is for the Secretary of State for Defra to negotiate special dispensation from the EU to accept pigeons as a temporary import, in order for Pigeon Racing to continue from France/EU and support our communities.
For over 120 years the National Flying Club and other organisations have organised races in which the whole nation can come together. Friends and families prepare their birds to compete in the most prestigious races from France in the knowledge that it is the most unbiased route into Great Britain. For most of those years we have enjoyed unfettered access by our friends and neighbours in France for our convoys of Racing Pigeons to be liberated, to fly directly to their home lofts.
Date closed 1 January 2022


text:
package org.apereo.cas.support.oauth.web.endpoints;

import org.apereo.cas.support.oauth.OAuth20Constants;
import org.apereo.cas.ticket.InvalidTicketException;
import org.apereo.cas.ticket.device.OAuth20DeviceUserCode;
import org.apereo.cas.util.LoggingUtils;

import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * This is {@link OAuth20DeviceUserCodeApprovalEndpointController}.
 *
 * @author Misagh Moayyed
 * @since 6.0.0
 */
@Slf4j
public class OAuth20DeviceUserCodeApprovalEndpointController extends BaseOAuth20Controller {
    /**
     * User code parameter name.
     */
    public static final String PARAMETER_USER_CODE = "usercode";

    public OAuth20DeviceUserCodeApprovalEndpointController(final OAuth20ConfigurationContext oAuthConfigurationContext) {
        super(oAuthConfigurationContext);
    }

    /**
     * Handle request internal model and view.
     *
     * @param request  the request
     * @param response the response
     * @return the model and view
     */
    @GetMapping(path = OAuth20Constants.BASE_OAUTH20_URL + '/' + OAuth20Constants.DEVICE_AUTHZ_URL)
    public ModelAndView handleGetRequest(final HttpServletRequest request, final HttpServletResponse response) {
        val model = getApprovalModel(StringUtils.EMPTY);
        return new ModelAndView(OAuth20Constants.DEVICE_CODE_APPROVAL_VIEW, model);
    }

    /**
     * Handle request internal model and view.
     *
     * @param request  the request
     * @param response the response
     * @return the model and view
     */
    @PostMapping(path = OAuth20Constants.BASE_OAUTH20_URL + '/' + OAuth20Constants.DEVICE_AUTHZ_URL)
    public ModelAndView handlePostRequest(final HttpServletRequest request, final HttpServletResponse response) {
        val userCode = request.getParameter(PARAMETER_USER_CODE);
        val codeNotfound = getModelAndViewForFailure("codenotfound");
        if (StringUtils.isBlank(userCode)) {
            return codeNotfound;
        }
        val codeId = getOAuthConfigurationContext().getDeviceUserCodeFactory().generateDeviceUserCode(userCode);
        try {
            val deviceUserCode = getOAuthConfigurationContext().getCentralAuthenticationService().getTicket(codeId, OAuth20DeviceUserCode.class);
            if (deviceUserCode.isUserCodeApproved()) {
                return getModelAndViewForFailure("codeapproved");
            }
            deviceUserCode.approveUserCode();
            getOAuthConfigurationContext().getTicketRegistry().updateTicket(deviceUserCode);
            return new ModelAndView(OAuth20Constants.DEVICE_CODE_APPROVED_VIEW, HttpStatus.OK);
        } catch (final InvalidTicketException e) {
            LoggingUtils.warn(LOGGER, e);
            return codeNotfound;
        }
    }

    private static ModelAndView getModelAndViewForFailure(final String code) {
        return new ModelAndView(OAuth20Constants.DEVICE_CODE_APPROVAL_VIEW, getApprovalModel(code));
    }

    private static Map getApprovalModel(final String errorCode) {
        val map = new LinkedHashMap<String, Object>();
        map.put("prefix", OAuth20DeviceUserCode.PREFIX);
        if (StringUtils.isNotBlank(errorCode)) {
            map.put("error", errorCode);
        }
        return map;
    }
}


Meaning of Addressed, Anagram solver, Scrabble word finder Addressed?
What is the meaning of Addressed?
Scrabble word finder for esrAdddse. Google scrabble cheat for Addressed. is an anagram answer for eddseAsdr. Search engine Word puzzles for sdedAsrde. Addressed eAeddsrds, dsdeerAsd. Meaning of Addressed.
Tags: Anagram meaning of Addressed. anagram solver, meaning of Addressed. Found the meaning of Addressed? This page defines Addressed. AnagramScrabble.com anagrams from Addressed.
Meaning of Stpolx Meaning of Gabyhu Meaning of Yrlqox Meaning of Dgqcav What is the meaning of Gfl? Meaning of Klznso What is the meaning of Hzok? Meaning of Apwsxx What is the meaning of Mxghz? Meaning of Isyfkc What is the meaning of Ugozub? What is the meaning of Pyokuo? What is the meaning of Laithoe? What is the meaning of Euckoekr? What is the meaning of Shiiheury?


text:
Sonos Launches New Trade Up Program
Sonos introduces new hardware upgrade program, offering customers an opportunity to trade up to next generation Sonos products and responsibly recycle older products.
Santa Barbara, Calif. – October 30, 2019 – Sonos (Nasdaq: SONO) today announced Trade Up, a program that rewards Sonos customers who upgrade older products. At launch, owners of Connect, Connect:Amp, ZP80, ZP90, ZP100, ZP120 and the first generation Play:5 are eligible for a 30 percent discount on any new Sonos product for each original product replaced.
Sonos launched the original versions of these first-generation speakers and components more than a decade ago and has since released powerful upgrades in Sonos Amp, Sonos Port and the second-generation Play:5, in addition to entirely new speakers such as Sonos One, Beam and Move. These products include technology that enables new features such as AirPlay2, voice control, Automatic Trueplay and more innovations in the years ahead:
"Our focus has always been to create a system of products that offer choice and sound great for years. As we've introduced newer generations of Sonos speakers and components, we built for the future, offering a step-change upgrade in hardware and software for even more power and capability," said Zack Kramer, VP, Retail at Sonos. "Today, we're offering the opportunity to trade up to these new Sonos experiences."
Customers with eligible products can follow a simple process to register for the Trade Up discount and find the best way to recycle their product.
For more information, please visit: sonos.com/tradeup.
Sonos (Nasdaq: SONO) is one of the world's leading sound experience brands. As the inventor of multi-room wireless home audio, Sonos innovation helps the world listen better by giving people access to the content they love and allowing them to control it however and wherever they choose. Known for delivering an unparalleled sound experience, thoughtful design aesthetic, simplicity of use and an open platform, Sonos makes the breadth of audio content available to anyone. Sonos is headquartered in Santa Barbara, California. Learn more at www.sonos.com.


With individuals averaging over 290hours a year in a vehicle(AAA.com, 2016), the use of connected services and telematics has become common for drivers and passengers. Individuals are fueled by the need to be constantly connected with their surroundings and devices, and most of their environment is a part of the Internet of Things (IoT). Another "device" that is part of the IoT is the modern connected vehicle.
With such a vast array of data being exchanged, security becomes a primary concern. In the case of the connected vehicle ecosystem, authentication between the endpoints and encryption of data are major steps towards securing the vehicle and ensuring the customer's privacy. Authentication between the vehicles and the back office acts to mitigate unauthorized access to the communications channel. By leveraging industry best practices for security techniques and protocols, a balance between user experience and security can be achieved.


Chasing Moonlight giveaway: win a free copy!
Happy opening day! We've got good news for all you baseball fans: we're giving away TWO copies of Chasing Moonlight: The True Story of Field of Dreams' Doc Graham, a biography of Moonlight Graham by Brett Friedlander and Robert Reising.
Just released in paperback, Chasing Moonlight proves that truth is more interesting than fiction. The real-life Moonlight Graham didn't play just a half-inning for John McGraw's New York Giants, as depicted in Field of Dreams. Neither did he retire from baseball after his lone major league appearance. Rather, he became a fan favorite during a noteworthy professional career, all the while juggling baseball with medical residencies.
Want a chance to win a copy of this book? Go to our Facebook page and "like" the cover image of Chasing Moonlight. We'll choose two lucky winners from that image next Thursday, April 7. Good luck!
Over the next few months, the Blair staff will be going on their own animal adventures throughout the state, armed with Jennifer Bean Bower's Animal Adventures in North Carolina. First up: Angela, our VP of sales and marketing, takes us to Hawkesdene House in Andrews, N.C., a mountain retreat where visitors can take a llama trek to a mountain top, discover to a" hidden" waterfall, or pan for gold without leaving the estate.
As soon as I read the first entry in Jennifer Bean Bower's Animal Adventures in North Carolina, I knew I was going to love the book. Hawkesdene House, described as "a luxurious retreat that encompasses twenty-six acres of picturesque beauty in a scenic mountain valley at the town of Andrews," was the first to offer llama treks in western North Carolina. After I discovered that this "luxurious retreat" was surprisingly affordable, especially in the off-season, I invited two other couples to join me and my husband, Jeff, at a three-bedroom Robinsnest Cabin for the last weekend in February—and prepared ourselves for a winter mountain retreat replete with llamas!
Although I'd seen pictures of Hawkesdene's cabins online, I was not prepared for the combination of rugged mountain lodge and luxurious comfort that awaited us. Our cabin featured an enormous screened-in porch with tons of outdoor seating and an eight-person fire pit with complimentary firewood. Did I mention the gorgeous view?
Or that Hawkesdene's grounds border the Nantahala National Forest with access to a number of hiking trails? Oh, and don't forget the llamas!
Tempted never to leave the comfort of the cabin, we nevertheless headed out to meet the llamas—Hawke, Dene, Crazy Horse, and Scooter—who are guarded day and night by a loyal Great Pyrenees named Claude. Hawkesdene offers llama treks to the summit of Hawksnest Mountain from April to October, where they then serve guests and visitors a three-course meal at the Hawkesdene Pavilion. Since we visited in February, we hiked to Hawksnest sans llamas. We also enjoyed a two-mile round-trip hike into Nantahala National Forest to a splendid "hidden" waterfall.
We went to the see the llamas, but Claude, the Great Pyrenees, stole the show!
Our group visited Joyce Kilmer Memorial Forest off the Cherohala Skyway, where we hiked through one of the nation's last remaining old-growth forests. Many of the trees are over 400 years old, measuring twenty feet in circumference and reaching 100 feet tall (offering opportunities for fabulous photographs). Our winter hike was especially impressive as the lack of foliage revealed the bare bones of the forest, and a recent ice storm caused many of the dead or dying trees to snap, splinter, and fall in fantastic and frightening ways. We felt we had walked into a dystopian novel featuring a dead forest. Warnings to be alert and not to linger under dead or dying trees added to the sense of danger—we even saw shards of splintered wood jabbing out of the trunks of surviving trees, so much was the force of the wind, storm, or breakage.
For more recreational activities around Hawkesdene House, check out Touring the Western North Carolina Backroads by Carolyn Sakowski (the third edition will be published this October), North Carolina Waterfalls by Kevin Adams, Hiking North Carolina's Lookout Towers by Peter Barr, and Fishing North Carolina by Mike Marsh. Animal Adventures in North Carolina is available at your local bookstores and through online booksellers, and Jennifer Bean Bower has events scheduled at bookstores across the state (visit our events page for an event near you). In the meantime, check out this top-ten list of some of the lesser-known animal adventures in North Carolina. Happy travels!
Here I am with my husband, Jeff, and our Akita, Uma.
Toby Bost, coeditor of The Successful Gardener Guide: North Carolina with Leah Chester-Davis, is signing books tonight at the Single Brothers Workshop at Old Salem. Toby will share a slideshow presentation and talk about his book, then answer your toughest gardening questions. The event will end with a raffle drawing–one lucky attendant will win a garden-themed gift basket. So what do you need to know to get there?
When: Thursday, March 24 at 5 p.m.
Did you catch Jennifer Bean Bower on WFMY yesterday morning? She joined the morning show to discuss a few of the lesser-known animal attractions in North Carolina, and we've got a few more to highlight for you today. You can find more about these sites (and 60 others) in Animal Adventures in North Carolina. The book is available at your local bookstore, through online booksellers, and at our website.
Monarch butterflies at all-a-flutter Butterfly Farm.
Franklin poses for a photo at the Karen Beasley Sea Turtle Rescue.
River, the "ambassadog" at Full Moon Farms. "Like" her on Facebook!
A perfect guidebook for families or anyone who just loves animals, Animal Adventures in North Carolina shares 70 animal attractions that Jennifer Bean Bower personally discovered throughout her travels of the entire state. Each entry provides contact information, driving directions, possible fees, hours of operation, and useful travel tips, accompanied by photographs and detailed descriptions of the attraction's offerings.
Tuesday, March 22, at 7 p.m.
SciWorks will bring a live salamander and other animal-related goodies.
Thursday, March 24, at 7 p.m.
Conservators' Center will bring two irresistibly cute Geoffroy's cats (miniature leopards that max out at about 10 pounds).
You can view Jennifer's full tour itinerary here.
If you can't make it to the Greensboro signing, you can see a Geoffroy's cat (and many others from the Conservators' Center) in action, playing an iPad "game for cats". Enjoy!
ForeWord Reviews' Book of the Year Awards program was established to help publishers shine an additional spotlight on their best titles and bring increased attention to librarians and booksellers of the literary and graphic achievements of independent publishers and their authors. Award winners are chosen from real librarians and booksellers, who are on the front lines everyday working with patrons and customers.
The finalists were selected from 1400 entries in 56 categories. These books are examples of independent publishing at its finest.
Look for the winners to be announced in June. Congratulations to our authors for their stellar work!
Tagged banktown, Becoming Elizabeth Lawrence, Blair Publisher, Book of the Year Awards, emily herring wilson, ForeWord Reviews, I Love You--Now Hush, James and Suzanne Gindlesperger, Kathleen Koch, Melinda Rainey Thompson, Morgan Murphy, rick rothacker, Rising from Katrina, So You Think YOu KNow Gettysbury?
Yesterday marked the 175th anniversay of the fall of the Alamo. If you didn't already know, the battle was a pivotal event in the Texas Revolution. Following a 13-day siege, Mexican troops under President General Antonio López de Santa Anna launched an assault on the Alamo Mission near present-day San Antonio, Texas. All but two of the American-frontier defenders were killed–including Davy Crockett–and the mission fell.
For those who want to learn more about that "king of the wild frontier," check out In the Footsteps of Davy Crockett. The book, by Randell Jones, shares the fascinating life of America's favorite frontier hero by taking you to 49 sites in 10 states plus the District of Columbia where Crockett's adventures are commemorated. He ran away from home, fought renegade Indians, hunted bears, campaigned for office, served in Congress, and died a hero in Texas. This book reveals a man who was even more interesting—and certainly more complex—than the myth surrounding him. This book tells his story at the very places where he lived and breathed.
In Baltimore, you can visit the waterfront where the young Crockett tried to sail for England as a cabin boy.
Around Reelfoot Lake, you can see the country where he killed 105 bears in one season.
In Memphis, you'll see where he arrived in town stark naked following a barge wreck on the Mississippi.
Around east-central Alabama, you can find the markers describing a massacre of Indians by Crockett and soldiers.
In Philadelphia, you'll see where he railed against President Andrew Jackson while promoting the sale of his own autobiography.
Throughout east Texas, you'll visit the places along his route to the Alamo.
Crockett was born poor, had little education, and was labeled a buffoon by some. Yet he is revered today as a unique hero of the American frontier. There's more to learn at Randell Jones's website. Enjoy!


Pogba starred for Les Bleus in Russia as they lifted the famous trophy but he sported different colours on holiday in LA this week, wearing Paulo Dybala's No21 shirt. The two midfielders became good pals when they played together at Juventus before Pogba left to rejoin Manchester United in 2016.
Are you, like Jose Mourinho, still scratching your head?
They experienced vastly different World Cups with Dybala making just one appearance as Argentina were dumped out in the round of 16 by eventual champions France. Dybala didn't even make it off the bench in that game with Pogba, who scored in the final against Croatia, perhaps wanting to help raise his friend's profile a bit by pulling on a replica shirt.
Manchester United and France midfielder Paul Pogba's agent is expected to tell the Red Devils he can broker a £100m move for the 25-year-old World Cup winner to Barcelona.
Who expects him to do that? The source for the BBC's story is the Daily Star (owner: Reach media). The paper tells of Barcelona "rumours".
What Barcelona rumours? The ones the agent is "expected" to discuss?
According to the Sunday Star, Raiola is hoping to broker a £100m deal with the Catalan club to rescue his client's career.
It's a human catepillar of utter balls.


QZoom is full screen zoom and operation tool like the one in Mac OS X. The animation such as YouTube expands, too and it is possible to see. QZoom can use for application demonstrations and presentations, Sight assistance, NetBook. Mouse scroll to zoom in or out.


text:
Home ❯ article ❯ materials ❯ mild steel Log in to Like this Article
Daniel Schaeffler
Metal Properties: Uniform Elongation
The elongation value found on metal certs relates to its ductility to the point of fracture. Certs show this as "elongation at fracture" or "elongation after fracture," depending on the test method used. These values differ from the focus of this article—uniform elongation.
During a tensile test, the dogbone-shaped sample undergoes a reduction in the cross-sectional width and thickness as its length increases in tension. A stress-strain curve plots the material's response to the applied load and resulting elongation. The shape of this curve shows a peak at the maximum engineering stress, called the tensile strength. This characteristic shape results from the opposing effects of the work hardening and the reduction in cross-sectional area that occurs when the sample deforms in tension.
The beginning of the curve slopes upward due to work hardening effect outweighing that from the cross-sectional area reduction. Starting at the tensile strength, reduction in the cross-sectional area of the test sample overpowers the work hardening and the slope of the engineering stress-strain curve decreases. A diffuse neck forms at this maximum engineering stress, typically found in the middle of the sample in the reduced-width portion of the gauge length.
The elongation where the maximum stress occurs is called "uniform elongation." In a tensile test, uniform elongation is the percent increase in gauge length occurring at peak stress relative to the initial gauge length. For example, if the gauge length at peak stress measures 59 mm and the initial gauge length was 50 mm, uniform elongation is (59-50)/50 = 18 percent.
Metal Properties: Strain-Hardening Exponent (n-Value)
Daniel Schaeffler January 20, 2023
The diagrams in Fig. 1 illustrate how the tensile bar changes shape during the test, with the gauge region highlighted in blue. Through uniform elongation, the cross-section has a rectangular shape. Necking begins at uniform elongation, and the cross-section no longer is rectangular. All subsequent deformation concentrates in the necked region, becoming the site of eventual fracture.
Accurate metal forming simulation requires capturing the stress-strain relationship at all strains, but a tensile test alone provides valid data only through uniform elongation. Beyond this value, simulation engineers assume either a certain behavior, or more accurately rely on the results from bulge testing or other methods to capture the correct response.
Theory and experiments show that uniform elongation expressed in true strain units is numerically equivalent to the instantaneous n-value.
Uniform Elongation: Not That Uniform
Load increases during the tensile test, and until recently, the deformation was thought to be distributed uniformly over the gauge length prior to reaching uniform elongation. Recently, however, researchers have gathered evidence confirming that a nonuniform strain distribution exists within the gauge region prior to reaching uniform elongation. Acquiring this new knowledge required moving from traditional extensometers to the use of a refined noncontact imaging approach called digital image correlation (DIC), discussed in the Cutting Edge column in the February 2020 issue of MetalForming magazine.
Traditional extensometers calibrated for 50- or 80-mm gauge lengths determine elongation from deformation measured relative to this initial length. This approach averages results over these lengths and leads to greater peak-strain measurements over the smaller reference length.
With the aid of DIC, researchers now can use a much smaller reference length by setting a virtual gauge length generated through application of a fine, random speckle pattern on the sample before testing. A camera captures the motion of the speckle pattern during the test, calculating elongation relative to gauge lengths as small as 0.5 mm.
While conventional wisdom held that uniform strains exist prior to strains reaching uniform elongation, researcher Thomas Stoughton, in 2021, monitored the movement of more than 200 points in the traditional 50-mm span and showed that each one experienced a unique strain evolution, with differences starting before reaching uniform elongation (Fig. 2). In addition, he showed that for DP980 steel, this approach obtains useful data at as much as 61-percent strain rather than only to the uniform elongation of 8-percent strain. This study suggests that DIC-aided measurements potentially can reduce or eliminate the need for many of the tests required for accurate metal forming simulations. MF
Industry-Related Terms: Ductility, Edge, Forming, Gauge, Point, Tensile Strength, Thickness, Work Hardening
See also: Engineering Quality Solutions, Inc., 4M Partners, LLC
Technologies: Materials
Metal Properties: Total Elongation
Daniel Schaeffler November 1, 2022
Metal Properties: Yield Strength
Daniel Schaeffler August 26, 2022
Metal Properties: Elastic Modulus
Daniel Schaeffler July 26, 2022
Crystallography 101
Daniel Schaeffler April 25, 2022


text:
The Star Spangled Banner v. America the Beautiful?
Lydia Hutchinson | July 4, 2012 | 2 Comments
I have a confession to make: I'm not crazy about our National Anthem. Something about it has never quite resonated with me.
"The Star Spangled Banner" was written as a poem in 1814 during the shelling of Fort McHenry, complete with bombs and rockets and tattered flags. I'll give you that it's a great military song, though. As well as a marching band ace-in-the-hole, and the perfect pump-you-up for a sporting event. But it doesn't really have anything to do with the way I personally feel about my country.
Or maybe my problem is with the melody, and the fear I have for anyone trying to hit that high note on the word "free" during a live performance. The whole tune's tough, with a range that most people don't have—if you really listen, we tend to drop an octave for the "rocket's great glare," and then go back up for "oh say does that." That's a lot of work. And when a song's that much work, you tend to lose the point it was trying to make.
A little history? That particular melody was first published sometime around 1780 as "To Anacreon in Heaven" for the Anacreontic Club of London. This club was a group of wealthy men who met to celebrate music, food and drink—so basically it's the tune to a British drinking song. Which makes sense when you picture a bunch of hammered aristocrats with rosy noses, raising their glass as they all head for that high note.
Nevertheless, the melody became popular in America during the War of 1812 and several Americans wrote patriotic songs to it—the most famous of whom was Francis Scott Key. When the sheet music was published in 1815 the name was changed from "Defense of Fort M'Henry" to "The Star Spangled Banner." The song was first adopted by the army and navy as the national anthem, and then President Hoover signed a bill in 1931 making its status official. And thus marked the beginning of an entire country's strained warbling before every kickoff, first pitch and national ceremony.
This hilarious audio clip from The Naked Gun of Leslie Nielsen singing the most messed-up version ever still makes me chuckle:
But there was another song at that time being advocated as our national anthem before Hoover closed the door on it: "America the Beautiful." It started as a poem written in 1893 by Katharine Lee Bates, a professor at Wellesley College, during a trip to Colorado Springs. Of the inspiration behind it she wrote: "One day some of the other teachers and I decided to go on a trip to 14,000-foot Pikes Peak. We hired a prairie wagon. Near the top we had to leave the wagon and go the rest of the way on mules. I was very tired. But when I saw the view, I felt great joy. All the wonder of America seemed displayed there, with the sea-like expanse."
Now that resonates with me.
So this 4th of July, all day, I'll be playing Ray Charles' version of "America the Beautiful," a song that describes the beauty and diversity of this land. That reminds us of people's footsteps who came before us. That uses the words "good" and "brotherhood" and "dreams" and "grace." That tells of the heroes who loved their country "more than life." And Ray's performance of it is so moving that it pretty much sums up what this country means to me: endless hope and possibility.
And that's the mark of a great song.
And an even greater national anthem.
Happy 4th of July, everyone.
—Lydia Hutchinson
Category: In Case You Haven't Heard
MarkG says:
The French have a good one. And I speak as a Brit!
Harold Weinstein says:
I agree Ray Charles vsrsion gives me goose bumps and America the beatiful should be the national anthem.
« The Andy Griffith Show Theme Song
Kyler England: The Spare Key Sessions »


text:
Sneha Home
Sneha Girap (Editor)
I Love to read n write about Interesting People
Cameron Tringale
Updated on Jun 08, 2018
U.S. Open T54: 2015
College Georgia Tech
Name Cameron Tringale
Current tours PGA TOUR
Turned professional 2009
Role Professional golfer
Professional wins 1
Masters Tournament T38: 2015
Full name Cameron Joseph Tringale
Born August 24, 1987 (age 28) Mission Viejo, California (1987-08-24)
Education Georgia Institute of Technology
Residence Laguna Niguel, California, United States
Cameron tringale trains to win on the pga tour
Cameron Joseph Tringale (born August 24, 1987) is an American professional golfer. Born in Mission Viejo, California, Tringale was a three-time NCAA All-American at Georgia Tech. He earned PGA Tour cards for 2010 and 2011 through qualifying school.
Nautica professional golfer cameron tringale takes the course wearing nautica summer 2015
Amateur career
Professional wins (1)
Results in major championships
U.S. national team appearances
After graduating from Mission Viejo High School in 2005, Tringale attended Georgia Tech and won the Atlantic Coast Conference championship as a freshman. He played in the 2007 U.S. Amateur Championship, where he lost his first round match. He qualified again in 2009 and reached the third round. Tringale was a three-time NCAA All-American, earning second-team honors in 2006 and 2007, and making the first team in 2009 as a senior. He qualified for the 2009 U.S. Open but missed the cut, and he represented the U.S. that year as a member of the Palmer Cup and Walker Cup teams.
In December 2009, Tringale successfully gained a 2010 PGA Tour card through qualifying school, finishing T19. He made his debut as a member of the PGA Tour at the 2010 Sony Open in Hawaii in January. In 21 starts that season, Tringale made just more than $300,000, leaving him 176th on the money list. His best finishes were ties for 11th at the Viking Classic and the Justin Timberlake Shriners Hospitals for Children Open.
In December, Tringale regained his PGA Tour card for 2011 by finishing fourth at Q-School. That season he collected fourth-place finishes at the Greenbrier Classic and CIMB Classic and a fifth at the Texas Open.
He finished fourth at the 2012 Farmers Insurance Open, seventh at the Zurich Classic of New Orleans and eighth at the Shell Houston Open. His best result in 2013 was third at the Tampa Bay Championship.
In the 2014 PGA Tour season, Tringale finished fourth at the Houston Open and Greenbrier Classic. Six days after the 2014 PGA Championship, Tringale disqualified himself after he realized he signed an incorrect scorecard. He originally finished T33. During the playoffs, he tied for second at The Barclays.
Tringale was runner-up at the 2015 Zurich Classic of New Orleans.
2014 Franklin Templeton Shootout (with Jason Day)
DNP = Did not play
CUT = missed the half-way cut
"T" = tied
DQ = Disqualified
Yellow background for top-10.
Palmer Cup: 2009
Walker Cup: 2009 (winners)
Cameron Tringale Wikipedia
Mayilattam (film)
Ben Anderson (journalist)


text:
/**
 * 多边形
 * @module zrender/shape/Polygon
 */

    var polyHelper = require('../helper/poly');

    module.exports = require('../Path').extend({

        type: 'polygon',

        shape: {
            points: null,

            smooth: false,

            smoothConstraint: null
        },

        buildPath: function (ctx, shape) {
            polyHelper.buildPath(ctx, shape, true);
        }
    });


Maarten Havermans is a passionate Assistant Facilities Manager currently assigned to UBS overseeing the daily operations of its NYC headquarters.
Before his American adventure, he was in his home country Belgium overseeing operations for Texaco and enjoying all the exciting things Europe has to offer.
Diversity spices things up. It gives us the opportunity to learn from each other, hear each other's stand point, respect and help out with each other's problems and celebrate the good times. It also teaches us to be tolerant and respectful. Something that is missing in today's society. I'm glad I can share with my co-workers about experiences good and bad and inform them about some of our struggles.
Why is it important to self-identify at work as LGBTQ+ or an ally?
I'm happy to work for a company and an account that gives me the opportunity to be proud of who I am. For way too long, we have had to shy away from ourselves. Being able to show who I am is a perk that I am grateful for every single day. I hope that C&W might be an example that can inspire other companies throughout the world to be more inclusive and respectful of their employees.
How do you celebrate Pride?
Share Your Story for Pride 2018 by clicking here.