text:
// If you make changes to this file, you should also make the corresponding change in ReplicaSet.

package replication

import (
	"fmt"
	"math/rand"
	"net/http/httptest"
	"testing"
	"time"

	"k8s.io/kubernetes/pkg/api"
	"k8s.io/kubernetes/pkg/api/testapi"
	"k8s.io/kubernetes/pkg/api/unversioned"
	"k8s.io/kubernetes/pkg/client/cache"
	clientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_2"
	"k8s.io/kubernetes/pkg/client/testing/core"
	"k8s.io/kubernetes/pkg/client/testing/fake"
	client "k8s.io/kubernetes/pkg/client/unversioned"
	"k8s.io/kubernetes/pkg/controller"
	"k8s.io/kubernetes/pkg/runtime"
	"k8s.io/kubernetes/pkg/securitycontext"
	"k8s.io/kubernetes/pkg/util"
	"k8s.io/kubernetes/pkg/util/sets"
	utiltesting "k8s.io/kubernetes/pkg/util/testing"
	"k8s.io/kubernetes/pkg/watch"
)

var alwaysReady = func() bool { return true }

func getKey(rc *api.ReplicationController, t *testing.T) string {
	if key, err := controller.KeyFunc(rc); err != nil {
		t.Errorf("Unexpected error getting key for rc %v: %v", rc.Name, err)
		return ""
	} else {
		return key
	}
}

func newReplicationController(replicas int) *api.ReplicationController {
	rc := &api.ReplicationController{
		TypeMeta: unversioned.TypeMeta{APIVersion: testapi.Default.GroupVersion().String()},
		ObjectMeta: api.ObjectMeta{
			UID:             util.NewUUID(),
			Name:            "foobar",
			Namespace:       api.NamespaceDefault,
			ResourceVersion: "18",
		},
		Spec: api.ReplicationControllerSpec{
			Replicas: replicas,
			Selector: map[string]string{"foo": "bar"},
			Template: &api.PodTemplateSpec{
				ObjectMeta: api.ObjectMeta{
					Labels: map[string]string{
						"name": "foo",
						"type": "production",
					},
				},
				Spec: api.PodSpec{
					Containers: []api.Container{
						{
							Image: "foo/bar",
							TerminationMessagePath: api.TerminationMessagePathDefault,
							ImagePullPolicy:        api.PullIfNotPresent,
							SecurityContext:        securitycontext.ValidSecurityContextWithContainerDefaults(),
						},
					},
					RestartPolicy: api.RestartPolicyAlways,
					DNSPolicy:     api.DNSDefault,
					NodeSelector: map[string]string{
						"baz": "blah",
					},
				},
			},
		},
	}
	return rc
}

// create count pods with the given phase for the given rc (same selectors and namespace), and add them to the store.
func newPodList(store cache.Store, count int, status api.PodPhase, rc *api.ReplicationController) *api.PodList {
	pods := []api.Pod{}
	for i := 0; i < count; i++ {
		newPod := api.Pod{
			ObjectMeta: api.ObjectMeta{
				Name:      fmt.Sprintf("pod%d", i),
				Labels:    rc.Spec.Selector,
				Namespace: rc.Namespace,
			},
			Status: api.PodStatus{Phase: status},
		}
		if store != nil {
			store.Add(&newPod)
		}
		pods = append(pods, newPod)
	}
	return &api.PodList{
		Items: pods,
	}
}

func validateSyncReplication(t *testing.T, fakePodControl *controller.FakePodControl, expectedCreates, expectedDeletes int) {
	if len(fakePodControl.Templates) != expectedCreates {
		t.Errorf("Unexpected number of creates.  Expected %d, saw %d\n", expectedCreates, len(fakePodControl.Templates))
	}
	if len(fakePodControl.DeletePodName) != expectedDeletes {
		t.Errorf("Unexpected number of deletes.  Expected %d, saw %d\n", expectedDeletes, len(fakePodControl.DeletePodName))
	}
}

func replicationControllerResourceName() string {
	return "replicationcontrollers"
}

type serverResponse struct {
	statusCode int
	obj        interface{}
}

func TestSyncReplicationControllerDoesNothing(t *testing.T) {
	c := clientset.NewForConfigOrDie(&client.Config{Host: "", ContentConfig: client.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}})
	fakePodControl := controller.FakePodControl{}
	manager := NewReplicationManager(c, controller.NoResyncPeriodFunc, BurstReplicas)
	manager.podStoreSynced = alwaysReady

	// 2 running pods, a controller with 2 replicas, sync is a no-op
	controllerSpec := newReplicationController(2)
	manager.rcStore.Store.Add(controllerSpec)
	newPodList(manager.podStore.Store, 2, api.PodRunning, controllerSpec)

	manager.podControl = &fakePodControl
	manager.syncReplicationController(getKey(controllerSpec, t))
	validateSyncReplication(t, &fakePodControl, 0, 0)
}

func TestSyncReplicationControllerDeletes(t *testing.T) {
	c := clientset.NewForConfigOrDie(&client.Config{Host: "", ContentConfig: client.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}})
	fakePodControl := controller.FakePodControl{}
	manager := NewReplicationManager(c, controller.NoResyncPeriodFunc, BurstReplicas)
	manager.podStoreSynced = alwaysReady
	manager.podControl = &fakePodControl

	// 2 running pods and a controller with 1 replica, one pod delete expected
	controllerSpec := newReplicationController(1)
	manager.rcStore.Store.Add(controllerSpec)
	newPodList(manager.podStore.Store, 2, api.PodRunning, controllerSpec)

	manager.syncReplicationController(getKey(controllerSpec, t))
	validateSyncReplication(t, &fakePodControl, 0, 1)
}

func TestDeleteFinalStateUnknown(t *testing.T) {
	c := clientset.NewForConfigOrDie(&client.Config{Host: "", ContentConfig: client.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}})
	fakePodControl := controller.FakePodControl{}
	manager := NewReplicationManager(c, controller.NoResyncPeriodFunc, BurstReplicas)
	manager.podStoreSynced = alwaysReady
	manager.podControl = &fakePodControl

	received := make(chan string)
	manager.syncHandler = func(key string) error {
		received <- key
		return nil
	}

	// The DeletedFinalStateUnknown object should cause the rc manager to insert
	// the controller matching the selectors of the deleted pod into the work queue.
	controllerSpec := newReplicationController(1)
	manager.rcStore.Store.Add(controllerSpec)
	pods := newPodList(nil, 1, api.PodRunning, controllerSpec)
	manager.deletePod(cache.DeletedFinalStateUnknown{Key: "foo", Obj: &pods.Items[0]})

	go manager.worker()

	expected := getKey(controllerSpec, t)
	select {
	case key := <-received:
		if key != expected {
			t.Errorf("Unexpected sync all for rc %v, expected %v", key, expected)
		}
	case <-time.After(util.ForeverTestTimeout):
		t.Errorf("Processing DeleteFinalStateUnknown took longer than expected")
	}
}

func TestSyncReplicationControllerCreates(t *testing.T) {
	c := clientset.NewForConfigOrDie(&client.Config{Host: "", ContentConfig: client.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}})
	manager := NewReplicationManager(c, controller.NoResyncPeriodFunc, BurstReplicas)
	manager.podStoreSynced = alwaysReady

	// A controller with 2 replicas and no pods in the store, 2 creates expected
	rc := newReplicationController(2)
	manager.rcStore.Store.Add(rc)

	fakePodControl := controller.FakePodControl{}
	manager.podControl = &fakePodControl
	manager.syncReplicationController(getKey(rc, t))
	validateSyncReplication(t, &fakePodControl, 2, 0)
}

func TestStatusUpdatesWithoutReplicasChange(t *testing.T) {
	// Setup a fake server to listen for requests, and run the rc manager in steady state
	fakeHandler := utiltesting.FakeHandler{
		StatusCode:   200,
		ResponseBody: "",
	}
	testServer := httptest.NewServer(&fakeHandler)
	// TODO: Uncomment when fix #19254
	// defer testServer.Close()
	c := clientset.NewForConfigOrDie(&client.Config{Host: testServer.URL, ContentConfig: client.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}})
	manager := NewReplicationManager(c, controller.NoResyncPeriodFunc, BurstReplicas)
	manager.podStoreSynced = alwaysReady

	// Steady state for the replication controller, no Status.Replicas updates expected
	activePods := 5
	rc := newReplicationController(activePods)
	manager.rcStore.Store.Add(rc)
	rc.Status = api.ReplicationControllerStatus{Replicas: activePods}
	newPodList(manager.podStore.Store, activePods, api.PodRunning, rc)

	fakePodControl := controller.FakePodControl{}
	manager.podControl = &fakePodControl
	manager.syncReplicationController(getKey(rc, t))

	validateSyncReplication(t, &fakePodControl, 0, 0)
	if fakeHandler.RequestReceived != nil {
		t.Errorf("Unexpected update when pods and rcs are in a steady state")
	}

	// This response body is just so we don't err out decoding the http response, all
	// we care about is the request body sent below.
	response := runtime.EncodeOrDie(testapi.Default.Codec(), &api.ReplicationController{})
	fakeHandler.ResponseBody = response

	rc.Generation = rc.Generation + 1
	manager.syncReplicationController(getKey(rc, t))

	rc.Status.ObservedGeneration = rc.Generation
	updatedRc := runtime.EncodeOrDie(testapi.Default.Codec(), rc)
	fakeHandler.ValidateRequest(t, testapi.Default.ResourcePath(replicationControllerResourceName(), rc.Namespace, rc.Name)+"/status", "PUT", &updatedRc)
}

func TestControllerUpdateReplicas(t *testing.T) {
	// This is a happy server just to record the PUT request we expect for status.Replicas
	fakeHandler := utiltesting.FakeHandler{
		StatusCode:   200,
		ResponseBody: "",
	}
	testServer := httptest.NewServer(&fakeHandler)
	// TODO: Uncomment when fix #19254
	// defer testServer.Close()
	c := clientset.NewForConfigOrDie(&client.Config{Host: testServer.URL, ContentConfig: client.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}})
	manager := NewReplicationManager(c, controller.NoResyncPeriodFunc, BurstReplicas)
	manager.podStoreSynced = alwaysReady

	// Insufficient number of pods in the system, and Status.Replicas is wrong;
	// Status.Replica should update to match number of pods in system, 1 new pod should be created.
	rc := newReplicationController(5)
	manager.rcStore.Store.Add(rc)
	rc.Status = api.ReplicationControllerStatus{Replicas: 2, ObservedGeneration: 0}
	rc.Generation = 1
	newPodList(manager.podStore.Store, 4, api.PodRunning, rc)

	// This response body is just so we don't err out decoding the http response
	response := runtime.EncodeOrDie(testapi.Default.Codec(), &api.ReplicationController{})
	fakeHandler.ResponseBody = response

	fakePodControl := controller.FakePodControl{}
	manager.podControl = &fakePodControl

	manager.syncReplicationController(getKey(rc, t))

	// 1. Status.Replicas should go up from 2->4 even though we created 5-4=1 pod.
	// 2. Every update to the status should include the Generation of the spec.
	rc.Status = api.ReplicationControllerStatus{Replicas: 4, ObservedGeneration: 1}

	decRc := runtime.EncodeOrDie(testapi.Default.Codec(), rc)
	fakeHandler.ValidateRequest(t, testapi.Default.ResourcePath(replicationControllerResourceName(), rc.Namespace, rc.Name)+"/status", "PUT", &decRc)
	validateSyncReplication(t, &fakePodControl, 1, 0)
}

