text:
require './test/test_helper'

class TestCollection < Test::Unit::TestCase
  @@connection ||= standard_connection(:op_timeout => 10)
  @@db   = @@connection.db(MONGO_TEST_DB)
  @@test = @@db.collection("test")
  @@version = @@connection.server_version

  def setup
    @@test.remove
  end

  def test_capped_method
    @@db.create_collection('normal')
    assert !@@db['normal'].capped?
    @@db.drop_collection('normal')

    @@db.create_collection('c', :capped => true, :size => 100_000)
    assert @@db['c'].capped?
    @@db.drop_collection('c')
  end

  def test_optional_pk_factory
    @coll_default_pk = @@db.collection('stuff')
    assert_equal BSON::ObjectId, @coll_default_pk.pk_factory
    @coll_default_pk = @@db.create_collection('more-stuff')
    assert_equal BSON::ObjectId, @coll_default_pk.pk_factory

    # Create a db with a pk_factory.
    @db = Connection.new(ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost',
                         ENV['MONGO_RUBY_DRIVER_PORT'] || Connection::DEFAULT_PORT).db(MONGO_TEST_DB, :pk => Object.new)
    @coll = @db.collection('coll-with-pk')
    assert @coll.pk_factory.is_a?(Object)

    @coll = @db.create_collection('created_coll_with_pk')
    assert @coll.pk_factory.is_a?(Object)
  end

  class TestPK
    def self.create_pk
    end
  end

  def test_pk_factory_on_collection
    @coll = Collection.new('foo', @@db, TestPK)
    assert_equal TestPK, @coll.pk_factory

    @coll2 = Collection.new('foo', @@db, :pk => TestPK)
    assert_equal TestPK, @coll2.pk_factory
  end

  def test_valid_names
    assert_raise Mongo::InvalidNSName do
      @@db["te$t"]
    end

    assert_raise Mongo::InvalidNSName do
      @@db['$main']
    end

    assert @@db['$cmd']
    assert @@db['oplog.$main']
  end

  def test_collection
    assert_kind_of Collection, @@db["test"]
    assert_equal @@db["test"].name(), @@db.collection("test").name()
    assert_equal @@db["test"].name(), @@db[:test].name()

    assert_kind_of Collection, @@db["test"]["foo"]
    assert_equal @@db["test"]["foo"].name(), @@db.collection("test.foo").name()
    assert_equal @@db["test"]["foo"].name(), @@db["test.foo"].name()

    @@db["test"]["foo"].remove
    @@db["test"]["foo"].insert("x" => 5)
    assert_equal 5, @@db.collection("test.foo").find_one()["x"]
  end

  def test_rename_collection
    @@db.drop_collection('foo1')
    @@db.drop_collection('bar1')

    @col = @@db.create_collection('foo1')
    assert_equal 'foo1', @col.name

    @col.rename('bar1')
    assert_equal 'bar1', @col.name
  end

  def test_nil_id
    assert_equal 5, @@test.insert({"_id" => 5, "foo" => "bar"}, {:safe => true})
    assert_equal 5, @@test.save({"_id" => 5, "foo" => "baz"}, {:safe => true})
    assert_equal nil, @@test.find_one("foo" => "bar")
    assert_equal "baz", @@test.find_one(:_id => 5)["foo"]
    assert_raise OperationFailure do
      @@test.insert({"_id" => 5, "foo" => "bar"}, {:safe => true})
    end

    assert_equal nil, @@test.insert({"_id" => nil, "foo" => "bar"}, {:safe => true})
    assert_equal nil, @@test.save({"_id" => nil, "foo" => "baz"}, {:safe => true})
    assert_equal nil, @@test.find_one("foo" => "bar")
    assert_equal "baz", @@test.find_one(:_id => nil)["foo"]
    assert_raise OperationFailure do
      @@test.insert({"_id" => nil, "foo" => "bar"}, {:safe => true})
    end
    assert_raise OperationFailure do
      @@test.insert({:_id => nil, "foo" => "bar"}, {:safe => true})
    end
  end

  if @@version > "1.1"
    def setup_for_distinct
      @@test.remove
      @@test.insert([{:a => 0, :b => {:c => "a"}},
                     {:a => 1, :b => {:c => "b"}},
                     {:a => 1, :b => {:c => "c"}},
                     {:a => 2, :b => {:c => "a"}},
                     {:a => 3},
                     {:a => 3}])
    end

    def test_distinct_queries
      setup_for_distinct
      assert_equal [0, 1, 2, 3], @@test.distinct(:a).sort
      assert_equal ["a", "b", "c"], @@test.distinct("b.c").sort
    end

    if @@version >= "1.2"
      def test_filter_collection_with_query
        setup_for_distinct
        assert_equal [2, 3], @@test.distinct(:a, {:a => {"$gt" => 1}}).sort
      end

      def test_filter_nested_objects
        setup_for_distinct
        assert_equal ["a", "b"], @@test.distinct("b.c", {"b.c" => {"$ne" => "c"}}).sort
      end
    end
  end

  def test_safe_insert
    @@test.create_index("hello", :unique => true)
    a = {"hello" => "world"}
    @@test.insert(a)
    @@test.insert(a)
    assert(@@db.get_last_error['err'].include?("11000"))

    assert_raise OperationFailure do
      @@test.insert(a, :safe => true)
    end
  end

  def test_bulk_insert_with_continue_on_error
    if @@version >= "2.0"
      @@test.create_index([["foo", 1]], :unique => true)
      docs = []
      docs << {:foo => 1}
      docs << {:foo => 1}
      docs << {:foo => 2}
      docs << {:foo => 3}
      assert_raise OperationFailure do
        @@test.insert(docs, :safe => true)
      end
      assert_equal 1, @@test.count
      @@test.remove

      docs = []
      docs << {:foo => 1}
      docs << {:foo => 1}
      docs << {:foo => 2}
      docs << {:foo => 3}
      assert_raise OperationFailure do
        @@test.insert(docs, :safe => true, :continue_on_error => true)
      end
      assert_equal 3, @@test.count

      @@test.remove
      @@test.drop_index("foo_1")
    end
  end

  def test_maximum_insert_size
    docs = []
    16.times do
      docs << {'foo' => 'a' * 1_000_000}
    end

    assert_raise InvalidOperation do
      @@test.insert(docs)
    end
  end

  if @@version >= "1.5.1"
    def test_safe_mode_with_advanced_safe_with_invalid_options
      assert_raise_error ArgumentError, "Unknown key(s): wtime" do
        @@test.insert({:foo => 1}, :safe => {:w => 2, :wtime => 1, :fsync => true})
      end
      assert_raise_error ArgumentError, "Unknown key(s): wtime" do
        @@test.update({:foo => 1}, {:foo => 2}, :safe => {:w => 2, :wtime => 1, :fsync => true})
      end

      assert_raise_error ArgumentError, "Unknown key(s): wtime" do
        @@test.remove({:foo => 2}, :safe => {:w => 2, :wtime => 1, :fsync => true})
      end
    end
  end

  if @@version >= "2.0.0"
    def test_safe_mode_with_journal_commit_option
      @@test.insert({:foo => 1}, :safe => {:j => true})
      @@test.update({:foo => 1}, {:foo => 2}, :safe => {:j => true})
      @@test.remove({:foo => 2}, :safe => {:j => true})
    end
  end

  def test_update
    id1 = @@test.save("x" => 5)
    @@test.update({}, {"$inc" => {"x" => 1}})
    assert_equal 1, @@test.count()
    assert_equal 6, @@test.find_one(:_id => id1)["x"]

    id2 = @@test.save("x" => 1)
    @@test.update({"x" => 6}, {"$inc" => {"x" => 1}})
    assert_equal 7, @@test.find_one(:_id => id1)["x"]
    assert_equal 1, @@test.find_one(:_id => id2)["x"]
  end

  if @@version >= "1.1.3"
    def test_multi_update
      @@test.save("num" => 10)
      @@test.save("num" => 10)
      @@test.save("num" => 10)
      assert_equal 3, @@test.count

      @@test.update({"num" => 10}, {"$set" => {"num" => 100}}, :multi => true)
      @@test.find.each do |doc|
        assert_equal 100, doc["num"]
      end
    end
  end

  def test_upsert
    @@test.update({"page" => "/"}, {"$inc" => {"count" => 1}}, :upsert => true)
    @@test.update({"page" => "/"}, {"$inc" => {"count" => 1}}, :upsert => true)

    assert_equal 1, @@test.count()
    assert_equal 2, @@test.find_one()["count"]
  end

  if @@version < "1.1.3"
    def test_safe_update
      @@test.create_index("x")
      @@test.insert("x" => 5)

      @@test.update({}, {"$inc" => {"x" => 1}})
      assert @@db.error?

      # Can't change an index.
      assert_raise OperationFailure do
        @@test.update({}, {"$inc" => {"x" => 1}}, :safe => true)
      end
      @@test.drop
    end
  else
    def test_safe_update
      @@test.create_index("x", :unique => true)
      @@test.insert("x" => 5)
      @@test.insert("x" => 10)

      # Can update an indexed collection.
      @@test.update({}, {"$inc" => {"x" => 1}})
      assert !@@db.error?

      # Can't duplicate an index.
      assert_raise OperationFailure do
        @@test.update({}, {"x" => 10}, :safe => true)
      end
      @@test.drop
    end
  end

  def test_safe_save
    @@test.create_index("hello", :unique => true)

    @@test.save("hello" => "world")
    @@test.save("hello" => "world")

    assert_raise OperationFailure do
      @@test.save({"hello" => "world"}, :safe => true)
    end
    @@test.drop
  end

  def test_mocked_safe_remove
    @conn = standard_connection
    @db   = @conn[MONGO_TEST_DB]
    @test = @db['test-safe-remove']
    @test.save({:a => 20})
    @conn.stubs(:receive).returns([[{'ok' => 0, 'err' => 'failed'}], 1, 0])

    assert_raise OperationFailure do
      @test.remove({}, :safe => true)
    end
    @test.drop
  end

  def test_safe_remove
    @conn = standard_connection
    @db   = @conn[MONGO_TEST_DB]
    @test = @db['test-safe-remove']
    @test.remove
    @test.save({:a => 50})
    assert_equal 1, @test.remove({}, :safe => true)["n"]
    @test.drop
  end

  def test_remove_return_value
    assert_equal true, @@test.remove({})
  end

  def test_count
    @@test.drop

    assert_equal 0, @@test.count
    @@test.save(:x => 1)
    @@test.save(:x => 2)
    assert_equal 2, @@test.count

    assert_equal 1, @@test.count(:query => {:x => 1})
    assert_equal 1, @@test.count(:limit => 1)
    assert_equal 0, @@test.count(:skip => 2)
  end

  # Note: #size is just an alias for #count.
  def test_size
    @@test.drop

    assert_equal 0, @@test.count
    assert_equal @@test.size, @@test.count
    @@test.save("x" => 1)
    @@test.save("x" => 2)
    assert_equal @@test.size, @@test.count
  end

  def test_no_timeout_option
    @@test.drop

    assert_raise ArgumentError, "Timeout can be set to false only when #find is invoked with a block." do
      @@test.find({}, :timeout => false)
    end

    @@test.find({}, :timeout => false) do |cursor|
      assert_equal 0, cursor.count
    end

    @@test.save("x" => 1)
    @@test.save("x" => 2)
    @@test.find({}, :timeout => false) do |cursor|
      assert_equal 2, cursor.count
    end
  end

  def test_defualt_timeout
    cursor = @@test.find
    assert_equal true, cursor.timeout
  end

  def test_fields_as_hash
    @@test.save(:a => 1, :b => 1, :c => 1)

    doc = @@test.find_one({:a => 1}, :fields => {:b => 0})
    assert_nil doc['b']
    assert doc['a']
    assert doc['c']

    doc = @@test.find_one({:a => 1}, :fields => {:a => 1, :b => 1})
    assert_nil doc['c']
    assert doc['a']
    assert doc['b']

    assert_raise Mongo::OperationFailure do
      @@test.find_one({:a => 1}, :fields => {:a => 1, :b => 0})
    end
  end

  if @@version >= "1.5.1"
    def test_fields_with_slice
      @@test.save({:foo => [1, 2, 3, 4, 5, 6], :test => 'slice'})

      doc = @@test.find_one({:test => 'slice'}, :fields => {'foo' => {'$slice' => [0, 3]}})
      assert_equal [1, 2, 3], doc['foo']
      @@test.remove
    end
  end

  def test_find_one
    id = @@test.save("hello" => "world", "foo" => "bar")

    assert_equal "world", @@test.find_one()["hello"]
    assert_equal @@test.find_one(id), @@test.find_one()
    assert_equal @@test.find_one(nil), @@test.find_one()
    assert_equal @@test.find_one({}), @@test.find_one()
    assert_equal @@test.find_one("hello" => "world"), @@test.find_one()
    assert_equal @@test.find_one(BSON::OrderedHash["hello", "world"]), @@test.find_one()

    assert @@test.find_one(nil, :fields => ["hello"]).include?("hello")
    assert !@@test.find_one(nil, :fields => ["foo"]).include?("hello")
    assert_equal ["_id"], @@test.find_one(nil, :fields => []).keys()

    assert_equal nil, @@test.find_one("hello" => "foo")
    assert_equal nil, @@test.find_one(BSON::OrderedHash["hello", "foo"])
    assert_equal nil, @@test.find_one(ObjectId.new)

    assert_raise TypeError do
      @@test.find_one(6)
    end
  end

  def test_insert_adds_id
    doc = {"hello" => "world"}
    @@test.insert(doc)
    assert(doc.include?(:_id))

    docs = [{"hello" => "world"}, {"hello" => "world"}]
    @@test.insert(docs)
    docs.each do |d|
      assert(d.include?(:_id))
    end
  end

  def test_save_adds_id
    doc = {"hello" => "world"}
    @@test.save(doc)
    assert(doc.include?(:_id))
  end

  def test_optional_find_block
    10.times do |i|
      @@test.save("i" => i)
    end

    x = nil
    @@test.find("i" => 2) { |cursor|
      x = cursor.count()
    }
    assert_equal 1, x

    i = 0
    @@test.find({}, :skip => 5) do |cursor|
      cursor.each do |doc|
        i = i + 1
      end
    end
    assert_equal 5, i

    c = nil
    @@test.find() do |cursor|
      c = cursor
    end
    assert c.closed?
  end

  if @@version > "1.1.1"
    def test_map_reduce
      @@test << { "user_id" => 1 }
      @@test << { "user_id" => 2 }

      m = "function() { emit(this.user_id, 1); }"
      r = "function(k,vals) { return 1; }"
      res = @@test.map_reduce(m, r, :out => 'foo');
      assert res.find_one({"_id" => 1})
      assert res.find_one({"_id" => 2})
    end

    def test_map_reduce_with_code_objects
      @@test << { "user_id" => 1 }
      @@test << { "user_id" => 2 }

      m = Code.new("function() { emit(this.user_id, 1); }")
      r = Code.new("function(k,vals) { return 1; }")
      res = @@test.map_reduce(m, r, :out => 'foo');
      assert res.find_one({"_id" => 1})
      assert res.find_one({"_id" => 2})
    end

    def test_map_reduce_with_options
      @@test.remove
      @@test << { "user_id" => 1 }
      @@test << { "user_id" => 2 }
      @@test << { "user_id" => 3 }

      m = Code.new("function() { emit(this.user_id, 1); }")
      r = Code.new("function(k,vals) { return 1; }")
      res = @@test.map_reduce(m, r, :query => {"user_id" => {"$gt" => 1}}, :out => 'foo');
      assert_equal 2, res.count
      assert res.find_one({"_id" => 2})
      assert res.find_one({"_id" => 3})
    end

    def test_map_reduce_with_raw_response
      m = Code.new("function() { emit(this.user_id, 1); }")
      r = Code.new("function(k,vals) { return 1; }")
      res = @@test.map_reduce(m, r, :raw => true, :out => 'foo')
      assert res["result"]
      assert res["counts"]
      assert res["timeMillis"]
    end

    def test_map_reduce_with_output_collection
      output_collection = "test-map-coll"
      m = Code.new("function() { emit(this.user_id, 1); }")
      r = Code.new("function(k,vals) { return 1; }")
      res = @@test.map_reduce(m, r, :raw => true, :out => output_collection)
      assert_equal output_collection, res["result"]
      assert res["counts"]
      assert res["timeMillis"]
    end

    if @@version >= "1.8.0"
      def test_map_reduce_with_collection_merge
        @@test << {:user_id => 1}
        @@test << {:user_id => 2}
        output_collection = "test-map-coll"
        m = Code.new("function() { emit(this.user_id, {count: 1}); }")
        r = Code.new("function(k,vals) { var sum = 0;" +
          " vals.forEach(function(v) { sum += v.count;} ); return {count: sum}; }")
        res = @@test.map_reduce(m, r, :out => output_collection)

        @@test.remove
        @@test << {:user_id => 3}
        res = @@test.map_reduce(m, r, :out => {:merge => output_collection})
        assert res.find.to_a.any? {|doc| doc["_id"] == 3 && doc["value"]["count"] == 1}

        @@test.remove
        @@test << {:user_id => 3}
        res = @@test.map_reduce(m, r, :out => {:reduce => output_collection})
        assert res.find.to_a.any? {|doc| doc["_id"] == 3 && doc["value"]["count"] == 2}

        assert_raise ArgumentError do
          @@test.map_reduce(m, r, :out => {:inline => 1})
        end

        @@test.map_reduce(m, r, :raw => true, :out => {:inline => 1})
        assert res["results"]
      end
    end
  end

  if @@version > "1.3.0"
    def test_find_and_modify
      @@test << { :a => 1, :processed => false }
      @@test << { :a => 2, :processed => false }
      @@test << { :a => 3, :processed => false }

      @@test.find_and_modify(:query => {}, :sort => [['a', -1]], :update => {"$set" => {:processed => true}})

      assert @@test.find_one({:a => 3})['processed']
    end

    def test_find_and_modify_with_invalid_options
      @@test << { :a => 1, :processed => false }
      @@test << { :a => 2, :processed => false }
      @@test << { :a => 3, :processed => false }

      assert_raise Mongo::OperationFailure do
        @@test.find_and_modify(:blimey => {})
      end
    end
  end

  if @@version >= "1.3.5"
    def test_coll_stats
      @@test << {:n => 1}
      @@test.create_index("n")

      assert_equal "#{MONGO_TEST_DB}.test", @@test.stats['ns']
    end
  end

  def test_saving_dates_pre_epoch
    begin
      @@test.save({'date' => Time.utc(1600)})
      assert_in_delta Time.utc(1600), @@test.find_one()["date"], 2
    rescue ArgumentError
      # See note in test_date_before_epoch (BSONTest)
    end
  end

  def test_save_symbol_find_string
    @@test.save(:foo => :mike)

    assert_equal :mike, @@test.find_one(:foo => :mike)["foo"]
    assert_equal :mike, @@test.find_one("foo" => :mike)["foo"]

    # TODO enable these tests conditionally based on server version (if >1.0)
    # assert_equal :mike, @@test.find_one(:foo => "mike")["foo"]
    # assert_equal :mike, @@test.find_one("foo" => "mike")["foo"]
  end

  def test_limit_and_skip
    10.times do |i|
      @@test.save(:foo => i)
    end

    assert_equal 5, @@test.find({}, :skip => 5).next_document()["foo"]
    assert_equal nil, @@test.find({}, :skip => 10).next_document()

    assert_equal 5, @@test.find({}, :limit => 5).to_a.length

    assert_equal 3, @@test.find({}, :skip => 3, :limit => 5).next_document()["foo"]
    assert_equal 5, @@test.find({}, :skip => 3, :limit => 5).to_a.length
  end

  def test_large_limit
    2000.times do |i|
      @@test.insert("x" => i, "y" => "mongomongo" * 1000)
    end

    assert_equal 2000, @@test.count

    i = 0
    y = 0
    @@test.find({}, :limit => 1900).each do |doc|
      i += 1
      y += doc["x"]
    end

    assert_equal 1900, i
    assert_equal 1804050, y
  end

  def test_small_limit
    @@test.insert("x" => "hello world")
    @@test.insert("x" => "goodbye world")

    assert_equal 2, @@test.count

    x = 0
    @@test.find({}, :limit => 1).each do |doc|
      x += 1
      assert_equal "hello world", doc["x"]
    end

    assert_equal 1, x
  end

  def test_find_with_transformer
    klass       = Struct.new(:id, :a)
    transformer = Proc.new { |doc| klass.new(doc['_id'], doc['a']) }
    cursor      = @@test.find({}, :transformer => transformer)
    assert_equal(transformer, cursor.transformer)
  end

  def test_find_one_with_transformer
    klass       = Struct.new(:id, :a)
    transformer = Proc.new { |doc| klass.new(doc['_id'], doc['a']) }
    id          = @@test.insert('a' => 1)
    doc         = @@test.find_one(id, :transformer => transformer)
    assert_instance_of(klass, doc)
  end

  def test_ensure_index
    @@test.drop_indexes
    @@test.insert("x" => "hello world")
    assert_equal 1, @@test.index_information.keys.count #default index

    @@test.ensure_index([["x", Mongo::DESCENDING]], {})
    assert_equal 2, @@test.index_information.keys.count
    assert @@test.index_information.keys.include?("x_-1")

    @@test.ensure_index([["x", Mongo::ASCENDING]])
    assert @@test.index_information.keys.include?("x_1")

    @@test.ensure_index([["type", 1], ["date", -1]])
    assert @@test.index_information.keys.include?("type_1_date_-1")

    @@test.drop_index("x_1")
    assert_equal 3, @@test.index_information.keys.count
    @@test.drop_index("x_-1")
    assert_equal 2, @@test.index_information.keys.count

    @@test.ensure_index([["x", Mongo::DESCENDING]], {})
    assert_equal 3, @@test.index_information.keys.count
    assert @@test.index_information.keys.include?("x_-1")

    # Make sure that drop_index expires cache properly
    @@test.ensure_index([['a', 1]])
    assert @@test.index_information.keys.include?("a_1")
    @@test.drop_index("a_1")
    assert !@@test.index_information.keys.include?("a_1")
    @@test.ensure_index([['a', 1]])
    assert @@test.index_information.keys.include?("a_1")
    @@test.drop_index("a_1")
  end

  def test_ensure_index_timeout
    @@db.cache_time = 2
    coll = @@db['ensure_test']
    coll.expects(:generate_indexes).twice
    coll.ensure_index([['a', 1]])

    # These will be cached
    coll.ensure_index([['a', 1]])
    coll.ensure_index([['a', 1]])
    coll.ensure_index([['a', 1]])
    coll.ensure_index([['a', 1]])

    sleep(3)
    # This won't be, so generate_indexes will be called twice
    coll.ensure_index([['a', 1]])
  end

  if @@version > '2.0.0'
    def test_show_disk_loc
      @@test.save({:a => 1})
      @@test.save({:a => 2})
      assert @@test.find({:a => 1}, :show_disk_loc => true).show_disk_loc
      assert @@test.find({:a => 1}, :show_disk_loc => true).next['$diskLoc']
      @@test.remove
    end

    def test_max_scan
      1000.times do |n|
        @@test.save({:a => n})
      end
      assert @@test.find({:a => 999}).next
      assert !@@test.find({:a => 999}, :max_scan => 500).next
      @@test.remove
    end
  end

  context "Grouping" do
    setup do
      @@test.remove
      @@test.save("a" => 1)
      @@test.save("b" => 1)
      @initial = {"count" => 0}
      @reduce_function = "function (obj, prev) { prev.count += inc_value; }"
    end

    should "fail if missing required options" do
      assert_raise MongoArgumentError do
        @@test.group(:initial => {})
      end

      assert_raise MongoArgumentError do
        @@test.group(:reduce => "foo")
      end
    end

    should "group results using eval form" do
      assert_equal 1, @@test.group(:initial => @initial, :reduce => Code.new(@reduce_function, {"inc_value" => 0.5}))[0]["count"]
      assert_equal 2, @@test.group(:initial => @initial, :reduce => Code.new(@reduce_function, {"inc_value" => 1}))[0]["count"]
      assert_equal 4, @@test.group(:initial => @initial, :reduce => Code.new(@reduce_function, {"inc_value" => 2}))[0]["count"]
    end

    should "finalize grouped results" do
      @finalize = "function(doc) {doc.f = doc.count + 200; }"
      assert_equal 202, @@test.group(:initial => @initial, :reduce => Code.new(@reduce_function, {"inc_value" => 1}), :finalize => @finalize)[0]["f"]
    end
  end

  context "Grouping with key" do
    setup do
      @@test.remove
      @@test.save("a" => 1, "pop" => 100)
      @@test.save("a" => 1, "pop" => 100)
      @@test.save("a" => 2, "pop" => 100)
      @@test.save("a" => 2, "pop" => 100)
      @initial = {"count" => 0, "foo" => 1}
      @reduce_function = "function (obj, prev) { prev.count += obj.pop; }"
    end

    should "group" do
      result = @@test.group(:key => :a, :initial => @initial, :reduce => @reduce_function)
      assert result.all? { |r| r['count'] == 200 }
    end
  end

  context "Grouping with a key function" do
    setup do
      @@test.remove
      @@test.save("a" => 1)
      @@test.save("a" => 2)
      @@test.save("a" => 3)
      @@test.save("a" => 4)
      @@test.save("a" => 5)
      @initial = {"count" => 0}
      @keyf    = "function (doc) { if(doc.a % 2 == 0) { return {even: true}; } else {return {odd: true}} };"
      @reduce  = "function (obj, prev) { prev.count += 1; }"
    end

    should "group results" do
      results = @@test.group(:keyf => @keyf, :initial => @initial, :reduce => @reduce).sort {|a, b| a['count'] <=> b['count']}
      assert results[0]['even'] && results[0]['count'] == 2.0
      assert results[1]['odd'] && results[1]['count'] == 3.0
    end

    should "group filtered results" do
      results = @@test.group(:keyf => @keyf, :cond => {:a => {'$ne' => 2}},
        :initial => @initial, :reduce => @reduce).sort {|a, b| a['count'] <=> b['count']}
      assert results[0]['even'] && results[0]['count'] == 1.0
      assert results[1]['odd'] && results[1]['count'] == 3.0
    end
  end

  context "A collection with two records" do
    setup do
      @collection = @@db.collection('test-collection')
      @collection.remove
      @collection.insert({:name => "Jones"})
      @collection.insert({:name => "Smith"})
    end

    should "have two records" do
      assert_equal 2, @collection.size
    end

    should "remove the two records" do
      @collection.remove()
      assert_equal 0, @collection.size
    end

    should "remove all records if an empty document is specified" do
      @collection.remove({})
      assert_equal 0, @collection.find.count
    end

    should "remove only matching records" do
      @collection.remove({:name => "Jones"})
      assert_equal 1, @collection.size
    end
  end

  context "Drop index " do
    setup do
      @@db.drop_collection('test-collection')
      @collection = @@db.collection('test-collection')
    end

    should "drop an index" do
      @collection.create_index([['a', Mongo::ASCENDING]])
      assert @collection.index_information['a_1']
      @collection.drop_index([['a', Mongo::ASCENDING]])
      assert_nil @collection.index_information['a_1']
    end

    should "drop an index which was given a specific name" do
      @collection.create_index([['a', Mongo::DESCENDING]], {:name => 'i_will_not_fear'})
      assert @collection.index_information['i_will_not_fear']
      @collection.drop_index([['a', Mongo::DESCENDING]])
      assert_nil @collection.index_information['i_will_not_fear']
    end

    should "drops an composite index" do
      @collection.create_index([['a', Mongo::DESCENDING], ['b', Mongo::ASCENDING]])
      assert @collection.index_information['a_-1_b_1']
      @collection.drop_index([['a', Mongo::DESCENDING], ['b', Mongo::ASCENDING]])
      assert_nil @collection.index_information['a_-1_b_1']
    end

    should "drops an index with symbols" do
      @collection.create_index([['a', Mongo::DESCENDING], [:b, Mongo::ASCENDING]])
      assert @collection.index_information['a_-1_b_1']
      @collection.drop_index([['a', Mongo::DESCENDING], [:b, Mongo::ASCENDING]])
      assert_nil @collection.index_information['a_-1_b_1']
    end
  end

  context "Creating indexes " do
    setup do
      @@db.drop_collection('geo')
      @@db.drop_collection('test-collection')
      @collection = @@db.collection('test-collection')
      @geo        = @@db.collection('geo')
    end

    should "create index using symbols" do
      @collection.create_index :foo, :name => :bar
      @geo.create_index :goo, :name => :baz
      assert @collection.index_information['bar']
      @collection.drop_index :bar
      assert_nil @collection.index_information['bar']
      assert @geo.index_information['baz']
      @geo.drop_index(:baz)
      assert_nil @geo.index_information['baz']
    end

    should "create a geospatial index" do
      @geo.save({'loc' => [-100, 100]})
      @geo.create_index([['loc', Mongo::GEO2D]])
      assert @geo.index_information['loc_2d']
    end

    should "create a unique index" do
      @collection.create_index([['a', Mongo::ASCENDING]], :unique => true)
      assert @collection.index_information['a_1']['unique'] == true
    end

    should "drop duplicates" do
      @collection.insert({:a => 1})
      @collection.insert({:a => 1})
      assert_equal 2, @collection.find({:a => 1}).count
      @collection.create_index([['a', Mongo::ASCENDING]], :unique => true, :dropDups => true)
      assert_equal 1, @collection.find({:a => 1}).count
    end

    should "drop duplicates with ruby-like drop_dups key" do
      @collection.insert({:a => 1})
      @collection.insert({:a => 1})
      assert_equal 2, @collection.find({:a => 1}).count
      @collection.create_index([['a', Mongo::ASCENDING]], :unique => true, :drop_dups => true)
      assert_equal 1, @collection.find({:a => 1}).count
    end

    should "drop duplicates with ensure_index and drop_dups key" do
      @collection.insert({:a => 1})
      @collection.insert({:a => 1})
      assert_equal 2, @collection.find({:a => 1}).count
      @collection.ensure_index([['a', Mongo::ASCENDING]], :unique => true, :drop_dups => true)
      assert_equal 1, @collection.find({:a => 1}).count
    end

    should "create an index in the background" do
      if @@version > '1.3.1'
        @collection.create_index([['b', Mongo::ASCENDING]], :background => true)
        assert @collection.index_information['b_1']['background'] == true
      else
        assert true
      end
    end

    should "require an array of arrays" do
      assert_raise MongoArgumentError do
        @collection.create_index(['c', Mongo::ASCENDING])
      end
    end

    should "enforce proper index types" do
      assert_raise MongoArgumentError do
        @collection.create_index([['c', 'blah']])
      end
    end

    should "raise an error if index name is greater than 128" do
      assert_raise Mongo::OperationFailure do
        @collection.create_index([['a' * 25, 1], ['b' * 25, 1],
          ['c' * 25, 1], ['d' * 25, 1], ['e' * 25, 1]])
      end
    end

    should "allow for an alternate name to be specified" do
      @collection.create_index([['a' * 25, 1], ['b' * 25, 1],
        ['c' * 25, 1], ['d' * 25, 1], ['e' * 25, 1]], :name => 'foo_index')
      assert @collection.index_information['foo_index']
    end

    should "generate indexes in the proper order" do
      @collection.expects(:insert_documents) do |sel, coll, safe|
        assert_equal 'b_1_a_1', sel[:name]
      end
      @collection.create_index([['b', 1], ['a', 1]])
    end

    should "allow multiple calls to create_index" do

    end

    should "allow creation of multiple indexes" do
      assert @collection.create_index([['a', 1]])
      assert @collection.create_index([['a', 1]])
    end

    context "with an index created" do
      setup do
        @collection.create_index([['b', 1], ['a', 1]])
      end

      should "return properly ordered index information" do
        assert @collection.index_information['b_1_a_1']
      end
    end
  end

  context "Capped collections" do
    setup do
      @@db.drop_collection('log')
      @capped = @@db.create_collection('log', :capped => true, :size => 1024)

      10.times { |n| @capped.insert({:n => n}) }
    end

    should "find using a standard cursor" do
      cursor = @capped.find
      10.times do
        assert cursor.next_document
      end
      assert_nil cursor.next_document
      @capped.insert({:n => 100})
      assert_nil cursor.next_document
    end

    should "fail tailable cursor on a non-capped collection" do
      col = @@db['regular-collection']
      col.insert({:a => 1000})
      tail = Cursor.new(col, :tailable => true, :order => [['$natural', 1]])
      assert_raise OperationFailure do
        tail.next_document
      end
    end

    should "find using a tailable cursor" do
      tail = Cursor.new(@capped, :tailable => true, :order => [['$natural', 1]])
      10.times do
        assert tail.next_document
      end
      assert_nil tail.next_document
      @capped.insert({:n => 100})
      assert tail.next_document
    end
  end
