text:
import re
from collections import OrderedDict
from query_designer import models
from query_designer.models import Query

import time
from threading import Thread

import sys
from django.db import connections, ProgrammingError

from aggregator.models import Variable, Dimension
from .utils import GRANULARITY_MIN_PAGES, ResultEncoder

def process(self, dimension_values='', variable='', only_headers=False, commit=True, execute=False, raw_query=False):
    dimension_values = preprocess_dimension_values(dimension_values)
    selects = OrderedDict()
    headers = []
    header_sql_types = []
    columns = []
    groups = []
    prejoin_groups = []

    c_name, v_obj, data_table_names= preprocess_document(columns, groups, prejoin_groups,
                                                        header_sql_types, headers, selects, self)
    prejoin_name = None
    if len(self.document['from']) > 1:
        prejoin_name = extract_prejoin_name(self.document['from'])

    if is_query_for_average(self.document['from']) and prejoin_name is not None:
        limit, offset, query, subquery_cnt = build_prejoin_query(prejoin_name, data_table_names, columns, prejoin_groups, self)
    else:
        limit, offset, query, subquery_cnt = build_query(c_name, columns, groups, selects, self)

    cursor = choose_db_cursor(v_obj)

    if not only_headers:
        # execute query & return results
        t1 = time.time()

        # count pages
        if limit is not None:
            pages = {
                'current': (offset / limit) + 1,
                'total': 1
            }
        else:
            pages = {
                'current': 1,
                'total': 1
            }

        def _count():
            cursor.execute(subquery_cnt)
            self.count = cursor.fetchone()[0]

        self.count = None
        count_failed = False
        t = Thread(target=_count, args=[])
        t.start()
        t.join(timeout=5)

        if self.count is None:
            count_failed = True
            self.count = 10000000

        if limit is not None:
            pages['total'] = (self.count - 1) / limit + 1

        # apply granularity
        if self.count >= GRANULARITY_MIN_PAGES and (not count_failed):
            try:
                granularity = int(self.document.get('granularity', 0))
            except ValueError:
                granularity = 0

            if granularity > 1:
                query = """
                    SELECT %s FROM (
                        SELECT row_number() OVER () AS row_id, * FROM (%s) AS GQ
                    ) AS GQ_C
                    WHERE (row_id %% %d = 0)
                """ % (','.join([c[1] for c in columns]), query, granularity)
        print "Executed query:"
        print query
        results = []
        if execute:
            cursor.execute(query)
            all_rows = cursor.fetchall()
            print "First rows"
            print all_rows[:3]
            print header_sql_types

            results = all_rows
    # include dimension values if requested
    for d_name in dimension_values:
        hdx, header = [hi for hi in enumerate(headers) if hi[1]['name'] == d_name][0]
        d = Dimension.objects.get(pk=selects[d_name]['column'].split('_')[-1])
        if not d.non_filterable:
            header['values'] = d.values

    # include variable ranges if requested
    if variable:
        vdx, v = [vi for vi in enumerate(headers) if vi[1]['name'] == variable][0]
        v['distribution'] = Variable.objects.get(pk=selects[variable]['table'].split('_')[-1]).distribution

    if not only_headers:
        # monitor query duration
        q_time = (time.time() - t1) * 1000

    if not only_headers:
        response = {
            'results': results,
            'headers': {
                'runtime_msec': q_time,
                'pages': pages,
            }
        }
    else:
        response = {'headers': {}}
    response['headers']['columns'] = headers

    if raw_query:
        response['raw_query'] = query

    # store headers
    self.headers = ResultEncoder(mode='postgres').encode(headers)
    if self.pk and commit:
        self.save()

    return response

def preprocess_dimension_values(dimension_values):
    if dimension_values:
        dimension_values = dimension_values.split(',')
    else:
        dimension_values = []
    return dimension_values

def preprocess_document(columns, groups, prejoin_groups, header_sql_types, headers, selects, self):
    data_table_names = []
    for _from in self.document['from']:
        v_obj = Variable.objects.get(pk=_from['type'])

        for s in _from['select']:
            if s['type'] != 'VALUE':
                dimension = Dimension.objects.get(pk=s['type'])
                column_name = dimension.data_column_name
                column_unit = dimension.unit
                column_axis = dimension.axis
                column_step = dimension.step
                sql_type = dimension.sql_type
            else:
                if v_obj.dataset.stored_at == 'UBITECH_POSTGRES':
                    column_name = v_obj.name
                else:
                    column_name = 'value'
                column_unit = v_obj.unit
                column_axis = None
                column_step = None
                sql_type = 'double precision'

            selects[s['name']] = {'column': column_name, 'table': v_obj.data_table_name}
            _from['name'] = v_obj.data_table_name

            # if 'joined' not in s:
            c_name = '%s.%s' % (_from['name'], selects[s['name']]['column'])
            if s.get('aggregate', '') != '':
                c_name = '%s(%s)' % (s.get('aggregate'), c_name)

            if not s.get('exclude', False):
                header_sql_types.append(sql_type)
                headers.append({
                    'title': s['title'],
                    'name': s['name'],
                    'unit': column_unit,
                    'step': column_step,
                    'quote': '' if sql_type.startswith('numeric') or sql_type.startswith('double') else "'",
                    'isVariable': s['type'] == 'VALUE',
                    'axis': column_axis,
                })

                # add fields to select clause
                columns.append( (c_name, '%s' % s['name'], '%s' % s['title'], s.get('aggregate')) )

            # add fields to grouping
            if s.get('groupBy', False):
                groups.append(c_name)
                prejoin_groups.append('%s(%s)' % (s.get('aggregate'), selects[s['name']]['column']))
        data_table_names.append(v_obj.data_table_name)
        groups = list(set(groups))
    return c_name, v_obj, data_table_names

def is_query_for_average(from_list):
    for _from in from_list:
        for s in _from['select']:
            if 'type' in s and s['type'] == 'VALUE' and s['aggregate'] != 'AVG':
                return False
    return True

def extract_prejoin_name(from_list):
    variable_id1, variable_id2 = extract_variable_ids_from_doc(from_list)
    dataset_id1 = extract_dataset_id_from_varible_ids(variable_id1)
    dataset_id2 = extract_dataset_id_from_varible_ids(variable_id2)
    return extract_prejoin_name_for_datasets(dataset_id1, dataset_id2)

def build_prejoin_query(prejoin_name, data_table_names, columns, prejoin_groups, self):
    select_clause = build_prejoin_select_clause(columns)
    from_clause = 'FROM ' + prejoin_name + '\n'
    where_clause = build_prejoin_where_clause(self, prejoin_name)
    group_clause = build_group_by_clause(prejoin_groups)
    order_by_clause = build_order_by_clause(self)
    offset, offset_clause = build_offset_clause(self)
    limit, limit_clause = build_limit_clause(self)

    subquery = 'SELECT * FROM (' + select_clause + from_clause + where_clause + group_clause + order_by_clause + ') AS SQ1\n'
    q = subquery + offset_clause + limit_clause
    subquery_cnt = 'SELECT COUNT(*) FROM (' + q + ') AS SQ1\n'
    print 'Initial Query:'
    print subquery
    q, subquery, subquery_cnt = fix_round(q, subquery, subquery_cnt)
    q = fix_date_trunc(q, subquery, subquery_cnt)
    return limit, offset, q, subquery_cnt

def build_query(c_name, columns, groups, selects, self):
    select_clause = build_select_clause(columns)
    from_clause = build_from_clause(selects)
    all_joins_for_check, join_clause = build_join_clause(c_name, selects, self)
    if not is_same_range_joins(all_joins_for_check):
        raise ValueError("Datasets have columns in common but actually nothing to join (ranges with nothing in common)")
    where_clause = build_where_clause(self)
    group_clause = build_group_by_clause(groups)
    order_by_clause = build_order_by_clause(self)
    offset, offset_clause = build_offset_clause(self)
    limit, limit_clause = build_limit_clause(self)
    # organize into subquery
    subquery = 'SELECT * FROM (' + select_clause + from_clause + join_clause + where_clause + group_clause + order_by_clause + ') AS SQ1\n'
    q = subquery + offset_clause + limit_clause
    subquery_cnt = 'SELECT COUNT(*) FROM (' + q + ') AS SQ1\n'
    print 'Initial Query:'
    print subquery
    q, subquery, subquery_cnt = fix_round(q, subquery, subquery_cnt)
    q = fix_date_trunc(q, subquery, subquery_cnt)
    return limit, offset, q, subquery_cnt

def choose_db_cursor(v_obj):
    if v_obj.dataset.stored_at == 'UBITECH_POSTGRES':
        cursor = connections['UBITECH_POSTGRES'].cursor()
    else:
        cursor = connections['default'].cursor()
    return cursor

def extract_prejoin_name_for_datasets(dataset_id1, dataset_id2):
    query = """SELECT view_name
              FROM aggregator_joinofdatasets
              WHERE (dataset_first_id =%s AND dataset_second_id = %s) OR
                  (dataset_first_id = %s AND dataset_second_id = %s) """ \
            % (dataset_id1, dataset_id2, dataset_id2, dataset_id1)
    cursor = connections['default'].cursor()
    try:
        cursor.execute(query)
    except ProgrammingError as e:
        print "query execution failed due to: ", e
        return None
    res = cursor.fetchone()
    if res is not None:
        return res[0]
    return None

def build_select_clause(columns):
    select_clause = 'SELECT ' + ','.join(['%s AS %s' % (c[0], c[1]) for c in columns]) + '\n'
    return select_clause

def build_prejoin_select_clause(columns):
    select_clause = 'SELECT ' + ','.join(['%s(%s) AS %s' % (c[3], c[2], c[1]) for c in columns]) + '\n'
    return select_clause

def build_from_clause(selects):
    from_clause = 'FROM %s \n' % \
                  (selects[selects.keys()[0]]['table'])
    return from_clause