func TestSyncReplicationControllerDormancy(t *testing.T) {
	// Setup a test server so we can lie about the current state of pods
	fakeHandler := utiltesting.FakeHandler{
		StatusCode:   200,
		ResponseBody: "{}",
	}
	testServer := httptest.NewServer(&fakeHandler)
	// TODO: Uncomment when fix #19254
	// defer testServer.Close()
	c := clientset.NewForConfigOrDie(&client.Config{Host: testServer.URL, ContentConfig: client.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}})
	fakePodControl := controller.FakePodControl{}
	manager := NewReplicationManager(c, controller.NoResyncPeriodFunc, BurstReplicas)
	manager.podStoreSynced = alwaysReady
	manager.podControl = &fakePodControl

	controllerSpec := newReplicationController(2)
	manager.rcStore.Store.Add(controllerSpec)
	newPodList(manager.podStore.Store, 1, api.PodRunning, controllerSpec)

	// Creates a replica and sets expectations
	controllerSpec.Status.Replicas = 1
	manager.syncReplicationController(getKey(controllerSpec, t))
	validateSyncReplication(t, &fakePodControl, 1, 0)

	// Expectations prevents replicas but not an update on status
	controllerSpec.Status.Replicas = 0
	fakePodControl.Clear()
	manager.syncReplicationController(getKey(controllerSpec, t))
	validateSyncReplication(t, &fakePodControl, 0, 0)

	// Get the key for the controller
	rcKey, err := controller.KeyFunc(controllerSpec)
	if err != nil {
		t.Errorf("Couldn't get key for object %+v: %v", controllerSpec, err)
	}

	// Lowering expectations should lead to a sync that creates a replica, however the
	// fakePodControl error will prevent this, leaving expectations at 0, 0
	manager.expectations.CreationObserved(rcKey)
	controllerSpec.Status.Replicas = 1
	fakePodControl.Clear()
	fakePodControl.Err = fmt.Errorf("Fake Error")

	manager.syncReplicationController(getKey(controllerSpec, t))
	validateSyncReplication(t, &fakePodControl, 0, 0)

	// This replica should not need a Lowering of expectations, since the previous create failed
	fakePodControl.Err = nil
	manager.syncReplicationController(getKey(controllerSpec, t))
	validateSyncReplication(t, &fakePodControl, 1, 0)

	// 1 PUT for the rc status during dormancy window.
	// Note that the pod creates go through pod control so they're not recorded.
	fakeHandler.ValidateRequestCount(t, 1)
}

func TestPodControllerLookup(t *testing.T) {
	manager := NewReplicationManager(clientset.NewForConfigOrDie(&client.Config{Host: "", ContentConfig: client.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}}), controller.NoResyncPeriodFunc, BurstReplicas)
	manager.podStoreSynced = alwaysReady
	testCases := []struct {
		inRCs     []*api.ReplicationController
		pod       *api.Pod
		outRCName string
	}{
		// pods without labels don't match any rcs
		{
			inRCs: []*api.ReplicationController{
				{ObjectMeta: api.ObjectMeta{Name: "basic"}}},
			pod:       &api.Pod{ObjectMeta: api.ObjectMeta{Name: "foo1", Namespace: api.NamespaceAll}},
			outRCName: "",
		},
		// Matching labels, not namespace
		{
			inRCs: []*api.ReplicationController{
				{
					ObjectMeta: api.ObjectMeta{Name: "foo"},
					Spec: api.ReplicationControllerSpec{
						Selector: map[string]string{"foo": "bar"},
					},
				},
			},
			pod: &api.Pod{
				ObjectMeta: api.ObjectMeta{
					Name: "foo2", Namespace: "ns", Labels: map[string]string{"foo": "bar"}}},
			outRCName: "",
		},
		// Matching ns and labels returns the key to the rc, not the rc name
		{
			inRCs: []*api.ReplicationController{
				{
					ObjectMeta: api.ObjectMeta{Name: "bar", Namespace: "ns"},
					Spec: api.ReplicationControllerSpec{
						Selector: map[string]string{"foo": "bar"},
					},
				},
			},
			pod: &api.Pod{
				ObjectMeta: api.ObjectMeta{
					Name: "foo3", Namespace: "ns", Labels: map[string]string{"foo": "bar"}}},
			outRCName: "bar",
		},
	}
	for _, c := range testCases {
		for _, r := range c.inRCs {
			manager.rcStore.Add(r)
		}
		if rc := manager.getPodController(c.pod); rc != nil {
			if c.outRCName != rc.Name {
				t.Errorf("Got controller %+v expected %+v", rc.Name, c.outRCName)
			}
		} else if c.outRCName != "" {
			t.Errorf("Expected a controller %v pod %v, found none", c.outRCName, c.pod.Name)
		}
	}
}

func TestWatchControllers(t *testing.T) {
	fakeWatch := watch.NewFake()
	c := &fake.Clientset{}
	c.AddWatchReactor("*", core.DefaultWatchReactor(fakeWatch, nil))
	manager := NewReplicationManager(c, controller.NoResyncPeriodFunc, BurstReplicas)
	manager.podStoreSynced = alwaysReady

	var testControllerSpec api.ReplicationController
	received := make(chan string)

	// The update sent through the fakeWatcher should make its way into the workqueue,
	// and eventually into the syncHandler. The handler validates the received controller
	// and closes the received channel to indicate that the test can finish.
	manager.syncHandler = func(key string) error {

		obj, exists, err := manager.rcStore.Store.GetByKey(key)
		if !exists || err != nil {
			t.Errorf("Expected to find controller under key %v", key)
		}
		controllerSpec := *obj.(*api.ReplicationController)
		if !api.Semantic.DeepDerivative(controllerSpec, testControllerSpec) {
			t.Errorf("Expected %#v, but got %#v", testControllerSpec, controllerSpec)
		}
		close(received)
		return nil
	}
	// Start only the rc watcher and the workqueue, send a watch event,
	// and make sure it hits the sync method.
	stopCh := make(chan struct{})
	defer close(stopCh)
	go manager.rcController.Run(stopCh)
	go util.Until(manager.worker, 10*time.Millisecond, stopCh)

	testControllerSpec.Name = "foo"
	fakeWatch.Add(&testControllerSpec)

	select {
	case <-received:
	case <-time.After(util.ForeverTestTimeout):
		t.Errorf("Expected 1 call but got 0")
	}
}

func TestWatchPods(t *testing.T) {
	fakeWatch := watch.NewFake()
	c := &fake.Clientset{}
	c.AddWatchReactor("*", core.DefaultWatchReactor(fakeWatch, nil))
	manager := NewReplicationManager(c, controller.NoResyncPeriodFunc, BurstReplicas)
	manager.podStoreSynced = alwaysReady

	// Put one rc and one pod into the controller's stores
	testControllerSpec := newReplicationController(1)
	manager.rcStore.Store.Add(testControllerSpec)
	received := make(chan string)
	// The pod update sent through the fakeWatcher should figure out the managing rc and
	// send it into the syncHandler.
	manager.syncHandler = func(key string) error {

		obj, exists, err := manager.rcStore.Store.GetByKey(key)
		if !exists || err != nil {
			t.Errorf("Expected to find controller under key %v", key)
		}
		controllerSpec := obj.(*api.ReplicationController)
		if !api.Semantic.DeepDerivative(controllerSpec, testControllerSpec) {
			t.Errorf("\nExpected %#v,\nbut got %#v", testControllerSpec, controllerSpec)
		}
		close(received)
		return nil
	}
	// Start only the pod watcher and the workqueue, send a watch event,
	// and make sure it hits the sync method for the right rc.
	stopCh := make(chan struct{})
	defer close(stopCh)
	go manager.podController.Run(stopCh)
	go util.Until(manager.worker, 10*time.Millisecond, stopCh)

	pods := newPodList(nil, 1, api.PodRunning, testControllerSpec)
	testPod := pods.Items[0]
	testPod.Status.Phase = api.PodFailed
	fakeWatch.Add(&testPod)

	select {
	case <-received:
	case <-time.After(util.ForeverTestTimeout):
		t.Errorf("Expected 1 call but got 0")
	}
}

func TestUpdatePods(t *testing.T) {
	manager := NewReplicationManager(fake.NewSimpleClientset(), controller.NoResyncPeriodFunc, BurstReplicas)
	manager.podStoreSynced = alwaysReady

	received := make(chan string)

	manager.syncHandler = func(key string) error {
		obj, exists, err := manager.rcStore.Store.GetByKey(key)
		if !exists || err != nil {
			t.Errorf("Expected to find controller under key %v", key)
		}
		received <- obj.(*api.ReplicationController).Name
		return nil
	}

	stopCh := make(chan struct{})
	defer close(stopCh)
	go util.Until(manager.worker, 10*time.Millisecond, stopCh)

	// Put 2 rcs and one pod into the controller's stores
	testControllerSpec1 := newReplicationController(1)
	manager.rcStore.Store.Add(testControllerSpec1)
	testControllerSpec2 := *testControllerSpec1
	testControllerSpec2.Spec.Selector = map[string]string{"bar": "foo"}
	testControllerSpec2.Name = "barfoo"
	manager.rcStore.Store.Add(&testControllerSpec2)

	// Put one pod in the podStore
	pod1 := newPodList(manager.podStore.Store, 1, api.PodRunning, testControllerSpec1).Items[0]
	pod2 := pod1
	pod2.Labels = testControllerSpec2.Spec.Selector

	// Send an update of the same pod with modified labels, and confirm we get a sync request for
	// both controllers
	manager.updatePod(&pod1, &pod2)

	expected := sets.NewString(testControllerSpec1.Name, testControllerSpec2.Name)
	for _, name := range expected.List() {
		t.Logf("Expecting update for %+v", name)
		select {
		case got := <-received:
			if !expected.Has(got) {
				t.Errorf("Expected keys %#v got %v", expected, got)
			}
		case <-time.After(util.ForeverTestTimeout):
			t.Errorf("Expected update notifications for controllers within 100ms each")
		}
	}
}

func TestControllerUpdateRequeue(t *testing.T) {
	// This server should force a requeue of the controller because it fails to update status.Replicas.
	fakeHandler := utiltesting.FakeHandler{
		StatusCode:   500,
		ResponseBody: "",
	}
	testServer := httptest.NewServer(&fakeHandler)
	// TODO: Uncomment when fix #19254
	// defer testServer.Close()

	c := clientset.NewForConfigOrDie(&client.Config{Host: testServer.URL, ContentConfig: client.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}})
	manager := NewReplicationManager(c, controller.NoResyncPeriodFunc, BurstReplicas)
	manager.podStoreSynced = alwaysReady

	rc := newReplicationController(1)
	manager.rcStore.Store.Add(rc)
	rc.Status = api.ReplicationControllerStatus{Replicas: 2}
	newPodList(manager.podStore.Store, 1, api.PodRunning, rc)

	fakePodControl := controller.FakePodControl{}
	manager.podControl = &fakePodControl

	manager.syncReplicationController(getKey(rc, t))

	ch := make(chan interface{})
	go func() {
		item, _ := manager.queue.Get()
		ch <- item
	}()
	select {
	case key := <-ch:
		expectedKey := getKey(rc, t)
		if key != expectedKey {
			t.Errorf("Expected requeue of controller with key %s got %s", expectedKey, key)
		}
	case <-time.After(util.ForeverTestTimeout):
		manager.queue.ShutDown()
		t.Errorf("Expected to find an rc in the queue, found none.")
	}
	// 1 Update and 1 GET, both of which fail
	fakeHandler.ValidateRequestCount(t, 2)
}

