text:
from collections import OrderedDict

import numpy as np
from logger import logger
from seriesly import Seriesly

from cbmonitor import CbAgent
from perfrunner.helpers.remote import RemoteHelper

class MetricHelper(object):

    def __init__(self, test):
        self.test = test
        self.seriesly = Seriesly(
            test.test_config.stats_settings.seriesly['host'])
        self.test_config = test.test_config
        self.metric_title = test.test_config.test_case.metric_title
        self.cluster_spec = test.cluster_spec
        self.cluster_names = test.cbagent.clusters.keys()
        self.build = test.build
        self.master_node = test.master_node
        self.in_bytes_transfer = []
        self.out_bytes_transfer = []

    @staticmethod
    def _get_query_params(metric, from_ts=None, to_ts=None):
        """Convert metric definition to Seriesly query params. E.g.:

        'avg_xdc_ops' -> {'ptr': '/xdc_ops',
                          'group': 1000000000000, 'reducer': 'avg'}

        Where group is constant."""
        params = {'ptr': '/{}'.format(metric[4:]),
                  'reducer': metric[:3],
                  'group': 1000000000000}
        if from_ts and to_ts:
            params.update({'from': from_ts, 'to': to_ts})
        return params

    def _get_metric_info(self, title, larger_is_better=False, level='Basic'):
        return {'title': title,
                'cluster': self.cluster_spec.name,
                'larger_is_better': str(larger_is_better).lower(),
                'level': level}

    def calc_ycsb_queries(self, value, name, larger_is_better=True):
        metric = '{}_{}_{}'.format(self.test_config.name, name,
                                   self.cluster_spec.name)
        title = '{} , {}'.format(name, self.metric_title)
        metric_info = self._get_metric_info(title, larger_is_better)
        return value, metric, metric_info

    def calc_avg_xdcr_ops(self):
        metric = '{}_avg_xdcr_ops_{}'.format(self.test_config.name,
                                             self.cluster_spec.name)
        title = 'Avg. XDCR ops/sec, {}'.format(self.metric_title)
        metric_info = self._get_metric_info(title, larger_is_better=True)
        query_params = self._get_query_params('avg_xdc_ops')

        xdcr_ops = 0
        for bucket in self.test_config.buckets:
            db = 'ns_server{}{}'.format(self.cluster_names[1], bucket)
            data = self.seriesly[db].query(query_params)
            xdcr_ops += data.values()[0][0]
        xdcr_ops = round(xdcr_ops, 1)

        return xdcr_ops, metric, metric_info

    def calc_avg_set_meta_ops(self):
        metric = '{}_avg_set_meta_ops_{}'.format(self.test_config.name,
                                                 self.cluster_spec.name)
        title = 'Avg. XDCR rate (items/sec), {}'.format(self.metric_title)
        metric_info = self._get_metric_info(title, larger_is_better=True)
        query_params = self._get_query_params('avg_ep_num_ops_set_meta')

        set_meta_ops = 0
        for bucket in self.test_config.buckets:
            db = 'ns_server{}{}'.format(self.cluster_names[1], bucket)
            data = self.seriesly[db].query(query_params)
            set_meta_ops += data.values()[0][0]
        set_meta_ops = round(set_meta_ops, 1)

        return set_meta_ops, metric, metric_info

    def calc_avg_n1ql_queries(self):
        metric = '{}_avg_query_requests_{}'.format(self.test_config.name,
                                                   self.cluster_spec.name)
        title = 'Avg. Query Throughput (queries/sec), {}'.format(self.metric_title)
        metric_info = self._get_metric_info(title, larger_is_better=True)
        query_params = self._get_query_params('avg_query_requests')

        db = 'n1ql_stats{}'.format(self.cluster_names[0])
        data = self.seriesly[db].query(query_params)
        queries = data.values()[0][0]
        queries = round(queries, 1)

        return queries, metric, metric_info

    def parse_log(self, test_config):
        cbagent = CbAgent(self.test)
        cbagent.prepare_fts_query_stats(cbagent.clusters.keys(), test_config)
        fts = cbagent.fts_stats
        '''
         we currently have the logs.
         From the logs we will get the latest result
        '''
        fts.collect_stats()
        total = fts.cbft_query_total()
        return total

    def calc_avg_fts_queries(self, name='FTS'):
        metric = '{}_avg_query_requests_{}'.format(self.test_config.name,
                                                   self.cluster_spec.name)
        title = 'Avg. {} Query Throughput (queries/sec), {}'.format(name, self.metric_title)
        metric_info = self._get_metric_info(title, larger_is_better=True)
        total_queries, failed_queries, timeout_queries = self.parse_log(self.test_config)
        time_taken = self.test_config.access_settings.time
        qps = total_queries / time_taken
        return round(qps, 1), metric, metric_info

    def calc_latency_ftses_queries(self, percentile, dbname,
                                   metrics, name='FTS'):
        metric = '{}_{}'.format(self.test_config.name, self.cluster_spec.name)
        title = '{}th percentile {} query latency (ms), {}'.\
            format(percentile, name, self.metric_title)
        metric_info = self._get_metric_info(title, larger_is_better=False)
        timings = []
        db = '{}{}'.format(dbname, self.cluster_names[0])
        data = self.seriesly[db].get_all()
        timings += [v[metrics] for v in data.values()]
        fts_latency = round(np.percentile(timings, percentile), 2)
        return round(fts_latency), metric, metric_info

    def calc_ftses_index(self, elapsedtime):
        metric = '{}_{}'.format(self.test_config.name, self.cluster_spec.name)
        title = 'Initial Index(sec), {}'.format(self.metric_title)
        metric_info = self._get_metric_info(title, larger_is_better=False)
        return round(elapsedtime, 1), metric, metric_info

    def calc_avg_ops(self):
        """Returns the average operations per second."""
        metric = '{}_avg_ops_{}'.format(self.test_config.name,
                                        self.cluster_spec.name)
        title = 'Average ops/sec, {}'.format(self.metric_title)
        metric_info = self._get_metric_info(title, larger_is_better=True)
        query_params = self._get_query_params('avg_ops')

        ops = 0
        for bucket in self.test_config.buckets:
            db = 'ns_server{}{}'.format(self.cluster_names[0], bucket)
            data = self.seriesly[db].query(query_params)
            ops += data.values()[0][0]
        ops = round(ops, 1)

        return ops, metric, metric_info

    def calc_xdcr_lag(self, percentile=90):
        metric = '{}_{}th_xdc_lag_{}'.format(self.test_config.name,
                                             percentile,
                                             self.cluster_spec.name)
        title = '{}th percentile replication lag (ms), {}'.format(
            percentile, self.metric_title)
        metric_info = self._get_metric_info(title)
        query_params = self._get_query_params('avg_xdcr_lag')
        query_params.update({'group': 1000})

        timings = []
        for bucket in self.test_config.buckets:
            db = 'xdcr_lag{}{}'.format(self.cluster_names[0], bucket)
            data = self.seriesly[db].query(query_params)
            timings = [v[0] for v in data.values()]
        lag = round(np.percentile(timings, percentile))

        return lag, metric, metric_info

    def calc_replication_changes_left(self):
        metric = '{}_avg_replication_queue_{}'.format(self.test_config.name,
                                                      self.cluster_spec.name)
        title = 'Avg. replication queue, {}'.format(self.metric_title)
        metric_info = self._get_metric_info(title)
        query_params = self._get_query_params('avg_replication_changes_left')

        queues = 0
        for bucket in self.test_config.buckets:
            db = 'ns_server{}{}'.format(self.cluster_names[0], bucket)
            data = self.seriesly[db].query(query_params)
            queues += data.values()[0][0]
        queue = round(queues)

        return queue, metric, metric_info

    def calc_avg_replication_rate(self, time_elapsed):
        initial_items = self.test_config.load_settings.ops or \
            self.test_config.load_settings.items
        num_buckets = self.test_config.cluster.num_buckets
        avg_replication_rate = num_buckets * initial_items / time_elapsed

        return round(avg_replication_rate)

    def calc_max_drain_rate(self, time_elapsed):
        items_per_node = self.test_config.load_settings.items / \
            self.test_config.cluster.initial_nodes[0]
        drain_rate = items_per_node / time_elapsed

        return round(drain_rate)

    def calc_avg_disk_write_queue(self):
        query_params = self._get_query_params('avg_disk_write_queue')

        disk_write_queue = 0
        for bucket in self.test_config.buckets:
            db = 'ns_server{}{}'.format(self.cluster_names[0], bucket)
            data = self.seriesly[db].query(query_params)
            disk_write_queue += data.values()[0][0]
        disk_write_queue /= self.test_config.cluster.initial_nodes[0]

        return round(disk_write_queue / 10 ** 3)

    def calc_avg_ep_bg_fetched(self):
        query_params = self._get_query_params('avg_ep_bg_fetched')

        ep_bg_fetched = 0
        for bucket in self.test_config.buckets:
            db = 'ns_server{}{}'.format(self.cluster_names[0], bucket)
            data = self.seriesly[db].query(query_params)
            ep_bg_fetched += data.values()[0][0]
        ep_bg_fetched /= self.test_config.cluster.initial_nodes[0]

        return round(ep_bg_fetched)

    def calc_avg_bg_wait_time(self):
        query_params = self._get_query_params('avg_avg_bg_wait_time')

        avg_bg_wait_time = []
        for bucket in self.test_config.buckets:
            db = 'ns_server{}{}'.format(self.cluster_names[0], bucket)
            data = self.seriesly[db].query(query_params)
            avg_bg_wait_time.append(data.values()[0][0])
        avg_bg_wait_time = np.mean(avg_bg_wait_time) / 10 ** 3  # us -> ms

        return round(avg_bg_wait_time, 2)

    def calc_avg_couch_views_ops(self):
        query_params = self._get_query_params('avg_couch_views_ops')

        couch_views_ops = 0
        for bucket in self.test_config.buckets:
            db = 'ns_server{}{}'.format(self.cluster_names[0], bucket)
            data = self.seriesly[db].query(query_params)
            couch_views_ops += data.values()[0][0]

        if self.build < '2.5.0':
            couch_views_ops /= self.test_config.cluster.initial_nodes[0]

        return round(couch_views_ops)

    def calc_avg_couch_spatial_ops(self):
        query_params = self._get_query_params('avg_couch_spatial_ops')

        couch_spatial_ops = 0
        for bucket in self.test_config.buckets:
            db = 'ns_server{}{}'.format(self.cluster_names[0], bucket)
            data = self.seriesly[db].query(query_params)
            couch_spatial_ops += data.values()[0][0]

        return round(couch_spatial_ops)

    def calc_query_latency(self, percentile):
        metric = '{}_{}'.format(self.test_config.name, self.cluster_spec.name)
        if 'MG7' in metric:
            title = '{}th percentile query latency, {}'.format(percentile,
                                                               self.metric_title)
        else:
            title = '{}th percentile query latency (ms), {}'.format(percentile,
                                                                    self.metric_title)
        metric_info = self._get_metric_info(title)

        timings = []
        for bucket in self.test_config.buckets:
            db = 'spring_query_latency{}{}'.format(self.cluster_names[0],
                                                   bucket)
            data = self.seriesly[db].get_all()
            timings += [value['latency_query'] for value in data.values()]
        query_latency = np.percentile(timings, percentile)
        return round(query_latency, 2), metric, metric_info

    def calc_secondaryscan_latency(self, percentile):
        metric = '{}_{}'.format(self.test_config.name, self.cluster_spec.name)
        title = '{}th percentile secondary scan latency (ms), {}'.format(percentile,
                                                                         self.metric_title)
        metric_info = self._get_metric_info(title)

        timings = []
        db = 'secondaryscan_latency{}'.format(self.cluster_names[0])
        data = self.seriesly[db].get_all()
        timings += [value[' Nth-latency'] for value in data.values()]
        timings = map(int, timings)
        secondaryscan_latency = np.percentile(timings, percentile) / 1000000

        return round(secondaryscan_latency, 2), metric, metric_info

    def calc_kv_latency(self, operation, percentile, dbname='spring_latency'):
        """Calculate kv latency
        :param operation:
        :param percentile:
        :param dbname:  Same procedure is used for KV and subdoc .
            for KV dbname will spring_latency.For subdoc will be spring_subdoc_latency
        :return:
        """
        metric = '{}_{}_{}th_{}'.format(self.test_config.name,
                                        operation,
                                        percentile,
                                        self.cluster_spec.name
                                        )
        title = '{}th percentile {} {}'.format(percentile,
                                               operation.upper(),
                                               self.metric_title)
        metric_info = self._get_metric_info(title)

        timings = []
        for bucket in self.test_config.buckets:
            db = '{}{}{}'.format(dbname, self.cluster_names[0], bucket)
            data = self.seriesly[db].get_all()
            timings += [
                v['latency_{}'.format(operation)] for v in data.values()
            ]
        latency = round(np.percentile(timings, percentile), 1)

        return latency, metric, metric_info

    def calc_observe_latency(self, percentile):
        metric = '{}_{}th_{}'.format(self.test_config.name, percentile,
                                     self.cluster_spec.name)
        title = '{}th percentile {}'.format(percentile, self.metric_title)
        metric_info = self._get_metric_info(title)

        timings = []
        for bucket in self.test_config.buckets:
            db = 'observe{}{}'.format(self.cluster_names[0], bucket)
            data = self.seriesly[db].get_all()
            timings += [v['latency_observe'] for v in data.values()]
        latency = round(np.percentile(timings, percentile), 2)

        return latency, metric, metric_info

    def calc_cpu_utilization(self):
        metric = '{}_avg_cpu_{}'.format(self.test_config.name,
                                        self.cluster_spec.name)
        title = 'Avg. CPU utilization (%)'
        title = '{}, {}'.format(title, self.metric_title)
        metric_info = self._get_metric_info(title)

        cluster = self.cluster_names[0]
        bucket = self.test_config.buckets[0]

        query_params = self._get_query_params('avg_cpu_utilization_rate')
        db = 'ns_server{}{}'.format(cluster, bucket)
        data = self.seriesly[db].query(query_params)
        cpu_utilazion = round(data.values()[0][0])

        return cpu_utilazion, metric, metric_info

    def calc_views_disk_size(self, from_ts=None, to_ts=None, meta=None):
        metric = '{}_max_views_disk_size_{}'.format(
            self.test_config.name, self.cluster_spec.name
        )
        if meta:
            metric = '{}_{}'.format(metric, meta.split()[0].lower())
        title = 'Max. views disk size (GB)'
        if meta:
            title = '{}, {}'.format(title, meta)
        title = '{}, {}'.format(title, self.metric_title)
        title = title.replace(' (min)', '')  # rebalance tests
        metric_info = self._get_metric_info(title, level='Advanced')

        query_params = self._get_query_params('max_couch_views_actual_disk_size',
                                              from_ts, to_ts)

        disk_size = 0
        for bucket in self.test_config.buckets:
            db = 'ns_server{}{}'.format(self.cluster_names[0], bucket)
            data = self.seriesly[db].query(query_params)
            disk_size += round(data.values()[0][0] / 1024 ** 3, 2)  # -> GB

        return disk_size, metric, metric_info

    def calc_mem_used(self, max_min='max'):
        metric = '{}_{}_mem_used_{}'.format(
            self.test_config.name, max_min, self.cluster_spec.name
        )
        title = '{}. mem_used (MB), {}'.format(max_min.title(),
                                               self.metric_title)
        metric_info = self._get_metric_info(title)

        query_params = self._get_query_params('max_mem_used')

        mem_used = []
        for bucket in self.test_config.buckets:
            db = 'ns_server{}{}'.format(self.cluster_names[0], bucket)
            data = self.seriesly[db].query(query_params)

            mem_used.append(
                round(data.values()[0][0] / 1024 ** 2)  # -> MB
            )
        mem_used = eval(max_min)(mem_used)

        return mem_used, metric, metric_info

    def calc_max_beam_rss(self):
        metric = 'beam_rss_max_{}_{}'.format(self.test_config.name,
                                             self.cluster_spec.name)
        title = 'Max. beam.smp RSS (MB), {}'.format(self.metric_title)
        metric_info = self._get_metric_info(title)

        query_params = self._get_query_params('max_beam.smp_rss')

        max_rss = 0
        for cluster_name, servers in self.cluster_spec.yield_clusters():
            cluster = filter(lambda name: name.startswith(cluster_name),
                             self.cluster_names)[0]
            for server in servers:
                hostname = server.split(':')[0].replace('.', '')
                db = 'atop{}{}'.format(cluster, hostname)  # Legacy
                data = self.seriesly[db].query(query_params)
                rss = round(data.values()[0][0] / 1024 ** 2)
                max_rss = max(max_rss, rss)

        return max_rss, metric, metric_info

    def calc_max_memcached_rss(self):
        metric = '{}_{}_memcached_rss'.format(self.test_config.name,
                                              self.cluster_spec.name)
        title = 'Max. memcached RSS (MB),{}'.format(
            self.metric_title.split(',')[-1]
        )
        metric_info = self._get_metric_info(title)

        query_params = self._get_query_params('max_memcached_rss')

        max_rss = 0
        for (cluster_name, servers), initial_nodes in zip(
                self.cluster_spec.yield_clusters(),
                self.test_config.cluster.initial_nodes,
        ):
            cluster = filter(lambda name: name.startswith(cluster_name),
                             self.cluster_names)[0]
            for server in servers[:initial_nodes]:
                hostname = server.split(':')[0].replace('.', '')
                db = 'atop{}{}'.format(cluster, hostname)
                data = self.seriesly[db].query(query_params)
                rss = round(data.values()[0][0] / 1024 ** 2)
                max_rss = max(max_rss, rss)

        return max_rss, metric, metric_info

    def calc_avg_memcached_rss(self):
        metric = '{}_{}_avg_memcached_rss'.format(self.test_config.name,
                                                  self.cluster_spec.name)
        title = 'Avg. memcached RSS (MB),{}'.format(
            self.metric_title.split(',')[-1]
        )
        metric_info = self._get_metric_info(title)

        query_params = self._get_query_params('avg_memcached_rss')

        rss = list()
        for (cluster_name, servers), initial_nodes in zip(
                self.cluster_spec.yield_clusters(),
                self.test_config.cluster.initial_nodes,
        ):
            cluster = filter(lambda name: name.startswith(cluster_name),
                             self.cluster_names)[0]
            for server in servers[:initial_nodes]:
                hostname = server.split(':')[0].replace('.', '')
                db = 'atop{}{}'.format(cluster, hostname)
                data = self.seriesly[db].query(query_params)
                rss.append(round(data.values()[0][0] / 1024 ** 2))

        avg_rss = sum(rss) / len(rss)
        return avg_rss, metric, metric_info

    def get_indexing_meta(self, value, index_type):
        metric = '{}_{}_{}'.format(self.test_config.name,
                                   index_type.lower(),
                                   self.cluster_spec.name)
        title = '{} index (min), {}'.format(index_type,
                                            self.metric_title)
        metric_info = self._get_metric_info(title)

        return value, metric, metric_info

    def calc_compaction_speed(self, time_elapsed, bucket=True):
        if bucket:
            max_query_params = \
                self._get_query_params('max_couch_docs_actual_disk_size')
            min_query_params = \
                self._get_query_params('min_couch_docs_actual_disk_size')
        else:
            max_query_params = \
                self._get_query_params('max_couch_views_actual_disk_size')
            min_query_params = \
                self._get_query_params('min_couch_views_actual_disk_size')

        max_diff = 0
        for bucket in self.test_config.buckets:
            db = 'ns_server{}{}'.format(self.cluster_names[0], bucket)
            data = self.seriesly[db].query(max_query_params)
            disk_size_before = data.values()[0][0]

            db = 'ns_server{}{}'.format(self.cluster_names[0], bucket)
            data = self.seriesly[db].query(min_query_params)
            disk_size_after = data.values()[0][0]

            max_diff = max(max_diff, disk_size_before - disk_size_after)

        diff = max_diff / 1024 ** 2 / time_elapsed  # Mbytes/sec
        return round(diff, 1)

    def failover_time(self, reporter):
        metric = '{}_{}_failover'.format(self.test_config.name,
                                         self.cluster_spec.name)
        _split = self.metric_title.split(', ')

        title = 'Graceful failover (min), {}, {}'.format(
            _split[1][-1] + _split[1][1:-1] + _split[1][0],
            ', '.join(_split[2:]))
        metric_info = self._get_metric_info(title, larger_is_better=False)

        rebalance_time = reporter.finish('Failover')

        return rebalance_time, metric, metric_info

    @property
    def calc_network_bandwidth(self):
        self.remote = RemoteHelper(self.cluster_spec, self.test_config, verbose=True)
        for cluster_name, servers in self.cluster_spec.yield_clusters():
            self.in_bytes_transfer += [self.remote.read_bandwidth_stats("to", servers)]
            self.out_bytes_transfer += [self.remote.read_bandwidth_stats("from", servers)]
        logger.info('in bytes', self.in_bytes_transfer)
        logger.info('out bytes', self.out_bytes_transfer)
        return OrderedDict((
            ('in bytes', sum(self.in_bytes_transfer[0].values())),
            ('out bytes', sum(self.out_bytes_transfer[0].values()))))

    @property
    def calc_network_throughput(self):
        in_bytes_per_sec = []
        out_bytes_per_sec = []
        for cluster_name, servers in self.cluster_spec.yield_clusters():
            cluster = filter(lambda name: name.startswith(cluster_name),
                             self.cluster_names)[0]
            for server in servers:
                hostname = server.split(':')[0].replace('.', '')
                db = 'net{}{}'.format(cluster, hostname)
                data = self.seriesly[db].get_all()
                in_bytes_per_sec += [
                    v['in_bytes_per_sec'] for v in data.values()
                ]
                out_bytes_per_sec += [
                    v['out_bytes_per_sec'] for v in data.values()
                ]
        # To prevent exception when the values may not be available during code debugging
        if not in_bytes_per_sec:
            in_bytes_per_sec.append(0)
        if not out_bytes_per_sec:
            out_bytes_per_sec.append(0)
        f = lambda v: format(int(v), ',d')
        return OrderedDict((
            ('min in_bytes  per sec', f(min(in_bytes_per_sec))),
            ('max in_bytes  per sec', f(max(in_bytes_per_sec))),
            ('avg in_bytes  per sec', f(np.mean(in_bytes_per_sec))),
            ('p50 in_bytes  per sec', f(np.percentile(in_bytes_per_sec, 50))),
            ('p95 in_bytes  per sec', f(np.percentile(in_bytes_per_sec, 95))),
            ('p99 in_bytes  per sec', f(np.percentile(in_bytes_per_sec, 99))),
            ('min out_bytes per sec', f(min(out_bytes_per_sec))),
            ('max out_bytes per sec', f(max(out_bytes_per_sec))),
            ('avg out_bytes per sec', f(np.mean(out_bytes_per_sec))),
            ('p50 out_bytes per sec', f(np.percentile(out_bytes_per_sec, 50))),
            ('p95 out_bytes per sec', f(np.percentile(out_bytes_per_sec, 95))),
            ('p99 out_bytes per sec', f(np.percentile(out_bytes_per_sec, 99))),
        ))