def build_join_clause(c_name, selects, self):
    join_clause = ''
    all_joins_for_check = []
    tables_in_query = set()
    tables_in_query.add(selects[self.document['from'][0]['select'][0]['name']]['table'])
    for _from in self.document['from'][1:]:
        joins = []
        joins_for_check = []
        for s in _from['select']:
            if 'joined' in s:
                if s['name'].endswith('location_latitude'):
                    js = [
                        (s['name'], s['joined'] + '_latitude'),
                        (s['name'].replace('_latitude', '_longitude'), s['joined'] + '_longitude'),
                    ]
                elif s['name'].endswith('location_longitude'):
                    js = []
                else:
                    js = [(s['name'], s['joined'])]

                for j in js:
                    joins_for_check.append(((_from['type'], selects[j[0]]['column']),
                                            (self.document['from'][0]['type'], selects[j[1]]['column'])))
                    if s.get('aggregate', '') != '':
                        c_name = '%s(%s)' % (s.get('aggregate'), c_name)
                        joins.append('%s(%s.%s)=%s(%s.%s)' %
                                     (s.get('aggregate'),
                                      _from['name'],
                                      selects[j[0]]['column'],
                                      s.get('aggregate'),
                                      self.document['from'][0]['name'],
                                      selects[j[1]]['column']))
                    else:
                        joins.append('%s.%s=%s.%s' %
                                     (_from['name'],
                                      selects[j[0]]['column'],
                                      self.document['from'][0]['name'],
                                      selects[j[1]]['column']))

        print "LOOK FOR JOIN"
        print selects
        print _from['name']
        print tables_in_query
        if selects[_from['select'][0]['name']]['table'] not in tables_in_query:
            tables_in_query.add(selects[_from['select'][0]['name']]['table'])
            print "WE HAVE JOIN"
            join_clause += 'JOIN %s ON %s\n' % \
                           (selects[_from['select'][0]['name']]['table'],
                            ' AND '.join(joins))
            if join_clause.replace(" ","").replace("\n","").replace(",", "").endswith("ON"):
                raise ValueError("No common columns for all the datasets. They cannot be combined.")

        all_joins_for_check.append(joins_for_check)
    print "Joins to check"
    print all_joins_for_check
    if not is_same_range_joins(all_joins_for_check):
        print "Datasets have columns in common but actually nothing to join (ranges with nothing in common)"
        raise ValueError("Datasets do not match both in space and time. They cannot be combined.")
    print "Query Continues"

    # where
    return all_joins_for_check, join_clause

def build_where_clause(self):
    filters = self.document.get('filters', '')
    if not filters:
        where_clause = ''
    else:
        where_clause = self.process_filters(filters)

    if where_clause:
        where_clause = 'WHERE ' + where_clause + ' \n'
    return where_clause

def process_prejoin_filters(filters_json, self, view_name):
    if type(filters_json) in [int, float]:
        try:
            filters = process_prejoin_leaf_filters(filters_json, self, view_name)
        except:
            return filters_json
        return filters
    if type(filters_json) in [str, unicode]:
        try:
            filters = process_prejoin_leaf_filters(filters_json, self, view_name)
        except:
            return filters_json
        return "%s" % filters
    _a = process_prejoin_filters(filters_json['a'], self, view_name)
    _b = process_prejoin_filters(filters_json['b'], self, view_name)
    result = '%s %s %s' % \
             (('(%s)' % _a) if type(_a) not in [str, unicode, int, float] else _a,
              Query.operator_to_str(filters_json['op']),
              ('(%s)' % _b) if type(_b) not in [str, unicode, int, float] else _b)
    return result

def process_prejoin_leaf_filters(filters, self, view_name):
    col_name = ''
    from_order = int(filters[filters.find('i') + 1:filters.find('_')])
    if from_order >= 0:
        for x in self.document['from'][from_order]['select']:
            if x['name'] == filters:
                if x['type'] != 'VALUE':
                    col_name = Dimension.objects.get(pk=x['type']).data_column_name
                else:
                    v_obj = Variable.objects.get(pk=int(self.document['from'][from_order]['type']))
                    if v_obj.dataset.stored_at == 'UBITECH_POSTGRES':
                        col_name = v_obj.name
                    else:
                        col_name = 'value'
        filters = view_name + '.' + col_name
    return filters

def build_prejoin_where_clause(self, view_name):
    filters = self.document.get('filters', '')
    if not filters:
        where_clause = ''
    else:
        where_clause = process_prejoin_filters(filters, self, view_name)

    if where_clause:
        where_clause = 'WHERE ' + where_clause + ' \n'
    return where_clause

def build_group_by_clause(groups):
    group_clause = ''
    if groups:
        group_clause = 'GROUP BY %s\n' % ','.join(groups)
    return group_clause

def build_order_by_clause(self):
    order_by_clause = ''
    orderings = self.document.get('orderings', [])
    if orderings:
        order_by_clause = 'ORDER BY %s\n' % ','.join([(o['name'] + ' ' + o['type']) for o in orderings])
    return order_by_clause

def build_limit_clause(self):
    limit_clause = ''
    limit = None
    if 'limit' in self.document and self.document['limit']:
        limit = int(self.document['limit'])
        limit_clause = 'LIMIT %d\n' % limit
    return limit, limit_clause

def build_offset_clause(self):
    offset_clause = ''
    offset = 0
    if 'offset' in self.document and self.document['offset']:
        offset = int(self.document['offset'])
        offset_clause = 'OFFSET %d\n' % offset
    return offset, offset_clause

def fix_date_trunc(q, subquery, subquery_cnt):
    if len(re.findall(r'date_trunc_(.*?)', subquery)) > 0:
        print 'Trying to fix date_trunc'
        time_trunc = str(subquery.split('date_trunc_')[1].split('(')[0])
        # print
        names = re.findall(r"date_trunc_" + time_trunc + "\((.*?)\)", subquery)
        for name in names:
            subquery = re.sub(r"date_trunc_" + time_trunc + "\((" + name + ")\)",
                              "date_trunc('" + time_trunc + "', " + name + ")", subquery)
        # print subquery

        names = re.findall(r"date_trunc_" + time_trunc + "\((.*?)\)", subquery_cnt)
        for name in names:
            subquery_cnt = re.sub(r"date_trunc_" + time_trunc + "\((" + name + ")\)",
                                  "date_trunc('" + time_trunc + "', " + name + ")", subquery_cnt)
        # print subquery_cnt

        names = re.findall(r"date_trunc_" + time_trunc + "\((.*?)\)", q)
        for name in names:
            q = re.sub(r"date_trunc_" + time_trunc + "\((" + name + ")\)",
                       "date_trunc('" + time_trunc + "', " + name + ")", q)
        # print q
    return q

def fix_round(q, subquery, subquery_cnt):
    if len(re.findall(r'round\d', subquery)) > 0:
        print 'Trying to fix round'
        # round_num = str(subquery.split('round')[1][0])
        round_num = str(re.findall(r'round\d', subquery)[0])[-1]
        print round_num
        # names = re.findall(r"round" + round_num + "\((.*?)\)", subquery)
        # print
        names = re.findall(r"round" + round_num + "\((.*?)\)", subquery)
        for name in names:
            subquery = re.sub(r"round" + round_num + "\((" + name + ")\)",
                              "round(" + name + "::NUMERIC, " + round_num + ")::DOUBLE PRECISION", subquery)
        # print subquery

        names = re.findall(r"round" + round_num + "\((.*?)\)", subquery_cnt)
        for name in names:
            subquery_cnt = re.sub(r"round" + round_num + "\((" + name + ")\)",
                                  "round(" + name + "::NUMERIC, " + round_num + ")::DOUBLE PRECISION", subquery_cnt)
        # print subquery_cnt

        names = re.findall(r"round" + round_num + "\((.*?)\)", q)
        for name in names:
            q = re.sub(r"round" + round_num + "\((" + name + ")\)",
                       "round(" + name + "::NUMERIC, " + round_num + ")::DOUBLE PRECISION", q)
        # print q
    return q, subquery, subquery_cnt

def extract_variable_ids_from_doc(from_list):
    variable_list = []
    for _from in from_list:
        variable_list.append(_from['type'])

    return variable_list[0], variable_list[1]

def extract_dataset_id_from_varible_ids(variable_id):
    query = """SELECT dataset_id
              FROM aggregator_variable
              WHERE id =%s """ % variable_id
    cursor = connections['default'].cursor()
    try:
        cursor.execute(query)
    except ProgrammingError as e:
        print "query execution failed due to: ", e
        return None
    res = cursor.fetchone()
    return res[0]

def is_same_range_joins(join_list):
    join_chain_list = create_join_chain_list_from_joins(join_list)
    min_max_list = calculate_range_for_every_join_chain(join_chain_list)
    return is_valid_range_all_chains(min_max_list)

def create_join_chain_list_from_joins(join_list):
    all_joins_list, chained_dimensions, join_chain_list, list_accessed_counter = init_variables(join_list)
    for join in all_joins_list:
        if not (chained_dimensions.__contains__(join[0]) and chained_dimensions.__contains__(join[1])):
            chain_list = update_chain_join_list(join)
            update_chained_dimensions(chained_dimensions, join)
            add_joins_to_chain_if_exist(all_joins_list, chain_list, chained_dimensions, list_accessed_counter)
            join_chain_list.append(chain_list)
            list_accessed_counter += 1
    return join_chain_list

def calculate_range_for_every_join_chain(join_chain_list):
    min_max_dim_chain_list = []
    for join_chain in join_chain_list:
        min_max_dim_list = []

        for dim in join_chain:
            min_dim, max_dim = get_min_max_dimension(dim)
            min_max_dim_list.append((min_dim, max_dim))

        min_max_dim_chain_list.append(min_max_dim_list)
    # print(min_max_dim_chain_list)
    return min_max_dim_chain_list

def is_valid_range_all_chains(min_max_chain_list):
    for chain in min_max_chain_list:
        if not is_valid_range_for_chain(chain):
            return False
    return True

def init_variables(join_list):
    join_chain_list = []
    chained_dimensions = []
    all_joins_list = extract_all_joins_from_join_list(join_list)
    list_accessed_counter = 0
    return all_joins_list, chained_dimensions, join_chain_list, list_accessed_counter

def update_chain_join_list(join):
    chain_list = [join[0], join[1]]
    return chain_list

def update_chained_dimensions(chained_dimensions, join):
    chained_dimensions.append(join[0])
    chained_dimensions.append(join[1])

def add_joins_to_chain_if_exist(all_joins_list, chain_list, chained_dimensions, list_accessed_counter):
    list_size = len(all_joins_list)
    for join2 in all_joins_list[list_accessed_counter:list_size]:
        add_join_if_valid(chain_list, chained_dimensions, join2)

def get_min_max_dimension(dim):
    # cursor = connections['default'].cursor()
    # min_max_dim_query = build_min_max_dimension_query(dim)
    # try:
    #     cursor.execute(min_max_dim_query)
    # except ProgrammingError as e:
    #     print "query execution failed due to: ", e
    #     return None
    # res = cursor.fetchone()
    res = None
    try:
        min = Variable.objects.get(pk=int(dim[0])).dimensions.get(name=dim[1]).min
        max = Variable.objects.get(pk=int(dim[0])).dimensions.get(name=dim[1]).max
        if min is not None and max is not None:
            res = (min, max)
    except:
        pass
    if res is not None:
        return res[0], res[1]
    else:
        return (-1 * sys.maxint), sys.maxint