func TestControllerUpdateStatusWithFailure(t *testing.T) {
	rc := newReplicationController(1)
	c := &fake.Clientset{}
	c.AddReactor("get", "replicationcontrollers", func(action core.Action) (bool, runtime.Object, error) {
		return true, rc, nil
	})
	c.AddReactor("*", "*", func(action core.Action) (bool, runtime.Object, error) {
		return true, &api.ReplicationController{}, fmt.Errorf("Fake error")
	})
	fakeRCClient := c.Legacy().ReplicationControllers("default")
	numReplicas := 10
	updateReplicaCount(fakeRCClient, *rc, numReplicas)
	updates, gets := 0, 0
	for _, a := range c.Actions() {
		if a.GetResource() != "replicationcontrollers" {
			t.Errorf("Unexpected action %+v", a)
			continue
		}

		switch action := a.(type) {
		case core.GetAction:
			gets++
			// Make sure the get is for the right rc even though the update failed.
			if action.GetName() != rc.Name {
				t.Errorf("Expected get for rc %v, got %+v instead", rc.Name, action.GetName())
			}
		case core.UpdateAction:
			updates++
			// Confirm that the update has the right status.Replicas even though the Get
			// returned an rc with replicas=1.
			if c, ok := action.GetObject().(*api.ReplicationController); !ok {
				t.Errorf("Expected an rc as the argument to update, got %T", c)
			} else if c.Status.Replicas != numReplicas {
				t.Errorf("Expected update for rc to contain replicas %v, got %v instead",
					numReplicas, c.Status.Replicas)
			}
		default:
			t.Errorf("Unexpected action %+v", a)
			break
		}
	}
	if gets != 1 || updates != 2 {
		t.Errorf("Expected 1 get and 2 updates, got %d gets %d updates", gets, updates)
	}
}

func doTestControllerBurstReplicas(t *testing.T, burstReplicas, numReplicas int) {
	c := clientset.NewForConfigOrDie(&client.Config{Host: "", ContentConfig: client.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}})
	fakePodControl := controller.FakePodControl{}
	manager := NewReplicationManager(c, controller.NoResyncPeriodFunc, burstReplicas)
	manager.podStoreSynced = alwaysReady
	manager.podControl = &fakePodControl

	controllerSpec := newReplicationController(numReplicas)
	manager.rcStore.Store.Add(controllerSpec)

	expectedPods := 0
	pods := newPodList(nil, numReplicas, api.PodPending, controllerSpec)

	rcKey, err := controller.KeyFunc(controllerSpec)
	if err != nil {
		t.Errorf("Couldn't get key for object %+v: %v", controllerSpec, err)
	}

	// Size up the controller, then size it down, and confirm the expected create/delete pattern
	for _, replicas := range []int{numReplicas, 0} {

		controllerSpec.Spec.Replicas = replicas
		manager.rcStore.Store.Add(controllerSpec)

		for i := 0; i < numReplicas; i += burstReplicas {
			manager.syncReplicationController(getKey(controllerSpec, t))

			// The store accrues active pods. It's also used by the rc to determine how many
			// replicas to create.
			activePods := len(manager.podStore.Store.List())
			if replicas != 0 {
				// This is the number of pods currently "in flight". They were created by the rc manager above,
				// which then puts the rc to sleep till all of them have been observed.
				expectedPods = replicas - activePods
				if expectedPods > burstReplicas {
					expectedPods = burstReplicas
				}
				// This validates the rc manager sync actually created pods
				validateSyncReplication(t, &fakePodControl, expectedPods, 0)

				// This simulates the watch events for all but 1 of the expected pods.
				// None of these should wake the controller because it has expectations==BurstReplicas.
				for i := 0; i < expectedPods-1; i++ {
					manager.podStore.Store.Add(&pods.Items[i])
					manager.addPod(&pods.Items[i])
				}

				podExp, exists, err := manager.expectations.GetExpectations(rcKey)
				if !exists || err != nil {
					t.Fatalf("Did not find expectations for rc.")
				}
				if add, _ := podExp.GetExpectations(); add != 1 {
					t.Fatalf("Expectations are wrong %v", podExp)
				}
			} else {
				expectedPods = (replicas - activePods) * -1
				if expectedPods > burstReplicas {
					expectedPods = burstReplicas
				}
				validateSyncReplication(t, &fakePodControl, 0, expectedPods)
				for i := 0; i < expectedPods-1; i++ {
					manager.podStore.Store.Delete(&pods.Items[i])
					manager.deletePod(&pods.Items[i])
				}
				podExp, exists, err := manager.expectations.GetExpectations(rcKey)
				if !exists || err != nil {
					t.Fatalf("Did not find expectations for rc.")
				}
				if _, del := podExp.GetExpectations(); del != 1 {
					t.Fatalf("Expectations are wrong %v", podExp)
				}
			}

			// Check that the rc didn't take any action for all the above pods
			fakePodControl.Clear()
			manager.syncReplicationController(getKey(controllerSpec, t))
			validateSyncReplication(t, &fakePodControl, 0, 0)

			// Create/Delete the last pod
			// The last add pod will decrease the expectation of the rc to 0,
			// which will cause it to create/delete the remaining replicas up to burstReplicas.
			if replicas != 0 {
				manager.podStore.Store.Add(&pods.Items[expectedPods-1])
				manager.addPod(&pods.Items[expectedPods-1])
			} else {
				manager.podStore.Store.Delete(&pods.Items[expectedPods-1])
				manager.deletePod(&pods.Items[expectedPods-1])
			}
			pods.Items = pods.Items[expectedPods:]
		}

		// Confirm that we've created the right number of replicas
		activePods := len(manager.podStore.Store.List())
		if activePods != controllerSpec.Spec.Replicas {
			t.Fatalf("Unexpected number of active pods, expected %d, got %d", controllerSpec.Spec.Replicas, activePods)
		}
		// Replenish the pod list, since we cut it down sizing up
		pods = newPodList(nil, replicas, api.PodRunning, controllerSpec)
	}
}

func TestControllerBurstReplicas(t *testing.T) {
	doTestControllerBurstReplicas(t, 5, 30)
	doTestControllerBurstReplicas(t, 5, 12)
	doTestControllerBurstReplicas(t, 3, 2)
}

type FakeRCExpectations struct {
	*controller.ControllerExpectations
	satisfied    bool
	expSatisfied func()
}

func (fe FakeRCExpectations) SatisfiedExpectations(controllerKey string) bool {
	fe.expSatisfied()
	return fe.satisfied
}

// TestRCSyncExpectations tests that a pod cannot sneak in between counting active pods
// and checking expectations.
func TestRCSyncExpectations(t *testing.T) {
	c := clientset.NewForConfigOrDie(&client.Config{Host: "", ContentConfig: client.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}})
	fakePodControl := controller.FakePodControl{}
	manager := NewReplicationManager(c, controller.NoResyncPeriodFunc, 2)
	manager.podStoreSynced = alwaysReady
	manager.podControl = &fakePodControl

	controllerSpec := newReplicationController(2)
	manager.rcStore.Store.Add(controllerSpec)
	pods := newPodList(nil, 2, api.PodPending, controllerSpec)
	manager.podStore.Store.Add(&pods.Items[0])
	postExpectationsPod := pods.Items[1]

	manager.expectations = FakeRCExpectations{
		controller.NewControllerExpectations(), true, func() {
			// If we check active pods before checking expectataions, the rc
			// will create a new replica because it doesn't see this pod, but
			// has fulfilled its expectations.
			manager.podStore.Store.Add(&postExpectationsPod)
		},
	}
	manager.syncReplicationController(getKey(controllerSpec, t))
	validateSyncReplication(t, &fakePodControl, 0, 0)
}

func TestDeleteControllerAndExpectations(t *testing.T) {
	c := clientset.NewForConfigOrDie(&client.Config{Host: "", ContentConfig: client.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}})
	manager := NewReplicationManager(c, controller.NoResyncPeriodFunc, 10)
	manager.podStoreSynced = alwaysReady

	rc := newReplicationController(1)
	manager.rcStore.Store.Add(rc)

	fakePodControl := controller.FakePodControl{}
	manager.podControl = &fakePodControl

	// This should set expectations for the rc
	manager.syncReplicationController(getKey(rc, t))
	validateSyncReplication(t, &fakePodControl, 1, 0)
	fakePodControl.Clear()

	// Get the RC key
	rcKey, err := controller.KeyFunc(rc)
	if err != nil {
		t.Errorf("Couldn't get key for object %+v: %v", rc, err)
	}

	// This is to simulate a concurrent addPod, that has a handle on the expectations
	// as the controller deletes it.
	podExp, exists, err := manager.expectations.GetExpectations(rcKey)
	if !exists || err != nil {
		t.Errorf("No expectations found for rc")
	}
	manager.rcStore.Delete(rc)
	manager.syncReplicationController(getKey(rc, t))

	if _, exists, err = manager.expectations.GetExpectations(rcKey); exists {
		t.Errorf("Found expectaions, expected none since the rc has been deleted.")
	}

	// This should have no effect, since we've deleted the rc.
	podExp.Seen(1, 0)
	manager.podStore.Store.Replace(make([]interface{}, 0), "0")
	manager.syncReplicationController(getKey(rc, t))
	validateSyncReplication(t, &fakePodControl, 0, 0)
}

func TestRCManagerNotReady(t *testing.T) {
	c := clientset.NewForConfigOrDie(&client.Config{Host: "", ContentConfig: client.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}})
	fakePodControl := controller.FakePodControl{}
	manager := NewReplicationManager(c, controller.NoResyncPeriodFunc, 2)
	manager.podControl = &fakePodControl
	manager.podStoreSynced = func() bool { return false }

	// Simulates the rc reflector running before the pod reflector. We don't
	// want to end up creating replicas in this case until the pod reflector
	// has synced, so the rc manager should just requeue the rc.
	controllerSpec := newReplicationController(1)
	manager.rcStore.Store.Add(controllerSpec)

	rcKey := getKey(controllerSpec, t)
	manager.syncReplicationController(rcKey)
	validateSyncReplication(t, &fakePodControl, 0, 0)
	queueRC, _ := manager.queue.Get()
	if queueRC != rcKey {
		t.Fatalf("Expected to find key %v in queue, found %v", rcKey, queueRC)
	}

	manager.podStoreSynced = alwaysReady
	manager.syncReplicationController(rcKey)
	validateSyncReplication(t, &fakePodControl, 1, 0)
}

// shuffle returns a new shuffled list of container controllers.
func shuffle(controllers []*api.ReplicationController) []*api.ReplicationController {
	numControllers := len(controllers)
	randIndexes := rand.Perm(numControllers)
	shuffled := make([]*api.ReplicationController, numControllers)
	for i := 0; i < numControllers; i++ {
		shuffled[i] = controllers[randIndexes[i]]
	}
	return shuffled
}

func TestOverlappingRCs(t *testing.T) {
	c := clientset.NewForConfigOrDie(&client.Config{Host: "", ContentConfig: client.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}})

	for i := 0; i < 5; i++ {
		manager := NewReplicationManager(c, controller.NoResyncPeriodFunc, 10)
		manager.podStoreSynced = alwaysReady

		// Create 10 rcs, shuffled them randomly and insert them into the rc manager's store
		var controllers []*api.ReplicationController
		for j := 1; j < 10; j++ {
			controllerSpec := newReplicationController(1)
			controllerSpec.CreationTimestamp = unversioned.Date(2014, time.December, j, 0, 0, 0, 0, time.Local)
			controllerSpec.Name = string(util.NewUUID())
			controllers = append(controllers, controllerSpec)
		}
		shuffledControllers := shuffle(controllers)
		for j := range shuffledControllers {
			manager.rcStore.Store.Add(shuffledControllers[j])
		}
		// Add a pod and make sure only the oldest rc is synced
		pods := newPodList(nil, 1, api.PodPending, controllers[0])
		rcKey := getKey(controllers[0], t)

		manager.addPod(&pods.Items[0])
		queueRC, _ := manager.queue.Get()
		if queueRC != rcKey {
			t.Fatalf("Expected to find key %v in queue, found %v", rcKey, queueRC)
		}
	}
}

