text:
package org.apache.spark.sql

import java.util.{Locale, UUID}

import scala.concurrent.Future

import org.apache.spark.{MapOutputStatistics, SparkFunSuite, TaskContext}
import org.apache.spark.broadcast.Broadcast
import org.apache.spark.internal.Logging
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.catalyst.{FunctionIdentifier, InternalRow, TableIdentifier}
import org.apache.spark.sql.catalyst.expressions._
import org.apache.spark.sql.catalyst.parser.{CatalystSqlParser, ParserInterface}
import org.apache.spark.sql.catalyst.plans.logical.{LocalRelation, LogicalPlan, Statistics, UnresolvedHint}
import org.apache.spark.sql.catalyst.plans.physical.Partitioning
import org.apache.spark.sql.catalyst.rules.Rule
import org.apache.spark.sql.catalyst.trees.TreeNodeTag
import org.apache.spark.sql.execution._
import org.apache.spark.sql.execution.adaptive.{AdaptiveSparkPlanExec, QueryStageExec}
import org.apache.spark.sql.execution.exchange.{BroadcastExchangeExec, BroadcastExchangeLike, ShuffleExchangeExec, ShuffleExchangeLike, ShuffleOrigin}
import org.apache.spark.sql.execution.vectorized.OnHeapColumnVector
import org.apache.spark.sql.internal.SQLConf
import org.apache.spark.sql.internal.SQLConf.COLUMN_BATCH_SIZE
import org.apache.spark.sql.internal.StaticSQLConf.SPARK_SESSION_EXTENSIONS
import org.apache.spark.sql.types.{DataType, Decimal, IntegerType, LongType, Metadata, StructType}
import org.apache.spark.sql.vectorized.{ColumnarArray, ColumnarBatch, ColumnarMap, ColumnVector}
import org.apache.spark.unsafe.types.UTF8String

/**
 * Test cases for the [[SparkSessionExtensions]].
 */
class SparkSessionExtensionSuite extends SparkFunSuite {
  type ExtensionsBuilder = SparkSessionExtensions => Unit
  private def create(builder: ExtensionsBuilder): Seq[ExtensionsBuilder] = Seq(builder)

  private def stop(spark: SparkSession): Unit = {
    spark.stop()
    SparkSession.clearActiveSession()
    SparkSession.clearDefaultSession()
  }

  private def withSession(builders: Seq[ExtensionsBuilder])(f: SparkSession => Unit): Unit = {
    val builder = SparkSession.builder().master("local[1]")
    builders.foreach(builder.withExtensions)
    val spark = builder.getOrCreate()
    try f(spark) finally {
      stop(spark)
    }
  }

  test("inject analyzer rule") {
    withSession(Seq(_.injectResolutionRule(MyRule))) { session =>
      assert(session.sessionState.analyzer.extendedResolutionRules.contains(MyRule(session)))
    }
  }

  test("inject post hoc resolution analyzer rule") {
    withSession(Seq(_.injectPostHocResolutionRule(MyRule))) { session =>
      assert(session.sessionState.analyzer.postHocResolutionRules.contains(MyRule(session)))
    }
  }

  test("inject check analysis rule") {
    withSession(Seq(_.injectCheckRule(MyCheckRule))) { session =>
      assert(session.sessionState.analyzer.extendedCheckRules.contains(MyCheckRule(session)))
    }
  }

  test("inject optimizer rule") {
    withSession(Seq(_.injectOptimizerRule(MyRule))) { session =>
      assert(session.sessionState.optimizer.batches.flatMap(_.rules).contains(MyRule(session)))
    }
  }

  test("SPARK-33621: inject a pre CBO rule") {
    withSession(Seq(_.injectPreCBORule(MyRule))) { session =>
      assert(session.sessionState.optimizer.preCBORules.contains(MyRule(session)))
    }
  }

  test("inject spark planner strategy") {
    withSession(Seq(_.injectPlannerStrategy(MySparkStrategy))) { session =>
      assert(session.sessionState.planner.strategies.contains(MySparkStrategy(session)))
    }
  }

  test("inject parser") {
    val extension = create { extensions =>
      extensions.injectParser((_: SparkSession, _: ParserInterface) => CatalystSqlParser)
    }
    withSession(extension) { session =>
      assert(session.sessionState.sqlParser === CatalystSqlParser)
    }
  }

  test("inject multiple rules") {
    withSession(Seq(_.injectOptimizerRule(MyRule),
        _.injectPlannerStrategy(MySparkStrategy))) { session =>
      assert(session.sessionState.optimizer.batches.flatMap(_.rules).contains(MyRule(session)))
      assert(session.sessionState.planner.strategies.contains(MySparkStrategy(session)))
    }
  }

  test("inject stacked parsers") {
    val extension = create { extensions =>
      extensions.injectParser((_: SparkSession, _: ParserInterface) => CatalystSqlParser)
      extensions.injectParser(MyParser)
      extensions.injectParser(MyParser)
    }
    withSession(extension) { session =>
      val parser = MyParser(session, MyParser(session, CatalystSqlParser))
      assert(session.sessionState.sqlParser === parser)
    }
  }

  test("inject function") {
    val extensions = create { extensions =>
      extensions.injectFunction(MyExtensions.myFunction)
    }
    withSession(extensions) { session =>
      assert(session.sessionState.functionRegistry
        .lookupFunction(MyExtensions.myFunction._1).isDefined)
    }
  }

  case class MyHintRule(spark: SparkSession) extends Rule[LogicalPlan] {
    val MY_HINT_NAME = Set("CONVERT_TO_EMPTY")

    override def apply(plan: LogicalPlan): LogicalPlan =
      plan.resolveOperators {
      case h: UnresolvedHint if MY_HINT_NAME.contains(h.name.toUpperCase(Locale.ROOT)) =>
        LocalRelation(h.output, data = Seq.empty, isStreaming = h.isStreaming)
    }
  }

  test("inject custom hint rule") {
    withSession(Seq(_.injectPostHocResolutionRule(MyHintRule))) { session =>
      assert(
        session.range(1).hint("CONVERT_TO_EMPTY").logicalPlan.isInstanceOf[LocalRelation],
        "plan is expected to be a local relation"
      )
    }
  }

  test("inject adaptive query prep rule") {
    val extensions = create { extensions =>
      // inject rule that will run during AQE query stage preparation and will add custom tags
      // to the plan
      extensions.injectQueryStagePrepRule(session => MyQueryStagePrepRule())
      // inject rule that will run during AQE query stage optimization and will verify that the
      // custom tags were written in the preparation phase
      extensions.injectColumnar(session =>
        MyColumnarRule(MyNewQueryStageRule(), MyNewQueryStageRule()))
    }
    withSession(extensions) { session =>
      session.sessionState.conf.setConf(SQLConf.ADAPTIVE_EXECUTION_ENABLED, true)
      assert(session.sessionState.queryStagePrepRules.contains(MyQueryStagePrepRule()))
      assert(session.sessionState.columnarRules.contains(
        MyColumnarRule(MyNewQueryStageRule(), MyNewQueryStageRule())))
      import session.sqlContext.implicits._
      val data = Seq((100L), (200L), (300L)).toDF("vals").repartition(1)
      val df = data.selectExpr("vals + 1")
      df.collect()
    }
  }

  test("inject columnar AQE on") {
    testInjectColumnar(true)
  }

  test("inject columnar AQE off") {
    testInjectColumnar(false)
  }

  private def testInjectColumnar(enableAQE: Boolean): Unit = {
    def collectPlanSteps(plan: SparkPlan): Seq[Int] = plan match {
      case a: AdaptiveSparkPlanExec =>
        assert(a.toString.startsWith("AdaptiveSparkPlan isFinalPlan=true"))
        collectPlanSteps(a.executedPlan)
      case _ => plan.collect {
        case _: ReplacedRowToColumnarExec => 1
        case _: ColumnarProjectExec => 10
        case _: ColumnarToRowExec => 100
        case s: QueryStageExec => collectPlanSteps(s.plan).sum
        case _: MyShuffleExchangeExec => 1000
        case _: MyBroadcastExchangeExec => 10000
      }
    }

    val extensions = create { extensions =>
      extensions.injectColumnar(session =>
        MyColumnarRule(PreRuleReplaceAddWithBrokenVersion(), MyPostRule()))
    }
    withSession(extensions) { session =>
      session.sessionState.conf.setConf(SQLConf.ADAPTIVE_EXECUTION_ENABLED, enableAQE)
      assert(session.sessionState.columnarRules.contains(
        MyColumnarRule(PreRuleReplaceAddWithBrokenVersion(), MyPostRule())))
      import session.sqlContext.implicits._
      // perform a join to inject a broadcast exchange
      val left = Seq((1, 50L), (2, 100L), (3, 150L)).toDF("l1", "l2")
      val right = Seq((1, 50L), (2, 100L), (3, 150L)).toDF("r1", "r2")
      val data = left.join(right, $"l1" === $"r1")
        // repartitioning avoids having the add operation pushed up into the LocalTableScan
        .repartition(1)
      val df = data.selectExpr("l2 + r2")
      // execute the plan so that the final adaptive plan is available when AQE is on
      df.collect()
      val found = collectPlanSteps(df.queryExecution.executedPlan).sum
      // 1 MyBroadcastExchangeExec
      // 1 MyShuffleExchangeExec
      // 1 ColumnarToRowExec
      // 2 ColumnarProjectExec
      // 1 ReplacedRowToColumnarExec
      // so 11121 is expected.
      assert(found == 11121)

      // Verify that we get back the expected, wrong, result
      val result = df.collect()
      assert(result(0).getLong(0) == 101L) // Check that broken columnar Add was used.
      assert(result(1).getLong(0) == 201L)
      assert(result(2).getLong(0) == 301L)
    }
  }

  test("reset column vectors") {
    val session = SparkSession.builder()
      .master("local[1]")
      .config(COLUMN_BATCH_SIZE.key, 2)
      .withExtensions { extensions =>
        extensions.injectColumnar(session =>
          MyColumnarRule(PreRuleReplaceAddWithBrokenVersion(), MyPostRule())) }
      .getOrCreate()

    try {
      assert(session.sessionState.columnarRules.contains(
        MyColumnarRule(PreRuleReplaceAddWithBrokenVersion(), MyPostRule())))
      import session.sqlContext.implicits._

      val input = Seq((100L), (200L), (300L))
      val data = input.toDF("vals").repartition(1)
      val df = data.selectExpr("vals + 1")
      val result = df.collect()
      assert(result sameElements input.map(x => Row(x + 2)))
    } finally {
      stop(session)
    }
  }

  test("use custom class for extensions") {
    val session = SparkSession.builder()
      .master("local[1]")
      .config(SPARK_SESSION_EXTENSIONS.key, classOf[MyExtensions].getCanonicalName)
      .getOrCreate()
    try {
      assert(session.sessionState.planner.strategies.contains(MySparkStrategy(session)))
      assert(session.sessionState.analyzer.extendedResolutionRules.contains(MyRule(session)))
      assert(session.sessionState.analyzer.postHocResolutionRules.contains(MyRule(session)))
      assert(session.sessionState.analyzer.extendedCheckRules.contains(MyCheckRule(session)))
      assert(session.sessionState.optimizer.batches.flatMap(_.rules).contains(MyRule(session)))
      assert(session.sessionState.sqlParser.isInstanceOf[MyParser])
      assert(session.sessionState.functionRegistry
        .lookupFunction(MyExtensions.myFunction._1).isDefined)
      assert(session.sessionState.columnarRules.contains(
        MyColumnarRule(PreRuleReplaceAddWithBrokenVersion(), MyPostRule())))
    } finally {
      stop(session)
    }
  }