def build_min_max_dimension_query(dim):
    min_max_dim_query = """
                SELECT
                    min,
                    max
                FROM aggregator_dimension d
                INNER JOIN aggregator_variable v
                ON d.variable_id = v.id
                WHERE d.title = '%s' AND variable_id = %s
            """ % (dim[1], dim[0])
    return min_max_dim_query

def is_valid_range_for_chain(chain):
    max_of_mins, min_of_maxes = initialize_minofmaxes_and_maxofmins(chain)
    if min_of_maxes is None or max_of_mins is None:
        return True

    for dim in chain:
        if dim[0] is not None and dim[0] > max_of_mins:
            max_of_mins = dim[0]
        if dim[1] is not None and dim[1] < min_of_maxes:
            min_of_maxes = dim[1]
    if min_of_maxes < max_of_mins:
        return False
    return True

def add_join_if_valid(chain_list, chained_dimensions, join2):
    if join2[0] in chain_list and join2[1] not in chain_list:
        chain_list.append(join2[1])
        chained_dimensions.append(join2[1])
    elif join2[1] in chain_list and join2[0] not in chain_list:
        chain_list.append(join2[0])
        chained_dimensions.append(join2[0])

def extract_all_joins_from_join_list(join_list):
    all_joins_list = []
    for lists in join_list:
        all_joins_list += lists
    return all_joins_list

def initialize_minofmaxes_and_maxofmins(chain):
    first_dim = next(iter(chain), None)
    max_of_mins = first_dim[0]
    min_of_maxes = first_dim[1]

    chain_size = len(chain)
    cnt = 0
    while (min_of_maxes is None or max_of_mins is None) and cnt < chain_size:
        first_dim = next(iter(chain), None)
        max_of_mins = first_dim[0]
        min_of_maxes = first_dim[1]
        cnt += 1

    return max_of_mins, min_of_maxes

redpajama_set_name: RedPajamaGithub


Polaris Festival is an electronic winter festival in the Swiss Alps this December. Held in Verbier's ski resort, famed for its off-piste slopes, the festival will see Luciano, Richie Hawtin and Dixon top a bill of house and techno across three days of indoor and outdoor parties.
With the festival's main stage located directly on the slopes, Polaris combines pioneering music with panoramic views of the mountains in what has to be one of Europe's most unique party locations. And by capping the capacity at 1,000, it makes sure this remains a truly intimate affair.
Alongside the music, the festival also throws up a variety of other activities, and has been known to host a sledge race between the artists playing, with the winning DJ invited back to play next year. Now that's something you wont see everyday.
Although Polaris' main stage only runs until 10pm each night, the party carries on till 4am in the local clubs and bars for those hard-edged ravers keen to keep it going till sunrise.
Verbier is a village and ski-resort in south-western Switzerland, sitting in the canton of Valais. The Swiss Alps resort has built a renowned reputation as one of the best off-piste resorts in the world.
The festival's main stage sits directly on the ski slopes, making for an even more awe-inspiring experience.
How do I get to Verbier?
Geneva, Milano (Malpensa) and Zurich airports are the closest from Polaris. From either you can reach the festival by train or by renting a car.
If you are travelling by train, the nearest station is Le Châble, where you can catch the ski lift up to Verbier. The use of the ski lift is included in your festival ticket.
Similarly if you are driving, there is free, 24 hour parking in Le Châble, where you can again catch the ski lift to Verbier.


Two of the most important metrics for any on-call team are Incident Volume and Mean Time to Repair (MTTR). Tracking how many incidents are coming into your system – and from which services – helps you identify both systemic infrastructure issues, and also misconfigured monitoring tools. Whether it's a problem with the core system or just a monitoring threshold that needs adjusting, if you're seeing dozens of incidents a day, there's something there to fix!
Tracking MTTR helps show you how quickly your team is resolving issues. While incidents are always going to vary some in complexity, by looking at high-level trends in MTTR over time and across different escalation policies or services, you can start to identify opportunities to improve the way your team solves problems. Is one escalation policy consistently solving things faster than others? Maybe they've built more reliability into their system, or maybe they're collaborating over HipChat or storing incident runbooks in the 'notes' field for each PagerDuty incident. Tracking MTTR outliers can help managers identify best practices as well as places to help struggling teams.
You can currently see some incident data in the PagerDuty "Reports" tab, but I wanted to build some additional reporting features to help us track down which services and escalation policies had unusually high (or low) incident volumes and MTTR.
You can filter by date, escalation policy, assignee and service. You can also click into any data point to see details about the related incidents!
To start building your own reports, we've put together a quick guide to help you through the process. First, set up an account in Zoho Reports. You can get basic reporting with a free account. Paid versions are available, which add additional data allocations as well as private, shareable dashboards.
Choose "JSON" as the type, "Web" as the source, and enter the string "https://<your_subdomain>.pagerduty.com/api/v1/incidents" into the URL field. This calls the PagerDuty API for a list of incidents (more information).
You should then see something like this– a table of all your incidents. If you'd like to clean it up a little (and didn't pick and choose columns on import), click the button on the right to adjust which columns show, and in what order.
Select "incidents.id" as the column to match on, to make sure we don't import duplicates. Then add "&offset=100" to the URL (you shouldn't have to change anything else).
Click "Create" and you should have 100 more rows in your table!
If you want to import a lot of historical data, you'll need to go through this process once per hundred records, setting offset to 200 the next time, then 300, and so on. If you have a large amount of data to import, you may want to call the API directly from the command line and use a script to dump the info to CSV.
You may see some information pre-filled here– if not, fill out the rest. For URL, make sure to use the URL without an offset parameter (ie "https://<subdomain>.pagerduty.com/api/v1/incidents").
Click "Execute" and you should see a new table appear below. This table is the one we'll be doing our graphing from.
NOTE: You may be tempted to graph some metrics from your original table, and some from the query table. This will work, but doing everything from the query table enables some extra functionality I'll explain later.
Let's make a graph that shows incident numbers by service over time. Whether it's an infrastructure problem or just misconfigured monitoring thresholds, high incident volume is a sign that there's something to go fix.
By clicking the different services on the right, you can control which services show. You can also use the "Filters" tab to include or exclude certain services (such as low-severity or test services).
Now you can filter the list of graphed services by escalation policy! This is a big help for team leads who only want to see the services they are responsible for.
Go ahead and save your report, and give it a descriptive name.
Now let's graph time-to-resolve, to show us how quickly our team is fixing problems. Make a new chart and put created_date on the x-axis, resolve mins on the y-axis, and escalation policy as "color." I also like to add incident_id(count) to the tooltip box, so that mousing over a certain day will show me how many incidents there were as well.
Click "generate graph," play around with the various filters, and make sure you're happy. Then save this report.
From the left sidebar, drag in your two reports. You'll see that the user filters from both reports are automatically added to the top! You can also add any other user filters you would like, and they will affect both of the reports on the dashboard.
You'll be given links or embed code that you can use to share your graph around your organization (we embed ours in our Confluence wiki). Note that on the free Zoho plan, you'll need to be logged in to view the dashboard, but paid plans offer public embeds as well.
We hope you enjoy! Thanks again to Outbrain for the tip.


"I am committed to a return to standards of excellence in the visual arts, and to exposing the destructive hoax of modernism which has taken control of our culture's museums, institutions of higher learning, and journalistic criticism. I want to offer opposing views and make it clear that modern art is a dead end. If everything is art then nothing is art. Their work amounts to art about art, whereas all of the great art from history has been art about life".
Click here to read the ARC Philosophy by ARC Chairman, Fred Ross.


Milo Medin has been part of the Internet development community for more than 25 years. He is currently the vice president of access services at Alphabet, where he oversees the company's Gigabit Fiber to the Home project and other efforts to improve access to the Internet. Prior to joining Google in 2010, he was founder and CTO of M2Z Networks, a company that sought to deploy a national broadband wireless network system that will expand consumer network access by providing nationwide portable broadband service that was also to help bridge the digital divide. He was co-founder and the Chief Technology Officer of Excite@Home, where he led the development of the company's national infrastructure, and helped deliver the first large scale residential broadband access service in partnership with major cable operators. Earlier, Milo worked at NASA's Ames Research Center, where he managed the primary west coast interconnect for the Internet, and architected and managed the global NASA Science Internet. Before NASA, while enrolled at UC Berkeley, he worked at the Lawrence Livermore National Laboratory, programming high performance computers in support of various Defense Programs.
Milo studied computer science at UC Berkeley. He has participated in a number of public policy forums, including two National Academy of Sciences panels and a variety of TechNet initiatives, and given testimony in Congress and before the Federal Communications Commission on Broadband technology policy. He has received two patents in the field of network access technology.
Bringing abundance to every aspect of the telecommunications and communications industries so that nothing stands in the way of innovation.