end


Original Article: "Chicago Restaurants are the New Remote Office"
When working remotely, the "at home" part is purely optional. That's why so many places that double as office spaces have popped onto the scene—to cater to the modern, remote worker. Whether you take inspiration from a quiet, distraction-free setting or thrive amid a bustle of activity, there are plenty of locales that let you get out while (successfully) addressing the tasks at hand.


text:
HomePosts tagged '5th New York Cavalry'
5th New York Cavalry
Summary Statement, 3rd Quarter, 1863 – Miscellaneous New York artillery
13 September 2018 13 September 2018 Craig Swain American Civil War, Artillery, Ordnance Summary Statements	3rd New York Cavalry, 51st New York Infantry, 5th New York Cavalry, 98th New York Infantry, 99th New York Infantry, Allis' Howitzers, Beaufort NC, Camp Nelson KY, Croatan NC, David W. Waldrop, Fish's Howitzers, Fort Monroe, Frederick F. Wead, Goodwin's Battery, Gunboat Smith Briggs, Gunboat West End, James A. Allis, John C. Lee, Joseph M. Fish, Morehead City NC, New Berne NC, R. Charlton Mitchell, Smithfield VA, Suffolk, Varian's State Militia Battery, William A. Bartlett, William Kreutzer
As a convention, I prefer to work through each state entry starting with "regimented" batteries first (where regiments existed of course), then through independent batteries, and lastly through any miscellaneous lines. However, to ease handling and processing of these snips for transcription, I'm going to turn next to the miscellaneous lines before going to the independent batteries.
You see, the lines between the 2nd New York and 3rd New York include a couple of sections from infantry regiments. Those are lines 18 and 19:
Then, at the bottom of the page, we find entries for two cavalry regiments and stores held by an infantry regiment. Those last three returns were received in the forth quarter of 1863, roughly when they were expected. But those on the upper lines were not received until 1864. So imagine how this conversation went down…..
Clerk: Sir, I just received these two returns from the 98th and 99th New York Infantry claiming they have cannons. And I don't have room to fit them at the bottom of the New York page in the summary. What ever shall I do?
Ordnance Officer: Stick them in where you have space after the 2nd New York Artillery. Nobody will ever notice. Nobody cares about these summaries anyway!
But yet, here we are in 2018 with that annoying second red line as result of the split data!
So we have five "miscellaneous" to consider from the New York section of the summary:
98th New York Infantry: Companies E and H, if my reading is correct, assigned to Croatan Station, North Carolina with two 6-pdr field guns.
99th New York Infantry: A detachment reporting on the Gunboat Smith Briggs, in Virginia, with one 12-pdr field howitzer and one 10-pdr Parrott.
3rd New York Cavalry: A detachment at New Berne, North Carolina with two 12-mountain howitzers.
5th New York Cavalry: A detachment also at New Berne, and also with two (or is it three?) 12-pdr mountain howitzers.
51st New York Infantry: "Stores in Charge" of a Lieutenant Colonel at Camp Nelson, Kentucky.
Let me explore these five in more detail.
The 98th New York Infantry was among the forces sent from North Carolina to the Department of the South earlier in 1863, as part of the build-up before the Ironclad Attack. When that effort failed, the 98th was among the forces sent back to North Carolina, specifically Beaufort. On April 25, Lieutenant-Colonel Frederick F. Wead, then in command of the regiment, received orders to garrison "Newport Barracks, Havelock, Croatan, [and] Bogue sound blockhouse" which guarded the railroad between Beaufort / Morehead City and New Berne. After the war, William Kreutzer (then Captain, but later Colonel of the regiment) mentioned these dispositions in a history of the regiment:
This writer was assigned to the command of two posts, one at a point where the railroad crosses Newport river, called Havelock, and the other at Croatan, ten miles above, along the road to New Berne. Each post had a small earthwork in which was mounted on Napoleon gun.
This passage establishes the 'who' portion of the return but on disagrees with the summary's line. Perhaps, writing post war and being an infantryman, Kreutzer was simply mistaken about the guns. At any rate, we can at least verify some cannon were under the care of the 98th New York at Croatan around this time of the war, performing "boring" garrison duty.
The 99th New York Infantry, with names like "Bartlett's Naval Brigade" and "Lincoln Divers" offers a bit more interesting story. Colonel William A. Bartlett began recruiting what was intended to be a full brigade in the spring of 1861. It included almost as many men from Massachusetts and New Jersey as it did New York. The intent was to assign these companies to Army gunboats and have them patrol the coast. But by the time Bartlett reported to Fort Monroe, he'd met with an accident and the brigade was understrength. The "brigade" was then reorganized as an infantry and assigned duty at various posts around Fort Monroe and on vessels operating in that area. Colonel David W. Waldrop commanded. By the spring of 1863, most of those detachments were recalled and the regiment served at Suffolk, Virginia. Of those still on detached duty was Company I, manning the gunboats West End and Smith Briggs. The latter, we have a sketch to work from:
The Smith Briggs was a chartered (not outright purchased) 280 ton steamer converted to an armed transport, with a rifled 32-pdr and a rifled 42-pdr (probably converted seacoast guns using the James system). Based on the entry here in the summary, I would contend the 99th New York maintained a 12-pdr field howitzer and a 10-pdr Parrott to supplement those big guns, and perhaps use on patrols off the gunboat. Captain John C. Lee, of the 99th New York, commanded the Smith Briggs in 1863. And he was still in command when the vessel ran aground off Smithfield, Virginia on February 1, 1864, and was destroyed.
The detachment from the 3rd New York Cavalry should be familiar to readers from the previous quarter. These was Lieutenant James A. Allis command.
And a similar detachment was formed in the 12th New York Cavalry which also operated out of New Berne. During the summer, Lieutenant Joseph M. Fish, of Company F, was detached to command a section of howitzers. And these show up in some returns as "Fish's Howitzers" or "Fish's Battery."
And lastly the 51st New York Infantry. This regiment, part of the Second Division, Ninth Corps in the summer of 1863. It was transferred to the Twenty-Third Corps in September and performed garrison duties in the District of Kentucky. We'll see some of the stores accounted for in the ammunition tables that follow. The regiment's Lieutenant-Colonel was R. Charlton Mitchell at this time of the war.
With that summary of the five units represented by the lines, let us turn to the ammunition reported. Starting with the smoothbore:
98th New York Infantry: 57 shot, 41 case, and 42 canister for 6-pdr field guns.
99th New York Infantry: 42 shell and 88 case for 12-pdr field howitzers.
12th New York Cavalry: 32 shell, 44 case, and 46 canister for 12-pdr mountain howitzers.
51st New York Infantry: 56 shot, 56 case, and 48 canister for 6-pdr field guns.
Note that no ammunition was reported (for the second quarter in a row) for Allis' detachment from the 3rd New York Cavalry.
No Hotchkiss or Schenkl projectiles to report. But there were some Parrott projectiles:
Yes, on the ill-fated Smith Briggs:
99th New York Infantry: 137 shell and 40 canister for 10-pdr Parrott.
No small arms were reported by these five detachments on the artillery summaries. Usually infantry and cavalry commands filed their reports on different forms that were complied on a separate set of summaries.
Before leaving the "miscellaneous" of New York, there are two other batteries that deserve mention. Recall Goodwin's Battery, with its rather exotic breachloaders, and Varian's State Militia Battery were mustered into Federal service to meet the emergency posed by Lee's invasion of Pennsylvania. Both were still in Federal service at the start of the quarter. But only briefly in service. Goodwin's was mustered on July 27. Varian's was mustered out six days earlier. As these batteries were off the Federal rolls by the end of September, they were not required to send in returns. Lucky for them!
Citation: William Kreutzer, Notes and Observations Made During Four years of Service with the Ninety-Eighth N.Y. Volunteers in the War of 1861, Philadelphia: Grant, Faires & Ridgers, 1878, page 164.
Cavalry Retiring by Successive Formations: Brandy Station, October 11, 1863
7 September 2015 Craig Swain American Civil War, Brandy Station, Cavalry	18th Pennsylvania Cavalry, 1st Vermont Cavalry, 1st West Virginia Cavalry, 2nd New York Cavalry, 5th New York Cavalry, Alonzo Gray, Battery E 4th US Artillery, brandy station, Culpeper Courthouse, Edward Sawyer, fleetwood hill, George Custer, H. Judson Kilpatrick, Henry Davies, James City, John Buford, John Hammond, Lewis Barker, Samuel Elder, Sperryville
Yes, that is not a typo. There was a battle at Brandy Station on October 11, 1863. It was the third major action on Fleetwood Hill that year. If you recall, I wrote about this particular action during the sesquicentennial. At that time, I put focus on the actions by Brigadier-General John Buford's First Cavalry Division… for many good reasons. But I want to return to that day to discuss the activities of another Federal formation.
In his Cavalry Tactics, Alonzo Gray included a section discussing "Retiring by Successive Formations." One of the citations used to illustrate such tactical maneuvers was from the official report of Brigadier-General Henry E. Davies, Jr. on the October 11 actions at Brandy Station. Davies commanded First Brigade, Third Cavalry Division. Davies' brigade paired with the Second Brigade, under Brigadier-General George A. Custer, to constitute Brigadier-General H. Judson Kilpatrick's Third Cavalry Division. Davies' brigade consisted of the 2nd and 5th New York Cavalry, 18th Pennsylvania Cavalry, and the 1st West Virginia Cavalry. In addition, Davies had Battery E, 4th US Artillery, under Captain Samuel Elder, assigned in support.
Let me skip some of the normal background I'd offer in regard to the "big picture" relating to this action, hoping you click the link to the earlier blog post. Instead let me look to Davies' brigade, as reported, did on that day. Morning of October 11 found the brigade near James City were it had maintained a picket line. They'd screened the Army of the Potomac's withdrawal towards Culpeper. With those formations clearing Culpeper, it was time for Kilpatrick's cavalry to follow. Davies started that morning by splitting his command. The 1st West Virginia marched north to Sperryville in order to cover approaches to Culpeper from the west. The remainder of the command fell back back on the main road to Culpeper.
Davies' main force reached the Court-House without incident. But hearing the West Virginians had encountered Confederates, he dispatched the 5th New York in support.
These two regiments, commanded by Major [John] Hammond [5th New York], attacked the enemy and drove him back, then retired slowly toward Culpeper Court-House, bringing off in safety the infantry that had been left on the road.
I would pause to raise this question – what does "slowly retired" look like? Roll that around for a bit, while we continue….
While waiting on the return of those two regiments, Davies sent a squadron of the 2nd New York back down the road towards James City to "reconnoiter the road." This force soon ran into a large body of Confederate cavalry and lost two officers.
First Sergeant Barker, of Company A, then took command of the squadron, and by a vigorous charge broke through the rebel lines, brought in the whole command with a loss of but 5 men. For his gallantry and good conduct on this occasion, Sergeant [Lewis] Barker merits the praise of his officers, and he has shown himself eminently deserving of promotion, for which he has been recommended by the commanding officer of his regiment.
With that skillful extraction, Barker was able to fall back to the protection of Davies' main body and the artillery. But clearly it was time for the Federals to resume their withdrawal, as Davies recorded:
After passing through Culpeper Court-House, under the direction of the general commanding division, I fell back toward Brandy Station, having the right of the road, the Second Brigade being on the left. My rear was brought up by the Second New York, with their skirmishers thrown to the rear, firing and then retiring, my right flank protected by the First Vermont Cavalry, Colonel [Edward] Sawyer, who had been temporarily attached to my command. The enemy followed me very closely, skirmishing heavily with my rear guard, which, however, held its ground well, and did not give back an inch except when ordered.
Sure, nobody gives ground in their official reports. Right? But the tactical situation deteriorated rapidly at that point.
On nearing Brandy Station we found the enemy had got between us and General Buford's command, and the Second Brigade was advanced to the front to charge. As they went forward I placed a section of my battery in position and opened fire on the enemy, who fell back before the Second Brigade toward my right flank.
Let's pause again for a moment and consider how Kilpatrick was attempting to fight his division at that point in the action. Kilpatrick's report simply alluded to having Davies on the right and Custer on the left. But what Davies' account implies is that First Brigade, plus Elder's guns, took up a supporting position while Second Brigade made the initial assault. The point I'd make here is that Kilpatrick approached the initial situation with a "hold with one brigade and jab with the other" maneuver.
But beyond that, this was not exactly a clean cut "textbook" situation as things were falling apart all around the line and to the rear. Davies pushed out the 1st Vermont to his right, with the 18th Pennsylvania in support, to make another charge. Then the 2nd New York mounted a charge on Confederates pressing the Brigade's rear. And while those charges were ongoing, to the front, Buford's command was coming to Kilpatrick's assistance. Davies, from his point of view, recorded:
All of these movements I am happy to say were most successful, and we repulsed the rebels at every point, and in another moment my battery, supported by the Fifth New York, had followed in the road cut out by the Second Brigade, and gained a position of comparative safety where it could be of assistance to me.
Again, pause to think about the movements. The 5th New York and the artillery had maintained a base that allowed at least three separate charges by other regiments in the brigade. Furthermore, if we give weight to Davies' account, that base supported the Second Brigade's attacks. Though in my opinion, most of the credit for the breakout should go to Buford's troopers.
In these such tactical actions, an open escape route is half the solution. The unit still has to extract itself. With three regiments (including the attached Vermonters) recalling from charges, Davies had to use the West Virginia regiment to form another base behind which the others could rally. Behind this second base, Davies worked to move his command to safety, "… a description of the engagement is hardly practicable, as it consisted of a series of gallant charges made wherever the enemy appeared, in a manner that proved both the individual gallantry and the thorough discipline of our troops."
Extracted from encirclement, Davies' troopers were still not free. The action continued even after their escape:
My battery, under Captain Elder, was posted on my right flank and rear, and pouring shot and shell into the enemy's ranks, contributed in a great degree to our success. At one time the enemy attempted to charge the battery in flank, but the support, a battalion of the Fifth New York, under Major White, charged gallantly to the rescue and drove them back with heavy loss. After this I received orders to retain my command behind the line of the Second Brigade and reform them; which was done, and I then held a position under cover of which the Second Brigade withdrew and again took up position near the river.
It was the later part of this passage that Gray cited in his section on "Retiring by Successive Formations." What we see in that passage is again Kilpatrick using his division in two elements – one forms a base while the other maneuvers. Unlike the earlier maneuvers during the breakout, Kilpatrick's command was withdrawing under pressure. So instead of charging, they were withdrawing to the rear behind the safety of a line formed by the other brigade – leapfrog in reverse.
Returning to the morning operations, recall again my question of what "slowly retired" looked like. I'd submit it would resemble the retirement of brigades, only at a smaller level with squadrons or whole regiments. Indeed we see a pattern to the maneuvers of Davies' command throughout the day. There always seems to be a "base" providing support for a "maneuver" element. Such was the case with the actions around Culpeper, later with the breakout, and at the end of the day beyond Fleetwood Hill.
Successive movements were a common fundamental for cavalry tactics. Such were employed from the smallest formations to the largest. In order to maneuver in formation, a force of cavalry needed some relatively secure space to "form" and prepare. The base force provided such. And likewise once the maneuver force reached an objective – be that in the attack or withdrawal – it could set as a base to allow the other portion to maneuver.
The use of successive movements appears in modern military tactics in the form of bounding maneuvers, also conducted from the smallest to the largest formations.
I submit that if Davies or Buford (though some might question Kilpatrick…) were around today, they'd easily recognize the intent of a mechanized infantry or armored cavalry force using "bounding overwatch."
(Citation from OR, Series I, Volume 48, Part I, Serial 48, pages 385-6.)
150 Years Ago: Lee's First Lost Order
18 August 2012 18 August 2012 Craig Swain American Civil War, Sesquicentennial	1st Michigan Cavalry, 5th New York Cavalry, J.E.B. Stuart, John Buford, John Pope, Thornton Brodhead, Verdiersville
On this morning of August 18, 150 years ago, General J.E.B. Stuart received an abrupt awakening outside Verdiersville, Virginia:
… I was aroused from the porch where I lay by the noise of horsemen and wagons, and walking out bareheaded to the fence near by, found that they were coming from the very direction indicated for General F. Lee. I was not left long in this delusion, however, for two officers, Captain Mosby and Lieutenant Gibson, whom I sent to ascertain the truth, were fired upon and rapidly pursued. I had barely time to leap upon my horse just as I was, and, with Major Von Borcke and Lieutenant Dabney, of my staff, escaped by leaping a high fence. The major, who took the road, was fired at as long as in sight, but none of us were hurt. There was no assistance for 10 miles. Having stopped at the nearest woods, I observed the party approach and leave in great haste, but not without my hat and the cloak which had formed my bed. Major Fitzhugh, in his searches for General Lee, was caught by this party and borne off as a prisoner of war…. (OR, Series I, Volume 12, Part II, Serial 16, page 726)
A marker, in Orange County just off Virginia Highway 20, bear witness to this small cavalry fight. Not much compared to the larger battles to come in the following weeks. But with some important implications. The marker, like many accounts of this event, focuses upon Stuart's lost hat and his revenge.
The "hat story" is one of those pleasing stories of the war that seem to charm us away from the horror of the times. I'll retell it here, as it becomes somewhat obligatory… but will be brief…
Meeting on the Cedar Mountain battlefield under a truce after the battle, Stuart bet Federal General Samuel Crawford that the northern press would bill the fight as a Union victory. True to his word, Crawford forwarded after the Yankee newspaper headlines ran. As indicated in his official report, Stuart lost the hat during the confusion on the morning of August 18. Somewhat embarrassed by this loss, particularly with the reaction of his troopers, Stuart vowed revenge. On August 22, he got that revenge when leading a raid on Catlett Station. Among the spoils was General John Pope's dress uniform. Appeals for a trade fell on deaf ears. So Stuart was content to simply send the uniform to Richmond for display.
Nice story, but distracts us from the more important loss to the Confederates – papers carried by Major Norman Fitzhugh. Included in the documents were orders outlining General Robert E. Lee's plan to cut off and defeat Pope's Army of Virginia between the Rapidan and Rappahannock Rivers. With this information and intelligence from other sources, Pope hastily withdrew from the advance position. He fell back to positions on the north bank of the Rappahannock. Good, defensible terrain.
One might argue the withdrawal only delayed the inevitable clash of armies, within a series of cause-and-effect events leading back to Manassas. But the withdrawal did mean Pope's command was not beaten at a point deep in Virginia where retreat into the Washington defense perimeter was impossible. Like the more famous one lost less than a month later outside Frederick, Maryland, the orders lost at Verdiersville changed the nature of a campaign.
Another point that is also often overlooked is the Federal perspective on the action. Colonel Thornton F. Brodhead accomplished this raid, nearly capturing Stuart and Mosby mind you, with the 1st Michigan and 5th New York Cavalry. Both units the southerners would meet on other battlefields. And the man who'd dispatched them on the raid was General John Buford. The Union cavalry was, even at this early stage of the war, showing signs of competence. The blue troopers could equal, and some times best, their gray counterparts when well lead. And those Yankee horse soldiers would only get better with age.

