text:
package framework

import (
	"context"
	"crypto/tls"
	"fmt"
	"net"
	"net/http"
	"strings"
	"time"

	"k8s.io/ingress-nginx/test/e2e/framework/httpexpect"

	"github.com/onsi/ginkgo/v2"
	"github.com/stretchr/testify/assert"
	appsv1 "k8s.io/api/apps/v1"
	corev1 "k8s.io/api/core/v1"
	v1 "k8s.io/api/core/v1"
	networking "k8s.io/api/networking/v1"
	apiextcs "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
	apierrors "k8s.io/apimachinery/pkg/api/errors"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/fields"
	"k8s.io/apimachinery/pkg/util/wait"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/kubernetes/scheme"
	"k8s.io/client-go/rest"
	restclient "k8s.io/client-go/rest"
	"k8s.io/klog/v2"
)

// RequestScheme define a scheme used in a test request.
type RequestScheme string

// These are valid test request schemes.
const (
	HTTP  RequestScheme = "http"
	HTTPS RequestScheme = "https"
)

var (
	// KubectlPath defines the full path of the kubectl binary
	KubectlPath = "/usr/local/bin/kubectl"
)

// Framework supports common operations used by e2e tests; it will keep a client & a namespace for you.
type Framework struct {
	BaseName string

	// A Kubernetes and Service Catalog client
	KubeClientSet          kubernetes.Interface
	KubeConfig             *restclient.Config
	APIExtensionsClientSet apiextcs.Interface

	Namespace    string
	IngressClass string

	pod *corev1.Pod
}

// NewDefaultFramework makes a new framework and sets up a BeforeEach/AfterEach for
// you (you can write additional before/after each functions).
func NewDefaultFramework(baseName string) *Framework {
	defer ginkgo.GinkgoRecover()

	f := &Framework{
		BaseName: baseName,
	}

	ginkgo.BeforeEach(f.BeforeEach)
	ginkgo.AfterEach(f.AfterEach)

	return f
}

// NewSimpleFramework makes a new framework that allows the usage of a namespace
// for arbitraty tests.
func NewSimpleFramework(baseName string) *Framework {
	defer ginkgo.GinkgoRecover()

	f := &Framework{
		BaseName: baseName,
	}

	ginkgo.BeforeEach(f.CreateEnvironment)
	ginkgo.AfterEach(f.DestroyEnvironment)

	return f
}

func (f *Framework) CreateEnvironment() {
	var err error

	if f.KubeClientSet == nil {
		f.KubeConfig, err = loadConfig()
		assert.Nil(ginkgo.GinkgoT(), err, "loading a kubernetes client configuration")

		// TODO: remove after k8s v1.22
		f.KubeConfig.WarningHandler = rest.NoWarnings{}

		f.KubeClientSet, err = kubernetes.NewForConfig(f.KubeConfig)
		assert.Nil(ginkgo.GinkgoT(), err, "creating a kubernetes client")

	}

	f.Namespace, err = CreateKubeNamespace(f.BaseName, f.KubeClientSet)
	assert.Nil(ginkgo.GinkgoT(), err, "creating namespace")
}

func (f *Framework) DestroyEnvironment() {
	defer ginkgo.GinkgoRecover()
	err := DeleteKubeNamespace(f.KubeClientSet, f.Namespace)
	assert.Nil(ginkgo.GinkgoT(), err, "deleting namespace %v", f.Namespace)
}

// BeforeEach gets a client and makes a namespace.
func (f *Framework) BeforeEach() {
	var err error

	f.CreateEnvironment()

	f.IngressClass, err = CreateIngressClass(f.Namespace, f.KubeClientSet)
	assert.Nil(ginkgo.GinkgoT(), err, "creating IngressClass")

	err = f.newIngressController(f.Namespace, f.BaseName)
	assert.Nil(ginkgo.GinkgoT(), err, "deploying the ingress controller")

	err = f.updateIngressNGINXPod()
	assert.Nil(ginkgo.GinkgoT(), err, "updating ingress controller pod information")

	f.WaitForNginxListening(80)
}

// AfterEach deletes the namespace, after reading its events.
func (f *Framework) AfterEach() {
	defer f.DestroyEnvironment()

	defer func(kubeClient kubernetes.Interface, ingressclass string) {
		defer ginkgo.GinkgoRecover()
		err := deleteIngressClass(kubeClient, ingressclass)
		assert.Nil(ginkgo.GinkgoT(), err, "deleting IngressClass")
	}(f.KubeClientSet, f.IngressClass)

	if !ginkgo.CurrentSpecReport().Failed() {
		return
	}

	cmd := fmt.Sprintf("cat /etc/nginx/nginx.conf")
	o, err := f.ExecCommand(f.pod, cmd)
	if err != nil {
		Logf("Unexpected error obtaining nginx.conf file: %v", err)
		return
	}

	ginkgo.By("Dumping NGINX configuration after failure")
	Logf("%v", o)

	log, err := f.NginxLogs()
	if err != nil {
		Logf("Unexpected error obtaining NGINX logs: %v", err)
		return
	}

	ginkgo.By("Dumping NGINX logs")
	Logf("%v", log)

	o, err = f.NamespaceContent()
	if err != nil {
		Logf("Unexpected error obtaining namespace information: %v", err)
		return
	}

	ginkgo.By("Dumping namespace content")
	Logf("%v", o)
}

// IngressNginxDescribe wrapper function for ginkgo describe. Adds namespacing.
func IngressNginxDescribe(text string, body func()) bool {
	return ginkgo.Describe(text, body)
}

// DescribeAnnotation wrapper function for ginkgo describe. Adds namespacing.
func DescribeAnnotation(text string, body func()) bool {
	return ginkgo.Describe("[Annotations] "+text, body)
}

// DescribeSetting wrapper function for ginkgo describe. Adds namespacing.
func DescribeSetting(text string, body func()) bool {
	return ginkgo.Describe("[Setting] "+text, body)
}

// MemoryLeakIt is wrapper function for ginkgo It.  Adds "[MemoryLeak]" tag and makes static analysis easier.
func MemoryLeakIt(text string, body interface{}) bool {
	return ginkgo.It(text+" [MemoryLeak]", body)
}

// GetNginxIP returns the number of TCP port where NGINX is running
func (f *Framework) GetNginxIP() string {
	s, err := f.KubeClientSet.
		CoreV1().
		Services(f.Namespace).
		Get(context.TODO(), "nginx-ingress-controller", metav1.GetOptions{})
	assert.Nil(ginkgo.GinkgoT(), err, "obtaining NGINX IP address")
	return s.Spec.ClusterIP
}

// GetNginxPodIP returns the IP addresses of the running pods
func (f *Framework) GetNginxPodIP() string {
	return f.pod.Status.PodIP
}

// GetURL returns the URL should be used to make a request to NGINX
func (f *Framework) GetURL(scheme RequestScheme) string {
	ip := f.GetNginxIP()
	return fmt.Sprintf("%v://%v", scheme, ip)
}

// GetIngressNGINXPod returns the ingress controller running pod
func (f *Framework) GetIngressNGINXPod() *corev1.Pod {
	return f.pod
}

// UpdateIngressNGINXPod search and updates the ingress controller running pod
func (f *Framework) updateIngressNGINXPod() error {
	var err error
	f.pod, err = getIngressNGINXPod(f.Namespace, f.KubeClientSet)
	return err
}

// WaitForNginxServer waits until the nginx configuration contains a particular server section.
// `cfg` passed to matcher is normalized by replacing all tabs and spaces with single space.
func (f *Framework) WaitForNginxServer(name string, matcher func(cfg string) bool) {
	err := wait.Poll(Poll, DefaultTimeout, f.matchNginxConditions(name, matcher))
	assert.Nil(ginkgo.GinkgoT(), err, "waiting for nginx server condition/s")
	Sleep(1 * time.Second)
}

// WaitForNginxConfiguration waits until the nginx configuration contains a particular configuration
// `cfg` passed to matcher is normalized by replacing all tabs and spaces with single space.
func (f *Framework) WaitForNginxConfiguration(matcher func(cfg string) bool) {
	err := wait.Poll(Poll, DefaultTimeout, f.matchNginxConditions("", matcher))
	assert.Nil(ginkgo.GinkgoT(), err, "waiting for nginx server condition/s")
	Sleep(1 * time.Second)
}

// WaitForNginxCustomConfiguration waits until the nginx configuration given part (from, to) contains a particular configuration
func (f *Framework) WaitForNginxCustomConfiguration(from string, to string, matcher func(cfg string) bool) {
	err := wait.Poll(Poll, DefaultTimeout, f.matchNginxCustomConditions(from, to, matcher))
	assert.Nil(ginkgo.GinkgoT(), err, "waiting for nginx server condition/s")
}

// NginxLogs returns the logs of the nginx ingress controller pod running
func (f *Framework) NginxLogs() (string, error) {
	if isRunning, err := podRunningReady(f.pod); err == nil && isRunning {
		return Logs(f.KubeClientSet, f.Namespace, f.pod.Name)
	}

	return "", fmt.Errorf("no nginx ingress controller pod is running (logs)")
}

func (f *Framework) matchNginxConditions(name string, matcher func(cfg string) bool) wait.ConditionFunc {
	return func() (bool, error) {
		var cmd string
		if name == "" {
			cmd = fmt.Sprintf("cat /etc/nginx/nginx.conf")
		} else {
			cmd = fmt.Sprintf("cat /etc/nginx/nginx.conf | awk '/## start server %v/,/## end server %v/'", name, name)
		}

		o, err := f.ExecCommand(f.pod, cmd)
		if err != nil {
			return false, nil
		}

		if klog.V(10).Enabled() && len(o) > 0 {
			klog.InfoS("NGINX", "configuration", o)
		}

		// passes the nginx config to the passed function
		if matcher(strings.Join(strings.Fields(o), " ")) {
			return true, nil
		}

		return false, nil
	}
}

func (f *Framework) matchNginxCustomConditions(from string, to string, matcher func(cfg string) bool) wait.ConditionFunc {
	return func() (bool, error) {
		cmd := fmt.Sprintf("cat /etc/nginx/nginx.conf| awk '/%v/,/%v/'", from, to)

		o, err := f.ExecCommand(f.pod, cmd)
		if err != nil {
			return false, nil
		}

		if klog.V(10).Enabled() && len(o) > 0 {
			klog.InfoS("NGINX", "configuration", o)
		}

		// passes the nginx config to the passed function
		if matcher(strings.Join(strings.Fields(o), " ")) {
			return true, nil
		}

		return false, nil
	}
}