Monday night my husband and I did something we've never done: we took our three kids to the movies on a whim. Yes, on a school night.
I knew my husband and my 12-year-old son had been waiting for a long time to see the movie, so it wasn't like I had to twist their arms. Even my daughters – age 14 and 6 – were more than happy to get out of the house for a weekday movie night out.
I think all three kids were also pretty surprised because, in our household, we don't even let our children watch TV during the week – let alone go see movies.
But once homework was all done, we headed out for a 6 pm show at a local AMC movie theater, the kind that has those fancy, big seats and a dine-in theater option.
We all loved The Avengers, and it was such a blast doing something out of our normal routine. And needless to say, not having to cook and clean up after a hard day of work was a nice way to end the evening.
We knew it would be a splurge. But later, it really dawned on my husband and I exactly how expensive it is to enjoy a simple pleasure like eating out and seeing a movie.
For our family of five, we wound up spending $144. In my book, that amounts to 144 reasons why dine-in theaters probably won't become a routine thing for us.
But having dropped that much cash also made me thrilled to see a recent list of suggestions from consumer and money-saving expert Andrea Woroch.
The automobile club offers $8 tickets to Regal, United Artists and Edwards movie theaters. The catch is that you have to go to one of their offices to buy them.
This is the way to go for families. You can buy a four-pack of tickets from Costco, good for a variety of theatres, for just $34.99 and a 10-pack for $82.99. There's no expiration date and you can use the tickets seven days a week. BulkTix.com also saves you an average of $2 to $3 off a ticket's face value for seven different chains.
There are several chains that show movies a bit past their prime. If you can wait to see the latest iteration of a Marvel comic, you'll pay anywhere from $3 to $6 for the same movie.
If you're 60 or over, you'll get a discount from select locations of AMC Theatres. And Cinemark offers Seniors Day every Monday at some locations for seniors 62 and older. Ultimately, it helps to ask the cashier or one of the theatre managers about available discounts for seniors. Just be prepared to show your ID.
Eat before you head out to the movies so you won't be tempted by the many treats on offer. Granted this is how theaters make their money, but it's also how you double the cost of your ticket.
Save 10 to 30 percent by purchasing discount movie theater gift cards from such sites as GiftCardGranny. In addition to saving instantly on ticket prices, you can cut the cost of concessions if the smell of popcorn is too tempting to overcome.
Credit card companies and banks have increased their reward perks over the last few years and some of those include free passes to the theater. Visa Signature offers their credit card holders two-for-one movie tickets via Fandango on Fridays. Deutsche Bank Debit Card users can get one free pass for every one ticket purchased through BookMyShow.com. Ask your credit card or bank about such reward perks and take advantage of the discount.
Kerasotes Theaters has the FiveBuckClub, which sends weekly emails with a list of movies members can see for $5. AMC Theatres offers points toward discounts, concession upgrades and more if you join their Stubs Rewards Program. Check with your local theatres to see if they provide similar deals for loyal customers.
Though daily deals for restaurants and spa services overwhelm your inbox, you have good reason to search through the clutter. Sites like Groupon and LivingSocial have featured movie theater savings of up to 50 percent, and will likely offer similar promotions this summer. The vouchers typically expire within a couple months so make note of the date and use them up before then.
Matinees can save you anywhere from 30 to 50 percent off prime-time ticket prices, leaving more money in your wallet for warm summer evenings.
Have you ever watched a movie where the sound system was off enough to drive you crazy? Perhaps you ended up surrounded by a swarm of teenagers who shouted at the screen throughout the film. Don't be afraid to ask for a voucher or your money back if you have a bad experience. You may be surprised how often theaters will accommodate a polite request.
With a slew of Hollywood blockbusters and independent films all about to debut this summer, these tips can definitely save you big bucks if you like to visit movie theaters.
And based on my personal movie-going experience this week, I could have benefited from using a few of Woroch's tips as well!
Woroch's advice is a reminder to us – myself included – that even when we choose to splurge, you can still be smart about it and keep your budget intact.


text:
Q: How to configure auto-scaling with Bamboo Agents? We are able to launch new Bamboo agents and register them with the Bamboo server by using AWS auto scaling groups and using the user data, but scaling down is an issue.
A Bamboo agent is like a Jenkins slave. How can we automatically scale the bamboo agents cluster down e.g. from 12 to 8 nodes without killing current builds/jobs on the Bamboo agents?

A: Bamboo has "Elastic bamboo" which takes care of bringing up new agents and taking them now as required.
You can configure "elastic bamboo" from the bamboo server, in the admin section.

redpajama_set_name: RedPajamaStackExchange


text:
Q: Difference in maven webapp project creation using NetBeans and CLI I recently noticed that NetBeans creates a Maven webapp project structure differently than Maven command-line interface.
Maven Command-line interface:
mvn archetype:generate -DgroupId=com.test.mavenwebapp -DartifactId=climvnproj -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

Project Structure Created through command-line interface:
climvnproj
----pom.xml
----src/main/resources
----src/main/webapp

Project Structure Created through NetBeans IDE:
mavenwebproject1
----pom.xml
----src/main/java
----src/main/webapp

After examining the logs in NetBeans I can see that the NetBeans used following archetypeId
-DarchetypeArtifactId=webapp-javaee6

Shouldn't NetBeans IDE and CLI have consistent output?

A: netbeans is not using the maven-archetype-webapp archetype but a set of archetypes maintained by netbeans devs at org.codehaus.mojo.archetypes:webapp-* always one selected by the javaee version selected by the user. Same applies to ejb/ear archetypes.
That's because the default archetype is fairly ancient and not optimized for javaee5+


Join us for Regional Connections and get connected with Members from other Chambers! Regional Connections is presented by State Bank of the Lakes, a Wintrust community bank. This multi-chamber networking event is designed to connect people from around our region and is beneficial to everyone doing business between Milwaukee and Chicago, and for those who would like to!
Registration and open networking start at 11:00am, Lunch at 11:30am, followed by speed networking. Afterwards, there will be time to chat and make appointments with your new connections. Make sure to bring a lot of business cards!
Chambers from NE Illinois and SE Wisconsin are invited to participate. Current participating Chambers include: Antioch, Kenosha Area, Lake County, North Chicago, Racine (RAMAC), Round Lake Area, Union Grove Area, and Waterford.


Here's a Groovy addition to your 1960s, Swingin' pad!
I ALSO HAVE THIS WONDERFUL PATTERN IN BLUE AND ALSO IN GREEN COLORWAYS!!
Perfectly sized pillow cover shown stuffed with a 12" x 18" Lumbar pillow insert and an 18" X 18" pillow insert, for pleasing plumpness! Listing is for one pillow cover only. CHOOSE YOUR SIZE AND QUANTITY FROM DROP-DOWN MENUS!
Lined for Durability and Strength!
THIS LISTING IS FOR ONE PILLOW COVER ONLY - You may stuff it with your own, purchased pillow form.


The story began with Deng Fan Xing, a lady in her twenties, who took a flight to the romantic city, Paris. Deng Fan Xing was an affectionate lady with delicate thoughts and was very passive when facing matters concerning love. Since high school, she had many pursuers. However, her heart was firmly occupied by a man and there was no room for others. After going through so many experiences, she still thought that he was the best. However, she could not figure out his thought towards her. Their relationship was in between friendship and love, sometimes lucid but sometimes obscure.
Through the years, they missed several opportunities to become lovers due to various factors. Time passed but Fan Xing still could not forget him. Therefore, she decided to start a journey, searching for the answer that remained unsolved for many years… In the form of ten letters, combining several famous tourist spots in Paris, the author skillfully revealed the protagonist's deepest feelings in between the lines.
The book taught us to be courageous for love, to grasp our desired happiness and to live life with no regrets.


text:
Home plate tectonics Continents Ancient rocks of Tetons formed by continental collisions
Ancient rocks of Tetons formed by continental collisions
Rolling Thunder Mountain near Talus Lake is part of the Teton Range. The orange rock in the foreground is Webb Canyon gneiss, granite formed by decompression melting more than 2.6 billion years ago. Credit: Carol Frost
University of Wyoming scientists have found evidence of continental collisions in Wyoming's Teton Range, similar to those in the Himalayas, dating to as early as 2.68 billion years ago.
The research, published Jan. 22 in the journal Geochimica et Cosmochimica Acta, shows that plate tectonics were operating in what is now western Wyoming long before the collisions that created the Himalayas starting 40 million years ago.
In fact, the remnants of tectonic activity in old rocks exposed in the Tetons point to the world's earliest known continent-continent collision, says Professor Carol Frost of UW's Department of Geology and Geophysics, lead author of the paper.
"While the Himalayas are the prime example of continent-continent collisions that take place due to plate tectonic motion today, our work suggests plate tectonics operated far, far back into the geologic past," Frost says.
The paper's co-authors include fellow UW Department of Geology and Geophysics faculty members Susan Swapp and Ron Frost.
The researchers reached their conclusions by analyzing ancient, exposed granite in the northern Teton Range and comparing it to similar rock in the Himalayas. The rocks were formed from magma produced by what is known as decompression melting, a process that commonly occurs when two continental tectonic plates collide. The dramatically thickened crust extends under gravitational forces, and melting results when deeper crust rises closer to the surface.
While the Tetons are a relatively young mountain range, formed by an uplift along the Teton Fault less than 9 million years ago, the rocks exposed there are some of the oldest found in North America.
Recommended For You Flipped from Head to Toe: 100 Years of Continental Drift Theory
The UW scientists found that the mechanisms that formed the granites of the Tetons and the Himalayas are comparable, but that there are significant differences between the rocks of the two regions. That is due to differences in the composition of the continental crust in Wyoming 2.68 billion years ago compared to crustal plates observed today. Specifically, the ancient crust that melted in the Tetons contained less potassium than the more recently melted crust found in the Himalayas.
The research was supported by the National Science Foundation.
Carol D. Frost et al, Leucogranites of the Teton Range, Wyoming: A record of Archean collisional orogeny, Geochimica et Cosmochimica Acta (2015). DOI: 10.1016/j.gca.2015.12.015
Note: The above post is reprinted from materials provided by University of Wyoming.
Crushed resistance: Tectonic plate sinking into a subduction zone
Fate of sinking tectonic plates is revealed
Sea levels influence eruptions on volcanic island
Supervolcano fed from Earth's mantle caused crustal plates to rotate
Earth's oldest minerals date onset of plate tectonics to 3.6 billion years ago
A climate signal in the global distribution of copper deposits
Large theropod teeth found from the Upper Cretaceous of Jiangxi, Southern...
Kleinite
Stable gas hydrates can trigger landslides
'Firefall' phenomenon wows visitors to Yosemite's El Capitan
From finding Nemo to minerals: What riches lie in the deep...

redpajama_set_name: RedPajamaCommonCrawl


Can You Wash a Rawhide Bone?
A rawhide bone can be easily washed.
Constructed from the inner layer of livestock hides, rawhide bones can help alleviate your dog's need to chew. Rawhide bones become soft and gummy when your dog chews on it, allowing dirt and other debris to stick to it. A simple washing can remedy the situation, preventing your dog from ingesting the grime.
Simply run your rawhide bone under a faucet or hose and scrub the dirty area with a soft-bristled scrub brush until all dirt particles are removed. Do not soak the rawhide, or the entire bone will become gummy and begin to dissolve, creating a choking hazard for your dog. Do not use soap or detergent on the bone, as a film can remain that will make your dog sick. Shake excess water from the bone, blot with a towel and allow to air dry.
Web MD: Rawhide -- Good or Bad for Your Dog?