  test("use multiple custom class for extensions in the specified order") {
    val session = SparkSession.builder()
      .master("local[1]")
      .config(SPARK_SESSION_EXTENSIONS.key, Seq(
        classOf[MyExtensions2].getCanonicalName,
        classOf[MyExtensions].getCanonicalName).mkString(","))
      .getOrCreate()
    try {
      assert(session.sessionState.planner.strategies.containsSlice(
        Seq(MySparkStrategy2(session), MySparkStrategy(session))))
      val orderedRules = Seq(MyRule2(session), MyRule(session))
      val orderedCheckRules = Seq(MyCheckRule2(session), MyCheckRule(session))
      val parser = MyParser(session, CatalystSqlParser)
      assert(session.sessionState.analyzer.extendedResolutionRules.containsSlice(orderedRules))
      assert(session.sessionState.analyzer.postHocResolutionRules.containsSlice(orderedRules))
      assert(session.sessionState.analyzer.extendedCheckRules.containsSlice(orderedCheckRules))
      assert(session.sessionState.optimizer.batches.flatMap(_.rules).filter(orderedRules.contains)
        .containsSlice(orderedRules ++ orderedRules)) // The optimizer rules are duplicated
      assert(session.sessionState.sqlParser === parser)
      assert(session.sessionState.functionRegistry
        .lookupFunction(MyExtensions.myFunction._1).isDefined)
      assert(session.sessionState.functionRegistry
        .lookupFunction(MyExtensions2.myFunction._1).isDefined)
    } finally {
      stop(session)
    }
  }

  test("allow an extension to be duplicated") {
    val session = SparkSession.builder()
      .master("local[1]")
      .config(SPARK_SESSION_EXTENSIONS.key, Seq(
        classOf[MyExtensions].getCanonicalName,
        classOf[MyExtensions].getCanonicalName).mkString(","))
      .getOrCreate()
    try {
      assert(session.sessionState.planner.strategies.count(_ === MySparkStrategy(session)) === 2)
      assert(session.sessionState.analyzer.extendedResolutionRules.count(_ === MyRule(session)) ===
        2)
      assert(session.sessionState.analyzer.postHocResolutionRules.count(_ === MyRule(session)) ===
        2)
      assert(session.sessionState.analyzer.extendedCheckRules.count(_ === MyCheckRule(session)) ===
        2)
      assert(session.sessionState.optimizer.batches.flatMap(_.rules)
        .count(_ === MyRule(session)) === 4) // The optimizer rules are duplicated
      val outerParser = session.sessionState.sqlParser
      assert(outerParser.isInstanceOf[MyParser])
      assert(outerParser.asInstanceOf[MyParser].delegate.isInstanceOf[MyParser])
      assert(session.sessionState.functionRegistry
        .lookupFunction(MyExtensions.myFunction._1).isDefined)
    } finally {
      stop(session)
    }
  }

  test("use the last registered function name when there are duplicates") {
    val session = SparkSession.builder()
      .master("local[1]")
      .config(SPARK_SESSION_EXTENSIONS.key, Seq(
        classOf[MyExtensions2].getCanonicalName,
        classOf[MyExtensions2Duplicate].getCanonicalName).mkString(","))
      .getOrCreate()
    try {
      val lastRegistered = session.sessionState.functionRegistry
        .lookupFunction(FunctionIdentifier("myFunction2"))
      assert(lastRegistered.isDefined)
      assert(lastRegistered.get !== MyExtensions2.myFunction._2)
      assert(lastRegistered.get === MyExtensions2Duplicate.myFunction._2)
    } finally {
      stop(session)
    }
  }
}

case class MyRule(spark: SparkSession) extends Rule[LogicalPlan] {
  override def apply(plan: LogicalPlan): LogicalPlan = plan
}

case class MyCheckRule(spark: SparkSession) extends (LogicalPlan => Unit) {
  override def apply(plan: LogicalPlan): Unit = { }
}

case class MySparkStrategy(spark: SparkSession) extends SparkStrategy {
  override def apply(plan: LogicalPlan): Seq[SparkPlan] = Seq.empty
}

case class MyParser(spark: SparkSession, delegate: ParserInterface) extends ParserInterface {
  override def parsePlan(sqlText: String): LogicalPlan =
    delegate.parsePlan(sqlText)

  override def parseExpression(sqlText: String): Expression =
    delegate.parseExpression(sqlText)

  override def parseTableIdentifier(sqlText: String): TableIdentifier =
    delegate.parseTableIdentifier(sqlText)

  override def parseFunctionIdentifier(sqlText: String): FunctionIdentifier =
    delegate.parseFunctionIdentifier(sqlText)

  override def parseMultipartIdentifier(sqlText: String): Seq[String] =
    delegate.parseMultipartIdentifier(sqlText)

  override def parseTableSchema(sqlText: String): StructType =
    delegate.parseTableSchema(sqlText)

  override def parseDataType(sqlText: String): DataType =
    delegate.parseDataType(sqlText)
}

object MyExtensions {

  val myFunction = (FunctionIdentifier("myFunction"),
    new ExpressionInfo(
      "noClass",
      "myDb",
      "myFunction",
      "usage",
      "extended usage",
      "    Examples:",
      """
       note
      """,
      "",
      "3.0.0",
      """
       deprecated
      """),
    (_: Seq[Expression]) => Literal(5, IntegerType))
}

case class CloseableColumnBatchIterator(itr: Iterator[ColumnarBatch],
    f: ColumnarBatch => ColumnarBatch) extends Iterator[ColumnarBatch] {
  var cb: ColumnarBatch = null

  private def closeCurrentBatch(): Unit = {
    if (cb != null) {
      cb.close
      cb = null
    }
  }

  TaskContext.get().addTaskCompletionListener[Unit]((tc: TaskContext) => {
    closeCurrentBatch()
  })

  override def hasNext: Boolean = {
    closeCurrentBatch()
    itr.hasNext
  }

  override def next(): ColumnarBatch = {
    closeCurrentBatch()
    cb = f(itr.next())
    cb
  }
}

object NoCloseColumnVector extends Logging {
  def wrapIfNeeded(cv: ColumnVector): NoCloseColumnVector = cv match {
    case ref: NoCloseColumnVector =>
      ref
    case vec => NoCloseColumnVector(vec)
  }
}

/**
 * Provide a ColumnVector so ColumnarExpression can close temporary values without
 * having to guess what type it really is.
 */
case class NoCloseColumnVector(wrapped: ColumnVector) extends ColumnVector(wrapped.dataType) {
  private var refCount = 1

  /**
   * Don't actually close the ColumnVector this wraps.  The producer of the vector will take
   * care of that.
   */
  override def close(): Unit = {
    // Empty
  }

  override def hasNull: Boolean = wrapped.hasNull

  override def numNulls(): Int = wrapped.numNulls

  override def isNullAt(rowId: Int): Boolean = wrapped.isNullAt(rowId)

  override def getBoolean(rowId: Int): Boolean = wrapped.getBoolean(rowId)

  override def getByte(rowId: Int): Byte = wrapped.getByte(rowId)

  override def getShort(rowId: Int): Short = wrapped.getShort(rowId)

  override def getInt(rowId: Int): Int = wrapped.getInt(rowId)

  override def getLong(rowId: Int): Long = wrapped.getLong(rowId)

  override def getFloat(rowId: Int): Float = wrapped.getFloat(rowId)

  override def getDouble(rowId: Int): Double = wrapped.getDouble(rowId)

  override def getArray(rowId: Int): ColumnarArray = wrapped.getArray(rowId)

  override def getMap(ordinal: Int): ColumnarMap = wrapped.getMap(ordinal)

  override def getDecimal(rowId: Int, precision: Int, scale: Int): Decimal =
    wrapped.getDecimal(rowId, precision, scale)

  override def getUTF8String(rowId: Int): UTF8String = wrapped.getUTF8String(rowId)

  override def getBinary(rowId: Int): Array[Byte] = wrapped.getBinary(rowId)

  override protected def getChild(ordinal: Int): ColumnVector = wrapped.getChild(ordinal)
}

trait ColumnarExpression extends Expression with Serializable {
  /**
   * Returns true if this expression supports columnar processing through [[columnarEval]].
   */
  def supportsColumnar: Boolean = true

  /**
   * Returns the result of evaluating this expression on the entire
   * [[org.apache.spark.sql.vectorized.ColumnarBatch]]. The result of
   * calling this may be a single [[org.apache.spark.sql.vectorized.ColumnVector]] or a scalar
   * value. Scalar values typically happen if they are a part of the expression i.e. col("a") + 100.
   * In this case the 100 is a [[org.apache.spark.sql.catalyst.expressions.Literal]] that
   * [[org.apache.spark.sql.catalyst.expressions.Add]] would have to be able to handle.
   *
   * By convention any [[org.apache.spark.sql.vectorized.ColumnVector]] returned by [[columnarEval]]
   * is owned by the caller and will need to be closed by them. This can happen by putting it into
   * a [[org.apache.spark.sql.vectorized.ColumnarBatch]] and closing the batch or by closing the
   * vector directly if it is a temporary value.
   */
  def columnarEval(batch: ColumnarBatch): Any = {
    throw new IllegalStateException(s"Internal Error ${this.getClass} has column support mismatch")
  }

  // We need to override equals because we are subclassing a case class
  override def equals(other: Any): Boolean = {
    if (!super.equals(other)) {
      return false
    }
    return other.isInstanceOf[ColumnarExpression]
  }

  override def hashCode(): Int = super.hashCode()
}

object ColumnarBindReferences extends Logging {

  // Mostly copied from BoundAttribute.scala so we can do columnar processing
  def bindReference[A <: ColumnarExpression](
      expression: A,
      input: AttributeSeq,
      allowFailures: Boolean = false): A = {
    expression.transform { case a: AttributeReference =>
      val ordinal = input.indexOf(a.exprId)
      if (ordinal == -1) {
        if (allowFailures) {
          a
        } else {
          sys.error(s"Couldn't find $a in ${input.attrs.mkString("[", ",", "]")}")
        }
      } else {
        new ColumnarBoundReference(ordinal, a.dataType, input(ordinal).nullable)
      }
    }.asInstanceOf[A]
  }

  /**
   * A helper function to bind given expressions to an input schema.
   */
  def bindReferences[A <: ColumnarExpression](
      expressions: Seq[A],
      input: AttributeSeq): Seq[A] = {
    expressions.map(ColumnarBindReferences.bindReference(_, input))
  }
}

class ColumnarBoundReference(ordinal: Int, dataType: DataType, nullable: Boolean)
  extends BoundReference(ordinal, dataType, nullable) with ColumnarExpression {

  override def columnarEval(batch: ColumnarBatch): Any = {
    // Because of the convention that the returned ColumnVector must be closed by the
    // caller we wrap this column vector so a close is a NOOP, and let the original source
    // of the vector close it.
    NoCloseColumnVector.wrapIfNeeded(batch.column(ordinal))
  }
}

