Adam Unress delivered his resignation Friday to head coach Bill Fennelly, who accepted after an afternoon of internal debate.
AMES, Ia. — A member of the Iowa State women's basketball staff has resigned Friday afternoon after he sent a string of insulting and occasionally profane private messages to an Iowa high school basketball player on Twitter.
Adam Urness, the Cyclones' coordinator of player development, resigned Friday afternoon after his messages to Rhett Darland, a boys' basketball senior at Clarion-Goldfield-Dows, became public.
"Iowa State Coordinator of Player Development Adam Urness tendered his resignation this afternoon after practice, and I have accepted his resignation," Iowa State coach Bill Fennelly said in a statement issued by the school.
The conversation stemmed from Urness claiming that Darland had not broken the school's single-game scoring record Tuesday night.
Urness, who according to Simpson Athletics' website is from Clarion, sent the high school player a message over social media showing a list of Clarion-Goldfield players who had scored more points than Darland, according to information first obtained by the Iowa State Daily.
Urness proceeded to send Darland more messages, however, including one that called Darland a profane name.
"Your reputation as an individual speaks for itself, trust me, THROUGHOUT the basketball coaching community. You are a disgrace to Clarion-Goldfield basketball. Glad you could finally hit a shot though. :) Fraud," Urness said in one of the messages to Darland, according to screenshots posted of the exchange.
Urness tweeted Friday morning that he made a mistake and that he apologized to Darland his family.
"I made a mistake and I hope to move forward from this and use it as a learning opportunity," Urness wrote.
During a pre-practice interview with The Register early Friday afternoon, Fennelly initially said that he would stand by Urness when the assistant had first offered to resign.
"At the end of the day, it was my decision that we were not going to terminate him," Fennelly said Friday. "He understands what he did was completely wrong, unprofessional — fill in the blank. He got one of my speeches that the players usually get."
Yet within a few hours, Iowa State announced that Urness has resigned.
Fennelly could not be immediately reached following the release of the statement Friday to explain why he later decided to accept Urness' resignation.
Urness joined ISU women's basketball staff in 2016, according to the school's website. He was an assistant coach at Simpson College for two seasons prior to that.
Darland, as it stands, broke the Clarion-Goldfield-Dows record, not the Clarion-Goldfield record, according to Reese Morris, Darland's brother, who spoke with the Daily on Wednesday. The Clarion-Goldfield and Dows school districts began a sharing arrangement starting in the 2014-15 school year, when the district formally became known as Clarion-Goldfield-Dows.


text:
package org.apache.spark.sql.streaming

import java.util.Locale

import org.scalatest.BeforeAndAfter
import org.scalatest.matchers.must.Matchers

import org.apache.spark.internal.Logging
import org.apache.spark.sql.{AnalysisException, Column, DataFrame, Encoder, Encoders}
import org.apache.spark.sql.execution.streaming.MemoryStream
import org.apache.spark.sql.execution.streaming.state.{HDFSBackedStateStoreProvider, RocksDBStateStoreProvider}
import org.apache.spark.sql.expressions.Aggregator
import org.apache.spark.sql.functions._
import org.apache.spark.sql.internal.SQLConf