class SgwMetricHelper(MetricHelper):

    def __init__(self, *args, **kwargs):
        super(SgwMetricHelper, self).__init__(*args, **kwargs)
        self.seriesly = Seriesly(self.test_config.gateload_settings.seriesly_host)

    def calc_push_latency(self, p=95, idx=1):
        query_params = self._get_query_params(
            'avg_gateload/ops/PushToSubscriberInteractive/p{}'.format(p)
        )
        db = 'gateload_{}'.format(idx)
        logger.info("Getting push latency for {}".format(db))

        if not self.seriesly[db].get_all():
            logger.error('No data in {}'.format(db))

        data = self.seriesly[db].query(query_params)
        if data.values()[0][0]:
            latency = float(data.values()[0][0])
            latency /= 10 ** 9  # ns -> s
        else:
            latency = 0   # 0 means the info not available in seriesly

        return round(latency, 2)

    def calc_requests_per_sec(self, idx=1):
        query_params = self._get_query_params(
            'avg_syncGateway_rest/requests_total'
        )
        query_params.update({'group': 1000})  # Group by 1 second
        db = 'gateway_{}'.format(idx)
        logger.info("Getting requests_per_sec for {}".format(db))

        if not self.seriesly[db].get_all():
            logger.error('No data in {}'.format(db))

        data = self.seriesly[db].query(query_params)
        total_requests = sorted(v[0] for v in data.values())
        request_per_sec = [
            n - c for c, n in zip(total_requests, total_requests[1:])
        ]
        return round(np.mean(request_per_sec))

    def calc_gateload_doc_counters(self, idx=1):
        db = 'gateload_{}'.format(idx)
        counters = OrderedDict()
        for item in ('doc_pushed',
                     'doc_pulled',
                     'doc_failed_to_push',
                     'doc_failed_to_pull'):
            query_params = self._get_query_params('max_gateload/total_{}'.format(item))
            query_params.update({'group': 1000})  # Group by 1 second
            data = self.seriesly[db].query(query_params)
            values = sorted(v[0] for v in data.values())
            values = values[-600:]  # Only take the last 10 minutes
            values = [i for i in values if i is not None]
            if len(values) > 2:
                values_per_sec = [
                    n - c for c, n in zip(values, values[1:])
                ]
                counters['Average {}'.format(item)] = round(np.mean(values_per_sec))
                counters['Max {}'.format(item)] = max(values_per_sec)
            else:
                counters['Average {}'.format(item)] = None
                counters['Max {}'.format(item)] = None
        return counters


