text:
package org.locationtech.geomesa.kafka.data

import java.nio.charset.StandardCharsets
import java.util.concurrent.atomic.AtomicInteger
import java.util.concurrent.{ScheduledExecutorService, TimeUnit}
import java.util.{Collections, Date}

import com.typesafe.scalalogging.LazyLogging
import kafka.admin.AdminUtils
import org.apache.curator.framework.CuratorFrameworkFactory
import org.apache.curator.retry.ExponentialBackoffRetry
import org.geotools.data._
import org.geotools.filter.identity.FeatureIdImpl
import org.geotools.filter.text.ecql.ECQL
import org.geotools.geometry.jts.JTSFactoryFinder
import org.geotools.util.factory.Hints
import org.junit.runner.RunWith
import org.locationtech.geomesa.features.ScalaSimpleFeature
import org.locationtech.geomesa.index.metadata.TableBasedMetadata
import org.locationtech.geomesa.kafka.EmbeddedKafka
import org.locationtech.geomesa.kafka.ExpirationMocking.{MockTicker, ScheduledExpiry, WrappedRunnable}
import org.locationtech.geomesa.kafka.data.KafkaDataStoreFactory.KafkaDataStoreFactoryParams
import org.locationtech.geomesa.kafka.utils.KafkaFeatureEvent.KafkaFeatureChanged
import org.locationtech.geomesa.security.{AuthorizationsProvider, SecurityUtils}
import org.locationtech.geomesa.utils.collection.SelfClosingIterator
import org.locationtech.geomesa.utils.geotools.{FeatureUtils, SimpleFeatureTypes}
import org.locationtech.geomesa.utils.index.SizeSeparatedBucketIndex
import org.locationtech.geomesa.utils.io.WithClose
import org.locationtech.jts.geom.Point
import org.mockito.ArgumentMatchers
import org.opengis.feature.simple.SimpleFeatureType
import org.opengis.filter.Filter
import org.specs2.mock.Mockito
import org.specs2.mutable.Specification
import org.specs2.runner.JUnitRunner

@RunWith(classOf[JUnitRunner])
class KafkaDataStoreTest extends Specification with Mockito with LazyLogging {

  import scala.collection.JavaConversions._
  import scala.concurrent.duration._

  sequential // this doesn't really need to be sequential, but we're trying to reduce zk load

  var kafka: EmbeddedKafka = _

  step {
    logger.info("Starting embedded kafka/zk")
    kafka = new EmbeddedKafka()
    logger.info("Started embedded kafka/zk")
  }

  lazy val baseParams = Map(
//    "kafka.serialization.type" -> "avro",
    "kafka.brokers"            -> kafka.brokers,
    "kafka.zookeepers"         -> kafka.zookeepers,
    "kafka.topic.partitions"   -> 1,
    "kafka.topic.replication"  -> 1,
    "kafka.consumer.read-back" -> "Inf"
  )

  val gf = JTSFactoryFinder.getGeometryFactory
  val paths = new AtomicInteger(0)

  def getStore(zkPath: String, consumers: Int, extras: Map[String, AnyRef] = Map.empty): KafkaDataStore = {
    val params = baseParams ++ Map("kafka.zk.path" -> zkPath, "kafka.consumer.count" -> consumers) ++ extras
    DataStoreFinder.getDataStore(params).asInstanceOf[KafkaDataStore]
  }

  def createStorePair(name: String,
                      params: Map[String, AnyRef] = Map.empty): (KafkaDataStore, KafkaDataStore, SimpleFeatureType) = {
    // note: the topic gets set in the user data, so don't re-use the same sft instance
    val sft = SimpleFeatureTypes.createType("kafka", "name:String,age:Int,dtg:Date,*geom:Point:srid=4326")
    val path = s"geomesa/$name/test/${paths.getAndIncrement()}"
    (getStore(path, 0, params), getStore(path, 1, params), sft)
  }