class StreamingSessionWindowSuite extends StreamTest
  with BeforeAndAfter with Matchers with Logging {

  import testImplicits._

  after {
    sqlContext.streams.active.foreach(_.stop())
  }

  def testWithAllOptions(name: String, confPairs: (String, String)*)
    (func: => Any): Unit = {
    val mergingSessionOptions = Seq(true, false).map { value =>
      (SQLConf.STREAMING_SESSION_WINDOW_MERGE_SESSIONS_IN_LOCAL_PARTITION.key, value)
    }
    val providerOptions = Seq(
      classOf[HDFSBackedStateStoreProvider].getCanonicalName,
      classOf[RocksDBStateStoreProvider].getCanonicalName
    ).map { value =>
      (SQLConf.STATE_STORE_PROVIDER_CLASS.key, value.stripSuffix("$"))
    }

    val availableOptions = for (
      opt1 <- mergingSessionOptions;
      opt2 <- providerOptions
    ) yield (opt1, opt2)

    for (option <- availableOptions) {
      test(s"$name - merging sessions in local partition: ${option._1._2} / " +
        s"provider: ${option._2._2}") {
        withSQLConf(confPairs ++
          Seq(
            option._1._1 -> option._1._2.toString,
            option._2._1 -> option._2._2): _*) {
          func
        }
      }
    }
  }

  testWithAllOptions("complete mode - session window") {
    // Implements StructuredSessionization.scala leveraging "session" function
    // as a test, to verify the sessionization works with simple example

    // note that complete mode doesn't honor watermark: even it is specified, watermark will be
    // always Unix timestamp 0

    val inputData = MemoryStream[(String, Long)]
    val sessionUpdates = sessionWindowQuery(inputData)

    testStream(sessionUpdates, OutputMode.Complete())(
      AddData(inputData,
        ("hello world spark streaming", 40L),
        ("world hello structured streaming", 41L)
      ),
      CheckNewAnswer(
        ("hello", 40, 51, 11, 2),
        ("world", 40, 51, 11, 2),
        ("streaming", 40, 51, 11, 2),
        ("spark", 40, 50, 10, 1),
        ("structured", 41, 51, 10, 1)
      ),

      // placing new sessions "before" previous sessions
      AddData(inputData, ("spark streaming", 25L)),
      CheckNewAnswer(
        ("spark", 25, 35, 10, 1),
        ("streaming", 25, 35, 10, 1),
        ("hello", 40, 51, 11, 2),
        ("world", 40, 51, 11, 2),
        ("streaming", 40, 51, 11, 2),
        ("spark", 40, 50, 10, 1),
        ("structured", 41, 51, 10, 1)
      ),

      // concatenating multiple previous sessions into one
      AddData(inputData, ("spark streaming", 30L)),
      CheckNewAnswer(
        ("spark", 25, 50, 25, 3),
        ("streaming", 25, 51, 26, 4),
        ("hello", 40, 51, 11, 2),
        ("world", 40, 51, 11, 2),
        ("structured", 41, 51, 10, 1)
      ),

      // placing new sessions after previous sessions
      AddData(inputData, ("hello apache spark", 60L)),
      CheckNewAnswer(
        ("spark", 25, 50, 25, 3),
        ("streaming", 25, 51, 26, 4),
        ("hello", 40, 51, 11, 2),
        ("world", 40, 51, 11, 2),
        ("structured", 41, 51, 10, 1),
        ("hello", 60, 70, 10, 1),
        ("apache", 60, 70, 10, 1),
        ("spark", 60, 70, 10, 1)
      ),

      AddData(inputData, ("structured streaming", 90L)),
      CheckNewAnswer(
        ("spark", 25, 50, 25, 3),
        ("streaming", 25, 51, 26, 4),
        ("hello", 40, 51, 11, 2),
        ("world", 40, 51, 11, 2),
        ("structured", 41, 51, 10, 1),
        ("hello", 60, 70, 10, 1),
        ("apache", 60, 70, 10, 1),
        ("spark", 60, 70, 10, 1),
        ("structured", 90, 100, 10, 1),
        ("streaming", 90, 100, 10, 1)
      )
    )
  }

  // Logic is the same as `complete mode - session window`
  // just with a more complex key
  testWithAllOptions("complete mode - session window - nested tuple key") {
    val inputData = MemoryStream[(String, Long)]
    val sessionUpdates = sessionWindowQueryNestedKey(inputData)

    testStream(sessionUpdates, OutputMode.Complete())(
      AddData(
        inputData,
        ("hello world spark streaming", 40L),
        ("world hello structured streaming", 41L)),
      CheckNewAnswer(
        ((("hello", "hello"), "hello"), 40, 51, 11, 2),
        ((("world", "world"), "world"), 40, 51, 11, 2),
        ((("streaming", "streaming"), "streaming"), 40, 51, 11, 2),
        ((("spark", "spark"), "spark"), 40, 50, 10, 1),
        ((("structured", "structured"), "structured"), 41, 51, 10, 1)),
      // placing new sessions "before" previous sessions
      AddData(inputData, ("spark streaming", 25L)),
      CheckNewAnswer(
        ((("spark", "spark"), "spark"), 25, 35, 10, 1),
        ((("streaming", "streaming"), "streaming"), 25, 35, 10, 1),
        ((("hello", "hello"), "hello"), 40, 51, 11, 2),
        ((("world", "world"), "world"), 40, 51, 11, 2),
        ((("streaming", "streaming"), "streaming"), 40, 51, 11, 2),
        ((("spark", "spark"), "spark"), 40, 50, 10, 1),
        ((("structured", "structured"), "structured"), 41, 51, 10, 1)),
      // concatenating multiple previous sessions into one
      AddData(inputData, ("spark streaming", 30L)),
      CheckNewAnswer(
        ((("spark", "spark"), "spark"), 25, 50, 25, 3),
        ((("streaming", "streaming"), "streaming"), 25, 51, 26, 4),
        ((("hello", "hello"), "hello"), 40, 51, 11, 2),
        ((("world", "world"), "world"), 40, 51, 11, 2),
        ((("structured", "structured"), "structured"), 41, 51, 10, 1)),
      // placing new sessions after previous sessions
      AddData(inputData, ("hello apache spark", 60L)),
      CheckNewAnswer(
        ((("spark", "spark"), "spark"), 25, 50, 25, 3),
        ((("streaming", "streaming"), "streaming"), 25, 51, 26, 4),
        ((("hello", "hello"), "hello"), 40, 51, 11, 2),
        ((("world", "world"), "world"), 40, 51, 11, 2),
        ((("structured", "structured"), "structured"), 41, 51, 10, 1),
        ((("hello", "hello"), "hello"), 60, 70, 10, 1),
        ((("apache", "apache"), "apache"), 60, 70, 10, 1),
        ((("spark", "spark"), "spark"), 60, 70, 10, 1)),
      AddData(inputData, ("structured streaming", 90L)),
      CheckNewAnswer(
        ((("spark", "spark"), "spark"), 25, 50, 25, 3),
        ((("streaming", "streaming"), "streaming"), 25, 51, 26, 4),
        ((("hello", "hello"), "hello"), 40, 51, 11, 2),
        ((("world", "world"), "world"), 40, 51, 11, 2),
        ((("structured", "structured"), "structured"), 41, 51, 10, 1),
        ((("hello", "hello"), "hello"), 60, 70, 10, 1),
        ((("apache", "apache"), "apache"), 60, 70, 10, 1),
        ((("spark", "spark"), "spark"), 60, 70, 10, 1),
        ((("structured", "structured"), "structured"), 90, 100, 10, 1),
        ((("streaming", "streaming"), "streaming"), 90, 100, 10, 1)))
  }

  // Logic is the same as `complete mode - session window`
  // just with a more complex key
  testWithAllOptions("complete mode - session window - multiple col key") {
    val inputData = MemoryStream[(String, Long)]
    val sessionUpdates = sessionWindowQueryMultiColKey(inputData)

    testStream(sessionUpdates, OutputMode.Complete())(
      AddData(
        inputData,
        ("hello world spark streaming", 40L),
        ("world hello structured streaming", 41L)),
      CheckNewAnswer(
        (("hello", "hello"), "hello", 40, 51, 11, 2),
        (("world", "world"), "world", 40, 51, 11, 2),
        (("streaming", "streaming"), "streaming", 40, 51, 11, 2),
        (("spark", "spark"), "spark", 40, 50, 10, 1),
        (("structured", "structured"), "structured", 41, 51, 10, 1)),
      // placing new sessions "before" previous sessions
      AddData(inputData, ("spark streaming", 25L)),
      CheckNewAnswer(
        (("spark", "spark"), "spark", 25, 35, 10, 1),
        (("streaming", "streaming"), "streaming", 25, 35, 10, 1),
        (("hello", "hello"), "hello", 40, 51, 11, 2),
        (("world", "world"), "world", 40, 51, 11, 2),
        (("streaming", "streaming"), "streaming", 40, 51, 11, 2),
        (("spark", "spark"), "spark", 40, 50, 10, 1),
        (("structured", "structured"), "structured", 41, 51, 10, 1)),
      // concatenating multiple previous sessions into one
      AddData(inputData, ("spark streaming", 30L)),
      CheckNewAnswer(
        (("spark", "spark"), "spark", 25, 50, 25, 3),
        (("streaming", "streaming"), "streaming", 25, 51, 26, 4),
        (("hello", "hello"), "hello", 40, 51, 11, 2),
        (("world", "world"), "world", 40, 51, 11, 2),
        (("structured", "structured"), "structured", 41, 51, 10, 1)),
      // placing new sessions after previous sessions
      AddData(inputData, ("hello apache spark", 60L)),
      CheckNewAnswer(
        (("spark", "spark"), "spark", 25, 50, 25, 3),
        (("streaming", "streaming"), "streaming", 25, 51, 26, 4),
        (("hello", "hello"), "hello", 40, 51, 11, 2),
        (("world", "world"), "world", 40, 51, 11, 2),
        (("structured", "structured"), "structured", 41, 51, 10, 1),
        (("hello", "hello"), "hello", 60, 70, 10, 1),
        (("apache", "apache"), "apache", 60, 70, 10, 1),
        (("spark", "spark"), "spark", 60, 70, 10, 1)),
      AddData(inputData, ("structured streaming", 90L)),
      CheckNewAnswer(
        (("spark", "spark"), "spark", 25, 50, 25, 3),
        (("streaming", "streaming"), "streaming", 25, 51, 26, 4),
        (("hello", "hello"), "hello", 40, 51, 11, 2),
        (("world", "world"), "world", 40, 51, 11, 2),
        (("structured", "structured"), "structured", 41, 51, 10, 1),
        (("hello", "hello"), "hello", 60, 70, 10, 1),
        (("apache", "apache"), "apache", 60, 70, 10, 1),
        (("spark", "spark"), "spark", 60, 70, 10, 1),
        (("structured", "structured"), "structured", 90, 100, 10, 1),
        (("streaming", "streaming"), "streaming", 90, 100, 10, 1)))
  }

  testWithAllOptions("complete mode - session window - no key") {
    // complete mode doesn't honor watermark: even it is specified, watermark will be
    // always Unix timestamp 0

    val inputData = MemoryStream[Int]
    val windowedAggregation = sessionWindowQueryOnGlobalKey(inputData)

    val e = intercept[StreamingQueryException] {
      testStream(windowedAggregation, OutputMode.Complete())(
        AddData(inputData, 40),
        CheckAnswer() // this is just to trigger the exception
      )
    }
    Seq("Global aggregation with session window", "not supported").foreach { m =>
      assert(e.getMessage.toLowerCase(Locale.ROOT).contains(m.toLowerCase(Locale.ROOT)))
    }
  }

  testWithAllOptions("append mode - session window") {
    // Implements StructuredSessionization.scala leveraging "session" function
    // as a test, to verify the sessionization works with simple example

    val inputData = MemoryStream[(String, Long)]
    val sessionUpdates = sessionWindowQuery(inputData)

    testStream(sessionUpdates, OutputMode.Append())(
      AddData(inputData,
        ("hello world spark streaming", 40L),
        ("world hello structured streaming", 41L)
      ),

      // watermark: 11
      // current sessions
      // ("hello", 40, 51, 11, 2),
      // ("world", 40, 51, 11, 2),
      // ("streaming", 40, 51, 11, 2),
      // ("spark", 40, 50, 10, 1),
      // ("structured", 41, 51, 10, 1)
      CheckNewAnswer(
      ),

      // placing new sessions "before" previous sessions
      AddData(inputData, ("spark streaming", 25L)),
      // watermark: 11
      // current sessions
      // ("spark", 25, 35, 10, 1),
      // ("streaming", 25, 35, 10, 1),
      // ("hello", 40, 51, 11, 2),
      // ("world", 40, 51, 11, 2),
      // ("streaming", 40, 51, 11, 2),
      // ("spark", 40, 50, 10, 1),
      // ("structured", 41, 51, 10, 1)
      CheckNewAnswer(
      ),

      // late event which session's end 10 would be later than watermark 11: should be dropped
      AddData(inputData, ("spark streaming", 0L)),
      // watermark: 11
      // current sessions
      // ("spark", 25, 35, 10, 1),
      // ("streaming", 25, 35, 10, 1),
      // ("hello", 40, 51, 11, 2),
      // ("world", 40, 51, 11, 2),
      // ("streaming", 40, 51, 11, 2),
      // ("spark", 40, 50, 10, 1),
      // ("structured", 41, 51, 10, 1)
      CheckNewAnswer(
      ),
      assertNumRowsDroppedByWatermark(2),

      // concatenating multiple previous sessions into one
      AddData(inputData, ("spark streaming", 30L)),
      // watermark: 11
      // current sessions
      // ("spark", 25, 50, 25, 3),
      // ("streaming", 25, 51, 26, 4),
      // ("hello", 40, 51, 11, 2),
      // ("world", 40, 51, 11, 2),
      // ("structured", 41, 51, 10, 1)
      CheckNewAnswer(
      ),

      // placing new sessions after previous sessions
      AddData(inputData, ("hello apache spark", 60L)),
      // watermark: 30
      // current sessions
      // ("spark", 25, 50, 25, 3),
      // ("streaming", 25, 51, 26, 4),
      // ("hello", 40, 51, 11, 2),
      // ("world", 40, 51, 11, 2),
      // ("structured", 41, 51, 10, 1),
      // ("hello", 60, 70, 10, 1),
      // ("apache", 60, 70, 10, 1),
      // ("spark", 60, 70, 10, 1)
      CheckNewAnswer(
      ),

      AddData(inputData, ("structured streaming", 90L)),
      // watermark: 60
      // current sessions
      // ("hello", 60, 70, 10, 1),
      // ("apache", 60, 70, 10, 1),
      // ("spark", 60, 70, 10, 1),
      // ("structured", 90, 100, 10, 1),
      // ("streaming", 90, 100, 10, 1)
      CheckNewAnswer(
        ("spark", 25, 50, 25, 3),
        ("streaming", 25, 51, 26, 4),
        ("hello", 40, 51, 11, 2),
        ("world", 40, 51, 11, 2),
        ("structured", 41, 51, 10, 1)
      )
    )
  }

  testWithAllOptions("SPARK-36465: dynamic gap duration") {
    val inputData = MemoryStream[(String, Long)]

    val udf = spark.udf.register("gapDuration", (s: String) => {
      if (s == "hello") {
        "1 second"
      } else if (s == "structured") {
        // zero gap duration will be filtered out from aggregation
        "0 second"
      } else if (s == "world") {
        // negative gap duration will be filtered out from aggregation
        "-10 seconds"
      } else {
        "10 seconds"
      }
    })

    val sessionUpdates = sessionWindowQuery(inputData,
      session_window($"eventTime", udf($"sessionId")))

    testStream(sessionUpdates, OutputMode.Append())(
      AddData(inputData,
        ("hello world spark streaming", 40L),
        ("world hello structured streaming", 41L)
      ),

      // watermark: 11
      // current sessions
      // ("hello", 40, 42, 2, 2),
      // ("streaming", 40, 51, 11, 2),
      // ("spark", 40, 50, 10, 1),
      CheckNewAnswer(
      ),

      // placing new sessions "before" previous sessions
      AddData(inputData, ("spark streaming", 25L)),
      // watermark: 11
      // current sessions
      // ("spark", 25, 35, 10, 1),
      // ("streaming", 25, 35, 10, 1),
      // ("hello", 40, 42, 2, 2),
      // ("streaming", 40, 51, 11, 2),
      // ("spark", 40, 50, 10, 1),
      CheckNewAnswer(
      ),

      // late event which session's end 10 would be later than watermark 11: should be dropped
      AddData(inputData, ("spark streaming", 0L)),
      // watermark: 11
      // current sessions
      // ("spark", 25, 35, 10, 1),
      // ("streaming", 25, 35, 10, 1),
      // ("hello", 40, 42, 2, 2),
      // ("streaming", 40, 51, 11, 2),
      // ("spark", 40, 50, 10, 1),
      CheckNewAnswer(
      ),
      assertNumRowsDroppedByWatermark(2),

      // concatenating multiple previous sessions into one
      AddData(inputData, ("spark streaming", 30L)),
      // watermark: 11
      // current sessions
      // ("spark", 25, 50, 25, 3),
      // ("streaming", 25, 51, 26, 4),
      // ("hello", 40, 42, 2, 2),
      CheckNewAnswer(
      ),

      // placing new sessions after previous sessions
      AddData(inputData, ("hello apache spark", 60L)),
      // watermark: 30
      // current sessions
      // ("spark", 25, 50, 25, 3),
      // ("streaming", 25, 51, 26, 4),
      // ("hello", 40, 42, 2, 2),
      // ("hello", 60, 61, 1, 1),
      // ("apache", 60, 70, 10, 1),
      // ("spark", 60, 70, 10, 1)
      CheckNewAnswer(
      ),

      AddData(inputData, ("structured streaming", 90L)),
      // watermark: 60
      // current sessions
      // ("hello", 60, 61, 1, 1),
      // ("apache", 60, 70, 10, 1),
      // ("spark", 60, 70, 10, 1),
      // ("streaming", 90, 100, 10, 1)
      CheckNewAnswer(
        ("spark", 25, 50, 25, 3),
        ("streaming", 25, 51, 26, 4),
        ("hello", 40, 42, 2, 2)
      )
    )
  }

  // Logic is the same as `SPARK-36465: dynamic gap duration`
  // just with a more complex key
  testWithAllOptions("dynamic gap duration - nested tuple key") {
    val inputData = MemoryStream[(String, Long)]

    val udf = spark.udf.register(
      "gapDuration",
      (s: ((String, String), String)) => {
        if (s == (("hello", "hello"), "hello")) {
          "1 second"
        } else if (s == (("structured", "structured"), "structured")) {
          // zero gap duration will be filtered out from aggregation
          "0 second"
        } else if (s == (("world", "world"), "world")) {
          // negative gap duration will be filtered out from aggregation
          "-10 seconds"
        } else {
          "10 seconds"
        }
      })

    val sessionUpdates =
      sessionWindowQueryNestedKey(inputData, session_window($"eventTime", udf($"sessionId")))

    testStream(sessionUpdates, OutputMode.Append())(
      AddData(
        inputData,
        ("hello world spark streaming", 40L),
        ("world hello structured streaming", 41L)),
      CheckNewAnswer(),
      // placing new sessions "before" previous sessions
      AddData(inputData, ("spark streaming", 25L)),
      CheckNewAnswer(),
      // late event which session's end 10 would be later than watermark 11: should be dropped
      AddData(inputData, ("spark streaming", 0L)),
      CheckNewAnswer(),
      assertNumRowsDroppedByWatermark(2),
      // concatenating multiple previous sessions into one
      AddData(inputData, ("spark streaming", 30L)),
      CheckNewAnswer(),
      // placing new sessions after previous sessions
      AddData(inputData, ("hello apache spark", 60L)),
      CheckNewAnswer(),
      AddData(inputData, ("structured streaming", 90L)),
      CheckNewAnswer(
        ((("spark", "spark"), "spark"), 25, 50, 25, 3),
        ((("streaming", "streaming"), "streaming"), 25, 51, 26, 4),
        ((("hello", "hello"), "hello"), 40, 42, 2, 2)))
  }

  // Logic is the same as `SPARK-36465: dynamic gap duration`
  // just with a more complex key
  testWithAllOptions("dynamic gap duration - multiple col key") {
    val inputData = MemoryStream[(String, Long)]

    val udf = spark.udf.register(
      "gapDuration",
      (s1: (String, String), s2: String) => {
        if (s1 == ("hello", "hello") && s2 == "hello") {
          "1 second"
        } else if (s1 == ("structured", "structured") && s2 == "structured") {
          // zero gap duration will be filtered out from aggregation
          "0 second"
        } else if (s1 == ("world", "world") && s2 == "world") {
          // negative gap duration will be filtered out from aggregation
          "-10 seconds"
        } else {
          "10 seconds"
        }
      })

    val sessionUpdates = sessionWindowQueryMultiColKey(
      inputData,
      session_window($"eventTime", udf($"aggKeyDouble", $"aggKeySingle")))

    testStream(sessionUpdates, OutputMode.Append())(
      AddData(
        inputData,
        ("hello world spark streaming", 40L),
        ("world hello structured streaming", 41L)),
      CheckNewAnswer(),
      // placing new sessions "before" previous sessions
      AddData(inputData, ("spark streaming", 25L)),
      CheckNewAnswer(),
      // late event which session's end 10 would be later than watermark 11: should be dropped
      AddData(inputData, ("spark streaming", 0L)),
      CheckNewAnswer(),
      assertNumRowsDroppedByWatermark(2),
      // concatenating multiple previous sessions into one
      AddData(inputData, ("spark streaming", 30L)),
      CheckNewAnswer(),
      // placing new sessions after previous sessions
      AddData(inputData, ("hello apache spark", 60L)),
      CheckNewAnswer(),
      AddData(inputData, ("structured streaming", 90L)),
      CheckNewAnswer(
        (("spark", "spark"), "spark", 25, 50, 25, 3),
        (("streaming", "streaming"), "streaming", 25, 51, 26, 4),
        (("hello", "hello"), "hello", 40, 42, 2, 2)))
  }

  testWithAllOptions("append mode - session window - no key") {
    val inputData = MemoryStream[Int]
    val windowedAggregation = sessionWindowQueryOnGlobalKey(inputData)

    val e = intercept[StreamingQueryException] {
      testStream(windowedAggregation)(
        AddData(inputData, 40),
        CheckAnswer() // this is just to trigger the exception
      )
    }
    Seq("Global aggregation with session window", "not supported").foreach { m =>
      assert(e.getMessage.toLowerCase(Locale.ROOT).contains(m.toLowerCase(Locale.ROOT)))
    }
  }

  testWithAllOptions("update mode - session window") {
    // Implements StructuredSessionization.scala leveraging "session" function
    // as a test, to verify the sessionization works with simple example

    val inputData = MemoryStream[(String, Long)]
    val sessionUpdates = sessionWindowQuery(inputData)

    val e = intercept[AnalysisException] {
      testStream(sessionUpdates, OutputMode.Update())(
        AddData(inputData, ("hello", 40L)),
        CheckAnswer() // this is just to trigger the exception
      )
    }
    Seq("Update output mode", "not supported", "for session window").foreach { m =>
      assert(e.getMessage.toLowerCase(Locale.ROOT).contains(m.toLowerCase(Locale.ROOT)))
    }
  }

  testWithAllOptions("update mode - session window - no key") {
    val inputData = MemoryStream[Int]
    val windowedAggregation = sessionWindowQueryOnGlobalKey(inputData)

    val e = intercept[AnalysisException] {
      testStream(windowedAggregation, OutputMode.Update())(
        AddData(inputData, 40),
        CheckAnswer() // this is just to trigger the exception
      )
    }
    Seq("Update output mode", "not supported", "for session window").foreach { m =>
      assert(e.getMessage.toLowerCase(Locale.ROOT).contains(m.toLowerCase(Locale.ROOT)))
    }
  }

  // Test that session window works with mean, median, std dev, variance, UDAFs
  // and first, last on nested tuple keys
  testWithAllOptions("session window - with more aggregation functions and UDAFs") {
    // create a trivial summation UDAF for test
    // input type is a single Long
    object MySum extends Aggregator[Long, Long, Long] {

      def zero: Long = 0L

      def reduce(buffer: Long, data: Long): Long = {
        buffer + data
      }

      def merge(b1: Long, b2: Long): Long = {
        b1 + b2
      }

      def finish(reduction: Long): Long = reduction

      def bufferEncoder: Encoder[Long] = Encoders.scalaLong

      def outputEncoder: Encoder[Long] = Encoders.scalaLong
    }
    val mySum = spark.udf.register("mySum", udaf(MySum))

    val inputData = MemoryStream[(String, Long)]
    val sessionWithAgg = {
      // Split the lines into words, treat words as sessionId of events
      val events = inputData.toDF()
        .select($"_1".as("value"), $"_2".as("timestamp"))
        .withColumn("eventTime", $"timestamp".cast("timestamp"))
        .withColumn("single", $"timestamp")
        .withColumn("double", struct($"single", $"single"))
        .withColumn("triple", struct($"double", $"single"))
        .withWatermark("eventTime", "30 seconds")
        .selectExpr("explode(split(value, ' ')) AS sessionId",
          "eventTime", "single", "triple")

      val sessionWindow = session_window($"eventTime", "10 seconds")
      events
        .groupBy(sessionWindow.as("session"), $"sessionId")
        .agg(
          mean($"single").as("meanTime"),
          median($"single").as("medianTime"),
          stddev($"single").as("stdDevTime"),
          variance($"single").as("varTime"),
          first($"triple").as("firstTimeTriple"),
          last($"triple").as("lastTimeTriple"),
          mySum($"single").as("mySumSingle")
        )
        .selectExpr(
          "sessionId", "CAST(session.start AS LONG)",
          "CAST(session.end AS LONG)",
          // "firstTimeTriple", "lastTimeTriple",  // Non deterministic
          "CAST(meanTime AS LONG)", "CAST(medianTime AS LONG)",
          "CAST(stdDevTime AS LONG)", "CAST(varTime AS LONG)",
          "mySumSingle")
    }

    testStream(sessionWithAgg, OutputMode.Append())(
      AddData(inputData, ("a", 41L)),
      AddData(inputData, ("a", 42L)),
      AddData(inputData, ("a", 40L)),
      CheckAnswer(),
      AddData(inputData, ("b", 100L)), // Move the watermark past the end of the session.
      AddData(inputData, ("b", 101L)), // Trigger the session production.
      CheckAnswer(("a", 40, 52, 41, 41, 1, 1, 123))
    )
  }

  private def assertNumRowsDroppedByWatermark(
      numRowsDroppedByWatermark: Long): AssertOnQuery = AssertOnQuery { q =>
    q.processAllAvailable()
    val progressWithData = q.recentProgress.filterNot { p =>
      // filter out batches which are falling into one of types:
      // 1) doesn't execute the batch run
      // 2) empty input batch
      p.inputRowsPerSecond == 0
    }.lastOption.get
    assert(progressWithData.stateOperators(0).numRowsDroppedByWatermark
      === numRowsDroppedByWatermark)
    true
  }

  private def sessionWindowQuery(
      input: MemoryStream[(String, Long)],
      sessionWindow: Column = session_window($"eventTime", "10 seconds")): DataFrame = {
    // Split the lines into words, treat words as sessionId of events
    val events = input.toDF()
      .select($"_1".as("value"), $"_2".as("timestamp"))
      .withColumn("eventTime", $"timestamp".cast("timestamp"))
      .withWatermark("eventTime", "30 seconds")
      .selectExpr("explode(split(value, ' ')) AS sessionId", "eventTime")

    events
      .groupBy(sessionWindow as Symbol("session"), $"sessionId")
      .agg(count("*").as("numEvents"))
      .selectExpr("sessionId", "CAST(session.start AS LONG)", "CAST(session.end AS LONG)",
        "CAST(session.end AS LONG) - CAST(session.start AS LONG) AS durationMs",
        "numEvents")
  }

  private def sessionWindowQueryOnGlobalKey(input: MemoryStream[Int]): DataFrame = {
    input.toDF()
      .selectExpr("*")
      .withColumn("eventTime", $"value".cast("timestamp"))
      .withWatermark("eventTime", "10 seconds")
      .groupBy(session_window($"eventTime", "5 seconds") as Symbol("session"))
      .agg(count("*") as Symbol("count"), sum("value") as Symbol("sum"))
      .select($"session".getField("start").cast("long").as[Long],
        $"session".getField("end").cast("long").as[Long], $"count".as[Long], $"sum".as[Long])
  }

  // Manipulate the input to create a nested tuple out of words and do aggregation on the tuples.
  // Split the lines into words, convert each word into a nested tuple,
  // e.g. hello -> ((hello, hello), hello), treat each tuple as the sessionId of a event,
  // which get aggregated in the second clause.
  private def sessionWindowQueryNestedKey(
      input: MemoryStream[(String, Long)],
      sessionWindow: Column = session_window($"eventTime", "10 seconds")): DataFrame = {
    val events = input
      .toDF()
      .select($"_1".as("value"), $"_2".as("timestamp"))
      .withColumn("eventTime", $"timestamp".cast("timestamp"))
      .withColumn("sessionIdSingle", split($"value", " "))
      .withColumn("sessionIdDouble", arrays_zip($"sessionIdSingle", $"sessionIdSingle"))
      .withColumn("sessionIdTriple", arrays_zip($"sessionIdDouble", $"sessionIdSingle"))
      .withWatermark("eventTime", "30 seconds")
      .selectExpr("explode(sessionIdTriple) AS sessionId", "eventTime")

    events
      .groupBy(sessionWindow.as("session"), $"sessionId")
      .agg(count("*").as("numEvents"))
      .selectExpr(
        "sessionId",
        "CAST(session.start AS LONG)",
        "CAST(session.end AS LONG)",
        "CAST(session.end AS LONG) - CAST(session.start AS LONG) AS durationMs",
        "numEvents")
  }

  // Manipulate the input, for each word, create two columns and do aggregation on both cols.
  // Split the lines into words, convert each word into two columns,
  // e.g. hello -> col1: (hello, hello), col2: hello. Aggregate on both columns.
  private def sessionWindowQueryMultiColKey(
      input: MemoryStream[(String, Long)],
      sessionWindow: Column = session_window($"eventTime", "10 seconds")): DataFrame = {
    val events = input
      .toDF()
      .select($"_1".as("value"), $"_2".as("timestamp"))
      .withColumn("eventTime", $"timestamp".cast("timestamp"))
      .withColumn("sessionIdSingle", split($"value", " "))
      .withColumn("sessionIdDouble", arrays_zip($"sessionIdSingle", $"sessionIdSingle"))
      .withColumn("sessionIdTriple", arrays_zip($"sessionIdDouble", $"sessionIdSingle"))
      .withColumn("sessionIdTriple", explode($"sessionIdTriple"))
      .withWatermark("eventTime", "30 seconds")
      .selectExpr(
        "sessionIdTriple.sessionIdDouble AS aggKeyDouble",
        "sessionIdTriple.sessionIdSingle AS aggKeySingle",
        "eventTime")

    events
      .groupBy(sessionWindow.as("session"), $"aggKeyDouble", $"aggKeySingle")
      .agg(count("*").as("numEvents"))
      .selectExpr(
        "aggKeyDouble",
        "aggKeySingle",
        "CAST(session.start AS LONG)",
        "CAST(session.end AS LONG)",
        "CAST(session.end AS LONG) - CAST(session.start AS LONG) AS durationMs",
        "numEvents")
  }
}