func TestRCManagerInit(t *testing.T) {
	// Insert a stable rc into the replication manager's store and make sure
	// it syncs pods with the apiserver before making any decisions.
	rc := newReplicationController(2)
	response := runtime.EncodeOrDie(testapi.Default.Codec(), newPodList(nil, 2, api.PodRunning, rc))
	fakeHandler := utiltesting.FakeHandler{
		StatusCode:   200,
		ResponseBody: response,
	}
	testServer := httptest.NewServer(&fakeHandler)
	// TODO: Uncomment when fix #19254
	// defer testServer.Close()

	c := clientset.NewForConfigOrDie(&client.Config{Host: testServer.URL, ContentConfig: client.ContentConfig{GroupVersion: testapi.Default.GroupVersion()}})
	manager := NewReplicationManager(c, controller.NoResyncPeriodFunc, BurstReplicas)
	manager.rcStore.Store.Add(rc)
	manager.podStoreSynced = alwaysReady
	controller.SyncAllPodsWithStore(manager.kubeClient, manager.podStore.Store)
	fakePodControl := &controller.FakePodControl{}
	manager.podControl = fakePodControl
	manager.syncReplicationController(getKey(rc, t))
	validateSyncReplication(t, fakePodControl, 0, 0)
}


text:
Articles Tagged With: values
Her Campus at U Mass Amherst My Parents Are Polar Opposites; Here's How I Forged My Own Beliefs in the Crossfire
My parents are like fire and ice. And not in the classic television trope, dynamic duo type of way. They're more like that weird period in October when you...
Her Campus at Bowie State Thee Guide: Differences in Dating?
"How do I deal with the differences between me and my partner? I ( male, 22) am casually dating a woman (female, 21) and we have a good amount...
Her Campus at UCLA Christian Dating: How To Keep Faith At the Forefront of your relationship
Remember to save room for the Holy Ghost during dances and hugs!
Her Campus at SLU The Trouble with Being a Rule-Follower
I follow many rules in my life. There are the obvious ones, like the law, and the expected ones, like the specifications my professors give for how to complete...
Her Campus at UNH Communication is Key
Throughout my childhood and into my young adulthood, something I have always valued is communication. In my family, it is something that has always been a core value.
Her Campus at IUP I Grew Up In The Woods
It seems weird saying that but yeah, the woods. I don't mean like in a tent or in the jungle either! I mean that I live in a town...
Her Campus at Columbia Barnard The Effect of Growing Up in an Immigrant Home on Education: An Interview with 3 College Students
Growing up with immigrant parents impacts how we see education.
Her Campus at Hawaii The Time I Stole Fifty Dollars From My Family's Business
How I stole money from my family's own business and faced the consequences.
Her Campus at UCLA How To Cope With Being Ghosted By A Friend
Yes, it's possible and normal to be "ghosted" by a friend.
Her20s Why You Should Take the Time to Determine Your Personal Values, & How to Do So
Live a healthier, happier, and more intentional life.

redpajama_set_name: RedPajamaCommonCrawl


text:
Facebook admits it hosts misleading content and will fight sensationalism
The founder of Facebook, Mark Zuckerberg, has admitted that the social network hosts "misinformation and even misleading content" and has…
Prepare to fight the sins of humanity in I Am Jesus Christ
Video games are the perfect way to experience unique stories that cannot be found in other media. From soldiers in…
Virtual assistant stopped a domestic fight by calling the Police
As the couple argued, the electronic device activated and he called 911 in New Mexico, United States. When a man…
Five ways to fight smartphone addiction
Although the use of the smartphone makes our lives easier, the excessive use of these devices can also be harmful…
Plague Inc. the Cure: the goal is to fight the global pandemic
Announced last March, Ndemic Creations just launched Plague Inc. The Cure, the biggest update to date for Plague Inc. in…
Fight to the death between mega robots: this will be the sports betting of the future
Manufacturers dream of filling stadiums to see machines being destroyed as if it were a movie, video game or the…
Twitter will toughen its rules to fight sexual harassment
The new rules will begin to apply in the coming weeks, Twitter said in a statement. Twitter announced tougher rules…
An online game, the way to fight fake news
The game is part of an initiative that seeks to educate people against so-called 'fake news'. A group of researchers…
Apple, IPHONE
Apple launches new iPhone Reds in support of the fight against AIDS
This Saturday, December 1, the World Day of the fight against AIDS is commemorated and as Apple has done previously,…
Apple joins the fight against AIDS with the red iPhone
The phone will be available in all 23 iShop stores nationwide. Due to the fight against HIV in April, Apple…
Digital platforms to fight corruption in Colombia
The latest Transparency International report rates Colombia with 37 points out of 100 in transparency, ranking 84th out of 180…
PS5 fans organize to fight the resellers
The Playstation 5 debuted a couple of weeks ago in India, and similar to what happened in other countries, resellers…


text:
Tetanus, Diphtheria, Pertussis
All you need to know about Tetanus, Diphteria and Pertussis:
What is Tetanus?
Tetanus is an illness that can occur after an injury with a contaminated object. The bacteria that causes tetanus is often found in soil, and can get into the body through a break in the skin such a wound, burn, scratch or bite. Tetanus is common throughout the world, and is most often encountered in children or those who do manual labour, as well as unvaccinated individuals.
What are the Symptoms of Tetanus?
This disease is often called "lockjaw" as is affects the muscle systems, making jaw muscles tighten so that affected individuals cannot open their mouths. Other symptoms of tetanus include headaches, painful muscle stiffness, trouble swallowing, seizures, fever and high blood pressure. This disease is quite dangerous as it can cause trouble breathing and in severe cases paralysis. Even with intensive, modern care, 10-20% of people with tetanus will die from symptoms. For this reason, vaccination is the most important means of prevention.
Where am I Most at Risk?
Tetanus occurs throughout the world, and you are at risk anywhere. Travel does not generally increase the risk unless you are doing humanitarian aid work, construction or demolition of buildings, or working outdoors. Anyone not vaccinated against tetanus is at risk if injured by a contaminated object, using drugs, or having a medical procedure in an unhygienic setting.
What Can I do to Prevent Tetanus?
As with any preventable diseases, it's recommended that you receive a tetanus vaccine if you have not already had one, before you travel. The tetanus vaccine is most often given in conjunction with the vaccine for Diphtheria and Pertussis, or the Tdap (adult) or DTaP (child) vaccines. This vaccine is covered by OHIP and routinely given every 10 years. If you are traveling or engaging in work where the risk of tetanus is high, a booster shot is recommended. In addition, always take precautions to avoid injuries while working or travelling, as you are always at risk of contraction from a contaminated object.
What is Diphtheria?
Diphtheria is an illness spread through coughing and sneezing, or through contact with skin sores of an infected person. Diphtheria is a serious illness, and is deadly in 5-10% of cases where breathing problems occur. For this reason, it is important that you are vaccinated against Diphtheria no matter where you live. The disease has the highest occurrence rate in developing countries, where the risk of contraction is highest due to lack of vaccinations.
What are the Symptoms of Diphtheria?
Symptoms of this illness include fever, sore throat and a thick coating of the nose and throat. In certain cases, neck swelling and skin sores may also occur. In the most severe instances, swelling of the heart and nerves, as well as trouble breathing can occur. About 5-10% of cases where trouble breathing manifests result in death, despite treatment.
This disease occurs worldwide, but is most common in developing countries with low rates of vaccination. Portions of Africa, South and Central America, Asia and Eastern Europe have the highest rates of Diphtheria, while industrialized countries such as Canada have low rates owing to the availability of vaccination.
What Can I do to Prevent Diphtheria?
The Diphtheria vaccine is the most effective means of preventing contraction of this disease. The vaccine against Diphtheria is available in combination with other vaccines against tetanus and pertussis, and are commonly given in the form of Tdap or Td for adults, and DTaP for children. Boosters should be received every ten years or following exposure to any of the diseases. While travelling, it is important to also take precautions against the spreading of Diphtheria by maintaining good standards of hygiene, washing hands, covering your mouth and nose while sneezing or coughing and avoiding close contact with people who are ill.
What is Pertussis?
Pertussis is also known as 'whooping cough' and is a contagious disease spread by coughing and sneezing. This disease is seen in all countries, but has the highest rates in developing countries where immunization is not common.
What are the Symptoms of Pertussis?
Early symptoms of Pertussis are similar to a cold, and include fever, running nose, sneezing, low fevers, mild cough and pauses in breath in babies and young children. Later on fits of cough will manifest, followed by a high pitched "whoop" and exhaustion. This disease is most serious in babies, and has a 1% mortality rate in those under a year old.
While Pertussis is seen in all countries, it's more prevalent in countries with lower vaccination rates such as developing countries. Most at risk are infants, immunocompromised people, as well as those who have not had a follow up vaccination. When travelling with babies and unvaccinated individuals it's necessary to avoid areas of high population as well as sick people.
What Can I do to Prevent Pertussis?
If you are not already vaccinated, or have been vaccinated as a child, we recommend a dose of the Tdap vaccine to ensure you are immune. The Pertussis vaccine is commonly given in conjunction with Tetanus and Diphtheria, and is called the DTaP vaccine. This vaccine is routinely given every 10 years during your physical exam at your doctor's office and it is covered by OHIP.
Centre for Disease Control and Prevention (2017). Tetanus, Pertussis, Diphtheria information. Retrieved from:
https://wwwnc.cdc.gov/travel/diseases/tetanus
https://wwwnc.cdc.gov/travel/diseases/pertussis
https://wwwnc.cdc.gov/travel/diseases/diphtheria
Schedule Your In-Clinic Consultation in 3 Easy Steps
Book In-Clinic Consultation online and get up to $120 off, if booked online
Choose your time Online
Get the Email Confirmation
See doctor Today


Deepings Swimming Club's top swimmers bagged 27 medals at the Nova Centurion Level 2 Open Meet in Nottingham, while its younger swimmers finished an excellent third in the Junior Fenland League B Final in Whittlesey over a busy weekend of competition.
Collecting four medals apiece were Lexi Cooper, Holly Leggott and Alex Sadler. Sixteen-year-old Lexi started the meet in fine form, winning silver in the 400m freestyle. She then added bronze in the 200m IM. Lexi finished the meet doubling up in the 200m breaststroke, winning silver, before taking bronze in the 50m breaststroke.
Holly showed her strength in the backstroke, winning medals in all three distances. She took silver in the 50m and 100m, before claiming bronze in the 200m Holly also won silver in the 50m freestyle to cap an outstanding weekend of racing.
In the 200m butterfly, Alex won gold with a five second PB to set a new club record of 2.47.57. He set his second club record in the 50m backstroke (35.86), winning bronze, and narrowly missed out on a hat-trick of records in the 200m freestyle, where he took silver. Alex won his second bronze in the 50m freestyle.
Sixteen-year-old Tom Adams won two golds as part of a three-medal haul – all in difference strokes, showing his versatility as a swimmer. Tom headed the field in the 50m breaststroke and 200m butterfly and collected bronze in the 50m freestyle.
Completing the gold medal winning performances was Tiffany Wong, who came first in the 50m breaststroke. Tiffany also won silver in the 50m freestyle and bronze in the 50m butterfly where she just missed the club record.
Zack's performances over the weekend were particularly impressive. The thirteen-year-old set new personal bests in all eight of his races, delighting his coaches with some outstanding swimming.