  "KafkaDataStore" should {

    "return correctly from canProcess" >> {
      import org.locationtech.geomesa.kafka.data.KafkaDataStoreFactory.KafkaDataStoreFactoryParams._
      val factory = new KafkaDataStoreFactory
      factory.canProcess(Map.empty[String, Serializable]) must beFalse
      factory.canProcess(Map(Brokers.key -> "test", Zookeepers.key -> "test")) must beTrue
    }

    "handle old read-back params" >> {
      val deprecated = Seq(
        "autoOffsetReset" -> "earliest",
        "autoOffsetReset" -> "latest",
        "kafka.consumer.from-beginning" -> "true",
        "kafka.consumer.from-beginning" -> "false"
      )
      foreach(deprecated) { case (k, v) =>
        KafkaDataStoreFactoryParams.ConsumerReadBack.lookupOpt(Collections.singletonMap(k, v)) must not(throwAn[Exception])
      }
    }

    "create unique topics based on zkPath" >> {
      val path = s"geomesa/topics/test/${paths.getAndIncrement()}"
      val ds = getStore(path, 0)
      try {
        ds.createSchema(SimpleFeatureTypes.createType("kafka", "name:String,age:Int,dtg:Date,*geom:Point:srid=4326"))
        ds.getSchema("kafka").getUserData.get(KafkaDataStore.TopicKey) mustEqual s"$path-kafka".replaceAll("/", "-")
      } finally {
        ds.dispose()
      }
    }

    "use namespaces" >> {
      import org.locationtech.geomesa.kafka.data.KafkaDataStoreFactory.KafkaDataStoreFactoryParams._
      val path = s"geomesa/namespace/test/${paths.getAndIncrement()}"
      val ds = getStore(path, 0, Map(NamespaceParam.key -> "ns0"))
      try {
        ds.createSchema(SimpleFeatureTypes.createType("kafka", "name:String,age:Int,dtg:Date,*geom:Point:srid=4326"))
        ds.getSchema("kafka").getName.getNamespaceURI mustEqual "ns0"
        ds.getSchema("kafka").getName.getLocalPart mustEqual "kafka"
      } finally {
        ds.dispose()
      }
      val ds2 = getStore(path, 0, Map(NamespaceParam.key -> "ns1"))
      try {
        ds2.getSchema("kafka").getName.getNamespaceURI mustEqual "ns1"
        ds2.getSchema("kafka").getName.getLocalPart mustEqual "kafka"
      } finally {
        ds2.dispose()
      }
    }

    "allow schemas to be created and deleted" >> {
      foreach(Seq(true, false)) { cqEngine =>
        TableBasedMetadata.Expiry.threadLocalValue.set("10ms")
        val (producer, consumer, _) = try {
          val params = if (cqEngine) {
            Map("kafka.index.cqengine" -> "geom:default,name:unique")
          } else {
            Map.empty[String, String]
          }
          createStorePair("createdelete", params)
        } finally {
          TableBasedMetadata.Expiry.threadLocalValue.remove()
        }
        consumer must not(beNull)
        producer must not(beNull)
        try {
          val sft = SimpleFeatureTypes.createImmutableType("kafka", "name:String,age:Int,dtg:Date,*geom:Point:srid=4326;geomesa.foo='bar'")
          val topic = s"${producer.config.catalog}-${sft.getTypeName}".replaceAll("/", "-")
          producer.createSchema(sft)
          foreach(Seq(producer, consumer)) { ds =>
            ds.getTypeNames.toSeq mustEqual Seq(sft.getTypeName)
            val schema = ds.getSchema(sft.getTypeName)
            schema must not(beNull)
            schema mustEqual sft
            schema.getUserData.get("geomesa.foo") mustEqual "bar"
            schema.getUserData.get(KafkaDataStore.TopicKey) mustEqual topic
          }
          KafkaDataStore.withZk(kafka.zookeepers) { zk =>
            AdminUtils.topicExists(zk, topic) must beTrue
          }
          consumer.removeSchema(sft.getTypeName)
          foreach(Seq(consumer, producer)) { ds =>
            eventually(40, 100.millis)(ds.getTypeNames.toSeq must beEmpty)
            ds.getSchema(sft.getTypeName) must beNull
          }
          KafkaDataStore.withZk(kafka.zookeepers) { zk =>
            eventually(40, 100.millis)(AdminUtils.topicExists(zk, topic) must beFalse)
          }
        } finally {
          consumer.dispose()
          producer.dispose()
        }
      }
    }

    "write/update/read/delete features" >> {
      foreach(Seq(true, false)) { cqEngine =>
        val params = if (cqEngine) {
          Map("kafka.index.cqengine" -> "geom:default,name:unique")
        } else {
          Map.empty[String, String]
        }
        val (producer, consumer, sft) = createStorePair("writeupdatedelete", params)
        try {
          producer.createSchema(sft)
          val store = consumer.getFeatureSource(sft.getTypeName) // start the consumer polling

          val f0 = ScalaSimpleFeature.create(sft, "sm", "smith", 30, "2017-01-01T00:00:00.000Z", "POINT (0 0)")
          val f1 = ScalaSimpleFeature.create(sft, "jo", "jones", 20, "2017-01-02T00:00:00.000Z", "POINT (-10 -10)")

          // initial write
          WithClose(producer.getFeatureWriterAppend(sft.getTypeName, Transaction.AUTO_COMMIT)) { writer =>
            Seq(f0, f1).foreach(FeatureUtils.write(writer, _, useProvidedFid = true))
          }
          eventually(40, 100.millis)(SelfClosingIterator(store.getFeatures.features).toSeq must containTheSameElementsAs(Seq(f0, f1)))

          // update
          val f2 = ScalaSimpleFeature.create(sft, "sm", "smith2", 32, "2017-01-01T00:00:02.000Z", "POINT (2 2)")
          WithClose(producer.getFeatureWriterAppend(sft.getTypeName, Transaction.AUTO_COMMIT)) { writer =>
            FeatureUtils.write(writer, f2, useProvidedFid = true)
          }
          eventually(40, 100.millis)(SelfClosingIterator(store.getFeatures.features).toSeq must containTheSameElementsAs(Seq(f1, f2)))

          // query
          val queries = Seq(
            "strToUpperCase(name) = 'JONES'",
            "name = 'jones' OR name = 'smith'",
            "name = 'foo' OR name = 'bar' OR name = 'baz' OR name = 'blarg' OR name = 'jones' OR name = 'smith'",
            "name = 'jones'",
            "age < 25",
            "bbox(geom, -15, -15, -5, -5) AND age < 25",
            "bbox(geom, -15, -15, 5, 5) AND dtg DURING 2017-01-01T12:00:00.000Z/2017-01-02T12:00:00.000Z",
            "INTERSECTS(geom, POLYGON((-11 -11, -9 -11, -9 -9, -11 -9, -11 -11))) AND bbox(geom, -15, -15, 5, 5)"
          )

          forall(queries) { ecql =>
            val query = new Query(sft.getTypeName, ECQL.toFilter(ecql))
            val features = SelfClosingIterator(consumer.getFeatureReader(query, Transaction.AUTO_COMMIT)).toSeq
            features mustEqual Seq(f1)
          }

          // delete
          producer.getFeatureSource(sft.getTypeName).removeFeatures(ECQL.toFilter("IN('sm')"))
          eventually(40, 100.millis)(SelfClosingIterator(store.getFeatures.features).toSeq must beEqualTo(Seq(f1)))

          // clear
          producer.getFeatureSource(sft.getTypeName).removeFeatures(Filter.INCLUDE)
          eventually(40, 100.millis)(SelfClosingIterator(store.getFeatures.features).toSeq must beEmpty)
        } finally {
          consumer.dispose()
          producer.dispose()
        }
      }
    }

    "write/read with visibilities" >> {
      import org.locationtech.geomesa.security.AuthProviderParam

      foreach(Seq(true, false)) { cqEngine =>
        var auths: Set[String] = null
        val provider = new AuthorizationsProvider() {
          import scala.collection.JavaConversions._
          override def getAuthorizations: java.util.List[String] = auths.toList
          override def configure(params: java.util.Map[String, _ <: java.io.Serializable]): Unit = {}
        }
        val params = if (cqEngine) {
          Map("kafka.index.cqengine" -> "geom:default,name:unique")
        } else {
          Map.empty[String, String]
        }
        val (producer, consumer, sft) = createStorePair("vis", params + (AuthProviderParam.key -> provider))
        try {
          producer.createSchema(sft)
          val store = consumer.getFeatureSource(sft.getTypeName) // start the consumer polling

          val f0 = ScalaSimpleFeature.create(sft, "sm", "smith", 30, "2017-01-01T00:00:00.000Z", "POINT (0 0)")
          f0.getUserData.put(SecurityUtils.FEATURE_VISIBILITY, "USER")
          val f1 = ScalaSimpleFeature.create(sft, "jo", "jones", 20, "2017-01-02T00:00:00.000Z", "POINT (-10 -10)")
          f1.getUserData.put(SecurityUtils.FEATURE_VISIBILITY, "USER&ADMIN")

          // initial write
          WithClose(producer.getFeatureWriterAppend(sft.getTypeName, Transaction.AUTO_COMMIT)) { writer =>
            Seq(f0, f1).foreach(FeatureUtils.write(writer, _, useProvidedFid = true))
          }

          // admin user
          auths = Set("USER", "ADMIN")
          eventually(40, 100.millis)(SelfClosingIterator(store.getFeatures.features).toSeq must containTheSameElementsAs(Seq(f0, f1)))

          // regular user
          auths = Set("USER")
          SelfClosingIterator(store.getFeatures.features).toSeq mustEqual Seq(f0)

          // unauthorized
          auths = Set.empty
          SelfClosingIterator(store.getFeatures.features).toSeq must beEmpty
        } finally {
          consumer.dispose()
          producer.dispose()
        }
      }
    }

    "expire entries" >> {
      foreach(Seq(true, false)) { cqEngine =>
        val executor = mock[ScheduledExecutorService]
        val ticker = new MockTicker()
        val params = if (cqEngine) {
          Map("kafka.cache.expiry" -> "100ms",
            "kafka.cache.executor" -> (executor, ticker),
            "kafka.index.cqengine" -> "geom:default,name:unique")
        } else {
          Map("kafka.cache.expiry" -> "100ms", "kafka.cache.executor" -> (executor, ticker))
        }
        val (producer, consumer, sft) = createStorePair("expire", params)
        try {
          producer.createSchema(sft)
          val store = consumer.getFeatureSource(sft.getTypeName) // start the consumer polling

          val f0 = ScalaSimpleFeature.create(sft, "sm", "smith", 30, "2017-01-01T00:00:00.000Z", "POINT (0 0)")
          val f1 = ScalaSimpleFeature.create(sft, "jo", "jones", 20, "2017-01-02T00:00:00.000Z", "POINT (-10 -10)")

          val bbox = ECQL.toFilter("bbox(geom,-10,-10,10,10)")

          val expirations = Collections.synchronizedList(new java.util.ArrayList[WrappedRunnable](2))
          executor.schedule(ArgumentMatchers.any[Runnable](), ArgumentMatchers.anyLong(), ArgumentMatchers.eq(TimeUnit.MILLISECONDS)) responds { args =>
            val expire = new WrappedRunnable(0L)
            expire.runnable = args.asInstanceOf[Array[AnyRef]](0).asInstanceOf[Runnable]
            expirations.add(expire)
            new ScheduledExpiry(expire)
          }

          // initial write
          WithClose(producer.getFeatureWriterAppend(sft.getTypeName, Transaction.AUTO_COMMIT)) { writer =>
            Seq(f0, f1).foreach(FeatureUtils.write(writer, _, useProvidedFid = true))
          }
          // check the cache directly
          eventually(40, 100.millis)(SelfClosingIterator(store.getFeatures.features).toSeq must
              containTheSameElementsAs(Seq(f0, f1)))
          // check the spatial index
          eventually(40, 100.millis)(SelfClosingIterator(store.getFeatures(bbox).features).toSeq must
              containTheSameElementsAs(Seq(f0, f1)))

          // expire the cache
          expirations.foreach(_.runnable.run())

          // verify feature has expired - hit the cache directly
          SelfClosingIterator(store.getFeatures.features) must beEmpty
          // verify feature has expired - hit the spatial index
          SelfClosingIterator(store.getFeatures(bbox).features) must beEmpty
        } finally {
          consumer.dispose()
          producer.dispose()
        }
      }
    }

    "clear on startup" >> {
      val params = Map("kafka.producer.clear" -> "true")
      val (producer, consumer, sft) = createStorePair("clear-on-startup", params)
      try {
        producer.createSchema(sft)
        val store = consumer.getFeatureSource(sft.getTypeName) // start the consumer polling

        val f0 = ScalaSimpleFeature.create(sft, "sm", "smith", 30, "2017-01-01T00:00:00.000Z", "POINT (0 0)")
        val f1 = ScalaSimpleFeature.create(sft, "jo", "jones", 20, "2017-01-02T00:00:00.000Z", "POINT (-10 -10)")
        val f2 = ScalaSimpleFeature.create(sft, "do", "doe", 40, "2017-01-03T00:00:00.000Z", "POINT (10 10)")

        // initial write
        WithClose(producer.getFeatureWriterAppend(sft.getTypeName, Transaction.AUTO_COMMIT)) { writer =>
          Seq(f0, f1).foreach(FeatureUtils.write(writer, _, useProvidedFid = true))
        }
        eventually(40, 100.millis)(SelfClosingIterator(store.getFeatures.features).toSeq must containTheSameElementsAs(Seq(f0, f1)))

        // new producer - clears on startup
        val producer2 = getStore(producer.config.catalog, 0, params)
        try {
          // write the third feature
          WithClose(producer2.getFeatureWriterAppend(sft.getTypeName, Transaction.AUTO_COMMIT)) { writer =>
            FeatureUtils.write(writer, f2, useProvidedFid = true)
          }
          eventually(40, 100.millis)(SelfClosingIterator(store.getFeatures.features).toSeq mustEqual Seq(f2))
        } finally {
          producer2.dispose()
        }
      } finally {
        consumer.dispose()
        producer.dispose()
      }
    }

    "support listeners" >> {
      val (producer, consumer, sft) = createStorePair("listeners")
      try {
        val id = "fid-0"
        val numUpdates = 1
        val maxLon = 80.0

        var latestLon = -1.0
        var count = 0

        val listener = new FeatureListener {
          override def changed(event: FeatureEvent): Unit = {
            val feature = event.asInstanceOf[KafkaFeatureChanged].feature
            feature.getID mustEqual id
            latestLon = feature.getDefaultGeometry.asInstanceOf[Point].getX
            count += 1
          }
        }

        producer.createSchema(sft)
        val consumerStore = consumer.getFeatureSource(sft.getTypeName)
        consumerStore.addFeatureListener(listener)

        WithClose(producer.getFeatureWriterAppend(sft.getTypeName, Transaction.AUTO_COMMIT)) { writer =>
          (numUpdates to 1 by -1).foreach { i =>
            val ll = maxLon - maxLon / i
            val sf = writer.next()
            sf.setAttributes(Array[AnyRef]("smith", Int.box(30), new Date(), s"POINT ($ll $ll)"))
            sf.getIdentifier.asInstanceOf[FeatureIdImpl].setID(id)
            sf.getUserData.put(Hints.USE_PROVIDED_FID, java.lang.Boolean.TRUE)
            writer.write()
          }
        }

        eventually(40, 100.millis)(count must beEqualTo(numUpdates))
        latestLon must be equalTo 0.0
      } finally {
        consumer.dispose()
        producer.dispose()
      }
    }

    "migrate old kafka data store schemas" >> {
      val spec = "test:String,dtg:Date,*geom:Point:srid=4326"

      val path = s"geomesa/migrate/test/${paths.getAndIncrement()}"
      val client = CuratorFrameworkFactory.builder()
          .namespace(path)
          .connectString(kafka.zookeepers)
          .retryPolicy(new ExponentialBackoffRetry(1000, 3))
          .build()
      client.start()

      try {
        client.create.forPath("/test", s"$spec;geomesa.index.dtg=dtg".getBytes(StandardCharsets.UTF_8))
        client.create.forPath("/test/Topic", "test-topic".getBytes(StandardCharsets.UTF_8))

        val ds = getStore(path, 0)
        try {
          ds.getTypeNames.toSeq mustEqual Seq("test")
          val sft = ds.getSchema("test")
          sft must not(beNull)
          KafkaDataStore.topic(sft) mustEqual "test-topic"
          SimpleFeatureTypes.encodeType(sft) mustEqual spec

          client.checkExists().forPath("/test") must beNull
        } finally {
          ds.dispose()
        }
      } finally {
        client.close()
      }
    }
  }

  "KafkaDataStoreFactory" should {
    "clean zkPath" >> {
      def getNamespace(path: String): String =
        KafkaDataStoreFactory.createZkNamespace(Map(KafkaDataStoreFactoryParams.ZkPath.getName -> path))

      // a well formed path starts does not start or end with a /
      getNamespace("foo/bar/baz") mustEqual "foo/bar/baz"
      getNamespace("foo/bar/baz/") mustEqual "foo/bar/baz" // trailing slash
      getNamespace("/foo/bar/baz") mustEqual "foo/bar/baz" // leading slash
      getNamespace("/foo/bar/baz/") mustEqual "foo/bar/baz" // both leading and trailing slash
      forall(Seq("/", "//", "", null))(n => getNamespace(n) mustEqual KafkaDataStoreFactory.DefaultZkPath) // empty
    }
    "Parse SSI tiers" >> {
      val key = KafkaDataStoreFactoryParams.IndexTiers.getName
      KafkaDataStoreFactory.parseSsiTiers(Collections.emptyMap()) mustEqual SizeSeparatedBucketIndex.DefaultTiers
      KafkaDataStoreFactory.parseSsiTiers(Collections.singletonMap(key, "foo")) mustEqual SizeSeparatedBucketIndex.DefaultTiers
      KafkaDataStoreFactory.parseSsiTiers(Collections.singletonMap(key, "1:2")) mustEqual Seq((1d, 2d))
      KafkaDataStoreFactory.parseSsiTiers(Collections.singletonMap(key, "1:2,3:4")) mustEqual Seq((1d, 2d), (3d, 4d))
      KafkaDataStoreFactory.parseSsiTiers(Collections.singletonMap(key, "3:4,1:2")) mustEqual Seq((1d, 2d), (3d, 4d))
    }
  }