redpajama_set_name: RedPajamaGithub


This dish works well with a mixture of wild or fresh mushrooms and handmade pasta. This is an ideal vegetarian meal, served with a crunchy salad on the side.
Brush the dirt off the mushroom with a paper towel (do not wash as the mushrooms become water-logged), then slice thinly.
Heat the oil in a frying pan and add the mushrooms. Fry fast, tossing every now and again, for ±5 minutes.
Add the garlic and chilli with a pinch of salt and continue to fry for ±5 minutes, or until most of the moisture has evaporated.
Add the lemon juice and mix well. Then reduce the heat and pour in the cream, heating through, but not allowing it to boil otherwise the cream could separate. Season to taste.
Cook the pasta until al dente and drain.
Transfer the pasta to a warmed serving dish, toss in the mushrooms, cheese and parsley (reserving ±1T of parsley and cheese for garnish).
Serve immediately, garnished with the remaining cheese and parsley, and a good twist of freshly ground black pepper.
Wickedfood Cooking School runs cooking classes throughout the year at its purpose-built cooking studios. Classes are run in the mornings and evenings 7 days a week (subject to a minimum of 12 people). The venue is also popular for corporate events and private functions – team building cooking classes, birthdays, kitchen teas, and dinner parties with a difference.
Our classes are hands-on, where every person gets to participate in the preparation of the dishes. They are also a lot of fun where you not only learn new skills, but get to meet people with similar interests. For corporate groups and teambuilding cooking classes these events are a novel way of creating staff interaction or entertaining clients.
I am interested in taking cooking classes. Would you please tell me when you have them, at what time & what the cost's are?
I live in Brakpan, so Boksburg would be the closest for me.
good article on cooking schools hopefully i learned from it.