class ColumnarAlias(child: ColumnarExpression, name: String)(
    override val exprId: ExprId = NamedExpression.newExprId,
    override val qualifier: Seq[String] = Seq.empty,
    override val explicitMetadata: Option[Metadata] = None,
    override val nonInheritableMetadataKeys: Seq[String] = Seq.empty)
  extends Alias(child, name)(exprId, qualifier, explicitMetadata, nonInheritableMetadataKeys)
  with ColumnarExpression {

  override def columnarEval(batch: ColumnarBatch): Any = child.columnarEval(batch)

  override protected def withNewChildInternal(newChild: Expression): ColumnarAlias =
    new ColumnarAlias(newChild.asInstanceOf[ColumnarExpression], name)(exprId, qualifier,
      explicitMetadata, nonInheritableMetadataKeys)
}

class ColumnarAttributeReference(
    name: String,
    dataType: DataType,
    nullable: Boolean = true,
    override val metadata: Metadata = Metadata.empty)(
    override val exprId: ExprId = NamedExpression.newExprId,
    override val qualifier: Seq[String] = Seq.empty[String])
  extends AttributeReference(name, dataType, nullable, metadata)(exprId, qualifier)
  with ColumnarExpression {

  // No columnar eval is needed because this must be bound before it is evaluated
}

class ColumnarLiteral (value: Any, dataType: DataType) extends Literal(value, dataType)
  with ColumnarExpression {
  override def columnarEval(batch: ColumnarBatch): Any = value
}

/**
 * A version of ProjectExec that adds in columnar support.
 */
class ColumnarProjectExec(projectList: Seq[NamedExpression], child: SparkPlan)
  extends ProjectExec(projectList, child) {

  override def supportsColumnar: Boolean =
    projectList.forall(_.asInstanceOf[ColumnarExpression].supportsColumnar)

  // Disable code generation
  override def supportCodegen: Boolean = false

  override def doExecuteColumnar() : RDD[ColumnarBatch] = {
    val boundProjectList: Seq[Any] =
      ColumnarBindReferences.bindReferences(
        projectList.asInstanceOf[Seq[ColumnarExpression]], child.output)
    val rdd = child.executeColumnar()
    rdd.mapPartitions((itr) => CloseableColumnBatchIterator(itr,
      (cb) => {
        val newColumns = boundProjectList.map(
          expr => expr.asInstanceOf[ColumnarExpression].columnarEval(cb).asInstanceOf[ColumnVector]
        ).toArray
        new ColumnarBatch(newColumns, cb.numRows())
      })
    )
  }

  // We have to override equals because subclassing a case class like ProjectExec is not that clean
  // One of the issues is that the generated equals will see ColumnarProjectExec and ProjectExec
  // as being equal and this can result in the withNewChildren method not actually replacing
  // anything
  override def equals(other: Any): Boolean = {
    if (!super.equals(other)) {
      return false
    }
    return other.isInstanceOf[ColumnarProjectExec]
  }

  override def hashCode(): Int = super.hashCode()

  override def withNewChildInternal(newChild: SparkPlan): ColumnarProjectExec =
    new ColumnarProjectExec(projectList, newChild)
}

/**
 * A version of add that supports columnar processing for longs.  This version is broken
 * on purpose so it adds the numbers plus 1 so that the tests can show that it was replaced.
 */
class BrokenColumnarAdd(
    left: ColumnarExpression,
    right: ColumnarExpression,
    failOnError: Boolean = false)
  extends Add(left, right, failOnError) with ColumnarExpression {

  override def supportsColumnar(): Boolean = left.supportsColumnar && right.supportsColumnar

  override def columnarEval(batch: ColumnarBatch): Any = {
    var lhs: Any = null
    var rhs: Any = null
    var ret: Any = null
    try {
      lhs = left.columnarEval(batch)
      rhs = right.columnarEval(batch)

      if (lhs == null || rhs == null) {
        ret = null
      } else if (lhs.isInstanceOf[ColumnVector] && rhs.isInstanceOf[ColumnVector]) {
        val l = lhs.asInstanceOf[ColumnVector]
        val r = rhs.asInstanceOf[ColumnVector]
        val result = new OnHeapColumnVector(batch.numRows(), dataType)
        ret = result

        for (i <- 0 until batch.numRows()) {
          result.appendLong(l.getLong(i) + r.getLong(i) + 1) // BUG to show we replaced Add
        }
      } else if (rhs.isInstanceOf[ColumnVector]) {
        val l = lhs.asInstanceOf[Long]
        val r = rhs.asInstanceOf[ColumnVector]
        val result = new OnHeapColumnVector(batch.numRows(), dataType)
        ret = result

        for (i <- 0 until batch.numRows()) {
          result.appendLong(l + r.getLong(i) + 1) // BUG to show we replaced Add
        }
      } else if (lhs.isInstanceOf[ColumnVector]) {
        val l = lhs.asInstanceOf[ColumnVector]
        val r = rhs.asInstanceOf[Long]
        val result = new OnHeapColumnVector(batch.numRows(), dataType)
        ret = result

        for (i <- 0 until batch.numRows()) {
          result.appendLong(l.getLong(i) + r + 1) // BUG to show we replaced Add
        }
      } else {
        ret = nullSafeEval(lhs, rhs)
      }
    } finally {
      if (lhs != null && lhs.isInstanceOf[ColumnVector]) {
        lhs.asInstanceOf[ColumnVector].close()
      }
      if (rhs != null && rhs.isInstanceOf[ColumnVector]) {
        rhs.asInstanceOf[ColumnVector].close()
      }
    }
    ret
  }

  override def withNewChildrenInternal(
      newLeft: Expression, newRight: Expression): BrokenColumnarAdd =
    new BrokenColumnarAdd(
      left = newLeft.asInstanceOf[ColumnarExpression],
      right = newRight.asInstanceOf[ColumnarExpression], failOnError)
}

class CannotReplaceException(str: String) extends RuntimeException(str) {

}

case class PreRuleReplaceAddWithBrokenVersion() extends Rule[SparkPlan] {
  def replaceWithColumnarExpression(exp: Expression): ColumnarExpression = exp match {
    case a: Alias =>
      new ColumnarAlias(replaceWithColumnarExpression(a.child),
        a.name)(a.exprId, a.qualifier, a.explicitMetadata, a.nonInheritableMetadataKeys)
    case att: AttributeReference =>
      new ColumnarAttributeReference(att.name, att.dataType, att.nullable,
        att.metadata)(att.exprId, att.qualifier)
    case lit: Literal =>
      new ColumnarLiteral(lit.value, lit.dataType)
    case add: Add if (add.dataType == LongType) &&
      (add.left.dataType == LongType) &&
      (add.right.dataType == LongType) =>
      // Add only supports Longs for now.
      new BrokenColumnarAdd(replaceWithColumnarExpression(add.left),
        replaceWithColumnarExpression(add.right))
    case exp =>
      throw new CannotReplaceException(s"expression " +
        s"${exp.getClass} ${exp} is not currently supported.")
  }

  def replaceWithColumnarPlan(plan: SparkPlan): SparkPlan =
    try {
      plan match {
        case e: ShuffleExchangeExec =>
          // note that this is not actually columnar but demonstrates that exchanges can
          // be replaced.
          val replaced = e.withNewChildren(e.children.map(replaceWithColumnarPlan))
          MyShuffleExchangeExec(replaced.asInstanceOf[ShuffleExchangeExec])
        case e: BroadcastExchangeExec =>
          // note that this is not actually columnar but demonstrates that exchanges can
          // be replaced.
          val replaced = e.withNewChildren(e.children.map(replaceWithColumnarPlan))
          MyBroadcastExchangeExec(replaced.asInstanceOf[BroadcastExchangeExec])
        case plan: ProjectExec =>
          new ColumnarProjectExec(plan.projectList.map((exp) =>
            replaceWithColumnarExpression(exp).asInstanceOf[NamedExpression]),
            replaceWithColumnarPlan(plan.child))
        case p =>
          logWarning(s"Columnar processing for ${p.getClass} is not currently supported.")
          p.withNewChildren(p.children.map(replaceWithColumnarPlan))
      }
    } catch {
      case exp: CannotReplaceException =>
        logWarning(s"Columnar processing for ${plan.getClass} is not currently supported" +
          s"because ${exp.getMessage}")
        plan
    }

  override def apply(plan: SparkPlan): SparkPlan = replaceWithColumnarPlan(plan)
}

/**
 * Custom Exchange used in tests to demonstrate that shuffles can be replaced regardless of
 * whether AQE is enabled.
 */
case class MyShuffleExchangeExec(delegate: ShuffleExchangeExec) extends ShuffleExchangeLike {
  override def numMappers: Int = delegate.numMappers
  override def numPartitions: Int = delegate.numPartitions
  override def shuffleOrigin: ShuffleOrigin = {
    delegate.shuffleOrigin
  }
  override def mapOutputStatisticsFuture: Future[MapOutputStatistics] =
    delegate.mapOutputStatisticsFuture
  override def getShuffleRDD(partitionSpecs: Array[ShufflePartitionSpec]): RDD[_] =
    delegate.getShuffleRDD(partitionSpecs)
  override def runtimeStatistics: Statistics = delegate.runtimeStatistics
  override def child: SparkPlan = delegate.child
  override protected def doExecute(): RDD[InternalRow] = delegate.execute()
  override def outputPartitioning: Partitioning = delegate.outputPartitioning
  override protected def withNewChildInternal(newChild: SparkPlan): SparkPlan =
    super.legacyWithNewChildren(Seq(newChild))
}

/**
 * Custom Exchange used in tests to demonstrate that broadcasts can be replaced regardless of
 * whether AQE is enabled.
 */
case class MyBroadcastExchangeExec(delegate: BroadcastExchangeExec) extends BroadcastExchangeLike {
  override def runId: UUID = delegate.runId
  override def relationFuture: java.util.concurrent.Future[Broadcast[Any]] =
    delegate.relationFuture
  override def completionFuture: Future[Broadcast[Any]] = delegate.completionFuture
  override def runtimeStatistics: Statistics = delegate.runtimeStatistics
  override def child: SparkPlan = delegate.child
  override protected def doPrepare(): Unit = delegate.prepare()
  override protected def doExecute(): RDD[InternalRow] = delegate.execute()
  override def doExecuteBroadcast[T](): Broadcast[T] = delegate.executeBroadcast()
  override def outputPartitioning: Partitioning = delegate.outputPartitioning

  override protected def withNewChildInternal(newChild: SparkPlan): SparkPlan =
    super.legacyWithNewChildren(Seq(newChild))
}

class ReplacedRowToColumnarExec(override val child: SparkPlan)
  extends RowToColumnarExec(child) {

  // We have to override equals because subclassing a case class like ProjectExec is not that clean
  // One of the issues is that the generated equals will see ColumnarProjectExec and ProjectExec
  // as being equal and this can result in the withNewChildren method not actually replacing
  // anything
  override def equals(other: Any): Boolean = {
    if (!super.equals(other)) {
      return false
    }
    return other.isInstanceOf[ReplacedRowToColumnarExec]
  }

  override def hashCode(): Int = super.hashCode()

  override def withNewChildInternal(newChild: SparkPlan): ReplacedRowToColumnarExec =
    new ReplacedRowToColumnarExec(newChild)
}

case class MyPostRule() extends Rule[SparkPlan] {
  override def apply(plan: SparkPlan): SparkPlan = plan match {
    case rc: RowToColumnarExec => new ReplacedRowToColumnarExec(rc.child)
    case plan => plan.withNewChildren(plan.children.map(apply))
  }
}