func (f *Framework) getConfigMap(name string) (*v1.ConfigMap, error) {
	if f.KubeClientSet == nil {
		return nil, fmt.Errorf("KubeClientSet not initialized")
	}

	config, err := f.KubeClientSet.
		CoreV1().
		ConfigMaps(f.Namespace).
		Get(context.TODO(), name, metav1.GetOptions{})
	if err != nil {
		return nil, err
	}

	return config, err
}

// SetNginxConfigMapData sets ingress-nginx's nginx-ingress-controller configMap data
func (f *Framework) SetNginxConfigMapData(cmData map[string]string) {
	cfgMap, err := f.getConfigMap("nginx-ingress-controller")
	assert.Nil(ginkgo.GinkgoT(), err)
	assert.NotNil(ginkgo.GinkgoT(), cfgMap, "expected a configmap but none returned")

	cfgMap.Data = cmData

	fn := func() {
		_, err = f.KubeClientSet.
			CoreV1().
			ConfigMaps(f.Namespace).
			Update(context.TODO(), cfgMap, metav1.UpdateOptions{})
		assert.Nil(ginkgo.GinkgoT(), err, "updating configuration configmap")
	}

	f.WaitForReload(fn)
}

// CreateConfigMap creates a new configmap in the current namespace
func (f *Framework) CreateConfigMap(name string, data map[string]string) {
	_, err := f.KubeClientSet.CoreV1().ConfigMaps(f.Namespace).Create(context.TODO(), &v1.ConfigMap{
		ObjectMeta: metav1.ObjectMeta{
			Name:      name,
			Namespace: f.Namespace,
		},
		Data: data,
	}, metav1.CreateOptions{})
	assert.Nil(ginkgo.GinkgoT(), err, "creating configMap")
}

// UpdateNginxConfigMapData updates single field in ingress-nginx's nginx-ingress-controller map data
func (f *Framework) UpdateNginxConfigMapData(key string, value string) {
	config, err := f.getConfigMap("nginx-ingress-controller")
	assert.Nil(ginkgo.GinkgoT(), err)
	assert.NotNil(ginkgo.GinkgoT(), config, "expected a configmap but none returned")

	config.Data[key] = value

	fn := func() {
		_, err = f.KubeClientSet.
			CoreV1().
			ConfigMaps(f.Namespace).
			Update(context.TODO(), config, metav1.UpdateOptions{})
		assert.Nil(ginkgo.GinkgoT(), err, "updating configuration configmap")
	}

	f.WaitForReload(fn)
}

// WaitForReload calls the passed function and
// asser it has caused at least 1 reload.
func (f *Framework) WaitForReload(fn func()) {
	initialReloadCount := getReloadCount(f.pod, f.Namespace, f.KubeClientSet)

	fn()

	count := 0
	err := wait.Poll(1*time.Second, DefaultTimeout, func() (bool, error) {
		reloads := getReloadCount(f.pod, f.Namespace, f.KubeClientSet)
		// most of the cases reload the ingress controller
		// in cases where the value is not modified we could wait forever
		if count > 5 && reloads == initialReloadCount {
			return true, nil
		}

		count++

		return (reloads > initialReloadCount), nil
	})
	assert.Nil(ginkgo.GinkgoT(), err, "while waiting for ingress controller reload")
}

func getReloadCount(pod *corev1.Pod, namespace string, client kubernetes.Interface) int {
	events, err := client.CoreV1().Events(namespace).Search(scheme.Scheme, pod)
	assert.Nil(ginkgo.GinkgoT(), err, "obtaining NGINX Pod")

	reloadCount := 0
	for _, e := range events.Items {
		if e.Reason == "RELOAD" && e.Type == corev1.EventTypeNormal {
			reloadCount++
		}
	}

	return reloadCount
}

// DeleteNGINXPod deletes the currently running pod. It waits for the replacement pod to be up.
// Grace period to wait for pod shutdown is in seconds.
func (f *Framework) DeleteNGINXPod(grace int64) {
	ns := f.Namespace

	err := f.KubeClientSet.CoreV1().Pods(ns).Delete(context.TODO(), f.pod.GetName(), *metav1.NewDeleteOptions(grace))
	assert.Nil(ginkgo.GinkgoT(), err, "deleting ingress nginx pod")

	err = wait.Poll(Poll, DefaultTimeout, func() (bool, error) {
		err := f.updateIngressNGINXPod()
		if err != nil || f.pod == nil {
			return false, nil
		}
		return f.pod.GetName() != "", nil
	})
	assert.Nil(ginkgo.GinkgoT(), err, "while waiting for ingress nginx pod to come up again")
}

// HTTPDumbTestClient returns a new httpexpect client without BaseURL.
func (f *Framework) HTTPDumbTestClient() *httpexpect.HTTPRequest {
	return f.newHTTPTestClient(nil, false)
}

// HTTPTestClient returns a new HTTPRequest client for end-to-end HTTP testing.
func (f *Framework) HTTPTestClient() *httpexpect.HTTPRequest {
	return f.newHTTPTestClient(nil, true)
}

// HTTPTestClientWithTLSConfig returns a new httpexpect client for end-to-end
// HTTP testing with a custom TLS configuration.
func (f *Framework) HTTPTestClientWithTLSConfig(config *tls.Config) *httpexpect.HTTPRequest {
	return f.newHTTPTestClient(config, true)
}

func (f *Framework) newHTTPTestClient(config *tls.Config, setIngressURL bool) *httpexpect.HTTPRequest {
	if config == nil {
		config = &tls.Config{
			InsecureSkipVerify: true,
		}
	}
	var baseURL string
	if setIngressURL {
		baseURL = f.GetURL(HTTP)
	}

	return httpexpect.NewRequest(baseURL, &http.Client{
		Transport: &http.Transport{
			TLSClientConfig: config,
		},
		CheckRedirect: func(req *http.Request, via []*http.Request) error {
			return http.ErrUseLastResponse
		},
	}, httpexpect.NewAssertReporter())
}

// WaitForNginxListening waits until NGINX starts accepting connections on a port
func (f *Framework) WaitForNginxListening(port int) {
	err := waitForPodsReady(f.KubeClientSet, DefaultTimeout, 1, f.Namespace, metav1.ListOptions{
		LabelSelector: "app.kubernetes.io/name=ingress-nginx",
	})
	assert.Nil(ginkgo.GinkgoT(), err, "waiting for ingress pods to be ready")

	podIP := f.GetNginxIP()
	err = wait.Poll(500*time.Millisecond, DefaultTimeout, func() (bool, error) {
		hostPort := net.JoinHostPort(podIP, fmt.Sprintf("%v", port))
		conn, err := net.Dial("tcp", hostPort)
		if err != nil {
			return false, nil
		}

		defer conn.Close()

		return true, nil
	})
	assert.Nil(ginkgo.GinkgoT(), err, "waiting for ingress controller pod listening on port 80")
}

// WaitForPod waits for a specific Pod to be ready, using a label selector
func (f *Framework) WaitForPod(selector string, timeout time.Duration, shouldFail bool) {
	err := waitForPodsReady(f.KubeClientSet, timeout, 1, f.Namespace, metav1.ListOptions{
		LabelSelector: selector,
	})

	if shouldFail {
		assert.NotNil(ginkgo.GinkgoT(), err, "waiting for pods to be ready")
	} else {
		assert.Nil(ginkgo.GinkgoT(), err, "waiting for pods to be ready")
	}
}

// UpdateDeployment runs the given updateFunc on the deployment and waits for it to be updated
func UpdateDeployment(kubeClientSet kubernetes.Interface, namespace string, name string, replicas int, updateFunc func(d *appsv1.Deployment) error) error {
	deployment, err := kubeClientSet.AppsV1().Deployments(namespace).Get(context.TODO(), name, metav1.GetOptions{})
	if err != nil {
		return err
	}

	if updateFunc != nil {
		if err := updateFunc(deployment); err != nil {
			return err
		}

		err = waitForDeploymentRollout(kubeClientSet, deployment)
		if err != nil {
			return err
		}
	}

	if *deployment.Spec.Replicas != int32(replicas) {
		deployment.Spec.Replicas = NewInt32(int32(replicas))
		_, err = kubeClientSet.AppsV1().Deployments(namespace).Update(context.TODO(), deployment, metav1.UpdateOptions{})
		if err != nil {
			return fmt.Errorf("scaling the number of replicas to %d: %w", replicas, err)
		}

		err = waitForDeploymentRollout(kubeClientSet, deployment)
		if err != nil {
			return err
		}
	}

	err = waitForPodsReady(kubeClientSet, DefaultTimeout, replicas, namespace, metav1.ListOptions{
		LabelSelector: fields.SelectorFromSet(fields.Set(deployment.Spec.Template.ObjectMeta.Labels)).String(),
	})
	if err != nil {
		return fmt.Errorf("waiting for nginx-ingress-controller replica count to be %d: %w", replicas, err)
	}

	return nil
}

func waitForDeploymentRollout(kubeClientSet kubernetes.Interface, resource *appsv1.Deployment) error {
	return wait.Poll(Poll, 5*time.Minute, func() (bool, error) {
		d, err := kubeClientSet.AppsV1().Deployments(resource.Namespace).Get(context.TODO(), resource.Name, metav1.GetOptions{})
		if apierrors.IsNotFound(err) {
			return false, nil
		}

		if err != nil {
			return false, nil
		}

		if d.DeletionTimestamp != nil {
			return false, fmt.Errorf("deployment %q is being deleted", resource.Name)
		}

		if d.Generation <= d.Status.ObservedGeneration && d.Status.UpdatedReplicas == d.Status.Replicas && d.Status.UnavailableReplicas == 0 {
			return true, nil
		}

		return false, nil
	})
}

// UpdateIngress runs the given updateFunc on the ingress
func UpdateIngress(kubeClientSet kubernetes.Interface, namespace string, name string, updateFunc func(d *networking.Ingress) error) error {
	ingress, err := kubeClientSet.NetworkingV1().Ingresses(namespace).Get(context.TODO(), name, metav1.GetOptions{})
	if err != nil {
		return err
	}

	if ingress == nil {
		return fmt.Errorf("there is no ingress with name %v in namespace %v", name, namespace)
	}

	if ingress.ObjectMeta.Annotations == nil {
		ingress.ObjectMeta.Annotations = map[string]string{}
	}

	if err := updateFunc(ingress); err != nil {
		return err
	}

	_, err = kubeClientSet.NetworkingV1().Ingresses(namespace).Update(context.TODO(), ingress, metav1.UpdateOptions{})
	if err != nil {
		return err
	}

	Sleep(1 * time.Second)
	return nil
}