Arterial catheterization is an important adjunct to the management of critically ill neonates. We report our experience with umbilical artery cutdowns in 30 neonates in whom the umbilical artery was cannulated through a mini-laparotomy. In 29 of 30 cases (97%) successful cannulation was achieved. The mean gestational age was 31.4 weeks, and 8 neonates weighed less than 1000 g. The duration of catheter use ranged from 1 to 30 days, with a mean of 7 days. There were no complications resulting in long-term disability. A review of the literature discusses the various techniques of arterial catheterization in critically ill newborns. We conclude that umbilical artery catheterization by cutdown can be a reliable and relatively safe means of obtaining arterial access in critically ill neonates.


text:
Colleges / Tuskegee University
Tuskegee University
Tuskegee, AL • 4-Year Private
Tuskegee University FAQ
When is the Tuskegee University application deadline?
The deadline for Fall Freshman applications to Tuskegee University is Apr 15 and the deadline for Fall transfer applications is Apr 15. There are 86 days left to apply.
Where exactly is Tuskegee University located?
Tuskegee University is located in Tuskegee, AL, a Small in the 5 part of the United States.
Is Tuskegee University a 2-year or 4-year school?
Tuskegee University is a 4-Year college. Most students take 4 years to graduate. Four-year schools typically result in bachelor's degrees. Two-year schools typically result in associate degrees.
What is out-of-state tuition for Tuskegee University?
Out-of-state tuition for Tuskegee University is $19,594. Tuition for out-of-state students is higher at public universities, because the state government provides some funding for in-state students who attend. Private colleges usually have the same tuition for in-state and out-of-state students.
What is in-state tuition for Tuskegee University?
In-state tuition for Tuskegee University is $19,594. Each state defines how students qualify for in-state tuition. For undergraduates who are claimed as dependents on their parents' taxes, where their parents live usually determines eligibility for in-state tuition.
Is Tuskegee University a public or private school?
Tuskegee University is a Private school. Public colleges receive some government funding while private schools rely on tuition and endowment for funding. Private schools can have higher tuition, but may also offer more generous financial aid packages than public schools. Public and private schools may also vary in size, environment, and types of majors and instruction offered.
Need Advice or Have a Question About Tuskegee University?

redpajama_set_name: RedPajamaCommonCrawl


text:
Perserverance in America–...
Perserverance in America– Wilmington Ohio
america, economic, employment, perserverance
Last night Scott Pelley of 60 Minutes returned to Wilmington Ohio for another visit to this community which has been hit very hard by the recent Recession. (Wilmington is about an hour north of Cincinnati and used host the Bengals Training Camp before they came to Georgetown.)
Earlier this year DHL closed its facility in Wilmington. DHL employed thousands of people from in and around Wilmington. DHL took over operations in the 1990's after the Air Force closed a base there.
While the former employees are having more and more difficulty financially they have developed a resolve to maintain the integrity of the community. The people interviewed in Wilmington reminded me of the people in Carlisle, Kentucky after Jockey Industries closed down in the 1990 and into 2003. The community has come together to share what it has and is doing its level best to take care of everyone.
Familites, neighborhoods, towns and cities throughout America are having a very difficult time maintaining their integrity due to a lack of money and resources. While there can be no doubt the people of Wilmington and Carlisle would perfer to have factories and steady employment– the people make them great places to survive economic.


When the forefoot widens the bones on the inside and outside of the foot push-out. This is called a bunion and bunionette. It is common in females due to the hormones that make the ligaments more elastic. These ligaments allow the bones to move away from each other making the foot wider. Using Beauty and the BunionTM instantly holds the forefoot together making it slimmer. Used over weeks it can slim the forefoot and reduce the appearance of the bunion. Very good for use in open toe'd sandals high heels as it instantly makes the foot appearance better.


brown console table 2 drawer console table black brown console table.
brown console table distressed charcoal brown console table dark brown wood console table.
brown console table fields weathered brown console table dark brown and white console table.
brown console table home warm shaker console table in tobacco brown espresso brown wood console table.
brown console table brown and orange console table dark brown small console table.
brown console table 5 furniture brown living room sofa table dark brown console table uk.
brown console table brown console table dark brown console table uk.
brown console table brown console table dark brown small console table.
brown console table aspen skies russet brown console table blakes vintage industrial medium brown wood console table.
brown console table console table in brown black brown console table.
brown console table walnut brown storage console table dark brown wood console table.
brown console table console table brown wood console table.
brown console table console table dark brown console table.
brown console table rich brown console table espresso brown wood console table.
brown console table brown waterfall console dark brown wood console table.
brown console table console tables espresso brown wood console table.
brown console table hand painted distressed black brown finish accent console table light brown console table.
brown console table distressed two tone 2 drawer console table gray and light brown dark brown farmhouse console table.
brown console table medium brown sofa table side cabinet console table with 3 drawers brown.
brown console table images twin urns traditional console table in brown dark brown and white console table.
brown console table console table in brown dark brown console table.
brown console table draper console table mr brown console table.
brown console table console table brown gold 0 espresso brown wood console table.
brown console table brown wood console table dark brown console table uk.
brown console table hill 2 drawer console table in antique brown dark brown wood console table.
brown console table mr brown console table.


Happy Holidays everyone! I'm at home for a relaxing week and felt it fitting to post one of my favorite holiday photos. This is my sister headed downstairs Xmas morning. The tree and presents are elevated to keep them from my parents' new black Labrador Sally.