In a shocking revelation, New Idea claims that Cassandra Thorburn, the ex-wife of Today show host Karl Stefanovic allegedly called police during his sudden commitment ceremony to Jasmine Yarbrough earlier this month.
It's claimed that Thorburn's call was prompted by 'concern for their children', River and Ava, who were with Karl on a designated weekend when he exchanged vows with Jasmine.
Photos from the extravagant event show River and Ava were not in attendance but were present for the celebrations afterwards.
Woman's Day claim Karl's youngest children were confused and upset after finding out about the commitment ceremony only three hours beforehand.
Karl and Cassandra's eldest child Jackson did not attend and sadly it's understood he is currently estranged from his father.
Karl and Jasmine exchanged vows at a Palm Beach mansion witnessed by just a handful of family and friends, including Karl's brother Peter Stefanovic and his wife Sylvia Jeffreys.
Karl announced his split from Cassandra in September 2016 after 21 years of marriage.


Attack ads on Medicare have begun popping up on radio in key congressional districts. And before the next election is in the books, people in both parties predict that many more voters will see exchange of fire over the Republican plan to revamp the health care program for seniors.
This week, two Democratic groups launched radio ads and phone calls in the districts of more than 25 House Republicans. A GOP-leaning group, 60 Plus, responded with its own campaign of radio ads, direct mail and phone calls in most of the same districts.


In one of Hanoi's most luxurious hotels, customers are learning about wildlife protection at every turn. With standees featuring bear protection messages displayed throughout the hotel, Daewoo Hotel staff are helping to raise awareness of this critical issue. After successfully hosting Vietnam Bear Day on May 7, many hotel staff and customers have signed commitments not to use products from bears or other wildlife.
ENV is extremely grateful for Daewoo Hotel's wholehearted support of our Bear Protection Campaign.


text:
using System.Collections.Generic;
using FairyGUI.Utils;

namespace FairyGUI
{
    /// <summary>
    /// Gear is a connection between object and controller.
    /// </summary>
    public class GearText : GearBase
    {
        Dictionary<string, string> _storage;
        string _default;

        public GearText(GObject owner)
            : base(owner)
        {
        }

        protected override void Init()
        {
            _default = _owner.text;
            _storage = new Dictionary<string, string>();
        }

        override protected void AddStatus(string pageId, ByteBuffer buffer)
        {
            if (pageId == null)
                _default = buffer.ReadS();
            else
                _storage[pageId] = buffer.ReadS();
        }

        override public void Apply()
        {
            _owner._gearLocked = true;

            string cv;
            if (!_storage.TryGetValue(_controller.selectedPageId, out cv))
                cv = _default;

            _owner.text = cv;

            _owner._gearLocked = false;
        }

        override public void UpdateState()
        {
            _storage[_controller.selectedPageId] = _owner.text;
        }
    }
}


text:
/*
 * Licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
 * See https://github.com/openiddict/openiddict-core for more information concerning
 * the license and the contributors participating to this project.
 */

using System;
using System.Diagnostics;
using System.Threading.Tasks;
using AspNet.Security.OpenIdConnect.Extensions;
using AspNet.Security.OpenIdConnect.Server;
using JetBrains.Annotations;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;

namespace OpenIddict {
    public partial class OpenIddictProvider<TUser, TApplication> : OpenIdConnectServerProvider where TUser : class where TApplication : class {
        public override async Task ValidateIntrospectionRequest([NotNull] ValidateIntrospectionRequestContext context) {
            var services = context.HttpContext.RequestServices.GetRequiredService<OpenIddictServices<TUser, TApplication>>();

            // Note: ASOS supports both GET and POST introspection requests but OpenIddict only accepts POST requests.
            if (!string.Equals(context.HttpContext.Request.Method, "POST", StringComparison.OrdinalIgnoreCase)) {
                context.Reject(
                    error: OpenIdConnectConstants.Errors.InvalidRequest,
                    description: "Introspection requests must use HTTP POST.");

                return;
            }

            // Note: ASOS supports unauthenticated introspection requests but OpenIddict uses
            // a stricter policy preventing unauthenticated/public applications from using
            // the introspection endpoint, as required by the specifications.
            // See https://tools.ietf.org/html/rfc7662 for more information.
            if (string.IsNullOrEmpty(context.ClientId) || string.IsNullOrEmpty(context.ClientSecret)) {
                context.Reject(
                    error: OpenIdConnectConstants.Errors.InvalidRequest,
                    description: "Clients must be authenticated to use the introspection endpoint.");

                return;
            }

            // Retrieve the application details corresponding to the requested client_id.
            var application = await services.Applications.FindApplicationByIdAsync(context.ClientId);
            if (application == null) {
                context.Reject(
                    error: OpenIdConnectConstants.Errors.InvalidClient,
                    description: "Application not found in the database: ensure that your client_id is correct.");

                return;
            }

            // Reject non-confidential applications.
            if (await services.Applications.IsPublicApplicationAsync(application)) {
                context.Reject(
                    error: OpenIdConnectConstants.Errors.InvalidClient,
                    description: "Public applications are not allowed to use the introspection endpoint.");

                return;
            }

            // Validate the client credentials.
            if (!await services.Applications.ValidateSecretAsync(application, context.ClientSecret)) {
                context.Reject(
                    error: OpenIdConnectConstants.Errors.InvalidClient,
                    description: "Invalid credentials: ensure that you specified a correct client_secret.");

                return;
            }

            context.Validate();
        }

        public override async Task HandleIntrospectionRequest([NotNull] HandleIntrospectionRequestContext context) {
            var services = context.HttpContext.RequestServices.GetRequiredService<OpenIddictServices<TUser, TApplication>>();
            var options = context.HttpContext.RequestServices.GetRequiredService<IOptions<IdentityOptions>>();

            // If the user manager doesn't support security
            // stamps, skip the additional validation logic.
            if (!services.Users.SupportsUserSecurityStamp) {
                return;
            }

            var principal = context.Ticket?.Principal;
            Debug.Assert(principal != null);

            var user = await services.Users.GetUserAsync(principal);
            if (user == null) {
                context.Active = false;

                return;
            }

            var identifier = principal.GetClaim(options.Value.ClaimsIdentity.SecurityStampClaimType);
            if (!string.IsNullOrEmpty(identifier) &&
                !string.Equals(identifier, await services.Users.GetSecurityStampAsync(user), StringComparison.Ordinal)) {
                context.Active = false;

                return;
            }
        }
    }
}


text:
Prestige launches mobile servicing for fleets
Prestige Fleet Servicing has launched a mobile servicing solution to help fleets cut vehicle downtime.
Prestige's Joe Bhamra says the new mobile service will help fleets with emergency and other time-limited incidents
Already trialled with a number of fleets, the new solution is being offered alongside the mobile solutions that many of Prestige's service network centres currently offer and is being provided by a number of separate specialists with a network of mobile operatives throughout the UK.
"While our static network continues to grow in line with our expansion plans, we also wanted to be able to offer our fleet customers a mobile solution on a national level, coordinated through our operations centre in Melton Mowbray," said commercial director, Joe Bhamra.
"We see real benefits for our fleet customers in being able to provide them with a multi-layered SMR solution and to be able to cope with emergency and other time-limited incidents, often in remote areas of the country," he said.
Bhamra added that service and maintenance controllers at the company's operations centre would be able to make the decision whether a company driver required a mobile service or if the work could be handled routinely within one of the network's service centres.
This would be based on the nature of the work involved, its complexity and the amount of time required to get the vehicle back on the road. For many of Prestige's customers, particularly those with commercial vehicle fleets, reducing vehicle downtime is of paramount importance to improve productivity and profitability.
"We hear many other mobile operators say they can carry out all levels of work at the roadside. But careful consideration needs to be made when booking mobile jobs with regard to local authority regulations, and the nature and scope of work that can be carried out in a legal and an environmentally harmless way," he explained.
Bhamra added that the service is essentially aimed at light commercial fleets, but will also be relevant to company cars as well.
"We will rely on the expertise and professionalism of our controllers to determine which is the best course of action for the work involved – static or mobile," he added.
Prestige Fleet Servicing
Previous: HMRC urged not to ignore eco benefits of salary sacrifice
Next: Effective profiling will slash driver training costs, says E-Training World


text:
Q: Why tempdata attribute retain after first read? It spose that tempdata read once and disposed and that was ok before using it as attribute now when using it like attribute it retain to next request after read for first time
here is my sample code
Page A
public class AModel : PageModel
    {
        [TempData]
        public string Message { get; set; }
        public void OnGet()
        {
            Message = "test Page A";
        }
    }

A

@Model.Message

Page B

Page B
    public class BModel : PageModel
{
    [TempData]
    public string Message { get; set; }

    public void OnGet()
    {
    }
}

B

@Model.Message

Page A

when navigating from page A to page b it should not showing the message from page A but i got the message appear in page B the result look like that
B
test Page A
Page A

A:
when navigating from page A to page b it should not showing the message from page A

If you do a test with following code, you would easily find that the code snippet @Model.Message in A.cshtml does not read TempData value.

A

using TempData["Message"]:
@TempData["Message"]

using Model.Message:
@Model.Message

using TempData.Peek("Message"):
@TempData.Peek("Message")

using Model.Message:
@Model.Message

Page B

The output of above testing

And as mentoned about TempData in this doc:
This property stores data until it's read in another request.


Buy a Perseverance Fortitude calligraphy wall scroll here!
Some people may refer to this entry as Perseverance Fortitude Kanji, Perseverance Fortitude Characters, Perseverance Fortitude in Mandarin Chinese, Perseverance Fortitude Characters, Perseverance Fortitude in Chinese Writing, Perseverance Fortitude in Japanese Writing, Perseverance Fortitude in Asian Writing, Perseverance Fortitude Ideograms, Chinese Perseverance Fortitude symbols, Perseverance Fortitude Hieroglyphics, Perseverance Fortitude Glyphs, Perseverance Fortitude in Chinese Letters, Perseverance Fortitude Hanzi, Perseverance Fortitude in Japanese Kanji, Perseverance Fortitude Pictograms, Perseverance Fortitude in the Chinese Written-Language, or Perseverance Fortitude in the Japanese Written-Language.
1 people have searched for Perseverance Fortitude in Chinese or Japanese in the past year.


