text:
from datetime import datetime

from acme import challenges
from acme.messages import Error as acme_Error

from josepy.jwk import JWKRSA

from testtools.assertions import assert_that
from testtools.matchers import (
    AfterPreprocessing, Equals, HasLength, Is, IsInstance, MatchesAll,
    MatchesDict, MatchesListwise, MatchesPredicate, MatchesStructure, Not)
from testtools.twistedsupport import failed, succeeded

from twisted.internet.defer import succeed
from twisted.internet.task import Clock

from txacme.client import ServerError as txacme_ServerError
from txacme.testing import FakeClient, MemoryStore
from txacme.util import generate_private_key

from marathon_acme.clients import MarathonClient, MarathonLbClient
from marathon_acme.service import MarathonAcme, parse_domain_label
from marathon_acme.tests.fake_marathon import (
    FakeMarathon, FakeMarathonAPI, FakeMarathonLb)
from marathon_acme.tests.helpers import failing_client

class TestParseDomainLabel(object):
    def test_single_domain(self):
        """
        When the domain label contains just a single domain, that domain should
        be parsed into a list containing just the one domain.
        """
        domains = parse_domain_label('example.com')
        assert_that(domains, Equals(['example.com']))

    def test_separators(self):
        """
        When the domain label contains only the separators (commas or
        whitespace), the separators should be ignored.
        """
        domains = parse_domain_label(' , ,   ')
        assert_that(domains, Equals([]))

    def test_multiple_domains_comma(self):
        """
        When the domain label contains multiple comma-separated domains, the
        domains should be parsed into a list of domains.
        """
        domains = parse_domain_label('example.com,example2.com')
        assert_that(domains, Equals(['example.com', 'example2.com']))

    def test_multiple_domains_whitespace(self):
        """
        When the domain label contains multiple whitespace-separated domains,
        the domains should be parsed into a list of domains.
        """
        domains = parse_domain_label('example.com example2.com')
        assert_that(domains, Equals(['example.com', 'example2.com']))

    def test_multiple_domains_comma_whitespace(self):
        """
        When the domain label contains multiple comma-separated domains with
        whitespace inbetween, the domains should be parsed into a list of
        domains without the whitespace.
        """
        domains = parse_domain_label(' example.com, example2.com ')
        assert_that(domains, Equals(['example.com', 'example2.com']))

is_marathon_lb_sigusr_response = MatchesListwise([  # Per marathon-lb instance
    MatchesAll(
        MatchesStructure(code=Equals(200)),
        AfterPreprocessing(
            lambda r: r.text(), succeeded(
                Equals('Sent SIGUSR1 signal to marathon-lb'))))
])

class FailableTxacmeClient(FakeClient):
    """
    A fake txacme client that raises an error during the CSR issuance phase if
    the 'error' attribute has been set. Used to very *very* roughly simulate
    an error while issuing a certificate.
    """

    def __init__(self, *args, **kwargs):
        super(FailableTxacmeClient, self).__init__(*args, **kwargs)
        # Patch on support for HTTP challenge types
        self._challenge_types.append(challenges.HTTP01)
        self.issuance_error = None

    def request_issuance(self, csr):
        if self.issuance_error is not None:
            # Server error takes an ACME error and a treq response...but we
            # don't have a response
            raise self.issuance_error
        return super(FailableTxacmeClient, self).request_issuance(csr)