// NewSingleIngressWithTLS creates a simple ingress rule with TLS spec included
func NewSingleIngressWithTLS(name, path, host string, tlsHosts []string, ns, service string, port int, annotations map[string]string) *networking.Ingress {
	return newSingleIngressWithRules(name, path, host, ns, service, port, annotations, tlsHosts)
}

// NewSingleIngress creates a simple ingress rule
func NewSingleIngress(name, path, host, ns, service string, port int, annotations map[string]string) *networking.Ingress {
	return newSingleIngressWithRules(name, path, host, ns, service, port, annotations, nil)
}

func NewSingleIngressWithIngressClass(name, path, host, ns, service, ingressClass string, port int, annotations map[string]string) *networking.Ingress {
	ing := newSingleIngressWithRules(name, path, host, ns, service, port, annotations, nil)
	ing.Spec.IngressClassName = &ingressClass
	return ing
}

// NewSingleIngressWithMultiplePaths creates a simple ingress rule with multiple paths
func NewSingleIngressWithMultiplePaths(name string, paths []string, host, ns, service string, port int, annotations map[string]string) *networking.Ingress {
	pathtype := networking.PathTypePrefix
	spec := networking.IngressSpec{
		IngressClassName: GetIngressClassName(ns),
		Rules: []networking.IngressRule{
			{
				Host: host,
				IngressRuleValue: networking.IngressRuleValue{
					HTTP: &networking.HTTPIngressRuleValue{},
				},
			},
		},
	}

	for _, path := range paths {
		spec.Rules[0].IngressRuleValue.HTTP.Paths = append(spec.Rules[0].IngressRuleValue.HTTP.Paths, networking.HTTPIngressPath{
			Path:     path,
			PathType: &pathtype,
			Backend: networking.IngressBackend{
				Service: &networking.IngressServiceBackend{
					Name: service,
					Port: networking.ServiceBackendPort{
						Number: int32(port),
					},
				},
			},
		})
	}

	return newSingleIngress(name, ns, annotations, spec)
}

func newSingleIngressWithRules(name, path, host, ns, service string, port int, annotations map[string]string, tlsHosts []string) *networking.Ingress {
	pathtype := networking.PathTypePrefix
	spec := networking.IngressSpec{
		IngressClassName: GetIngressClassName(ns),
		Rules: []networking.IngressRule{
			{
				IngressRuleValue: networking.IngressRuleValue{
					HTTP: &networking.HTTPIngressRuleValue{
						Paths: []networking.HTTPIngressPath{
							{
								Path:     path,
								PathType: &pathtype,
								Backend: networking.IngressBackend{
									Service: &networking.IngressServiceBackend{
										Name: service,
										Port: networking.ServiceBackendPort{
											Number: int32(port),
										},
									},
								},
							},
						},
					},
				},
			},
		},
	}

	// allow ingresses without host field
	if host != "" {
		spec.Rules[0].Host = host
	}

	if len(tlsHosts) > 0 {
		spec.TLS = []networking.IngressTLS{
			{
				Hosts:      tlsHosts,
				SecretName: host,
			},
		}
	}

	return newSingleIngress(name, ns, annotations, spec)
}

// NewSingleIngressWithBackendAndRules creates an ingress with both a default backend and a rule
func NewSingleIngressWithBackendAndRules(name, path, host, ns, defaultService string, defaultPort int, service string, port int, annotations map[string]string) *networking.Ingress {
	pathtype := networking.PathTypePrefix
	spec := networking.IngressSpec{
		IngressClassName: GetIngressClassName(ns),
		DefaultBackend: &networking.IngressBackend{
			Service: &networking.IngressServiceBackend{
				Name: defaultService,
				Port: networking.ServiceBackendPort{
					Number: int32(defaultPort),
				},
			},
		},
		Rules: []networking.IngressRule{
			{
				Host: host,
				IngressRuleValue: networking.IngressRuleValue{
					HTTP: &networking.HTTPIngressRuleValue{
						Paths: []networking.HTTPIngressPath{
							{
								Path:     path,
								PathType: &pathtype,
								Backend: networking.IngressBackend{
									Service: &networking.IngressServiceBackend{
										Name: service,
										Port: networking.ServiceBackendPort{
											Number: int32(port),
										},
									},
								},
							},
						},
					},
				},
			},
		},
	}

	return newSingleIngress(name, ns, annotations, spec)
}

// NewSingleCatchAllIngress creates a simple ingress with a catch-all backend
func NewSingleCatchAllIngress(name, ns, service string, port int, annotations map[string]string) *networking.Ingress {
	spec := networking.IngressSpec{
		IngressClassName: GetIngressClassName(ns),
		DefaultBackend: &networking.IngressBackend{
			Service: &networking.IngressServiceBackend{
				Name: service,
				Port: networking.ServiceBackendPort{
					Number: int32(port),
				},
			},
		},
	}
	return newSingleIngress(name, ns, annotations, spec)
}

func newSingleIngress(name, ns string, annotations map[string]string, spec networking.IngressSpec) *networking.Ingress {
	ing := &networking.Ingress{
		ObjectMeta: metav1.ObjectMeta{
			Name:      name,
			Namespace: ns,
		},
		Spec: spec,
	}

	if annotations == nil {
		annotations = make(map[string]string)
	}

	ing.SetAnnotations(annotations)

	return ing
}

// defaultWaitDuration default sleep time for operations related
// to the API server and NGINX reloads.
var defaultWaitDuration = 5 * time.Second

// Sleep pauses the current goroutine for at least the duration d.
// If no duration is defined, it uses a default
func Sleep(duration ...time.Duration) {
	sleepFor := defaultWaitDuration
	if len(duration) != 0 {
		sleepFor = duration[0]
	}

	time.Sleep(sleepFor)
}

func loadConfig() (*restclient.Config, error) {
	config, err := rest.InClusterConfig()
	if err != nil {
		return nil, err
	}

	config.UserAgent = "ingress-nginx-e2e"
	return config, nil
}

redpajama_set_name: RedPajamaGithub


Sick of hearing nothing back from journalists after you send an e-mail pitch? Avoid these common openers that kill interest instantly.
You know the disclaimer: "Don't try this at home." Well, here's a work-related disclaimer: Don't try these on-the-job.
If you're sending e-mail pitches to reporters, it's a good idea to do some basic homework and tailor your pitch. My friend Gordon Deal is the host of The Wall Street Journal This Morning. It's a syndicated business and news program that's broadcast on 200 radio stations nationwide.
1. "Dear Gordon Deal" or "Dear Radio Show Host." That tells me I'm just an e-mail blast. I know this is intended for someone who just happened to be on the computer and picked it up. I am not interested whatsoever.


I said, (because you know me your blogger—neither silent nor retiring) that Gov grew up nearby skiing and his sister Jo coached the Roxbury ski team (a ski team which btw had the no 1 seed in the division in Nick Vajtay) and that Jo's father-in-law Gary Hinkley started the mountain and that he still skied here everyday. That it is that kind of place where daughter-in-law of first owner coaches son of current owner, who is a fantastic racer. And Jo's husband Allen Hinkley is also on the ski patrol here.
Gary and Allen Hinkley on the hill together.
And this the thing I was trying to say, trying to convey, that Platty is great because of those things, the family part…. Yes, it has ripping great terrain and steeps that are rare around here, but this other part sets Plattekill apart.
I asked the guy how the snow had been in Jackson when he was there in January and he said icy. I nodded. I didn't talk about how our season has been with snow and then rain in a heartbreaking cycle, but that hasn't stopped people skiing. That day was bluebird with hard snow and – still – people had huge smiles.
I told man-in-black that if he hurried, Gary Hinkley was still there. Really this is a sidelong way to get to Gary and his story. There are many things that fill me with pride at Platty like walking in with John in the morning at 8 am, and how he knows everyone's name and shakes their hands and says hello. The warmth is not just from those skiing regulars but everyone—those who work there parking cars, or say Sam on the double chair chomping at the bit to get out and ski and talking about how your every run is. It's that kind of place (and that John has been skiing here for 40 years. His father heard about it when John was little and then came up and kept coming. Now he has a house that he will pass down to his kids so they will come up, and he still remembers his first day here when he was, maybe, 13).
But Gary, let me stay on point. That morning that Saturday of President's Week in the lodge he was booting up before 8:15. The man is an octogenarian and still skiing every day the mountain is open. He always wears the same sweater I love that looks like it comes from about 1989 and the same jacket (similar era) geometric stripes and chevrons. And, then he has these great skis, which are not vintage but the best skis you can be on: Kästle. To see him doing run after run after run on every slope every day in every condition is inspiring.
Like many friendships at Platty we met on the chair. He speaks with his words chewed down as if they were the Catskill Mountains themselves and he talked about the rope tow, the first one that only went a quarter of the way up. And, he still works construction not because he has to but to keep his hands in.
Gary is the heart and soul of keeping it real.