Whether your community is a massive development or a pocket sized co-op, you will need a dedicated team of professionals to remain solvent and operational. This team includes a property manager, an accountant or financial advisor, and an attorney. While all of these individuals are vital, of particular importance is having a competent property manager.
Developing a successful relationship with your property manager is akin to a healthy marriage. That might sound like a stretch, but in reality, it is very accurate.
When you are in a dating pool, often friends or family will jump in with suggestions. They know your personality and life circumstance and want you to be happy. Furthermore, you'll come with a great recommendation.
In dating, oftentimes compatibility can be assessed within the first few minutes or series of questions. Similarly, a board can determine which property management firm is a suitable match.
When you are building a personals ad, you want to represent yourself accurately, so you have the greatest chance of finding a partner that meets your needs. For example, perhaps you want someone to accompany you to the movies and discuss them with you afterwards. If someone responds saying they dislike cinema, you'll probably dismiss them immediately. However, if they are an avid cinephile and frequent film festivals, then you may possibly be "swept off your feet".
A property management firm has the potential to sweep you off your feet too if they provide all the services your board needs.
It is imperative to perform proper screening protocols for potential property managers. The scope of responsibility is high, as are the potential consequences of hiring an incompetent firm.
When developing a new relationship, it can be a little bit of a guessing game when it comes to setting expectations. Who is going to call first?
It is the same when developing a relationship with your property manager. It is never too early to start talking with your property manager, remember, it is their job to help your community function as effectively as possible. Getting their advice before problems arise, especially legal ones, is essential to creating a safety net for your board. Cleaning up the mess of a board-gone-rogue is not fun and is better to be avoided; so give your manager a call.
Sometimes, despite the best of intentions, relationships do not work out. Make sure your contract with your management firm provides for a "termination without cause," in case you need to get a better match. Most management firms will be up-front with their termination policies.
In any case, successful relationships require lots of work and communication. If all goes well, a fairytale ending is possible.
American Management Group is the leader in providing turnkey community management solutions to communities across South Florida. With over 25 years of experience in property management, AMG has the confidence and vision to help with your organization's daily functions, as well as execution of long-term plans. Contact AMG today for insight on how to navigate your organization's needs.


text:
One Equity Partners är en amerikansk investmentbank tillika riskkapitalbolag som investerar i företag inom branscherna för hälso- och sjukvård, industri och teknologi. De förvaltar ett kapital på omkring $4 miljarder för år 2018.

Företaget grundades 2001 av den före detta olympiska roddaren Richard Cashin i syfte att ha det som en investmentbank åt sin arbetsgivare Bank One Corporation. 2004 fusionerades Bank One med JPMorgan Chase för $58 miljarder. 2015 knoppades OEP av från JPMorgan och blev ett självständigt bolag.

De har huvudkontor i New York i New York med ytterligare kontor i både Chicago i Illinois och Frankfurt i Tyskland.

Referenser

Kommentarer

Noter

Externa länkar
Officiell webbplats

JPMorgan Chase
Företag i New York
Amerikanska riskkapitalbolag
Amerikanska investmentbanker
Företag bildade 2001

redpajama_set_name: RedPajamaWikipedia


text:
Payback Stories
All Communiqués
North American Communiqués
International Communiqués
F A Q 's (Text)
F A Q 's (Video)
Press Officer Gary Yourofsky: Spreading Influence on World Vegan Day
FBI Visits Animal Liberation Press Officer's Home (New York)
SPIES AND LIES How undercover cops had sex with innocent women they were spying on & even had KIDS with them in shocking police scandal
Filed under News Articles
The Sun (UK)
by Miranda Knox
GLANCING at the passport of her boyfriend of six years, Lisa's* heart pounded and a wave of nausea washed over her.
The couple were on holiday in Italy, and while looking for her sunglasses in the car's glovebox, she'd stumbled across the document – which revealed, to her shock, that Mark "Flash" Stone was using a fake name.
'Mark Stone' with Kate Wilson – one of the women he had a sexual relationship with while infiltrating environmental groupsCredit: Kate Wilson
The discovery sent her life into freefall, as it later emerged the love of her life was actually an undercover Met Police officer, sent to spy on her and her eco-activist friends.
Despite sounding like the plot of a far-fetched film, it would transpire this was far from a one-off case.
Over more than four decades at least 139 police officers were given false identities to spy on more than 1,000 campaign groups.
Each officer lived undercover for up to nine years, forming close relationships and friendships.
Mark Kennedy used the name Mark Stone during his undercover operations, some of which lasted years
Shockingly, more than 20 were known to have had sexual relationships with women who were unaware of their real identities between the 1970s and 2010, and least three fathered children with their unsuspecting victims.
Here, as the public inquiry that was announced six years ago finally began this week, we take a closer look at the scandal, and the women whose lives were left in tatters…
'He was paid overtime to spend nights with me'
While the Met has claimed officers were not allowed to have sexual relationships with targets, it appears it was a regular occurrence.
Lisa's partner, Mark Kennedy, actually had affairs with at least two unwitting women in the seven years he infiltrated an environmental group before he was exposed in 2010.
Speaking about the betrayal to campaign group Police Spies Out Of Lives, Lisa said: "He wasn't just a man who lied to me in a relationship, he was a fictional character, and he was placed in my life by an employer, and his employer was the police, and in order to create that deception he was trained.
Kennedy spent years in the false relationship with Lisa, who had no idea he was a cop Credit: Channel 4
"He was trained in manipulation techniques, he was trained in lying. A backstory was created for him by and with his employers.
"He had a backroom team of people supporting him wherever he went, he had a handler, he had people who were issuing him with fake ID.
"He was being paid overtime for the nights that he spent with me, which must have amounted to quite a lot of money."
A childhood based on a lie
Not only were they left heartbroken, but some of the women even had children with the deceiving officers.
Jacqui*, then a 22-year-old animal rights activist, was tricked into a three-year relationship by undercover officer Bob Lambert – who was married at the time.
Bob Lambert was in a relationship with an activist who didn't know he was an undercover cop for three years
Playing the doting partner, when their son was born in 1985 he was even at her side during labour, but she had no idea about Bob's real identity until two decades later.
For all that time, both Jacqui and her son, now 35, believed Bob – who disappeared without a trace in 1987 – was a political activist who'd been forced to flee the country to avoid jail.
Jacqui and Bob's son – who has remained anonymous and is known only as TBS – told The Guardian how hard it had been growing up without a father – and later finding out he hadn't been who he thought.
"It is quite scary to me just how the police can dip in and out of people's lives," he said.
"They still seem to struggle with realising the impact of what they have done.
"It seems very bizarre that when I was born there was not someone who said: 'Right, this has gone too far, there's a whole new life here.'"
The Metropolitan Police paid Jacqui more than £400,000 to settle a lawsuit she brought, but incredibly both Jacqui and her son have gone on to build bridges with Bob, and are now in touch.
"The other women who were duped don't understand how I can forgive him," Jacqui told the Daily Mail.
Scotland Yard paid £400,000 to Jacqui for the undercover operationCredit: Getty Images
"People see him as evil but he's actually had plenty of suffering himself. It's been horrendous all round.
"There's a been a huge human cost."
Spying on bereaved families
It wasn't just their relationships that caused controversy.
Operations of this nature spanned decades up until 2010, but it wasn't until 2014 that the true extent of the Met's undercover operations began to come to light – after it was revealed at least three officers had been sent to spy on the bereaved family of Stephen Lawrence.
In fact, the inquiry is also set to hear how police repeatedly spied on black justice groups, many of which are run by grieving families whose relatives were killed by police or died in police custody.
Stephen Lawrence was stabbed to death in a racially motivated murder in 1993 – his loved ones were spied on after his killingCredit: PA:Press Association
This included the campaign group fighting for justice for Brazilian Jean Charles de Menezes, the electrician shot in 2005 after being mistaken for a suicide bomber.
According to former undercover officer Pete Francis who worked for the Special Demonstration Squad (SDS) and spied on the Lawrence campaign, his "lowest point" while on the job was attending a candlelit vigil for boxing promoter Brian Douglas after he was killed with a police baton in 1995.
Francis also had two one night stands with women while undercover but told The Guardian: "I can rest slightly easier at night than several other SDS officers, because I never promised women I ever loved them or cared about them.
"I never said I wanted to spend the rest of my life with them or wanted to father children with them."
Harvesting dead children's identities
In another grim twist, yet more controversy surrounded the force's other undercover practices.
To conceal their true identities, disturbingly many officers took on the names of children who'd died.
Picketers protesting the abuse by undercover cops outside the Court of Appeal in London in 2013Credit: Alamy
Officer Bob Lambert, for example, was deployed to infiltrate the Animal Liberation Front, and he became "Bob Robinson" in June 1984 – a cover name that had been picked from a list of dead children.
His new identity belonged to Mark Robert Robinson, who died aged seven of a congenital heart defect in October 1959.
Harrowingly, it's thought over 100 dead children's names may have been used.
'They were deceived, pure and simple'
After all of this came to light, in 2015, the Metropolitan Police issued an "unreserved" apology to the activists who were seduced into "abusive and deceitful" long-term relationships, and have paid out substantial undisclosed sums in civil cases.
In an apology issued in November 2015, Met Assistant Commissioner Martin Hewitt said the relationships "should never have happened" and admitted they "were a gross violation of personal dignity and integrity."
Demonstrators carrying a banner denouncing police spies in 2018Credit: Alamy
Halal Meat Website Hacked
Oregon judge ends pre-trial custody of Joseph Dibee, who faces decades old eco-terrorism charges
Lock Glued, Paint Applied at Fur Shop (Stockholm, Sweden)
Wildfire Magazine
Pandemic Culture by camille marino
January 8, 2021 — Lock Glued, Paint Applied at Fur Shop (Stockholm, Sweden)
January 5, 2021 — London Butcher "The Ginger Pig" Sabotaged (UK)
January 4, 2021 — Shops Exploiting Animals "Closed" (Germany)
January 4, 2021 — ALF Destroys 4 Hunting Towers (Sweden)
January 3, 2021 — 17 Hunting Towers Sabotaged by ALF (France)
Change, Justice & Freedom: See you in the liberation
The Pandemic's Assault on Human Privilege (Liberation by any means necessary)
On the Covid-19 Virus and Animal Liberation
A Marxist response to the animal liberation and vegan movements