class TestMarathonAcme(object):
    def setup_method(self):
        self.fake_marathon = FakeMarathon()
        self.fake_marathon_api = FakeMarathonAPI(self.fake_marathon)

        self.cert_store = MemoryStore()

        self.fake_marathon_lb = FakeMarathonLb()

        key = JWKRSA(key=generate_private_key(u'rsa'))
        self.clock = Clock()
        self.clock.rightNow = (
            datetime.now() - datetime(1970, 1, 1)).total_seconds()
        self.txacme_client = FailableTxacmeClient(key, self.clock)

    def mk_marathon_acme(self, sse_kwargs=None, **kwargs):
        marathon_client = MarathonClient(
            ['http://localhost:8080'], client=self.fake_marathon_api.client,
            sse_kwargs=sse_kwargs, reactor=self.clock)
        mlb_client = MarathonLbClient(
            ['http://localhost:9090'], client=self.fake_marathon_lb.client,
            reactor=self.clock)

        return MarathonAcme(
            marathon_client,
            'external',
            self.cert_store,
            mlb_client,
            lambda: succeed(self.txacme_client),
            self.clock,
            **kwargs)

    def test_listen_events_attach_initial_sync(self):
        """
        When we listen for events from Marathon, and we receive a subscribe
        event from ourselves subscribing, an initial sync should be performed
        and certificates issued for any new domains.
        """
        self.fake_marathon.add_app({
            'id': '/my-app_1',
            'labels': {
                'HAPROXY_GROUP': 'external',
                'MARATHON_ACME_0_DOMAIN': 'example.com'
            },
            'portDefinitions': [
                {'port': 9000, 'protocol': 'tcp', 'labels': {}}
            ]
        })

        marathon_acme = self.mk_marathon_acme()
        marathon_acme.listen_events()

        # Observe that the certificate was stored and marathon-lb notified
        assert_that(self.cert_store.as_dict(), succeeded(MatchesDict({
            'example.com': Not(Is(None))
        })))
        assert_that(self.fake_marathon_lb.check_signalled_usr1(), Equals(True))

    def test_listen_events_attach_only_first(self):
        """
        When we're listening for events and receive multiple
        ``event_stream_attached`` events, only the first received event should
        trigger the initial sync.
        """
        marathon_acme = self.mk_marathon_acme()
        marathon_acme.listen_events()

        # First attach event is from ourselves attaching...
        assert_that(
            self.fake_marathon_api.check_called_get_apps(), Equals(True))

        # Some other client attaches
        other_client = MarathonClient(
            ['http://localhost:8080'], client=self.fake_marathon_api.client)
        other_client_events = []
        other_client.get_events(
            {'event_stream_attached': other_client_events.append})

        # Make very sure that two clients are attached and event sent
        assert_that(other_client_events, HasLength(1))
        assert_that(self.fake_marathon_api.event_requests, HasLength(2))

        # No second sync from marathon-acme
        assert_that(
            self.fake_marathon_api.check_called_get_apps(), Equals(False))

    def test_listen_events_api_request_triggers_sync(self):
        """
        When we listen for events from Marathon, and something happens that
        triggers an API request event, a sync should be performed and
        certificates issued for any new domains.
        """
        marathon_acme = self.mk_marathon_acme()
        marathon_acme.listen_events()

        self.fake_marathon.add_app({
            'id': '/my-app_1',
            'labels': {
                'HAPROXY_GROUP': 'external',
                'MARATHON_ACME_0_DOMAIN': 'example.com'
            },
            'portDefinitions': [
                {'port': 9000, 'protocol': 'tcp', 'labels': {}}
            ]
        })

        # Observe that the certificate was stored and marathon-lb notified
        assert_that(self.cert_store.as_dict(), succeeded(MatchesDict({
            'example.com': Not(Is(None))
        })))
        assert_that(self.fake_marathon_lb.check_signalled_usr1(), Equals(True))

        # Try one more app
        self.fake_marathon.add_app({
            'id': '/my-app_2',
            'labels': {
                'HAPROXY_GROUP': 'external',
                'MARATHON_ACME_0_DOMAIN': 'example2.com',
            },
            'portDefinitions': [
                {'port': 8000, 'protocol': 'tcp', 'labels': {}},
            ]
        })

        assert_that(self.cert_store.as_dict(), succeeded(MatchesDict({
            'example.com': Not(Is(None)),
            'example2.com': Not(Is(None)),
        })))
        assert_that(self.fake_marathon_lb.check_signalled_usr1(), Equals(True))

    def test_listen_events_reconnects(self):
        """
        When we listen for events, and we connect successfully but the
        persistent connection drops, we should reconnect to the event stream
        and be able to receive new events.
        """
        marathon_acme = self.mk_marathon_acme()
        marathon_acme.listen_events()

        # Trigger a lost connection
        requests = self.fake_marathon_api.event_requests
        assert_that(requests, HasLength(1))
        request = requests[0]

        request.loseConnection()
        self.fake_marathon_api.client.flush()

        # Check a new request has been made
        requests = self.fake_marathon_api.event_requests
        assert_that(requests, HasLength(1))
        new_request = requests[0]

        # Make sure this is, in fact, another request
        assert_that(new_request, Not(Is(request)))

        # Check that apps will sync
        self.fake_marathon.add_app({
            'id': '/my-app_1',
            'labels': {
                'HAPROXY_GROUP': 'external',
                'MARATHON_ACME_0_DOMAIN': 'example.com'
            },
            'portDefinitions': [
                {'port': 9000, 'protocol': 'tcp', 'labels': {}}
            ]
        })
        assert_that(self.cert_store.as_dict(), succeeded(MatchesDict({
            'example.com': Not(Is(None))
        })))
        assert_that(self.fake_marathon_lb.check_signalled_usr1(), Equals(True))

    def test_listen_events_syncs_each_reconnect(self):
        """
        When we're listening for events and receive multiple
        ``event_stream_attached`` events, each reconnect should trigger another
        sync as we re-attach.
        """
        marathon_acme = self.mk_marathon_acme()
        marathon_acme.listen_events()

        # Check the initial sync happens
        assert_that(
            self.fake_marathon_api.check_called_get_apps(), Equals(True))

        # Trigger a lost connection
        requests = self.fake_marathon_api.event_requests
        assert_that(requests, HasLength(1))
        request = requests[0]

        request.loseConnection()
        self.fake_marathon_api.client.flush()

        # We reconnect and another sync should occur as we re-attach
        assert_that(
            self.fake_marathon_api.check_called_get_apps(), Equals(True))

    def test_listen_events_sse_timeout_reconnects(self):
        """
        When we listen for events, and we connect successfully but the
        persistent connection times out, we should reconnect to the event
        stream.
        """
        timeout = 5.0
        marathon_acme = self.mk_marathon_acme(sse_kwargs={'timeout': timeout})
        marathon_acme.listen_events()

        [request] = self.fake_marathon_api.event_requests

        # Advance beyond the timeout
        self.clock.advance(timeout)
        self.fake_marathon_api.client.flush()

        # Check a new request has been made
        [new_request] = self.fake_marathon_api.event_requests
        assert_that(new_request, Not(Is(request)))

    def test_listen_events_sse_line_too_long_reconnects(self):
        """
        When we listen for events, and we connect successfully but we receive a
        line that is too long, we should reconnect to the event stream.
        """
        marathon_acme = self.mk_marathon_acme(sse_kwargs={'max_length': 8})
        marathon_acme.listen_events()

        [request] = self.fake_marathon_api.event_requests

        request.write(b'x' * 9)
        self.fake_marathon_api.client.flush()

        # Check a new request has been made
        [new_request] = self.fake_marathon_api.event_requests
        assert_that(new_request, Not(Is(request)))

    def test_sync_app(self):
        """
        When a sync is run and there is an app with a domain label and no
        existing certificate, then a new certificate should be issued for the
        domain. The certificate should be stored in the certificate store and
        marathon-lb should be notified.
        """
        # Store an app in Marathon with a marathon-acme domain
        self.fake_marathon.add_app({
            'id': '/my-app_1',
            'labels': {
                'HAPROXY_GROUP': 'external',
                'MARATHON_ACME_0_DOMAIN': 'example.com'
            },
            'portDefinitions': [
                {'port': 9000, 'protocol': 'tcp', 'labels': {}}
            ]
        })

        marathon_acme = self.mk_marathon_acme()
        d = marathon_acme.sync()
        assert_that(d, succeeded(MatchesListwise([  # Per domain
            is_marathon_lb_sigusr_response
        ])))

        assert_that(self.cert_store.as_dict(), succeeded(MatchesDict({
            'example.com': Not(Is(None))
        })))

        assert_that(self.fake_marathon_lb.check_signalled_usr1(), Equals(True))

    def test_sync_app_multiple_ports(self):
        """
        When a sync is run and there is an app with domain labels for multiple
        ports, then certificates should be fetched for each port.
        """
        # Store an app in Marathon with a marathon-acme domain
        self.fake_marathon.add_app({
            'id': '/my-app_1',
            'labels': {
                'HAPROXY_GROUP': 'external',
                'MARATHON_ACME_0_DOMAIN': 'example.com',
                'MARATHON_ACME_1_DOMAIN': 'example2.com'
            },
            'portDefinitions': [
                {'port': 9000, 'protocol': 'tcp', 'labels': {}},
                {'port': 9001, 'protocol': 'tcp', 'labels': {}}
            ]
        })

        marathon_acme = self.mk_marathon_acme()
        d = marathon_acme.sync()
        assert_that(d, succeeded(MatchesListwise([  # Per domain
            is_marathon_lb_sigusr_response,
            is_marathon_lb_sigusr_response
        ])))

        assert_that(self.cert_store.as_dict(), succeeded(MatchesDict({
            'example.com': Not(Is(None)),
            'example2.com': Not(Is(None))
        })))

        assert_that(self.fake_marathon_lb.check_signalled_usr1(), Equals(True))

    def test_sync_multiple_apps(self):
        """
        When a sync is run and there are multiple apps, certificates are
        fetched for the domains of all the apps.
        """
        self.fake_marathon.add_app({
            'id': '/my-app_1',
            'labels': {
                'HAPROXY_GROUP': 'external',
                'MARATHON_ACME_0_DOMAIN': 'example.com',
            },
            'portDefinitions': [
                {'port': 9000, 'protocol': 'tcp', 'labels': {}}
            ]
        })
        self.fake_marathon.add_app({
            'id': '/my-app_2',
            'labels': {
                'HAPROXY_GROUP': 'external',
                'MARATHON_ACME_0_DOMAIN': 'example2.com',
            },
            'portDefinitions': [
                {'port': 8000, 'protocol': 'tcp', 'labels': {}},
            ]
        })

        marathon_acme = self.mk_marathon_acme()
        d = marathon_acme.sync()
        assert_that(d, succeeded(MatchesListwise([  # Per domain
            is_marathon_lb_sigusr_response,
            is_marathon_lb_sigusr_response
        ])))

        assert_that(self.cert_store.as_dict(), succeeded(MatchesDict({
            'example.com': Not(Is(None)),
            'example2.com': Not(Is(None))
        })))

        assert_that(self.fake_marathon_lb.check_signalled_usr1(), Equals(True))

    def test_sync_apps_common_domains(self):
        """
        When a sync is run and there are multiple apps, possibly with multiple
        ports, then certificates are only fetched for unique domains.
        """
        self.fake_marathon.add_app({
            'id': '/my-app_1',
            'labels': {
                'HAPROXY_GROUP': 'external',
                'MARATHON_ACME_0_DOMAIN': 'example.com',
                'MARATHON_ACME_1_DOMAIN': 'example.com'
            },
            'portDefinitions': [
                {'port': 9000, 'protocol': 'tcp', 'labels': {}},
                {'port': 9001, 'protocol': 'tcp', 'labels': {}}
            ]
        })
        self.fake_marathon.add_app({
            'id': '/my-app_2',
            'labels': {
                'HAPROXY_GROUP': 'external',
                'MARATHON_ACME_0_DOMAIN': 'example.com',
            },
            'portDefinitions': [
                {'port': 8000, 'protocol': 'tcp', 'labels': {}},
            ]
        })

        marathon_acme = self.mk_marathon_acme()
        d = marathon_acme.sync()
        assert_that(d, succeeded(MatchesListwise([  # Per domain
            is_marathon_lb_sigusr_response
        ])))

        assert_that(self.cert_store.as_dict(), succeeded(MatchesDict({
            'example.com': Not(Is(None))
        })))

        assert_that(self.fake_marathon_lb.check_signalled_usr1(), Equals(True))

    def test_sync_app_multiple_domains(self):
        """
        When a sync is run and there is an app with a domain label containing
        multiple domains, by default only the first domain is considered.
        """
        self.fake_marathon.add_app({
            'id': '/my-app_1',
            'labels': {
                'HAPROXY_GROUP': 'external',
                'MARATHON_ACME_0_DOMAIN': 'example.com,example2.com'
            },
            'portDefinitions': [
                {'port': 9000, 'protocol': 'tcp', 'labels': {}}
            ]
        })

        marathon_acme = self.mk_marathon_acme()
        d = marathon_acme.sync()
        assert_that(d, succeeded(MatchesListwise([  # Per domain
            is_marathon_lb_sigusr_response
        ])))

        assert_that(self.cert_store.as_dict(), succeeded(MatchesDict({
            'example.com': Not(Is(None))
        })))

        assert_that(self.fake_marathon_lb.check_signalled_usr1(), Equals(True))

    def test_sync_app_multiple_domains_multiple_certs_allowed(self):
        """
        When a sync is run and there is an app with a domain label containing
        multiple domains, and ``allow_multiple_certs`` is True, all domains
        are considered.
        """
        self.fake_marathon.add_app({
            'id': '/my-app_1',
            'labels': {
                'HAPROXY_GROUP': 'external',
                'MARATHON_ACME_0_DOMAIN': 'example.com,example2.com'
            },
            'portDefinitions': [
                {'port': 9000, 'protocol': 'tcp', 'labels': {}}
            ]
        })

        marathon_acme = self.mk_marathon_acme(allow_multiple_certs=True)
        d = marathon_acme.sync()
        assert_that(d, succeeded(MatchesListwise([  # Per domain
            is_marathon_lb_sigusr_response,
            is_marathon_lb_sigusr_response,
        ])))

        assert_that(self.cert_store.as_dict(), succeeded(MatchesDict({
            'example.com': Not(Is(None)),
            'example2.com': Not(Is(None)),
        })))

        assert_that(self.fake_marathon_lb.check_signalled_usr1(), Equals(True))

    def test_sync_no_apps(self):
        """
        When a sync is run and Marathon has no apps for us then no certificates
        should be fetched and marathon-lb should not be notified.
        """
        marathon_acme = self.mk_marathon_acme()
        d = marathon_acme.sync()
        assert_that(d, succeeded(Equals([])))

        # Nothing stored, nothing notified, but Marathon checked
        assert_that(
            self.fake_marathon_api.check_called_get_apps(), Equals(True))
        assert_that(self.cert_store.as_dict(), succeeded(Equals({})))
        assert_that(self.fake_marathon_lb.check_signalled_usr1(),
                    Equals(False))

    def test_sync_app_no_domains(self):
        """
        When a sync is run and Marathon has an app but that app has no
        marathon-acme domains, then no certificates should be fetched and
        marathon-lb should not be notified.
        """
        self.fake_marathon.add_app({
            'id': '/my-app_1',
            'labels': {
                'HAPROXY_0_VHOST': 'example.com'
            },
            'portDefinitions': [
                {'port': 9000, 'protocol': 'tcp', 'labels': {}}
            ]
        })

        marathon_acme = self.mk_marathon_acme()
        d = marathon_acme.sync()
        assert_that(d, succeeded(Equals([])))

        # Nothing stored, nothing notified, but Marathon checked
        assert_that(
            self.fake_marathon_api.check_called_get_apps(), Equals(True))
        assert_that(self.cert_store.as_dict(), succeeded(Equals({})))
        assert_that(self.fake_marathon_lb.check_signalled_usr1(),
                    Equals(False))

    def test_sync_app_label_but_no_domains(self):
        """
        When a sync is run and Marathon has an app and that app has a domain
        label but that label has no domains, then no certificates should be
        fetched and marathon-lb should not be notified.
        """
        # Store an app in Marathon with a marathon-acme domain
        self.fake_marathon.add_app({
            'id': '/my-app_1',
            'labels': {
                'HAPROXY_GROUP': 'external',
                'MARATHON_ACME_0_DOMAIN': '',
            },
            'portDefinitions': [
                {'port': 9000, 'protocol': 'tcp', 'labels': {}}
            ]
        })

        marathon_acme = self.mk_marathon_acme()
        d = marathon_acme.sync()
        assert_that(d, succeeded(Equals([])))

        # Nothing stored, nothing notified, but Marathon checked
        assert_that(
            self.fake_marathon_api.check_called_get_apps(), Equals(True))
        assert_that(self.cert_store.as_dict(), succeeded(Equals({})))
        assert_that(self.fake_marathon_lb.check_signalled_usr1(),
                    Equals(False))

    def test_sync_app_group_mismatch(self):
        """
        When a sync is run and Marathon has an app but that app has a different
        group to the one marathon-acme is configured with, then no certificates
        should be fetched and marathon-lb should not be notified.
        """
        self.fake_marathon.add_app({
            'id': '/my-app_1',
            'labels': {
                'HAPROXY_GROUP': 'internal',
                'HAPROXY_0_VHOST': 'example.com',
                'MARATHON_ACME_0_DOMAIN': 'example.com',
            },
            'portDefinitions': [
                {'port': 9000, 'protocol': 'tcp', 'labels': {}}
            ]
        })

        marathon_acme = self.mk_marathon_acme()
        d = marathon_acme.sync()
        assert_that(d, succeeded(Equals([])))

        # Nothing stored, nothing notified, but Marathon checked
        assert_that(
            self.fake_marathon_api.check_called_get_apps(), Equals(True))
        assert_that(self.cert_store.as_dict(), succeeded(Equals({})))
        assert_that(self.fake_marathon_lb.check_signalled_usr1(),
                    Equals(False))

    def test_sync_app_port_group_mismatch(self):
        """
        When a sync is run and Marathon has an app and that app has a matching
        group but mismatching port group, then no certificates should be
        fetched and marathon-lb should not be notified.
        """
        self.fake_marathon.add_app({
            'id': '/my-app_1',
            'labels': {
                'HAPROXY_GROUP': 'external',
                'HAPROXY_0_GROUP': 'internal',
                'HAPROXY_0_VHOST': 'example.com',
                'MARATHON_ACME_0_DOMAIN': 'example.com',
            },
            'portDefinitions': [
                {'port': 9000, 'protocol': 'tcp', 'labels': {}}
            ]
        })

        marathon_acme = self.mk_marathon_acme()
        d = marathon_acme.sync()
        assert_that(d, succeeded(Equals([])))

        # Nothing stored, nothing notified, but Marathon checked
        assert_that(
            self.fake_marathon_api.check_called_get_apps(), Equals(True))
        assert_that(self.cert_store.as_dict(), succeeded(Equals({})))
        assert_that(self.fake_marathon_lb.check_signalled_usr1(),
                    Equals(False))

    def test_sync_app_existing_cert(self):
        """
        When a sync is run and Marathon has an app with a domain label but we
        already have a certificate for that app then a new certificate should
        not be fetched.
        """
        self.fake_marathon.add_app({
            'id': '/my-app_1',
            'labels': {
                'HAPROXY_GROUP': 'external',
                'MARATHON_ACME_0_DOMAIN': 'example.com'
            },
            'portDefinitions': [
                {'port': 9000, 'protocol': 'tcp', 'labels': {}}
            ]
        })
        self.cert_store.store('example.com', 'certcontent')

        marathon_acme = self.mk_marathon_acme()
        d = marathon_acme.sync()
        assert_that(d, succeeded(Equals([])))

        # Existing cert unchanged, marathon-lb not notified, but Marathon
        # checked
        assert_that(
            self.fake_marathon_api.check_called_get_apps(), Equals(True))
        assert_that(self.cert_store.as_dict(), succeeded(
            Equals({'example.com': 'certcontent'})))
        assert_that(self.fake_marathon_lb.check_signalled_usr1(),
                    Equals(False))

    def test_sync_failure(self):
        """
        When a sync is run and something fails, the failure is propagated to
        the sync's deferred.
        """
        marathon_acme = self.mk_marathon_acme()
        marathon_acme.marathon_client = MarathonClient(
            'http://localhost:8080', client=failing_client)

        d = marathon_acme.sync()
        assert_that(d, failed(MatchesStructure(
            value=IsInstance(RuntimeError))))

    def test_sync_acme_server_failure_acceptable(self):
        """
        When a sync is run and we try to issue a certificate for a domain but
        the ACME server returns an error, if that error is of an acceptable
        type then it should be ignored.
        """
        self.fake_marathon.add_app({
            'id': '/my-app_1',
            'labels': {
                'HAPROXY_GROUP': 'external',
                'MARATHON_ACME_0_DOMAIN': 'example.com'
            },
            'portDefinitions': [
                {'port': 9000, 'protocol': 'tcp', 'labels': {}}
            ]
        })
        acme_error = acme_Error(typ='urn:acme:error:rateLimited', detail='bar')
        # Server error takes an ACME error and a treq response...but we don't
        # have a response
        self.txacme_client.issuance_error = txacme_ServerError(
            acme_error, None)

        marathon_acme = self.mk_marathon_acme()
        d = marathon_acme.sync()

        assert_that(d, succeeded(Equals([None])))
        # Nothing stored, nothing notified
        assert_that(self.cert_store.as_dict(), succeeded(Equals({})))
        assert_that(self.fake_marathon_lb.check_signalled_usr1(),
                    Equals(False))

    def test_sync_acme_server_failure_unacceptable(self):
        """
        When a sync is run and we try to issue a certificate for a domain but
        the ACME server returns an error, if that error is of an unacceptable
        type then a failure should be returned.
        """
        self.fake_marathon.add_app({
            'id': '/my-app_1',
            'labels': {
                'HAPROXY_GROUP': 'external',
                'MARATHON_ACME_0_DOMAIN': 'example.com'
            },
            'portDefinitions': [
                {'port': 9000, 'protocol': 'tcp', 'labels': {}}
            ]
        })
        acme_error = acme_Error(typ='urn:acme:error:badCSR', detail='bar')
        # Server error takes an ACME error and a treq response...but we don't
        # have a response
        self.txacme_client.issuance_error = txacme_ServerError(
            acme_error, None)

        marathon_acme = self.mk_marathon_acme()
        d = marathon_acme.sync()

        # Oh god
        assert_that(d, failed(MatchesStructure(
            value=MatchesStructure(subFailure=MatchesStructure(
                value=MatchesAll(IsInstance(txacme_ServerError),
                    MatchesStructure(message=MatchesAll(
                        IsInstance(acme_Error),
                        MatchesStructure(
                            typ=Equals('urn:acme:error:badCSR'),
                            detail=Equals('bar')
                        )
                    ))
                )
            ))
        )))
        # Nothing stored, nothing notified
        assert_that(self.cert_store.as_dict(), succeeded(Equals({})))
        assert_that(self.fake_marathon_lb.check_signalled_usr1(),
                    Equals(False))

    def test_sync_other_issue_failure(self):
        """
        When a sync is run and we try to issue a certificate for a domain but
        some non-ACME server error occurs, the sync should fail.
        """
        self.fake_marathon.add_app({
            'id': '/my-app_1',
            'labels': {
                'HAPROXY_GROUP': 'external',
                'MARATHON_ACME_0_DOMAIN': 'example.com'
            },
            'portDefinitions': [
                {'port': 9000, 'protocol': 'tcp', 'labels': {}}
            ]
        })
        self.txacme_client.issuance_error = RuntimeError('Something bad')

        marathon_acme = self.mk_marathon_acme()
        d = marathon_acme.sync()

        assert_that(d, failed(MatchesStructure(
            value=MatchesStructure(subFailure=MatchesStructure(
                value=MatchesAll(
                    IsInstance(RuntimeError),
                    MatchesPredicate(str, 'Something bad')
                )
            ))
        )))
        # Nothing stored, nothing notified
        assert_that(self.cert_store.as_dict(), succeeded(Equals({})))
        assert_that(self.fake_marathon_lb.check_signalled_usr1(),
                    Equals(False))