Xero is world-leading online accounting software built for small business. Log in anytime, anywhere on your Mac, PC, tablet or phone to get a real-time view of your cash flow. It's accounting software that's simple, smart and occasionally magical.


Chronos is the first Garmin timepiece to combine a durable full metal case with an integrated GPS for multisport tracking. Essentially, Garmin has revamped the existing Fenix 3 HR and given it a rather expensive facelift!
In the tradition of classic tool watches, Garmin Chronos features a tough design and a set of modern meaningful tools like Elevate wrist-based heart rate, various sports apps and advanced performance metrics for endurance sports.
There's also quality Garmin navigation features and smartphone notifications. In a nutshell, there isn't much this watch won't do or track. It has multiple sports profiles for running, swimming, cycling, and triathlon. Other multi-sports are also included - trail running, hiking, climbing, skiing, indoor training, rowing, SUP, x-country skiing and more.
You can even use Garmin Chronos on the golf course with golf metrics from the front, back, middle of green and more than 40,000 worldwide golf courses available to download from Garmin's own golf database.
Advanced athletes or those that just want to improve their fitness will benefit from the metrics available during timed activities. These include distance, speed, average speed, ascent, and descent.
There are 3 Chronos versions available and we expect more watches in this range in 2017. All versions have the same sapphire crystal watch lens but the watch case and bands are different. There's an easy way to tell the most expensive titanium version apart from the cheaper steel version, and that's by the links of the bands. The Titanium version has long links and the steel one has an interwoven pattern.
As the name suggests the Titanium Chronos is made from grade 2 titanium. It has a forged titanium case and watch bezel. The lens display is a high strength scratch-resistant sapphire crystal. The watch band links are a special blend of titanium and elastomer for better flex and wearability. The band clasp is a push button quick release design. This is a stunning watch with a premium design.
Like the Titanium Chronos, the Steel version also has a high-strength scratch-resistant sapphire crystal lens. An integrated EXO antenna for GPS + GLONASS is included so you'll always get a strong GPS signal wherever you are. The case and band is made from solid brushed 316L stainless steel for extra strength and durability.
The Chronos leather band version comes with solid brushed 316L stainless steel case with brushed stainless steel bezel and integrated EXO antenna for GPS + GLONASS support. A high-strength scratch resistant sapphire crystal lens protects the display from the elements. Brown vintage leather strap with hand-sewn contrast stitching and nubuck inner lining and quick release mechanism.
Chronos isn't just an expensive version of the Forerunner 735XT. It has Garmin TracBack and Sight 'N Go for outdoor navigation. Chronos also has a barometric altimeter and electronic 3-D compass with optional auto-calibration. These outdoor navigation features will help give you the best possible situational awareness in any situation. The fully integrated metal EXO antenna with GPS/GLONASS receives a super high signal strength for performance tracking during activities and navigation.
Garmin TracBack is a useful feature when you're lost on the trail. When used TracBack will take will take your devices current track log and convert it into a route which you can use as a guide back to your starting position.
The software of Chronos is virtually the same as the Fenix 3 HR, apart from some of the menu styling, which has slightly rounded corners.
The water rating is the same at 10ATM (100 meters).
Each version comes in smart wooden engraved case. It also has a white outer sleeve with Garmin branding. The main lid slides open to reveal your new timepiece surrounded by padded foam. This packaging is what you'd expect from a hand gun manufacturer! Under the Chronos are extra padded compartments for charging clip, silicone sports band, and quick start guide.
If you're using the Chronos for running you'll want to purchase a Garmin HRM-run heart rate monitor. This comfortable chest strap provides the advanced running metrics such as cadence, vertical oscillation and more. The strap is seamless and easily adjustable. You can also purchase additional vintage leather or sport bands. Unfortunately, Fenix 3 bands aren't compatible due to the new quick release mechanism.
If you don't mind throwing your hard earned money at a sports watch that potentially has a 2-year life span before the technology becomes outdated then the Chronos is an excellent purchase. It has top-tier performance features in a sophisticated Swiss design.
Chronos is expensive but in comparison with other watches (which offer half as many features and at the same cost) it's a solid buy. See the Tag Heuer $1,500 connected watch for an example of this. If you need the features of Chronos but don't have the budget, Fenix 3 HR would be a better purchase decision.
Garmin Chronos is a widely expensive sports smartwatch with a list of features as long as your arm. If you have money to spend on a watch and don't mind that could potentially become outdated in 2 - 3 years then Chronos is a good option. It looks extremely stylish and comes with optional sports bands to help offset the weight during activities.
Garmin's most expensive GPS smartwatch to date!