redpajama_set_name: RedPajamaCommonCrawl


text:
Nigeria cracks down after attacks
Authorities arrest scores and beef up security after hundreds killed near Jos.
Dan Manjang, an adviser to the government of Plateau State, where the attacks took place, said 95 arrests had been made.
Al Jazeera's Yvonne Ndege, reporting from Jos, said the government had confirmed Sunday's death toll at more than 500 and had launched a huge security operation in an attempt to stop the violence from spreading to other states.
Resources and religion
Timeline: Nigeria tensions
Nigeria's sectarian crisis
Video: Jos violence
Our correspondent quoted police as saying that the attackers were Muslim Hausa-Fulani herders while the victims were mainly Christians from the Borom community.
But she added that while many people would view the violence in a religious context, people she had spoken to said the violence was about indigenous groups, who are mainly Christian, and migrants and settlers, mainly from the Hausa-speaking Muslim north, competing for access to resources.
The latest violence in the centre of Africa's most populous nation comes at a time of uncertainty for the country, with Goodluck Jonathan, the acting president, trying to assert his authority while Umaru Yar'Adua, the president, remains too sick to govern.
Women and children were among those buried in a mass grave on Monday
The situation is a test of Jonathan's ability to show that he has the power to deploy the police and army as commander-in-chief, and many people will be watching to see how he deals with the situation, our correspondent said.
In a statement after Sunday's attack, Jonathan's office said he had "directed that the security services undertake strategic initiatives to confront and defeat these roving bands of killers".
Mohammed Lerama, a police spokesman, said the official death toll stood at 55 so far, but Gregory Yenlong, Plateau State's Commissioner for Information, said: We are estimating 500 people killed but I think it should be a little bit above that."
Yenlong added that "soldiers are patrolling and everywhere remains calm", but security officials have been criticised for failing to prevent another outburst of violence just weeks after hundreds died in Muslim-Christian clashes.
The violence in the three, mostly Christian, villages on Sunday appeared to be reprisal attacks following the January unrest in Jos when most of the victims were Muslims, Robin Waubo, a Red Cross spokesman, said.