text:
Cardamom and Dill
A journey around a Mediterranean table
Tag: Oranges
Middle Eastern Cranberry and Pomegranate Relish Spiced with Ras el Hanout
Although it's true that we can enjoy cranberry sauce all year long, I love to make it myself the minute those jewel bright tart berries hit the market. Here's a quick recipe for a sauce with a distinctly exotic edge which you can make ahead and jar up ahead of the festive season. It's perfect with…
Lebanese Slaw with Mint, Oranges and Pomegranate Molasses
This gorgeous Lebanese shredded red cabbage, carrot and mint salad with oranges, red chilli, fresh herbs, toasted almonds, juicy pomegranate arils and pomegranate molasses is one of those versatile recipes that has it all. Sweet and sour flavours, texture and a fresh herby zing. It's perfect on its own, as part of a mezze table,…
Jaffa Orange, Feta and Almond Filo Pie with Wild Oregano
The classic Jaffa orange – shamouti – was originally developed by Palestinian farmers in the mid-19th century and takes its name from the city of Jaffa – Yafo – where it was first produced for export. These are the oranges that I was given as the occasional treat when I was a child so the intoxicating aroma of…
Hyères Elderflower and Orange Blossom Cordial and a French 77 Cocktail
There aren't many things as intoxicating as the scent of orange blossoms in the depths of winter, their heady aroma immediately transports me back to fine winter days in Provence. This isn't merely an emotional response, it's actually a physical one as the humble orange is revered for its uplifting mood enhancing properties. You don't have to travel…
Acre Amba Sauce
Amba sauce. When I think about it, I feel utter love because it's such a beautiful thing. If Amba were a man, I would run away with him. My first experience of this Iraqi sweet and sour mango condiment was as I sat on the harbour wall in the Crusader town of Acre north of Haifa in Israel….
San Marino Bustrengo, a Festive Apple, Fig and Polenta Cake
This is a traditional dessert from the not-so-humbly named 'The Most Serene Republic of San Marino' – Republica Serenissima – one of the world's smallest and oldest republics which, though not technically part of Italy, is surrounded by Emilia-Romagna and Le Marche regions near the Adriatic Sea making it an easy day trip from Florence…
Mallorcan Orange, Almond and Fig Cake
So many of you have asked for the recipe for this super moist gluten-free Mallorcan orange, almond and fig cake which often features on my restaurant menu. It is inspired by the miles and miles of fragrant blossoming orange and almond trees we passed by as we travelled via the extraordinary antique train – El Tren…
Provençal Endive and Walnut Salad with an Orange and Oregano dressing
Weirdly, I am beginning to think about Autumn. I blame the jet stream which is currently acting as a shield preventing the warm air of the south from entering our northern climes. But the nights are drawing in too; gone already are the gorgeous long days of endless light and, come sundown, the candles are…
Jewelled Pearl Barley with Mint & Orange Blossom Dressing
Every so often a new recipe book is published that gets everyone talking. Once such book is 'On the Side', a book of inspiring dishes from Rocket & Squash, a food journal created by Ed Smith. When the book was published a couple of weeks ago, Instagram literally went mad – I mostly follow people in the food business…
Cardamom and Dill Instagram

redpajama_set_name: RedPajamaCommonCrawl