text:
NewsLocal NewsInvestigations
Spike in Florida homeowners falling behind on mortgage payments
Homeowners fear losing homes, but lenders are forgiving, so far
Thousands of people who have recently lost their jobs now fear they'll lose their homes.
By: Dave Bohman
Posted at 7:44 AM, Aug 12, 2020
DELRAY BEACH, Fla. — Thousands of Floridians who've recently lost their jobs now fear they'll lose their homes.
According to a leading real estate tracking firm, nearly one in 10 homeowners in the state are behind in their mortgage payments by 90 days or longer.
"I have not been this nervous, worried or stressed out in my entire life," said Delray Beach resident Susan Shear, who works for a travel agency.
At the onset of the coronavirus pandemic, her hours at work and her income were cut in half. She's likely to miss many of her upcoming mortgage payments on her home.
"Would I lose my house?" asked Shear. "That would be my biggest fear."
Contact 5 found a sharp rise in the number of homeowners falling behind in Florida.
These are the number from the last six months from the real estate tracking and analysis company Black Knight.
Florida Atlantic University business professor and real estate expert Ken Johnson said this about the numbers that jumped in April.
"I cannot see this going on another year," Johnson said. "At some point in time, if we don't have effective treatments and or vaccines, these things are going to add up, and we will have a problem."
Johnson said mortgage delinquencies in Florida are not at a crisis state, yet.
Florida has a moratorium on foreclosures for homeowners who fall behind on payments due to COVID-19.
The professor also adds that most lenders allow homeowners "forbearance." That's where the homeowner can essentially call a time out, pause making payments for up to a year and then make up those payments later.
Johnson believes that since banks tightened credit rules for home buying after the last recession, most homeowners have enough credit to hang on and avoid foreclosure for awhile.
He sums up the spike in mortgage delinquencies this way.
"This is more a tropical storm than a Category 4 hurricane, which we had in all of housing a decade ago," Johnson said.
Don't mention hurricanes to Susan Shear.
Susan Shear recently took out a home improvement loan for a new roof, but now she's using that money to pay her mortgage and other bills.
She recently took out a home improvement loan for a new roof, but now she's using that money to pay her mortgage and other bills.
"I'm a struggling-to-hold on middle-class person," said Shear, who hopes her travel agency's business bounces back so she can get back to working full-time and paying her bills on-time.
"It depends on the pandemic," she said. "It's travel. It's business travel. It's a difficult time."
Email the Contact 5 Investigators
Share your news tips and story ideas with WPTV's investigations team.
Click to proceed


MY BAD ZOMBIE MOVIE REVIEWS ARE BACK! In the past I've done these around Halloween, but I've been jonesin' to watch some bad zombie movies lately. Just a quick reminder, I have a passion for low-budget sci-fi and horror movies, especially the really bad, low-rated ones that no one else likes. I purposely seek out the worst of the worst horror movies in particular and sit, start to finish, through 99.5% of 'em no matter what. Why do I do this? Because I find that I enjoy most of the them. And if you look to the right, I down right LOVE some of them and would watch them over and over again. Add to this an obsession for zombies, and here we are, a new weekly post. These reviews will also be a part of Blaze McRob's Terror Tuesday, so drop by and see what he's got going today.
Unfortunately I won't be adding today's review to my FAV list. Boy did I start with a really bad zombie movie. Rise of the Zombies was released in 2012 and has a cast of well known actors including: ex-model and long time bad actress, Mariel Hemingway; guy who best plays an idiot, Ethan Suplee; Star Trek's Jordie, LeVar Burton; tough guy I love, Danny Trejo; another guy who best plays an idiot, French Stewart.
Get ready, because I'm going to really bash this one, and I don't do this very often. This movie almost joined Awaken the Dead, the only zombie movie in the .5% I didn't finish watching. The characters in Rise of the Zombies are so pathetic that you cheer on the zombies to hurry up and kill the living in the first ten minutes of the movies. Seriously, they were far below the lowest, acceptable level of stupidity you get in so many horror movies. The living are so pathetic, they can't even figure out how to protect themselves from zombies in jail cells. The most irritating thing about the movie is they cast Ethan Suplee, yes My Nme is Earl's idiot brother as the tough Air Force pilot, and French Stewart as the smart scientist who would save the world with his vaccine. LeVar Burton should be ashamed of himself! Mariel Hemingway has always sucked as an actress, so I won't even bother to complain about her performance. Danny Trejo was the only decent character in the movie although he should have brought his machete.
Okay, it's not all bad. The make up job on the zombies was okay, although their blood would inconsistently switch between red and black. There is one part worth seeing, but go look it up on YouTube. They electrically zap the zombies in one scene and is was kinda cool.
So, how does it rate? All-in-all, the movie was high on the annoying scale, and no careers were revived in this one. 1 OUT OF 5 BLOODY BRAINS.
Looks like a great bad movie to me, Wendy! What's not to love and hate? What an awesome paradox you have come up with here. Love to hate is way cool! Super movie poster too.
This movie was SO bad that I logged onto the internet and looked for a site about this movie JUST to express how bad it is. Not only is the script pure unadulterated crap, but every actor except Levar Burton (caveat though since I didn't bother to watch more than the 20 minutes that I endured before turning it off to do my LAUNDRY instead!!!) who you can tell is trying his best to make something out of worse than nothing. He actively works against dreadful dialogue and some of the worst acting from all the other 'names' in the flick. I was actually surprised by the number of decent actors who turn out turd-worthy performances and even worse…no, strike that, couldn't be worse. Did I mention that I went looking for a rant site on this movie??? Could this movie secretly be a psych test or a devious CIA mind-control trigger? THAT would make more sense than this "should-be-ashamed-to-be-in-it"-someone got a video camera for Christmas and made a movie-waste of time, effort and artist dignity. So to sum up; I didn't prefer this Zombie movie.
I like how you say, "I was actually surprised by the number of decent actors who turn out turd-worthy performances…" I felt like the bad acting was a worse contagion than the zombie virus. I also have to say that you are not alone when it comes to looking up sites where you can rant. I can't believe how many hits this post has been getting, and I just started using this blog again over the last few months.
See, Wendy, you should have re-started this post earlier.
Gotta love your "turd-worthy" statement, BeeGee!
I'm glad my comments entertained everyone. After taking up time to watch this movie SOMEONE should get a few moments of real entertainment. Cheers!


National Construction Safety Officers (NCSO™) certified prior to August 30, 2017 wishing to write the NCSO National Exam will now have until August 30, 2019 to have the required experience criteria grandfathered. After this date, those wishing to write the exam will have to re-apply to the program and submit their experience letters for acceptance based on the new NCSO National Standard requirements. All training obtained either before or after this date will be accepted, provided it meets the program requirements and certifications have been maintained. For more information, please email Program Services.


text:
`CREATE  TABLE "main"."mandel" ("payee" VARCHAR, "purpose" VARCHAR, "city" VARCHAR, "state" VARCHAR, "zip" VARCHAR, "amount" INTEGER, "month" INTEGER, "day" INTEGER, "year" INTEGER)`

### Rows with no state
`SELECT * FROM mandel WHERE state = ' ';`

### Totals by state
`SELECT state, sum(amount) from mandel GROUP BY state`

### Totals by purpose
`SELECT purpose,sum(amount) as amt FROM mandel GROUP BY purpose ORDER BY amt DESC;`

### All Direct Mailing expenses.
`SELECT * FROM mandel WHERE purpose LIKE '%DIRECT%'`

### Total by Month-Year
`SELECT month,year,sum(amount) as total FROM mandel GROUP BY month,year ORDER BY total DESC`

### Total by Payee
`SELECT payee,sum(amount) as total FROM mandel where purpose == 'PAYROLL' GROUP BY payee ORDER BY total DESC`

redpajama_set_name: RedPajamaGithub


text:
How To Get Started with YouTube Video Marketing
Get Hundreds of Views on Your YouTube Channel Every Day!
Enroll in Course for $79
You are ahead of the curve.
You put aside your fear of being in front of the camera and you started your very own YouTube channel. Congratulations!
300 hours worth of videos are being uploaded to YouTube every minute and even though you're pretty consistent about uploading new videos every week you're not exactly thrilled with the numbers of views or subscribers you're getting on your YouTube channel.
If this sounds like you, then rest assured you are not alone. According to Tube Mogul, 53% of YouTube videos have fewer than 500 views and about 30% have less than 100.
But I'm glad you're here because you're in the right place if you want to get the knowledge and skills that you need to grow your fanbase and Get Hundreds of View to Your YouTube Channel Each and Every Day!
You'll learn about tried and true methods for promoting your videos as well as the new features of YouTube. For example, check out the lecture on YouTube Cards.
YouTube Video Cards provide a more effective tool that works on mobile devices. This new feature is explained in detail with step-by-step instructions for setting up Video cards that can add links to our websites, fundraising, merchandise and much more!
Join over 2,400 students and learn how to engage your audience and increase the number of views on your YouTube videos! This course is not like the others you've seen before. I teach unique strategies for getting social proof for your videos and I show you how I managed to get over 400,000 views on my YouTube channel to date.
Read the latest 5 star reviews.
Scott Patton's Review
The Secret to More Engagement on YouTube Revealed
Ms. Ileane's course was interesting for me as she shared some ways to reach more viewers that i never expected would bring any traffic at all. The key to more engagement, of course, comes from your viewers sharing your videos, not just you hammering them, and she reveals some effective ways to get that sharing going. If you expect a magic pill or strategy to make your videos more popular, you won't find it here for one really good reason: It doesn't exist. Hard work, quality videos and trying lots of different things until you hit your mark, only work if you know when you hit a home run, and that means, >sigh< stats and analytics which she goes into in ways that didn't make my eyes roll (which they usually do when people talk hits and minutes viewed, etc.) Ms Ileane makes a great point that if you have 30 videos and one is super popular and you don't know which one it is, then you won't make more videos related to that popular topic and miss out on tons of traffic as a result. So she shows you how to identify those golden videos. Her voice has a hypnotic quality and it feels like I am listening to a close family member. I learned a lot and I enjoyed the process. Highly recommended!
Mark Timberlake's Review
Some Excellent Tips And Insider Information
Ileane shares some excellent tips on how to get your videos out there and how to share them socially, so if you want to deepen your audience for your YouTube content, then this has some great ideas and techniques for you to explore. :-)
The focus of this course is on using social media to make a stronger connection and reach a wider audience with your YouTube Videos. By connecting with your fans on social media and on your blog, you will be able to get hundreds of views across your YouTube channel each and every day!
Here's another 5 star review.
Rob Cubbon' Review
Great insights from someone who knows YouTube
I hugely enjoyed this powerful course that explains how to use YouTube to your advantage. If you take this course and implement its strategies you will find you subscribers, video views, traffic, engagement and sales all moving in the right direction!
We start off by giving your channel an audit to see where you are today. Watch your engagement and social proof increase with simple techniques and community building tips. Learn how to track your progress in YouTube analytics -- and take it even further by mastering the vidIQ metrics dashboard.
The key to a successful YouTube presence is more than just having a viral video. Increase your reach and establish connections with your peers, industry thought leaders and your true fans and brand advocates.
Ileane Smith
I started blogging back in 2009 and since then I have been helping bloggers live out their dream of making money online.
My primary blog Basic Blog Tips, is one of the most popular blogs on the web to learn about blogging, social media and YouTube. It's been viewed over a million times and appears on countless lists of top blogs to follow. I have over a quarter of a million views on the Ms. Ileane Speaks YouTube channel where I've posted over 160 video tutorials.
I'm active on every major social media platform including Twitter, Google+, Pinterest, Facebook and even Instagram and have thousands of engaged fans and followers.
I'm often asked to share my expertise in interviews and I've been featured on Black Enterprise, Shout Me Loud, and Google+ Hangout shows including The Mia Connect Power Chat, Blogging Warfare, Relationship Marketing, Podcasters Roundtable and the Manly Pinterest Tips Show.
Course Introduction and Auditing Your YouTube Channel
My YouTube Stats - How I Get Hundreds of Views Each Day (3:48)
Download the YouTube Audit Checklist (0:56)
YouTube Channel Audit Checklist
The Biggest Mistakes People Make on YouTube and How to Fix Them! (22:48)
Importance of YouTube and Your Website (12:26)
Responding to Comments on YouTube Boosts Engagement and Views (8:19)
Engage Your Audience with a Call To Action (1:36)
Tips and Tricks for Getting More Social Shares for Your Videos
How To Find the Hidden RSS Feed For Your YouTube Channel (4:37)
Use the YouTube RSS Feed to Get More Social Shares for Your Videos (11:06)
Promoting Your YouTube Videos on Pinterest
Format for Finding the RSS Feed and Video URL
Tracking Your Progress with YouTube Analytics and More!
YouTube Analytics and Using Animoto to Strengthen the Power of Playlists (14:28)
Tracking Subscriber Engagement Levels (5:29)
vidIQ Great for Video Statistics and Engagement Tracking (11:27)
VidstatX - Find Your "Hidden" YouTube Stats (12:40)
Engage with Your YouTube Community (5:30)
YouTube's Mobile Friendly Video Cards Are Here (5:49)
TubeBuddy Launch Pad Helps Your Video Get Discovered (8:33)
How To Get Hundreds of Views To Your YouTube Channel Daily Coupon Discount
© Get Ready to Learn with Ileane Smith 2022