text:
For a better experience on eTickets.ca Update Your Browser
E: support@etickets.ca P: 1(855)730-0208
MLS Tickets
50s And 60s Era
Pop And Rock
Rap And Hip Hop
Techno - EDM
support@etickets.ca 1(855)730-0208
Choose dates Today This weekend	This week	This month	All dates
Apply Reset Filter
Imperial Theatre - NY, New York, New York
Find Seats
Only 464 tickets left
BUY TICKETS NOW & GET DISCOUNT
Take extra 10% off
Promo Code: SAVE10ETKT
*This offer is valid till 31 July, 2019 Use this promo code to get instant 10% OFF when you spend $99 or more. *Use this promo code on checkout page in step-2
Hurry...
Less than 17% of tickets left for Ain't Too Proud: The Life and Times of The Temptations.
Why eTickets.ca?
Print eTickets instantly
Assured authenticity
Similar Theaters
Popular Theater Shows
Come From Away Tickets
Cirque du Soleil - Crystal Tickets
Ain't Too Proud: The Life and Times of The Temptations Tickets
Hadestown Tickets
Cirque du Soleil - Luzia Tickets
Metropolitan Opera Tickets
The Phantom Of The Opera Tickets
Top Cities in Canada
Top Cities in USA
Never Again Say Never to Your Favorite Events!
All Ain't Too Proud: The Life and Times of The Temptations Tickets
Ain't Too Proud: The Life and Times of The Temptations Tickets in Toronto
Ain't Too Proud: The Life and Times of The Temptations Tickets in Montreal
Ain't Too Proud: The Life and Times of The Temptations Tickets in Calgary
Ain't Too Proud: The Life and Times of The Temptations Tickets in Edmonton
Ain't Too Proud: The Life and Times of The Temptations Tickets in Vancouver
Ain't Too Proud: The Life and Times of The Temptations Tickets in Ottawa
Ain't Too Proud: The Life and Times of The Temptations Tickets in California
Ain't Too Proud: The Life and Times of The Temptations Tickets in New York
Ain't Too Proud: The Life and Times of The Temptations Tickets in Chicago
Ain't Too Proud: The Life and Times of The Temptations Tickets in Quebec
Ain't Too Proud: The Life and Times of The Temptations Tickets in Winnipeg
Ain't Too Proud: The Life and Times of The Temptations Tickets in Los Angeles
Ain't Too Proud: The Life and Times of The Temptations Tickets in Boston
Ain't Too Proud: The Life and Times of The Temptations Tickets in Houston
Ain't Too Proud: The Life and Times of The Temptations Tickets in San Francisco
Ain't Too Proud: The Life and Times of The Temptations Tickets in Las Vegas
Ain't Too Proud: The Life and Times of The Temptations Tickets in Dallas

redpajama_set_name: RedPajamaCommonCrawl


"com.versusevil.antiherogame" folder "android / obb" copy into.
Antihero apk is an RPG role-playing game with beautiful game graphics and cute cartoon characters. Players will play a dark villain in the game. Players need to take charge of the thieves' guild, hire people, and step by step to grow the guild. Infiltrate into various places and gradually control the entire city. Dangerous and difficult, don't be afraid.


text:
Tag Archives: Technology
Nuclear Energy Nuclear R&D
An Integral Part of Today's Technologies
By John Stewart
Director, Policy and Research
A business-school professor made an interesting remark to me recently. "Nuclear technology let itself get branded from the start, in the 1940s, as being unique and special," he said. "But that may have hurt the technology. It helped your critics to argue that nuclear is uniquely and specially dangerous. From there, it was easy to say that nuclear needed uniquely, specially restrictive rules around it – or even to say that there's no safe amount of nuclear, period."
He's right. And we could spend a while discussing his point.
But there's another way in which nuclear's perceived uniqueness-and-specialness hurts our industry: It makes it easy to imagine that nuclear companies, facilities and professionals are hidden away somewhere in isolated shiny silos that don't interact with, or affect, the rest of our economy.
The figure below shatters that image. It was made by the consultancy SECOR to illustrate some (in fact, just a few) of the working linkages between this country's nuclear-related public research facilities and other industry sectors.
Some linkages between public nuclear science and technology facilities and other industry sectors (CNBC= Canadian Neutron Beam Centre, CLS=Canadian Light Source, SRC= Saskatchewan Research Council, UNB= University of New Brunswick).
Keep in mind that this web of linkages was never fully drawn (data from several important universities did not get included). And that it does not include research facilities in industry organizations like Ontario Power Generation, Kinectrics-Candesco, and many other CNA member companies that have intimate working relationships with non-nuclear industries.
Nuclear is an integral part of today's technologies, from crops and livestock to jet engines. CNA made this and other points this month in a submission to the federal government's Science, Technology and Innovation Strategy Consultation. Our submission also looks at the economic case for public research infrastructure, whether in telecommunications, defence, agriculture, or nuclear. Check it out here.
Tags Canadian Nuclear Association, CNA, Nuclear Industry, nuclear research, Technology | Permalink | Comment (0)
Kicking Off the Discussion for a Policy Exercise
March 14, 2013 – 15:09
A policy development forum recently asked CNA to identify a few key factors that shaped the development of Canada's nuclear industry. We came up with eight. They range from the Western allies' war needs in the 1940s (which invested us in uranium-based fission reactor technology) to Canada's advanced cultures of medicine, public health and safety (which give us a culture of reactor safety, leadership in medical applications of nuclear, and leadership in irradiation and food safety).
The interesting thing about this analysis is how many advantages it reveals. Our industry faces challenges (notably cheap natural gas, lack of carbon pricing, and the problems of sustaining top-notch science and technology infrastructure). But the list of strengths is strikingly longer and more impressive than the list of challenges.
Even in a world where many reactor technology options are in development, it's hard to beat a design series like the CANDUs that are familiar to regulators, with long track records of safety, reliability, and affordability. Then there's the proliferation-resistance advantage of these designs, which is not diminishing and is probably growing as an asset in the 21st century. Canadian reactors offer the developing world an ideal combination of affordable, minimal-carbon electricity plus proliferation safety. And that Canadian nuclear brand is further strengthened by Canada's reputation in safety, medicine and public health internationally.
Which brings up another asset on the list: Canada's perennial and recognized openness to worldwide investment, technology and talent, and the tens of thousands of highly educated newcomers here who have links to foreign markets and practices. While this is a strength across the board in Canada's economy, it's especially powerful in a sector like nuclear that depends on global best practices and global market reach.
These thoughts are a very early step in a policy exercise that we'll look forward to blogging about over the next few months.
Tags CANDU, Energy, Industry, Innovation, Policy, Technology | Permalink | Comment (0)
Nuclear Education Nuclear Outreach
Canada Wins Guiness World Record for Largest Science Lesson
January 24, 2013 – 14:45
We did it, Canada! On October 12, 2012, to kick off National Science & Technology Week, participants across the country got together at multiple locations to go out for the Guiness World Record for the largest practical science lesson.
TalkNUclear participated with the students at the University of Ontario Institute of Technology (UOIT), one of Canada's fastest-growing universities, by a group of 46 students all from the highly regarded Nuclear Engineering program.
Read about the science lession at UOIT here: National S&T Week Kicks Off With A Record Breaking Science Lesson
The largest practical science lesson at multiple venues involved 13,701 participants and was achieved by Science.gc.ca (Canada) at 88 locations across Canada, on 12 October 2012.
All lessons began at 1 pm EST and included 2 experiments which demonstrated Bernoulli's Principle on air pressure.
http://www.guinnessworldrecords.com/world-records/2000/largest-practical-science-lesson-%28multiple-venues%29
Tags Education, NSTW, Science, Technology | Permalink | Comment (0)
Nuclear Education Nuclear R&D
National S&T Week Kicks Off With A Record Breaking Science Lesson
October 15, 2012 – 14:36
This year, to kick off National Science and Technology Week, Canada decided to do something special. By organizing a science experiment to be conducted simultaneously across over 135 locations nationwide, and involving well over 3,000 participants, we collectively submitted an attempt to the Guinness Book of World Records for the largest science experiment ever conducted! Final numbers of participants will be available in a few weeks to verify that the record was set.
National Science and Technology Week spans October 12 – 21, 2012, and the record-setting experiment took place at precisely 1:00pm EST on opening day. This special week raises awareness of the importance of science and technology in our daily lives, and celebrates Canada's historic and ongoing role as a leader in technological innovation.
Here at the Canadian Nuclear Association, we are proud to celebrate this week. Canada is one of the world's nuclear pioneers, and continues to find success with advancements of its historically innovative CANDU reactor technology. In addition to producing approximately 15% of national electricity supply, CANDU reactors are also used internationally in six other countries.
Canada is also a chief innovator in nuclear medicine technology, having given birth to the use of Cobalt-60 as a powerful isotope in radiation therapy, as well as producing between 20-30% of the world's supply of medical isotopes used for treatment and diagnostic imaging in almost 60 countries.
The record-setting experiment was performed at the University of Ontario Institute of Technology (UOIT), one of Canada's fastest-growing universities, by a group of 46 students all from the highly regarded Nuclear Engineering program. These students represent the bright, young generation upcoming in Canada's vibrant nuclear industry, and their enthusiasm is what made this event possible. In fact, of all the venues involved in this nationwide experiment, almost all were educational facilities!
As we await the announcement on the success of the experiment, we continue to recognize the importance of investment in science and technology to drive our industries forward. Through continued investment in nuclear technology, Canada is empowered to stay on the cutting edge of nuclear innovation, and produce advances towards benefiting the health, safety, and livelihood of Canadians and people around the world.
About the Science Lesson
Across Canada, participants conducted experiments that explored the Bernoulli principle which states that as a constant volume of fluid (or air) increases in speed, it experiences a corresponding decrease in pressure. This is the principle responsible for how airplane wings work, as the curvature of the wing creates a pressure difference between the air above and below it, resulting in motion in the direction of lower pressure and less resistance – up.
In the case of the experiments, the principle was demonstrated by blowing through a straw in a glass of water and between two balloons.
UOIT's Nuclear Engineering Training Ground
The UOIT Radiation Detection Laboratory is home to several specialized detectors for teaching students how to measure different types of radiation.
Graduate students travel from around the world to practice and be tested on UOIT's brand new CANDU reactor simulator.
This general purpose laboratory features impressive and powerful equipment, such as the X-Ray Fluorescence Spectrometer pictured on the left-side desk.
Tags NSTW, S&T, Science, Technology, UOIT | Permalink | Comment (0)
Nuclear News Nuclear R&D
Journal Launch: AECL Nuclear Review
July 5, 2012 – 10:55
TalkNUclear is pleased to share the news that AECL has just launched AECL Nuclear Review, Canada's newest journal for nuclear science and technology.
AECL Nuclear Review - Vol. 1, No. 1 June 2012
AECL Nuclear Review showcases innovative and important nuclear science and technology that is aligned with AECL's core programs. The Journal welcomes original/novel articles and technical notes in a variety of subject areas: CANDU Nuclear Industry; Nuclear Safeguards and Security; Clean Safe Energy including Gen IV, Hydrogen Technology, Small Reactors, Fusion, Sustainable Energy and Advanced Materials; Health, Isotopes and Radiation; and Environmental Sciences. The accepted peer reviewed articles are expected to span different disciplines such as engineering, chemistry, physics, and biology.
AECL Nuclear Review welcomes Canadian and international research scholars and scientists from different disciplines to its new publication which reflects the integration of scientific researchers and industrial practitioners.
If you would like to submit an article for consideration, or, wish to reach any member of the editorial team, please get in touch:
JANL@aecl.ca or 1-800-364-6989 (Corporate Communications)
Click to download the first issue of AECL Nuclear Review (8MB)
Tags AECL, CANDU, Energy, Nuclear, Safety, Science, Technology | Permalink | Comment (0)
Nuclear Education Nuclear Energy
How to Earn Your Science and Technology Badge
April 28, 2012 – 09:20
Cub Scouts from one of Ottawa's oldest Pack's – the Ottawa 24th Pack – participated in a sleepover at the Canada Science and Technology Museum last weekend, with support from the Canadian Nuclear Association (CNA). "When I heard that the Pack would be doing badge work with a focus on Canadian science and technology innovation, I was pleased to offer member support," said CNA President & CEO Denise Carpenter.
Heather Kleb, the CNA's Director of Regulatory Affairs and a Pack leader and parent, explained that the program was intended to review the importance of technology in Canadian living, including advances such as Canada's first satellite (Alouette) and the Canadarm. And of course no trip to the Science and Technology Museum would be complete without a visit to the Energy: Power to Choose exhibit to see ZEEP (the Zero Energy Experimental Pile Reactor).
Cub Scouts in front of ZEEP
The Cubs were surprized to learn about the important role that Canadian scientists played in galvanizing the nuclear industry in Canada and around the world. They commented that ZEEP "looks kind of like a really cool spaceship." They also had a number of questions, such as: "what can radiation do to you" and "can it really give you super powers" (a Spider-man reference maybe).
Heather said that "a fun time was definitely had by all" and "we want to extend our sincere thanks to the CNA and its members for making it possible for our Pack to participate in this."
Zero Energy Experimental Pile (ZEEP) Reactor
Learn more about ZEEP at TeachNUclear.ca – the CNA's curriculum website.
As the nuclear industry continues to play an increasingly important role in the daily lives of Canadians, sustaining a robust education, science and technology program is a priority. Nuclear S&T initiatives foster excellence in science, technology, manufacturing, energy and medicine. They contribute significantly to developing highly qualified personnel for the nuclear and non-nuclear sectors.
Tags Energy, Nuclear, Science, Technology | Permalink | Comment (0)