case class MyColumnarRule(pre: Rule[SparkPlan], post: Rule[SparkPlan]) extends ColumnarRule {
  override def preColumnarTransitions: Rule[SparkPlan] = pre
  override def postColumnarTransitions: Rule[SparkPlan] = post
}

class MyExtensions extends (SparkSessionExtensions => Unit) {
  def apply(e: SparkSessionExtensions): Unit = {
    e.injectPlannerStrategy(MySparkStrategy)
    e.injectResolutionRule(MyRule)
    e.injectPostHocResolutionRule(MyRule)
    e.injectCheckRule(MyCheckRule)
    e.injectOptimizerRule(MyRule)
    e.injectParser(MyParser)
    e.injectFunction(MyExtensions.myFunction)
    e.injectColumnar(session => MyColumnarRule(PreRuleReplaceAddWithBrokenVersion(), MyPostRule()))
  }
}

object QueryPrepRuleHelper {
  val myPrepTag: TreeNodeTag[String] = TreeNodeTag[String]("myPrepTag")
  val myPrepTagValue: String = "myPrepTagValue"
}

// this rule will run during AQE query preparation and will write custom tags to each node
case class MyQueryStagePrepRule() extends Rule[SparkPlan] {
  override def apply(plan: SparkPlan): SparkPlan = plan.transformDown {
    case plan =>
      plan.setTagValue(QueryPrepRuleHelper.myPrepTag, QueryPrepRuleHelper.myPrepTagValue)
      plan
  }
}

// this rule will run during AQE query stage optimization and will verify custom tags were
// already written during query preparation phase
case class MyNewQueryStageRule() extends Rule[SparkPlan] {
  override def apply(plan: SparkPlan): SparkPlan = plan.transformDown {
    case plan if !plan.isInstanceOf[AdaptiveSparkPlanExec] =>
      assert(plan.getTagValue(QueryPrepRuleHelper.myPrepTag).get ==
          QueryPrepRuleHelper.myPrepTagValue)
      plan
  }
}

case class MyRule2(spark: SparkSession) extends Rule[LogicalPlan] {
  override def apply(plan: LogicalPlan): LogicalPlan = plan
}

case class MyCheckRule2(spark: SparkSession) extends (LogicalPlan => Unit) {
  override def apply(plan: LogicalPlan): Unit = { }
}

case class MySparkStrategy2(spark: SparkSession) extends SparkStrategy {
  override def apply(plan: LogicalPlan): Seq[SparkPlan] = Seq.empty
}

object MyExtensions2 {

  val myFunction = (FunctionIdentifier("myFunction2"),
    new ExpressionInfo(
      "noClass",
      "myDb",
      "myFunction2",
      "usage",
      "extended usage",
      "    Examples:",
      """
       note
      """,
      "",
      "3.0.0",
      """
       deprecated
      """),
    (_: Seq[Expression]) => Literal(5, IntegerType))
}

class MyExtensions2 extends (SparkSessionExtensions => Unit) {
  def apply(e: SparkSessionExtensions): Unit = {
    e.injectPlannerStrategy(MySparkStrategy2)
    e.injectResolutionRule(MyRule2)
    e.injectPostHocResolutionRule(MyRule2)
    e.injectCheckRule(MyCheckRule2)
    e.injectOptimizerRule(MyRule2)
    e.injectParser((_: SparkSession, _: ParserInterface) => CatalystSqlParser)
    e.injectFunction(MyExtensions2.myFunction)
  }
}

object MyExtensions2Duplicate {

  val myFunction = (FunctionIdentifier("myFunction2"),
    new ExpressionInfo(
      "noClass",
      "myDb",
      "myFunction2",
      "usage",
      "extended usage",
      "    Examples:",
      """
       note
      """,
      "",
      "3.0.0",
      """
       deprecated
      """),
    (_: Seq[Expression]) => Literal(5, IntegerType))
}

class MyExtensions2Duplicate extends (SparkSessionExtensions => Unit) {
  def apply(e: SparkSessionExtensions): Unit = {
    e.injectFunction(MyExtensions2Duplicate.myFunction)
  }
}

redpajama_set_name: RedPajamaGithub


Beginning at 12:00 Noon, Eastern Standard Time, Microsoft will show off its new Windows 10 OS to the public, along with announcements about Mobile OS, Cortana assistant, and maybe something about a brand new browser. We might even hear a bit about Xbox. You can watch it streaming live here!
The official Windows 10 livestream is here, starting at noon EST.
We cannot embed it here, or stream it on our site, because, if YouTube can do it, so can Microsoft.


text:
Q: SQL Server Database Vesion I have a problem regarding a SQL Server database.
The error message is

Cannot be opened because it is version 852. This server supports version 782 and earlier. A downgrade path is not supported.

I tried everything, updating via Visual Studio 2015, downloading SQL Server 2016, installing SSMS, but nothing changed the server's version.
I need to somehow change the server's version so it will attach the the database successfully.
Please help!

A: You are attempting to attach SQL Server 2016 database files to SQL Server 2014.  This is not supported.
Your only solution is to upgrade SQL Server from 2014 to 2016.  Note, this is the database engine, not management studio.
Here is a list of all SQL Server internal database version numbers: http://sqlserverbuilds.blogspot.com/2014/01/sql-server-internal-database-versions.html

redpajama_set_name: RedPajamaStackExchange


To get this chip working with Arduino IDE, you will need an external 16MHz crystal or resonator, a 5V supply, and a serial connection. You should select the Arduino UNO board within the Arduino IDE. If you are not comfortable doing this, we recommend purchasing the Arduino Uno board that has all of these built into the board.
According to the Atmel datasheet, the safe working voltage at 16MHz is between 3.8V to 5.5V.
These chips are thus suitable for running from 3x 1.5V batteries. Having said that, we have had no problems running these chips down to the cutoff voltage of 2.7V at 16MHz.. This means they can be run from 2x 1.5V batteries and is useful when interfacing with 3.3V devices as no voltage level conversion is required.