The three-year project found that only 21% of children aged 8-12 were "connected to nature".
In 2012, the National Trust published a report on the phenomenon of "nature deficit disorder", though it is not recognised as a medical condition.
The RSPB says its new study is the first to quantify the scale of British children's exposure, or lack of it, to the natural world.
They came up with a definition of what "connected to nature" actually means and then developed a questionnaire with 16 statements designed to assess the level of connection among children.
This "realistic and achievable" value is based on the average scores of children visiting RSPB sites or who are junior members of the organisation.
One interesting finding was the gender difference. While 27% of girls were at or above the "realistic and achievable" target, only 16% of boys were at the same level.
"We need to understand these differences," Sue Armstrong-Brown, head of conservation at the charity, told BBC News.
The RSPB hopes that its study will be taken up by government as one of the indicators on the state of children's wellbeing.
"If we can grow a generation of children that have a connection to nature and do feel a sense of oneness with it, we then have the force for the future that can save nature and stop us living in a world where nature is declining," she said.


text:
See all Dublin tours
788 tours & tickets
See all things to do in Dublin
Ways to Celebrate St. Patrick's Day in Dublin
Dublin articles
7 Must-See Dublin Neighborhoods and How to Visit
Discover Ireland's capital city, one distinct neighborhood at a time.
4 min read•Sep. 13, 2022•By Margot Bigg
Hi, I'm Margot!
Margot Bigg is a journalist who has lived in the UK, the US, France, and India. She's the author of Moon Living Abroad in India and Moon Taj Mahal, Delhi & Jaipur and a co-author of Fodor's Essential India and Fodor's Pacific Northwest. Her stories have appeared in Rolling Stone India, National Geographic Traveler, Sunset, and VICE.
Dublin has enough buzzing pubs and destination-worthy landmarks in its city center for travelers to never explore beyond this border, but that would be a crying shame. Because while the heart of Dublin is a vibrant place to visit, the Irish capital is actually a city of villages, and each village or neighborhood has its own character and hospitality (not to mention its own literary history). Here are seven neighborhoods in Dublin you won't want to miss.
Why you are seeing these recommendations
Explore Dublin Castle nestled in the City Center. | Photo Credit: Lauren Orr / Shutterstock
Visit top historic landmarks.
Trinity College (home to the Book of Kells), Dublin Castle, and St. Stephen's Green are all clustered in Dublin's city center, affectionately called "town" by locals. First-time visitors will likely spend significant time here shopping along Grafton Street, ordering a Guinness in the historic pubs, and wandering through museums such as the National Gallery of Ireland. From Merrion Square to the Museum of Literature Ireland (MoLI), this bustling neighborhood is also fairly compact and easy to explore on foot or bike.
Insider tip: Do "town" right with a picnic in Iveagh Gardens or a concert at the National Concert Hall.
The Temple Bar is frequented by tourists and locals. | Photo Credit: Rolf G Wackenberg / Shutterstock
Explore Dublin's cultural quarter.
This riverside neighborhood has a reputation for rowdy pubs, but there's much more to Temple Bar than crowds of tourists and bachelor parties. This historic quarter is actually known to locals as a cultural neighborhood, with arts attractions from the IFI (Irish Film Institute) and the Photo Museum Ireland to small theaters including the Smock Alley Theatre. It's also home to beloved bookshops, trendy boutiques, and the weekly Temple Bar Food Market in Meeting House Square. There are late-night cocktail bars and pubs, too, but don't skip a stroll in Temple Bar during the day.
Central Northside
Hotels located near Parnell Square are budget friendly. | Photo Credit: Ross Mahon / Shutterstock
Tuck into tasty and budget-friendly eats.
The area just north of the River Liffey is a favorite place to stay for budget-conscious travelers. In addition to value hotels around Parnell Square and hostels for those on a tight budget, this neighborhood is also known for its combination of historic sites and affordable restaurants. Learn about Dublin's history and art with visits to the General Post Office on O'Connell Street (an important landmark in the 1916 Easter Rising), the Hugh Lane Gallery, and the Dublin Writers Museum. When hunger hits, check out the restaurants along Parnell Street, which is known for a variety of Asian restaurants including Korean, Sichuan, Japanese, and more.
Portobello is home to water views and swans. | Photo Credit: Lukas Fendek / Shutterstock
Enjoy a relaxed, neighborhood vibe along the canal.
Sometimes compared to Brooklyn, Portobello is a destination for worn-wood pubs, contemporary restaurants, and late-night antics. Portobello is also an easy stroll from the city center and is flanked by a pretty canal, home to swans and waterside park benches perfect for people watching. It's a trendy area, but lacks popular attractions (with the exception of the Irish Jewish Museum), so this is the spot for a leisurely brunch, reading at a local coffee shop, or browsing at independent boutiques.
Smithfield Square is home to cool coffee shops and restaurants. | Photo Credit: Dirk Hudson / Shutterstock
Take in traditional music and modern coffee shops.
What was once a warehouse district on the north side of the River Liffey is now Smithfield, one of Dublin's hippest neighborhoods. The central Smithfield Square is home to seasonal flea markets, food fairs, and a 19th-century whiskey factory, plus the Cobblestone pub, which hosts one of Dublin's best traditional music sessions. In addition to these historic staples, the neighborhood also has a modern edge thanks to cool coffee shops, the Lighthouse Cinema, vegan restaurants, and small venues for contemporary concerts.
The Liberties
Enjoy whiskey tasting at one of the many distilleries in the Liberties. | Photo Credit: liamedwards58/ Tripadvisor
Sip whiskey at the source.
The Liberties is one of the oldest neighborhoods in Dublin, and has undergone a revival in recent years. Industry (and businesses that catered to workers) once dominated this neighborhood, and the Liberties has returned to its roots with the opening of several whiskey distilleries. Spirits enthusiasts are now drawn to the area to tour and taste at the Teeling Distillery, Pearse Lyons, and the Dublin Liberties Distillery. Beyond distillery tours, the neighborhood also offers Liberty Market, popular cafés, and historic pubs.
The charming architecture in Ranelagh is a good reason to visit. | Photo Credit: jksz.photography / Shutterstock
Rub elbows with locals.
Another trendy neighborhood with easy LUAS tram access is Ranelagh, a pretty southside village that's ideal for strolling. Gastropubs and sleek restaurants are side-by-side with coffee shops, a bookstore, and in recent years, a trendy hotel in this mostly red-brick neighborhood. The architecture alone is a charming reason to visit, as are the historic pubs and the opportunity to be surrounded by Dublin accents, rather than fellow tourists. It's a polished place to go for a stroll—visitors who love real estate ogling may want to include a walk along lovely Dartmouth Square.
Find more things to do in Dublin
Dublin Highlights Walking Tour
Kilkenny, Wicklow Mountains, Glendalough, Sheep Dog Trials, Day Trip from Dublin
Dublin walking tasting tour with Secret Food Tours
Northern Ireland Highlights Day Trip Including Giant's Causeway from Dublin
Skip the Line Guinness and Jameson Irish Whiskey Experience Tour in Dublin
Dublin Live Guided Open-top, Hop-on Hop-off Sightseeing Tour
Dublin: Giants Causeway, Dunluce Castle ,Dark Hedges and Belfast
Fast-track Easy Access Book of Kells Tour with Dublin Castle
Giant's Causeway & Belfast City Day Tour from Dublin
See Dublin By Bike
2 hours to 2 hours&nbsp30 minutes
The 10 Tastings of Dublin With Locals: Private Food Tour
Dublin: Giant's Causeway, Dark Hedges, Dunluce and Belfast Titanic entrance fee
Blarney Castle Day Trip from Dublin
Cliffs of Moher Tour Including Wild Atlantic Way and Galway City from Dublin
Dark Dublin Guided Walking Tour
2022 Gift Guide for Travel Experiences Around the World
Helen Shepherd
15 of the Scariest Ghost Tours Around the World
11 Bucket List-Worthy Experiences for Music Lovers
Nick Dauk
Visiting Dublin for the First Time? Here's What to See and Do
Nicola Brady
Art Lover's Guide to Dublin
Mandy Hegarty
Don't Miss These Must-Do Activities in Dublin
Jenny Cahill-Jones
Galway Bay Tours from Dublin
Belfast Day Trips from Dublin
How to Spend 3 Days in Dublin
Things to Do in Dublin This Summer
Zoë Smith
Cork Tours from Dublin
Wild Atlantic Way Tours from Dublin
How to Spend a Rainy Day in Dublin
What to Pack for the Cliffs of Moher
Do more with Viator
One site, 300,000+ experiences you'll remember—direct to your inbox.