Zac Goldsmith's bill proposing to allow constituents to recall corrupt MPs passed its first reading by 127 votes to 17 this afternoon. Worth looking at a few of the names who voted against.
There is Labour's Frank Dobson, who lives in £1 million council flat despite earning three times the average wage.
What about Brian Donohoe, who put through a £2,575 expense claim for one three-seat and two double-seater sofas.
Tom Harris with his three iPads at the taxpayers' expense.
Not to mention John Baron, who bought a three-bedroom house £153,500, claimed expenses on the mortgage repayments, and then sold the property for £250,000.
And finally Paul Beresford, who through his second job as a dentist, designated his west London property, which includes his surgery, as his second home on expenses.
What possible reason could they have for voting against?


text:
Compliance Date
The texts provided in the links above are the final working documents. Before they can take effect, they must first be published in the Official Journal of the European Commission. After that, there is series of steps for their entry into force, repeal of the existing Standard Contractual Clauses, and a transition period, so that the compliance date is expected to be December 27, 2022.
GDPR Issues
The modernized SCCs address many of the new issues that were raised in the General Data Protection Regulation (GDPR). For example there are enhanced requirements for transparency (Clause 8.2), accuracy and data minimization (Clause 8.3), right of erasure (Clause 8.5) and accountability (Clause 8.9). There are also lengthy provisions concerning security, enhanced security measures, notification of the data controller in case of a breach of security (clause 8.6). Data subject rights and redress provisions in Clauses 10 and 11 are extensively covered, taking over two pages.
Access by Public Authorities
The modernized SSC address, but only in part, the recent decision of the European Court of Justice in the Schrems II case. For example, the new SCCs set forth detailed obligations related to the performance of due diligence for assessing the potential impact of local laws on the data. Clause 14 contains obligations to assess the local laws in the recipient country to determine their effect on compliance with the Clauses. Further, Clause 15 addresses the obligations of the data importer in case of access request by authorities in the recipient country.
Due Diligence and Supplementary Measures Still Needed
The new SCC are not intended to provide a one size fits-all cure that fully addresses the deeper issues and the much more complex effect of national security laws raised by the CJEU decision of July 2020 in Schrems II. These issues vary depending on the country, the type of personal data at stake, and other factors. Due diligence, evaluation, and gap analysis in a form similar to that which is described in draft Recommendations 01/2020 of the EDPB remains necessary. And these activities must be documented.
Recitals 18 to 22 of the SCC Implementing decision stress the need to address the mandates of the CJEU decision of July 2020 in Schrems II in advance of signing any document that incorporates the new SCCs for crossborder transfers.
Recital 19 of the Implementing Decision warns that the transfer and processing of personal data under the SCC should not take place if the laws and practices of the third country of destination prevent the data importer from complying with the clauses. It also stresses that the parties should warrant that, at the time of agreeing to the standard contractual clauses, they have no reason to believe that the laws and practices applicable to the data importer are not in line with these requirements.
Recital 20 provides further guidance, and clarifies that when evaluating the impact of local laws on compliance with the SCCs, different elements may be considered, including reliable information on the application of the law in practice, such as case law and reports by independent oversight bodies; the existence or absence of requests in the same sector; and the documented practical experience of the data exporter and/or data importer.
While the publication of the final draft of the SCCs has provided certainty as to the detail of the SCCs, it has also made more urgent the need for businesses to pay attention to their use or processing of personal data originating from the EU/EEA and revamp their data processing practices and policies and their data transfer agreements. Before trading the old for the new, it is becoming critical that they complete the due diligence and activities suggested in EDPS Recommendations 01/2020 in conjunction with the using the additional guidance provided in the Implementing Decision as necessary to ensure that a specific data transfer or specific data to a specific country is feasible.


FOH engineer Tomas Wolfe has been using a Waves eMotion LV1 Live Mixer to mix Run The Jewels' tour.
Knoxville, TN (December 21, 2017)—Hip-hop supergroup Run The Jewels has become a phenomenon in part from doing things its own way, whether releasing its debut album as a free download, or reworking its second album into an album-length remix entirely of cat sounds, duly titled Meow The Jewels. Just as independently minded, engineer Tomas Wolfe has been using a Waves eMotion LV1 Live Mixer to mix the duo's tour.
Wolfe is no stranger to touring, having worked with The Neighborhood, Danny Brown, Everlast, House of Pain, The Faint and The Mowglis, among others. For the Run The Jewels jaunt, he found the eMotion LV1 met his needs. "We are doing a lot of back-to-back fly dates with Run the Jewels, and we needed something that we could carry on to the plane but without compromising the sound quality," he said.
Perhaps unsurprisingly, Wolfe uses a number of Waves plug-ins for his shows and cites the F6 Floating-Band Dynamic EQ, the Primary Source Expander (PSE) and X-FDBK as his 'go-to' favorites.