text:
Rumor Roundup (Sept. 3, 2018): Rock vs. Roman Reigns, SmackDown tag title match, Evolution, ALL IN, more!
By Randall Ortman Sep 3, 2018, 1:00am EDT
Share All sharing options for: Rumor Roundup (Sept. 3, 2018): Rock vs. Roman Reigns, SmackDown tag title match, Evolution, ALL IN, more!
Speculating on the rumors surrounding pro wrestling is a favored pastime of many fans, perhaps second only to actually watching the matches. In this daily column, we take a look at the latest rumors being churned out by the pro wrestling rumor mill.
Important reminder: Rumors are just that -- rumors. None of this has been confirmed as legitimate news or fact, it's just circulating around the pro wrestling rumor mill. We track rumor accuracy in a weekly feature called Rumor Look Back you can find here. Remember, take it all with a grain of salt.
Rumors for the Day:
There continues to be talk of The Rock vs. Roman Reigns at WrestleMania 35, and the Wrestling Observer Newsletter indicates that could just depend on Rock's schedule.
Cesaro & Sheamus are expected to win the SmackDown tag team tournament to earn the next shot at The New Day.
Per the Observer, the WWE Evolution event still hasn't sold out and hasn't been a big success to this point, at least as far as ticket sales go.
According to Dave Meltzer and Bryan Alvarez on Wrestling Observer Radio, the main event six-man tag match at ALL IN was supposed to be 28 minutes and was cut to 12 after both the Hangman Page vs. Joey Janela and Marty Scurll vs. Kazuchika Okada went long.
Per PW Insider, Chris Jericho was snuck into the building during the Cody vs. Nick Aldis match and hid until it was time for his segment.
If you have heard of any interesting rumors that you'd like to add, feel free to post them in the comments section below. Just remember they are rumors and not confirmed as fact, so please take them as such. Have fun with it. And check our weekly Rumor Look Back here to keep track of how often rumors turn out to be correct!


text:
Things that bug me about Friends (that also show I've watched it far too much)
I am a big lover of the TV programme Friends. All these years after it finished I'll still quite happily watch it over and over again. I have the complete box set which was a life-saver during the newborn-constant-feeding phase. I still cry every time Rachel gets off the plane.
The show has been back in the news recently after someone found aclip where Rachel wasn't Rachel and it sent shock waves around the world.
Now, I'm ok with them using stand-ins and I'll let the fact that one of them made it into the show slide.
But, there are one or two other things about Friends that bug me. And here they are:
1) When Monica says "People have got to finish their shtories".
I can't be the only one who's noticed this! In 'the one with the red sweater', when Joey, Phoebe and Monica are first starting to work out who the father of Rachel's baby is, Monica says this line with a kind of lisp. Watch at 2.07!
I know it's irrational, but this really bugs me! Surely someone noticed? Could they really not do just one more take?
2) When Monica does the washing up while wearing Emily's wedding dress.
Seriously? Monica the clean freak would seriously do the washing up while wearing someone else's wedding dress?! And play with the dress while still wearing the rubber gloves? I don't think so!
3) When Joey is made out to be a complete idiot when he's trying to learn French.
Ok, so he can learn to say "frontal temporal zygomatic craniotomy" and "Caravaggio uses chiaroscuro here to highlight the anguish of the central figure" but he can't manage to say "Je m'appelle Claude"?
I know he's not the brightest person ever, but even he's not that dumb. This bothers me so much that I really don't like to watch it, so I've got no idea what else happens in that episode!
Please tell me I'm not the only one who's bothered by these things! That would mean I really have just watched the programme too many times, but I'm not ready to stop watching it yet!
Me. Help. Mummy. (Wicked Wednesdays)
Relish the remarkable ride.
Random Musings 11/03/2017 at 11:46 am
I'm like you, I have re-watched it so many times! I do love it but there are so many inconsistencies. The one that bothers me most is in the very first episode where Rachel turns up and Monica introduces her to everyone, making it quite clear she only knew Ross. Then later on, there are flashbacks that show Chandler at Ross's parents house on Thanksgiving when Rachel is there too. It even comes out that Rachel and Chandler once kissed at a frat party! #TheList
Charlene 11/03/2017 at 1:40 pm
That stand in thing is so weird, you could have so done that shot without seeing Rachel! I agree the continuity with their history is a little off but I'll forgive them because I love flashback scenes so much. #TheList
Madeline 12/05/2017 at 8:58 pm
Oh that does bother me, about Chandler and Rachel knowing/not knowing each other! x
carolineI ju 11/03/2017 at 9:10 pm
Friends is my go to program too, I could watch it over and over again. there are niggles but overall I just love it, would have loved to have seen a reunion episode but its been too long now. #TheList
I think you're right, a reunion episode now would just be a bit odd. Now, a Gilmore Girls reunion episode would be great! x
Silly Mummy 11/04/2017 at 5:39 pm
Haha – never noticed Monica's shtories before! But I do hear that a lot in things where people say things wrong & it is left. I often wonder if they just figure that is okay as it is realistic to life for people to mispronounce or use the wrong words. I did always wonder about the wedding dress, though. & good point about Joey, Also, I know that the mother of Monica & Chandler's babies was pretty stupid, but what about them?? Did they not see scan pictures? What about the appointments they went to with her? What about the extra care and monitoring for twin births? How could they not know it was twins?? & Phoebe had triplets, naturally, overdue?? I realise that they just don't bother with letting accuracy get in the way of humour in these programmes though! #thelist
Oh the whole surprise twin thing was ridiculous! Pretty sure it would've come up beyond a comment from the doctor that "both heartbeats are good"! x
You Baby Me Mummy http://www.youbabymemummy.com 12/03/2015 at 9:03 am
Ha ha! I LOVE friends and think I almost know it all word for word. Yes I have not noticed those things before! Thanks for linking up to #TheList x
Haha, hope these things don't bug you now I've pointed them out to you! x


The Providence Chinatown project has been made possible by the generosity of community members who shared their stories of growing up, raising families, and building community in Providence. In light of the collaborative nature of this project, we invite Providence community members, researchers, and other individuals to add their photos and materials related to Providence's Chinatowns through our HistoryPin collection. Each pin you add helps build an interactive map of the past and present cityscape of Providence, helping us to remember the history of Chinese American contributions to our city and their legacy into the present.


Nurses touch their patients' lives like no one else can, and they deserve some recognition for being so awesome (and having so much patience)! Give thanks with this fabulous 15 oz. glass hand painted with love.


text:
Finch's, Sadlocks, and Flex...
I met Kevin, Eric, Glenn, Kevin, and Jace at Finch's for brunch. They actually gave us lunch menus, which I'd never seen before.
I've had a chicken salad sandwich, and their tuna salad sandwich, several weeks ago when Joe and I met the EAGLE group for the hike at the Eno.
Part way through the meal, Jace noticed that the wallpaper had been replaced in the room in which we were eating. I made some joke about them being desperate to raise the sanitation rating.
Later, the waitress said that that was the reason they'd changed it. They're to the point there that they can't raise their rating any more without doing things to the building.
Another thing they had to do was replace three sinks, because 1) they were square instead of round, and 2) they weren't stainless steel.
I stopped by Sadlock's Heroes tonight, as Brent had told me yesterday that he was playing there from 7-9 PM. I know he has a great voice, and to be honest I thought it would be an interesting experience, as that place is somewhere I would never find myself going on my own.
An experience it was indeed. It calls for a whole separate entry, which I'm going to write, and then post, later.
Dancing was festive tonight, but not as much as we thought it would be.
Someone said that someone who works at Flex said that the Wednesday before Thanksgiving is traditionally the second busiest night of the year. It certainly wasn't that. It's busier there for Trailer Trash Drag Nights than it was tonight.
SIGDOC 2012 Conference—Day 2, dining with friends, and some line-dancing & two-stepping with Casey..
~Friday~ The second, and final, day of the conference offered to sessions, again with three presentations each, followed by a "Wrap-up and Feedback"…
Technology, disease, and potentially Listeria-ladened onions...
~Friday~ Tonight, while having dinner, my phone vibrated indicating an 800 number call, which I didn't take. About 10 minutes later, it vibrated…
For the smell of god: Places I could never work in Crabtree Valley Mall...
~Monday, Labor Day~ I ate too much at a lunch-time cookout, and then slept like a slug late in the afternoon for two hours. By the time I got up, it…


Latinx families will provide a delicious homemade lunch for a small donation. This event will offer the community a chance to learn more about what each branch of AIRC does, how to get involved, and local issues that are affecting our Latinx community.
Please join us, even for part of the day. It should be a great discussion, fun company, and a fruitful way to do good things in the community we live in. All are welcome.
▪ Lunch, art and Music 12:10-1:00 PM 50min.
▪ 3:10-3:40 Auditorium Adelina Niclos GLAHR Keynote Remarks.


Flood wave dynamics are determined by a robust and accurate Lagrangian block advection (LBA) scheme that can track the dry-and-wet interface and capture the shocks without using any slope limiter to control the numerical oscillations. Two series of challenging numerical problems are considered using the LBA. First, computations are carried out for water waves in a parabolic bowl. The wetting-and-drying interface on the surface of the bowl is tracked by the LBA method with absolute computational stability. The accuracy of the LBA method is verified by the convergent of the numerical solution to an exact solution. Finally, the LBA method is applied to carry out a series of flood wave simulations, which have closely reproduced the data obtained from the laboratory experiments.


Zapier allows you to sync your call data coming through CallTrackingMetrics into many different systems easily by creating zaps between CTM and your choice of CRMs, metrics providers, and reporting systems.
Integrating your CallTrackingMetrics account to Zoho CRM is easy using Zapier's trigger system. To get started, simply set your 'zap' at zapier.com, then choose CallTrackingMetrics as the trigger and Zoho as the action. To set up this trigger, you will need to subscribe to Zapier's premium service. This zap will start syncing call data into Zoho.
Integrating your CallTrackingMetrics account with SugarCRM is easy using Zapier's trigger system. To get started, simply set your 'zap' at zapier.com, then choose CallTrackingMetrics as the trigger and SugarCRM as the action. To set up this trigger, you will need to subscribe to Zapier's premium service. This zap will start syncing call data into Sugar.


text:
Q: What does "a relation is least" mean? In the ECMAScript spec, it says:

A Relation is least with respect to some conditions when it is the smallest Relation that satisfies those conditions.

To be honest, I do not really understand the meaning of this sentence. Can you provide examples when a relation is smaller than another relation, and explain why?

redpajama_set_name: RedPajamaStackExchange