  "KafkaFeatureSource" should {
    "handle Query instances with null TypeName (GeoServer querylayer extension implementation nuance)" >> {
      val (p, c, sft) = createStorePair("querylayer")
      p.createSchema(sft)
      val fs = c.getFeatureSource(sft.getTypeName)
      val q = new Query(null, Filter.INCLUDE)
      def check = fs.getFeatures(q).features().close()
      // induce issue
      check must not throwA[NullPointerException]()
    }
  }

  step {
    logger.info("Stopping embedded kafka/zk")
    kafka.close()
    logger.info("Stopped embedded kafka/zk")
  }
}


text:
Gilead Logistic Services
Sales Research
Transport & Logistics Procurement
Pre-Sales Research Training
Cold Call Training
Training Course Programmes
The Jumbo Sized Inspiration
"Being from a small town, the very idea of hundreds of people occupying the one plane landing before me, one that had just flown from the other side of the world, was then a wonderful one, in the true sense of the word."
If my memory serves me correctly, I was visiting Sydney on a rare vacation at a southern seaside suburb when I first saw one of the early flights of a Pan Am B747-100 series jumbo jet on final landing approach to Mascot airport from QANTAS drive. Not long before, I had seen the moon landing on black & white TV in my small country town; and there was little degree of separation between them in terms of logistical inspiration.
When I was some years younger, I had seen a Fokker Friendship (see video below) one night at a regional NSW airport. It was a thrilling encounter, to the point of it being frightening. This was especially so due to the extreme levels of noise to my young ears from the turboprop engines and the smell of kerosene. By the time I saw my jumbo jet, my earlier sense of fright had dissipated and these aircraft appeared almost serene, despite the high levels of noise.
Image: www.panam.org
The noise of the Fokker...
Being from a small town, the very idea of hundreds of people occupying the one plane landing before me, one that had just flown from the other side of the world, was then a wonderful one in the true sense of the word. Along those same lines, the very fact that Pan Am had called such planes their "Clippers" was both fitting and remarkable marketing.
I was never to get aboard one of those first series B747-100 passenger planes, but on several occasions I was in the jump seats and cabin on the full freighter 100 version. I could not afford to purchase a ticket in order to fly in such a plane until adulthood, but what I could do was to apply for a job in the international freight industry. I could also decide to work my tail off in order to learn, and then (by way of being productive) get ahead in that industry.
As my career flourished in international transport, so too did the proliferation of the Boeing "jumbo" into nearly all of the major air (trunk) routes of the world. Today, however, we are gradually seeing the B747 passenger planes being withdrawn from service.
www.bloomberg.com/news/articles/2017-01-11/united-s-747-retirement-plan-marks-end-for-iconic-jumbo-in-u-s
The above-linked announcement of United's withdrawal is, for me, significant in that they had taken over Pan Am's Pacific air routes upon the latter's demise. In fact, despite all the hard work, it had taken quite some time until I was offered my first business flight across the Pacific in the early-to-mid 80's; and so it proved that I was to be flown by United on an ex-Pan Am long-range B747-SP. While the United attendants and cabin crew, might have been described as more than a little tired at the time, this plane's performance envelope was still one to catch the imagination. The most significant thing about the shortened SP version of the B747 was that it had sufficient range to overfly Hawaii, and it allowed direct flight from Sydney to Los Angeles.
Flying a regular B747-200, or DC10, at that time (as I was to do more regularly) meant landing at an ungodly hour in the morning in Honolulu, recovering your luggage, waiting interminably until US Customs opened, and then confronting the said Customs officers before they had absorbed their first coffee of the morning. After many tortuous hours, you gained the "privilege" to recheck your luggage, and depart for the next intermediate US airport, where you would often have to again immediately transfer to a beyond location on a fully US domestic flight. Hence getting a B747-SP flight (see video in the end of this post), and being able to access a 75% agent discounted ticket from United, was a godsend!
I would go on to take several flights on the B747-SP, and even though I never got to fly to South Africa on one of the QANTAS planes of this model, I did once have an interesting flight into Sydney on Mandarin Airlines where the ex-Taiwanese air force pilot threw the shortened high performance version of the jumbo around like a sports car, as he tried to wipe off speed and extend time after having approached Sydney too quickly for air traffic control's liking.
Before leaving the 200 series jumbo, I need to mention two very significant points. The first is that the 200 became the base load carrying aircraft for most long haul international routes where its range was often appropriate to the market. Without it my industry would not have grown the way it did, and my opportunities may well have been far more limited. The B747-200 was better for the cargo industry than later series planes principally because the shorter flight ranges available to passengers correlated with near-maximised cargo loads in most instances. In practice they were also to prove far less affected (in respect of cargo load-ability) than later B747 series by winds and full passenger/baggage loads on most of their scheduled sectors.
The other B747-200 series aircraft that was particularly important for the Australian market (for QANTAS who operated it, and for my career) was the B747-200 Combi. This aircraft's main passenger deck was shortened, with the aft of the plane being occupied by freight that was loaded through a rear main-deck cargo door. The difference between able to load cargo with heights around 1.6me under-deck in the cargo holds, with that of over 2me on a main cargo deck of a B747 was profound.
The particular significance of the said B747-200 Combi aircraft for my employer at the time was the enabling of the carriage by air of tall mainframe computers, which was for us and many others, a key 1980's market. At the time, the economics of running full freighter airliners, for those airlines operating on the Pacific runs in particular, would not have allowed them to serve the computer market as effectively as when the Combis were in service.
Alas, the downfall of the 200 series Combi was to be correlated with the firewall issues that were punctuated on 28 November 1987; when a South African Airlines 747- 200 Combi was lost over the Indian Ocean. While the Dutch and others flew some in later jumbo series, the Combi was never to be widely considered as effective in service again.
It was, however, to be the last of the "classic" jumbo's, the B747-300, that was to prove to be my favourite of the overall series. Whether it was flying as a passenger with JAL across the Pacific, or with QANTAS on the Tokyo route, this aircraft just felt right for me on a seat-of-the-pants basis.
As for the B747-400, marking it as a "non-classic" of the series is appropriate as I see it. Upon launch as a passenger plane it failed its cargo load-ability test at anywhere near range at its maximum takeoff weight. It's range performance simply didn't meet Boeing's sales pitch bought by the airlines that operated them.
When Boeing offered and delivered the extended range version of the B747-400 to QANTAS, their passenger management commercial decision was to consume the critical extra maximum take-off weight gained by immediately installing heavier on-board entertainment systems which, in turn, meant that direct flights to & from ports like Chicago and Dallas and the Australian East Coast became very marginal propositions for BOTH cargo and passengers. And yet, still we found cargo was sometimes pushed back by the pilots for US West Coast departing flights given adverse winds and high passenger loads.
The full cargo (or freighter version) of the B747-400 was ok, but it didn't bring a lot extra to the table other than increased reliability & better fuel burn after they displaced the old-banger 100 and 200 series freighters that had been operating well past their used-by dates (to the point of the doors falling off!). Over the following decade it would be proved that the B747-400F's ultimately didn't pay their way.
The more recent B747-8F freighter has achieved a very limited number of orders and is to be the last of the jumbo series (if you exclude the troubled US Presidential plane project). As with the B747-400F, the lesser viability of new delivered freighters in the contemporary era is down to the proliferation of belly cargo space in the fast growing wide-body passenger aircraft market. In the latter case, if the cargo revenues derived from marketing from this passenger belly space do more than pay for the fuel, marketing/admin, and terminal costs, then they are contributing marginal returns to the overall airline operation.
Just as high value cargoes like mainframe computers have shrunk in physical size (and crucially in height), so too have many other tech devices. This means that demand for main deck cargo has ebbed in parallel with the new orders for the jumbo.
Perhaps the demise of the jumbo is fitting for the era, and perhaps too, new inspiration and concepts appropriate for a new era are overdue.
"... getting a B747-SP
75% agent discounted ticket from United was a godsend!"
http://www.traveller.com.au/everyone-asks-why-was-the-boeing-747-designed-with-a-hump-h16kdu
Ross Delaney
Ross is an experienced transportation management professional
who has operational, sales & regional business unit leadership experience developed while employed by Australian, European, and American multinational corporations over several decades.
Cold Call
Pre Distribution
Pre-distribution
Transport Sales

redpajama_set_name: RedPajamaCommonCrawl


text:
Apocopis courtallumensis är en gräsart som först beskrevs av Ernst Gottlieb von Steudel, och fick sitt nu gällande namn av Johannes Jan Theodoor Henrard. Apocopis courtallumensis ingår i släktet Apocopis och familjen gräs. Inga underarter finns listade i Catalogue of Life.

Källor

Externa länkar

Gräs
courtallumensis

redpajama_set_name: RedPajamaWikipedia


text:
Uno Tölpus (14 August 1928 Kunda – 11 August 1964 Käsmu) was an Estonian architect. He was one of the most notable Estonian architects in 1950s.

In 1952 he graduated from Tallinn Polytechnical Institute. From 1952 to 1964 he worked at the architectural bureau Eesti Projekt.

Works

 1958: Eesti Energia's building in Tallinn (with Peeter Tarvas)
 1963: Tallinn University Academic Library (with P. Madalik)
 Vanemuine Concert Hall (one of the designers)

References

1928 births
1964 deaths
20th-century Estonian architects
Tallinn University of Technology alumni
People from Kunda, Estonia