Rhett Miller and Murry Hammond from the Old 97's perform live at WYEP on June 4th, 2014 and talk to Mike Sauter about their new album Most Messed Up.
"Longer Than You've Been Alive" is the kickoff to the band's newest album Most Messed Up and is written directly from experience, Miller says. The song is one that he feels is special to musicians in particular, and some of Miller's rock and roll friends thanked him for writing the song. As for the rest of the album, Miller says a lot of the material could be looked at as autobiographical.
Miller also talks about a few points in his recent career as this Fall is the 20th anniversary of the band's first album, but hardly does he get nostalgic, saying nostalgia is a "creativity killer." "I like to be right now, right now — don't think about the future don't think about the past." But with all the milestones coming in the band's career, you can't really avoid it, Miller says.
The album, Miller says, is just the guys "being a live rock and roll band." The small things like a breath before or after a song are what make an album sound live. "Our record begins with a sort of tired breath from Rhett, a weary one, but it ends with kind of a satisfied breath," Hammond says.
Miller and Hammond then talk about their longest-running producer to date Salim Nourallah who didn't try to change anything about the band, but knew what was good about the band and just wanted them to do it. "We do like to do something different every single time, and with Salim we're just like, 'you know what, I could coast like this for a while,'" Hammond says.


text:
Q: how to create bestseller slider on magento I need to create best-seller in magento ....
I code some line..but its not working..
I need to know that what shout i modified in this code...
for bestseller....
 $todayDate  = Mage::app()->getLocale()->date()->toString(Varien_Date::DATETIME_INTERNAL_FORMAT);

        $collection = Mage::getResourceModel('catalog/product_collection');
        $collection->setVisibility(Mage::getSingleton('catalog/product_visibility')->getVisibleInCatalogIds());

        $collection = $this->_addProductAttributesAndPrices($collection)
            ->addStoreFilter()
            ->addAttributeToFilter('special_from_date', array('or'=> array(
                0 => array('date' => true, 'to' => $todayDate),
                1 => array('is' => new Zend_Db_Expr('null')))
            ), 'left')
            ->addAttributeToFilter('special_to_date', array('or'=> array(
                0 => array('date' => true, 'from' => $todayDate),
                1 => array('is' => new Zend_Db_Expr('null')))
            ), 'left')
            ->addAttributeToFilter(
                array(
                    array('attribute' => 'special_from_date', 'is'=>new Zend_Db_Expr('not null')),
                    array('attribute' => 'special_to_date', 'is'=>new Zend_Db_Expr('not null'))
                    )
              )
            ->addAttributeToSort('special_from_date', 'desc')
            ->setPageSize($this->getProductsCount())
            ->setCurPage(1)
        ;

A: You can get the best sellers products this way:
$collection = Mage::getResourceModel('sales/report_bestsellers_collection')
        ->setModel('catalog/product');

If you want them for a specific store view just add this line
$collection->addStoreFilter($storeId);

If you want a limit add:
$collection->setCurPage(1)->setPageSize($limit);

redpajama_set_name: RedPajamaStackExchange


Troy, NY- The Sage Colleges' women's tennis team hosted the Trailblazers of MCLA and posted a 9-0 victory to extend the team's win streak to five matches. With the win, Sage stands at 7-1 overall, while MCLA drops to 2-4.
Sage sophomore Sammantha Montague (Glenville, NY/Scotia-Glenville) added a win at No. 1 singles, elevating her season mark to 7-1. In doubles, she teamed at No. 1 with sophomore Rebecca Jackson (Saugerties, NY/John A. Coleman) and the pair posted an 8-4 win to improve to 4-4 on the season. Jackson posted a 6-0, 6-1 win at No. 4 singles, elevating her 2017 mark to 8-0 which leads the Gators in wins.
Senior twins, Shanessa and Shanice Mendoza (North Plainfield, NJ/North Plainfield) were both winners in singles play as Shanessa wwas a 6-1, 6-0 victor at No. 3 singled and Shanice added a 6-1, 6-1 win at No. 5 singles. In doubles play, Shanessa teamed with sophomore Abbey Clobridge (West Sand Lake, NY/Averill Park) for an 8-3 win, while Shanice teamed at No. 3 doubles with senior Lindsey Tolman (Little Falls, NY/Little Falls) for the 8-1 win.
Senior Samantha Dibbell (Hunter, NY/Tannersville Central) capped the singles sweep with her play at No. 6 singles as she topped her foe, 6-0, 6-1.
Next up for the Gators, they will travel to Stevens for a 1 p.m. Empire 8 match on Saturday, September 23.


text:
"""
********************************************************************************
* Name: button.py
* Author: Nathan Swain and Ezra Rice
* Created On: May 2015
* Copyright: (c) Brigham Young University 2015
* License: BSD 2-Clause
********************************************************************************
"""
from .base import TethysGizmoOptions

__all__ = ['ButtonGroup', 'Button']

class ButtonGroup(TethysGizmoOptions):
    """
    The button group gizmo can be used to generate a single button or a group of buttons. Groups of buttons can be  stacked horizontally or vertically. For a single button, specify a button group with one button. This gizmo is a wrapper for Twitter Bootstrap buttons.

    Attributes:
        buttons(list, required): A list of dictionaries where each dictionary contains the options for a button.
        vertical(bool): Set to true to have button group stack vertically.
        attributes(str): A string representing additional HTML attributes to add to the primary element (e.g. "onclick=run_me();").
        classes(str): Additional classes to add to the primary HTML element (e.g. "example-class another-class").

    Controller Example

    ::

        from tethys_sdk.gizmos import Button, ButtonGroup

        # Horizontal Button Group
        add_button = Button(display_text='Add',
                            icon='glyphicon glyphicon-plus',
                            style='success')
        delete_button = Button(display_text='Delete',
                               icon='glyphicon glyphicon-trash',
                               disabled=True,
                               style='danger')
        horizontal_buttons = ButtonGroup(buttons=[add_button, delete_button])

        # Vertical Button Group
        edit_button = Button(display_text='Edit',
                             icon='glyphicon glyphicon-wrench',
                             style='warning',
                             attributes='id=edit_button')
        info_button = Button(display_text='Info',
                             icon='glyphicon glyphicon-question-sign',
                             style='info',
                             attributes='name=info')
        apps_button = Button(display_text='Apps',
                             icon='glyphicon glyphicon-home',
                             href='/apps',
                             style='primary')
        vertical_buttons = ButtonGroup(buttons=[edit_button, info_button, apps_button], vertical=True)

        context = {
                    'horizontal_buttons': horizontal_buttons,
                    'vertical_buttons': vertical_buttons,
                  }

    Template Example

    ::

        {% load tethys_gizmos %}

        {% gizmo horizontal_buttons %}
        {% gizmo vertical_buttons %}

    """  # noqa: E501
    gizmo_name = "button_group"

    def __init__(self, buttons, vertical=False, attributes='', classes=''):
        """
        Constructor
        """
        # Initialize super class
        super().__init__(attributes=attributes, classes=classes)

        self.buttons = buttons
        self.vertical = vertical

class Button(TethysGizmoOptions):
    """
    Attributes:
        display_text(str): Display text that appears on the button.
        name(str): Name of the input element that will be used for form submission.
        style(str): Name of the input element that will be used for form submission.
        icon(str): Name of a valid Twitter Bootstrap icon class (see the Bootstrap `glyphicon reference <http://getbootstrap.com/components/#glyphicons-glyphs>`_).
        href(str): Link for anchor type buttons.
        submit(bool): Set this to true to make the button a submit type button for forms.
        disabled(bool): Set the disabled state.
        attributes(dict): A dictionary representing additional HTML attributes to add to the primary element  (e.g. {"onclick": "run_me();"}).
        classes(str): Additional classes to add to the primary HTML element (e.g. "example-class another-class").

    Controller Example

    ::

        from tethys_sdk.gizmos import Button

        # Single Buttons
        map_button = Button(
            display_text='',
            name='map-button',
            icon='glyphicon glyphicon-globe',
            style='info',
            attributes={
                'data-toggle':'tooltip',
                'data-placement':'top',
                'title':'Map'
            }
        )

        save_button = Button(
            display_text='',
            name='save-button',
            icon='glyphicon glyphicon-floppy-disk',
            style='success',
            attributes={
                'data-toggle':'tooltip',
                'data-placement':'top',
                'title':'Save'
            }
        )

        edit_button = Button(
            display_text='',
            name='edit-button',
            icon='glyphicon glyphicon-edit',
            style='warning',
            attributes={
                'data-toggle':'tooltip',
                'data-placement':'top',
                'title':'Edit'
            }
        )

        remove_button = Button(
            display_text='',
            name='remove-button',
            icon='glyphicon glyphicon-remove',
            style='danger',
            attributes={
                'data-toggle':'tooltip',
                'data-placement':'top',
                'title':'Remove'
            }
        )

        previous_button = Button(
            display_text='Previous',
            name='previous-button',
            attributes={
                'data-toggle':'tooltip',
                'data-placement':'top',
                'title':'Previous'
            }
        )

        next_button = Button(
            display_text='Next',
            name='next-button',
            attributes={
                'data-toggle':'tooltip',
                'data-placement':'top',
                'title':'Next'
            }
        )

        context = {
            'map_button': map_button,
            'save_button': save_button,
            'edit_button': edit_button,
            'remove_button': remove_button,
            'previous_button': previous_button,
            'next_button': next_button
        }

    Template Example

    ::

        {% load tethys_gizmos %}

        {% gizmo map_button %}
        {% gizmo save_button %}
        {% gizmo edit_button %}
        {% gizmo remove_button %}
        {% gizmo previous_button %}
        {% gizmo next_button %}
    """  # noqa: E501
    gizmo_name = "button"

    def __init__(self, display_text='', name='', style='', icon='', href='',
                 submit=False, disabled=False, attributes={}, classes=''):
        """
        Constructor
        """
        # Initialize super class
        super().__init__(attributes=attributes, classes=classes)

        self.display_text = display_text
        self.name = name
        self.style = style
        self.icon = icon
        self.href = href
        self.submit = submit
        self.disabled = disabled