Mini Rice Mill Machines, Atta Chakki Machines, Plants, Machineries, Flour Mill Plants, JALGAON 425003, INDIA. Atta Mills. Send Enquiry. Mangla Trading Crop.
Natraj atta chakki at jalgaon maharashtra Delhi Buy Nataraj Atta Chakki Machine Price Maharashtra. Chat Online flour mill home use price in maharashtra .
Manufacturer of Atta Chakki Machines Automatic Atta Chakki, We are renowned as one of the most dependable wheat grinding machine manufacturers from india.
About Us client's Says. There Wheat Chakki Atta Mill Machinary Plant. Pankaj Dal Mill,Vardha Kiran Oil Industries,Jalgaon:Destoner Machine.
View Rajdhani Chakki Atta, details & specifiions from Bhavin Agri Infra Pvt.ltd, a leading Manufacturer of Organic Wheat Flour in Industrial Area, Jalgaon, Maharashtra.


text:
Inom matematiken är Hardy–Littlewoods cirkelmetod en av de viktigaste och oftast använda teknikerna inom analytisk talteori. Metoden är uppkallad efter G. H. Hardy och John Littlewood, som utvecklade den tillsammans med Srinivasa Ramanujan i en serie publikationer om Warings problem.

Historia
De viktigaste idéerna inom metoden utvecklades troligen i samband med Hardys och Ramanujans arbete under åren 1916 och 1917 om tillväxten av partitionsfunktionens tillväxt. Metoden användes sedan av många andra forskare, såsom Harold Davenport och I. M. Vinogradov, som modifierade formuleringen något (istället för komplex analys använde de exponentiella summor) utan att förändra huvudingredienserna. Hundratals artiklar där man använder metoden har följt, och metoden ger fortfarande nya resultat.

Referenser

Källor

 K. K. Mardzhanishvili, Ivan Matveevich Vinogradov : a brief outline of his life and works, in I. M. Vinogradov, Selected works (Berlin, 1985)
 v

Analytisk talteori

redpajama_set_name: RedPajamaWikipedia


As I told you when I started blogging, my health was the motivation for me to change my lifestyle. I had this moment of clarity at a regular check-up when my blood pressure was high enough that I was not allowed to leave until it came down. At that moment, it really hit me that either I changed my lifestyle or I might not be around to meet my grandchildren. It crystallized for me that this was my do-over and that it might be my last one. That sounds like a little hyperbole, but it's not as outlandish as it first appears. I'm in my mid-40s – five years younger than the (as of yesterday) late James Gandolfini.
The actor carried a great deal of fat around his middle, the most dangerous fat distribution. As we discussed before, abdominal fat is linked to higher rates of cardiovascular disease. Reports are that Gandolfini died of either a heart attack or a stroke. Now, I realize that I'm making some assumptions here when I don't have all of the facts. I do not have any kind of insider information. I'm going with the cause of death reported in the media (dangerous to trust anything in the media, I know). And I'm making a connection between that and his appearance. My conclusion is reasonable.
The man was only 51 years old. How old am I? How old are you? How long before my beloved ice cream gives me a stroke? How long before that heart-attack-in-a-sack goes off in your chest? Will we survive the wake up call or will it serve to wake someone else?
Why risk it? We have to make the changes we need to make today. Eat more vegetables. Eat less refined sugar. Eat less flour. Eat cleaner, more natural foods. Increase your activity. Walk more. Sit less. Move.
I never had HBO and never watched The Sopranos; but, I'd seen Gandolfini in other projects. I appreciated his talent and am saddened that he's dead. The real weight on my mind right now, though, is the wife he leaves behind and his children – a teen-aged son and an infant daughter who will never know her father. It is for them that my heart breaks.
This entry was posted in Exercise, Food, Habits. Bookmark the permalink.
← Push 'Em Back, Push 'Em Back, Swayback!


Sometimes you don't have to take a plane to get to France — all you have to do is walk. This Friday and Saturday from 10 a.m. to 5 p.m., Wisconsin Avenue between P Street and Reservoir Road will transform into a Parisian neighborhood, complete with a European-style open market. The 9th Annual Georgetown French Market will offer a range of activities to suit the diverse interests of the Georgetown community as well as aim to stimulate local businesses in the Book Hill area.
Because of this desire to serve the community, this weekend's event features not only heavy discounts at sidewalk sales for boutiques, like Urban Chic and duo, and art galleries, but also French-style entertainment like mimes, stilt walkers and live music.
Of course, food is a central part of the French cultural experience and therefore a keystone feature of the Georgetown French Market. They'll be serving up a variety of authentic dishes, from Frenchmerguez sausages to savory crepes and delicious French pastries. Several local restaurants will also be featured, including those that serve French cuisine, such as Café Bonaparte and Patisserie Poupon, and some traditional American favorites, like Clyde's and Bookhill Bistro.
In addition, on Saturday visitors can enjoy the rare opportunity to tour some of the most high-end and exquisite homes in the area. The 81st Georgetown House Tour will feature eight to 10 of the most beautiful homes and gardens in Georgetown.
With an event that truly offers visitors a taste of the D.C. lifestyle, the 9th Annual Georgetown French Market is a great way to spend your weekend not physically far from campus but a world away.


text:
Q: .Jar file runs well from NeBeans but not from /dist lib I am a bit new at Java and Netbeans but I've heard that you are a great and helpful community, so could you give me an advice how is it possible that a source code (after compiled) works fine if I hit the green triangle in NetBeans, but if I open the contain of the DIST/jar file (outside from NetBeans) it is not?
More precisely the application runs well but one specific function doesn't run when I click a button (PDF generation with iText plugin).
Here is a part of code of the not working method (as I mentioned the button works, but only if I start my App from NetBeans)
If I remove the image reference, the Application runs well from outside (total commander, /dist/myapp.jar, Enter), but I really would like to use the image in the PDF file. The path is good (since it is working from netbeans)
So I am 100% sure that the .jar does not find the logo (if it works without it,) but then how could it find if it is started from NetBeans? What could I rewrite at the path? (I tried "/", "@", "/src" while the .png can be found at /src just like the other pictures (which are loaded perfectly) )
 public void pdfGenerate(String title, String text) {

  ............................
        document.open();
        Image image1 = Image.getInstance("src/logo.png");
        image1.scaleToFit(200, 86);
        image1.setAbsolutePosition(200f, 750f);
        document.add(image1);

        document.add(new Paragraph("\n\n\n\n\n" + text, FontFactory.getFont("font", BaseFont.IDENTITY_H, BaseFont.EMBEDDED)));

    } catch (Exception e) {
        e.printStackTrace();
    }
    document.close();
  ...............................
  }

A: When you package your application as a jar file, the resources should be packaged there too. The method you are calling interprets the string as a filename; that file will not be present on the system when the jar file is created and deployed.
What you need to do is specify a URL for the resource. You can do this using getClass().getResource(...). If you specify a resource path here starting /, it will be interpreted relative to the classpath; otherwise it is relative to the current class.
Note that there is an overloaded form of Image.getInstance(...) taking a URL.
So, it looks like you need
Image image1 = Image.getInstance(getClass().getResource("/logo.png"));

You can also check the contents of the jar file from the command line with
jar -tf yourfile.jar

to make sure the image file is in there.

A: Did you try to specify relative path from the jar-file to your image?
Your src-folder is packed into the jar, but you are trying to get external file (image).
Check if src-folder still located in the same folder with jar.
If it doesn't exist try to create it manually and place image there.


Taylor, Monica and Klein, Emily J., "A Year in the Life of a Third Space Urban Teacher Residency : Using Inquiry to Reinvent Teacher Education" (2015). All Books and Media by Montclair State University Authors. 95.


More Info: A 30 year old sports betting professional from Ottawa, Ontario, Canada. After graduating with a business degree from the University of Ottawa I decided to get into the sports betting industry full time. I run the site here at Sports Betting Canadian and write the majority of the content. All of the pages here on the site will have been written by me and I do all the writing for the hockey, soccer, tennis and UFC picks articles.
The second of two massive boxing matches this year (GGG vs Canelo 2 being the other) is taking place this Saturday, December 1st at Staples Center in Los Angeles. Two ….
It was another rough week for my NFL picks in week 12. I went 0-2 after the Bengals got absolutely destroyed by the Browns, and the Packers came up a ….
I took two underdogs this past week. Both teams lost by under a touchdown and more than a field goal, but only one beat the spread for a 1-1 week. ….
And then there were two. The Redblacks and Stampeders both advantage of their home field + bye week advantage and booked their spots in the 2018 Grey Cup. I took ….
The Divisional Finals are in the books and the 2018 Grey Cup is set for next Sunday at Commonwealth Field in Edmonton. Last weekend the Redblacks took control of their ….
The Jaguars came through for me down the stretch, scoring the final 10 points of their game with the Colts to lose by 3 resulting in a push on my ….
And then there were four. The Hamilton Ti-Cats absolutely thrashed the BC Lions this past Sunday, and the Blue Bombers were able to go into Saskatchewan and get a big ….
The 2018 CFL regular season is in the books. I went 2-1 in the final week of the season to finish the regular season on a winning note and conclude ….
The UFC is heading to Denver this Saturday for a Fight Night card that includes four great fights. The UFC has a busy month of November with something going on ….
The Lions let me down yet again last week, but the Panthers came through an easily covered the spread against the Bucs to leave me with a 1-1 week 9. ….