According to senior officials of the Directorate General of Civil Aviation (DGCA), the crew on Jet Airways flight (9W 697) forgot to turn on the 'bleed switch', which keeps the air pressure level inside the cabin at a comfortable level after the aircraft gains height.
At least 30 passengers, including an infant, suffered nose bleeding, chest pain and other medical complications following an alleged manual error in maintaining the cabin air pressure on a Jet Airways flight from Mumbai to Jaipur on Thursday morning. As the flight returned to Mumbai, five passengers were taken to Nanavati Hospital after they complained of serious pain.
Pilots usually shut off the 'bleed switch' button during take-off to gain thrust, and are required to switch it back on when they have climbed 500-1000 feet.
According to the airline's statement, the "flight's cockpit crew has been taken off scheduled duties pending investigation". The Ministry of Civil Aviation has ordered a probe into the incident by the Aircraft Accident Investigation Bureau (AAIB).
The Jet Airways flight reportedly took off from Mumbai at 6.05 am. Within 20 minutes, passengers complained of pain in the shoulders, ears and breathlessness. As the air pressure level dropped, oxygen masks dropped down from the overhead compartment, said passengers, adding that no announcement was made by the cabin crew.
Passengers had to wear the oxygen mask as crew did not maintain cabin pressure.
Ankur Kala (38), one of the five passengers who was taken to Nanavati Hospital, said his oxygen mask was filled with blood after his nose started to bleed. "But the air hostess neither came to me immediately, nor allowed me to get up. There was extreme pressure on my ears. The crew members seemed scared, not sure what protocol to follow," he told The Indian Express.
Kala said that when the cabin pressure dropped, a woman passenger rushed towards the air hostess. "The air hostess said we are landing, and asked her to sit down. Until then, we didn't even know we were returning to Mumbai," he said. He claimed that he held both hands pressed on his ears as his nose started to bleed. "I had chest pain, could not hear anything. I passed out for 15 seconds or so," he said.
"What surprised us was that there was no announcement or even a sign to put the seat belt on. There was panic because the cabin crew looked clueless when the oxygen masks fell," said Amit Relan (36), another passenger.
The passengers alleged that they were not offered food or water for hours.
Soon after the oxygen masks fell, a few passengers reportedly suffered nose bleeding. "A man in front of me was bleeding, another woman in the adjacent row suffered a nose bleed. A passenger behind me had difficulty in hearing," said Relan.
Satish Nair, a Vashi resident who was also on the flight, said his shoulders drooped and he sensed a blackout 10 minutes after the flight took off. "As I continued to feel restless, the oxygen masks dropped down, causing alarm among the passengers. We had no one to look to, as the airline crew looked equally confused. It was only after some scared passengers asked how to use the masks that the pilot announced that we were required to wear it," he said.
Nair complained of lack of training among the crew, saying they delayed in informing passengers about the problem regarding cabin pressure. "It was only after we neared Mumbai airport that the air pressure level was restored. After we landed, the air-conditioner started working and we could breathe easily. After landing, the pilot announced that there were issues with pressurisation inside the cabin," he said.
The flight landed at the Mumbai airport at 7.15 am. Thirty of the 166 passengers, including an infant, required medical aid. Passengers also complained of lack of medical facilities at the airport, saying that only one medical van was there to take them to the terminal building.
The airline arranged an alternate flight at 10.30 am for the passengers to go to Jaipur. The passengers alleged that they were not offered food or water for hours.
"My brother has been advised not to travel for seven days. Doctors said there was a lot of pressure on his ear drums. We wonder how and why other passengers were taken on the next flight to Jaipur despite nose bleed," said Ankur Kala's brother, Vikram.
Dr Rajendra Patankar, chief operating officer, Nanavati Hospital, said all five passengers were treated as 'out patients'. They underwent blood pressure check, 2D echo and audiometry tests, he said. "We gave them antibiotics and medication to stabilise their breathing. All of them are stable. They suffered from Baro-otitis in ear due to change in air pressure," said ENT consultant Dr Amol Patil. Following Thursday's incident, Civil Aviation Minister Suresh Prabhu has directed DGCA officials to prepare a safety audit plan which would assess safety parameters of all scheduled airlines, aerodromes and flight training schools. The report is to be submitted within 30 days.
Meanwhile, Additional Commissioner of Police, West region, Manoj Kumar Sharma said that no complaint had been filed by the passengers or the DGCA.


text:
What's in Store for Shawn Marion After the Cleveland Cavaliers?
Photo courtesy of Flickr/Keith Allison
It's an exciting time for the Cleveland Cavaliers with the arrival of Kevin Love and the return of their beloved LeBron James. Expected to make a push for the NBA Championship this year, the Cavs have a more robust and entertaining squad compared to last year's roster. But for players such as small forward Shawn Marion, who recently signed with the Cavs, there aren't many years left in his NBA career.
Having played for the Phoenix Suns, Miami Heat, Toronto Raptors, and the Dallas Mavericks, Marion has had a career that most professional basketball players can only dream of. It's a testament to Marion too, that at the age of 36, he's still playing in the world's most competitive basketball league. But these days won't last forever, and sooner rather than later, Marion will have to hang up his basketball sneakers and make way for basketball's latest generation of fledgling stars.
Although, this doesn't seem to be concerning Marion as he continues to frequently participate in poker's World Series Main Events. In 2011, he finished just out of the money, but more than held his own. Here's a video of Marion being interviewed during a break in play on Day 1 of the WSOP.
It looks like Marion has become completely obsessed with the world of poker. In 2011, he told Case Keefer from the Las Vegas Sun, that he would potentially look at participating on a professional basis once his basketball career was over. Like fellow pros such as Paul Pierce, Marion thinks he has what it takes to perform with the elite of the poker world.
Many ex-pros are afforded the chance of competing at such exclusive levels because of the ability to afford the buy-ins. But it's also poker's unprecedented popularity that draws so many people into wanting to play the sport. Once the first wagering casino site was unveiled online in the form of InterCasino, a huge boom in participation ensued. The WSOP was being televised on major TV channels and the appeal of the sport grew exponentially.
Although, Marion didn't feature in this year's WSOP, it looks inevitable that he will be seeing much more of the bright lights of Vegas in the not too distant future. And as his career draws to a close, he can take solace in the fact that interesting times lie ahead.
Related Items:cleveland cavaliers, kevin love, lebron james, shawn marion, world series of poker, wsop
2020-21 NBA Season Preview
2020-21 NBA Season Preview: Central Division
BMF Hoops Debut: adidas J Wall 1 Collection
New York Knicks Media Day: Unfinished Business


text:
Trophic relationships and health risk assessments of trace metals in the aquaculture pond ecosystem of Pearl River Delta, China
Zhang CHENG, Yu Bon MAN, Xiang Ping NIE, Ming Hung WONG
Cadmium, lead, zinc, Chromium, copper, nickel and manganese in sediments and in aquatic organisms were collected from the aquaculture pond ecosystem of the Pearl River Delta (PRD), China and analyzed to evaluate bioaccumulation and trophic transfer in food chains, as well as the potential health risk of exposure to the Hong Kong residents via dietary intake of these aquatic products. The results revealed that based on the biota-sediment accumulation factor, omnivorous fish and zooplankton accumulated more trace metals from sediment than carnivorous fish. Concentrations of seven trace metals in aquaculture pond of PRD significantly decreased with increasing trophic levels, showing that these trace metals were trophically diluted in predatory and omnivorous food chains. The hazard index values of all fish species were smaller than 1 for adults and children, indicating there was no health risk from the multiple metals via ingestion of the freshwater fish for the inhabitants. Copyright © 2012 Elsevier Ltd. All rights reserved.
https://doi.org/10.1016/j.chemosphere.2012.11.017
Cheng, Z., Man, Y. B., Nie, X. P., & Wong, M. H. (2013). Trophic relationships and health risk assessments of trace metals in the aquaculture pond ecosystem of Pearl River Delta, China. Chemosphere, 90(7), 2142-2148. doi: 10.1016/j.chemosphere.2012.11.017
Trace metals
Biomagnification
Aquaculture fish
Pearl River Delta
Fingerprint Dive into the research topics of 'Trophic relationships and health risk assessments of trace metals in the aquaculture pond ecosystem of Pearl River Delta, China'. Together they form a unique fingerprint.
Aquaculture Chemical Compounds
Ponds Medicine & Life Sciences
Health risks Chemical Compounds
Rivers Medicine & Life Sciences
Fish Chemical Compounds
Ecosystems Chemical Compounds
aquaculture Earth & Environmental Sciences


text:
Post-Dispatch Columnist Tony Messenger: Debtors' Prisons 'Massive Problem' In Missouri
By Lara Hamdan • Jan 24, 2019
About a year and a half ago, a story about Victoria Branson of St. Francois County caught the attention of St. Louis Post-Dispatch columnist Tony Messenger. Judge Sandra Martinez sent Branson to prison for being behind on paying court fees.
Messenger noticed a pattern of people going to jail for not paying fines. He explained the "debtors' prison" practice – when people, who are usually poor, are jailed for minor crimes and can't pay the fines or make bail.
"This is against a long-standing understanding of law, not just the prohibition of debtors prison, but something going back to the Magna Carta called the 'no sale of justice' – that basically you have to give access to the judicial system to people that have money [and] don't have money," Messenger said on Thursday's St. Louis on the Air.
St. Louis Post-Dispatch columnist Tony Messenger joined "St. Louis on the Air" to discuss the practice of debtors' prisons in rural Missouri.
Credit Evie Hemphill | St. Louis Public Radio
He talked with Don Marsh about his reporting series on debtors' prisons in rural Missouri.
After Messenger wrote about Victoria Branson's story, others began informing him about similar cases in St. Francois County.
"And I didn't know at that point that there is this massive problem in Missouri," he explained. "What happens in all of the rural counties except for a couple of them – and it doesn't happen in the urban areas – is that when you go to jail, you get a bill for that jail time: $35 a day, $50 a day and then you get billed for that and so people are going to jail on minor offenses."
Messenger described the case of how a woman from Dent County shoplifting an $8 mascara tube led to court fees of more than $15,000.
"People are just horribly offended by that … One of the things that has been driving this series is the support that I get from Republicans, from Democrats, from people in the city, from people in rural areas," he said.
"It's hard to find an issue that unites the left and the right. Well, this is it. This is the one issue right now – criminal justice reform. And I'm writing about really just one small part of it."
Listen to the full discussion to hear more about the debtors' prison practice in Missouri:
St. Louis on the Air brings you the stories of St. Louis and the people who live, work and create in our region. St. Louis on the Air host Don Marsh and producers Alex Heuer, Evie Hemphill and Lara Hamdan give you the information you need to make informed decisions and stay in touch with our diverse and vibrant St. Louis region.
Debtors' Prison
Tony Messenger
STLPR Talk Shows


text:
define prepare
	echo "preparing working $(1) directory version $(2) \n"
	mkdir -p .working/$(1)
	cp gravitee-$(1)-standalone/gravitee-$(1)-standalone-distribution/gravitee-$(1)-standalone-distribution-zip/target/gravitee-$(1)-standalone-$(2).zip .working/$(1)
	unzip -uj .working/$(1)/gravitee-$(1)-standalone-$(2).zip '*/config/*' -d .working/$(1)/config
	cp docker/Dockerfile-dev .working/$(1)/Dockerfile
	sed -i.bkp 's/<appender-ref ref=\"async-file\" \/>/<appender-ref ref=\"async-console\" \/>/' .working/$(1)/config/logback.xml
	sed -i.bkp 's/<appender-ref ref=\"FILE\" \/>/<appender-ref ref=\"STDOUT\" \/>/' .working/$(1)/config/logback.xml
	echo "$(1) working directory preparation is done.\n"
endef

define addNetworkToCompose
	echo "adding network $(1) to docker compose file"
	echo "" >> $(1)
	echo "" >> $(1)
	echo "networks:" >> $(1)
	echo "  default:" >> $(1)
	echo "    external:" >> $(1)
	echo "      name: $(2)" >> $(1)
endef

# -----------------------------------------------------------------------------
#                                ENV VARIABLE
# -----------------------------------------------------------------------------

# API Management release retrieved asking maven to retrieve it
GIO_APIM_VERSION:=$(shell cat .working/.version 2>/dev/null)
GIO_APIM_NETWORK:=gio_apim_network
GIO_APIM_MANAGEMENT_API_IMAGE:=graviteeio/apim-management-api
GIO_APIM_MANAGEMENT_API_PLUGINS:=gravitee-rest-api-standalone/gravitee-rest-api-standalone-distribution/src/main/resources/plugins/