Designers are very fortunate. Unlike a whole lot of careers out there, we quite often genuinely enjoy what we do. We get to unleash our creative spirit and can make a decent living out of it, too. From my experience, it's an industry full of talented and passionate people.
It can be a bit of a mixed blessing, though. If you're good at your job, more people will want you to do work for them. The trouble is that you may run into times when there's too much to do and not enough time to do it. Because you're determined to get it all done, you start early and leave late. You work weekends and take time away from family. You might even be a bit grumpy.
Yes, your passion, talent and success can all lead to becoming a workaholic. How do I know? Because I've found that I have become one myself.
But it's a brand new year and I'm ready to change for the better. Thus, let's explore the ups and downs associated with this lifestyle. Who knows, maybe we'll even find a path to recovery.
Back when I began my career, the term that least described me would be "workaholic". While I did have a passion for design and the technology behind it, I was still very much the high school version of myself. I was just trying to squeak by while doing as little actual work as possible. And since web design was a relatively new thing (thus, not very well understood by outsiders), I often got away with it.
But as I've grown up, I just can't seem to shake the feeling that I have to always be "on". Having continuous access to email certainly doesn't help. Still, there's more to it than that.
When I started my business, I became obsessed with getting things done as quickly as possible – while still doing a good job. That last part took some practice, but I pushed hard to work at a breakneck pace. My goal was to let my clients know that their requests were taken care of almost as quickly as they hit my inbox.
To go along with that speed, I also developed a need to say that I'm "done". Not just with one specific task, mind you. I wanted to say that I was indeed finished with every bit of work on my to-do list. Most likely so that I could run off and play video games.
That worked (somewhat) for a little while. Unfortunately, I'd stress myself out trying to finish everything off. This led to my not really enjoying the downtime, anyway.
In more recent times, I've found that I can never really be "done". Every minute of the day seems to bring some task that needs taken care of. In some ways it's a good problem to have, as it means that I must be doing something right.
But it's led me to an approach that is darn-near opposite of the younger me. There's very little goofing off and a whole lot of grinding. I feel like every second has to be an efficient one. In fact, during a recent holiday I noticed it was quite difficult to decompress and stop thinking about work. It took a few days to just feel like free time really was, well, free.
What makes things even more frustrating is that I can see it taking away from life away from my desk. It affects my ability to enjoy some of the things I used to do – so I generally stopped doing them.
My reason for telling you this is because I suspect that I'm not alone when it comes to being obsessed with work. This is, after all, a job meant for those with creative minds. And when you combine project demands with the never-ending flow of new skills and technologies we need to learn to keep pace – it's not hard to imagine that a few of us suffer from burnout.
Hopefully, opening up about my own tendencies can help others realize and adjust their own.
1. I'm incredibly grateful for the opportunities I've had. Seriously, I have seen the other side of things and know how good I have it.
2. In the long-term, I know that I need to change my approach a bit. Being a workaholic isn't the best thing for your mental and physical well-being, after all. Evolution is the key to sustaining a career.
Finding some sort of balance between work and life is in everyone's best interest. To paraphrase that old saying, nobody on their death bed ever laid there wishing they had worked more. When you think about it, work should be there to help us live the life we want to live.
The challenge becomes understanding when it's time to work and when it's time go out there and live.
Thankfully, being a workaholic doesn't mean that you have to stay one forever. But sometimes it takes becoming one to fully appreciate that you need a change. It might even require a few trips around the block, but eventually (hopefully) you figure things out.
If work is super busy, then randomly taking the day off will probably stress you out more than staying in the office. Instead, pick a date in the near future to take off and let everyone know in advance. Be sure to make plans to do something fun with friends, family or just yourself.
This way, you'll have something to look forward to. Plus, you've already let clients and colleagues know that you won't be around. Of course, you'll still receive some work-related email on the day itself. Set up an auto-response message and get to things when you get back.
As a workaholic, I realize that it's difficult to say no when it comes to projects. You never want to turn down the opportunity to satisfy a client while making some money to boot. There are times, however, when it really is the best thing for your own sanity.
For example, it might be that a project's timeline clashes with all the other work on your plate. Or perhaps you feel that it's way over your head. Whatever the reason, it's important to take back some measure of control over your workload.
The other option here is to try and delay a project until a time when your schedule clears up. This isn't always possible, but again it does provide you with a bit more control. Having that feeling of control can be a great way to tame feelings of chaos.
Humans are creatures of habit. And, we know that doing the same thing over and over while expecting a different result just doesn't work. If we want a different result, then we need to change what we're doing.
When it comes to our daily work routine, change can be difficult. So start with something small, like setting a reminder to help you remember to get up from your desk every so often. That will help you work your way up to larger changes like (gasp!) silencing your phone during lunch.
Eventually, the idea is to build in enough healthy components of your routine to both reduce stress and your desire to pull all-nighters.
A designer's life can become pressure-packed. And, before you know it, you seem to be in a constant race to get things done. You sacrifice your time and well-being for the chance to keep moving ahead. The funny thing is that being a "successful" designer can lead to a situation that works against your best interest. In that way, learning how to handle your own success is vital to maintaining it.
As for me, just sharing my experience with you has been therapeutic. But I also know that words are meaningless if you don't act on them. So I'm pledging to do better.
Fellow workaholics, take solace in the fact that you are not alone and that change is possible. Now, it's up to us to make it happen.


Cuddle up with a good book and meet Whichway while children discover how he turned nightmares into sweet dreams. Let your little one join his adventures with a Dream Hat. Enjoy children adventure stories.
Copyright © 2017 Whichway's Dream Hat - All Rights Reserved.


Seminar On Just In Time Manufacturing ( JIT ) Full Report Download ABSTRACT JIT is a management philosophy that strives to eliminate sources of manufacturing waste by producing the right part in the right place at the right time.
seminar report and ppt on manufacturing of cement. seminar report on properties of natural sand concrete. 2012419-seminar report justify the manufacturing of cement concrete blocks, Seminar Report - Green Concrete . ... various seminar report on recycled aggregate concrete.
seminar report and ppt on manufacturing of cement. seminar report on properties of natural sand concrete 2012419-seminar report justify the manufacturing of cement concrete blocks, ... 201535-Get Details on Self Healing Concrete Full Seminar Report and PPT. ... various seminar report on recycled aggregate concrete.
aggregate manufacturing productivity growthon average, similar to the average contribution of entry and exit in the United States. During periods of fastGDP growth, however, entry and exit account for a larger fraction of ggregate manufacturing productivity growtha , ranging from 37 to 58 percent.
a seminar report on use of industrial waste in concrete... Seminar Report – Green Concrete – Free download as PDF File ... Use of Aggregate from Recycled Construction and Demolition Waste in Concrete. » Free Online Chat.
Lean Manufacturing Seminar and PPT with pdf report: Lean Manufacturing is a systematic approach to identifying and eliminating waste (non-value-added activities) through continuous improvement by flowing the product at the pull of the customer in pursuit of perfection.
seminar report geopolymer concrete ppt mechanical seminar ppt on cement plant cement manufacturing process mechanical ppt SBM Mining. cement manufacturing geopolymer concrete seminar report ppt geopolymer concrete full report Seminar Topics Project used shavings mill for sale The More ppt geopolymer concrete full report Seminar Topics get quote..
Self-compacting concrete Seminar Report. The seminar report on self-compacting concrete which explains the mix design, advantages and disadvantages, applications, properties,process of making self-consolidating concrete, theoretical and experimental studies with test results. Download the latest PDF and PPT on slideshare for civil projects.
This has required research work on alternative materials in the field of construction. The conventional coarse aggregate, namely gravel and fine aggregate is sand in concrete, will be used as control. While the natural material is coconut shell as a course aggregate it will be investigated to replace the concrete aggregate.
A SEMINAR FOR PARTIAL FULFILMENT OF B.E. EIGHT SEMESTER THE SEMINAR REPORT ENTITLED CONCRETE MIX DESIGN Submitted to the ... Cement a. Cement Content C. 2. Maximum Size of Coarse Aggregate. Silt Content by Weight. Fine Aggregates a. 7. Relative Proportion of Fine. A. a. Coarse Aggregates. Shape Of Coarse Aggregates.
seminar report on manufacturing of aggregate sitems.co. a seminar report on use of industrial waste in concrete, seminar report on recycled aggregate, Nano Concrete Seminar Report, PPT, More Details. seminar report on recycled aggregate concrete Solution .
Seminar report on Dolochar as coarse aggregate in concrete pg. Compressive strength is taken as load applied on the specimen divided by the area of the load bearing surface of specimen. 10 . The test is repeated for the three specimens and the average value is taken as mean strength.
Seminar Report And Ppt On Manufacturing Of Cement. ... seminar report on recycled aggregate concrete Recycled Concretes Made with Waste Ready-Mix Concrete as Coarse Aggregate Recent trends in recycling of concrete waste and seminar report on recycled Read more.
Explore Transparent Concrete with Free Download of Seminar Report and PPT in PDF and DOC Format. Also Explore the Seminar Topics Paper on Transparent Concrete with Abstract or Synopsis, Documentation on Advantages and Disadvantages, Base Paper Presentation Slides for IEEE Final Year Civil Engineering CE or IEEE Civil Construction BTech, BE, MTech Students for the year 2015 2016.
Declining shares of manufacturing jobs in overall employment have been a concern for policymakers for years in advanced and some developing economies.
Join SME's Additive Manufacturing Seminar at HOUSTEX 2019 on February 26 to explore the role of 3D printing/additive manufacturing in sustaining an innovative development culture to help manufacturers produce cheaper and quicker advanced engineering solutions.


LETS enables local people to give and receive all kinds of services without the need to spend money.
We tap into a great variety of local resources, organised and run entirely by local people, its membership.
* The convenience of earning local currency units from one Member which you can then spend with anyone else in the system.
* Recognition that your skills are valuable whether you are trained, experienced, do it out of interest, as a hobby or are just plain talented.
* A local network of contacts with the opportunity to meet new friends and revitalise your social life.
* The chance to ask for all those things you really want — rather than just the things you need.
* A choice of a whole range of goods and services, often without the need for cash.
* Ideas on how to save money and stretch a tight budget.
* The chance to offer all your skills without the need to specialise — allowing you to make creative use of your talents.
* The opportunity to borrow items, equipment hire storage space or rooms.
We will send you a current directory and newsletter. Events are publicised in the newsletter and by email. You may trade as soon as you receive your directory, however you may find it easier to come along to one of our events and meet some members first. We often have lunch or a meal in a pub, which is an ideal opportunity to get to know other members.
"What can I offer?" is a question regularly asked by potential new members.
The answer is found by asking yourself, what do I do/what do I have?
Some members offer things like ironing, sewing repairs and alterations, car maintenance, cooking and baking, fresh produce from their gardens, lifts in the car, hire of tools and equipment. Therapists offer their services – reflexology, aromatherapy, massage and shiatsu are currently offered by several members. Odd jobs around the house, painting, decorating, plumbing and electrical work are often requested, gardening, shopping, secretarial services, computer training/troubleshooting, picture framing, digital photography, small web site design, tuition – piano, tap dancing, maths, baby sitting, knitting, … the list is endless.
The name of the units Members trade in.
The initials stand for Concrete Cows. They are not physical tokens – they exist in the computer. CCs have no sterling value – all transactions are negotiable. The value is placed on it by the people trading.
Having spent CCs on a job or service, the members account is debited. It is not a "debt" but rather a commitment to provide goods or services for the other LetNet members at some time in the future.
Having earned CC's by doing a job or giving a service, the member's account is credited and is said to be in surplus. However, you do not need to have earned any CC's before you start spending. In fact, CCs are only produced when someone goes into commitment.