with little kid essays hanging below.
I stopped cold because I hadn't learned the value of this word when I was nine. Oh no, I didn't learn the value of this word until I was well...well into adulthood and my therapist pointed out I was lacking in empathy.
"But my yoga handstand is improving..." I argued.
She delivered the steady gaze all psychotherapists must practice in therapy school.
Sympathy showed up in our household in chats about the circumstances of a neighboring family struggling more than we were. We felt sorry for those people. We grimaced at their lot. And we stayed distant as if touching would be contagious.
This is not empathy. It's not even good sympathy.
Empathy evokes compassion. Empathy is putting ourselves into someone else's shoes. Empathy is the kind ear of identification.
We are never too young to reach beyond ourselves in empathy.
We are never too old to reach beyond ourselves in empathy.
Empathy can and should be taught at every age.
I feel lonely at home then I read a book then I feel more lonely.
The meaning of lonely is being somewere without people talking to you, not being with you, and most of the time when you are lonely you are sad.


Magnetic Rollers are tricky to get the hang of! Even though they are called "magnetic" its hard to get the hair to grip on the roller. After many attempts I was able to to figure out how to keep them on my head. Even so, they were loose and my hair would frizz out of them! By the time they were dried I would have silky smooth ends with plenty of Africa at the roots. NOT the look I'm going for!
After honing in my techniques using mesh rollers, I decided to apply the idea to using magnetic rollers. The end result left me with the SILKIEST Roller set ever and my roots were pretty smooth, with NO PONYTAILS or HEAT REQUIRED. I haven't perfected the technique yet, but I just had to share!
I prefer to roll upwards to get a flatter result at the roots.
By doing this you reduce the amount of frizzies you get when you finish rolling that particular section.
They help to contain the hair while it air dries and prevent premature frizzing while you roll and getting smoother results when you get in the dryer. I found I could use the caps for a size slightly bigger than the roller it comes with.
To get the best placement with a snap on cap, secure it at the base of the roots.
Tip 3: Do not wet your hair after rolling!
It may look good temporarily but it will just give more frizz in the long run. Reroll if the hair looks too frizzy.
Tip 4: Use metal clips for security.
The caps are not enough to secure the hair and leave slack at the root. Use a metal clip to help secure the rollers. You can also add stability by clipping rollers together but they must be very close to each other so you do not over stress the hair.
The net helps to keep everything together and reduce frizz once the dryer starts blowing on your hair. Also it makes you feel like you're in the salon! I like to use the net just for that!
After that I got under the dryer and chillaxed!. Once done, I removed the rollers and got a miraculously silky and smooth result!
The roots were smooth and had very little crinkles! Not too bad for someone who hasn't rolled on magnetic for almost a year!
My roots were pretty smooth!
I did end up flat ironing my roots just to see if it would look more polished. It turns out that was a waste of time because my hair didn't look much different. I could have easily just pressed the edges and crown and left the rest alone like I usually do.
After that I pin curled my hair to help it fall the way I liked.
Once I was done I let it loose and loved the look! Even after the curls dropped a little my hair was still quite nice!
I will continue to keep practicing my roller sets but I hope this will help any naturals and transitioners who are frustrated with puffy roots with magnetics!


Here's the deal: One lucky Postfly subscriber will find a Postfly X Cheeky Golden Ticket inside their March fly box and will automatically win a brand new Boost 350 Fly Reel and a 6-month subscription of your choice to Postfly!
Subscribe to Postfly before March 15 to be eligible for the Cheeky X Postfly Golden Ticket. If you're already a subscriber, you're already entered! Keep your eyes peeled for that March box and good luck!
My husband is limited to what he can do, but he can sit in a chair and fish with the kids. They can take the fish off the hook, it would be great for him.