# Retrieve current file name, must be done before doing "include .env" ...
makefile := $(MAKEFILE_LIST)
# Projects list (extracted from .env file, looking for every XXX_REPOSITORY variables)

# -----------------------------------------------------------------------------
#                                 Main targets
# -----------------------------------------------------------------------------

help: ## Print this message
	@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(makefile) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'

gravitee: ## Stop and delete containers if exists, then install and run new ones, you can skip test by doing : make OPTIONS=-DskipTests install
ifneq ($(wildcard .working/compose),)
	@echo "Stopping gravitee and cleaning containers and images"
	@make stop
	@make prune
else
	@echo "No previous gravitee .working/compose dir, no docker content to delete..."
	@echo "Deleting working dir"
	rm -rf .working
endif
	@make version
	@make install OPTIONS=$(OPTIONS)
	@make run

clean: # remove .working directory
	@rm -rf .working/rest-api

version: # Get version and save it into a file
	@mkdir -p .working
	@rm -f .working/.version
	@echo "$(shell mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version 2> /dev/null | grep '^[0-9]\+\.[0-9]\+\.[0-9]\+.*')" > .working/.version

install: clean ## Compile, test, package then Set up working folder, you can skip test by doing : make OPTIONS=-DskipTests install
ifeq ($(GIO_APIM_VERSION),)
	@echo "Current build version is : $(GIO_APIM_VERSION)"
	@echo "no version found, retrieving current maven version"
	@make version
	@make install
else
	@echo "Current build version is : $(GIO_APIM_VERSION)"
	@mvn clean install $(OPTIONS)
	@$(foreach project,rest-api, $(call prepare,$(project),$(GIO_APIM_VERSION)))
endif

build: # Build docker images (require install to be run before)
	cd .working/rest-api && docker build --build-arg GRAVITEEAPIM_VERSION=$(GIO_APIM_VERSION) -t $(GIO_APIM_MANAGEMENT_API_IMAGE):$(GIO_APIM_VERSION) .

env: # Set up .env file for gravitee docker-compose
	@mkdir -p .working/compose
	@echo "GIO_APIM_VERSION=$(GIO_APIM_VERSION)" > .working/compose/.env

network: # Create and add an external network to gravitee access management docker-compose
	@cp docker/compose/docker-compose-dev.yml .working/compose/docker-compose.yml
	@$(call addNetworkToCompose, ".working/compose/docker-compose.yml",${GIO_APIM_NETWORK});
	@docker network inspect $(GIO_APIM_NETWORK) &>/dev/null || docker network create --driver bridge $(GIO_APIM_NETWORK)

run: build env network ## Create .env and network then start gravitee API management container
	@cd .working/compose; docker-compose up -d management_api
	@echo "To start and stop, use \"make stop; make start\" command"

start: ## Start gravitee API Management containers
ifneq ($(wildcard .working/compose),)
	@cd .working/compose; docker-compose start mongodb elasticsearch management_api
else
	@echo "Please use \"make run\" for the first time."
endif

startMongo: ## Start gravitee API Management mongo container only
ifneq ($(wildcard .working/compose),)
	@cd .working/compose; docker-compose start mongodb
else
	@echo "Please use \"make run\" for the first time."
endif

startElastic: ## Start gravitee API Management elasticsearch container only
ifneq ($(wildcard .working/compose),)
	@cd .working/compose; docker-compose start elasticsearch
else
	@echo "Please use \"make run\" for the first time."
endif

stop: ## Stop gravitee API Management running containers
ifneq ($(wildcard .working/compose),)
	@cd .working/compose; docker-compose stop || true
endif

status: ## See API Management containers status
ifneq ($(wildcard .working/compose),)
	@cd .working/compose; docker-compose ps
endif

connectMongo: ## Connect to mongo repository on gravitee database
	@docker exec -ti gio_apim_mongodb mongo gravitee

reset: stop deleteData start ## Stop containers, delete mongodb data and restart container

license: ## Generate license header
	@mvn license:format

postman: ## Run postman non regression test (require newman npm module and nc command). You can specify environment with `make postman env=nightly|demo` or let it empty to run on localhost
ifneq ($(env),$(filter $(env), nightly demo)) # Check if environment is valid
	@echo "\033[0;31m '$(env)' is not a valid env. Please provide 'ENV=nightly|demo' or let it empty for 'localhost' testing \033[0m"
	@exit 1
endif
ifeq ($(env), nightly)
	$(eval POSTMAN_ENV = $(env))
	$(eval POSTMAN_URL = $(env).gravitee.io:443)
	$(eval POSTMAN_HEALTH_URL = $(env).gravitee.io/api/management/swagger.json)
endif
ifeq ($(env), demo)
	$(eval POSTMAN_ENV = $(env))
	$(eval POSTMAN_URL = $(env).gravitee.io:443)
	$(eval POSTMAN_HEALTH_URL = $(env).gravitee.io/management/swagger.json)
endif
ifeq ($(env),) # If no environment is provided, use localhost.
	@echo "No environment provided. Choosing localhost by default"
	$(eval POSTMAN_ENV = localhost)
	$(eval POSTMAN_URL = localhost:8083)
	$(eval POSTMAN_HEALTH_URL = localhost:8083/management/swagger.json)
endif
	@echo "\033[0;32m Waiting for $(POSTMAN_ENV) to be ready on $(POSTMAN_URL) \033[0m"
	sh ./postman/scripts/wait-for.sh $(POSTMAN_URL) --timeout=30 -- \
	sh ./postman/scripts/tests.sh --postman-dir=./postman --postman-env=$(POSTMAN_ENV) --postman-health-url=$(POSTMAN_HEALTH_URL)

startAll: start ## Start all running containers

stopAll: stop ## Stop all running containers

deleteData: deleteMongoData deleteElasticData ## Remove mongodb and elasticsearch data

deleteMongoData: # remove mongodb data
	@rm -rf .working/compose/data/data-mongo

deleteElasticData: # remove mongodb data
	@rm -rf .working/compose/data/data-elasticsearch

deleteContainer: # delete container
ifneq ($(wildcard .working/compose),)
	@$(shell docker-compose -f .working/compose/docker-compose.yml down &>/dev/null || true)
endif

deleteImage: # delete image
ifneq ($(GIO_APIM_VERSION),)
	@docker rmi -f $(GIO_APIM_MANAGEMENT_API_IMAGE):$(GIO_APIM_VERSION) || true
endif

deleteNetwork: # delete network
	@$(shell docker network rm $(GIO_APIM_NETWORK) &>/dev/null || true)

prune: deleteData deleteContainer deleteImage deleteNetwork ## /!\ Erase all (repositories folder & volumes, containers, images & data)
	@rm -rf .working

bulk:
	@echo "\033[0;32m Waiting for localhost to be ready on localhost:8083 \033[0m"
	sh ./postman/scripts/wait-for.sh localhost:8083 --timeout=30 -- \
	sh ./postman/scripts/bulk.sh --postman-dir=./postman --app=100 --api=100

.DEFAULT_GOAL := help
.PHONY: all test clean build version postman

redpajama_set_name: RedPajamaGithub


Meal Kit Supply is a U.S. based company with a unique offering – their custom-designed MREs are assembled with an eye towards menu variety and meal diversity. Under the current menus, in a case of 12 MREs, they offer 5 different meat-based MREs, 3 different vegetarian-friendly MREs, and 4 breakfast MREs. Each meal averages around 1,200 calories. This kind of menu variety is usually missing in other civilian MRE brands that usually only offer 6 different menus and few, if any, breakfast items.
Not just entree variety but a wide variety of sides, desserts, spreads, etc.
For some shoppers, the amount of food and variety of menus – and especially the guarantee of breakfast items – will make the Meal Kit Supply MREs worth the extra premium. For ordering information, please see their MRE store.
Each Meal Kit Supply MRE case contains 12 MREs that contain a variety of at least 10 different meals and a variety of different sides, desserts, and spreads.
Accessory Pack in every meal contains: 6″ military MRE spoon, instant coffee sugar, non-dairy creamer, moist towelette, napkin, salt, pepper.
Hot Sauce/BBQ Sauce in 4 meals (menus 1, 3, 7, and 7).
Here's a closer look at a Meal Kit Supply case. Inside each case is a nice pamphlet list all of the nutritional information for each MRE.
MRE bag: very nice custom design and layout. I especially like all the nutritional information on the back of the MRE bag!
Accessory Pack in every meal contains: 6″ military MRE spoon and napkin.
Meal Kit Supply is unique in the civilian MRE industry in that they have a dedicated online store for Canadian customers. The MREs sold there are CFIA (Canadian Food Inspection Agency) inspected and approved for distribution in Canada, which makes them the only civilian MREs that can be easily bought and sold in Canada without the buyer have to worry about shipping their US-purchased MREs through Canadian Customs and having to potentially pay import duties or even have the case of MREs seized. You can check out their Canadian storefront at Meal Kit Supply Canada.


Learn to compose music in FL Studio. This course is only 1 hour long. Make the best use of your time by taking this course. One of the best features is that you can watch the courses at any speed you want. This means you can speed up the or slow down the video if you want to. This course is project based so you will not be learning a bunch of useless coding practices. At the end of this course you will have real world apps to use in your portfolio. We feel that project based training content is the best way to get from A to B. Taking this course means that you learn practical, employable skills immediately. You can use the projects you build in this course to add to your LinkedIn profile. Give your portfolio fuel to take your career to the next level.


I was having mild cramping for the past few weeks and they have suddenly stopped. Is this something to be concerned about or is it normal that they would have stopped. I am currently 7 weeks pregnant and miscarried my first pregnancy at about 7 1/2 weeks.