text:
NEW LEXUS IS – EVOCATIVE SPORTS SEDAN DESIGN, FOCUSED DRIVING DYNAMICS AND ADVANCED TECHNOLOGY
The new Lexus IS sports sedan has made its global debut revealing a dramatic exterior design, superb dynamic standards and state-of-the-art driving technology.
Arriving in Australia in late 2020, the new IS blends stunning style with focused rear-wheel-drive handling honed at the company's new technical centre in Shimoyama, Japan – as well as Lexus-debut technology including more advanced Lane Tracing Assist1, and new Driver Emergency Stop Assist1 and Emergency Steering Assist1.
The IS reimagines the sports sedan concept with a low and wide stance, the sleek proportions of a four-door coupe, slimmer headlights and a lower, sharper side character line that combine to express a centre of gravity closer to the ground.
Gently sloped rear-quarter pillars, which help form a sleek cabin silhouette that wraps around from the sides, contrast with muscular rear guards and available 19-inch alloy wheels to create a fast and aggressive look.
This is further emphasised by single-blade rear combination lights sporting an "L" motif and a sharper overall contour created by the character line around the bootlid.
The elaborate and dimensional forms unique to Lexus are made possible by the use of drawing die construction, the latest in high-precision stamping technology that adds a mechanism that slides in tandem with the movement of the stamping press.
Body rigidity is enhanced in the new IS by reinforcing radiator side supports, increasing the number of front-side-member weld points and optimising structures from the rear-quarter pillars to the sides of the roof, among other areas.
This contributes to the new IS continuing in the finest handling-led traditions of the nameplate by becoming the first Lexus to debut the "Lexus Driving Signature" that will become the development standard for all future Lexus models.
The "Lexus Driving Signature" is defined by linear vehicle operation that is faithful to a driver's intentions, providing seamless transition from braking to steering and acceleration through a corner.
These Lexus dynamic values were achieved by utilising the country road test course at the company's new technical centre in Shimoyama, Japan, which opened in 2019.
The country road test course is based on many years of Lexus experience of driving on the Nürburgring Nordschleife, famous throughout the world for its gruelling driving conditions.
It was designed to take advantage of the local topography, featuring approximately a 75-metre change in elevation, a wide range of curves and a variety of road surfaces.
By repeatedly subjecting both vehicle and engineers to daily tests in this severe driving environment, Lexus was able to devise an ever-higher dimension of vehicle performance.
This approach also enabled maximum driver engagement and the fun of driving to coexist in the new IS with unwavering Lexus virtues of supreme ride comfort and exemplary refinement.
Thorough tuning was conducted for multiple road conditions and driving situations to improve elements such as responsiveness to driver input and the suppression of unnecessary movement in sprung mass.
New swing-valve shock absorbers have been employed and are equipped with ultra-low-velocity valves that respond to even minor road irregularities, generating the most appropriate damping force.
Even when the stroke speed of the shock absorbers is low, appropriate damping force will be exerted to provide excellent responsiveness on all surfaces and result in ride quality that is consistently even.
The availability of new-design 19-inch tyres improves cornering performance. Hub bolts are used to fasten the wheels, resulting in tight handling and braking due to increased fastening strength and reduced mass.
The enhanced body rigidity has further aided in the elimination of unwanted noise and vibration while improving ride comfort, as well as enhancing steering response.
Improvements have been made not only in the greater responsiveness of the steering but also the controllability and smoothness upon "returning to centre".
Pre-production model shown. Final range and specifications may differ from those depicted.
With available 18-inch wheels (comparative to the previous IS F Sport) the latest Lexus sports sedan rides on a 45mm-wider front track and 50mm-wider rear track.
Outstanding chassis performance allows the acclaimed Lexus powertrains to reach new heights, which offer customers a diverse matrix of low emissions, energetic performance and immediate response.
A focus on imaginative technology continues in the hybrid IS 300h with improved throttle response delivering more immediate acceleration from the 2.5-litre normally aspirated four-cylinder engine and electric motor pairing.
This advanced powertrain now combines greater driver engagement with incredibly low fuel consumption and emissions.
For customers seeking a fine balance of performance and efficiency, the advanced 2.0-litre turbocharged four-cylinder version in the IS 300 now features enhanced adaptive control for the eight-speed automatic transmission.
The transmission more actively selects the most-appropriate gear for each driving situation, providing increased response to drivers.
An eight-speed automatic transmission also continues to be available in the 3.5-litre normally aspirated V6-powered IS 350, which provides the superb power, immediate throttle response and emotive soundtrack for which the grade is renowned.
The design, dynamic and performance qualities of the new IS are further supported by the application of state-of-the-art multimedia and safety technology.
Inside the 10.3-inch display screen features newly forward-mounted positioning, touch-display functionality and Apple CarPlay®2 and Android AutoTM2 compatibility for the first time compared with the outgoing IS.
The high-resolution display complements the renewed ambience of the IS cabin, which features key firsts.
This includes a new form of Lexus decorative expression for part of the door trim, which features a graphic pattern of embossed intersecting lines, new accents in surface treatments and decorative ornamentation finished for the first time in Ash – open-pore black, Black Geometric Film, or F Sport-exclusive Satin Chrome.
Available chromatic colours are used on the upper instrument panel and new two-tone colour schemes – Ochre and F Sport-exclusive Flare Red – are available.
Lexus Safety System+ has also been upgraded with newly added functions to create a safer on-road experience, including the addition or enhancement of:
Lane Trace Assist1. This system now features improved lane recognition performance aids stability and comfort by automatically reducing vehicle speed to ensure constant g-forces while driving through curves.
Driver Emergency Stop Assist1. If a driver does not respond to lane-departure warnings, Driver Emergency Stop Assist can gently reduce speed – and even stop the car in its lane – while activating hazard lights and the horn. It can then unlock the doors and activate an emergency rescue request.
Emergency Steering Assist1. This system can actively assist steering within the vehicle's lane as cued by the driver.
Pre-Collision Safety System1. This system been expanded to include intersection detection, where during right turns the system responds to vehicles and to pedestrians crossing the street from the direction toward which the vehicle was travelling before it started to turn.
Low Speed Acceleration Control1. This system supports the prevention of collisions caused by pedal misapplication at low speed.
Lexus International chief designer Kenichi Hirai said the aim for the new IS was to achieve an aggressive design that evokes a sense of driving.
"To achieve a high degree of design, Lexus members in product planning, production technology, engineering, and styling combined their various insights and united behind development from an early stage," Mr Hirai said.
"This enabled us to achieve the proportions of a four-door coupe that has a low centre of gravity, an explicit form, and other elements that express the worldview of the new IS," he said.
"We also pursued a deep and rich interior by paying close attention to detail, such as in the use of colour in design and as in ornamentation. I think the styling makes it possible to feel the maturation of the fun of driving."
Lexus Australia Chief Executive Scott Thompson said the new IS represents a key opportunity in the Australian market as a rear-wheel-drive mid-sized sports sedan taken to new heights.
"Australian customer preferences align perfectly with the focus on sharp design, dynamic performance and cutting-edge technology with the stunning new IS, making it an important addition to Lexus dealerships later this year," Mr Thompson said.
"Combined with Lexus values of customer care and the experiences delivered by the renowned Encore program, loyal and new luxury customers will be delighted by both the new IS and the Lexus luxury lifestyle," he said.
"The IS also joins the successful ES to reinforce the Lexus commitment to the passenger vehicle segment, providing customers the luxury of choice with sedans that deliver diverse appeal."
The IS remained the top-selling Lexus passenger car in 2019 with 818 sales, complemented by a 183.3 per cent year-on-year increase in ES sales to 561. Last year the IS and ES also increased the Lexus share within their segment.
The IS remains the brand's highest-selling nameplate in Australia, with a cumulative 46,187 sales (to May 2020) since the nameplate's launch in 1999. Globally, the IS sales tally stands at 1.09 million.
WITNESS THE UNVEILING OF THE NEW IS
.1 Driver assist feature. Only operates under certain conditions. Check the Owner's Manual for explanation of limitations. Please drive safely.
2 Requires compatible device, USB connection, mobile data, network reception & GPS signal. Mobile usage at user's cost. Apps subject to change. For details see lexus.com.au/connectivity.
CarPlay® is a trademark of Apple, Inc. registered in the U.S. and other countries. Android Auto™ is a trademark of Google LLC.


text:
Trump advisers must tell him when it's time to go: OSCE election observer
Last modified: 07 November, 2020, 10:31 pm
America and the world: how to build back better
Some Twitter employees 'lock their accounts fearing reprisal from Trump supporters'
US troops in Afghanistan now down to 2,500, lowest since 2001: Pentagon
Bolsonaro is following Trump's anti-democracy playbook
The head of the mission sent by the main European security and rights organisation to monitor the US presidential election said Donald Trump's advisers must make clear to him he has lost in the likely event that this result is confirmed.
German politician Michael Link told the Funke newspaper group that Trump's allegations of fraud and cheating in the vote-counting process were unfounded and risked undermining confidence in the US democratic system.
Trump, 74, has been defiant as his chances fade for securing a second four-year term. He has made repeated and unfounded claims of electoral fraud, while his campaign pursues lawsuits that legal experts say are unlikely to alter the election outcome.
"The American President has a great responsibility for preserving calm in the US," Link was quoted as saying. "I'm not sure this is clear to him."
He added: "I can only hope that Trump has well-intentioned advisers who will tell him if he has lost. All indications are that that is the result which we will soon see."
Link leads the mission of the Organisation for Security and Cooperation in Europe (OSCE), of which the US is a founder member, which has for decades sent delegations to monitor the probity of elections around the world.
OSCE election observer / Trump
Peru's Keiko Fujimori says would pardon father if elected president
EU needs 'masterplan' to grab euro finance from London


text:
By David B. Wilkerson
DavidB. Wilkerson
FCC affirms CBS Super Bowl fine
CHICAGO (MarketWatch) -- The Federal Communications Commission said Wednesday that it rejected a request by CBS Corp. to reconsider the $550,000 indecency fine leveled against the network over an incident that occurred during the telecast of Super Bowl XXXVIII two years ago.
During the halftime show of that broadcast, Jackson's breast was briefly exposed when singer Justin Timberlake yanked on her outfit.
After parents' groups and others protested, the FCC levied the $550,000 fine against CBS, ruling that its violation of indecency rules was "willful."
CBS had argued that the halftime show was not indecent, and that the commission's definition of indecency was "unconstitutionally vague" and too broad. The network also said that the broadcast of Jackson's breast was accidental, and therefore couldn't be characterized as willful.
The FCC describes broadcast indecency as "language or material that, in context, depicts or describes, in terms patently offensive as measured by contemporary community broadcast standards for the broadcast medium, sexual or excretory organs or activity."
The commission rejected the notion that the exposure was accidental, saying that the halftime show was "consciously and deliberately" broadcast, and that CBS "failed to take reasonable precautions to ensure that no actionably indecent material was broadcast."
In response to the argument that its indecency standard is unconstitutional, the FCC pointed out that its rule has "been upheld in a series of decisions and has not been invalidated by subsequent developments in the legal or technological landscape."
CBS Corp. CBS, +31.58% shares rose 1.6% to close at $25.91 on Wednesday.
David B. Wilkerson
David B. Wilkerson is a reporter for MarketWatch in Chicago. Follow him on Twitter @dbwilkerson.
Bard Ventures Ltd. Canada: TSX Venture: CBS
Market Cap 3.2M