text:
Stony Hill Corp. Investee, GemmaCert, Closes $2.25 Million Series A-1 Round
BEVERLY HILLS, CA / ACCESSWIRE / February 16, 2018 / Stony Hill Corp. (OTC:STNY) ("the Company"), a diversified company focused on the legal cannabis industry, is pleased to announce that one of its portfolio companies, GemmaCert, has completed a $2.25 Million Series A-1 financing round (the "Financing").
GemmaCert, will be using proceeds from the Financing to launch their non-destructive desktop cannabis composition and potency testing solution primarily for professional and home growers, processors and dispensaries.
Chris Bridges, President of Stony Hill, commented, "As Stony Hill continues to expand its portfolio into multiple segments of the cannabis industry, this investment has fit very nicely into our strategic vision. This Series A-1 financing round represents a major step for our investee towards becoming the leading testing platform in the cannabis industry."
"GemmaCert will contribute to setting the vital quality norms which will inevitably become standard practice in the cannabis industry. This standard is already widespread across the health and nutrition world, creating a unique strategic growth opportunity in the fast-emerging cannabis market," added Bridges.
"GemmaCert helps overcome the current challenges posed by the heterogenous cannabis flower, paving the way for personalized and reliable dosing, and providing a solution for the unpredictability associated with cannabis effectiveness. The funds raised will accelerate the execution of our business development plans, boost talent recruitment and drive us to generate first revenues in 2018," said Dr. Guy Setton, Co-Founder and CEO of GemmaCert.
"Achieving a consistent dose is crucial for optimal treatment and patient safety, more so as cannabis turns increasingly popular and acceptable," said Prof. Oded Shoseyov, co-founder and Chief Scientific Officer of GemmaCert. "However, every cannabis flower is unique, differing in terms of composition and potency. That uncertainty challenges effective management for a variety of medical conditions and ailments."
The Financing, led by the Company, combined with additional seed funding, brings GemmaCert's total funding to over $3 million. The Company announced its initial investment in the Tel Aviv, Israel based testing device company on March 14, 2017.
About GemmaCert
GemmaCert (http://gemmacert.com/) has developed the world's first accurate, affordable and easy-to-use device, for the non-destructive detection, analysis and automated sorting of individual medical cannabis flowers. GemmaCert's proprietary technology combines Near Infra-Red ("NIR") spectrometry and imaging tools to provide a sensitive method to detect and quantify the active compounds of the cannabis plant and a unique spectral fingerprint for each flower. The addition of a sorter will enable automated sorting of cannabis flowers by pre-set criteria suitable for mass production. An optional attachable label generator and automated packaging unit will pack flowers individually ensuring full composition and potency traceability and tracking for each and every flower from farmer to patient.
About Stony Hill Corp.
Stony Hill Corp.(www.stonyhillcorp.com), is a diversified company focused on multiple areas of the cannabis, hemp and CBD industry. The company is focused on select investment, branding, real estate, and partnership opportunities in the recreational, health and wellness, nutraceutical, and media industries.
Stony Hill has several strategic partnerships and investments currently in place and is actively pursuing additional partnerships and strategic growth opportunities.
Email: ir@stonyhillcorp.com or info@stonyhillcorp.com.
To be added to the Stony Hill email distribution list, please email info@stonyhillcorp.com with STNY in the subject line.
Except for historical information contained herein, statements in this release may be forward-looking and made pursuant to the safe harbor provisions of the Private Securities Litigation Reform Act of 1995. Words such as "anticipate," "believe," "estimate," "expect," "intend," and similar expressions, as they relate to Stony Hill Corp. (the "Company") or its management, identify forward-looking statements. These statements are based on current expectations, estimates and projections about the Company's business based, in part, on assumptions made by management. These statements are not guarantees of future performance and involve risks, uncertainties, and assumptions that are difficult to predict. Therefore, actual outcomes and results may, and probably will, differ materially from what is expressed or forecasted in such forward-looking statements due to numerous factors, including those described above and those risks discussed from time to time in the Company's filings with the Securities and Exchange Commission. Factors which could cause actual results to differ materially from these forward-looking statements include such factors as (i) the development and protection of our brands and other intellectual property, (ii) the need to raise capital to meet business requirements, (iii) significant fluctuations in marketing expenses, (iv) the ability to achieve and expand significant levels of revenues, or recognize net income, from the sale of our products and services, (v) the Company's ability to conduct the business if there are changes in laws, regulations, or government policies related to cannabis, (vi) management's ability to attract and maintain qualified personnel necessary for the development and commercialization of its planned products, and (vii) other information that may be detailed from time to time in the Company's filings with the United States Securities and Exchange Commission. The Company undertakes no obligation to publicly update or revise any forward-looking statements, whether as a result of new information, future events or otherwise.
GemmaCert
Stony Hill Corp.
STNY
Series A-1
Stony Hill Corp. Enters Animal Health Industry with Launch of TherPet
Stony Hill Advisory Board Includes a Former Pfizer Director and More
Damian Marley's Stony Hill Launches Hemp CBD Product Line
Damian Marley Sheds Light on the Meaning of "Stony Hill"
Damian Marley's Stony Hill Strategically Invests in High Times
Damian Marley's Stony Hill Corp. Invests in Israeli Cannabis Company


text:
Q: How to get fitted curve for errorbar graph for several text files I have written a code for getting errorbar and curve fitted line. But I am getting an error. I have tried this curve fitted line code from see the answer from this webpage but it is not working for me. Can you help me with it?
My Code:
#!/home/zahid/anaconda3/bin/python
import numpy as np
import matplotlib.pyplot as plt
import numpy
from scipy.optimize import curve_fit

x1, y1, y2,y3,y4,y5,y6 = [], [], [],[],[], [], [],[],[], [], [],[]

with open("1_peak.txt") as f:
    for line in f:
    cols = line.split()
    x1.append(float(cols[0]))
    y1.append(float(cols[2]))

with open("2_peak.txt") as f:
    for line in f:
    cols = line.split()
    x2.append(float(cols[0]))
    y2.append(float(cols[2]))
.
.
.

with open("6_peak.txt") as f:
    for line in f:
    cols = line.split()
    x6.append(float(cols[0]))
    y6.append(float(cols[2]))

for item_a, item_b, item_d, item_e, item_f, item_g, item_c in zip(y1, y2,y3,y4,y5,y6, x1):

 B = (item_a + item_b + item_d + item_e + item_f + item_g)/6
 arr = numpy.array([item_a, item_b, item_d, item_e, item_f, item_g])
 C = numpy.mean(arr, axis=0)
 D = numpy.std(arr, axis=0)

 print (item_c, C , D)

 x = np.array(item_c)
 y = np.array(C)
 e = np.array(D)

 def line(x, a, b):
    return a * x + b

 popt, pcov = curve_fit(line, x, y)
 plt.errorbar(x, y, e, linestyle='None', marker='^')
 xfine = np.linspace(0., 100., 100)
 plt.plot(xfine, line(xfine, popt[0], popt[1]), 'r-')
 plt.xlabel('PKA_energy in keV')
 plt.ylabel('intersitial')
 plt.savefig("1.jpeg", dpi=500)

I am getting below error:
Traceback (most recent call last):
File "./value_analysis_peak_SIA_energy.py", line 70, in <module>
popt, pcov = curve_fit(line, x, y)
File "/home/zahid/anaconda3/lib/python3.6/site-packages/scipy/optimize/minpack.py", line 736, in curve_fit
res = leastsq(func, p0, Dfun=jac, full_output=1, **kwargs)
File "/home/zahid/anaconda3/lib/python3.6/site-packages/scipy/optimize/minpack.py", line 380, in leastsq
raise TypeError('Improper input: N=%s must not exceed M=%s' % (n, m))
TypeError: Improper input: N=2 must not exceed M=1

A: I think this is similar to what you want to do, please try it and modify as needed for your work. Here I use a quadratic curve to fit the data, the polynomial order is set at the top of the code.

#!/home/zahid/anaconda3/bin/python
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

polynomialOrder = 2 # example quadratic

x1 = []
x2 = []
x6 = []

y1 = []
y2 = []
y6 = []

# load the raw data
with open("1_peak.txt") as f:
    for line in f:
        cols = line.split()
        x1.append(float(cols[0]))
        y1.append(float(cols[2]))

with open("2_peak.txt") as f:
    for line in f:
        cols = line.split()
        x2.append(float(cols[0]))
        y2.append(float(cols[2]))

with open("6_peak.txt") as f:
    for line in f:
        cols = line.split()
        x6.append(float(cols[0]))
        y6.append(float(cols[2]))

# fit each data set to individual polynomials
parms1 = np.polyfit(x1, y1, polynomialOrder)
parms2 = np.polyfit(x2, y2, polynomialOrder)
parms6 = np.polyfit(x6, y6, polynomialOrder)

# calculate errors for each fit
err1 = np.polyval(parms1, x1) - y1
err2 = np.polyval(parms2, x2) - y2
err6 = np.polyval(parms6, x6) - y6

# graph size is set before calling plot commands
graphWidth = 800 # pixels
graphHeight = 600 # pixels
plt.figure(figsize=(graphWidth/100.0, graphHeight/100.0), dpi=100)

# plot the raw data as error-bar scatter plots
plt.errorbar(x1, y1, err1, linestyle='None', marker='^')
plt.errorbar(x2, y2, err2, linestyle='None', marker='^')
plt.errorbar(x6, y6, err6, linestyle='None', marker='^')

# plot the fitted polynomials
xmodel1 = np.linspace(min(x1), max(x1))
ymodel1 = np.polyval(parms1, xmodel1)

xmodel2 = np.linspace(min(x2), max(x2))
ymodel2 = np.polyval(parms2, xmodel2)

xmodel6 = np.linspace(min(x6), max(x6))
ymodel6 = np.polyval(parms6, xmodel6)

plt.plot(xmodel1, ymodel1)
plt.plot(xmodel2, ymodel2)
plt.plot(xmodel6, ymodel6)

# final code here
plt.xlabel('PKA_energy in keV')
plt.ylabel('intersitial')

plt.show()

'''
popt, pcov = curve_fit(line, x, y)
plt.errorbar(x, y, e, linestyle='None', marker='^')
xfine = np.linspace(0., 100., 100)
plt.plot(xfine, line(xfine, popt[0], popt[1]), 'r-')
plt.xlabel('PKA_energy in keV')
plt.ylabel('intersitial')
#plt.savefig("1.jpeg", dpi=500)
plt.show()
'''

redpajama_set_name: RedPajamaStackExchange


Please find the Rancangan Pengajaran Tahunan (RPT) KSSR Year 3 for BM, English, Matematik, Science and others at the RPT/Lesson Plan section or click the link below.
To share your RPT and other materials, feel free to use the KSSR Easy Share.
Your contribution is very much appreciated by teachers!


text:
"Documentary Collaborative" – Looking for Short Films in North Dakota
by Matthew Maldonado | Dec 8, 2016 | Actor to watch, Awesome, Behind The Scenes, Director of Photography, Director to Watch, Film Making, Film ND, Film North Dakota, ND Actors, NDLegendary, News and Events, North Dakota Film, Videos
'America Heard' is a documentary collective born out of a desire to engage in dialogue that bridges political divides and to foster discussions missing from mainstream media throughout the election. They are looking to incorporate a breadth of backgrounds...
2016 Tioga Film Festival
by Matthew Maldonado | Jul 6, 2016 | Actor to watch, Actress to Watch, Film Making, Film ND, Film North Dakota, ND Actors, NDLegendary, News and Events, North Dakota Film, Videos
Lostwood Media , in conjunction with Minot-local Paul Brenno, has created the first Tioga Film Festival in Tioga, North Dakota! According to the regulations, all filmmakers from the USA are eligible to participate and there are no limits to submissions. There are no...
KX Productions Seeks Minot Talent
by Matthew Maldonado | May 14, 2016 | Awesome, Film ND, Film North Dakota, ND Actors, NDLegendary, News and Events, North Dakota Film
KX Productions will be starting production soon on a commercial for a Minot bank (name not disclosed at this time). They are requesting a relatively fit male/female around the age of 30. No details have been confirmed regarding dates or pay at this time. However, if...
Local Actors Cast in Western Movie
by Eric Thoemke | Apr 14, 2016 | Film Making, Film ND, Film North Dakota, ND Actors, NDLegendary, North Dakota Film
As North Dakota continues to grow its film industry, it is important to showcase some of the talent helping North Dakota get there. The upcoming feature film, The Long Look Back, is set to be filmed in South Dakota but has lent some of the main acting roles to local...


SECOND YOU ARE AT RISK OF BEING HACKED.
Advanced Cyber Detection, Analysis and Mitigation.
We identify people inside and outside of your organization as they try to bring harm to, or harvest data from, your networks and systems.
We utilize advanced tools and methods to track patterns in behavior, to identify anomalies in systems, and to leverage big data capabilities to anticipate issues and predict the locations and style of the next attack.
We fix the problems that are found during detection and analysis, close the holes before they are discovered publicly, and deploy assets in a way that hardens the entire system.
and risk management problems across federal and commercial clients.


SETA JEWELRY Dazzle them with the look of lovely rose and white cubic zirconia in this gorgeous interlocking-link tennis bracelet. Twenty glimmering deep rose ovals and contrasting white rounds encircle your wrist in glamorous color and contrast. 11.39 carats T.W. 7.5" length. Lavishly plated in shining platinum.


Shaking The Tree featuring Youssou N'Dour.
Directed by Isaac Julien. Produced by Nadine Marsh-Edwards.
Released in 1990, Shaking The Tree was a career-spanning overview of Peter's solo years from that first self-titled album of 1977 up to the 1989 Passion soundtrack with a few curiosities and rarities to grab the ear of the completist. The compilation's title track, a playful duet between Peter and Senegalese superstar Youssou N'Dour, hadn't previously appeared on a Gabriel album, just on Youssou's The Lion album. Here it reappears, albeit it with a new vocal from Peter. Here Comes The Flood, originally from that 1977 debut, is also revisited, this time in a deeply effective (and affecting) piano-and-voice treatment.


Glossybox Launches 'Get Glowing' Box for March!
Home » Glossybox Launches 'Get Glowing' Box for March!
Glossybox Launches 'Get Glowing' Box for March!
First up are products to get your tresses back in order. My hair feels so dry these days. I blame it on the hard London water and I am in serious need of something to quench my thirsty locks. So I was pleased to see a hair product in this month's box for that very reason. Although I haven't heard of 417 before I am keen to try both of these products – the Catharsis Vitamin Mineral Shampoo and Conditioner, both in a handy travel-size. The conditioner should be left on for five minutes so make sure you wash your hair straight away when you get in the shower and leave the conditioner to do its work while you shave your legs, etc.
For the face, there is another new brand which I have not tried before. This one is Hey Honey Good Morning Honey Silk Facial Serum which contains honey and propolis which has great antiseptic and antibacterial properties so I imagine this would be quite good for acne-prone skin. Or perhaps use this during hormonal breakouts if you get them.
There is also a mini Olay Regenerist Luminous Tone Perfecting Cream which targets discolouration. Good to pack in the bag if you are going away for a long weekend!
I am a bit of a brush addict so my favourite item in this month's box is a Luxie Rose Gold Large Angled Face Brush. The bristles are so soft on this brush and feel like a whisper on your face. Because of the angle, this is perfect for contouring, strobing, etc. and it's also a very pretty brush indeed! I am really excited to add it to my collection.
Last but not least is the ultimate glow stick – the Collection Speedy Highlighter. This is a super-handy little stick that you can use to highlight with, strobe, etc. This would be a great all-around product to carry in your bag and even use on your eyelids if you need some extra shimmer.
I swatched this on my hand and it blended really well so it looks really natural. I know that you can't even tell it's on my hand below but it really is! So for those who don't like a highlighter that is too shimmery, this is a great choice.
A Glossybox monthly subscription is only £10 and I think it's totally worth it for any beauty addict!
Previous Post Winter Skincare + WIN a MONU Skincare Set Worth £77!


text:
I also slept with Rashmi Verma – Review
Post Category: Novels
I also slept with Rashmi Verma is a novel written by an Indian author under the pseudonym Love Thon. And I believe that the novel has been published in haste (which might have occurred in the excitement of publishing something as exciting as this) because you will see the cover image and a dedication page and then, the novel just begins! Nevertheless, the novel has been written with a very careful fragmentation of the campus life filled with excitement, actions, drama and also emotions. While the other guys in that hostel of a management college claim to have been intimate with Rashmi Verma, the protagonist, a certain Motu, who happens to be our narrator, feels to be in emotional love with Rashmi rather than a physical love that peeps time to time from his actions and conversations.
"She would clap and scream in sheer excitement and joy and say "F**k her, f**k her, just f**k her." At this cue, I would try to kiss and grope Rashmi. All the while, Jayshree would be egging me on and saying "F**k her, f**k her."
Well, there are instances like this, way too much, in the novel and a reader who readers erotic fiction would certainly understand that there is something that needs to be there… and this campus novel banks on a girl of lofty ideas about having sex with many boys and chasing them to their rooms with her 'kiss-threats'. This seems just an antithesis to the genre of erotica because here, instead of a boy, a girl takes the charge and she leads the scene in the sexual playground.
"She was short in height but was buxom with heavy hips ever so enticing. She strode in confidence of her sex appeal and vigour. This woman was intelligent, funny, witty yet lonely, aloof, tormented and humiliated. She had all these qualities and more."
I also slept with Rashmi Verma (well, the title seems enticing as well as too limited) by Love Thon is all about campus life – fun, weeds and sex. Though the novel takes a few emotional turns with the introduction of Motu's emotions for Rashmi, it goes on at a pace the modern readers would like reading erotica. However, the resources are limited and the novel never goes out of the hostel compound. Moreover, toward the end, the novel takes a different turn altogether and that washes away a lot of dirt from the mirror and a reader can see the actual image.
Just to end, the novel is light and casual and certainly limited to be read by young readers or the readers who really love reading erotic romance and campus novels. Except for pure fun and sex, you will seldom find something other than the conclusion that is powerful. And that suits well to this novel because it keeps light throughout and readers can finish it within hours. You can buy the novel by Love Thon from Amazon:
Buy the novel – click here to buy
review by Naman for Indian Book Critics
I also slept with Rashmi Verma
Indian Book Critics' Rating
If you love reading erotic novels, you can certainly enjoy this piece… you will love the pace and also the vibrant first-person narrative mixing emotions with desire for love… weed, sex, erotica… light campus read!
#Indian Fiction#IndianWriting#New Releases
Starry Nights by Shobha De – Book Review
Emma by Jane Austen – Book Review
Pride and Prejudice by Jane Austen – Book Review
It was an outstanding erotic fiction. I liked the pseudonym of the author. I am looking forward to reading a new book from him soon.
Nishant
What should I say after reading the review? The novel has nothing more to offer than campus sex. I don't why authors are writing in this direction.
Anand Singh
A light and casual fiction. It's a really nice review by you provide the whole insight about the book. I liked the way you have written, in the book, you will seldom find anything to expect sex and fun and it can be finished within hours.


text:
Policier & Thriller (353)
Tourisme & Voyages (10)
Pan Books Ltd
Examines the true story of Chris McCandless, a young man, who in 1992 walked deep into the Alaskan wilderness and whose SOS note and emaciated corpse were found four months later. This book explores the obsession which leads some people to explore the outer limits of self, leave civilization behind ...
Poche N.C.
Livre étranger - Contacter votre libraire
Poche,
Charlatans
B>Charlatans is an explosive thriller from New York Times bestselling author and master of the medical thriller Robin Cook./b>Noah Rothauser is the new super chief resident at the state-of-the-art Boston Memorial Hospital. Taking on such a prestigious job is a dream come true, but the pressures of t...
Une plongée dans le spectral Lunar Park est une excellente façon d'entrer dans les coulisses de ce romancier.(Christine Ferniot - Télérama,22/09/2010) ...
An eventful day in the life of Eric Packer, a multi-billionaire and a decommissioned nuclear bomber who has recently married the heiress of a vast European fortune. His bodyguards are worried that he is a target and, indeed, he is - although the danger, is not from protesters or political assassins ...
Three seemingly independent events occur one morning in London: an MP wakes up after spending the night with a woman he picked up in a bar; a tycoon meets a Bank of England official for breakfast; and a criminal briefs his crew. A journalist struggles to unravel the truth behind the three events. ...
All change - cazalet chronicles: book 5
Elizabeth Jane Howard
It is the 1950s and as the Cazalets' beloved matriarch, the Duchy, passes away, she takes with her the last remnants of a world - of great houses and servants, of class and tradition - in which the Cazalets have thrived. Louise, now divorced, becomes entangled in a painful affair; while Polly and Cl...
A COLUMN OF FIRE - THE KINGSBRIDGE NOVELS
B>Millions of readers have been enthralled by the saga that began in The Pillars of the Earth and World Without End, which now continues with Ken Follett's magnificent, gripping A Column of Fire./b>br>b>/b>br>b>A WORLD IN TURMOIL/b>1558, and Europe is in revolt as religious hatred sweeps the contine...
C. J. Sansom
The eagerly anticipated new Shardlake novel from the number one bestselling author.Summer, 1546.King Henry VIII is slowly, painfully dying. His Protestant and Catholic councillors are engaged in a final and decisive power struggle; whoever wins will control the government of Henry's successor, eight...
The Modigliani scandal
In the modern art world of intrigue and competition, rumours had long flourished about the existence of a lost masterpiece by Modigliani. Now, with the prize for uncovering the work higher than ever, a chase begins across Europe to see who can get the painting first. ...
Blake Crouch
THE PILLARS OF THE EARTH - THE KINGSBRIDGE NOVELS 1
B>A spellbinding epic tale of ambition, anarchy, and absolute power set against the sprawling medieval canvas of twelfth-century England, /b>b>The Pillars of the Earth/b>b> is Ken Follett's classic historical masterpiece./b>br>b>/b>br>b>A MASON WITH A DREAM/b>1135 and civil war, famine and religious...
WALK THE WIRE
The number one bestselling author returns with a highly-charged thriller taking Amos Decker, who has proved one of his readers' favourite characters to date, on an action-packed investigation with all the trademark twists and turns which make David Baldacci one of the world's favourite storytellers....
Edge of eternity
As the decisions made in the corridors of power bring the world to the brink of oblivion, five families from across the globe are brought together in an unforgettable tale of passion and conflict during the Cold War. When Rebecca Hoffmann, a teacher in East Germany, finds herself pursued by the secr...
THE EVENING AND THE MORNING
From the bestselling author Ken Follett, The Evening and the Morning is a historical epic that will end where The Pillars of the Earth begins. A TIME OF CONFLICT It is 997 CE, the end of the Dark Ages, and England faces attacks from the Welsh in the west and the Vikings in the east. Life is...
END GAME - WILL ROBIE SERIES
End Game is the fifth book in the thrilling Will Robie series by international number one bestselling author David Baldacci.Will Robie, highly trained assassin and the US government's most indispensable asset, is called to London.An imminent terrorist attack threatens the Underground and with the US...
Et si Winston Churchill avait été écarté du pouvoir en 1940 ? Et si les nazis avaient alors conquis l'Angleterre ? Entre roman d'espionnage, polar historique et politique-fiction, une oeuvre magistrale où l'auteur imagine le sort d'une Europe qui aurait pactisé avec le diable. Acclamé outre-Manche, ...
Grand format N.C.
WORLD WITHOUT END - THE KINGSBRIDGE NOVELS
B>The saga that has enthralled millions of readers, The Kingsbridge Novels continue with World Without End./b>On the day after Halloween, in the year 1327, four children slip away from the cathedral city of Kingsbridge. They are a thief, a bully, a boy genius and a girl who wants to be a doctor. In ...
CHILD''S PLAY
What do we do when our children don't share our hopes for them? In Child's Play , the world's favourite storyteller, Danielle Steel, explores how families can evolve and grow in unexpected ways. You think you know what's best for your grown-up children. But you'll find they have lessons they can ...
THE BURNING CHAMBERS
B>* The Sunday Times Number One Bestseller */b>b>From the multi-million, number one bestselling author of /b>b>Labyrinth/b> b>and /b>b>The Taxidermist's Daughter, /b>b>comes /b>b>The Burning Chambers:/b> b>a gripping story of love and betrayal, mysteries and secrets, conspiracies and divided loyalti...
Emotionally gripping and richly involving, Silent Night explores how the heart has mysterious healing powers of its own, and that sometimes the best things happen when we think all is lost . . . Danielle Steel's stunning novel is a deeply moving story of resilience, hope and the importance of family...
B>The Dark Side is a powerful and unsettling novel of loss, motherhood and the innocence of childhood from the world/b>'b>s favourite storyteller, Danielle Steel./b>Zoe Morgan was just ten years old when her life changed forever. Her sister, Rose, died of a rare illness, her parents turned into peop...