text:
Pouted Magazine
60+ Most Fashionable '90s Outfit Ideas For Ladies That Are Coming Back in 2022
We all realize that the 1990s had a significant effect on current fashion when you keep up with the newest trends. That period commended for stylish looks without effort. In that decade, the icon status of notable brands was revealed at some of the most memorable events in fashion history. Now when your favorite designers choose a less challenging fashion approach, it is time to restore some of the fashionable 90s outfit ideas for ladies that are coming back in 2022.
Pouted magazine tries to find out the reasons, practically every year, behind bringing back to life the trends of the nineties those unique items. The 90s outfits have captivated an entire generation which is also undoubtedly the comfiest – something that must be disregarded at the beginning of 2022.
1 Slip Dresses
Slip dresses were the staples of each 90's famous outfit, as Sarah Jessica Parker, Carrie Bradshaw, and practically every other woman lived. They were regularly worn. Keep this monotone style with a pale pink briefing paired with nude shoes and golden layered jewelry. However, please leave in the 90s the old hairdo and go instead with the sleek ponytail.
Slip dresses were the staples of each 90's famous outfit.
2 Leopard Print Coats
Leopard print is not going out of style forever. It's fair to say. Lay your leopard on a silk slip midi dress with the same babydoll characteristics for a trendy appearance. Rub the ribbed fish netting and replace Doc Martens with a grungy pair.
Leopard print is not going out of style forever.
3 Iconic 90S Jackets
At the beginning of the 90s, two jacks returned in style. The puffer jacket for winter use is trendy for winter wear. They were enormous, smooth, and bright nylon coats with oversized pockets and empty smaller zip pockets. The zip-up windbreaker jacket has been styled since the late 1980s when the weather was less harsh.
The second noteworthy garment was the western jacket with the Swedish fringe. Long beams dangled over the shoulders and braces in classic 90s style. It fit like a blazer jacket, but it looked west.
4 Baggy pants
Rather than skinny and slim jeans, which are all too limiting for our modern way of living and working, the denim star in 2022 will be the baggy cut. It gives ultimate comfort without abandoning flair with its ultra-wide legs. At the beginning of this year, several celebrities made it their favorite clothes. Some fashion junkies nicknamed it "broad leg jeans" with a more significant and lower waist, making it more elegant in its most contemporary version.
The advantage is that many individuals' wide selection of forms, colors, and materials is now available. It will be central to your wardrobe till summer with sneakers, slutty boots, and even the boldest heels.
It will be central to your wardrobe till summer with sneakers
5 Corduroy
Corduroy, which became famous in autumn and remained throughout the winter, was another fad from the nineties. This tendency will undoubtedly continue in 2022 and maybe even next autumn. The corduroy lines were released with the coats, pants, caps, shirts, skirts, overalls, and even dresses that most popular clothing brands have released.
Corduroy, which became famous in autumn and remained throughout the winter, was another fad from the nineties.
6 Sweater Vests
Since 2020, Sweater vests have progressively returned to our wardrobes, so it should not be surprising that this piece sticks around for the following year. In addition, famous men have designed vests in many ways that offer us many ideas for our outfits. For example, when coupled with jacks and pants, this 90s statement item looks excellent, allowing people to construct numerous suits with the same vests. They can also be found in other styles. They come in a massive array of different colors and designs.
Sweater Vests come in a massive array of different colors and designs.
7 90S Jeans Outfits
Everyone lived in jeans in the 1990s, not unlike now. At the start of the 1990s, acid-washed jeans continued with a waistband of a floated or paper bag. They had high elevation and tapering legs, with a wide leg and a loose fit. Shorts were comparable. By the middle of the nineties, tailgates flattened, and the fit tightened to a slender leg with a high rise and a formed wedge ass, namely mom jeans. Jeans were supposed to have been the trendiest brand.
Casual cotton tops included polo shirts, basic pullover shirts, long-sleeved rugby-striped shirts, turtlenecks, and blouses with sleeves and sleeveless. Almost ever, they were worn tucked inside a belted waistband. But other T-shirt tops were knotted to the waistline in a knot.
8 Leather jackets
Leather jackets are in a league of theirs when it comes to trendy products. It was not only crucial for the fashion scene of the 1990s, but it also, over time, has become a current standard. Every decade, fresh concepts and cuts have been developed to retrieve this iconic item of fashion.
Every piece of leather attire appears sophisticated and sensual—particularly when women's leather coats are added to fur trimmings in 2022. In the choice of female leather jackets 2022, natural leather is the material to choose from. First of all, it's lasting and serves you quite long without losing its new appearance. Secondly, the natural leather never allows moisture to pass through the tissue.
In the choice of female leather jackets 2022, natural leather is the material to choose from.
9 Cropped Cardigans
It wouldn't be perfect without a collection of cardigans hanging in your closet. In the 1990s, too, the cardigans were widespread. Cardigans were used on a silky slip dress or alone on jeans in the past, but 2022 will pick up the trend and tap into mid to low-level denim. The look of the cropped cardigan with a baggier pair of jeans is a fashionable outfit to apply from now until then.
The look of the cropped cardigan with a baggier pair of jeans is a fashionable outfit to apply from now until then.
10 90S Midi Skirts
The button-down midi skirt is one of my favorite 90. It is gentle, romantic, informal, yet nevertheless elegant. They were coupled with button-down blouses or shirts and sandals during summer and high boots in winter in the nineties. Fill out a perfect sweater and a few warm cuddles, and get a trendy fall outfit. The Victorian and Edwardian eras with bows, lace trims, ruffles, and other ultra-girly elements inspired many white shirts. Both 90s blouses and skirts have been combined in vintage style in a cottage core theme.
For more fashion-related articles, click here.
50+ Hottest Disney Toenail Design Ideas in 2022
60+ Most Fashionable Semi Formal Wedding Dresses for Female Guests
Privacy Policy Terms & Conditions Returns & Cancellations Delivery Information FAQ Contact Us Advertise with us! Submit Guest Post


text:
Home Environment Iceland's Whaling Industry May Shut Down Permanently Amid Coronavirus
Iceland's Whaling Industry May Shut Down Permanently Amid Coronavirus
This week has brought us a slew of good news, from Sweden going completely coal-free to Denmark beating its own recycling record. Now their Nordic neighbor, Iceland, has its own accomplishment to be proud of.
Both of Iceland's only two whaling companies have ceased operations. The first, IP-Utgerd, has announced that it is ending whaling forever and shutting down.
Gunnar Jonsson, managing director for IP-Utgerd, stated, "I'm never going to hunt whales again, I'm stopping for good."
The second whaling firm, Hvalur, said it will not go whaling this year due to export problems and coronavirus-related issues, such as social distancing requirements.
Advocates welcomed the good news. For example, Fabienne McLellan, co-director of international relations at the conservation nonprofit Ocean Care, noted "This is indeed terrific news that for a second straight year, vulnerable fin whales will get a reprieve from Hvalur hf.'s harpoons."
However, it's not a cause to celebrate just yet. McLellan added: "This said, fin whaling has been suspended in Iceland in the past, only to resume. While it looks promising that whaling in Iceland might stop for good, the temporary cessation of fin whaling must become permanent."
It isn't Iceland's first time when they had to cancel whaling. In 2019, there were no whale hunts in the country due to low demand from Japan and the need to repair ships. Due to declining demand, whaling may soon go extinct. In fact, thanks to a widespread International Fund for Animal Welfare campaign in 2011 with the message "Meet Us Don't Eat Us," the number of tourists who ate whale meat declined from 40% to 11%.
Besides Iceland, only two other countries — Japan and Norway — are hunting whales, although that may soon change.
Previous articleHygiene of Sweden is Bringing Swedish Technology to the United States in Hopes of Bettering Hand Sanitizing Options
Next articleIceland to Open Up to Tourists in June, But Only Under Certain Conditions
SACC brings the Swedish trend 'Plogga' to Chicago on World Cleanup Day
The World's Oldest Tree Lives in Sweden
5 reasons to love Denmark


The aquaculture of yellowtail kingfish Seriola lalandi, is now expanding worldwide. Production is conducted in two very different types of commercial facilities: predominately in sea cages in Australia, Mexico, Chile and Hawaii; and in indoor facilities in Europe. With expansion, there is concordant commercial interest to develop genetically improved stocks for production. However, there is a great paucity of genetic information about this species. Knowledge gaps include accurate genetic parameter estimates (i.e., from large sample sizes) that are essential to develop accurate and efficient selection indices. Specifically we require accurate information on non-growth traits (such as parasite load and deformities) and their correlations with growth traits (body weight and fork length), and information on any genotype by environment (G × E) interactions between the two major growing systems to determine whether a single or multiple selection programs are required. Here we address all these fundamental genetic knowledge gaps and provide, for the first time: relatively accurate genetic parameter estimates based on approximately 1400 genotyped and phenotyped animals; and preliminary tests for G × E interactions between growth in sea cages vs land tanks. The heritability estimates were moderate and significant (0.42 ± 0.10) for growth traits, whereas heritability estimates for non-growth traits were low (0.01–0.06). The genetic correlation between body weight and fork length was positive and close to one (0.98); in contrast, the correlation between growth traits with occurrence of fluke and deformity were not significant. The genetic correlations for growth traits between two culture environments were high (0.92–0.97); they were however, associated with large standard errors. In summary, the new set of genetic parameters obtained from this study provide accurate information that is essential to develop genetically improved stocks of yellowtail kingfish for commercial production.


Building a website can be overwhelming. We're not necessarily talking about the actual programming but the abundant array of free resources available across the Internet. With so many choices of templates, widgets and fonts, you could easily fall down a "rabbit hole" of resource gathering.
That's why I've made it simple for you by gathering up seven of the most popular and easy-to-use web icon sets. Chances are you'll find what you're looking for with these sets. Of course, you could spend the rest of your day trying out other sets, which would mean less building and more surfing. The choice is up to you!
The 50 free icons you'll find through Icon Finder were created by the talented and always in-demand Asher Abbasi. These beautifully detailed icons utilize a vibrant color palette. The icons can be used for any commercial endeavor. The only stipulation is you can't redistribute the set without written consent. Fair enough.
If you have a web business, then you also have a social media presence. That means you'll need a social media icons pack. Fontfabric has a terrific set consisting of 74 social media icons. Who knew there were so many social media outlets? Best of all, each icon matches a key on your keyboard. Easy to use and perfect for a variety of pages.
An e-commerce site needs classy payment icons. You can show your customers in a flash the type of payments you accept by posting these colorful payment icons. This particular set consists of 18 of the most popular payment icons made available in PNG format. Although they are payment icons, you won't have to pay to use them for your web enterprise.
Any of the millions of Windows 8 users will feel right at home with this pack. There are over 700 sharply designed icons just waiting to be plucked up and put into your project. Whether you're building a personal page or creating content for a client, you'll find a lot of icons to pick from here.
When it doubt, go the default. That rule applies to icons as well. Default Icon is a kind of clearing house of practical, no-frills icons. They are perfect for device apps with their 1-bit resolution. They're also totally customizable. How can you go wrong with a default?
Toolbars, tab bars, iPhone and iPad apps all need crisp, clean icons. You'll find a decent free set at Glyphish. These icons can also be adapted for "off net" design projects like T-shirts, logos and other promotional materials.
With close to 50,000 downloads in the last five years, the Sweeties must be doing something right. On your Internet travels, you've probably seen some of the Sweetie-Basepack icons in use. They're all over the web, and that means they'll be familiar to your customers.
If you still feel like you're coming up short in the icon department, you can head over to Glyphsearch to find even more options. Happy icon hunting!


Based on information from the Realtors Assoc. of Maui. Listings last updated on 04-18-2019. Copyright 2019 by REALTORS� Association of Maui, Inc. Listing courtesy of BHGRE Valley Isle (P). This information is believed to be accurate. It has been provided by sources other than the Realtors Assoc. of Maui and should not be relied upon without independent verification. You should conduct your own investigation and consult with appropriate professionals to determine the accuracy of the information provided and to answer any questions concerning the property and structures located thereon. Featured properties may or may not be listed by the office/agent presenting this brochure.