SLT-1, FWD, 2.5L I-4. Beautiful white pearl exterior, cocoa/light gray ash leather interior. Looks (and still smells!) like new, with one (non-smoker) owner, gently driven, with all records provided (and CARFAX report!) and remaining 36,000 bumper-to-bumper factory warranty.
Original MSRP $42,425.00 -- Current KBB $31,500.00!
Keyless entry and push-to-start with remote start. Blind spot monitoring with rear cross-traffic alert (and rear camera). Seats six with three-row seating (captain's chairs 2nd row)! Dual skyscape sunroof and heated (all power with lumbar) front seats. Bluetooth connectivity, 4G LTE WI-FI hotspot, Navigation, Sirius-XM, Apple/Android/Google connectivity/carplay. Three zone climate control, integrated garage door opener and power liftgate. Factory all-season floor and cargo mats, cargo privacy shade. Locate, lock and start the car from anywhere in the world on your mobile device with myGMC.
Beautiful color combination of tri-coat white over ash and maroon interior - stately, yet light, airy and refreshing! Excellent condition with not a door-ding in sight - weekly washed and garage kept. Recent 10,000 mile service included four-wheel alignment. Motivated seller.


text:
Marlene Imirzian & Associates Architects
Concepts & Research
Public & Civic
Flip a Strip
Concepts & Research Projects
The Flip a Strip Design Competition asked designers around the world to re-imagine the common strip mall. The host of the competition, Scottsdale Museum of Contemporary Art, selected 'diVert', our entry, as one of the ten finalists. We were invited to create an installation visually exploring our design solution, which was on display in the museum in the fall of 2008.
info@imirzian-architects.com
© 2023 Marlene Imirzian & Associates Architects.
Images may not be reproduced in any form without written consent.

redpajama_set_name: RedPajamaCommonCrawl


text:
Concept: Model organisms
Response to Arsenate Treatment in Schizosaccharomyces pombe and the Role of Its Arsenate Reductase Activity.
Arsenic toxicity has been studied for a long time due to its effects in humans. Although epidemiological studies have demonstrated multiple effects in human physiology, there are many open questions about the cellular targets and the mechanisms of response to arsenic. Using the fission yeast Schizosaccharomyces pombe as model system, we have been able to demonstrate a strong activation of the MAPK Spc1/Sty1 in response to arsenate. This activation is dependent on Wis1 activation and Pyp2 phosphatase inactivation. Using arsenic speciation analysis we have also demonstrated the previously unknown capacity of S. pombe cells to reduce As (V) to As (III). Genetic analysis of several fission yeast mutants point towards the cell cycle phosphatase Cdc25 as a possible candidate to carry out this arsenate reductase activity. We propose that arsenate reduction and intracellular accumulation of arsenite are the key mechanisms of arsenate tolerance in fission yeast.
Concepts: Yeast, Model organism, Ascomycota, Schizosaccharomyces pombe, Yeasts, Model organisms, Schizosaccharomyces, Paul Nurse
The €100 lab: A 3D-printable open-source platform for fluorescence microscopy, optogenetics, and accurate temperature control during behaviour of zebrafish, Drosophila, and Caenorhabditis elegans
Small, genetically tractable species such as larval zebrafish, Drosophila, or Caenorhabditis elegans have become key model organisms in modern neuroscience. In addition to their low maintenance costs and easy sharing of strains across labs, one key appeal is the possibility to monitor single or groups of animals in a behavioural arena while controlling the activity of select neurons using optogenetic or thermogenetic tools. However, the purchase of a commercial solution for these types of experiments, including an appropriate camera system as well as a controlled behavioural arena, can be costly. Here, we present a low-cost and modular open-source alternative called 'FlyPi'. Our design is based on a 3D-printed mainframe, a Raspberry Pi computer, and high-definition camera system as well as Arduino-based optical and thermal control circuits. Depending on the configuration, FlyPi can be assembled for well under €100 and features optional modules for light-emitting diode (LED)-based fluorescence microscopy and optogenetic stimulation as well as a Peltier-based temperature stimulator for thermogenetics. The complete version with all modules costs approximately €200 or substantially less if the user is prepared to 'shop around'. All functions of FlyPi can be controlled through a custom-written graphical user interface. To demonstrate FlyPi's capabilities, we present its use in a series of state-of-the-art neurogenetics experiments. In addition, we demonstrate FlyPi's utility as a medical diagnostic tool as well as a teaching aid at Neurogenetics courses held at several African universities. Taken together, the low cost and modular nature as well as fully open design of FlyPi make it a highly versatile tool in a range of applications, including the classroom, diagnostic centres, and research labs.
Concepts: Biology, Caenorhabditis elegans, Caenorhabditis, Model organism, Control, Open source, Graphical user interface, Model organisms
Prevalence of Batrachochytrium dendrobatidis in Xenopus Collected in Africa (1871-2000) and in California (2001-2010)
International trade of the invasive South African clawed frog (Xenopus laevis), a subclinical carrier of the fungal pathogen Batrachochytrium dendrobatis (Bd) has been proposed as a major means of introduction of Bd into naïve, susceptible amphibian populations. The historical presence of Bd in the indigenous African population of Xenopus is well documented. However, there are no reports documenting the presence of Bd in wild Xenopus populations in the US, particularly in California where introduced populations are well-established after intentional or accidental release. In this report, a survey was conducted on 178 archived specimens of 6 species of Xenopus collected in Africa from 1871-2000 and on 23 archived specimens (all wild-caught Xenopus laevis) collected in California, USA between 2001 and 2010. The overall prevalence rate of Bd in the tested Xenopus was 2.8%. The earliest positive specimen was X. borealis collected in Kenya in 1934. The overall prevalence of Bd in the X. laevis collected in California was 13% with 2 positive specimens from 2001 and one positive specimen from 2003. The positive Xenopus (3/23) collected in California were collected in 2001 (2/3) and 2003 (1/3). These data document the presence of Bd-infected wild Xenopus laevis in California. The findings reported here support the prevailing hypothesis that Bd was present as a stable, endemic infection in Xenopus populations in Africa prior to their worldwide distribution likely via international live-amphibian trade.
Concepts: Biology, Africa, Frog, Model organisms, African Union, Pipidae, Batrachochytrium dendrobatidis, African clawed frog
New opportunities at the wild frontier
A better understanding of the natural history of model organisms will increase their value as model systems and also keep them at the forefront of research.
Concepts: Model organism, Natural environment, Nature, Natural science, Model organisms, Natural history, Big History, History of biology
Zebrafish and medaka offer insights into the neurobehavioral correlates of vertebrate magnetoreception
An impediment to a mechanistic understanding of how some species sense the geomagnetic field ("magnetoreception") is the lack of vertebrate genetic models that exhibit well-characterized magnetoreceptive behavior and are amenable to whole-brain analysis. We investigated the genetic model organisms zebrafish and medaka, whose young stages are transparent and optically accessible. In an unfamiliar environment, adult fish orient according to the directional change of a magnetic field even in darkness. To enable experiments also in juveniles, we applied slowly oscillating magnetic fields, aimed at generating conflicting sensory inputs during exploratory behavior. Medaka (but not zebrafish) increase their locomotor activity in this assay. Complementary brain activity mapping reveals neuronal activation in the lateral hindbrain during magnetic stimulation. These comparative data support magnetoreception in teleosts, provide evidence for a light-independent mechanism, and demonstrate the usefulness of zebrafish and medaka as genetic vertebrate models for studying the biophysical and neuronal mechanisms underlying magnetoreception.
Concepts: Magnetic field, Biology, Earth's magnetic field, Magnet, Model organism, Magnetism, Perception, Model organisms
Assessing differences in toxicity and teratogenicity of three phthalates, Diethyl phthalate, Di-n-propyl phthalate, and Di-n-butyl phthalate, using Xenopus laevis embryos
Journal of toxicology and environmental health. Part A
Phthalates, compounds used to add flexibility to plastics, are ubiquitous in the environment. In particular, the diethyl (DEP), di-n-propyl (DnPP), and di-n-butyl (DBP) phthalates were found to exert detrimental effects in both mammalian and non-mammalian studies, with toxic effects varying according to alkyl chain length. Embryos of Xenopus laevis, the African clawed frog, have been used to assess toxicity and teratogenicity of several compounds and serves as a model for assessing adverse and teratogenic effects of ortho-phthalate esters. The purpose of this study was to develop a model for comparison of developmentally toxic effects of ortho-phthalate esters using Xenopus embryos. In this study developing Xenopus laevis embryos were exposed to increasing concentrations of DEP, DnPP, and DBP using the 96-h Frog Embryo Teratogenesis Assay-Xenopus (FETAX), with 96-h lethal concentrations, effective concentrations to induce malformations, teratogenic indices, and concentrations to inhibit growth determined. DEP, DnPP, and DBP showed enhanced toxicity with increasing ester length. Developing Xenopus laevis exposed to DEP, DnPP, and DBP showed similar malformations that also occurred at lower concentrations with increasing alkyl chain length. Teratogenic risk did not change markedly with alkyl chain length, with data showing only DBP to be teratogenic.
Concepts: Embryo, Developmental biology, Phthalates, Phthalate, Model organisms, Pipidae, Teratology, African clawed frog
Automated longitudinal monitoring of in vivo protein aggregation in neurodegenerative disease C. elegans models
Molecular neurodegeneration
While many biological studies can be performed on cell-based systems, the investigation of molecular pathways related to complex human dysfunctions - e.g. neurodegenerative diseases - often requires long-term studies in animal models. The nematode Caenorhabditis elegans represents one of the best model organisms for many of these tests and, therefore, versatile and automated systems for accurate time-resolved analyses on C. elegans are becoming highly desirable tools in the field.
Concepts: Biology, Caenorhabditis elegans, Animal, Caenorhabditis, Nematode, Model organism, Rhabditidae, Model organisms
A model for investigating developmental eye repair in Xenopus laevis
Experimental eye research
Vertebrate eye development is complex and requires early interactions between neuroectoderm and surface ectoderm during embryogenesis. In the African clawed frog, Xenopus laevis, individual eye tissues such as the retina and lens can undergo regeneration. However, it has been reported that removal of either the specified eye field at the neurula stage or the eye during tadpole stage does not induce replacement. Here we describe a model for investigating Xenopus developmental eye repair. We found that tailbud embryos can readily regrow eyes after surgical removal of over 83% of the specified eye and lens tissues. The regrown eye reached a comparable size to the contralateral control by 5 days and overall animal development was normal. It contained the expected complement of eye cell types (including the pigmented epithelium, retina and lens), and connected to the brain. Our data also demonstrate that apoptosis, an early mechanism that regulates appendage regeneration, is also required for eye regrowth. Treatment with apoptosis inhibitors (M50054 or NS3694) blocked eye regrowth by inhibiting capase activation. Together, our findings indicate that frog embryos can undergo successful eye repair after considerable tissue loss and reveals a required role for apoptosis in this process. Furthermore, this Xenopus model allows for rapid comparisons of productive eye repair and developmental pathways. It can also facilitate the molecular dissection of signaling mechanisms necessary for initiating repair.
Concepts: Brain, Developmental biology, Model organism, Eye, Frog, Model organisms, Pipidae, African clawed frog
Generic wound signals initiate regeneration in missing-tissue contexts
Despite the identification of numerous regulators of regeneration in different animal models, a fundamental question remains: why do some wounds trigger the full regeneration of lost body parts, whereas others resolve by mere healing? By selectively inhibiting regeneration initiation, but not the formation of a wound epidermis, here we create headless planarians and finless zebrafish. Strikingly, in both missing-tissue contexts, injuries that normally do not trigger regeneration activate complete restoration of heads and fin rays. Our results demonstrate that generic wound signals have regeneration-inducing power. However, they are interpreted as regeneration triggers only in a permissive tissue context: when body parts are missing, or when tissue-resident polarity signals, such as Wnt activity in planarians, are modified. Hence, the ability to decode generic wound-induced signals as regeneration-initiating cues may be the crucial difference that distinguishes animals that regenerate from those that cannot.
Concepts: Wound healing, Fish, English-language films, Injuries, Injury, Wound, Model organisms, Trigger
WorMachine: machine learning-based phenotypic analysis tool for worms
Caenorhabditis elegans nematodes are powerful model organisms, yet quantification of visible phenotypes is still often labor-intensive, biased, and error-prone. We developed WorMachine, a three-step MATLAB-based image analysis software that allows (1) automated identification of C. elegans worms, (2) extraction of morphological features and quantification of fluorescent signals, and (3) machine learning techniques for high-level analysis.
Concepts: Developmental biology, Caenorhabditis elegans, Caenorhabditis, Nematode, Model organism, Rhabditidae, Sydney Brenner, Model organisms


text:
Home :: Military :: World :: Europe :: Scotland :: Christian :: Christian Theology :: Protestant :: Calvinist ::
Presbyterians are those Christians who hold to a government by presbyters. They are Calvinistic in doctrine. They believe that bishops and presbyters, or elders, are of the same order. Bishops were presbyters in charge of congregations. The Presbyterian polity provides for the presbytery, the synod, and the general assembly; and its officers are bishops or pastors, ruling elders and deacons. There is but one order in the ministry, that of presbyter. The presbytery consists of all the ministers and one ruling elder from each church within its bounds. The synod is constituted of delegates, ministerial and lay, elected by the presbyteries belonging to it. The general assembly is composed of commissioners, ministerial and lay, elected by the presbyteries.
Of the introduction of Christianity into Scotland, no authentic record remains. It is highly probable that among the Roman invaders there were Christians, and that by their means the name of Christ became known to the inhabitants. The first historical figure in our Scottish Christianity is St. Ninian, who seems to have been born about the year 360. He died about 432, and for centuries no place in Scotland was regarded as more holy than his tomb. The conversion of the people to Christianity cannot have been very thorough. In the course of little more than a century they had almost wholly relapsed into Paganism, and the work of Ninian had to be done over again. Among the most famous of those by whom this second conversion to Christianity was effected stands the name of St. Kentigern, who was apparently born about the year 514.
It is to St. Columba that the name of "Apostle of Scotland" is generally applied. The earlier missionaries of the Cross had kindled a light here and there, but it shone very fitfully and was well-nigh extinguished. St. Columba kindled a light which was shed over all the land and by God's grace endures to this day. He was born at Gartan, in Donegal, Ireland, in the year 521. No event in the history of Scotland is more memorable than the arrival on Iona, in the year 563, of Columba and his twelve companions. The government of the Columban Church has been the subject of much controversy. It seems to have differed in important respects both from Presbytery and Episcopacy, in the modern sense of these terms. Columba was only a Presbyter, but, as Abbot of the Monastery, he exercised authority over the whole Church.
In the centuries that followed, as Scotland began to find its identity as a nation, and hundreds of years of tension with her English neighbours to the South began, the Church adopted the Roman, not Celtic, practices of work and worship. Saintly figures like Queen Margaret encouraged and supported its work and influence, and the papacy allowed Scotland to be independent of England for church purposes.
The history of the Scottish Church from the Reformation to the Revolution is the history of the Scottish nation. All through this long period on the one hand, the Church through its Assemblies and its ministers took an active interest in the conduct of public affairs, and on the other, the State was constantly interfering with the policy of the Church. The consequence was, that the two were so closely connected together, the movements and the condition of things in the one department were so vitally affected by those in the other, that it is impossible to read aright the history of the State without taking into account what at the same time was transpiring within the domain of the Church. The Scottish Church fostered the love of freedom among the people, and became, what the Church of England never was, the chief defence of the rights of the people against the encroachments of civil tyranny.
It may be said generally, that in England the Reformation started into being under the direct influence of the Crown; but in Scotland, the cause was taken up and carried forward by the nobles and the people in direct opposition to the will of the Sovereign. Doubtless, when Henry the Eighth severed England from the domination of Rome, he was sustained by men far nobler than himself, who were animated by high religious principle, and he had the sympathy and support of a large portion of his subjects. But the Scottish Reformation, though lacking this element of royal patronage and support, yet had a firmer basis in the convictions of the people, was altogether broader and deeper in its nature, and more popular in its character, than was the corresponding movement in the southern kingdom.
The Reformation in Scotland came to its head in the 1560s, and was modelled on John Calvin's Geneva. His pupil John Knox is famous for head-to-head debates with Mary, Queen of Scots, the Catholic Queen who returned from France and tried to remain loyal to the Roman system. By the end of the 16th century, the Protestant Church of Scotland had developed into a Presbyterian Church, with a system of courts (today the General Assembly, presbytery and kirk session), and a strong tradition of preaching and Scriptural emphasis.
In 1558 civil war broke out between the Queen Regent as the head of the Popish party, and the "Lords of the Congregation" as representing the Protestants. The dangers with which they were surrounded induced the leaders of the Protestants to enter into those leagues for mutual support, and for defence of religion and liberty, which are known as "Bands" or "Covenants." When, through the intervention of England on behalf of the Reforming party, the war was brought to a close, the government of the country was left practically in the hands of the Protestants. John Knox had meantime returned to his native land, and he threw all his energy into the great work of advancing the cause. In 1560 "The Confession of Faith as Professed and Believed by the Protestants within the realm of Scotland," was presented to the Estates, and was by them ratified and approved as the embodiment of what was henceforth to be regarded as the national religion of Scotland. Two other Acts were passed, by one of which the Papal jurisdiction was abolished, and by the other the celebration of the Mass was forbidden under severe penalties.
During the first seven years of its history the Reformed Church of Scotland was neither established nor endowed. Civil Establishment and partial endowment came in 1567; and with this union between Church and State began a struggle on the part of the latter to fetter the liberties of the Church which continued for more than a century. The struggle began about the time of John Knox's death, in 1572, and was initiated by the greed of the nobles, who sought, by the institution of a sort of Episcopate, to secure for themselves a large share of the wealth of the Popish Church. It was afterwards maintained and intensified by the king's love of arbitrary power, and his special dislike for the freedom of the Presbyterian Church; and there were parties within the Church willing to he the tools of the Court in bringing it into bondage. From 1572 to 1592 bishops and archbishops nominated by the State existed in Scotland, but the office was little more than nominal.
After the crowns of Scotland and England were united in 1603, attempts by Charles I and Charles II to control the Kirk (to use the Scots term) met with protest, including the signing of the National Covenant at Greyfriars Church in Edinburgh in 1638. The Presbyterian Church was founded by that body of men who adhered to the civil part of the Second Reformation, according to which Presbytery was established and recognised by the State between 1638 and 1649. Acts of Parliament had been passed in that period, by which the king held his crown on certain express conditions. When Charles II violated these conditions, both in regard to the civil liberties of the nation and the spiritual independence of the Church, multitudes, especially in the South of Scotland, were disposed to offer strenuous resistance to his assertion of arbitrary power. The more resolute and discerning among the Presbyterians came at length to feel that a change of dynasty was necessary, if freedom and order were to be secured, and hence the celebrated Queensberry Paper and the Sanquhar Declaration. More formidable still to the reigning despotism was the remarkable organization of the Societies, as they were called, designed to secure the enjoyment of religious ordinances, as well as to assert the liberties of the nation. They were the first to urge that the dynasty should be changed, and their contention was ratified by the nation at the Revolution. The terms, however, upon which a settlement was effected were not accepted as sufficient by a considerable body of Presbyterians.
The Church took its rise in its distinctive character at this period, and on the ground that it could not, while acknowledging the relief from oppression which the Revolution afforded, acquiesce in the arrangements made by the State for the recognition of the Church and the due exercise of its authority within its own spiritual domain. They were jealous in regard to the terms on which an alliance was proposed between Church and State. They were equally jealous in regard to the character of the ally with which the Church was invited to connect itself. They had felt the evils of prelatic despotism too long to view without forebodings the continuance of the system in England and the influence it might still exert on Scottish interests.
The succession of William and Mary to the throne in 1688 changed the situation, and the Revolution Settlement of 1690 finally established the reformed, presbyterian Church as the national Church of Scotland. The monarch even today has a special relationship with the Church of Scotland and renews that every year by sending a representative to attend the General Assembly.
Controversy and division were common in the Church between 1750 and 1850, when there was considerable concern about the Church's relations with the State, particularly over intervention in the appointment of ministers. The largest division was the Disruption of 1843, a major split which saw about one third of the Kirk break away to form what came to be the Free Kirk. The next 90 years were spent removing the causes of division, and reuniting several churches, all of them presbyterian, so that today the Church of Scotland is the largest Protestant church in the country, with a number of very small churches alongside it, representing those who chose not to find their way into the union process.
Page last modified: 08-11-2011 19:38:17 ZULU


I though it was time to update on my Chronodex use - 2 years on and it's still going strong. In fact I can't imagine how I managed without it.
I have 2 larger notebooks - one just for studio-sweepings, one for art related stuff (www.kate-smith.co.uk). (Studio-sweepings is my 'day job' - I am also an artist, my art blog is here). I also have a pocket sized one which is the one I carry around with me.
Chronodex in action. I adapted it (read how here) from the original design by Patrick Ng - you can read about his version and down load printable templates to fit the Midori traveller's Notebooks here. My version has gradually got smaller :) - I can now fit a whole year into one passport sized notebook.
A blank set of pages ready to colour code. I use it to track my time and visually assess how much time I spend on each area of my life. (Have to make sure I spend enough time drawing!) Alongside this I use my phone/ google calender for specific appointments and events.


Candidates seeking admission into the prestigious institution who have passed their UTME with appropriate score may proceed to post UTME. Here in this piece, we shall discuss the eligibility and how to register for Unilorin post UTME screening exercise. Kindly read through.
You must have written and pass UTME. You must have obtained a score that is equal to or greater than the cut off mark for the institution.
You must have written and pass O level certificate exam either WAEC, NECO or NABTEB. This must be five (5) credit passes in relevant subjects at not more than two sittings. Candidates for MBBS are required to make their five (5) credit passes in one sitting.
You must have chosen Unilorin in your UTME or DE registration.
After meeting this requirements, you may then proceed to write the post UTME examination.
Log in with your UTME registration number and surname.
After viewing and verifying the information, navigate and click on the payment link to make payment. This will direct you to payment page where you can pay with your card.
Please check if you meet up with the course you chose. If not, you may change your course by applying for change of course with a fee on the same page.
Next select the type of your ATM card (Verve, Visa or Master Card).
Input your card details, these include CVV2 (the 3 digits at the back of the card) and PIN.
Click on pay to make payment.
After a successful payment re-login into the post UTME portal.
Upload your passport photograph which not be older than 3 months.
Fill in your O level results, verify and save.
Kindly print the Pre-Admission Screening Registration form, Scheduling Slip and Payment Receipt.
Please take note of your Pre-Admission Screening exercise date.
While we wish you the very best in your quest for Unilorin admission, we will like to offer few words of advice.
During the online payment, please do not reload page, exercise patience let it finish.
Please be well and decently dressed when going for your post UTME screening exercise. This is highly important.
You are expected to be at the screening venue an hour before the examination.
Try as much as possible to come with your UTME result print out.


VroomVroomVroom rates have been negotiated - All Inclusive - from the best car hire companies based on location, duration and vehicle types. Once you make a booking your rental is subject to the rental terms and conditions of the car hire company with whom the reservation is made. For example: bookings made with Alamo will be subject to the Alamo terms and conditions at the time of booking.
* Canada and US residents are not covered by the Theft Protection insurance or the Collision Damage Waiver. However, the quoted price will include tax, road tax, vehicle licensing fee, location service charge, unlimited mileage (where specified), 3rd party liability and public liability.
If after placing a reservation you need to repeat the reservation process (eg. if a second reservation is required) from Vroom Vroom Vroom, start the quote process again from the home page.
Although the rates on Vroom Vroom Vroom are fully inclusive and the vehicle is fully insured, though in the event of loss or damage, insurance excess will apply. This can be reduced with an optional payment at the suppliers depot on pickup.
The rental amount is payable upon vehicle pickup directly to the car hire company. All major credit cards are accepted. Credit card details may be required to secure the reservation at the time of booking however the payable amount will not be debited until you collect the vehicle and sign the rental contract.
Once the reservations is made, amendments and/or cancellations are to be made via the car hire company with whom the reservation is made. See the "Make Changes" page for direct access to the respective car hire company amendment pages. You will need your Booking Number and surname or email address as it appears on the email confirmation.
Child Seats: Available on request from most locations. Please select the baby seat option on the reservation form.


One of the most difficult household tasks is to wash your own laundry. This becomes even more difficult if we talk about dirty bed sheets. Most people think that a washing machine would minimize their effort. But even that does not help much. You have to sort out all your bed sheets, choose the right kind of detergents and dry everything for a long time. A laundry service for doing your dirty laundry can be quite beneficial. Bed sheets in Singapore are made of soft fabric which can be easily damaged if you choose the wrong detergents. Singapore is a very busy city and you don't want to waste your time going through such tedious and time consuming tasks. A bedsheet cleaning service can save a lot of your time and effort.
Most of the laundry services in Singapore are quite good. However, bedsheets require additional care and therefore, you should hire a service which provides best quality cleaning of your bedsheets. The best kind of laundry service categorizes bed sheets according to size and fabric. It makes sure that bed sheets are serviced according to their size and fabric. Some bed sheets require a lighter wash as they may be more delicate. Sorting out bed sheets according to their size and fabric will ensure that your bed sheets are not damaged in any way.
You can easily find a laundry service in Singapore. However, it is very important to choose the best one. There are many good laundry shops in the city as well as market areas. However, it will be better to hire services from a shop which also provides repair service. A laundry shop with repair service makes sure that your bed sheets are not torn in any way before washing them. If your bed sheets are torn, the crack may be widened because of a wash. Some laundry shops charge extra for this service. However, there are many shops in market areas who provide this service for free. Moreover, even with a paid service, you will ensure that torn bed sheets are washed accordingly.
There are many laundry shops in Singapore. However, it is important to make sure that they are clean and hygienic. The laundry shops in city area are quite clean and give an impression of professionalism. They provide professional service and other facilities. It is also important to hire a service which has trained specialists. The workers should be able to handle your bed sheets with utmost care.
It is always better to hire a laundry service which not only provides washing, but also other services including ironing, dry cleaning and so on. MrsLaundry is a quality bedsheet cleaning service which also provides others facilities like carpet cleaning, curtain cleaning, mattress protector and many others. A shop like this ensures high quality service with a long experience in this business. It may be hard for you to choose the right kind of laundry services. But with an experienced service like MrsLaundry, you don't need to look anywhere else. Visit the website of MrsLaundry at https://www.mrslaundry.com.sg now.


Oh, I really love this top. The fabric is great, I want to purchase a couple of yards. The pattern is nice too, but I am going to dig in my stash. I have acquired too many patterns. I need to stop. buying. patterns and sew the ones I have!


Draco is a perfume by Tiziana Terenzi for women and men and was released in 2015. The scent is fruity-floral. It is being marketed by Cereria Terenzi Evelino.
Draco is a very beautiful fragrance that convinced me positively. It sounds expensive from start to finish.
After I didn't read very positive comments on some forums, I got afraid of "overdose" and sprayed only once. And I say: durability and Sillage are very good!
While I was enjoying the fragrance, the thought didn't leave me alone that I had known Draco for a long time - but I really like him this time! After some time I suddenly realized: Draco reminds me of Eden von Cacharel, only I couldn't wear Eden at all, I even found him stinking.
Draco won me with his peach and pear, both sound very feminine. The fragrance is soft, slightly sweetish, as if ripe, juicy pears and peaches had mixed with magnolia and jasmine blossoms and this whole composition was sprinkled with icing sugar. Patchouli is almost not to be smelled, which I personally find very good.
Draco is not gourmandig for me, but sweet and fruity. Definitely on my wish list!
The Hesperides are nymphs who guard a garden where a miracle tree with golden apples is standing. The tree was a wedding gift from Gaia to Hera and Zeus. Its fruits give the gods eternal youth. Ladon is a multi-headed dragon that supports the Hesperides in guarding the miracle tree at the behest of Hera. Heracles should procure these apples as the 11th of his 12 tasks. As is common in legends there are several versions, but in each he managed to defeat or trick Ladon. For example, Heracles supposedly asked the Titan Atlas for help. As the father of the Hesperides, he allegedly had no problems in obtaining the apples. In a roundabout way the fruits ended up back in their rightful place and Ladon was set at the sky in gratitude for his services.
Draco is the scent of the Luna series which has not made it easy for me to put it in words because it is very volatile and quiet on my skin. There is the smell of freshly grated citrus peel, which converts into very tame flower tones. A fresh morning breeze in the garden of the senses while the nymphs are singing and dancing around the flowers. Towards the end with sweet notes of seductive fruits which probably anesthetized the dragon so much that he has hardly resisted. I like the smell of it as such, but it may be that it did not have the opportunity to fully develop on my skin. My parallel test with the paper allows me only a longer perception, but not finding a significant change in the odor. Draco just stays quiet, tame and fleeting for me. I think it's sort of sad here because I could have easily liked it even better than Andromeda. But maybe others have the opportunity to fight a prolonged battle with the dragon before it surrenders.
Write the first Review for Draco!


text:
Home » Feature » Latest News in Nigeria » 10 Major events that shook Nigeria in 2019
10 Major events that shook Nigeria in 2019
9:53 AM Motunrayo Ogundipe Feature, Latest News in Nigeria
Year 2019 was a very eventful year for Nigeria as a country. It was a year the country experienced unforgettable events among which shook it to its very foundations. Some of the events are here brought back to readers' memory:
1. Vice President Osinbajo's copter crash: What would have been a day of national mourning, by sheer providence, turned into a moment of excitement, singing, dancing and praising of God by Nigerians when the number two citizen in the country, Vice President Yemi Osinbajo survived an air crash for the second time. Osinbajo and few of his aides were on election campaign visit to Kogi State on February 3 when his helicopter crash-landed in Kabba. Undeterred, the VP who was unhurt alongside his aides, continued the campaign trail for his party, the All Progressives Congress (APC).
The first incident was in June 2017 when he went to Gwagawalada Area Council, Abuja FCT to attend graduation of 40 senior officers of the Nigeria Customs Service. The chopper he was traveling in crash-landed shortly after take-off. He was unhurt. These two similar events earned him the sobriquet "Ojabo koku" (One who fell from up without dying) among his Yoruba kinsmen.
2. 2019 General Elections: The elections were held across the country between February 23 and March 16, with the presidential being expectedly the most acrimonious. As a matter of fact, the kind of gang up against the incumbent President Muhammadu Buhari overtly staged by various categories of people mostly from the opposition camp, some former leaders, religious leaders mostly from the Christendom, and corrupt politicians who were choking under his anti-corruption crusades had never been witnessed in the chequered history of Nigeria.
It started with former President Olusegun Obasanjo, leading a revolt against the government, as he had done to every government that has ruled Nigeria, except his own. Other disgruntled elements who could not wait to see Buhari's back, for various reasons, seized the opportunity to join the wagon kick-started by the former President. Even the main opposition party's presidential candidate, Alhaji Atiku Abubakar, whose image, had in the past been ruined by Obasanjo, in his desperation to clinch the position of number one citizen, swallowed all the bitter pills Obasanjo had rammed down his throat and went back to his traducer like a prodigal son, giving effect to the saying: 'the enemy of my enemy is my friend'. Obasanjo also reciprocated by going back to his own vomit, asking Nigerians to vote for the same man he had warned the people to steer clear of. Primordial sentiments capable of destabilizing the country such as ethnicity and religion were employed by the opposition camp as tools of campaign. It got to a point that fear that the country was going to break up was palpable.
In the end, Mr. Buhari triumphed as he defeated his closest rival Atiku Abubakar with a wide margin of almost 4 million votes. Muhammadu Buhari of the All Progressives Congress (APC) won 15,191,847 votes, while Atiku Abubakar of the People's Democratic Party (PDP) got 11,262,978 votes.
The legal tussle and razzmatazz that followed the results' announcement got finally settled by judgment of the apex court on October 30 which affirmed Buhari's victory.
3. EFCC's onslaught against Yahoo boys: An aspect where the country's anti-corruption agency, the Economic and Financial Crimes Commission (EFCC) made record achievement to the relief and excitement of majority of Nigerians aside catching some hitherto untouchable big thieves such as former governors and making them to cool off in jail, was busting of the most lethal industry of fraud- the cybercrime called 'yahoo yahoo'. Multitude of the yahoo boys, who on daily basis wrecked life out of hardworking citizens and foreigners alike, were rounded up this year and made to face the music.
The cases were too many that the year 2019 can correctly be dubbed 'yahoo gangs bursting year', because hardly would a weak pass without at least a gang being busted by operatives of the EFCC. Few of the major arrests published at various times in the year are here catalogued:
– March 26 six suspected yahoo boys were arrested in Ibadan, Oyo State, when operatives of the EFCC raided their hideout at the Kolapo Ishola Estate, Akobo area of the ancient city. Items recovered from the suspects include five different models of exotic cars, laptops, mobile phones.
– In May, the United States arrested 16 suspected internet fraudsters in several US cities, Canada and South Africa, majority of whom are Nigerians.
– On Wednesday 3 April, the Ibadan zonal office of EFCC arrested 11 suspected 'Yahoo-Yahoo Boys'. Six of them were arrested at 2nd Pipeline, Ologunerun, Ibadan, while the other five were picked up at a location in Ijebu-Remo, Ogun State. Same day, the Oyo State special security outfit, Operation Burst, paraded two suspected yahoo boys after a woman jumped from a two-storey building in Ibadan, Oyo State to escape from Yahoo Boys who wanted to use her for ritual.
– On April 19, Police rescued a woman captured by Yahoo Boys for ritual in Asaba, Delta State.
– On April 25, Ibadan zonal office of the EFCC arrested 32 Yahoo Boys. Items recovered from them include six exotic cars, laptops, mobile phones, several documents containing false pretences and fetish objects.
– On May 1, South-east Zonal Office of the EFCC arrested 37 suspects in Owerri, the Imo State capital. The arrest followed a raid on some targeted residences in Okwu Urata, Aladinma and Egbu areas. Items including 25 exotic cars of different brands such as Mercedez-Benz, Lexus, Toyota and expensive mobile phones and laptop computers were recovered.
– On May 8, fifteen suspects between the ages of 18 and 30 were nabbed by the Port Harcourt Zonal Office of the EFCC in a late-evening raid on Blue Chip Hotels, Rumuigbo in Port Harcourt, Rivers State. Many laptop computers and phones were recovered from them.
– On May 17, The Abuja Zonal office of EFCC arrested ten suspects. 2 exotic cars 6 laptops, 10 smart phones and 1 international passport were recovered from them.
– On June 20, operatives of the Ibadan zonal office of EFCC arrested 31 suspects made up of 27 males and 4 females from their hideouts in Osogbo, the Osun State capital. Exotic cars of different brands, laptop computers and phones were also recovered from them.
– On July 10, thirty suspects aged between 18 and 27 were arrested when the Ibadan zonal office of EFCC raided some mansions in Ado-Ekiti, the Ekiti State capital. Eight exotic cars, laptops, mobile phones and several documents suspected to contain information used to access their victims were seized from them.
– On Sept.3, the Benin Zonal Office of the EFCC said it arrested no fewer than 133 internet fraud suspects in eight months through its 'Operation Re-wire'. The biggest of the arrested suspects was a woman, who allegedly worked in collaboration with foreign counterparts. She was said to have amassed a princely N656million through the illicit trade. Her arrest was made possible with the collaboration of FBI.
– On Sept. 9, Operatives of the EFCC Abuja and Ilorin Zonal Offices arrested 13 suspects in separate operations. As usual, exotic cars and other items were recovered.
– On Sept. 26 and 27, the EFCC arrested no fewer than 53 suspects in Lagos, Abuja and Enugu. Cars of different brands, laptop computers, phones and charms were recovered from them.
– On 14 October, a staggering figure of 94 suspects were arrested when operatives of the Ibadan zonal office of EFCC raided a night club notorious for hosting parties for suspected internet fraudsters in Osogbo. 19 exotic cars, laptops, scores of sophisticated mobile phones and other items were recovered from them.
– On Friday, Nov. 15, seven yahoo boys were sentenced to various jail terms by Justice Ibrahim Buba of the Federal High Court Enugu, Southeastern Nigeria.
– On December 4, again the Ibadan zonal office of EFCC raided a Lagos hotel believed to be a hideout for internet fraudsters and arrested a suspected internet fraud kingpin, Rasaq Balogun, and 26 others. Balogun's illicit activities dominated intelligence gathered from previously arrested 'police spies' during a raid on their Abeokuta base. According to findings, Balogun harboured an army of young men recruited to carry out financial frauds through the use of internet.
4. Shiite Protest: On Monday July 22, a protest by members of the Islamic Movement in Nigeria (IMN) otherwise known as Shiite in the Nigeria's capital of Abuja turned violent when the demonstrators clashed with security agents. Government vehicles including those owned by the emergency management agency were burnt by the aggrieved protesters. Many lives both of the Shi'ites, police officers and a young reporter undergoing the mandatory one year service under the National Youth Service Corps (NYSC) scheme, Precious Owolabi, were lost. Among the police officers who lost their lives in the violence was a deputy commissioner of police. It was alleged that the group threw petrol bombs as part of the protest. As a result, on the following Tuesday, the Inspector-General of Police (I-G), Mohammed Adamu ordered 24-hour surveillance on the Federal Capital Territory (FCT) and its environs.
The Monday incident followed a similar protest two weeks before when two Shiites were killed and two police officers injured at the National Assembly complex in Abuja. The Shiites were demanding release of their leader, Ibraheem El-Zakzaky, and his wife, Zeenah, who have been in detention since their arrest by Nigerian soldiers for alleged murder in December 2015. During the arrest, his house was raided by soldiers and hundreds of his followers, including three of his sons were killed.
5. Obinwanne Okeke: The most shocking of the cases of internet frauds was that of the 32-year old billionaire Obinwanne Okeke, Chairman, Invictus Group, who prior to his arrest by the FBI, had been celebrated by the world as a role model to African youths. He made the cover of Forbes Africa magazine in 2016 and was listed as one of Africa's Under 30s Most Promising Entrepreneurs. In December 2018, he was a guest speaker at TEDxYaba 2018, speaking on "the DNA of the Nigerian entrepreneur". His recommendation was considered very inspiring even to the most laid-back youth. Hear him: "The success of a business is largely dependent on you as the owner. If there is any part of you that appears to be a limitation, don't let it hold you back. Take deliberate steps to develop yourself to match your weakness, growth is continuous. Associate with people that will inspire you and are ready to support you. Develop these traits in the right proportion. Don't be afraid to fail, be afraid not to try. Go for it. Start Something Today!"
Therefore, it was an embarrassed world that received the shocking news on August 16 of his arrest by the FBI. He was discovered to have fleeced companies in US and UK of hundreds of millions of dollars through wire frauds.
6. Xenophobic attacks: The world was jolted in September when xenophobic attacks erupted again in South Africa with many nationals of African countries like Nigeria, Zambia, Gambia, etc lynched and their properties and businesses destroyed. The outraged world roundly condemned the acts of bestiality visited by South Africans on their fellow Africans. The unabated attacks on foreigners most of whom were Nigerians led to reprisal attacks on South African businesses in Nigeria. Such investments as the popular supermarket, Shoprite and the communication giant MTN Nigeria closed shop for days during the disturbance. Nigeria evacuated its stranded nationals from the hot land with assistance of Air peace Airline. It took strong messages and actions from notable leaders in the world and visit by Nigeria's President Muhammadu Buhari for the madness to stop. South African President Cyril Ramaphosa apologized to Nigeria.
7. '#RevolutionNow' and Sowore's arrest: Omoyele Sowore, activist, presidential candidate of the African Action Congress (AAC) in the 2019 election and publisher of Shahara Reporters, an online news publication known for its investigative activities, was arrested along with a colleague, Olawale Bakare, on August 3 ahead of a planned nationwide protest tagged #RevolutionNow and charged with conspiracy to commit treason. Sowore had previously led a demonstration where he called for a revolution in the country.
The video clip of the protest and his address went viral. The drama of his arrest; the granting of a bail with very stiff conditions; and the disobedience to court order by government months after meeting his bail conditions brought public opprobrium both from home and abroad on the Buhari administration. The outcry, especially from the international community, pressured the government to toe the line of reasoning by ordering his release from detention. He was therefore released on December 24, 2019 alongside former National Security Adviser, Retired Colonel Sambo Dasuki who had been in detention since December 2015 over an alleged laundering of $2.1billion money meant for arms purchase during the administration of former President Goodluck Jonathan.
8. Sex-for-grades: The menace was very rampant in 2019. Very many cases were recorded in the year. The biggest incident being an undercover investigation carried out, for more than a year, by the BBC on some randy university lecturers in Nigeria and Ghana. Its video, at conclusion of the investigation, was released on the BBC Africa Eye on Monday October 7. The video revealed a senior lecturer known as Dr Boniface Igbeneghu from the faculty of Arts, a former sub – dean in the University of Lagos (UNILAG) and the head of a local Foursquare Gospel Church harassing a female student sexually, promising good grades in return. Boniface was caught on camera telling his victim to "Switch off the light, lock the door and I'll kiss you for one minute".
Several students had alleged that they had been harassed by Dr Boniface, which made BBC send an undercover journalist to him, posing as a 17-year old secondary school graduate seeking admission, a trick he fell flat for. The University of Lagos (UNILAG) and Foursquare Gospel Church subsequently suspended him. Another lecturer of the university caught in the documentary was Samuel Oladipo, a lecturer in the department of economics. He was also suspended.
Taiwo Oloyede, Principal Assistant Registrar, communication unit of UNILAG on Wednesday 9 October confirmed that the university's panel headed by Ayodele Atsenuwa, a professor and dean of the faculty of law, had suspended the two randy lecturers. The University of Ghana also suspended two of its own indicted by the famous documentary. The two lecturers are Professor Ransford Gyampo and Dr Paul Kwame Butakor.
Again on Wednesday November 13, Vice Chancellor of the Ignatius Ajuru University of Education, Port Harcourt, Prof. Ozo-Mekuri Ndimele, disclosed that a lecturer had been dismissed, while 10 others were suspended over the allegation of demanding cash or sex for grades from desperate students in the university. He made the disclosure when the Rivers State House of Assembly committee on Education led by Christian Ahiakwo visited the institution as part oversight function. These incessant cases have led the National Assembly to propose an Anti-Sexual Harassment Bill aimed at deterring and punishing offenders. The bill sponsored by Deputy Senate President Ovie Omo-Agege seeks to jail a lecturer for up to two years if he or she winks at or touches a student in an inappropriate way. In the case of sex with minors, even if the student consents to it or lures the lecturer into it, the lecturer is liable.
9. President Buhari's phantom marriage: On October 11, the news spread across the length and breadth of Nigeria like wild fire in harmattan that the Nigeria's number one citizen who was less than 4 years away from age 80 had decided to marry one of his younger ministers, Sadiya Farouq, as second wife. A wedding invitation card with photograph of the President and that of the 45-year old Minister of Humanitarian Affairs, Disaster Management & Social Development standing by each other accompanied the fake news published by some mischief makers on social media.
Absence of immediate denial from both the number one family and the concerned woman helped to keep flame the rumour blazing across the country. It took days before Nigerians realize it was a hoax.
10. Anthony Joshua: On Saturday December 7 the Nigerian-born British boxer Anthony Oluwafemi Olaseni Joshua ended major events of 2019 on a happy note for Nigeria when he became a two-time world heavyweight champion following his victory over the Mexican-American Andy Ruiz Jr in a tense rematch in Diriyah, Riyadh, Saudi Arabia. He had lost the belt to Ruiz in June. He outclassed Ruiz to score a unanimous points victory to regain his IBF, WBA and WBO titles in emphatic fashion. He dominated the match from the onset. Dubbed the "Clash on the Dunes", the eagerly anticipated rematch marked the first time a world heavyweight title fight has ever been staged in Saudi Arabia. It was clearly a classic win.
The 2012 Olympic champion revealed he had adapted his style after June's loss to Ruiz for the first time in his career. It was a moment of excitement for all Nigerians both at home and abroad with President Muhammadu Buhari leading the pack of notable figures who showered encomiums on the awesome pugilist. Joshua is a British boxer with Nigerian roots. His both parents are from Ogun State, Southwest Nigeria. He visited Nigeria in July and spent weeks before returning to the UK. He was born on 15 October 1989, and has, since the sweet victory, been ranked as the world's best active heavyweight by BoxRec.


AJW takes full control of all removed material from a customer's engine post shop visit and evaluates the potential for recovery, upgrade and saleability.
If the material can be salvaged by repair, or upgrade, AJW will then sell the part into the market on behalf of the material owner on a split consignment basis.
The objective is to maximise revenue gained through selling a repaired part which was either in an unserviceable condition, a line replacement item, or redundant due to modification, and (in most instances) originally planned to be discarded by material owner or MRO.
Find out how much money we could make you. Complete the enquiry form and a member of our team will be in touch.


BIRMINGHAM, Alabama – WikiLeaks founder Julian Assange was arrested at a hotel outside of Birmingham, Alabama following the NTT Indycar Series round at Barber Motorsports Park. Since 2010 the United States government has searched for Assange to arrest him with charges for hacking the FIA's data warehouse where all driver ranking and BoP data is kept. The manhunt finally came to an end on Thursday morning when the FBI got a tip that for years Assange had been hiding in plain sight as he posed as David Letterman, co-owner of Indycar team Rahal Letterman Lanigan Racing.
Assange is facing up to 30 years in prison for hacking and imitating a former talk show host.
Next Next post: Commentary: Ignore The Dude That Died And Dozen People Injured, Some Old Cars Were Destroyed!


"worth confident" or "confident worth"
Thread: "worth confident" or "confident worth"
When indicating something worth enough, where must we put "worth" before or after the word meriting be worth? Is there any kind of exceptions, rules?
Re: "worth confident" or "confident worth"
That job is not worth the hassle.
That vase is not worth two hundred dollars.
or are you talking about worthy or worthiness?
Please give sample sentences. English is too complex to figure out word by word. We must see the context of your questions!!
For instance, I read that a book is "worth reading" meaning this book is good to spend time in it, but what I ask is if is there a rule that put worth always before, or can we put it after the word. I don't know but it sounds better to say confident worth that worth confident. Maybe none of them are correct because confident is an adjective. DO you know the rule applying worth? Confident worth is for "something you can trust in"
There is little worth in failing to complete your homework.
What greater worth is there than to be well-educated?
The answer is that you can do both, depending on the context and what you intend to say.
I don't quite see how you can use "worth" and "confident" together. What is your sentence using them?
Your confusion is due to worth being both a noun and an intransitive verb.
The worth of something is about its value, in money, quality, merit or importance. So a book is worth reading because it is a good read, interesting read or simply enjoyable.
The worth of this book lies in its subtle use of words.
The worth of this book is in the confidence it gives to the reader.
I've used "Confident worth" in the sense of something or someone susceptible of being trusted enough. It seems this is not a possible way of saying in English. Isn't it?
So it seems worth is followed only by werbs in gerund, not by adjectives or nouns. Am I right?
That worker is very good and is worth double pay.
Would it be worth my time to go there?
So, to call it a day, would it be correct to say "worth confident" in the sense of something or someone which/who you can trust in?
No - you can say "worth [our/my] confidence".


Project ID: # freelancers are bidding on average 6/hour for this job 8 USD / hour (8 Reviews).9 6 USD / hour (3 Reviews).0 5 USD / hour (0 Reviews).0 5 USD / hour (0 Reviews).0 8 USD / hour (0.Gujarati To English..
Cerca e salva idee su Bygga sängstomme förvaring su Pinterest.Vill du utnyttja golvytan effektivt och få mer valuta för pengarna.Perfekt för trånga utrymmen, och du får egen design.Detta är en samling av rätta lott bingolott möbler från Resource Möbler, ett företag som strävar..
We are engaged on the issue and committed to looking at options that support our full range of digital offerings to the EU market.Sign up for a Monster account, and we'll send jobs and job-search advice right to your inbox.We continue to identify..
Read more, date: November 10, 2018, freaky Aces Casino is giving 40 FS on 4 of Kings No Deposit Bonus casino cherry bar code: frqbkis (valid until.
Claiming No Deposit Bonus Codes, as you probably already know, not all casinos are the same.
Wagering Your No Deposit Bonus.
Most of the bonuses may only be wagered on online slots, but some also allow you to play specialty games or some table games, new uk casino 2018 no deposit bonus as well.It's a clever way to lure us back to the site time and time again.Even though this might seem as a pointless hassle, it can actually save you a lot of time and money in the future.Some of these new casino and bingo sites offer new players a no deposit bonus to try their games while others feature a first deposit welcome bonus.You'll also want to peruse the comments for key information regarding the codes or general comments from other members.However, some may require you to talk to support in order to claim your coupon code.If one of the no deposit bonuses has no code next to it, you dont have to enter one at all.Many require that you use a promo code.Keep in mind that no deposit bonuses usually come with high wagering requirements that need to be completed before you can cash out any of your winnings.So whether it's bonus funds or free spins, we've got all the latest and greatest offers from all your favorite casinos right here.So, be careful and always remember to check the wagering before claiming a bonus.
As such, we want to provide our readers with the opportunity to try out as many no deposit bonuses as possible.
The newest online casino releases this year.Our most recent online casino or bingo addition is at the top of the list.Let's start at the beginning.Paradise Win Casino is giving 50 FS on Macarons Bonus code: pwqbmnb (valid until ) Bonus type:.Date: November 10, 2018, fair Go Casino is giving away 10 FS Bonus Code on Plentiful Treasure 350 Bonus 100.Check back here daily for new bonuses, and while you're here, why not help each other out?No deposit bonuses are free bonuses that online casinos usually greet their new players with.Speaking of searching, use the handy filters below to narrow down the codes by casino, software, geographical location, month and bonus type.Types of No Deposit Bonuses, typically a sign up bonus only works if you havent deposited at the online casino before.We have put together a list of the newest online casinos and bingo sites added to our online casino bonus guide.
Uptown Aces Casino is giving away 10 FS 350 Bonus 35 FS 10 No Deposit Free.