text:
Q: adjust window level in dicom file using vtk I am trying to change image window width and level.
I understood that I need to create vtkWindowLevelLookupTable.
and attach it to mapper. like described here.
I don't understand where this mapper comes from and what is it's input connection.
my code:
 _reader2 = vtkDICOMImageReader.New();
            _reader2.SetDirectoryName(path);
            _reader2.Update();

            // Visualize
            _ImageViewer2 = vtkImageViewer2.New();
            _ImageViewer2.SetInputConnection(_reader2.GetOutputPort());

            var image = _ImageViewer2.GetInput();

            // get range of slices (min is the first index, max is the last index)

            _ImageViewer2.GetSliceRange(ref _MinSlice2, ref _MaxSlice2);

            this.vScrollBar2.Maximum = _MaxSlice2 + 1 + vScrollBar2.LargeChange - 1;
            Debug.WriteLine("slices range from : " + _MinSlice2.ToString() + " to " + _MaxSlice2.ToString());

            vtkRenderWindow renderWindow = renderWindowControl2.RenderWindow;

            _interactorStyle2 = vtkInteractorStyleImage.New();
            _interactorStyle2.MouseWheelForwardEvt += new vtkObject.vtkObjectEventHandler(interactor_MouseWheelForwardEvt2);
            _interactorStyle2.MouseWheelBackwardEvt += new vtkObject.vtkObjectEventHandler(interactor_MouseWheelBackwardEvt2);

            renderWindow.GetInteractor().LeftButtonPressEvt += new vtkObject.vtkObjectEventHandler(renderWindowControl2_Click);

            renderWindow.GetInteractor().SetInteractorStyle(_interactorStyle2);
            renderWindow.GetRenderers().InitTraversal();
            vtkRenderer ren;
            while ((ren = renderWindow.GetRenderers().GetNextItem()) != null)
                ren.SetBackground(0.0, 0.0, 0.0);

            _ImageViewer2.SetRenderWindow(renderWindow);
            _ImageViewer2.GetRenderer().AddActor2D(sliceStatusActor);
            _ImageViewer2.GetRenderer().AddActor2D(usageTextActor);
            _ImageViewer2.SetSlice(_MinSlice2);

            // Compute a simple window/level based on scalar range
            vtkWindowLevelLookupTable wlLut = new vtkWindowLevelLookupTable();
            double range = _reader2.GetOutput().GetScalarRange()[1] - _reader2.GetOutput().GetScalarRange()[0];
            double level = (_reader2.GetOutput().GetScalarRange()[1] +
                            _reader2.GetOutput().GetScalarRange()[0]) / 2.0;
            wlLut.SetWindow(1000);
            wlLut.SetLevel(-1000);

            // Create a mapper and actor.
            vtkDataSetMapper mapper = new vtkDataSetMapper();
            mapper.SetInputConnection(_reader2.GetOutputPort());
            mapper.SetLookupTable(wlLut);
           // mapper.SetScalarRange(0, 255);

            vtkActor actor = new vtkActor();

            var actors = _ImageViewer2.GetRenderer().GetActors();
            actor.SetMapper(mapper);

            // Add the actors to the scene
            _ImageViewer2.GetRenderer().AddActor(actor);
            _ImageViewer2.Render();

A: The vtkImageViewer2 has the Window/Level functionality already implemented.
You can access it like:

myImageViewer2.GetWindowLevel().SetWindow(1000);
myImageViewer2.GetWindowLevel().SetLevel(-1000);


text: Q: Is there a way to integrate One drive for business and Outlook so that I can just point and click within Outlook? I want to integrate One Drive for Business within Outlook. Is there an add-on for Outlook, maybe? Let me know please.


text:
Shinya Sato (født 13. november 1978) er en tidligere japansk fodboldspiller.

Han har spillet for flere forskellige klubber i sin karriere, herunder Giravanz Kitakyushu.

Eksterne henvisninger

Fodboldspillere fra Japan

redpajama_set_name: RedPajamaWikipedia


text:
Home » » JO alleges EC yet to finalise elected reps to LG bodies
JO alleges EC yet to finalise elected reps to LG bodies
Sisira
By Maheesha Mudugamuwa
The Joint Opposition (JO) yesterday alleged that the Election Commission was planning to appoint representatives in contravention of the newly introduced Local Government Authorities Elections (Amendment) Act No. 16 of 2017.
JO member and MP Sisira Jayakody lashed out at EC Chairman, claiming that even though he had boasted of an efficient electoral system, the commission couldn't even finalise the appointment of representative to the local government (LG) institutions without an inordinate delay.
Under the constitutional provisions, laws couldn't be introduced retrospectively.
Jayakody said the JO would take legal action against the process that had been adopted as it violated the fundamental rights of representatives who had won at the recently concluded LG election.
Secretary to the Provincial Councils and Local Government Ministry Kamal Pathmasiri said the representative to LG institutions should be appointed before March 06, 2018 following a gazette notification published by the Minister of Provincial Councils and Local Government.
Explaining the process of the appointment of Chairman/Mayor, Pathmasiri said the selection should be made by the secretary of the respective political party which had 50 percent of seats or the appointment could be made at the first sitting which should be chaired by the Local Government Commissioner of the respective province.
In addition, according to the act, there was no room for crossovers, Secretary Pathmasiri said.
Commenting on the women representatives, the Secretary said it had been decided to proceed with the present Act without amending its provisions. Therefore, at a meeting held between the leaders of all political parties it had been decided that if there were issues in relation to women representation, steps would be taken according to court decisions.


text:
Community Connections Advocates for Increased State Funding to Support People with Disabilities
Meets with Cape Cod and Plymouth Legislators in Collaboration with Cape Cod Disabilities Network
SOUTH YARMOUTH, MA, April 6, 2022 – Community Connections Inc., a nonprofit serving people with disabilities throughout Southeastern Massachusetts and Cape Cod, advocated for increased funding to support people with intellectual and developmental disabilities during a virtual meeting with Cape Cod and Plymouth legislators on April 1.
Community Connections is a member of The Cape Cod Disabilities Network, one of several coalitions, such as The Arc and The Collaborative, that are working to spotlight the issues that matter most to the people they serve: individuals with acquired brain injuries and individuals with intellectual and developmental disabilities, including autism.
The Commonwealth of Massachusetts contracts with community-based organizations to provide services and supports to people with disabilities. While this work endured during the pandemic, it continues now at only a 50%-80% capacity statewide. The inability to attract and retain direct care staff is a contributing factor to this reduced capacity. As a result, 7,000 citizens across Massachusetts are still not getting the safety net services that they received prior to the pandemic, putting a strain on family members who must stay home to care for loved ones.
During the virtual meeting, Jack Kelly talked about his son, Drew, who attends the day habilitation program at Community Connections in Yarmouth and lives in a group home operated by Latham Centers. Jack is concerned about the wage gap for direct care workers and its impact on his son now and in the future.
"What does this crisis mean for Drew? It means possibly he won't have a place to live," says Jack Kelly. "What does this crisis mean for my wife and me? It means that Drew, after all these years at Latham, could be back at home. My wife and I are in our seventies. We are also extremely concerned about Drew's care once we are gone."
Prior to the COVID-19 pandemic, the human services field already had a direct care workforce shortage due to the lack of a livable wage. Human services organizations must compete with the retail and hospitality industries where employees are paid a higher hourly wage for a job that does not have the same impact as services for people with disabilities.
Jean Boyle also addressed legislators in the virtual meeting about the need to increase wages for direct care staff. Jean spoke about her daughter, Judy, who has attended the day habilitation program at Community Connections in Mashpee, but cannot return to the program yet because of the shortage of direct care staff.
"Judy misses her friends. Her day program is her life and recently she told me that she feels as though she does not have a life right now. Judy feels hopeless and all our lives need hope," says Jean Boyle. "These employees at Community Connections care for Judy with such kindness, efficiency, and concern. But mostly, they are providing her with a life of friends and activities instead of isolation and misery."
In alliance with direct care providers across the state, Community Connections is advocating for the following increases in the Massachusetts Fiscal Year 2023 budget:
An additional $350 million to increase direct care salaries (approval moves essential staff into the $20 per hour range and above)
$51 million for day habilitation and employment services to reflect 85% occupancy in these programs
$9 million in transportation to ensure individuals are able to attend day habilitation programs
"There is a real human impact to the budget and policy decisions made by Massachusetts legislators which affects the people we serve and their families," said David Botting, President and CEO, Community Connections Inc. "Appropriate funding for safety net services must do more than restore services to pre-pandemic levels; funding must be increased to sustain the delivery of these services in the future."
About The Cape Cod Disabilities Network
The Cape Cod Disabilities Network (CCDN) was established in 1996 and is comprised of nonprofit organizations on Cape Cod that provide services and supports for people with disabilities. The CCDN leverages its resources for collaboration on advocacy, fundraising, and training.
Since 1985, Community Connections has been providing life-enriching services that promote optimal independence for people with disabilities throughout Southeastern Massachusetts and Cape Cod. We serve over 800 individuals with on-site and remote services, employment supports, and supported living services to provide a lasting impact in their relationships and in their lives. Our commitment is further strengthened through our affiliation with The Arc, an organization that focuses on providing education and advocacy for the people we serve and their families. The Arc is active in providing guidance and helping to set local, state and national public policies affecting those we serve and their families.


text:
Cruel attack on vulnerable man investigated by Surrey Police
Editorial Team — January 19, 2016 comments off
A VULNERABLE man was slapped, spat at and robbed in a shocking assault in Woking town centre.
Surrey Police officers are appealing for witnesses to the appalling scenes which unfolded in Peacocks Shopping Centre on 11 January.
It is reported that the victim, who is in his 20s, was approached by two men in Poundworld between late morning and midday as he shopped.
He was slapped to the forehead before having his wallet taken and being spat at.
The wallet – a Newcastle Football Club product – contained a small amount of cash and a bus pass.
It is believed that the suspects had spoken to the victim in the shopping centre prior to the robbery taking place.
Detective Constable Neil Winter from West Surrey CID said: "This was a cruel and upsetting crime committed against a vulnerable young man.
"If you were in the vicinity of Peacocks Shopping Centre and witnessed anything that happened before, during or after the offence then please get in touch.
"You might have a snippet of detail that could help us locate the offenders and bring them to justice."
If you can help shed light on the incident then contact Surrey Police on 101, quoting crime reference 45160002950.
The force's online reporting system can be found by searching my.surrey.police.uk.
Alternatively, the independent charity Crimestoppers can be contacted anonymously and free on 0800 555 111.


Inspiration can come from anything really, but I do love painters like Edward Robert Huges,Jean-Honroe Fragonard, John William Waterhouse. I love going out experiencing and seeing new things, like going to exhibitions that might have nothing to do with photography or just going to a random location just to expand my horizons.
Beauty has always been my main focus. I believe that everyone has a beautiful side and even if in reality it may fade away, in photos it never will; but it isn't always the conventional stuff we see in magazines. It can be quirky and dark sometimes and that's what I've tried to show in my latest "Welcome to my nightmare" series.
I'm 26 years old, I currently live in London and I'm in my final year of University and my current job is photographer. Sometimes I do a bit of printing and graphic design if I need to but mainly photographer.
Funnily enough I don't actually have other hobbies apart from photography, it takes up all my time really. I do like reading, going for walks in nature, weekend long parties and daydreaming, just to get away from my screen every once in a while.