Bart had a problem with his car. After much effort, he ended up with a contract. We'll never get them to agree. Maybe we were too optimistic. The Colombian government demanded more money. Every merchant praises their goods. You're welcome here anytime, Irving. I got him some water. Raanan has a way with words. They succeeded.
Your brother needs help. I'm going to win. Please take me home tonight. I love both of you. We're not late. There was once upon a time a king who had twelve daughters. I was asked to deliver this. Dinner is ready, Father. I have some questions to ask, but I don't want to bother you now. He felt his way through the darkness.
They always give their attention to environmental problems. This is the first time I've ever harvested with my father. Devon and Walter need this. I said that ages ago. Where are the strawberries? I love it when you cook for me. To ensure effective engine protection and lubrication under all service conditions only use the best motor oil. She's working on it. Can a city exist without having a culture of its own? Marguerite wants to come.
That's their problem. Lanny reads nothing but fiction. I squeezed Valerie's hand. I know I can count on you. I was surprised that she recognized me right away. Ned was escorted out of the building by security guards after being fired. The governor ordered an investigation. I knew it! Clark was knocked out in the tenth round. You're delusional. Go to bed!
The milk will keep for two days. Does this seem fair? You sure do use a lot of butter. Norman isn't a good singer. The graveyards are full of indispensable men. Julian loves her pony. Please do it. The man, who had not eaten for three days, had trouble thinking about anything except food. Angela never lends money to anyone. King, stop calling me your boy. I'm thirty-two, for God's sake!
Mr. Tani and his wife were present at that party. Piercarlo was perfectly satisfied. We'll miss you, too. Kees is a dangerous guy. I'm not materialistic. Rain is an infrequent occurance in this part of the country. Ramsey isn't normal. I'll be waiting for Rees. Close the door! Honzo handed Pam a sealed envelope.
I can top that. I think you'd better rest for a while. We've nearly finished preparations. How about taking a nap? How did she come here? The President has fled the capital. After having caught sight of her, he fell into a huge confusion of thoughts, was motionless and, in one word, turned to stone. Don't complain about it. You've asked for it. Sergio doesn't have to go unless he wants to. I think we should try to help Russell. I know that feeling, too.
The sky was filled with airplanes. We are the Watchers on the Wall. Have you taken out a subscription to any magazine? He who makes many threats is not dangerous. Tollefsen pointed to the living room. I don't understand the way that he thinks. Belief in God is not evil per se. There are economic systems that don't glorify money. It did the trick. K-cups have a large environmental impact.
If you have something to complain about, then get out of here! The money should be distributed to those in need. Get me a defibrillator. Should I call the police? This program has become stereotyped. I know Lindsey will do whatever you ask. Today's the coldest day we've ever had. We'll talk to him. We need to buy her a present. I told Jan it wasn't mine.
Ramesh is a plus-sized model. She's a control freak. Is this real silk? When did I try to give you money? Do we really want to spend the entire weekend doing this? Just let me get my thoughts in order. I'm trying to do that right now. He always thinks ten steps ahead. John has a pen. I won first prize.


When it comes to casting talent AJK does it best as we understand our clients needs & expectations. Our teams years of experience in front of the camera has given us the knowledge and understanding of what is expected. We don't stop until we find what you are looking for and we guide you through the casting process in a smooth and efficient manner, keeping on time and on budget.


Unlimited: adventure park, climbing wall, selfies with our giant robots, WIFI Single use: Zip Line, Tower Of Terror fall.
GET TO THE FRONT OF THE LINE ANY TIME. Single: Special FX. Unlimited: Zip Line, Tower Of Terror, Adventure Park, Wall Climb. FREE: Selfie stick rental, WIFI.
This ticket offers the same benefits as our general admission ticket. You can only buy it online and must enter the park between 11AM and 2PM.
Valid from open to close.
Not valid for entry after 2 PM.
Groups over 10 people enjoy a 15% group discount off the price of the admission ticket. We're unable to offer price reductions on special effects.


The World Heritage Site of Shirakawago is a village nestled deep in the mountains of Gifu Prefecture that sees heavy snowfall each winter. The architecture of the houses there, with their large, pointed thatched roofs built to stand the weight of that snow, and the community lifestyle that has continued to be a presence there because of their protection of Shirakawago's unique architecture, were particularly valued, leading to its selection as a World Heritage Site.
On the other hand, we have Iwami Ginzan Silver Mine in Shimane Prefecture. It was the largest silver mining area in Japan, and during the Edo Period, it boasted the greatest amount of silver production in the world. Over hundreds of years, while silver and copper were mined from the mountains, it was done using a sustainable method that did not harm the natural environment. This was particularly valued, leading to the area being selected as a World Industrial Heritage Site.
While both sites are in extremely remote locations, they are not ruins where no one lives anymore; they are dynamic villages where people still carry out their everyday lives. The reason given for this is that the local residents have a deep affection for their towns and the surrounding nature, and have taken great care of both. If you visit either of these villages, you will agree that this answer is unmistaken. But what about many of the other towns and cities throughout the country that have lost their appeal by replacing old residences with modern architecture? Do the people there not have any love for the places where they live? Of course not. Every town or city has people there who love their local area. So why do these two villages in particular stand out as places where people even now continue to live fulfilling lives, even though the areas themselves remain unchanged from how they looked long ago?
The reasons that it has been possible to continuously maintain both of these villages are, in truth, completely different.
Let us begin with Shirakawago. There is a mutual-aid organization here called "Yui". The entire village works together to maintain the large, thatched roof houses that would be impossible for a single family to take care of. The architecture in Shirakawago was conceived to withstand the heavy snowfall of the area, and a societal structure was conceived to keep that architecture in good condition without placing too much strain on the village. That is what has allowed this village to remain as dynamic as it is. If there were a company specializing in roof maintenance that was doing this, preservation of the village itself would have become difficult, because maintenance would have depended on the financial status of that company and the economic situation of the village's residents. What has preserved Shirakawago is not a capitalist system, but a socialist one.
Iwami Ginzan was, at one time, a prominent silver-mining area. It was a well-off area, much like towns in the western United States at the start of the Gold Rush in the mid-19th century. At the time of the American Gold Rush, this rural village in the mountains had its own bank and courthouse. Furthermore, before that, during the Edo Period, when social order was strictly maintained according to social status, the houses of samurai and merchants stood side by side, and they made their livings together. This indicates that capitalism-based concepts of law and economics maintained the balance here. This is also the reason why, after the closure of the silver mine in 1923, the village here was not deserted and to this day continues to be a place where people choose to live. Nakamura Brace, a world-famous manufacturer of prosthetic limbs, and Iwami Ginzan Seikatsu Bunka Kenkyusho Corporation, a company which integrates Japanese traditional craftsmanship techniques into the handmade clothing and household goods they sell, both have their head offices here. There are a variety of employment options for young people to choose from, not just agriculture and tourism, and so a diverse group of people live here.
In Iwami Ginzan's Omori Town, the aforementioned courthouse and the townscape where the residences of merchants and samurai stood next to each other still remain. Along the main street of this town are several houses that have been remodeled as lodging facilities, and there you can enjoy this region's unique lifestyle and local cuisine. It's only 90 minutes from Matsue, and we hope you'll extend your trip just a little further and come visit.
Visit West Japan © 2018 All rights reserved.


Distributed By – Beechwood Music Distribution Ltd.
Box set release of Pure Drum & Bass and Pure Drum+Bass Volume 2.
Comes in 4 jewel cases in a cardboard slipcase which is narrower than the cases. The discs themselves are identical to the original releases. There are no musical credits on this box, only licensing info.
Track 1-2 is titled "The Piano Tune"
Track 1-10, on original release is listed as "P.P.S. - Ambient Pressure" on back and "PPS - Ambient Surprise" on inside. On this box it's listed as "PPS - Ambient Surprise" everywhere.
Track 3-3 is titled "Kill A Bullet"
Track 3-10 has no mix name listed. It ends at 6:43 but there is a blank running up to 7:04.
Track 4-9 has no mix name listed.


My interpretation of this exercise is that it is all about the path to composing "the shot" without actually knowing what the subject you are after actually is. Along that path there will be many "not quites" but at some time, hopefully, there will be that eureka moment. I have to say I launched into this task with some concerns; it's one thing taking pictures of public parades, tourist areas etc but another when you are photographing people going about there everyday business. Intrusion, invasion and paparazzi were some words that sprung to mind! However, mindful of a number of articles that appeared in the media over the years and that I was confident as regards the law on this area I set off to Bristol Market which, on a Wednesday, also hosts a Farmers Market.
I planned to walk around for a while to get a feeling for what was going on and select strategic positions for taking some shots, others as the opportunity arose. I had no idea what I was really after, I just thought that there would be interesting people and probably some stalls that would inspire. Should I encounter any hostility I determined that I would deal with it as and when.
Just getting a feel for photographing the stalls. First observation, people will enter the frame at will! I felt very self conscious with my eye glued to the viewfinder scanning the scene. Also if you have a heavy lens camera set up you soon begin to experience camera shake. Need to think about using a different lens for such exercises. This was a fairly constrained view so decided to move to a wider perspective with the ability to zoom in on any interesting subjects.
A little more variety here in terms of stalls. The only thing that caught my eye was the plants in pots stacked on the upturned crates, colour and geometrical shapes. There may be potential at the cheese counter so decided to get a clearer view.
No sign of Wallace and Gromit so move on!
Initially attracted by the arrangement of the soup pots on display and the form of the pies in the boxes but decided to move on.
Fish stalls usually have interesting displays but this one did not have anything special; noticed there was another fish stall opposite so thought I would try that.
A bit more of an interesting display but not sure it is truly eye catching.
Don't you love it when the subject closes their eyes as you hit the shutter button! Move on.
Out of the corner of my eye spotted the long arm of the law approaching! Thought turned to the experiences of street photographers so thought I'd test the situation.
Well no adverse reaction but no friendly engagement either, the look says it all! Pity, quite a striking subject.
Showing a clean pair of hooves so this is going no further. Back to the market.
Picked out this bread stall due to the arrangement of many different shapes and sizes of bread on offer. However, I thought the glass screen was a distraction and it was not possible to get a clear shot for the composition I had in mind.
While surveying this scene through the viefinder considered whether a sequence of a shopper browsing through to deciding to purchase might provide something interesting. This guy walked on by.
It was the arrangement of the vegetables that caught my eye in this scene, in particular the carrots. Just after I had taken this shot the stallholder approached me and asked what I was doing; up to this point I had only had glances from stallholders. We had a friendly discussion and it transpired he and his wife had been asked to pose for a photograph at the market a few months before and they had ended up in a massive poster on the side of one of the Bristol Harbour sheds, he was not happy about that. We parted amicably and I moved on.
I took this shot as this guy walked into frame, it was the look on his face, bad news(?), and the bright blue phone glued to his ear which seemed at odds with the character.
The directions to move on were clear!
This is the covered area of the market dominated by a multitude of food stalls of various nationalities popular at lunchtime for local office workers and those in the know. I picked up on a group that had descended on one stall and were going through that ritual of "what are you having?". Despite watching for few minutes I was not able to get a shot which included their faces which i thought would tell a story.
I took this shot as I was attracted by two things; the arrangement and colours of the fruit and wheatgrass and by the juxtaposition of the health juice stall offering therapy and "pieminster" which, I guess, offers a different type of therapy; where were all the punters going! I then decided to explore a composition of the fruit on the juice stall.
Yes, interesting but not grabbing.
Moved to another part of the market, flower stall might provide something of note; I could not see anything of note. It was now getting busy, not easy doing the eye to viewfinder routine without risking a black eye. Move back outside.
Back in the open air. This was in the overflow area. I had spotted a very colourful stall in this group which I decided to home in on.
Look at the way those people are eyeing that stall.
Bingo! I had found my target. To me this sums up the essence of the Farmer's Market. Whilst i would have liked to have had more time composing shots of this subject I was at the mercy of the customers, many of whom had kindly stood back to allow me a couple of shots. Note, on this occasion I asked the stallholder's permission.
I did not find this an easy task, essentially going out not knowing exactly what I was after, yet doing a specific exercise. Also, as mentioned above, I had some reservations about undertaking what I understand to be street photography and any potential difficulties with the subjects selected. I think this held me back a bit and perhaps bolder approach would have been beneficial. It has certainly made me think about how to interact with people in such situations and I found the article on the BBC website, Religion and Ethics, "Q&A: The ethics of street photography", an interview with Eric Kim a street photographer based in Los Angeles, quite interesting; a lot depends on the culture you are dealing with.
Some other thoughts on this experience. The practice of spending much time with eye to viewfinder is somewhat alien to me, notwithstanding it is the best way of confirming the scene; perhaps I was taking this too literally although I have heard of people walking about with a cardboard frame to view potential scenes. I kept thinking that while I was looking in one area something better might be going on elsewhere. Also I detected a lack of creative juices in selecting a subject to home in on yet I have done this successfully on landscapes. In this case there was a lot going on around, particularly in the covered market, and I felt a distinct challenge between capturing the moment and composition; this was heightened by the constant thought of it is better to crop in camera than during post processing. Looking back at my shots I also wonder about my camera settings; once I got going I gave little thought to changing settings. Finally, the weight of the camera equipment; a long period spent in the firing position really makes you think about the weight of your kit, especially as I had gone out for the day with other tasks in mind and was carrying a fair load.
In conclusion, did I achieve the aim of the exercise? Well I ended up with a final image which I think was a successful conclusion to a journey that took many twists and turns and a good deal of time; that final shot could have done with further work. With a shot in the can and much to think about so, overall, yes.