Essential oils are extracted from plants. It is said that each scent has its own unique potential health benefit, from reducing stress to boosting energy and immunity. Learn how to use essential oils safely to improve your kids and pets' health and wellness.
Join adult education's long-running book club as we discuss a variety of books: contemporary and classic, fiction and non-fiction We'll read The Great Alone by Kristin Hannah. Class meets every other Monday. You must register with the adult ed office or online.
Caring Unlimited invites you to a safe, interactive workshop where you'll learn how their services can help end domestic abuse in our community. Explore what domestic abuse is, why it happens and how to support safety for victims. An interactive presentation will introduce you to safety planning and teach you practical ways to be safer and where to get help. This important class can be the beginning of change for you or someone you know. Confidentiality respected. No discounts.
This is a short orientation on how to write an essay for the HiSET exam. In order to enter this program, some testing and completion of paperwork are required. Please call our office at 929-9185 to set up an appointment to meet with our advisor.
Do you dream of owning your own home but aren't sure where to start? If you answered yes, then this class is for you! Come to learn the ins and outs of the mortgage process in a no-pressure, relaxed environment. Get answers to your housing questions, understand why and how credit is important and learn about the different mortgage options available. Taught by an industry professional, you will leave this class empowered with the knowledge you need to make the jump to home ownership.
Geocaching is a real-world, outdoor treasure hunting game using GPS-enabled devices. Join us for this one night workshop, find out how geocaching can be a fun, easy way to get exercise for your body and your mind! If you have a smartphone, you can geocache. In this class, we will go over all the symbols, acronyms, and types of geocaches and how to log them. There's a whole world of geocaching information waiting to be discovered and we'll make it easy for you. The first session will be in the classroom and in the second we will go off-site where we will set out to discover a geocache of your own.
Are you looking for a dry, safe, well-lit place to walk? This required orientation will kick off the program, providing information on techniques, proper stretching, goal setting, and the "rules of the road/hallways". You will receive health tips and resources along the way. Indoor shoes required. No Discounts.
Orientation: Monday 1/28 at 5:30 p.m. (new walkers only) in Room 23 No walking 3/6, 3/14, 4/24 and School Holidays.


We help you save money while shopping online at Cost Plus World Market.com. We offer the best coupons, deals, discount sales and promotional codes for thousands of online stores, including Cost Plus World Market and more. Cost Plus World Market coupon codes are a great way to save money and to get the discount price for the products you want to buy at Cost Plus World Market online store. After you are finished shopping, enter the Cost Plus World Market promotional code into the coupon or deal box during the checkout process at Cost Plus World Market website.
Search: Cost Plus World Market, Cost Plus World Market.com online shopping, discount, online store and leading outlet store chain, offering valuable products for women, men and gifts. www.Cost Plus World Market.com online store offers variety of high quality products and goods with Cost Plus World Market.com online coupon code.


In this "field guide for leaders, managers and facilitators," Lencioni (author of the popular Five Dysfunctions of a Team corporate fable and model) offers two predicate questions before proceeding with the blueprint he offers for team-building. They are: "Are we really a team?" and "Are we ready for heavy lifting?" I do not think the importance of these two questions can be overstated, especially the latter. In my experience, it's particularly critical for the team leader to role-model exquisitely the "heavy lifting" – for long haul – he or she expects from the rest of the team, or else the team risks more than underperformance: a team without committed leader can do serious damage to an organization.
…a relatively small number of people (anywhere from three to twelve) that shares common goals as well as the rewards and responsibilities for achieving them. Team members readily set aside their individual or personal needs for the greater good of the group.
Lencioni asserts, as he did in the original Five Dysfunctions book, that the same common elements are required for any team to succeed: (1) trust; (2) the ability to engage in healthy conflict; (3) commitment to decisions; (4) accountability; and (5) attention to results. He identifies the team dynamics that typically cause dysfunctional behavior and that sabotage results, and then offers several group exercises and communication models which – in his experience – effectively address them.
Overcoming the Five Dysfunctions of a Team would be a terrific resource to start with for any leader who wants to learn the basics of team dynamics. A sophisticated leader who has significant experience with building effective teams and running effective group processes will gain greater insight from other resources (such as a sharp coach or consultant, or a more hard-core and academic workbook like Ronald Heifetz et al.'s The Practice of Adaptive Leadership: Tools and Tactics for Changing Your Organization and the World, published by Harvard Business Press, 2009).
Of course, Lencioni's original book, The Five Dysfunctions of a Team (a fictional corporate fable, combined with an in-depth discussion of Lencioni's team-building model), would pair well with this "field guide" before, after or during its use. Also, another good resource is Building Better Teams, a recent collection of articles from the Harvard Business Review (2011). The leadership workbook I would recommend for a leader with some experience who wants to intersect his or her individual leadership development with team building is Kevin Cashman's Leadership from the Inside Out (previously reviewed in the Leadership Library).


In the second of our Shortcut reviews, our reviewer takes the Skoda Citigo around the centre of Newcastle.
The model tested is in the Colour Edition trim, with a Kiwi Green paintjob and contrasting black alloys, wing mirrors and roof. However, as a city car the Citigo's main strength will have to be its ability to navigate town.
Watch the video below to get our take on it, or head to the Lookers Blog to read our written review.


Like Tarrytown, its neighbor to the South, Sleepy Hollow was first inhabited by Native Americans, followed by the Dutch in the 1600s. Frederick Philipse established two settlements on his vast holdings along the river in the 1680s, one in Yonkers and the other at the mouth of the Pocantico River. The Upper Mills, as it is known, and the Old Dutch Church, built in the late 1600s, are located in what is now Sleepy Hollow.
Sleepy Hollow was known as Beekmantown from the end of the Revolutionary War until the 1870s when the name was changed to North Tarrytown. In 1996 the name was changed again--this time to Sleepy Hollow--to commemorate Washington Irving's tale, "The Legend of Sleepy Hollow," which took place there.
The economy of Sleepy Hollow was mainly agrarian until well into the 19th century. Grain was grown, milled and then shipped to market from the Beekmantown wharf. In the latter part of the century a shoe factory appeared, along with a pottery works and a book bindery. By 1900 the Mobile Company of America, makers of small cars with steam engines, had built an impressive 700-window factory on part of the former Kingsland estate. In 1904 the factory was sold to the Maxwell-Briscoe Company, which led the world in the production of low-priced gas-powered automobiles. In 1915 Chevrolet acquired the factory, and until it closed in 1996, it was the largest General Motors assembly plant east of the Mississippi. Debate continues in 2009 over development on the former General Motors site.


A lovely café tucked away in the bylanes of Burwood, The Foodrinkery ticks all the right boxes for me when it comes to a neighbourhood café.
Located adjacent to the Wattle Park Primary School and Spectrum dance school, the café enjoys an enviable location which also makes it the perfect spot for the neighbourhood to stop by for a relaxing cup of coffee and some amazing food.
We walked in for brunch earlier this week and the first thing that struck me was this was the perfect place for me to meet with my mommy friends. The seating area is divided into three parts – a couple of tables out at the front, cool quirky interior seating (with plenty of magazines) and a gorgeous shady space behind the café which opens out into the adjacent park area.
The décor has been done so thoughtfully; there is plenty of quirky stuff on display which children would adore, like this car on the wall.
The staff also opens out the top part of the fencing when children are around so that parents can always watch their children playing in the park while sipping on their coffees. Very thoughtful indeed…..
Beautiful art work on the walls, interesting table number art, cars and planes, potted plants and herbs….all add to the relaxing ambience of this café. A place that makes you feel warm and welcome. How I wish there was a similar café in my neighbourhood!
We started off with a cup of coffee (cappuccino to be exact) and freshly squeezed orange juice. The coffee was good but there's room for improvement. We Melbournians have a very high standard for coffee so this one felt average….. The freshly squeezed orange juice was gulped down fast being a really hot autumn day. The café also serves smoothies and other fresh drinks apart from the usual bottled varieties.
The menu at The Foodrinkery is an interesting one with a good mix of familiar, comforting dishes and some modern, unique flavours. Personally, I love to try out new flavours and I also get excited when a small café or restaurant tries to push boundaries in their own small ways. But my hubby is not always so which is why he ended up getting eggs and toast with a side of bacon. According to him, a café that gets this dish right is one he will return to. And luckily for him, it turned out to be so….creamy, fluffy scrambled eggs on good quality toasted bread with a side of perfectly fried bacon.
I zeroed in on the Chermoula Eggs….toasted bread topped with smashed pumpkin, grilled zucchini, two free ranged poached eggs drizzled with chermoula dressing. To cater to all taste buds, the seasoning is kept to a minimum so you need to adjust it to your liking with salt and pepper. But there was tons of flavour in this one…loved the chermoula dressing which when combined with the runny eggs was brilliant. A clean, healthy and nourishing dish.
It was a really hot day and the Atlantic salad sounded very interesting so we added that to the list too. Lots of baby spinach topped with cherry tomatoes, capers, smoked salmon, feta, pickle, jalapenos drizzled with a balsamic glaze dressing. Very refreshing and delicious, it made the perfect addition to our meal.
Do look out for their specials menu which you can find behind the counter. There is also a delectable selection of muffins, cakes, pastries, cupcakes, cookies etc…..I bought back home a couple of chocolate cupcakes and mini chocolate chip cookies which totally won my son's approval.
In a nutshell, The Foodrinkery is a great place to relax after dropping off your children at school, catch up with your friends and neighbours or have a family brunch on the weekends. And if this café was near my home, you would have found me doing all my food writing here….a very inspiring and calming space.
Disclaimer – I dined as a guest of The World Loves Melbourne and The Foodrinkery. The choice of dishes and opinions stated here are entirely mine.
The interior of the place is very interesting. And the coffee looks so good! I like the Chermoula Eggs and the cupcakes are adorable!
Great place indeed..which is your favourite brunch place in Melbourne?