text:
JABBERWOCKY MEDIA
The Vorpal Mind
Living, Eating and Breathing Game Design (Part 2)…
So my academic work from the previous post is all geared towards graduating in December, but a man (and his family) gotta eat, and that means making stuff to sell. In my case, that means more games.
I have three games that fall into this category, but only one of them is actually going to get any attention before next year, considering my rather hefty workload.
BATTLE BLOCKS
I've always loved wargames. Moving massed armies around a board and trying to go all Sun Tzu on your opponents backside is a hobby that has consumed a good 3 decades of my life. And up until about 6 years ago, I enjoyed the other aspects of the wargaming hobby that I now have absolutely no time for: building and painting the models and scenery that made such battles possible.
More recently though, it is nigh impossible for me to really enjoy that hobby anymore and, like many guys my age, I'm always looking for options to ply a good table-top wargame (particularly my favorites, Warmaster Ancients and De Bellis Antiquitatis, for which these base sizes are perfect) without having to invest the time and money in hundreds of models. that's when it struck me to come up with that option.
A selection of unit labels for Greek Battle Blocks (all images © 2013 Jabberwocky Media)
Enter Battle Blocks. Basically I found that if you take a 40mmx20mmx6mm wooden block and plop a sticker down on it to give you a general idea of what sort of unit it represents, you not only can cheaply create a number of armies for testing out strategies or mixing up forces (which is particularly good for Historical Wargaming where the armies tend to be grouped rather tightly by era) but the look and feel of the blocks moving along a
map recreates the mood of ancient generals controlling their forces from a tent on the back of the line. Very thematic. And they work for any ancients type game because unit composition is fairly standard. This for instance:
Hoplites (© 2013 Jabberwocky Media)
A standard greek hoplite armed with spear, sword, shield and light armor. The shield shows a unit insignia so that you can group blocks appropriately (in Warmaster Ancients, for instance, a unit will be comprised of three such blocks) or so you can
show army affiliation in the case of grand strategic games like DBA (the above would represent a Spartan Hoplite and, no, I'm not yelling that out).
I've got a full batch of Greeks done up and I'm working on the Persians off and on (trying to draw cool looking Persian headgear that reads well at this size is a bit of a challenge) and I'll likely try and get these out as a PDF sometime in January or February (after the Super Bowl). No Kickstarter, just a PDF that folks can buy and print out on sticker paper with instructions for constructing the blocks, and possible an easy set of quick-play wargames rules to go with them.
VOID HUNTERS: THE DCC GAME OF SEVENTIES SCIENCE FICTION
I do play games at least once a week. I have no business being a game designer if I'm not willing to make the time to do that. And I'm not talking about my own stuff, but other people's games. It's good for clearing the ol' mental palette.
One of the games I've been playing is Dungeon Crawl Classics, which is a fantasy game with a strong 1970's vibe. You heard me jive turkey! I'm gaming like it's 1974 and I'm lovin' it!
Well, since I can pretty much write an RPG in my sleep, and DCC is so popular at the moment, I figured I'd create a sci-fi version of it and, after discussions with Joseph Goodman and signing a licensing agreement, I'm going to start work on Void Hunters, the DCC game of Seventies Science Fiction in November, while my For Glory! Kickstarter is rolling, with a Kickstarter to follow in the Spring of 14.
The default setting is focused on the horrors of space exploration, including isolation, alien terrors, and weird quirks of science and nature that defy man's understanding of the universe. The rules will follow closely in the gritty mold of DCC and reinforce the notion that space is a cold, lonely, uncaring thing that will kill the unprepared, and, when faced with an infinite variety of things that can kill you, it's practically impossible to be totally prepared.
Adventures would largely be based around sandbox style exploration of the universe, discovering the remains of other civilizations that died out long before man took his first steps into the universe, fighting against alien super-predators that are bred in the darkest and harshest environments, and salvaging the remains of lost expeditions that fell prey to unknown forces or the predations of their fellow men. Basically, DCC In Spaaace! But there will information for setting up Feudal Dark Sci-Fi settings (like Dune or 40k) and War Amongst the Stars settings (like Ender's Game or Starship Troopers). Here is a list of the game's major influences…
All the Stars a Stage (James Blish, 1971) – The imminent destruction of the sun forces humanity (now a matriarchal society in which men are considered largely useless) to flee for the stars in untested starships. Over 50 years of dangerous exploration to find a suitable homeworld ensue.
Dune (Frank Herbert, 1965) – The prime example of the Feudal Sci-Fi setting, the universal order has regressed into a series of interstellar Dukedoms ruled over by an Emperor; space travel and psionic disciplines along with human computer/assassins are controlled by guilds; and Machiavellian schemes, political assassination and interstellar war are the primary past-times of the noble houses.
Ender's Game (Orson Scott Card, 1985) – Although the full novel came out in 1985, the basis for it appeared as a novella in Analog magazine in 1977. Mankind, still recovering after a narrowly won war against an implacably alien insect race known as 'the buggers,' starts training the next generation of children to become generals and launch a pre-emptive strike against the aliens before they can regroup and return to finish humanity off.
Gateway (Fredrick Pohl, 1977) – The core premise of this story, an ancient and long dead alien race leave behind a stargate and several hundred ships for humanity to discover and experiment with, would make an excellent setup for a Void Hunter's campaign. The fact that the poor humans have little control over where they are going (Habitable world? Dead world? Edge of a black hole?) and when they might get there (Do we have enough supplies to last the trip or will we starve in space?) just makes it all the more fun. Throw in a 1849 era gold-rush mentality as people risk it all for a chance to get rich off the unknown, and a greedy corporation looking to exploit them when/if they return, and you've got the perfect recipe for adventure.
Rendezvous with Rama (Arthur C. Clarke, 1972) – The subject of this novel is another space born artifact from a long lost alien civilization, which would qualify as an extremely unusual hulk: part space craft, part world. The 'biots' also make for highly interesting alien fauna.
Ringworld (Larry Niven, 1970) – Louis Wu and company crash land on the mother of ancient archeological artifacts, a Ringworld, and are forced to explore it's massive, bizarre structure in order to find a way to escape. While not all that dark, and featuring a number of different alien races, Ringworld does provide a perfect example of exploring the remains of a lost alien civilization while interacting with the retro-grade descendents and strange creatures that make up the flora a fauna around it. It is a massive, campaign worthy, sci-fi sandbox.
Starship Troopers (Robert Heinlein, 1959) – For more military based campaigns, there isn't a great deal of combat in the book, but there is a great deal on the no holds barred, anything to survive mentality humanity may adopt in order to cope with the extreme circumstances surrounding interstellar war. Brutal training for a brutal people to fight a brutal enemy in a variety of brutal environments..
Solaris (Stanisław Lem, 1970) – The perfect example of what happens when man inadvertently discovers that life doesn't neatly fit in the pigeonhole that he places it in, and the consequences that emerge from that arrogant assumption. I won't give away the core story element that makes this novel unique, but suffice to say, sometimes the observer doesn't realize that they're the one under the microscope.
Warhammer 40k Rogue Trader (Rick Preistley, 1987) – Although a game book, not strictly straight fiction, the first edition of the world-popular WH40k game set forth a dark interstellar empire in its decline, its teaming subjects living a feudal existence underneath a brutal regime venerating a corpse Emperor and beset by external enemies and internal corruption. The original is still the best and presents humanity and space as terrifyingly uncaring and full of black humor. It also provides a ton of story seeds revolving around the exploration of new worlds, the rediscovery of lost worlds and salvaging of massive 'space hulks,' essentially mega-dungeons in space.
Alien (1979) – A crew of space miners, ordered by the Company to investigate a signal coming from a mysterious moon, end up exploring a dangerous world, encountering the crashed hulk of an alien spaceship and bring aboard a parasitic alien life form that stalks the crew in the 'dungeon' of their own spacecraft. This is the quintessential Void Hunter adventure in the Dark Sci-Fi paradigm.
The Black Hole (1979) – No aliens, space demons or lost civilizations, just a mad scientist in a massive 'lost' space ship (the sci-fi equivalent of an evil wizard's dungeon complete with the robot equivalent of orcs and an ogre) perched on the edge of the most destructive force in the universe with all the danger that entails.
Dark Star (1974) –Somewhat less serious than some might expect from the title, the comedy is still black as the void of space, the end result of the film is fairly fatalistic and the clear insanity of the crew after a long space voyage (not to mention the dark nature of their ongoing mission) is likely to remind players and GMs of the black humor and absurdity that even the most well meaning and serious RPG adventure devolves into after a long night's play. It's like somebody took an actual sci-fi RPG session, wrote it into a screenplay and then filmed the results.
Event Horizon (1997) –This movie came out well after the seventies , but it encapsulates the horrors of space exploration and turns them up to 11. A search and rescue team finds a spacecraft with a prototype interstellar drive that went missing 7 years earlier. As they explore the 'hulk' they find that, on its maiden voyage, the Event Horizon uncovered horrors beyond human comprehension. It's 'The Shining' in space with a little bit of 'Hellraiser' thrown in for good measure.
Outland (1981) – Again, shortly outside of the seventies, but still deep in the ethos of many of the stories from that time. No aliens, just man's inhumanity to man in the pursuit of interstellar resources and profit. Often described as 'High Noon in Space,' nothing better captures the frontier nature of space, where help is not around the corner and running away is not always an option when you're surrounded by an environment that is totally antithetical to human life.
Silent Running (1972) – While this film is set within the solar system, it has many elements that define seventies sci-fi. Man's inhumanity and self-destructive nature, the delicate nature of life and maintaining it in the cold dark of space, and a perfect example of how some last remnant of a lost civilization could end up floating in space (becoming a Hulk, in VH vernacular).
A lot of the science fiction I read that really defined the themes of seventies science fiction came from a selection of magazines that were popular during that decade and into the eighties as well. I can't necessarily remember the specific stories or the particular authors, but the influence of these periodicals, whose stories reflected the time they were written in, will impress the feel of the era on you like nothing else can.
Omni – A magizine of technology, science and science fiction, it boasted articles featuring some of the most influential writers, scientists and artists of the time, including Carl Sagan, Isaac Asimov, and H.R.Giger. The stories were a bit on the weird side. One story that sticks in my brain to this day involved an alien shape changer that absorbed people to feed itself and then took on their form and memories. It ha d escaped from a government black site and became the lover of a woman who took it in after she found out it had eaten and taken the form of her ex-husband. She basically kept it as a lover until she started to think it might leave her, at which point she turned it over to the government, stoned out of its mind on oregano, which acted as a powerful and addictive drug for it. Yeah, that's the kind of weird stuff the seventies was known for…
Analog – The premier science fiction magazine of the time, it collected the works of authors known and unknown and many of its stories really reflected the zeitgeist of the time, one of uncertainty and fear of the unknown. Find yourself a dozen or so back copies form this period and you'll probably have enough material for an equal number of adventures.
There are a ton of other ideas fighting for space in my head, but one of the things I've sussed out in grad school is my working limitations. I can handle about three things at any one time (although I have reams of ideas noted down for future development). At the moment, For Glory!, Quarterback Blitz and Void Hunters are what I'm splitting my time between, with all of them in various stages of completion, slowly rolling off the assembly line of my mind one after the other. Once I graduate, I'm going to have to assign one of those three slots to non-gaming work (most likely teaching) so my production will slow down a bit, but I can comfortably conceive of releasing two or three things a year (especially if I get summers off). Hopefully, those initial three will establish Jabberwocky Media as a top-notch game company and firmly establish my vocation as professional Game Designer…
This entry was posted in The Vorpal Mind and tagged Battle Blocks, BoHM, For Glory, Game Design, Graduate School, Kickstarter, Personal, Quarterback Blitz, Void Hunters on October 18, 2013 by jabber.
← Living, Eating and Breathing Game Design (Part 1)… Void Hunters: The DCC Game of Seventies Science Fiction… →
One thought on "Living, Eating and Breathing Game Design (Part 2)…"
Pingback: Void Hunters: Chapter 1… |
ART REFLECTS LIFE… IN THE METALSPHERE…
GAME AESTHETICS: TACTICAL VS. STRATEGIC FOCUS
GAME AESTHETICS: PLAYER SKILL VS. MECHANICAL SKILL
GAME AESTHETICS: INTERACTION VS. ISOLATION
GAME AESTHETICS: AGENCY VS. LINEARITY
GAME AESTHETICS: INTRODUCTION… | on GAME AESTHETICS: PLAYER SKILL VS. MECHANICAL SKILL
GAME AESTHETICS: INTRODUCTION… | on GAME AESTHETICS: INTERACTION VS. ISOLATION
GAME AESTHETICS: INTRODUCTION… | on GAME AESTHETICS: AGENCY VS. LINEARITY
GAME AESTHETICS: INTRODUCTION… | on GAME AESTHETICS: DETERMINACY VS. INDETERMINACY
GAME AESTHETICS: INTRODUCTION… | on GAME AESTHETICS: SIMPLICITY VS. COMPLEXITY

redpajama_set_name: RedPajamaCommonCrawl


text:
Notre Dame Patents
Collection Details Full Record
This collection brings together all of the patents assigned to the University of Notre Dame from 1952 to the present, plus other selected patents prior to 1952. Each record includes a full-text searchable and accessible PDF document for the corresponding invention. The record also includes the present-day academic department with which the inventor was or would have been associated.
Why patents? According to the University's IDEA Center, "Part of the University's public service mission is to ensure that the results of its research are made available for public use and benefit. This is accomplished in many ways: through educating students, publishing results of research, and ensuring that inventions are developed into useful products and services for the benefit of the public."
"Today, our research universities play an even more vital role in creating a better future—not only by educating close to 600,000 graduate students in science and engineering every year, but also, and critically, by performing more than 15% of U.S. R&D in 2011—and according to 2012 NSF data, accounted for the majority (53%) of national basic research. This research, some basic, some applied or 'translational' creates new technologies, new products and services, medicines, diagnostics — the list is long and impressive — but also, this research gives rise to entire new industries." (David Winwood, "The Importance of Patents and Academic Technology Transfer," March 26, 2015)
The collection also includes the most famous patent associated with Notre Dame, U.S. patent 1,811,959 from 1931, "Vinyl derivatives of acetylene and method of preparing the same" — in other words, synthetic rubber. Invented by Rev. Fr. Julius Nieuwland, CSC, and assigned to DuPont, this patent did, in fact, give rise to entire new industries. More about this invention may be found at the National Inventors Hall of Fame.
These patents are one more example of the University fulfilling Rev. Fr. Sorin's vision of becoming a "powerful force for good."
Collection filter
Garrett C. Moraski 2
Jonathan Stefely 2[remove]
Marvin J. Miller 2[remove]
U.S. Patent and Trademark Office 1
United States Patent and Trademark Office 1
Creator: Marvin J. Miller remove × Creator: Jonathan Stefely remove × Collection: Notre Dame Patents remove ×
Anti-cancer compounds, synthesis thereof, and methods of using same
Marvin J. Miller, Garrett C. Moraski, Jonathan Stefely
Embodiments relate to the field of chemistry and biochemistry, and, more specifically, to anti-cancer compounds, synthesis thereof, and methods of using same. Disclosed herein are various heterocyclic compounds and methods of using the novel anti-cancer compounds to inhibit the growth of a cancer cell, for instance a leukemia, non-small cell lung, central nervous system (CNS), skin, ovarian, renal, prostate, breast, or colon cancer cell. Other embodiments include methods of treating cancer in…
Embodiments relate to the field of chemistry and biochemistry, and, more specifically, to anti-cancer compounds, synthesis thereof, and methods of using same. Disclosed herein are various heterocyclic compounds and methods of using the novel anti-cancer compounds to inhibit the growth of a cancer cell, for instance a leukemia, non-small cell lung, central nervous system (CNS), skin, ovarian, renal, prostate, breast, or colon cancer cell. Other embodiments include methods of treating cancer in a subject, such as using the disclosed heterocyclic anti-cancer agents.
http://creativecommons.org/publicdomain/zero/1.0/


Between Wednesday 10th April 21:00 and Thursday 11th April 0:400 a quad bike has appeared to have been stolen and dumped in a hedge in Cowdown Lane. If you saw or heard anything you feel may be relevant, please contact Police on 101 or use the online reporting facility.
Thieves may still be operating in this area and will target premises they consider to be vulnerable. Please keep your doors and windows locked wherever possible and if you do not have an alarm or CCTV, please consider their installation.
Public assistance is vital in many of the investigations Police undertake and we thank you in advance for your time.


text:
Attorney General Sessions Directs Federal Prosecutors to Target Most Significant Violent Offenders
Attorney General Jeff Sessions today directed federal prosecutors nationwide to engage in a focused effort to investigate, prosecute and deter the most violent offenders.
This builds on the announcement last week of the creation of the U.S. Department of Justice Task Force on Crime Reduction and Public Safety, which is central to the Attorney General's commitment to combatting illegal immigration and violent crime, such as drug trafficking, gang violence and gun crimes, and to restoring public safety to all of the nation's communities.
"Turning back our nation's recent rise in violent crime is a top priority for the Department of Justice, and it requires decisive action from our federal prosecutors," said Attorney General Sessions. "I'm urging each of them to continue working closely with their counterparts at all levels, and to use every tool we have to put violent offenders behind bars and keep our citizens safe."
In a memo to federal prosecutors in the department's 94 United States Attorney's Offices, the Attorney General made clear that prosecuting violent criminals is a high priority and prosecutors should work closely with their federal, state, local and tribal law enforcement partners to target the most violent offenders in each district. Working together, law enforcement at every level should determine which venue – federal or state – would best get those identified immediately off our streets and punished appropriately for their crimes.
The memo states when federal prosecution is determined appropriate, federal prosecutors should ensure the individuals driving violent crime in their district are prosecuted using the tools at their disposal, which may include firearms offenses, including possession and straw purchasing offenses; possession of a firearm during and in relation to a violent crime or drug trafficking offense; Hobbs Act robbery; carjacking; violent crime in aid of racketeering; Racketeering Influenced and Corrupt Organizations Act; and drug offenses under the Controlled Substances Act, among others.
The Attorney General recognized that many offices are already employing these strategies and asked that those offices ensure their efforts are achieving the desired results.
Additional guidance and support in executing this priority will be forthcoming.
Memo on Commitment to Targeting Violent Crime
Office of the Deputy Attorney General


text:
He once turned to Mustard Seed, now he helps others
Roxanne Egan-Elliott / Times Colonist
Nelson Antoine runs a food drive at Jim Pattison Toyota.
Photograph By DARREN STONE, Times Colonist
Nelson Antoine organizes a food drive every Christmas because he knows first-hand what it's like to be in need.
When he left the military in 1992 after 12 years of service, he had nothing.
"I didn't have any money to do anything," he said.
He turned to the Mustard Seed for food and a bus pass, and used that pass to get to a government office to apply for employment insurance and check job boards. He found himself interviewing for a job in the office on the spot.
"They said: 'We're looking for somebody who can speak different languages," said Antoine, who speaks English, French, Spanish, Haitian Creole and a little Italian.
He worked there for about a year, before going back to school to study administration and management. After his studies, he got a job as a salesman at a car dealership, which suited him, because he likes to talk to people.
For the past five years, he has been collecting donations from his colleagues, sometimes as much as $1,700. He fills a truck with the food he buys with money donated and drives it to the Mustard Seed. It's his way of giving back. "When I was down, I got help. So to anybody who now needs help, I'm capable of giving a little bit," Antoine said.
His desire to give doesn't stop after the holidays. Antoine works six days a week, and on his one day off, he volunteers to drive seniors who live alone and can't get themselves to medical appointments or the supermarket. Sometimes, it's just a drive to get them out of the house.
"They always try to steal a little bit of a conversation after the drive, because you can feel that they don't want to go back in there and be alone again. Simply that makes me say: 'Well, this is something needed,' " Antoine said.
The Mustard Seed receives donations from the Times Colonist Christmas Fund, which supports an annual Christmas dinner at the Bay Street Armoury for hundreds of people.
Last year, more than $308,000 was donated to the Christmas Fund, which has been raising money for people in need during the holiday season since 1956. The Salvation Army and Our Place also receive support from the Christmas Fund.
regan-elliott@timescolonist.com
How to donate to the Times Colonist Christmas Fund
Please donate to the Times Colonist Christmas Fund. The fund assists individuals and families in need during the Christmas season. Here are ways to donate:
• Go to timescolonist.com/donate. That takes you to the Canada Helps website, which is open 24 hours a day and provides an immediate tax receipt.
• Mail a cheque, payable to the Times Colonist Christmas Fund Society, to the Times Colonist Christmas Fund, 2621 Douglas St., Victoria V8T 4M2.
• Use your credit card by phoning 250-995-4438 between 9 a.m. and 4 p.m., Monday to Friday. Outside those hours, leave a message, we'll call back.
Please click to view the winners and finalists for 2020
Donate to the TC Literacy Society
All money raised goes to education and literacy programs on Vancouver Island.
Contests and offers from our advertising partners.
New campaign, and logo, for GM in a bid to electrify image
Use our online map to find local businesses that are still open
CARRIERS WANTED!
The Times Colonist is looking for newspaper carriers to work in the Reader Sales and Service Department.
The Best Auto Deals!
Click here to view our new Automotive Marketplace
Cooking with Eric
Eric Akis
Eric Akis: Pecans add crunch to saucy fish dish
Eric Akis: How to make flavourful homemade chicken stock
Our gratitude for goodness takes us forward
We grow when we're uncomfortable
Pedro the Car Guy
Pedro Arrais
Pedro Arrais review: 2021 Polestar 2 makes an eco-friendly statement
Victoria dealer to debut luxury electric-vehicle franchise Polestar
Capital Spring 2020
Latest issue here
Click here to see the latest Discover Magazine


text:
Newfoundland & Labrador > Sports
Brazil soccer legend Pele hospitalized again for colon tumor treatment
Reuters | Posted: Dec. 8, 2021, 10:12 a.m. | Updated: Dec. 9, 2021, 12:51 a.m. | 1 Min Read
(Reuters) - Brazilian soccer legend Pele was hospitalized to undergo treatment for a colon tumor, Sao Paulo's Hospital Albert Einstein said on Wednesday, adding that he is in stable condition and should be discharged in the next few days.
The 81-year-old three-time World Cup winner underwent an operation to remove the tumor in September and spent nearly a month under care. The hospital said at the time he would need to undergo chemotherapy.
According to Wednesday's medical bulletin, Pele is continuing his treatment.
"The patient is stable, and the forecast is that he will be released in the coming days," the statement said.
It gave no details on the seriousness of his tumor or how the treatment is progressing.
Widely considered to be one of the greatest footballers of all time, Pele has suffered from a series of health issues in recent years. Hip surgery left him with recurring pain and he cannot now walk unaided.
Just weeks before the pandemic hit Brazil last year, his son said the former Santos and New York Cosmos player was depressed, which Pele later denied.
He appeared upbeat in videos taken during his recovery period in September and October and he said on Twitter last month that he was feeling better "every day."
(Reporting by Rodrigo Viga Gaier; Writing by Gabriel Araujo and Andrew Downie; Editing by Brad Haynes and Nick Macfie)


Image Title: Mid Century Modern Door Knocker Iron Starburst Retro Jack Pine Throughout Plans 12. Post Title: Modern Door Knocker. Filename: mid-century-modern-door-knocker-iron-starburst-retro-jack-pine-throughout-plans-12.jpg. Image Dimension: 570 x 760 pixels. Images Format: jpg/jpeg. Publisher/Author: Edwardo Mante. Uploaded Date: Saturday - January 12th. 2019 11:46:14 AM. Category: Architecture. Image Source: architecture.com. Door Modern Regard Hardware Contemporary Regarding 10. 11. 6. And Design 17. By With Knocker Plan For Jedo Idea Decorations Pinterest Images Finish ET1 Signature JV2PC Ideas 9. Home To Photos 14. 8. 18. 166 Interior On Dokusho Knockers Throughout 4A0010020029 Extraordinary Polished Taymor Karcher Nickel Furniture Strait Porte Intended Satin Remodel Wonderful Best In 15. New Decor Slimline Chrome Handleset Pertaining 1.


text:
African Wild Dogs in Tarangire National Park
We were extremely fortunate during our giraffe survey this past week to see a small pack of African wild dogs (also known as painted dogs) in Tarangire National Park. These stunning animals have boldly blotched white, black, and tan fur, with each individual having its own unique pattern.
African wild dogs are highly social and live in packs, sometimes with dozens of animals, but generally only one dominant male and female will breed and all pack members help to raise the pups. Interestingly, males remain in the packs into which they were born, while females disperse.
In 5 years of working in and around Tarangire National Park, this is only our second sighting of these beautiful canids. Our joy at seeing them was tempered by the fact that they are highly endangered. Threats include disease and habitat loss and fragmentation as well as persecution after livestock kills, vehicle strikes, and accidental capture in poachers' snares. According to A Field Guide to the Larger Mammals of Tanzania, in 2007 only about 1,800 wild dogs could be found in Tanzania. This was 20% of the global population, making Tanzania extremely important for the conservation of the species. They feed primarily upon medium-sized ungulates like gazelles and impalas, so Wild Nature Institute's work to study and conserve ungulates is directly benefiting wild dogs and other predators.
US Fish and Wildlife Service to Consider Federal Protection for California Spotted Owl
Yesterday the U.S. Fish and Wildlife Service agreed with the Wild Nature Institute and John Muir Project that sufficient information existed to consider listing the California Spotted Owl as endangered or threatened under the federal Endangered Species Act. Last December we submitted a petition to list the subspecies because the science clearly shows owl populations are declining on public and private lands where logging is allowed, but stable in national parks where logging is prohibited. This is just a step in the process: after a public comment period and further investigation, the Fish and Wildlife Service should make a final determination about listing the owl within a year. The recognition that fire-related logging such as thinning and post-fire tree-cutting is harming owls is significant, and we applaud the Service for this decision.
These California Spotted Owls were inhabiting a territory partially burned by the McNally Fire in the Sequoia National Forest. Photo courtesy of France Kehas-Dewaghe.
Los Angeles Times: Wildlife Groups Seek Federal Protection for the California Spotted Owl
http://www.latimes.com/science/sciencenow/la-sci-sn-california-spotted-owl-20150918-story.html
By Louis Sahagun
Federal wildlife authorities agreed to consider listing the California spotted owl as an endangered species
Timber harvesting and post-fire salvage logging are the main threat to the spotted owls' survival
The California spotted owl population of about 1,200 pairs is so small it has an impoverished gene pool
In the latest round in a 15-year legal battle to keep the California spotted owl safe from U.S. Forest Service logging policies, federal wildlife authorities have agreed to reconsider an earlier decision to deny the timid raptor protection under the Endangered Species Act.
In 2006, the U.S. Fish and Wildlife Service determined there was inconclusive evidence that spotted owl populations in the Sierra Nevada range and the mountains of Southern California were in decline or threatened by logging operations.
New research, however, indicates that thinning and post-fire salvage logging are "the main threat to the spotted owls' survival," according to a petition for listing filed late last year by the Wild Nature Institute and the John Muir Project of Earth Island Institute.
On Friday, Fish and Wildlife agreed that listing may be warranted for the owl, known by scientists as Strix occidentalis occidentalis. The agency said that is because the owl population of about 1,200 pairs – most of them on Forest Service lands subject to extensive logging -- is so small it has "an impoverished gene pool." Officials also agreed that owl habitat loss and fragmentation from logging may exacerbate threats posed by climate change, invasive species and development.
"I'm very encouraged by the agency's decision," said Chad Hanson, an ecologist and spokesman for the John Muir Project. "It means that we have greater potential to protect the owl and its habitat from logging on public lands than ever before."
Stanton Florea, a spokesman for the Forest Service's Pacific Southwest Region, declined to comment except to say that "we'll be providing the Fish and Wildlife Service any information they request as part of the process."
Mike Albrecht, a registered professional forester and president of Sierra Resource Management, a timber harvesting business in Sonora, Calif., said, "The main danger to the spotted owl is wildfire in forests that are overgrown.
"Salvage logging of a burned forest does nothing to endanger the owl," he added. "Keeping our forests healthy, thinned and green is good for the owl and all wildlife."
The medium-sized, mottled chocolate brown owls are nocturnal, considered monogamous and largely remain in their home ranges year-round. The species had been solely associated with dense, old-growth forests and thickly wooded canyons, a notion that made it a lightning rod for blame in the timber and logging industry.
The overwhelming view of conservationists now is that the species is well adapted to low- and moderate-severity wildfires, and appears to prefer high-severity burned areas within their territory for foraging.
"The Forest Service claims thinning, timber harvesting and salvage logging are needed to reduce the threat of fire and improve habitat for owls," Hanson said. "We now know that the owls forage among charred logs and snags because they are great habitat for small mammals such as pocket gophers -- a delicacy for them."
The Department of the Interior is expected to make a final decision on the status of the California spotted owl next year.
Oxpeckers: Vacuum or Vampire?
Anyone watching hoofed mammals in the African savanna also has a good chance of spotting one of two species of oxpecker, a fascinating bird that lives much of its life clinging to ungulates and eating such delicacies as ticks, blood, dandruff, mucous, and earwax! Red-billed (Buphagus erythrorynchus) and Yellow-billed Oxpeckers (B. africanus) have short, sharp claws that facilitate clinging to animals, long stiff tails that hold them upright whilst clinging, and flattened beaks with a sharp cutting edge for handling ticks. They are also both highly social cooperative breeders that nest in tree cavities during the rainy season.
The relationship between oxpeckers and ungulates has been traditionally considered mutualistic, as the oxpeckers obtain food from blood in ticks while at the same time the ungulates benefits from tick removal. Some scientists have questioned whether the relationship might be more parasitic, as oxpeckers also feed upon wounds, often causing the wounds to remain open. However, ungulates appear to benefit when oxpeckers help to lower their tick burden. The question remains open for further study.


text:
import * as dom from 'vs/base/browser/dom';
import { asArray } from 'vs/base/common/arrays';
import { AsyncIterableObject } from 'vs/base/common/async';
import { CancellationToken } from 'vs/base/common/cancellation';
import { IMarkdownString, isEmptyMarkdownString, MarkdownString } from 'vs/base/common/htmlContent';
import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle';
import { MarkdownRenderer } from 'vs/editor/contrib/markdownRenderer/browser/markdownRenderer';
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
import { Position } from 'vs/editor/common/core/position';
import { Range } from 'vs/editor/common/core/range';
import { IModelDecoration } from 'vs/editor/common/model';
import { ILanguageService } from 'vs/editor/common/languages/language';
import { getHover } from 'vs/editor/contrib/hover/browser/getHover';
import { HoverAnchor, HoverAnchorType, IEditorHoverParticipant, IEditorHoverRenderContext, IHoverPart } from 'vs/editor/contrib/hover/browser/hoverTypes';
import * as nls from 'vs/nls';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { IOpenerService } from 'vs/platform/opener/common/opener';
import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures';
import { EditorOption } from 'vs/editor/common/config/editorOptions';

const $ = dom.$;

export class MarkdownHover implements IHoverPart {

	constructor(
		public readonly owner: IEditorHoverParticipant<MarkdownHover>,
		public readonly range: Range,
		public readonly contents: IMarkdownString[],
		public readonly isBeforeContent: boolean,
		public readonly ordinal: number
	) { }

	public isValidForHoverAnchor(anchor: HoverAnchor): boolean {
		return (
			anchor.type === HoverAnchorType.Range
			&& this.range.startColumn <= anchor.range.startColumn
			&& this.range.endColumn >= anchor.range.endColumn
		);
	}
}

export class MarkdownHoverParticipant implements IEditorHoverParticipant<MarkdownHover> {

	public readonly hoverOrdinal: number = 2;

	constructor(
		protected readonly _editor: ICodeEditor,
		@ILanguageService private readonly _languageService: ILanguageService,
		@IOpenerService private readonly _openerService: IOpenerService,
		@IConfigurationService private readonly _configurationService: IConfigurationService,
		@ILanguageFeaturesService protected readonly _languageFeaturesService: ILanguageFeaturesService,
	) { }

	public createLoadingMessage(anchor: HoverAnchor): MarkdownHover | null {
		return new MarkdownHover(this, anchor.range, [new MarkdownString().appendText(nls.localize('modesContentHover.loading', "Loading..."))], false, 2000);
	}

	public computeSync(anchor: HoverAnchor, lineDecorations: IModelDecoration[]): MarkdownHover[] {
		if (!this._editor.hasModel() || anchor.type !== HoverAnchorType.Range) {
			return [];
		}

		const model = this._editor.getModel();
		const lineNumber = anchor.range.startLineNumber;
		const maxColumn = model.getLineMaxColumn(lineNumber);
		const result: MarkdownHover[] = [];

		let index = 1000;

		const lineLength = model.getLineLength(lineNumber);
		const languageId = model.getLanguageIdAtPosition(anchor.range.startLineNumber, anchor.range.startColumn);
		const stopRenderingLineAfter = this._editor.getOption(EditorOption.stopRenderingLineAfter);
		const maxTokenizationLineLength = this._configurationService.getValue<number>('editor.maxTokenizationLineLength', {
			overrideIdentifier: languageId
		});
		let stopRenderingMessage = false;
		if (stopRenderingLineAfter >= 0 && lineLength > stopRenderingLineAfter && anchor.range.startColumn >= stopRenderingLineAfter) {
			stopRenderingMessage = true;
			result.push(new MarkdownHover(this, anchor.range, [{
				value: nls.localize('stopped rendering', "Rendering paused for long line for performance reasons. This can be configured via `editor.stopRenderingLineAfter`.")
			}], false, index++));
		}
		if (!stopRenderingMessage && typeof maxTokenizationLineLength === 'number' && lineLength >= maxTokenizationLineLength) {
			result.push(new MarkdownHover(this, anchor.range, [{
				value: nls.localize('too many characters', "Tokenization is skipped for long lines for performance reasons. This can be configured via `editor.maxTokenizationLineLength`.")
			}], false, index++));
		}

		let isBeforeContent = false;

		for (const d of lineDecorations) {
			const startColumn = (d.range.startLineNumber === lineNumber) ? d.range.startColumn : 1;
			const endColumn = (d.range.endLineNumber === lineNumber) ? d.range.endColumn : maxColumn;

			const hoverMessage = d.options.hoverMessage;
			if (!hoverMessage || isEmptyMarkdownString(hoverMessage)) {
				continue;
			}

			if (d.options.beforeContentClassName) {
				isBeforeContent = true;
			}

			const range = new Range(anchor.range.startLineNumber, startColumn, anchor.range.startLineNumber, endColumn);
			result.push(new MarkdownHover(this, range, asArray(hoverMessage), isBeforeContent, index++));
		}

		return result;
	}

	public computeAsync(anchor: HoverAnchor, lineDecorations: IModelDecoration[], token: CancellationToken): AsyncIterableObject<MarkdownHover> {
		if (!this._editor.hasModel() || anchor.type !== HoverAnchorType.Range) {
			return AsyncIterableObject.EMPTY;
		}

		const model = this._editor.getModel();

		if (!this._languageFeaturesService.hoverProvider.has(model)) {
			return AsyncIterableObject.EMPTY;
		}

		const position = new Position(anchor.range.startLineNumber, anchor.range.startColumn);
		return getHover(this._languageFeaturesService.hoverProvider, model, position, token)
			.filter(item => !isEmptyMarkdownString(item.hover.contents))
			.map(item => {
				const rng = item.hover.range ? Range.lift(item.hover.range) : anchor.range;
				return new MarkdownHover(this, rng, item.hover.contents, false, item.ordinal);
			});
	}

	public renderHoverParts(context: IEditorHoverRenderContext, hoverParts: MarkdownHover[]): IDisposable {
		return renderMarkdownHovers(context, hoverParts, this._editor, this._languageService, this._openerService);
	}
}

export function renderMarkdownHovers(
	context: IEditorHoverRenderContext,
	hoverParts: MarkdownHover[],
	editor: ICodeEditor,
	languageService: ILanguageService,
	openerService: IOpenerService,
): IDisposable {

	// Sort hover parts to keep them stable since they might come in async, out-of-order
	hoverParts.sort((a, b) => a.ordinal - b.ordinal);

	const disposables = new DisposableStore();
	for (const hoverPart of hoverParts) {
		for (const contents of hoverPart.contents) {
			if (isEmptyMarkdownString(contents)) {
				continue;
			}
			const markdownHoverElement = $('div.hover-row.markdown-hover');
			const hoverContentsElement = dom.append(markdownHoverElement, $('div.hover-contents'));
			const renderer = disposables.add(new MarkdownRenderer({ editor }, languageService, openerService));
			disposables.add(renderer.onDidRenderAsync(() => {
				hoverContentsElement.className = 'hover-contents code-hover-contents';
				context.onContentsChanged();
			}));
			const renderedContents = disposables.add(renderer.render(contents));
			hoverContentsElement.appendChild(renderedContents.element);
			context.fragment.appendChild(markdownHoverElement);
		}
	}
	return disposables;
}


Heather White Body with Vintage Red Sleeves with Leopard Bull Skull re-designed for Christmastime! Super Soft 3/4 sleeve tri-blend (50% polyester/25% combed ring-spun cotton/25% rayon jersey).
S Length 28" Width 36"
M Length 29" Width 39"
L Length 30" Width 42"
XL Length 31" Width 45"
2XL Length 32" Width 49"


text:
Aboriginal Employment Reaches Significant Milestone in NT
Monday, 11th July 2016 at 9:30 am
Not for Profit Diversity Council Australia is calling on states to follow the example set by the Northern Territory after it was announced Aboriginal employment in the public sector has reached a significant milestone.
Chief Minister and Minister for Aboriginal Affairs Adam Giles announced during NAIDOC Week that more than 10 per cent of territory public servants are now Aboriginal.
Diversity Council Australia CEO, Lisa Annese, said it was a "huge step forward".
"The idea is that under the principle of self determination that individual Indigenous Australians take control of their own lives and create policy and outcomes that are good for them," Annese told Pro Bono Australia News.
"So I think that is a brilliant step forward and I would encourage other states to try and follow the same."
She said there were lots of barriers facing Indigenous Australians in the workforce that needed to be overcome.
"I think it ranges from inequity before you get there, before you even have the opportunity, to things like discrimination and exclusions once you are there, so it is a very complicated multitude of factors.
"But I think to know that it can be successful, we should do what we can to learn from the Northern Territory example.
"Because if you are trying to reflect the population that you serving then obviously you need to be genuine about that and particularly, as in this case of Indigenous Australians, we don't need people speaking on their behalf we need their voices clearly and presently in the public policy debate, that's the only way you can get good outcomes."
Annese said there was no reason we couldn't see this same level of workplace diversity across the country.
"I think that if people are willing and keen and able to do it and there is the right infrastructure in place, it may take longer but it is definitely something we can do," she said.
It comes after Adam Giles announced progress was being made in the Northern Territory towards meeting job targets laid out under the government's Aboriginal Affairs strategy.
"When I became Chief Minister, I made the commitment to drive change, bridge the economic gap between non-Aboriginal and Aboriginal people and facilitate economic development in Aboriginal communities," Giles said.
"People were sceptical about our ability to reach these goals, which were deliberately ambitious because there needed to be real and significant change.
"Our goal is to double public sector Aboriginal employment to 16 per cent of the workforce, from 1,800 to 3,600 employees by 2020.
"In just a short time, the number of Aboriginal employees has increased to 10.07 per cent."
This represents more than 250 new Aboriginal employees working in the Northern Territory public sector.
Giles said an additional nine trainees has also graduated from the NTPS Indigenous Employment Program on 1 July.
He said the approach was based on consultation.
"Our Aboriginal Affairs strategy has been developed in collaboration with Aboriginal people; it's a new approach based on genuine consultation," he said.
"We have initiated Aboriginal employment requirements for all government infrastructure contracts above $500,000 (Indigenous Employment Provisional Sum).
"There have been 1,400 Aboriginal employment outcomes on all Department of Infrastructure civil and construction contracts over $500,000 since October 2014.
"With 994 individual Aboriginal people employed on these contracts, compared with only 40 before this initiative was put in place, it is showing that a large workforce of Aboriginal are filling well paid, skilled and sustainable jobs with many people moving from contract to contract.
"These positive results in both the public and private sector show that, together, we are driving real change and the Northern Territory is a better place to be."
Wendy Williams | Editor | @WendyAnWilliams
Wendy Williams is a journalist specialising in the not-for-profit sector and broader social economy. She has been the editor of Pro Bono News since 2018.
Tags : Aboriginal Affairs, Aboriginal employment, Adam Giles, Diversity Council Australia, Indigenous engagement, Lisa Annese, NAIDOC week, Northern Territory,
'Too important to get wrong': Government pushes for Indigenous constitutional recognition
Thursday, 11th July 2019 at 3:21 pm
Indigenous excellence celebrated at 2019 National NAIDOC Awards
Voice. Treaty. Truth.
Move over Jemima, there's a new toy on Play School
Saturday, 29th June 2019 at 11:00 am


text:
Онуфрий Перцовский , или Онуфрий Перцевский, или Онуфрий Вологодский — преподобный Русской православной церкви.

О детстве и мирской жизни Онуфрия сведений практически не сохранилось, да и прочие биографические сведения о нём очень скудны и отрывочны. Жил в конце XV — начале XVI века. Вместе с преподобным Авксентием Онуфрий основал в 1499 году пустынь и церковь во имя Святой Троицы, в 35 вёрстах от Вологды, в уезде Грязовецком, поселившись в здешнем, тогда крайне безлюдном и лесном месте.

Со смирением они преодолевали множество нужд и лишений всякого рода и тем самым совершали подвиги иночества. Пустынь назвалась Персова, и по другим грамотам Перцова.

Перцова пустынь ещё в 1588 году была приписана к Корнилиево-Комельскому монастырю, а в 1764 году совсем закрыта и обращена в приходскую церковь, в которой под спудом и почивают мощи основателей.

Память Онуфрия чтится  и в 3-ю неделю по Пятидесятнице в Соборе Вологодских святых.

Примечания

Литература
 Барсуков. «Источники агиографии». Стб. 1.

 Князь Эристов. «Словарь исторический о святых», СПб., 1862 г., стр. 190.
  Филарет. «Жития святых», СПб., 1892 г. (июнь), стр. 121; I.

Преподобные Русской Церкви
Христианские святые XVI века
Персоналии:Корнилиево-Комельский монастырь

redpajama_set_name: RedPajamaWikipedia


A host of analog and digital improvements bring new capabilities to a proven and popular peak and average power measurement instrument.
Consider the challenge of improving a proven performer, the 4500A peak power meter from Boonton Electronics (Parsippany, NJ). That was the task facing the popular instrument's design team, which responded with the new model 4500B after incorporating both analog and digital refinements. The firm's latest instrument brings new test and display capabilities to continuous-wave (CW), modulated-signal, and peak power measurements from 30 MHz to 40 GHz.
Since most modern microwave test instruments represent a blend of analog and digital hardware as well as dedicated software, it is not surprising to find improvements in all three areas of the 4500B. The peak power meter features an improved analog input section designed to provide faster rise times with pulsed signals and flatter overall amplitude response.
The basic architecture of the 4500B includes detectors followed by wide-dynamic-range logarithmic amplifiers capable of a better than 60-dB instantaneous range. For example, the 4500B can measure power levels on pulsed and modulated signals from −40 to +20 dBm and on continuous-wave (CW) signals from −50 to +20 dBm, depending on the sensor connected to the peak power meter. The 4500B employs logamps rather than switching gain stages in order to avoid the variations in bandwidth that are associated with gain-switching architectures, especially with low-level signals.
To provide a strong measure of confidence in its measurements, the 4500B features an integrated precision 1.024-GHz calibration source traceable to the National Institute of Science and Technology (NIST). The source provides well-characterized output levels from −40 to +20 dBm in either CW or pulsed mode of operation with 0.1-dB resolution, allowing operators to quickly verify the performance of the 4500B with both CW and pulsed signals. Using an RF amplitude sweep to permit user calibration of sensor linearity over its full dynamic range avoids the pitfalls of the more traditional single-point RF or DC substitution techniques.
Existing sensors for the 4500B are available with instantaneous measurement bandwidth of 25 MHz over frequency ranges as wide as 0.1 to 18.0 GHz and 0.1 to 40.0 GHz. A new sensor series has also been developed for use with the 4500B, capable of 35-MHz measurement bandwidth at frequencies to 18 and 40 GHz. The 4500B peak power meter is actually capable of making measurements over an instantaneous bandwidth of 100 MHz, although sensors with that capability are not yet available.
The 4500B (Fig. 1) provides 250,000 samples of signal capture memory per channel (compared to 4000 samples per channel in the 4500A version), with simultaneous sampling on two signal channels and two trigger channels. The maximum sampling rate is 50 MSamples/s. The 4500B benefits from a fully integrated dual trigger system that is actually two hardware power meters in a single instrument. Each signal channel and trigger channel is powered by a 32-b floating-point digital signal processor (DSP), allowing fully independent measurements with almost nonexistent crosstalk between channels and between trigger and measurement channel. A powerful field-programmable gate array (FPGA) supports the dual DSPs by manipulating captured samples into the many statistical formats offered by the 4500B.
The 4500B provides much of the triggering functions associated with a digital oscilloscope, while returning test results on power and voltage. The instrument can measure peak and average power levels as well as pulsed power. It can also measure a host of pulse parameters, including rise time, fall time, overshoot, pulse width, pulse period, and duty cycle. Because the peak power meter is also a Pentium-grade computer (Windows XP operating system) with dedicated DSPs and FPGA, it can also perform statistical analysis on complex modulated signals, such as code-division-multiple-access (CDMA) signals. CDMA signals are pseudorandom in nature, appearing much like noise, with periodic power peaks that occur over long time periods. By continuously acquiring as many as 25 million power readings per second on a measurement channel, the 4500B can form histograms which are then presented as cumulative distribution functions (CDFs) or complementary cumulative distribution functions (CCDFs) to show the statistical occurrence of different power levels. The 4500B can also provide a close approximation of a probability density function (PDF). Statistical functions are displayed in a decimating mode that instantly shows the effects of tuning a circuit on the 4500B's screen (Fig. 2).
The 4500B presents test results with a new split-screen function that can simultaneously reveal statistical-domain and time-domain information, especially useful when examining pulsed or modulated signals. Conventional instruments require an operator to switch between domains. Captured signals and test results are clearly visible on a new 8.4-in. color liquid-crystal-display (LCD) screen with 640 × 480-pixel resolution. The powerful display allows operators to color code each menu and trace, to simplify viewing of multiple traces. Built-in marker functions help to identify a power or voltage level at a particular point in a trace or pulse (Fig. 3). In addition to its built-in display screen, the 4500B provides a VGA port for driving an external color monitor.
The 4500B has four operating modes suited for measurements on different types of signals: modulated mode (for modulated or CW signals), (triggered) pulse mode, standard statistical mode, and gated statistical mode (Fig. 4). Once the instrument enters the statistical mode, an operator can choose between standard statistical mode and gated statistical mode (to provide measurements on specific intervals based on defined time gates). The triggering capabilities in pulse mode are extensive, with a timebase range of 5 ns/div to 1 hr/div with timebase accuracy of 0.01 percent and timebase resolution of 100 ps. Pretrigger delays can be set to 4 ms for timebase settings from 5 ns/div to 500 ns/div, 4000 div for timebase settings from 1 µs/div to 10 ms/div and as much as 40 seconds for timebase settings from 20 ms/div to 1 hr/div. Post-trigger delays can be set as long as 100 ms for timebase settings of 5 ns/div to 500 ns/div, as long as 4000 div for timebase settings of 1 µs/div to 10 ms/div, and as long as 100 seconds for timebase settings of 20 ms/div to 1 hr/div.
The 4500B peak power meter is a powerful measurement tools for both commercial and military applications, including telecommunications systems such as cellular communications, WiMAX, and cable-television (CATV) systems, and military systems including radar and identify-friend-or-foe (IFF) systems. The instrument is well equipped with communications ports, including parallel, serial, GPIB, and Ethernet ports, along with a Universal Serial Bus (USB) port on the front panel for data storage (replacing the nearly obsolete floppy disk drive on the 4500A). Boonton Electronics (a Wireless Telecom Group Co.), 25 Eastmans Rd., Parsippany, NJ 07054; (973) 386-9696, FAX: (973) 386-9191, e-mail: [email protected], Internet: www.boonton.com.


text:
Armed Man Arrested at Palomar College
The campus was closed for winter break and no one was injured
By Monica Garske and Sherene Tagharobi
Published Dec 31, 2013 at 7:47 AM | Updated at 9:44 PM PST on Dec 31, 2013
//www.nbcsandiego.com/on-air/as-seen-on/Armed-Man-Arrested-at-Palomar-College-238317041.html
During a bizarre 911 call Tuesday, a man threatened to shoot sheriff's deputies at Palomar College in San Marcos. After an extensive search of the campus, authorities arrested a 23-year-old man. NBC 7's Mari Payton reports. (Published Tuesday, Dec. 31, 2013)
A man armed with a gun was arrested on the Palomar College campus in San Diego's North County Tuesday, officials confirmed.
Deputies from the San Diego County Sheriff's Department were called to the campus at around 6:30 a.m. after a man called authorities to report that he was armed with a gun at the community college located at 1140 W. Mission Road in San Marcos.
Deputies arrived at the scene quickly and began scouring the campus in search of the suspect. At 7:15 a.m., officials confirmed there was no immediate danger to residents living near the campus.
Due to the winter holiday, the college campus is shut down for break and there were no classes in session at the time of the incident. School employees are also on break, according to a staffer who spoke with NBC 7.
At around 7:20 a.m., officials took the armed suspect into custody on the west end of campus, near one of the buildings. Officials confirmed the 23-year-old man was, in fact, armed with a loaded handgun.
According to officials, when the man initially called authorities, he provided dispatchers with a description of his clothing and a specific location on where they could find him on campus.
The suspect told authorities his cousin had allegedly been shot by an unknown man. He then told authorities he was planning on getting into a shootout with deputies, officials said.
The suspect said he was driving to the Palomar College campus armed with a .22-caliber handgun.
Deputies from the San Marcos, Vista and Fallbrook substations responded to the scene, as well as SWAT officials. Officials set up a perimeter around the campus and began their search for the suspect on the ground while the sheriff's department ASTREA helicopter scoured the scene overhead.
Officials said the suspect's car was discovered on campus and the suspect was located and arrested shortly thereafter.
Deputies remained on scene searching for possible victims but determined no one was injured in the incident. Officials confirmed no one but the suspect was on campus, as the college is closed for the holidays.
Sgt. Paul Michalke said officials have not yet determined whether this will be handled as a criminal case or as a mental health-related issue.
Officials said there has been no confirmation that the suspect's cousin was actually shot or injured.
NBC 7 searched court records and it does not appear the suspect has any type of criminal record. Check back for updates on this developing story.
Get the latest from NBC 7 San Diego anywhere, anytime
Follow NBC 7 San Diego


Depending on your commitment to Pilates, your result time can vary. Clients will feel the benefits of Pilates within 1 session and begin to see physical changes in within 10 sessions. Joseph Pilates himself made the promise: I will give you a completely new body in 30 sessions.
Previous PostPrevious What kind of results can I expect?
Next PostNext Can I do Pilates if I'm pregnant?


Next: Ways to retrieve files from a corrupted snapshot file?
I have the following issue on a Hyper V 2012 R2 host with two virtual machines running Windows 2012 R2 each. After a certain time (time can change) I cannot remote connect to either virtual machines via the Hyper V manager or with RDP. I need to force reboot the virtual machines with Hyper V manager and then it works for a while until it happens again.
- Update both the host and virtual machines with the latest updates and integration services.
- Update the BIOS to the latest version on the host.
During this problem I can still ping the virtual machines and the host without issues. I also cannot connect to the shares located on these virtual machines. The "heartbeat" shows okay and nothing in the event log that showing the cause.
This does sound like the VMQ issue. You must disable it both at the host/hardware level and in the virtual NIC settings for each VM as well. I'd double-check that as a first step.
I'd also ensure the "allow this device to go to sleep" is disabled.
What is the average latency when pinging the machines? What are the software on those machines and the underlying RAID level and controller on the host? Does it look like the VMs have consumed all the memory on the host?
As above though VMQ will cause its share of issues.
Do you have any old/disconnected iSCSI targets on these servers?
Many people have been running into a bug where disconnected iSCSI target(s) on the server causes Windows to continuously try to re-connect, exhausting all outgoing ('ephemeral') ports which in turn prevents many different services from working normally since no new connections can be made.
If an iSCSI target becomes unavailable, attempts to reconnect will cause a leak. Initiating a new connection to an available target will work as expected. Microsoft is working on a resolution and will provide an update in an upcoming release.
Yeah that ISCsI bug affected some of our cloud servers.
hmmm...so I need to wait for Microsoft to fix this issue?
This bug only surfaces if you have iSCSI targets which are stuck in the 'Reconnecting' state, such as an old/forgotten/no longer in use target. It does not affect iSCSI targets which are working properly and in the 'Connected' state.
Do you have any targets which are Reconnecting, as shown in the pic below?
Yes, removing the 'reconnecting' target(s) stops the port exhaustion from occurring, I should have clarified.


text:
VJ/DJ Brian S. Redd
Thursday, December 31 at 8 p.m.
Brian Redd DJs in Los Angeles, Las Vegas, the UK and other parts of Europe. Even though he performs in these great locations, DJ Brian Redd is proud to call Milwaukee home. He has been a resident DJ at several major Milwaukee nightclubs and performs at Summerfest.
Brian is recognized for his work in various DJ publications both domestic and abroad. He has made a name for himself in the DJ community where he is known and respected as an industry consultant. A true international DJ, Brian travels worldwide to perform, educate and share industry ideas and concepts with DJs everywhere. His career has gone to the next level as an official 'DJ Artist' working with industry leading manufacture American DJ bringing new products and services to his peers helping them become better DJs.