text:
Call of Duty: Advanced Warfare Revives the Series [review]
by Puching Zhang
Written by Puching Zhang
Call of Duty: Advanced Warfare has a compelling campaign, futuristic weapons and that old spark. Puching Zhang reviews.
aNewDomain — The Atlas bots are coming! Throw a grenade! But wait, I have a belt-full: smart, EMP and threat. Which one? They're coming — whatever — throw throw throw!
Hello, Puching Zhang here, reviewing "Call of Duty: Advanced Warfare," the latest in everyone's favorite series and everyone's favorite company, Activision. Yes, that's sarcasm — the Call of Duty series has fallen from grace since its completion of the Modern Warfare series and release of "Black Ops II." While I did enjoy "Black Ops II" and the cool campaign it had, "Call of Duty: Ghosts" had a disappointing, shallow campaign and a highly repetitive multiplayer mode.
But I have great news! Activision has redeemed itself with a new developer, Sledgehammer Games, in this edition of the "Call of Duty" franchise. "Call of Duty: Advanced Warfare" is a solid FPS. Let's dive in.
All That Future Warfare
"Call of Duty: Advanced" Warfare takes place at a later point in time than any other game in the franchise. Because of this, the player has access to more futuristic weapons than any other "Call of Duty" game. "Black Ops II" debuted the drone, which makes an awesome return in "Advanced Warfare," and there are a handful of entirely new weapons, like the multi-purpose grenade.
Instead of having a regular frag grenade, or one frag and an EMP, players have multi-purpose grenades that really allow you to customize gameplay. For example, if you're being fired at and can't find your enemies, throwing a threat grenade will reveal where they are. Smart grenades work just like regular grenades, except they home in on their targets like a pocket homing missile, and EMP grenades disable electrical machines, like those pesky drones.
Call of Duty is known for its campaigns. Yes, multiplayer is important, but if that's all you care about buy a Battlefield game: it can have up to 32 players on a single side. I was disappointed (as were many) with Activision for the lackluster campaign in "Ghosts" — it was confusing and felt cliché, with the troops storming over the entire globe despite the fact that the U.S. is overrun by enemies and likely does not have the will or funding to launch expeditions into Antarctica. (If you just said, "Uh, what?" check out the "Ghosts" storyline here.)
"Advanced Warfare" has a much tighter and realistic storyline. Instead of the usual formula — a protagonist nation or task force fights against an antagonistic nation (usually Russia for non-World War II games in the series) — Advanced Warfare pits the conflict between a corporation, Atlas, and a terrorist organization called the KVA. Of course, for those of you who saw the trailers, Atlas later turns out to be the antagonistic faction in the story, when a twist in the … I commit myself to spoiler free reviews, alright?
No major spoiler here.
With that said, the storyline is genuinely well done. There is ample plot development, the missions build on one another and through small subtleties you can see the moral compass of the company (Atlas) begin to weaken.
The cutscenes were some of the best I've ever seen, with movie-like quality effects and good storytelling. The protagonist was as an actual character who interacted within the cutscenes, instead of the filler guy who just moves the story along. "Advanced Warfare" also includes a better antagonist than its predecessors.
The main antagonist of the game, Jonathan Irons, is originally a supporting character before the unspecified plot twist around mid-game. What makes Irons different is that he's a benign corporate leader who initially looks like an idealist trying to solve the world's problems, instead of a madman who kills supporting characters in the game. Irons gives the plot a nice twist with the classic "evil has a good face" trope.
All these factors contribute to a nicely conceived storyline and overall campaign by Sledgehammer Games, reviving the faith of fans in the series from the tragedy that was "Call of Duty: Ghosts."
Graphics and Multiplayer
The graphics in this game are up to their usual Call of Duty standard, but the inclusion of cinematic cutscenes make the effects even better than previous games. "Advanced Warfare" also included a lot of cool futuristic mechanics, such as jet packs, lasers and exo suits, which gives the game a new setting and a fresh feel.
This new setting improves the multiplayer greatly — the exo suit adds a unique element to the multiplayer mode, and reminds me of the greatness of "Black Ops II." The new technologies make veteran players change strategies within the new setting, as well as include some cool new customization options that were lacking in "Ghosts."
Overall, I would say "Call of Duty: Advanced Warfare" gets an 8/10. It's a good game that contains a well-scripted single player campaign. There are epic graphics, a futuristic setting and a revitalized multiplayer that has the flow and fun of games like "Titanfall."
While a lot of the elements are fairly original, it does harken back to "Call of Duty: Black Ops II," and the futuristic setting isn't that much of a surprise. That said, I highly recommend buying this game, as Activision is back on track with the series we all know and love.
Until next time, this is Puching Zhang signing off for aNewDomain.
All image credits: Screenshots courtesy of Activision
NFL Quarterbacks: How All 32 Stack up Now
NBA Finals 2015: Warriors Will Party Like It's 1975
Docker Swarm: Why Reports of Its Death Are Greatly Exaggerated
Wes Anderson's Isle of Dogs: Gorgeous, Sentimental and Just Plain Weird
In Our Corner of the World: Gorgeous Anime, Unforgettable Messaging
A Wrinkle in Time: Emotional, Evocative and Totally Unexpected
Annihilation: What If Alien Intelligences Are Experimenting With Our DNA?
Oscars 2018: How To Win Your Oscar Pool This Year
Lady Bird Revisited: Now You Know Why It Sucks So Bad
And the Five Best Erotica Movies to Watch on Valentine's Day Are ..
Technology Isn't The Only Thing Teachers Need To Worry About …
Steven Spielberg's The Post: A Nixon-Era Salvo for The Trump Age
American Made: Director Doug Liman and Tom Cruise Are Great Together
Doctor Who Time Vortex 360: An Awesome Gift for Time Lords


Sometimes we discover great, almost totally forgotten humorists here in The Basement. We have found some of the funny stories of Prentice Mulford. Mulford is much more well known today as the founder of the New Thought Movement, but from the 1860s until 1891, he made his living writing wildly popular humorous stories.
You can join us on Twitter as well — just follow misterron, and we'll follow you back.


High quality LED light pods from BlackOakLED. Find the best and brightest LED Pod Lights for your truck, jeep, atv, boat, and other vehicles.
If you want the perfect combination of portability and blinding brightness, then check out our selection of LED light pods. These lights are small enough to fit anywhere you want to put them and are still able to light up the road with all the luminosity of a full sized light bar. Before you choose a light bar, be sure and give these durable, compact LED PODs for trucks a look.
Sometimes, you simply don't have the room or the budget for a fullsized LED light bar. Thankfully, there exists an option that is the perfect solution to this problem.
By choosing from this selection of LED PODs for trucks and other vehicles, you are guaranteed to get all of the strength and brightness of a full sized light bar in a much more compact, affordable package.
Since these LED pod lights are so compact, they are a great choice for people looking for a quality lights that are small enough to serve as ATV LED light bars and motorcycle LED light bars. Also, light pods are a popular choice for people needing marine LED light bars that are small enough to mount on their boat.
Speaking of mounting these lights, the entire process is usually quicker and simpler than it is with a full sized LED light bar, allowing you to outfit your vehicle with a bright, powerful light with mere minutes of labor.
Don't let these size of these light lead you to believe they aren't as strong as a typical light bar. If anything, many of them are even stronger, and all of the LED PODs for trucks that we stock at BlackOakLED are proven to be the toughest, most durable lights made today.
Along with being durable, these light pods are outfitted with the same, blisteringly bright LEDs that you will find in the best full sized light bars, giving them an enormous amount of lighting power considering their compact size. Even if you do have the budget and room for a full sized light bar, be sure and carefully consider these impressive little lights.
Adding a couple of light pods along with a full sized light bar makes for a beautiful and effective combination of lights.
Whether you are using these lights as a backup to your full sized light or you need a light small enough to mount on your ATV, motorcycle, or boat, these LED light pods are an incredibly popular choice for motorists across the country.


WritingsGuru com is yet another newcomer to academic writing industry that somehow managed to gain a significant popularity quickly. So, what do we know about this paper writing service exactly? Is this company legit? Should you trust them with your grade and money? Before we get down to the actual WritingsGuru review, let's throw in some general info first!
WritingsGuru is a UK-based paper writing service that provides help with all types of academic assignments, from homework and essays to dissertations. Moreover, WritingsGuru writers also provide help with editing, rewriting or proofreading of the finished works, business papers, reports, and resumes. It seems the website offers quite a wide range of services! The main feature of WritingsGuru com though is that you can check writer's full profiles before choosing them. And it's not just a name with a random picture from the Internet, you can check their personal rating, statistics of previous orders and customer feedbacks. Moreover, you can chat with the writer and evaluate their skill before you make the final decision. It's quite disappointing that we rarely see services that implement such a system – it looks very customer-friendly. But what else WritingsGuru has to offer? Let's find out in this WritingsGuru review!
It seems that paper writing service has more than affordable prices. For instance, a High-School level essay with a deadline in 14 days will cost you only $11 per page. And a Ph.D. level assignment with a 24-hour deadline costs $47 per page, which is still pretty affordable. But let's also check out some extra features WritingsGuru com is offering! First of all, you can hire a Writing Guru Editor to edit and proofread your work for 15% of the initial price. You can also choose an Advanced Writer instead of the standard one for another 25% of the price. The website claims that Advanced WritingsGuru writers have degrees and years of experience in your chosen academic field. And lastly, for only $10 more you can get digital copies of the sources WritingsGuru writers used for your paper.
If the end price looks a bit too expensive for you, don't worry. We've read more than one essay service review about the discounts the service provides. Sadly, it seems those only apply to returning customers, so no first-time coupons for you here. Well, on the bright side, almost every WritingsGuru review we've encountered notes that you don't really need their additional services. So, if you are strapped for money, standard writers will do just as well.
WritingsGuru com states they only hire native English speakers, so all the essay service writers are from the US and UK. It looks like there is not a single WritingsGuru review that would prove this wrong. On the contrary, customers agree that most of the writers they encounter are ENL speakers indeed and deliver high-quality papers. But if you're cautious, that's okay too: just chat with the Writing Guru writer and evaluate their command of English! And while you're at it, you are free to check everything else about WritingsGuru writers too. You get to see their photos and areas of expertise, naturally, plus their statistics and overall writing. What's even more, along with customer testimonials and WritingsGuru reviews, you have access to preview versions of their previous papers. That's pretty neat, as you can see for yourself whether they really are as professional as they look.
As for the Writing Guru deadlines, they range between 24 hours and 14 days. If there is a WritingsGuru review about missed deadlines there somewhere, we couldn't find it. So far it seems that WritingsGuru writers are professional, efficient and punctual people.
The majority of essay service reviews we've seen both on their site and all over the web are complimentary. Most customers agree that the overall quality of papers is good, to say the least, and it gets only better when you choose an Advanced Writer. Still, most customers agree that you'll receive a good paper no matter the Writing Guru writer you choose. For this WritingsGuru review, we checked some previews of completed orders by random WritingsGuru writers, and those look good indeed. We've found no major issues, neither with content nor with the writing, and customers seem more than happy with them. We haven't seen a single WritingsGuru review about plagiarized papers either, so hopefully, all your works are 100% original. It seems the service does everything they can to make their customers happy, giving them all the choice and securing a great experience.
Well, it's time to sum up this WritingsGuru review. All in all, the service looks great! They have pretty affordable prices and high-quality papers that'll always be delivered on time. Writing Guru writers seem to be real professionals, and we'd gladly recommend such a service to anyone!