A man who fled the scene of a shooting in Bridgeport on the night of Feb. 28 was captured 24 hours later in Alvord.
The victim of the shooting, 20-year-old Ruben Dunlap of Bridgeport, died around 5:15 p.m. March 1 at Medical City Denton after he was taken off life support.
Johnny Ray Armstrong, 37, of Bridgeport was charged with Dunlap's murder.
Bridgeport Police Chief Steve Stanford said officers responded to a call about a shooting in the 1500 block of Brush Street around 8:30 p.m. Wednesday. Emergency personnel from Wise County EMS and Bridgeport Fire Department also responded and found Dunlap with a gunshot wound to the head. He was taken by ground ambulance to the Denton hospital in critical condition.
Officers received information that Armstrong had fled the scene in his Ford Expedition, and Bridgeport Police along with the Wise County Sheriff's Office and Department of Public Safety began trying to locate the vehicle.
With the help of a helicopter, Armstrong was located at the Golden Express Truck Stop north of Alvord around 9:30 p.m. March 1. Armstrong appeared "a little agitated at first" and failed to comply with commands, Stanford said, so a Taser was deployed. He was then taken into custody. Medics were called to make sure he wasn't injured.
In a four-woman race for Precinct 2 justice of the peace, Kim Redman and Callie Manning came out on top in the March 6 Republican primary. They'll face each other again in the May 22 runoff election. Charles Applewhite of Aurora and Terry Terry of Boyd are the last two standing in the four-man race for Wise County Precinct 3 constable and will go to a runoff. Todd Bailey and Willie Garrett head to runoff for the Precinct 4 justice of the peace spot. Sherry Lemon won her eighth term as county clerk Tuesday in her first contested race since she was elected for the first time in 1990. Precinct 2 Commissioner Kevin Burns cruised to an easy victory in the Republican primary.
Five pipe bombs were discovered and detonated March 23 on a 32-acre property off County Road 3585 southwest of Cottondale.
Wise County Sheriff Lane Akin said the bombs appeared to be 20 to 30 years old, judging by the newspapers in which they were wrapped. They were found inside a semi-truck trailer by a couple who bought the acreage a few months ago.
They were cleaning up and clearing junk from the property when the bombs were found.
The previous property owner died in 2012.
A Bridgeport man was killed and his wife was seriously injured in a wreck in a residential neighborhood in Decatur on the morning of March 28.
The crash occurred around 11:30 at the four-way stop sign intersection of Trinity and Hale streets, a few blocks south of the downtown area.
Lt. Gerald Wright with the Decatur Police Department said the wreck involved a Volvo SUV that was westbound on Hale Street and a Toyota passenger car that had just entered the intersection from Trinity Street.
"The driver of the Volvo ran the stop sign and T-boned the Toyota. The Toyota driver died at the scene," Wright said.
He identified the driver of the Toyota as 74-year-old Billy Wade McRae of Bridgeport. McRae's wife, Rhonda, was a passenger in the car and was seriously injured in the crash. The 61-year-old was taken by ground ambulance to Medical City Denton (formerly Denton Regional) since a helicopter wasn't available due to weather.
77 percent of the vote Precinct 2 Commissioner Kevin Burns received in the March primary election, winning re-election.
4.839 GPA of Cole Barton, the top-ranked student in Bridgeport's class of 2018 and the Bulls' top golfer.
$999,348 grant secured by Bridgeport to build a new fire station.
34 games won by the Northwest Texans boys basketball team en route to the 5A final. They lost to Port Arthur.
104-year-old Gola Mae Fleming on why she's had such a long life.
Mary Swindell on her dog Shiner, who competed at the American Kennel Club Agility Nationals in Reno.
Boyd City Administrator Greg Arrington on the remodel of the city council chambers and local artist Audra Lambert's painting of the city seal.
Decatur City Council Member Cary Bohn, in reference to a proposed daycare at the entrance of the South Martin Branch subdivision.
John Erhdahl after fire destroyed his mobile home on County Road 3855 near Boonsville March 21.


Boz Scaggs graced our fair capital last week, dropping off en route to an Italian beach with his wife and kids. Mindful of the relative non-existence of recent royalties from Britain, he agreed to hang around just long enough to meet a few people who might write something about him.
We found him in a swanky suite at the Inn On The Park in an amiable mood, offering coffee and answering our questions with solemn consideration. An animated talker he isn't and the combination of a heavy lunch-time and the monotonous drone of his voice nearly had us dozing off a couple of times, but he told us very earnestly that he wants to tour Britain later in the year and is very anxious to cultivate the British market.
"I do need Britain, though, not for financial reasons but because I feel interested in what's going on here. I've had so much input in the last week just by the vibe, maybe it's just being in the streets, but things have happened from which I can draw material. Like, I was passing through New York and I met a guy who gave me some South American records which have been a real eye-opener to me. Now that's something I want to use in my own work now, see?"
Ineed we did, and asked him about the bland California music with which he is indelibly associated in this country. To his immense credit he didn't throw coffee over us but answered with painstaking care, saying something about being well aware of the risks of being cocooned in California, which was why he was always interested to hear other areas of music, and hoped there was always enough input to sustain his own development.
"I don't feel I'm in the avant-garde of Western culture but there is development. I always feel there's a danger of becoming insulated and stagnant if you don't move. If I didn't have to meet certain demands of touring and making records then I could become very complacent and end up staying at home, and that'd be so boring."
To the question of what sort of music he was currently listening to which might give him this vital input, he got a bit fidgety and ummed and erred a bit. He expressed unqualified admiration for Ry Cooder and announced that discovering the Pretenders was one of the most refreshing things that had happened to him recently, just as finding the Cars has been two years ago. He also mentioned the Fabulous Thunderbirds and the Inmates.
"R&B music is kinda stale to me now," he said.
"I'm getting back to guitar playing and to me that means the blues. What I do is a refinement of things I hear. I grew up listening to the radio, hearing the Beatles and the Beach Boys and BB King. T.Bone Walker, Howling Wolf and Henry Mancini, and I'm a product of all that."
As we parted I said I hoped he'd get that British tour together fairly soon. "Oh yes," he said gushingly "I sure hope so, I really do."


text:
France 11-16 April 2012: Peugeot 208 and 5008 in Top 10
* See the Top 10 best-selling models by clicking on the title! *
Now that the year-on-year comparison with scrappage scheme-boosted months is over (it ended in March 2011), the French car market is starting to look better: only down 5% this week at 27,858 units. Peugeot takes the lead of the brands ranking with 5,105 sales and 18.3% ahead of Citroen at 16.9% and Renault at 16%. The Renault Clio reclaims the pole position in the models ranking at 1,252 units and 4.5%, up 4% year-on-year. It is followed by the Citroen C3 with 1,171 sales (+44%) and the Peugeot 207 at 1,022 units (+24%).
In fact, Peugeot places no less than 5 models in the Top 10 this week: the 308 is #4 at 3.6% (+31%), the 3008 is #5 at 3.4% (+9%), the 208 reappears in the Top 10 for the second time and delivers its best ranking so far at #9 thanks to 575 sales and 2.1% market share and the 5008 breaks into the French weekly Top 10 for the very first time at 565 units and 2%, up 16% year-on-year. For only the second time this year the weekly Top 10 is 100% French.
Previous week: France 1-10 April 2012: Citroen C3, C4 and DS3 impress
Previous month: France March 2012: Peugeot 208 lands at #16, Nissan excels
One year ago: France 12-18 April 2011: Dacia Duster #2!
Full 11-16 April 2012 Top 10 Ranking Table below.
France November 2015: Peugeot 208 on top in market artificially up 11%
The Peugeot 208 outsells the Renault Clio to #1 in France this month. * UPDATED…
France 1992: Renault Clio starts its reign
Renault Clio * See the Top 233 best-selling models by clicking on 'Read more' at…
France LCV September 2013: Renault Trafic up to #2
Renault Trafic * See the Top 80 best-selling models by clicking on the title! *…
previous post: France 1-10 April 2012: Citroen C3, C4 and DS3 impress
next post: France 1-23 April 2012: Peugeot 3008 up to #4


text:
Titanfall 2 will arrive within three weeks from Battlefield 1
on 4th of June 2016 @ 04:52 pm UTC
As reported by Dualshockers, EA's Chief Financial Officer stated at a recent technology conference that Titanfall 2 will launch within roughly three weeks from Battlefield 1. The exact release date is currently unknown, but its most likely going to be announced alongside other tidbits of information during the big "Titanfall 2 reveal" on June 12.
The interesting thing here is that the CFO didn't specify whether Titanfall 2 will release before or after Battlefield 1, which means we can expect to see Titanfall at some point point between September 30 and November 11. All of this is pure speculation at this point, but there was a leak earlier this year that alluded towards a winter release date for Titanfall 2, a launch window that seems to go well with this latest theory.
If this does end up being true it would mean that EA plans to challenge Activision's Call of Duty: Infinite Warfare (November 4) with not just Battlefield 1, but also Titanfall 2. While I can understand the business reasoning behind such a decision, as a customer this doesn't fill me with much joy. Each one of those is going to be a €60 purchase, and with all three releasing in such a short time-frame there is almost no way for the majority of people to commit either the time, or money, to them all.
This is especially worrying for Titanfall 2 since the original game ended up losing most of its playerbase in the span of a few months, and despite the map pack being given away for free there hasn't been a big resurgence in those numbers. Then again, these are decisions made by people with far more knowledge (and spreadsheets) than me, so hopefully it ends up working out for all three of them.
As a final note, here's the Titanfall 2 teaser trailer, just in case you missed it:


I rarely prepare for the nano expect to clean my house and buy convenience food for my family. Although I did write this post last week to prepare for the nano.
I won't be doing much cooking or cleaning once the nano starts (although I will cook the Thanksgiving dinner).
Sometimes I start three completely different MSs to see which one will keep my attention for the entire month. This can get a little dicey if I decide to do that on November 1.
I never plot out anything. To quote Chris Batty (co-creator and former director of the nanowrimo website), "Plot Happens." And it truly does.
Whether your story is about a vegan werewolf, a mermaid afraid of the ocean, or a blood blind vampire, an engaging story line is key to keeping your interest for the entire month.
My total focus is on word count and so should yours be.
I tell my interior editor to "shut the hell up" and mean it.
Do not edit. I can't stress this enough and this is what messes up most writers who enter the nano contest. If it bothers you that much then promise yourself that you'll edit after the month is over.
Do not read over what you wrote to where you left off the day before.
It's okay to read your entire ms in the beginning when your word count is low.
However, when you get up to the middle word count (25 K) reading over all those words will take a great deal of time you can't afford.
My mantra and yours should be: is WORD COUNT, WORD COUNT, WORD COUNT. Nothing else matters if you want to win!
No editing! Oh dear. I'm in trouble. I tend to write for several days and then edit for several days. I don't know if I can only write and not edit for a month!.
Thanks for this list. Helpful, actually.
See, number nine is why I don't do NaNo. I totally edit as I write. LOL!
Editing as I write is difficult to avoid for me but it's how I succeeded last year. Happy NaNo-ing!
Well, what ever works for you.
This. I always tell myself editing is for later.
That's right and good for you!