text:
namespace NEventStore.Persistence.Sql.SqlDialects
{
    using System;
    using System.Reflection;

    public class MySqlDialect : CommonSqlDialect
    {
        private const int UniqueKeyViolation = 1062;

        public override string InitializeStorage
        {
            get { return MySqlStatements.InitializeStorage; }
        }

        public override string PersistCommit
        {
            get { return MySqlStatements.PersistCommit; }
        }

        public override string AppendSnapshotToCommit
        {
            get { return base.AppendSnapshotToCommit.Replace("/*FROM DUAL*/", "FROM DUAL"); }
        }

        public override string MarkCommitAsDispatched
        {
            get { return base.MarkCommitAsDispatched.Replace("1", "true"); }
        }

        public override string GetUndispatchedCommits
        {
            get { return base.GetUndispatchedCommits.Replace("0", "false"); }
        }

        public override object CoalesceParameterValue(object value)
        {
            if (value is Guid)
            {
                return ((Guid) value).ToByteArray();
            }

            if (value is DateTime)
            {
                return ((DateTime) value).Ticks;
            }

            return value;
        }

        public override bool IsDuplicate(Exception exception)
        {
            PropertyInfo property = exception.GetType().GetProperty("Number");
            return UniqueKeyViolation == (int) property.GetValue(exception, null);
        }
    }
}