text:
Ms. Y's Case: Denied a Lawful Abortion in Ireland
By Amnesty International Ireland21st March 2016 Stories
21st March 2016, 15:52:14 UTC
Ms. Y is a young woman who travelled to Ireland seeking asylum after brutal persecution and violence in her country of origin. In February 2014, prior to arriving in Ireland, Ms. Y was kidnapped, held against her will, beaten and raped repeatedly by the head of a paramilitary organization. Her lawyer noted: "I understand he kept her for himself and raped her repeatedly. She was violently beaten and still bears the scars of those beatings, which are quite significant scars… not to mention the psychological trauma."
She was violently beaten and still bears the scars of those beatings, which are quite significant scars... not to mention the psychological trauma
Eventually, she managed to escape. She was able to flee the country with a family member and arrived in Ireland at the end of March 2014. She and her family member were transferred to a Direct Provision Centre for accommodating asylum-seekers. Within days of arriving in Ireland, Ms. Y felt unwell. A nurse who saw her determined that she was pregnant. Ms. Y "was devastated and became very distressed upon hearing this news," says her lawyer. She made it clear to the nurse and other officials who dealt with her that the pregnancy was as a result of rape, was unwanted and that she was feeling suicidal as a result. Giving her account of her ordeals was extremely difficult and traumatizing for Ms. Y. Her reporting of feeling suicidal continued and escalated. Ms. Y was told she would have to travel to the UK or Europe for an abortion – but that the obstacles to travelling abroad for such a purpose were many. Ms. Y was told she would need to complete complicated forms to obtain a visa and a temporary travel permit. The paperwork was extensive and in English, a language which Ms. Y does not speak. In addition, Ms. Y was told she would need at least €1,300 for the travel documents, flights and abortion costs. At the time, she was in receipt of €19.10 per week as an asylumseeker. Ms. Y was left feeling overwhelmed and abandoned. In June 2014, Ms. Y was referred to SPIRASI, a voluntary agency that works with asylum-seekers, refugees and survivors of torture and persecution. Ms. Y was sent for a medical assessment as part of her asylum.
Ms. Y's name and country of origin have not been disclosed to protect her confidentiality and ensure her safety. All the information in this account about Ms. Y's case is from an interview with her lawyer, Caoimhe Haughey, who narrated Ms. Y's experience based on what Ms. Y told her and numerous written medical records, custody records and other documentation that she has obtained as part of her representation of Ms. Y. Interview with Caoimhe Haughey, Solicitor for Ms. Y, 28 January 2015. She is not a criminal The impact of Ireland's abortion law Index: EUR 29/1597/2015 Amnesty International June 2015 41 application. The doctor who examined and assessed Ms. Y prepared a detailed medical report, which was submitted to the Reception and Integration Agency and other officials dealing with Ms. Y's case at that time. The medical report submitted states Ms. Y was suffering from post-traumatic stress disorder; it states that Ms. Y expressed the desire to end her own life if the pregnancy continued. Ms. Y was noted to have a "strong death wish." Further assessment and counselling was recommended; however, there was no follow up at all.
Further assessment and counselling was recommended; however, there was no follow up at all
Ms. Y was not referred for psychological or psychiatric support, intervention or treatment. Nor was she referred for ante-natal maternity care at this juncture. "The clock was ticking… she had no one to turn to," her lawyer relates. "There were so many agencies involved and she was passed from pillar to post. They all knew of her pregnancy… they knew she was highly distressed and that she was seeking a termination. Nobody was listening to her and there was no intervention." Communicating with those around her was very challenging, necessitating a translator to be available and physically present at all times. In July 2014, Ms. Y made a desperate, unsuccessful attempt to seek an abortion in the UK. A clinic was identified and arrangements were made. Upon arrival in the UK, Ms. Y was arrested and detained for up to eight hours. Her meagre personal belongings were taken from her, as were her clothes. The Custody Records note that she was deemed a risk to herself and that she was given a safety gown to wear. Ms. Y was monitored closely and medically assessed. The medical records state "suicidal since being pregnant as a result of rape." Ms. Y was later returned to Ireland, as she was not legally permitted to enter the UK. A few weeks later, Ms. Y met with a general practitioner (GP). This GP's medical notes record concern about Ms. Y being suicidal. She was referred to a psychiatric unit. It took a number of days before she was eventually admitted to a maternity hospital. Ultimately, Ms. Y was kept in hospital for several weeks during which time involuntary detention was mooted. Her medical records indicate that Ms. Y spoke of suicide on an almost daily basis, with increasing intensity.
Her lawyer related that Ms. Y told her health care providers "I will kill myself if I cannot get rid of this baby… I don't want it inside me. I don't want to discuss it. I don't want to know about it. I want it out. I cannot continue with this pregnancy." Ms. Y repeatedly threatened self-harm. Nonetheless, Ms. Y was not advised of her rights under the Protection of Life During Pregnancy Act. Her medical records reflect that she was instead told: "you cannot get an abortion in this country." There was "huge emotional pressure inflicted upon this very young, vulnerable woman by health care providers to get her to continue with her pregnancy, even though she expressed the intention of 'I am going to throw myself off the top of this building' and 'I am going to tie a rope around my neck,'" explains Ms. Y's lawyer. Ms. Y had made an earlier suicide attempt, which was interrupted. As a desperate measure, Ms. Y went on a hunger strike, refusing all food and drink. Told by doctors that they would "terminate" her pregnancy, she resumed drinking and eating. However, "the termination" (as it was described) was postponed and postponed again amidst legal wrangling, resulting in an emergency application to the High Court. In early August 2014, the HSE obtained an order from the High Court to effectively force feed and hydrate Ms. Y; an order which was later abandoned. A number of days later, Ms. Y delivered Baby Y by caesarean section. This was the only option determined by the two psychiatrists and obstetrician, who certified She is not a criminal The impact of Ireland's abortion law Amnesty International June 2015 Index: EUR 29/1597/2015 42 this procedure as meeting the requirements for a lawful abortion on suicide grounds under the PLDPA.
"In my opinion," says her lawyer, Caoimhe Haughey, "Ms. Y was given no choice. I believe that she did not fully understand what was going on. How could she? I believe that she was unduly influenced into accepting the planned caesarean section, otherwise she would be kept in hospital in order to continue with the pregnancy, which was a life or death decision for my client. From what I have read, viability considerations and other legal implications were first and foremost in the minds of those involved." After Ms. Y recovered from the surgery, she was discharged from the hospital and left to pick up the pieces of her life. She was granted refugee status and returned to her accommodation in the Direct Provision Centre. Her lawyer believes her after-care medical treatment and support was less than satisfactory in terms of follow-up. She stopped eating and lost a considerable amount of weight. She remained very vulnerable and fragile. Ms. Y bears many scars from her ordeals, physical and mental. Her caesarean section scar is a permanent reminder of being raped and her unwanted pregnancy. With the help of her legal team, Ms. Y now has a multi-disciplinary medical team in place to support her.
0 Share Tweet


Google is opening its eighth-annual Code-in Nov. 28. The challenge calls on pre-university students aged 13 to 17 to complete coding tasks on open source projects, with the aim of exposing teenagers to open source software development.
To date, some 4,500 students have participated in the GCI contest, completing more than 23,000 tasks. For this year's Code-in, 25 organizations are proving mentoring for participants, including Ubuntu, Drupal, Wikimedia and JBoss. Projects range from machine translation to games to medical records systems.
The Code-in runs Nov. 28 to Jan. 17. Complete details for teachers and students, including rules and restrictions, guides and other resources, can be found on the 2017 Google Code-in site.


text:
Complici/Strana donna è un singolo di Riccardo Fogli pubblicato nel 1974.

Il brano Complici è stato presentato durante la seconda serata del Festival di Sanremo 1974 nel "Gruppo A", risultando il quarto più votato fra i sette proposti, esito che non ha permesso l'ammissione alla finale, alla quale accedevano i primi due.

Il brano Strana donna è stato estratto dall'album Ciao amore, come stai del 1973 e fa parte anche del 45 giri precedente, Strana donna/La prima notte senza lei.

Tracce

Lato A
 Complici - 4:15 (Luigi Lopez-Carla Vistarini)

Lato B
 Strana donna - 3:45

Note


Don't bother too many people with trivial questions, as some might not like it - especially if they don't like you to begin with.
1500 completely unique responses to around 200 old and new topics, 200+ pages of raw dialogue, and 20 quests for you to enjoy. Every NPC has an average of 5 pages of completely unique dialogue!
Every character has real personality, and we promise - you will never forget some of them!
After the webs of corruption and deceit of Ald'ruhn, LGNPC Pelagiad is a more light-hearted offering, while, of course, retaining the Morrowind feel at all times.