text:
Board Books (2)
English;Spanish (19)
Beach Lane Books (1)
Beacon Press (1)
Black Dog & Leventhal Publishers (1)
BookPal (1)
Rock, Rosetta, Rock! Roll, Rosetta, Roll!: Presenting Sister Rosetta Tharpe, the Godmother of Rock & Roll
The award-winning author and illustrator team of Tonya Bolden and R. Gregory Christie deliver an inspiring picture book biography on the life and impact of 20th century Blues and Gospel performer Sister Rosetta Tharpe who was a trailblazer for Rock &...
Akim Aliu: Dreamer (Original Graphic Memoir)
This honest, engrossing graphic memoir tells the story of professional athlete and activist Akim Aliu's incredible life as a hockey prodigy in Canada. Akim Aliu — also known as "Dreamer" — is a Ukrainian-Nigerian-Canadian professional hockey player...
Everyone has bad days, and children are no exception. When a black cloud descends on a little girl at school, support from a classmate with a great deal of imagination helps to brighten up everyone's lives. Everyone has bad days, and children are no...
Around the World on 80 Horses
What is a Zonkey? Why do some horses have feathers? How can a horse sleep standing up? Which horse dances to the beat of the tom toms? Who was the eight -headed horse of Indian folklore? Come on a journey around the world and meet 80 unique breeds of...
Tree Whispers
Mandy Ross has been listening closely to the trees, from the willow to the eucalyptus, and the sycamore to the oak. These fascinating poems, beautifully illustrated by Juliana Oakley, imagine the songs they are singing to us and the verses they speak...
For the Love of Lettuce
Two caterpillars approach life in very different ways. Zip likes to plan, but doesn't like change, while Parsley is happy to live in the moment. How will they cope in the face of sudden and unexpected change? This hilarious adventure is a lively...
Lovely Day (Picture Book Based on the Song by Bill Withers)
Bill Withers's celebrated hit song "Lovely Day" comes to life in this beautifully illustrated picture book! "'Lovely Day' is a positive and uplifting song that comforts the soul. I'm thrilled to see my husband's beautiful words come to life in this...
We Are Here (an All Because You Matter Book)
An empowering follow-up to New York Times bestselling picture book All Because You Matter that celebrates the rich history of Black and brown men and women throughout history with soaring language and stunning illustration. Lyrical, affirmational, and...
Bea En El Mar/Bea by the Sea 8x8 Edition (Child's Play Mini-Library)
Bilingual edition. Bea lives by the beach, but she doesn't like sand one little bit! One day, her mother persuades her to visit the beach, where she meets a sand sculpture of a lion who is afraid of water. A funny and tender book about the mutual support...
Nieve En La Jungla/Snow in the Jungle (Child's Play Library) (Paperback)
When Snow's mother tells her that they're going to move to an exciting new place, Snow isn't so sure. She likes her home and her friends. The journey takes forever, and their new home is very strange. Everything is different – the weather, the food, the...
Mejores Amigos, Contigo Y Conmigo/Best Friends, Busy Friends 8x8 Edition (Child's Play Mini-Library)
Bilingual edition. This read-aloud storybook celebrates all types of friendship - at home, at school, and at play. Friends who share in the fun of everyday life, and who are there when we need them. With rhyming text, lively illustrations, and an...
Long Live the Pumpkin Queen: Tim Burton's the Nightmare Before Christmas
**THE INSTANT #1 NEW YORK TIMES BESTSELLER** Read Sally's story in this young adult companion to Tim Burton's The Nightmare Before Christmas written by New York Times best-selling author Shea Ernshaw. Jack and Sally are "truly meant to be" .....


text:
Financials and Annual Reports
Engagement & Advocacy
AAFE in the News
AAFE Helps Make the Dream of Citizenship Come True in Jackson Heights and Throughout New York City
In the last days of 2018, we have been profiling some of the people helped by AAFE programs in the past year. Today we head to Jackson Heights, Queens to meet Sara Mencho Lopez (pictured with husband Joab Romero, her daughter Daritza and Jessica Salgado, a counselor in our Jackson Heights office That's Jessica on the left).
Sara came to this country about 11 years ago. Formerly from Guatemala, she was detained at the U.S. border at age 17. She and nine siblings were abandoned by their father. After working her way through numerous courts, she finally obtained residency. But Sara's ultimate goal was American citizenship. So about a year ago, she came to AAFE for help.
Every year, our Department of Justice-accredited counselors in Manhattan, Queens and Brooklyn help thousands of community members process naturalization applications, renew green cards and deal with other immigration issues. This work has become more difficult, but also more important than ever, given the political climate in Washington and the Trump administration's misguided anti-immigrant policies.
Sara heard about our services through MetroPlus Health Plan, a longtime community partner. She enrolled in our regular citizenship classes, learning about American government and history. Jessica provided her with packets of information, helping Sara prepare for the civics test administered by the U.S. Department of Citizenship and Immigration Services. After about 10 months, Sara became a U.S. citizen.
Asked how difficult the process was for her, Sara said, "It was easy because Jessica was there as a translator. She helped me a lot." Now she can focus on making a better life for her family. Sara is married with three children. When she first came to AAFE, she was a cashier, but was recently promoted to store manager.
Jessica, who lives in the area and grew up in the neighborhood, helped open our Jackson Heights office and has been an integral part of our expanded immigration services. While the office handles many types of issues, including housing rights cases, more than 30% of our clients in Jackson Heights seek help with an immigration problem.
Jessica spoke about her work, saying, "I feel really happy when I see a client's achievements. I feel really privileged. I was raised here, I went to elementary school and middle school in the neighborhood. To help in the community feels good. They (my clients) could be my parents or my uncles or cousins."
To learn more about our programs in Jackson Heights, call 718-316-9993. If you would like to help AAFE make an even bigger difference in 2019, we hope you will consider making a tax deductible donation today. You can contribute online by filling out the form below.
$10,327 of $50,000 raised
Plus an additional to cover gateway fees.
PreviousBay Area Delegation Joins AAFE For Chinatown Housing Tour
NextAAFE Accomplished a Lot in 2018. Help Us make an Even Bigger Impact in 2019
AAFE Announces 2018 Dream of Equality Award Recipients
Public Testimony: Government Support For Immigrant Small Business During COVID-19
AAFE and Council Member Koo Urge Full Census Participation During Flushing Outreach Event
AAFE Welcomes New NeighborWorks AmeriCorps VISTA Members
Renaissance Economic Development Corp.
Community Development Fund
Immigrant & Housing Services
Receive news from AAFE direct to your in-box.


text:
Forest City, NC - Furnace & Air Conditioning Service, Repair & Maintenance Contractor
Shelby Heating & Air Conditioning, Inc. is proud to serve the Forest City community!
We are proud to be part of this community, serving your heating and air conditioning needs. Whether you need repair, replacement or a new installation of a furnace, air conditioner, heat pump or air filtration system, we get the job right the first time. Our certified technicians service all furnace and air conditioning make and models.
Please call us today at 704-487-7877 to consult with our home comfort specialist.
We offer the following in Forest City, NC
New Air Conditioner Sales
High Efficiency Air Conditioner Upgrades
Air Conditioner Maintenance Contract
Ductless Mini-Split Air Conditioners
Single Room Air Conditioners
Wall Mount Air Conditioners
Air Conditioning Filters
Heat Recovery Ventilators
Ultraviolet (UV) Germicidal Lights
New Gas Furnace Sales
New Heat Pump Sales
New Boiler Sales
Boiler Parts
Heating Maintenance Contracts
Ductless Mini-Split Heat Pumps
Single Room Heating
Wall Mount Heat Pumps
About Forest City, NC - Happy to be your hometown Heating & Air Conditioning Contractor!
Originally known as Burnt Chimney, Forest City is a town located in North Carolina's Rutherford County. Approximately 7,500 people call Forest City home, and it serves as a commercial hub for the region. Forest City is located at the foothills of the Smoky and Blue Ridge Mountain, and it is found six miles east of Rutherfordton. The town is also easily accessible to other communities, as it is interconnected by three major US highways: 64, 74, and 221.
Forest City is a primarily residential town with commercial centers, but other attractions also exist. There are several museums found in town, including the Bennett Classical Auto Museum and the Rutherford County Farm Museum. The community is popular during the Christmas season, as the downtown area is lit up with over 500,000 lights, and residents can enjoy rides on a horse-drawn carriage. Downtown Forest City is also home to many dining opportunities, including Copper Penny Grill, Twisted Pear, and Moe's Original BBQ.
Forest City is found within a humid subtropical climate zone. Carolina blue skies are enjoyed throughout the year here, leading to especially warm weather during the summer. Average daily highs reach the upper 80s in July and August, but there is an average of 44 days in which thermostat readings surpass 90 degrees Fahrenheit. Central air conditioning systems or the cooling function of an electric heat pump will get significant use throughout the season.
Mild winters are one of the biggest perks of living in the South, and the same can be said for Forest City. Still, cold weather finds its way into the region a few times per year, leaving behind an average accumulation of six inches of snowfall. While daily highs reach about 50 degrees Fahrenheit, average lows fall to around 29 degrees, so it is important to have the right climate controls in the form of a gas or electric furnace at home.