text:
Printed from https://fyi.org.nz/request/officers_on_intelligence_and_sec on February 03, 2023 00:16
Officers on Intelligence and Security Committee
Joshua Grainger made this Official Information request to Department of the Prime Minister and Cabinet
The request was partially successful.
From: Joshua Grainger
Dear Department of the Prime Minister and Cabinet,
Under s13(7) of the Intelligence and Security Committee Act of 1996 the CE of DPMC has the ability to appoint officers to this committee to assist in the conduct of its business. I would like to request under the Official Information Act some information related to this: I would like to request:
a) The identify of all officers appointed to this Committee, and job titles where appropriate
b) The current number of officers appointed to the Committee
c) The amount of renumeration provided for each officer for serving on the Committee, if necessary, in $10000 bands to preserve privacy (as recommended by the Ombudsmen)
d) The level of security clearance for each officer of the Committee
e) Any correspondence with any person or organization outside of DPMC (including the Committee) about the appointment of the last officer appointed to the committee.
Feel free to contact me if you wish me to clarify my request.
Joshua Grainger
From: Jody Watson
Department of the Prime Minister and Cabinet
535351 OIA Reply Grainger Joshua Intelligence and Security Committee officers DPMC.PDF.pdf
Good afternoon Mr Grainger,
Please find attached the electronic copy of the reply to your Official Information Act Request for information relating to officers assisting the Intelligence and Security committee.
If you wish to receive the hard copy of the response, please provide us with a postal address and we will mail this to you also.
Please consider the environment before printing this e-mail.
The information contained in this email message is for the attention of the intended recipient only and is not necessarily the official view or communication of the Department of the Prime Minister and Cabinet. If you are not the intended recipient you must not disclose, copy or distribute this message or the information in it. If you have received this message in error, please destroy the email and notify the sender immediately.
(DPMC Secured)
Joshua Grainger only:
Department of the Prime Minister and Cabinet only:
s31(a) OIA Statistics
To Department of the Prime Minister and Cabinet by Joshua Grainger January 23, 2012
Officials' Committees Agendas
To Department of the Prime Minister and Cabinet by Joshua Grainger August 30, 2012
Three national security system and counter-terrorism reviews
To Department of the Prime Minister and Cabinet by Sebastian November 22, 2021
Copies of national security portfolio briefings
To Department of the Prime Minister and Cabinet by Sebastian April 05, 2022
National Assessments Committee reports
To Department of the Prime Minister and Cabinet by Scott February 14, 2022
List of National Security Group briefings and Cabinet papers since January 2021
To Department of the Prime Minister and Cabinet by Sebastian January 17, 2022
National Security briefings, memos and Cabinet papers
To Department of the Prime Minister and Cabinet by Scott November 02, 2021
Post Operation Deans review and National Security Group Business Plan
To Department of the Prime Minister and Cabinet by Sebastian September 10, 2021
Cost of upcoming royal visit
To Department of the Prime Minister and Cabinet by Alex Harris March 29, 2012
Underlying documents mentioned in the Royal Commission report and Counter-Terrorism Strategy


text:
«Ка́рлсруэ» () — немецкий футбольный клуб из одноимённого города. Чемпион Германии (1909), двукратный обладатель Кубка Германии, обладатель (1996) и финалист (1995) Кубка Интертото.

История
Клуб был созданный в 1894 году как «Феникс» (Karlsruher Fussball Club Phönix). До 1952 года команда носила название «Феникс». Затем последовало объединение с ФК «Мюльбург» и слово «Феникс» сохранилось в новом названии до сих пор в качестве приставки к полному наименованию нового клуба (Karlsruher Sport-Club Mühlburg-Phönix e.V.).

История выступлений

Достижения
 Чемпион Германии: 1909
 Обладатель Кубка Германии (2): 1955, 1956
 Обладатель Кубка Интертото: 1996
 Финалист Кубка Интертото: 1995

Состав
По состоянию на 5 июня 2020 года. Источник: Список игроков на transfermarkt.com

Ссылки
 Официальный сайт

Футбольные клубы, основанные в 1894 году
Спортивные клубы Карлсруэ
Футбольные клубы Германии

redpajama_set_name: RedPajamaWikipedia


In less than a day, the village of Brest, near Pleven, achieved notoriety throughout Bulgaria. In March, shortly before a local by-election, the owner of a small shoe factory gathered a dozen of his workers and gave each 50 leva. The meeting was attended by a man who apparently should not have been there: the mayoral candidate from GERB, or Citizens for European Development of Bulgaria.
A few days later, the National Assembly increased the penalty for ballot-box corruption to six years imprisonment and a fine of up to 20,000 leva. Considering the events in Brest, however, this measure is unlikely to scare parties planning to secure themselves more votes at the European and National Assembly elections in June and July.
Bulgarians are used to scandals about vote buying, as there have been many at all the elections since 1990. The plan has always been more or less the same. Buy the votes of the poorest and most downtrodden sections of society, usually Gypsies.
But the price has changed. At the beginning of the meagre 1990s, the transaction involved bartering packets of flour or sugar or jam jar lids – precious commodities in a country where home-made preserves were not a luxury but a means of survival.
Gradually, the "gifts" became sausages, frozen chickens and kebapcheta.
The Roma in the Filipovtsi ghetto in Plovdiv were promised twice that they would not have to pay their electricity bills, in 1998 by the SDS, or Union of Democratic Forces, mayor and in 2005 by a member of the DPS, or Movement for Rights and Freedoms.
The local elections in 2007 brought about a change. Goods were superseded by cash as a means of payment.
Entrepreneur Nikola Malchev from Sandanski, one of the few convicted of vote buying, gave his workers between 30 and 50 leva to buy their votes for the Future for Sandanski coalition.
The owner of a pharmacy chain in Varna and mayoral candidate, Veselin Mareshki, promised pensioners and the chronically ill cheaper medicines if they voted for him.
To cap it all, Ahmed Dogan, leader of the DPS, told journalists the same year that "vote buying is a common European practice." What are these "European practice" elections like? Before entering the polling booth, the voter receives a mobile phone with a camera. He gets his money or kebapcheta only after proving with a photograph that he has cast a ballot for the "right candidate."
The Central Elections Committee banned the use of mobile phones in the cubicle, but this did not have much effect. For some time, parliament even flirted with the idea of using CCTVs to detect elections fraud, but gave it up to protect civil liberties. In 2008, a mistake revealed the extent of the contagion.
Shortly before a local by-election in Sandanski, the NDSV, or National Movement for Stability and Progress, MP Yani Yanev received a list of 495 voters living in the municipality with the note "Pay the bill!".
But Yanev was from Varna, not Sandanski. His party alerted the National Security Agency, or DANS, to check out another politician with a similar name, Yane Yanev. The result? There has been none. "Some of those interrogated by DANS admitted that they had sold their votes, but refused to testify in court," an NDSV MP told the media.
Today, Yane Yanev, who is the leader of the Order, Law and Justice party and in 2007 had been a supporter of Mareshki, is a regular visitor to DANS.
No, not because he is under official investigation. Making use of well-planned publicity stunts, he submits information about allegedly corrupt high-ranking politicians and police officers and hypothetical disseminators of radical Islam in Bulgaria.
Some opinion polls give him a good chance of securing a seat in the next election.
All this leads to the conclusion that, although it is already 20 years old, Bulgarian democracy is still a toddler. The European Commission has also noted this. One of the criticisms in its report published in the summer of 2008 concerned the low number of investigations and court rulings regarding vote rigging, despite the hundreds of irregularities flagged at the local elections in 2007.
Any bought vote now poses a danger. It may lead to "putting into effect article 7 of the accession treaty, which limits Bulgaria's right to take part in EU decision-making," said Yuliana Nikolova, chairwoman of the European Institute to Mediapool.
The good news is that there will be no more "election tourism," at least for the European parliament election. This has been widely practised by immigrants in Turkey who have dual citizenship. A day or two before the election, they would come to Bulgaria by the coachload and, after voting for the "right candidate" and visiting their relatives, return to Turkey.
Traditionally, the victorious candidate in the areas where this was a common practice was from the DPS.
This time, only Bulgarian citizens who have been resident in the country for the past three months have the right to vote in the European parliament elections.
Unfortunately, it is strongly suspected that the increased penalties for vote buying are just a sop to the European Commission. The events in Brest have helped to feed such speculation. The GERB candidate did win the first and the second round of the election in the village.
And where does the money that political parties spend on vote buying come from? From the European taxpayers' pockets.
Lyudmil Stoykov, who donated 50,000 leva to President Georgi Parvanov's election campaign, is the main character in a disturbing report from OLAF concerning the misuse of EU funding and money laundering. The report points out that there was a "political cover-up" for the businessman. Together with six other people, he now stands accused of money laundering in what is to be a mega trial. The case has not reached court yet, because his lawyers are constantly "on sick leave."
In 2006 Ahmed Dogan stated bluntly: "They are pulling the wool over your eyes with those donations. Look, all over the world, each political party has, so to say, a circle of companies. If you think that I have less capability than a banker, then you have no real idea of the influence of a politician." Then he went on to add that he already knew the companies from his circle that would acquire EU funding in 2008 and 2009.
Does the West believe in the increased penalties for vote buying in the Penal Code? Yes, at first glance. "We welcome the decision by the National Assembly to pass legislation increasing the penalties for vote buying. This action makes it clear that vote buying is a serious crime," said American Ambassador to Bulgaria Nancy McEldowney in a special statement. But, in her view, there are a lot more steps to be taken. "Passage of an even more robust legislative package would have further strengthened the elections process. We encourage all political parties to voluntarily implement the additional measures proposed by the Integrity Pact for Independent and Democratic Vote in Bulgaria, especially the provisions for enhanced transparency of political party financing. If adopted, these measures will boost confidence in the electoral system and serve the best interests of Bulgaria's citizens and democratic institutions."


text:
Book Review: Nigel McDowell - The Black North - Published by Hot Key Books
Book Review: After reading Nigel's debut novel last year, TALL TALES FROM PITCH END, I was very interested to see what the author would dream up next. I was not really expecting this latest story, to be honest, but what a fantastic read. Like the first novel, the author in my opinion delivers a unique insight into a fantasy world that captivates the reader on so many levels. This is an atmospheric dark tale that will sweep you off your feet in many different ways.
This is a fast paced, mystical adventure that is very surreal but, also at times, rather confusing as some of the characters that you thought were dead magically reappear! This might have been a trick of my own imagination, but nevertheless, this made for an explosive epic battle.
One strength of the story was the author's overly wild imagination which is deployed to fantastic effect; lots of detailed backstory and a plot that hooked me from the very beginning.
The characters are absolutely brilliant. Many of them should have a stand-alone book written just for them. Bizarre creatures have been depicted within this book, such as the Briar-Witches, that really will scare the pants of you. I particularly liked the 'Master of the Big House' and his stone statue sister; they lifted the story for me. On a number of occasions, I found myself giggling in a mad and demonic sort of way.
Nigel paints a picture of a complex world that is crumbling into nothingness; a powerful force of evil that the human race need to fight. All of which is told with some elements of folklore and dark magic but within a fairytale style. This blend reads like one big nightmare. Told from the point of Oona, a female heroine who is stubborn and strong - she is a match for anyone as she lead us through this fantastic tale. This is a story for every reader with a vivacious appetite for the unimaginable and the terrifying. It was a huge hit with me and one that I would thoroughly recommend.
The Divided Isle, once a place of peace and tranquillity, has been ravaged by war. Twins Oona and Morris live with their grandmother in a stone cottage in the quiet southern county of Drumbroken, but the threat of the Invaders of the Black North - the ravaged northern part of the island - is coming ever closer. When Morris, fighting against the Invaders, is kidnapped by one of the evil Briar Witches, Oona must journey to the unknown realms of the Black North in search of her brother. She is accompanied only by Merrigutt, a jackdaw with mysterious transformative powers, and a treasured secret possession: a small stone in the shape of a plum, but a stone that reveals truths and nightmares, and which the Invaders and their ruler, the King of the North, seek more than anything. Oona must keep the stone safe at all costs, and find her brother, before the King of the North extends his evil hold over the whole island and destroys it forever.
By Mr Ripley's Enchanted Books on June 10, 2014
Labels: Dark, Epic Battles, Evil, Fantasy, Horror, Hot Key Books, June 2014, Magic, Nigel McDowell
Mr Ripley's Book Review: Dawn Finch - Brotherhood ...
Mr Ripley's Book Review: Eoin Colfer - W.A.R.P BK ...
Mr Ripley's Children's/Teens Fantasy New Books - ...
Mr Ripley's Book Review - Nick Cook - Cloud Riders...
Mr Ripley's Guest Post: Nick Cook - To the Moon a...
Mr Ripley's Enchanted Children's/Teens Book Picks ...
Mr Ripley's Random Children's and Teen Picks - Jul...
Mr Ripley's Book Review: Seventeen Coffins - By Ph...
Mr Ripley's Guest Post: My Literary Hero Ray Bradb...
Mr Ripley's New Fantasy Book Picks - July 2104 - P...
Book Review: Nigel McDowell - The Black North - Pu...
Mr Ripley's Book Cover Preview: Lockwood & Co: The...
Mr Ripley's Recommended Book Read: Jan Siegel - Th...
Guest Post by Lisa Glass - Blue - Published by Que...
Book Review: Dan Smith - My Brother's Secret - Pub...
Guest Post by Sarah Sky - Code Red Lipstick - Publ...
Guest Publication Day Post: Matt Brown - Compton V...