redpajama_set_name: RedPajamaGithub


TV-birthed Eden's Crush nabs opening slot on blockbuster group's summer outing.
Having a weekly TV series does have its perks.
The WB-birthed girl group Eden's Crush, whose debut, "Get Over Yourself," topped SoundScan's singles sales figures on Wednesday (March 21), have been tapped to open for 'NSYNC on their summer tour.
Though the 'NSYNC excursion kicks off on May 12 in Miami (see "'NSYNC Announces Full Itinerary For Stadium Tour"), the five ladies will hook up with the five fellas as of their June 19 date in Toronto.
Eden's Crush, formed during the course of the WB Television Network's reality series "Popstars," are finishing their as-yet-untitled first album and say they're trying to narrow down the 16 tracks they've recorded to an LP-lean 13.
The group sold more than 77,000 copies of "Get Over Yourself" last week, rendering it the top-selling single in the U.S.


EA Sports and Liverpool Football Club have announced a new three-year partnership for FIFA games.
The deal sees the entire Liverpool team being scanned in 3D into FIFA 14 as you can see below.
Like the deal with Barcelona before it, EA Sports will give Liverpool FC fans the opportunity to play FIFA 14 at matches throughout the season .
FIFA 14 is available for pre-order on selected platforms and will release in North America on September 24 and worldwide on September 27 for PC, PS3 and Xbox 360.
It will release on PS4 and Xbox One later this year.