text:
HP starts charging for server firmware updates
By Ian Paul
Contributor, PCWorld | PT
Acer's loaded Predator Helios 300 gaming laptop drops under $1,000 for Amazon...
PC owners probably don't give firmware updates much thought and rarely, if ever, seek them out directly. Enthusiasts and small businesses running low-end servers, on the other hand, have a keener interest in firmware since sometimes skipping an update can be fatal for their investment.
But getting those firmware updates for Hewlett-Packard's servers are about to get a little more difficult. HP says that beginning next Wednesday, February 19, it will effectively start charging for access to firmware updates through the company's support center. Only customers with an active warranty, an HP Care Pack subscription, or support agreement will be able to download the updates directly from HP.
Previously, HP firmware updates were freely available.
[ Further reading: Best NAS boxes for media streaming and backup ]
"This decision reinforces our goal to provide access to the latest HP firmware, which is valuable intellectual property, for our customers who have chosen to maximize and protect their IT investments," HP's Mary McCoy vice president for technology services said in a blog post.
"We are in no way trying to force customers into purchasing extended coverage. That is, and always will be, a customer's choice."
It's not clear if HP will restrict access to critical firmware updates that are sometimes necessary to keep a device from misbehaving.
As ZDNet's Ed Bott—who first reported this story—pointed out, a flaw in ProLiant servers prevented them from running Windows 8.1 and Windows Server 2012 R2, and resulted in the system hanging when it tried to boot with those operating systems installed. A firmware update eventually fixed the issue, but under the new HP policy, the critical fix would only be available to new ProLiant owners and people paying for an extended updates, as HP's ProLiant software warranty is limited to 90 days after purchase.
Another issue in 2011 saw ProLiant servers tossing up data transfer errors when used with certain hard drives. Again, a firmware update was required to fix the critical flaw.
Paying for access to support services is nothing new for enterprises, but the ProLiant line offers cheaper MicroServers that appeal to small businesses and PC hobbyists running their own servers at home.
At this writing, for example, you could get a ProLiant N54L MicroServer for less than $350 that comes with a 2.2GHz AMD processor, 2GB of RAM, and space for four hard drives. On top of the cost of the server box and extra hard drives, you'd have to tack on at least another $126 for the cheapest three-year Care Pack subscription available if you want access to future firmware updates—at least after your warranty runs out.
That extra $126 may not break your wallet, but why bother paying at all when, say, Dell offers free access to firmware updates for its entry-level server?
In her blog post, McCoy says HP's decision to restrict access to firmware updates was not about beefing up the company's bottom line. "We are in no way trying to force customers into purchasing extended coverage," she said. "That is, and always will be, a customer's choice."
Ian is an independent writer based in Israel who has never met a tech subject he didn't like. He primarily covers Windows, PC and gaming hardware, video and music streaming services, social networks, and browsers. When he's not covering the news he's working on how-to tips for PC users, or tuning his eGPU setup.


We built this law firm for clients who deserve more than an ordinary law firm. We don't hire large classes of lawyers and hope that most will turn out okay. Instead, Wyche lawyers are handpicked, one by one, to join this firm because each has the skills and accomplishments to be part of our effort to provide unmatched service to our clients. We work to maximize client satisfaction, not the billable hour.
Every one of our attorneys could have chosen to practice anywhere in the country. But we chose South Carolina, and Wyche. We are in South Carolina because we love this area, and are deeply committed to serving our community. We are at Wyche because we want the challenge and stimulation of practicing with an amazingly accomplished collection of attorneys, and the pride and satisfaction of knowing that we are part of a firm that gives the best possible service to its clients.
Wyche has practiced law and served the community for over 90 years. In that time, we have participated in landmark litigation, served as counsel on cutting-edge transactions, and provided community leadership that has helped shape and drive our region's growth and success. We look forward to continuing and expanding this exciting role in the business and culture of South Carolina. Our transactional lawyers are focused on the areas that are suited to South Carolina's vibrant and growing economy: providing entrepreneur services to new and growing clients, advising on mergers and acquisitions and other complex financial transactions, and supporting real estate development. Our litigators continue to be the lawyers of choice for big case litigation and matters presenting novel questions of law.
Wyche was built to serve clients who need top-flight lawyers in South Carolina. We look forward to helping you.
Wyche, P.A. is regionally ranked in 30 practice areas. The U.S. News - Best Lawyers® "Best Law Firms" rankings are based on a rigorous evaluation process.


text:
Let's Learn About Amphibians!
Amanda Littlejohn
Amanda is a retired educator with many years of experience teaching children of all ages and abilities in a wide range of contexts.
Image by Openclipart-Vectors via Pixabay
What Are Amphibians?
Amphibians are cold-blooded animals that are able to live both in water and on land. Most start life with gills, but later develop lungs for breathing.
Frogs, toads, salamanders, newts and caecilians are all types of amphibian. They are cold-blooded creatures that rely on their surroundings for warmth, and are found in most parts of the world. Adult amphibians usually have soft, thin, moist skin that absorbs oxygen from the air, helping them to breathe. But some frogs and toads have thick, warty skin to help them survive in drier conditions.
Jellied Eggs
The way amphibians breed and develop is unique in the animal kingdom. Females lay their jelly covered eggs, called spawn, in water. These hatch into tadpoles, which develop limbs and lungs so that they can live on dry land. Some amphibians need only a small amount of water in which to lay their eggs. The tree frog lays its eggs on moist leaves and the male midwife toad carries the female's eggs on its back legs, dipping them in pools of water. The Australian gastric brooding frog swallows her eggs. Once they have developed into froglets, they hop out of her mouth.
Image by Bill Kasman from Pixabay
Big Eaters
All amphibians are hunters. Many use their bulging eyes to track fast moving prey, swallowing it whole. Small frogs and salamanders eat insects and tiny fish. Large toads gulp down mice and birds. They usually sit and wait, or crawl towards their prey, before lunging with mouth open. Some frogs and salamanders have a long, sticky-tipped tongue attached to the front of their mouth, which they cab flick out to grab insects.
Leaping Frogs and Creeping Toads
Over 80% of all amphibians are frogs and toads, known as anurans. They have long, five-toed back legs for leaping and shorter, four-toed front legs used to cushion the landing. There is no scientific difference between frogs and toads, but anurans with smooth, moist skin that usually jump are called frogs, and those that waddle and have drier, lumpy skin are called toads.
Salamanders and Caecilians
Newts and salamanders (urudelans) have short limbs and long tails. Salamanders in Europe and North America that spend long periods in water are called newts. Most salamanders breathe with lungs and through their skin, although some have no lungs. Caecilians (apodans) are the third and smallest group of amphibians. They are wormlike, with blunt snouts for tunneling, tiny eyes, and wide mouths. They hunt mainly at night.
The Amphibian Life Cycle
When frogs mate, the male usually sits on the female's back for up to three days. As soon as the female lays her eggs in the water, the male releases sperm to fertilize them. The eggs hatch into tadpoles, which eventually metamorphose (change) into froglets (young frogs) and leave the water for life on land.
Stage One
The female frog lays her eggs, or spawn, in large masses in a pond or stream. The eggs are protected by a special jelly.
Stage Two
The lavae, or tadpoles, develop inside the eggs. About a week later, the tadpoles hatch out and attach themselves to plants.
Stage Three
The tadpoles breathe through their feathery gills and start to swim at about three days old. They feed on water weeds and algae in the water.
Stage Four
The tadpoles slowly turn into frogs, developing limbs and lungs so that they can live on land. Their tails are absorbed into their bodies.
Stage Five
Fully grown, the young frogs leave the water. They feed on small insects and will not reproduce themselves until they are a year old.
Life Cycle of a Frog
Illustration showing the life stages of a frog from spawn (eggs) to adult
Image by Lenka Bartušková from Pixabay
The Poisonous Fire Salamander
When the fire salamander is attacked by a predator, poison oozes out of the pores in its skin. It has two special glands that hold its poison. They can be found across its back and on the sides of its head. All amphibians have glands in their skin that produce slime to help keep it moist. Some also create foul tasting or poisonous substances as a defense against predators. The fire salamander's bright markings warn predators that it is poisonous to eat.
A poisonous fire salamander
Image by Sonja Rieck from Pixabay
More Facts About Frogs and Toads
As we've seen, frogs and toads belong to the group of animals known as amphibians. Most spend their early life as tadpoles in water, but the adults live mainly on land.
Frogs, while related to toads, generally have slimmer bodies with a smooth skin, while toads have a drier warty skin. All amphibians have thin skin as their lungs are inefficient and they use their skin to breathe through. Oxygen from the air passes through the skin into tiny blood vessels just under the surface. This can happen only if the skin is moist, so frogs and toads are usually found in damp places.
Sticky Tongues
Most frogs feed on slugs, insects and worms, which they catch with a long, sticky tongue. Larger frogs, such as the American bullfrog, also feed on prey such as mice, and even small ducklings.
Muscular Legs
Frogs are great jumpers. Their long, muscle-packed hind legs can send them shooting over 12 times their own length through the air. Webbed feet help frogs swim, while tree frogs make huge leaps from branch to branch, aided by sticky pads on their toes. Toads have less powerful back legs than most frogs and waddle.
Green or brown is the typical color of most frogs, but some tropical frogs are brilliantly colored. Some species change their skin color with changes in light or temperature, and all frogs shed the outer layer of their skin several times a year, pulling it over their head with their legs.
Noisy Courtship
Frogs and toads can be very noisy at breeding time, when males croak to attract females. The European Marsh frog is one of the noisiest. A colony sounds like a crowd of people laughing.
National Geographic: Amphibians Pictures and Facts
National Geographic Kids: Amphibians
BBC Bitesize: What Are Amphibians?
Young Peoples Trust for the Environment: What Is an Amphibian?
Encyclopedia Britannica Online
© 2020 Amanda Littlejohn
Amanda Littlejohn (author) on December 22, 2020:
Alnajda Kadi from Tirana Albania on December 22, 2020:
What an interesting article!
Thank you Pamela! yes, wise to keep a good distance from those!
Pamela Oglesby from Sunny Florida on December 18, 2020:
This is a very interesting article, Amanda. The poisonous salamander has interesting markings, but I wouldn't get too close.


"Did you just have wings??" my voice was rasping with shock, but it did not stop it from rising hysterically towards the end of the question.
"Yes..." He looked at me under his brows – that breathtakingly blue gaze.