Col: Ivory with Rose hand embroidery.
Size : L 120 x W 150 cm.
Our hand embroidered top sheets are designed to have a fold back top panel allowing them to be layer with quilts whilst still displaying the embroidery.
Available in three sizes, the smaller size fits both a crib and cotbed. Comes in it own storage bag.


text:
The Wallet
Master Article
Fword
More articles by
Stop-gape approach
Beauty, and the beholders
Emoji-fied eves
Feminist? Err...
Privilege or necessity?
Free, and fearless
Cup of joy
Strong, but not a mother
Feminists, focus!
By Meenakshi Reddy Madhavan | December 29, 2015
Smoking is shorthand for signalling you're a certain kind of woman, the kind that is the Cool Girl that is mentioned in the book Gone Girl by Gillian Flynn. A confident, self-assured woman who drinks Old Monk instead of white wine, who can drive a car faster than you can, who doesn't give a damn what the world thinks of her.
I haven't always been a smoker, of course. There was a time when my young lungs were disgusted by the idea of it. I picked it up, as people do, when I was in college—a bad decision I've wanted to take back hundreds of times since—and have been a slave to the cancer sticks ever since. Oh, sure, I've tried to quit. I've tried to quit so many times—and sometimes succeeded even, but here we are, my last column for 2015, and I'm still a failed smoker.
For many years, I think the problem was that they went with my image of cool, rebellious writer chick. Whips out her cigarette and delivers bon mots at parties. A man I dated even confirmed it once: he was a non-smoker himself, and when I said, wistfully, "Do I smell like an ashtray?" he said, "But you look so cool when you do it!" And it's true, I do look cool. I look cool like all the ladies in films before me. Uma Thurman, on her stomach on the Pulp Fiction poster, legs up and crossed behind her, holding a cigarette in her hand. Sandy, from Grease, in the last song where she reinvents herself from virginal girl to a sassy leather-wearing diva who sings about how he's the one that she wants—all the while holding a cigarette which she lights with penultimate coolness. Even in Bollywood, in the early days, the bad girls, the exciting ones, the ones the heroes all wanted in the beginner were smokers. (Fun fact I just noticed: if you Google image search "Bollywood women smoking," there's actually a picture of me from back in the day embracing a male friend's back, holding a cigarette.) Smoking is shorthand for signalling you're a certain kind of woman, the kind that is the Cool Girl that is mentioned in the book Gone Girl by Gillian Flynn. A confident, self-assured woman who drinks Old Monk instead of white wine, who can drive a car faster than you can, who doesn't give a damn what the world thinks of her.
There's an episode of Friends, where Rachel suddenly takes up smoking. Smoking is no-no in Friends-land, Chandler is the only one who occasionally slips, and even then he is castigated so much by his wife and friends, that he promptly stops. But in this particular episode, Rachel wants so badly to fit in with her colleagues and be party to the certain intimacy that only a smoker's room provides, that she takes up the habit just to belong. Anyone who has ever worked as a journalist will attest to that fact: if you want face-time with a boss, a one-to-one interview with someone else, or just to know what's going on, there's nothing like a shared cigarette or lighter to make you feel like one of the boys.
Maybe that's why a recent article I read in The Quint mentioned that while overall cigarette consumption in India is falling, the rise in women smokers has been quite considerable. From 5.3 million women smokers in 1980, the number is now more than double now, second only to the US. In a male-dominated world, sometimes you have to send signals out that you're not some weak thing, some delicate damsel, that you're as willing to work your hardest as your male colleagues, and smoking sometimes indicates that.
But to be a "modern woman" has its own perils. Back in the day, when my own personal blog was very personal indeed, the most number of angry comments I got was when I mentioned that I smoked. It was also the biggest criticism people had about my first book: why was my main character drinking and smoking all the time? Was this any way for an Indian woman to behave? When I smoke in public—which I totally do less and less, in these health-conscious times I'm always trying to quit—I have to find a corner to huddle in, or face stares that are even worse than normal. Smoking on the streets indicates that you're a fallen woman, a harlot, a shameless trollop who should be open to pretty much anything that men throw at her. (Surprisingly, this might be just an urban thing. In rural India, many women—a lot of them older—smoke as a matter of course. If it's not a communal hookah, they smoke beedis, and no one looks at them strangely either.)
Maybe women's attitudes to smoking will change when men's do. When it's no longer so much about rebellion but just a nasty habit that we should all kick. When there's a way to belong that doesn't involve changing who you are, and when people take you seriously without "accessories." Until then, I'm afraid we'll have to live with our rising number of female smokers—but I'm signing out. Again. Hopefully this time for good.
You have successfully sent the article.
Your form could not be submitted.
Recipient's Mail:*
( For more than one recipient, type addresses separated by comma )
Your E-mail ID:*
Enter the letters from image :
This browser settings will not support to add bookmarks programmatically. Please press Ctrl+D or change settings to bookmark this page.
Select your subscription
Please select subscription.
Please select payment method.
Confirm your subscription
Recharge E-Wallet
Enter recharge amount:
Select Atleast One Payment Option.
No sufficient balance. Please recharge.
Please provide billing address
Topics : #opinion | #Meenakshi Reddy Madhavan
How COVID triggered changes in India's disaster management framework: Bibek Debroy
Randy Andy and other rogues in royal robes: Anita Pratap
Did PM, president discuss genocide call against 200 million Indians, asks Anuja Chauhan


text:
Mexico City Art Community Rallies to Aid Earthquake Victims
September 24, 2017 by cgrets555
Catch up on the latest art news with our rundown of the 10 stories you need to know this week.
Artsy Editorial (ARTSY MAGAZINE FREE ONLINE) https://www.artsy.net/articles
Sep 22nd, 2017 5:34 pm
01 Members of the Mexico City arts community put a long-planned gallery weekend on hold and dove into recovery efforts following the devastating earthquake that struck Mexico on Tuesday.
(Artsy)
Mexico City's Art Community Joins Recovery Efforts—Here's How You Can Help
As of Friday morning, the quake has left at least 270 people dead, including at least 19 schoolchildren (a figure that was initially reported to be as high as 30), and turned many buildings into rubble. Gallery Weekend Mexico City, which was inaugurated in 2013, was due to kick off Thursday evening. Organizers said they, as well as the staff and artists from participating galleries, were all safe and accounted for. "The arts community is completely into the rescue and support efforts," said Ricardo Porrero, the director of Gallery Weekend Mexico City. "Galleries such as Alterna, LABOR, Marso, and Páramo, and Fundación Alumnos, among others are operating as collection centers for supplies. Gallery staffs as well as ours have volunteered to aid quake victims." Porrero said on Wednesday night that some artworks may be affected, although the gallery buildings were not. Many galleries sent out communications to announce the suspension of programming until further notice, and encouraged people to donate to relief efforts. Brett Schultz of BWSMX had planned an opening of work by Fabiola Menchelli for Wednesday night, but also postponed the event. "I think nearly everyone I know is out on the streets right now directly assisting in the relief efforts, be it at the collection centers, the rescue sites, or helping to move supplies around," Schultz said. "There has been an incredible outpouring of civic action and support city-wide."
← Homespun into Radical and Subversive art
My Profession- Art Therapy →


FOOTBALL: Leicester City's fifth consecutive English Premier League win under manager Craig Shakespeare has piled more pressure on Sunderland and its manager David Moyes.
The Foxes won 2-0 courtesy of second-half goals from Islam Slimani and Jamie Vardy to give the team a sixth straight victory in all competitions.
Defeat left the Black Cats rooted to the bottom of the ladder eight points behind Swansea City which is in 17th place outside the relegation zone.
The loss compounded a miserable day for Moyes who was forced to apologise for comments in an interview with a female BBC journalist during which he said she "might get a slap".
Sunderland said the comments were "wholly inappropiate" but also added it was standing by its under-fire boss.
When asked if he had thought his position was under threat following the comments, Moyes said: "No. I felt I had made my apology, there had been no complaint from (BBC journalist) Vicki Sparks, and because of that, everything was fine."
Manchester United extended its unbeaten league run to 20 games but had to wait until the 94th minute to earn a draw against Everton at Old Trafford.
Zlatan Ibrahimovic scored from the penalty spot after Ashley Williams was adjudged to have handballed a Luke Shaw shot.
Everton had taken an early lead through Phil Jagielka with United having an equaliser scored by Ibrahimovic ruled out for offside.
United manager Jose Mourinho said his side would have beaten Everton had video technology been in use for the game, with footage suggesting the former Sweden international was in an onside position.
"With the VAR (video assistant referee), we win this game 2-1 because it's not an offside," Mourinho told BT Sport at Old Trafford.
"But it's a difficult one for the linesman. I'm not critical of the linesman. I just say when the VAR comes, it will help everyone, especially the linesmen and referees."
Watford won a second match in succession by beating West Bromwich Albion 2-0, with Troy Deeney becoming the first player to score in four straight EPL games at Vicarage Road.
Burnley also eased the pressure on itself, ending a seven-match streak without a victory as George Boyd got the winner in a 1-0 success over Stoke City at Turf Moor.


Nathaniel Rich: When I was growing up from the ages of 9 to 14 I only read Stephen King books outside of school. I remember when I was in third grade- or fourth grade I- we all had to write down what our- the books we read over the summer. And I remember the expression on Ms. Sobol's face, my teacher, when I read The Dead Zone and The Tommyknockers. She was really horrified and upset, and that- that's when I think I knew I was doing the right- right thing. So Stephen King was always actually a big influence growing up. I went through a phase late- later in my adolescence when I was reading a lot of British writers of- Martin Amos generation, early Ian MacEwan, Julian Barnes, especially those three I'd suppose; read a lot of Dickens and I really love Dickens. Then in college I studied literature and I- I studied 20th Century European Literature. So that- those are the things I've- I've read the most, and ever since I started working at The Paris Review I've been reading a lot of contemporary American and fiction to try to catch up a little bit.
It started with an early obsession with Stephen King.


tipSkip is a music player for your iPhone, with an interesting twist.
tipSkip lets you control your music playback by tapping your iPhone.
You can skip songs, go back to the previous song, pause, etc... just by knocking on the device. It even works if you knock on the table.
This could come in very useful when your hands are busy or dirty and you don't want to touch your iPhone/iPad. Just put the device in your pocket or on the table and use your hand or finger/s to knock on your device.
tipSkip lets you control the sensitivity of the knocks so you can set it up to even work properly when you are running.
You can also customize the knock actions for 2x,3x and 4x knock (for example you can set it up so that a double knock fast forwards 30 seconds or backwards 90 seconds, etc...).
tipSkip is now $0.99 in the AppStore.


Our network probes enable IT security professionals to perform continuous real-time monitoring of activities and behaviors of workstations, servers and other network devices. Our small form factor sniffers are host, application, and operating system agnostic. They are able to observe bi-directional traffic and send packets to a Wireshark network protocol analyzer or export NetFlow to any of your favorite collector and analytics solutions.