text:
OPEC Kingpin Saudi Arabia Replaces Energy Minister with King's Son
RIYADH - Saudi Arabia's King Salman on Sunday replaced the energy minister with one of his sons, state media said, in a major shakeup as the OPEC kingpin reels from low oil prices.
The appointment of Prince Abdulaziz bin Salman, half-brother to de facto ruler Crown Prince Mohammed bin Salman, marks the first time a royal family member has been put in charge of the all-important Energy Ministry.
He replaces veteran official Khalid al-Falih as the world's top crude exporter accelerates preparations for a much-anticipated stock listing of state-owned oil giant Aramco, expected to be the world's biggest.
"Khalid al-Falih has been removed from his position," the official Saudi Press Agency said, citing a royal decree.
"His royal highness Prince Abdulaziz bin Salman is appointed minister of energy."
Since his appointment as oil minister in 2016, Falih has been the face of Saudi energy policy but the veteran technocrat had seen his portfolio shrink in recent weeks.
His ouster comes just days after he was removed as chairman of Aramco and replaced by Yasir al-Rumayyan, governor of the kingdom's vast Public Investment Fund.
Falih's powers were diminished last month when the world's top oil exporter announced the creation of a new ministry of industry and mineral resources, separating it from his energy ministry.
It was widely speculated that top officials were dissatisfied with Falih as oil prices sagged ahead of the Aramco IPO.
Economic uncertainty fanned, by an ongoing US-China trade war, has dragged Brent crude prices to around $60 a barrel in recent weeks, well below the $85 mark that experts say is needed to balance the Saudi budget.
'Seasoned veteran'
The OPEC petroleum exporters' cartel and key non-OPEC members are scheduled to meet in Abu Dhabi on Thursday to review their strategy on limiting production to halt a slide in prices.
Cartel kingpin Saudi Arabia, which pumps around a third of OPEC's oil, has resorted to massive production cuts to lift prices since the market crash in mid-2014.
It was unclear whether there would be a change in policy under Prince Abdulaziz, who joined the oil ministry in the 1980s and has held a variety of senior roles.
"Prince Abdulaziz is a very seasoned veteran of Saudi and OPEC policy making," Bob McNally, president of Rapidan Energy Group, told Bloomberg News.
"He won't have a learning curve. I don't expect any big rupture in current Saudi oil policy."
His appointment further concentrates power within the king's family. His other son, Prince Mohammed bin Salman, controls the major levers of power and is heir to the Arab world's most powerful throne.
A younger son, Prince Khalid bin Salman, is deputy defense minister.
Aramco is stepping up efforts to float around five percent of the company, seeking to raise up to $100 billion based on a $2 trillion valuation of the whole firm.
But low oil prices have left some investors in doubt that Aramco is really worth that much.
Failure to reach a $2 trillion valuation as desired by Saudi rulers is widely considered the reason the IPO, earlier scheduled for 2018, was delayed.
The planned IPO forms the cornerstone of a reform program envisaged by Crown Prince Mohammed bin Salman to wean the Saudi economy off its reliance on oil.
Saudi Aramco has not announced where the listing will be held, but London, New York and Hong Kong have all vied for a slice of the much-touted IPO.
Get a daily dose of Sports Sun news through our daily email, its complimentary and keeps you fully up to date with world and business news as well.
Publish news of your business, community or sports group, personnel appointments, major event and more by submitting a news release to Sports Sun.
Showers in the Vicinity in Seletar
Los Angeles - A petition to make Los Angeles Lakers legend Kobe Bryant, who died in a helicopter crash on ...
Hall of Fame DE Doleman dies at 58 after cancer battle
Hall of Fame defensive end Chris Doleman, who ranks fifth on the NFL's all-time sack list, died of cancer Tuesday ...
Grizzlies need win over Knicks to reach .500
The Memphis Grizzlies are on the verge of accomplishing something they haven't done in almost 13 months. All the Grizzlies ...
WATCH | Shaq, West among NBA icons grieving Kobe at empty arena
Los Angeles - Grief-stricken NBA legends from Jerry West and Shaquille O'Neal to Dwyane Wade and Charles Barkley were in ...
New Los Angeles Rams and and Los Angeles Chargers home 85% complete
INGLEWOOD, California - The much-heralded SoFi Stadium being built at a cost of $2.6 billion in Inglewood, California, is now ...
Bears sign CFL star CB Roberson
The Chicago Bears landed Canadian Football League star Tre Roberson, the cornerback confirmed Tuesday on Twitter. According to ESPN's Adam ...
AGA: Record 26M Americans will bet more than $6B on Super Bowl
A record 26 million Americans will place a bet on Super Bowl LIV, an increase of approximately three million compared ...
Gronk: Brady 'deserves' chance to explore free agency
Former New England Patriots tight end Rob Gronkowski told quarterback Tom Brady to explore his options before deciding where he ...
Patriots OL coach Scarnecchia retires again
New England Patriots offensive line coach Dante Scarnecchia has elected to retire once again. Scarnecchia, who turns 72 next month, ...
© Copyright 1999-2020 Sports Sun. All rights reserved.


text:
True Love in pictures
"True Love" will find You, not when You need it, not when You're looking and not always in places that society deems respectable or legal.
True Love has no colour, gender or age. It's bound by no law, it sees no limits and it has no label.
True Love has no pride. It can't be measured or balanced on a scale. It's freely given, has no price and You can not fight it or turn it away when it finds You.
True Love is a feeling, a voice that speaks to You from Your heart. You might not recognise the voice when You first hear it or understands the words spoken to You, but whether You listen or not, You'll find yourself following the voice of Your heart.
"True Love" is simple. It's takes no elaborate storyline or exotic screen shots to convey. There is no need for naked bodies or heated encounters. It's just a look, at word, a risk taken and a hand held.
Don't miss out on this short story of love in the wrong places, but still "True Love" no matter what.
"True Love" Episode 3 BBC One
If you would rather take the the student/teacher theme of your f/f romance in writing try "The Essay" by Fletcher DeLancey. This time the professor acts with a bit more restrain, and while we are on this theme you could try out "Jaeger's" by Dragonjuls. Once again restrain or perhaps patience is the operative word
And if you want a longer more elaborate storyline of finding love in the wrong places but still as "True" as it comes then don't miss out on "Kyss Mig" (trailer), it's among the best F/F movies - perhaps this link works .
"Kyss Mig"
Tags: Dragonjuls, Fletcher DeLancey, The f/f theme in the movies


text:
Another Music Lover's Blog
The Sitemaps
Greatest Live Concert Of All Time
admin March 24, 2019 Comments Off on Greatest Live Concert Of All Time
Aug 14, 2012. 20 most exciting live acts of all time – as voted by you. a touch of theatre to his live performances, from the wild costumes of the Ziggy Stardust.
Sep 20, 2013. 15, 1965, marked their biggest show at the time and a turning point for the band, which would retire from live performances a year later.
. electric front man Freddie Mercury, charged onto the stage of the 1985 Live Aid concert and performed the set often lauded as the greatest live gig of all time.
Oct 22, 2015. The 10 Most Memorable Performances in Live Music History. all over the world, people pay good money to see famous musicians perform their biggest hits. But it's only once in a great while that the circumstances of the.
Billy Joel, who famously sang about Allentown when he needed a city representative of the dying American dream, and whose breakthrough concert at Northampton. making him the sixth-best-selling male.
Chumani Ngojo & Nu Praize will be recording their second Live CD and DVD Recording Concert at the Artscape Opera House. Tickets are on sale for R100 each and R200 for VIP tickets.
All other photos by Milwaukee Journal Sentinel. performs at the Journal Sentinel's "Bands to Watch: Best of 2017" concert at the Radio Milwaukee studios on Jan. 5, 2018. (Photo: Michael McLoone /.
He and Letteri previously teamed up on all-time box office. at its Jan. 25 concert, too. Both bands have guitarists that look like Jimmy Page — and judging by videos — can reasonably duplicate Page.
Monday, Dec. 31, 2018. (Photo11: Andrew Nelles / Tennessean.com) He made arguably the most famous live album of all-time — 1975's inescapable "Frampton Comes Alive! — and rock guitar great Peter.
The record for biggest concert attendance is held by Vasco Rossi (left) for a ticketed concert and Rod Stewart (right) for a free concert. This page lists the highest-attended concerts of all time. The oldest 100,000-crowd concert. November 25, 2017, Ricky Martin · Zócalo · Mexico City, Ricky Martin Live at Zócalo in Mexico.
BIOGRAPHY. 21st Century Artists, Inc. has been presenting its ABBA tribute show throughout North America for well over a decade, known as ABBA The Music, ABBA The Concert and ABBA The Hits.
Babylon Chance The Rapper His inaugural hour-plus set took place at Trash Talk's Babylon Skate shop and sees the LA rapper spin old school soul as well. Earl Sweatshirt said he would fight Christopher Columbus given the. Songfacts category – Songs inspired by the Bible. Songfacts Newsletter. A monthly update on our latest interviews, stories and added songs Apr
"Every band should study Queen at Live Aid," Dave Grohl later enthused. "If you really feel like that barrier is gone, you become Freddie Mercury. I consider him the greatest frontman of all time."
Remember the time. to live performances of It's a Small World not once, but twice? Wveryone knows about Lady Gaga, Bruce Springsteen and Justin Timberlake. We've heard about Nipplegate ad nauseam.
The 25th Anniversary Celebration of Rudy In Concert brings this timeless underdog story to fans of all ages and celebrates one of the greatest sports films of all time.
Tokyo is a good place to make a live album – and Unleashed in the East is no different. Recorded on the Hell Bent For Leather tour, Judas Priest rock the far east.
Was Live Aid the greatest gig ever? Or the most cringeworthy? 18 February 2019, 21:20. Live Aid at Wembley Stadium, 13 July 1985. Picture: Dave Hogan/Hulton Archive/Getty Images
May 16, 2018. We asked you to pick the single greatest live band of all time — here are. Their performances have always felt larger than life — from the time.
Feb 10, 2019. Music recorded live in concert has been a significant part of pop music for over 40 years. While live songs in the pop top 40 are relatively rare,
The building's 4 million visitors have been wowed by its innovative design, award-winning food and beverage model, game-changing technology and best-in. and seven concerts. Atlanta United holds the.
The best live albums of all time capture the very essence of a band's energy in concert, The album was released alongside a film of the concert. The Who had gained a reputation as one of the greatest live rock bands in the world, and.
Nov 12, 2017. It seemed impossible to find and rank the 10 best live performances of. Live Aid was the greatest live concert ever staged and a day that no.
The 10 Greatest Rolling Stones Concerts of All-Time. Nat Berman 3. in several years. The set list included songs that hadn't been heard live before, as well.
In my opinion, Howard Epstein retired as one of the all-time greatest presenters of live music anywhere in the world. A: Excellence and affordability. Q: What are you most pleased about of as far as.
Such effects were so well integrated into the music that they didn't seem like effects at all, but just the way the music was supposed to be. Such gifts are ideal for music as complex and dramatically.
Guns N' Roses vocalist Axl Rose has called Queen the greatest band of all time and Freddie Mercury the best-ever frontman. The singer was speaking to Atlas Etihad ahead of the band's show in the UAE over the weekend, where they closed the Abu Dhabi Grand Prix. Asked who he thought deserved the accolade of the greatest frontman of all time, Rose responded: "For me, it's easy.
A list explaining the greatest artists placed in order from 10-1 (1 being the greatest).
Stone Temple Pilots Singer Vocalist In a interview with Broadcasting and Cable about their music-related projects, Showtime executive VP of content acquisition and business and legal affairs, Kent Sevener, revealed that they are working. We want it to be the three members of Stone Temple Pilots with another singer moving forward. While they have yet to name a new vocalist,
Live Music Bar Names The sports bar and music venue at 490 Water Street has. of South Florida football player, opened Ferg's Live with partner and then Buccaneers receiver Vincent Jackson in 2015. The Ferg's name was. Reservations. Black Rose Home. Toggle Navigation. 160 State Street, Boston, MA 02109 617-742-2286 · About · Menus · Live Music · Private
Johnny Mathis performs some of his greatest hits and personal favorites in "The Voice of Romance Concert Tour" at the Majestic Theatre. and ranks as the all-time #6 album artist in the history of.
a concert venue in Edmonton, Canada. She and her female friend shared a kiss during the song and were then quickly approached by an usher. "During the final encore, one of my [favorite] songs of all.
Nov 8, 2018. 6 of the Best Live Performances of All Time. to showcase an iconic performance by one of the greatest rappers of all time, Mr. Tupac Shakur.
The Last Live is one of the most incredible concerts I've ever seen. Not only was the band in top form for what was to be their final concert with original lead.
Catch Kyle performing his newest pieces "iSpy" and "Playinwitme" as well as some of his greatest hits. $32–$37. 2010 in Albany and since then has opened for pop punk bands All Time Low and 5.
Music festivals aren't always conducive to great performances. and "Hold My Life," timeless anthems that younger fans had only dreamed of hearing live. 47.
Concerts evolved to a whole other level this weekend as Marshmello played a live concert inside the game Fortnite. Many were quick to argue that this is not the very first time that something like.
Luckyman Concerts announced the lineup for the. 21 Jump Street than for his pioneering gangsta rap career, from his time in N.W.A. to one of the best solo debut records of all time, AmeriKKKa's.
Apr 22, 2016 · As the world mourns the death of music legend and Minnesota native Prince, here are some of the best live videos available on the internet.
Popdose presents the 100 greatest cover songs of all time, as voted by the Popdose staff.
Nice Try , Anybody in there right mine knows that Miles Davis's Kind of Blue is the # 1 jazz Album of all time.
A conductor of three early music ensembles, Savall has amassed over 250 recordings, has earned six Grammy nominations, and has toured concert halls across. one of the greatest storytellers of all.
When It Was Cool Best Ever Live Performance Moments. Spin magazine website also included this one in their greatest concert performances list too- here.
Your job with 75,000 is you've gotta work your ass off 'cause you've gotta hit all 75,000 — and you don't leave. And I'm telling you what, as an artist, if you don't make time for the album cuts in.
My playlist, "50 greatest. Run With" (live, 1995) Originally appearing on the "Where it All Begins," this song written by Dickey Betts and John Prestia in Sarasota featuring a powerful Bo.
Attempting to take all of these factors in to account, here is a list of 10 of the best pianists from past and present. Franz Liszt. All eye-witness accounts of Liszt's playing put him in the very first rank of classical pianists.
Organizers of tonight's Chris Cornell tribute concert announced last-minute lineup additions. "Chris Cornell was not only one of the most iconic singer songwriters of all time, he was a modern.
Jun 12, 2017. The Jimi Hendrix Experience (live at Golden Gate Park, June 25, Townshend later called it "the greatest audience we've ever played to.
Jul 12, 2018. There's something really special about visiting live shows. Sure, you can sit and enjoy your records or CDs or streaming services at home or.
Oz for Africa, a benefit held in Sydney, was to have been part of the Live Aid simulcast, but time zone differences proved impossible to reconcile.Footage from Oz for Africa, along with recorded performances from more than a half dozen cities around the world, was ultimately woven into the main satellite broadcast.
The 100 Greatest Albums of All Time. There have been plenty list available that rank the top 100 greatest albums of all time. What makes this list different is that it compiles and aggregates data from other best of lists, including both critics lists such as Rolling Stone's 500 Greatest Albums books and fan polls such as Q magazine's 100 Greatest Albums Ever poll.
This article suggests a list of the ten greatest rock bands of all time and provides a short biography of each group, as well as photos and videos.
Sep 26, 2018. 10 Greatest Live Musical Performances Ever! There's nothing like experiencing music in concert. A lot of your favorites made the list! Here are.
In "Amazing Grace," a 46-year-old gospel concert movie that feels. performances that became the celebrated live double album "Amazing Grace." It remains not only the best-selling gospel record of.
Who are the 25 greatest country artists of all time? That list might very well be subject to conjecture as the definition of country, but here are the acts that have made an immeasurable mark on.
← Ghetto Dance Club Tumblr
Twice Japan Greenhair Music Station →
The Category Section
Read our Writing
Kiandra Kiki Richardson Singer
Do A Little Dance On The Catwalk
Classical Music Humor Quotes
Blues Before Sunrise Radio Show
Good Modern Singing Songs
Michael Mcgilvary Country Singer
Musical Instrument Dealer Fargo
Phantom Of The Opera Dublin
Jack Johnson Rapper 2019
Rain Dance Pokemon Oras
Pale Waves Name Of Lead Singer
Live Music Rockland Maine
How To Chart Music Dance
Hymns That Sound Good With Guitar
Dubai Musical Instrument Shop
Tickets To Atilla Tbilisi Opera
Byu Library Classical Music
Kazaky Force Funk Lyrics
Blue Jeans Blues Zztop
38 Special The Musical Group
© 2018 optimum. All rights reserved | Optimum by NetTantra


Peal down several pieces from an onion, mince them and add into the shampoo. Then leave it there for about 15 days and start using it regularly. Sounds weird, right? I read about it in a beatify magazine and thought I could give it a try. Glad that I did. 3 weeks later I found my hair about 2 inches longer and looked healthier and shinier.
This is an old natural hair care remedy. Since it is good for hair health, I believe it will help hair growth. So I massage my sculpt with a few drops of grapeseed oil every day before bedtime.
My mom told me this little trick.It is said that hair grows faster if you braid it and sleep with the braid for the whole night. It seemed to work, only that I had to straighten it every morning after I woke up and unbraided it.
Who's the first one to tell this tip? No idea. But all my friends say they've heard about it, so do I. So I trimmed the ends a little bit every month, and felt happy to notice that it did grow faster for the first a few days after trimming.
Now my hair is about shoulder length, a much faster growth than I expected. But it doesn't mean that these remedies suit everybody. Talk to your doctor first before you try.


text:
Kanye West Needs to Get Over His Obsession With Amber Rose
Kara Brown
This afternoon, Kanye West and Wiz Khalifa went back and forth on Twitter in an argument about Kanye's upcoming album that quickly devolved into sexist jabs about a woman they both used to love.
The dudefight began over Wiz Khalifa taking umbrage with Kanye's decision to name his new album Waves for reasons that don't really matter. In a hilarious instance of Kanye West being an out-of-touch dad, he confused Wiz Khalifa's reference to KK—a strain of weed—for the initials of his wife, Kim Kardashian.
Instead of admitting his mistake and squashing at least part of the argument, Kanye spiraled into an ugly, now deleted rant trying to shame Wiz Khalifa for his relationship with Amber Rose, who he also dated for about two years.
It's worth noting that bringing up Wiz Khalifa's son was a particularly hypocritical, repugnant and unnecessary move in an already bad outburst.
In addition to being terrible and sexist, it brings up an enduring question: Why does Kanye feel the need to repeatedly bring up Amber Rose in the first place? The disagreement had quite literally nothing to do with her beyond the fact that both men had romantic relationships with her.
The quickness with which Kanye brought up Amber and continues to talk about her is confusing and highly suspect. Every single time he tries to disparage her, he does so by calling her a stripper or a whore. Early last year, Kanye lamented about having to take "30 showers" after dating Amber to be clean enough to be with his wife, Kim Kardashian. Meanwhile, he ran off and married a woman whose name we know in part because she had sex with Ray J on camera and then signed a lucrative distribution deal to sell said video.
It's interesting to contrast Kanye's treatment of Amber Rose with that of his late mother and Kim. To be even a casual Kanye West fan is to know how much the man loved his mother.
By his own accounts, Donda West's death in 2007 was the most difficult time of Kanye's life and a tragedy for which he blames himself. (Consider that Donda died from complications from a plastic surgery procedure and who Kanye is now married to and you can begin to see how incredibly warped his relationship with female beauty must be.)
Almost every public compliment Kanye gives Kim is about her physical beauty. He continues to espouse delusional ideas about the woman's grandeur and impact, which is somewhat forgiven by the fact that he's obviously in love. Still, it's easy to see that his idolization of women like his mother and Kim—somehow, to him, an untainted beauty where so many others are not—are an attempt to mask some deeper personal insecurities that come to light when he discusses Amber.
In the spirit of fairness, Amber does also talk about Kanye frequently—albeit without the name-calling. But she does so because she's often specifically asked about him. Certainly, she was first introduced to the public as Kanye's girlfriend, but that was six years ago. Since then, she's had another high-profile relationship, become a mother, and forged her own career. Her continued relation to him is due as much to some desire for attention as it is to sexism.
And even when Amber does discuss the relationship, it is almost always with respect for the fact that they "once loved each other." (Every woman has her limits, though, and Amber is not above a well-placed jab here and there.)
Kanye West's ego has always been one of his greatest creative strengths and his fatal flaw. He is a man who seems to believe he has the power to build not only great music, but also to mold women as he sees fit—lest we forget him treating Kim like a Barbie doll.
On "Blame Game," a song off of My Beautiful Dark Twisted Fantasy which Kanye was recording as his relationship with Amber unraveled, he sings from the perspective of the woman in question (assumed to be Amber): "You always said, 'Yeezy, I ain't your right girl/You'll probably find one of them I like art-type girls.'"
Perhaps Amber wasn't ever willing or able to completely shape herself into what Kanye wanted, which is perhaps precisely what he needs. Yes, she was a stripper, and one who continued to live a successful life without him. Writer Myles Brown smartly summed up Kanye's probable frustration: It's not so much that Kanye regrets losing Amber as he does the fact that she doesn't seem to need him in her life to thrive. I hope he's able to admit that distinction to himself soon.
Contact the author at kara.brown@jezebel.com .
Image via Pascal Le Segretain/Getty.
Open kinja-labs.com


text:
CVS opening additional COVID-19 drive-thru testing sites in Central Florida
Coronavirus Florida
ORLANDO, Fla. - CVS Health is adding 37 additional drive-thru coronavirus testing sites across the Sunshine State, including in Central Florida.
The new sites will open on Friday, May 22, adding to the 10 locations previously opened on May 15.
"As we move into a new phase of combatting the pandemic and as communities begin to safely open up their local economies, we need testing to be easily accessible," said Troyen Brennan, MD, MPH, Chief Medical Officer and Executive Vice President, CVS Health. "By further expanding the number of drive-thru test sites available across our retail network, more people can be tested closer to home in a familiar setting."
The new testing sites opening Friday will be located at:
5899 South Orange Blossom Trail, Orlando, FL 32839
8025 Lee Vista Boulevard, Orlando, FL 32829
839 North Orlando Avenue, Winter Park, FL 32789
5650 Red Bug Lake Road, Winter Springs, FL 32708
There are current testing sites open at:
2400 Enterprise Road, Orange City
221 South S.R. 434, Altamonte Springs
South Orange Blossom Trail, Orlando
The sites will use self-swab tests. CVS Health says they hope to open up to 1,000 locations across the country to help during the pandemic. The goal is to process up to 1.5 million tests per month.
| THE LATEST COVID-19 |
Patients must stay in their cars where they will be directed to the pharmacy drive-thru to be given a test kit. A team member will observe the test to make sure it is done properly.
Results can be expected in about 3 days.
Patients must register in advance at CVS.com to schedule an appointment.