text:
from __future__ import absolute_import, division, print_function

# Import standard modules
import copy
import numpy as np

# Import astronomical modules
from astropy.units import Unit, Magnitude
from astroquery.vizier import Vizier
from astroquery.simbad import Simbad
from astroquery.ned import Ned
import astroquery.exceptions
from astropy.coordinates import Angle
import astropy.units

# Import the relevant PTS classes and modules
from ...core.tools import tables
from ...core.tools.logging import log
from ..basics.skygeometry import SkyCoordinate
from . import regions
from ..basics.vector import Position
import pdb

# -----------------------------------------------------------------

def get_ngc_name(galaxy_name, delimiter=" "):

    """
    This function ...
    :param galaxy_name:
    :param delimiter:
    :return:
    """

    # The Simbad querying object
    simbad = Simbad()
    simbad.ROW_LIMIT = -1

    result = simbad.query_objectids(galaxy_name)
    for name in result["ID"]:

        if "NGC" in name:

            splitted = name.split("NGC")
            if splitted[0] == "":
                number = int(splitted[1])
                return "NGC" + delimiter + str(number)

    # If nothing is found, return None
    return None

# -----------------------------------------------------------------

def merge_stellar_catalogs(catalog_a, catalog_b):

    """
    This function ...
    :param catalog_a:
    :param catalog_b:
    :return:
    """

    # Create a copy of catalog a
    new_catalog = copy.deepcopy(catalog_a)

    # Keep track of which stars in catalog a have been encountered in catalog b (to avoid unnecessary checking)
    encountered = [False] * len(catalog_a)

    # Loop over the entries in catalog b
    for j in range(len(catalog_b)):

        # Loop over the entries in catalog a to find a match
        for i in range(len(catalog_a)):

            # Skip this entry (star) if it has already been matched with a star from the other catalog
            if encountered[i]: continue

            exact_catalog_match = catalog_a["Catalog"][i] == catalog_b["Catalog"][j] and catalog_a["Id"][i] == catalog_b["Id"][j]
            original_catalog_match = catalog_a["Original catalog and id"] == catalog_b["Original catalog and id"]

            # If star i in catalog a is the same as star j in catalog b, break the loop over catalog a's stars
            if exact_catalog_match or original_catalog_match:

                encountered[i] = True
                break

        # If a break is not encountered, a match is not found -> add the star from catalog b
        else:

            # Add the corresponding row
            new_catalog.add_row(catalog_b[j])

    # Return the new catalog
    return new_catalog

# -----------------------------------------------------------------

def merge_galactic_catalogs(catalog_a, catalog_b):

    """
    This function ...
    :param catalog_a:
    :param catalog_b:
    :return:
    """

    # Create a copy of catalog a
    new_catalog = copy.deepcopy(catalog_a)

    # Keep track of which galaxies in catalog a have been encountered in catalog b (to avoid unnecessary checking)
    encountered = [False] * len(catalog_a)

    # Loop over the entries in catalog b
    for j in range(len(catalog_b)):

        # Loop over the entries in catalog a to find a match
        for i in range(len(catalog_a)):

            # Skip this entry (galaxy) if it has already been matches with a galaxy from the other catalog
            if encountered[i]: continue

            # If galaxy i in catalog a is the same as galaxy j in catalog b, break the loop over catalog a's galaxies
            if catalog_a["Name"][i] == catalog_b["Name"][j]:

                encountered[i] = True
                break

        # If a break is not encountered, a match is not found -> add the galaxy from catalog b
        else:

            # Add the corresponding row
            new_catalog.add_row(catalog_b[j])

    # Return the new catalog
    return new_catalog

# -----------------------------------------------------------------

def from_stars(stars):

    """
    This function ...
    :param stars:
    :return:
    """

    # Initialize empty lists for the table columns
    catalog_column = []
    id_column = []
    ra_column = []
    dec_column = []
    ra_error_column = []
    dec_error_column = []
    on_galaxy_column = []
    confidence_level_column = []

    # Loop over all stars
    for star in stars:

        # Fill in the columns with the star properties
        catalog_column.append(star.catalog)
        id_column.append(star.id)
        ra_column.append(star.position.ra.value)
        dec_column.append(star.position.dec.value)
        ra_error_column.append(star.ra_error.value)
        dec_error_column.append(star.dec_error.value)
        on_galaxy_column.append(star.on_galaxy)
        confidence_level_column.append(star.confidence_level)

    # Create and return the table
    data = [catalog_column, id_column, ra_column, dec_column, ra_error_column, dec_error_column, confidence_level_column]
    names = ['Catalog', 'Id', 'Right ascension', 'Declination', 'Right ascension error', 'Declination error', 'Confidence level']

    # Create the catalog
    meta = {'name': 'stars'}
    catalog = tables.new(data, names, meta)

    # Set units
    catalog["Right ascension"].unit = "deg"
    catalog["Declination"].unit = "deg"
    catalog["Right ascension error"].unit = "mas"
    catalog["Declination error"].unit = "mas"

    # Return the catalog
    return catalog

# -----------------------------------------------------------------

def from_galaxies(galaxies):

    """
    This function ...
    :param galaxies:
    :return:
    """

    # Initialize empty lists for the table columns
    name_column = []
    ra_column = []
    dec_column = []
    redshift_column = []
    type_column = []
    alternative_names_column = []
    distance_column = []
    inclination_column = []
    d25_column = []
    major_column = []
    minor_column = []
    pa_column = []

    principal_column = []
    companions_column = []
    parent_column = []

    # Loop over all galaxies
    for galaxy in galaxies:

        # Fill in the columns with the galaxy properties
        pass

    # Create the data structure and names list
    data = [name_column, ra_column, dec_column, redshift_column, type_column, alternative_names_column, distance_column,
            inclination_column, d25_column, major_column, minor_column, pa_column, principal_column, companions_column,
            parent_column]
    names = ["Name", "Right ascension", "Declination", "Redshift", "Type", "Alternative names", "Distance",
             "Inclination", "D25", "Major axis length", "Minor axis length", "Position angle", "Principal",
             "Companion galaxies", "Parent galaxy"]
    meta = {'name': 'stars'}

    # Create the catalog table
    catalog = tables.new(data, names, meta)

    # Set the column units
    catalog["Distance"].unit = "Mpc"
    catalog["Inclination"].unit = "deg"
    catalog["D25"].unit = "arcmin"
    catalog["Major axis length"].unit = "arcmin"
    catalog["Minor axis length"].unit = "arcmin"
    catalog["Position angle"].unit = "deg"
    catalog["Right ascension"].unit = "deg"
    catalog["Declination"].unit = "deg"

    # Return the catalog
    return catalog

# -----------------------------------------------------------------

def create_star_catalog(frame, catalogs=None):

    """
    This function ...
    :return:
    """

    # Initialize empty lists for the table columns
    catalog_column = []
    id_column = []
    ra_column = []
    dec_column = []
    ra_error_column = []
    dec_error_column = []
    magnitude_columns = {}
    magnitude_error_columns = {}
    on_galaxy_column = []
    confidence_level_column = []

    # Get the range of right ascension and declination of this image
    center, ra_span, dec_span = frame.coordinate_range

    # Create a new Vizier object and set the row limit to -1 (unlimited)
    viz = Vizier(columns=['*','errMaj','errMin','errPA'], keywords=["stars", "optical"])
    viz.ROW_LIMIT = -1

    # Loop over the different catalogs
    for catalog in catalogs:

        # Initialize a list to specify which of the stars added to the columns from other catalogs is already
        # matched to a star of the current catalog
        encountered = [False] * len(catalog_column)

        # Inform the user
        log.debug("Querying the " + catalog + " catalog")

        # Query Vizier and obtain the resulting table
        result = viz.query_region(center.to_astropy(), width=ra_span, height=dec_span, catalog=catalog)
        table = result[0]

        number_of_stars = 0
        number_of_stars_in_frame = 0
        number_of_new_stars = 0

        magnitudes = {}
        magnitude_errors = {}

        # Get the magnitude in different bands
        for name in table.colnames:

            # If this column name does not end with "mag", skip it
            if not name.endswith("mag"): continue

            # If the column name contains more than one character before "mag", skip it
            if len(name.split("mag")[0]) > 1: continue

            # Get the name of the band
            band = name.split("mag")[0]

            # Create empty lists for the magnitudes and errors
            magnitudes[band] = []
            magnitude_errors[band] = []

        # Loop over all entries in the table
        for i in range(len(table)):

            # -- General information --

            # Get the ID of this star in the catalog
            if catalog == "UCAC4": star_id = table["UCAC4"][i]
            elif catalog == "NOMAD": star_id = table["NOMAD1"][i]
            elif catalog == "II/246": star_id = table["_2MASS"][i]
            else: raise ValueError("Catalogs other than 'UCAC4', 'NOMAD' or 'II/246' are currently not supported")

            # -- Positional information --

            # Get the position of the star as a SkyCoord object and as pixel coordinate
            if ('_RAJ2000' in table.colnames) and ('_DEJ2000' in table.colnames):
                ra_key, dec_key = '_RAJ2000', '_DEJ2000'
            elif ('RAJ2000' in table.colnames) and ('DEJ2000' in table.colnames):
                ra_key, dec_key = 'RAJ2000', 'DEJ2000'
            position = SkyCoordinate(ra=table[ra_key][i], dec=table[dec_key][i], unit="deg", frame="fk5")
            pixel_position = position.to_pixel(frame.wcs)

            # Get the right ascension and declination for the current star
            if ('_RAJ2000' in table.colnames) and ('_DEJ2000' in table.colnames):
                ra_key, dec_key = '_RAJ2000', '_DEJ2000'
            elif ('RAJ2000' in table.colnames) and ('DEJ2000' in table.colnames):
                ra_key, dec_key = 'RAJ2000', 'DEJ2000'
            star_ra = table[ra_key][i]
            star_dec = table[dec_key][i]

            number_of_stars += 1

            # If this star does not lie within the frame, skip it
            if not frame.contains(position): continue

            number_of_stars_in_frame += 1

            # Get the mean error on the right ascension and declination
            if catalog == "UCAC4" or catalog == "NOMAD":

                ra_error = table["e_RAJ2000"][i] * Unit("mas")
                dec_error = table["e_DEJ2000"][i] * Unit("mas")

            elif catalog == "II/246":
                error_maj = table["errMaj"][i] * Unit("arcsec")
                error_min = table["errMin"][i] * Unit("arcsec")
                error_theta = Angle(table["errPA"][i], "deg")

                # Temporary: use only the major axis error (convert the error ellipse into a circle)
                ra_error = error_maj.to("mas")
                dec_error = error_maj.to("mas")

            else: raise ValueError("Catalogs other than 'UCAC4', 'NOMAD' or 'II/246' are currently not supported")

            # -- Magnitudes --

            # Loop over the different bands for which a magnitude is defined
            for band in magnitudes:

                # Determine the column name
                column_name = band + "mag"

                value = table[column_name][i]

                if isinstance(value, np.ma.core.MaskedConstant):

                    magnitudes[band].append(None)
                    magnitude_errors[band].append(None)

                else:

                    # Add the magnitude value
                    magnitudes[band].append(Magnitude(value))

                    # Check for presence of error on magnitude
                    error_column_name = "e_" + column_name
                    if error_column_name in table.colnames:
                        error = table[error_column_name][i]
                        if isinstance(error, np.ma.core.MaskedConstant): magnitude_errors[band].append(None)
                        else: magnitude_errors[band].append(Magnitude(error))
                    else: magnitude_errors[band].append(None)

            # -- Cross-referencing with previous catalogs --

            # If there are already stars in the list, check for correspondences with the current stars
            for index in range(len(encountered)):

                # Skip stars that are already encountered as matches with the current catalog (we assume there can only
                # be one match of a star of one catalog with the star of another catalog, within the radius of 3 pixels)
                if encountered[index]: continue

                saved_star_position = SkyCoordinate(ra=ra_column[index], dec=dec_column[index], unit="deg", frame="fk5")
                saved_star_pixel_position = saved_star_position.to_pixel(frame.wcs)

                # Calculate the distance between the star already in the list and the new star
                difference = saved_star_pixel_position - pixel_position

                # Check whether the distance is less then 3 pixels
                if difference.norm < 3.0:

                    # Inform the user
                    log.debug("Star " + star_id + " could be identified with star " + id_column[index] + " from the " + catalog_column[index] + " catalog")

                    # Increment the confidence level for the 'saved' star
                    confidence_level_column[index] += 1

                    # Set the 'encountered' flag to True for the 'saved' star
                    encountered[index] = True

                    # Break, because the current star does not have to be saved again (it is already in the lists)
                    break

            # If no other stars are in the list yet or no corresponding star was found (no break was
            # encountered), just add all stars of the current catalog
            else:

                number_of_new_stars += 1

                # Inform the user
                #print("DEBUG: Adding star " + star_id + " at " + str(position.to_string("hmsdms")))

                # Fill in the column lists
                catalog_column.append(catalog)
                id_column.append(star_id)
                ra_column.append(star_ra)
                dec_column.append(star_dec)
                ra_error_column.append(ra_error.value)
                dec_error_column.append(dec_error.value)
                confidence_level_column.append(1)

        # Debug messages
        log.debug("Number of stars that were in the catalog: " + str(number_of_stars))
        log.debug("Number of stars that fell within the frame: " + str(number_of_stars_in_frame))
        log.debug("Number of stars that were only present in this catalog: " + str(number_of_new_stars))

    # Create and return the table
    data = [catalog_column, id_column, ra_column, dec_column, ra_error_column, dec_error_column, confidence_level_column]
    names = ['Catalog', 'Id', 'Right ascension', 'Declination', 'Right ascension error', 'Declination error', 'Confidence level']

    # TODO: add magnitudes to the table ?

    #magnitude_column_names = []
    #for band in magnitudes:

        # Values
        ##column = MaskedColumn(magnitudes[band], mask=[mag is None for mag in magnitudes[band]])
        ##data.append(column)
        #data.append(magnitudes[band])
        #column_name = band + " magnitude"
        #names.append(column_name)
        #magnitude_column_names.append(column_name)

        # Errors
        ##column = MaskedColumn(magnitude_errors[band], mask=[mag is None for mag in magnitude_errors[band]])
        ##data.append(column)
        #data.append(magnitude_errors[band])
        #column_name = band + " magnitude error"
        #names.append(column_name)
        #magnitude_column_names.append(column_name)

    # Create the catalog
    meta = {'name': 'stars'}
    catalog = tables.new(data, names, meta)

    # Set units
    catalog["Right ascension"].unit = "deg"
    catalog["Declination"].unit = "deg"
    catalog["Right ascension error"].unit = "mas"
    catalog["Declination error"].unit = "mas"
    #for name in magnitude_column_names:
    #    self.catalog[name].unit = "mag"

    # Return the catalog
    return catalog

# -----------------------------------------------------------------

def create_galaxy_catalog(frame):

    """
    This function ...
    :param frame:
    :return:
    """

    # Initialize empty lists for the table columns
    name_column = []
    ra_column = []
    dec_column = []
    redshift_column = []
    type_column = []
    alternative_names_column = []
    distance_column = []
    inclination_column = []
    d25_column = []
    major_column = []
    minor_column = []
    pa_column = []

    # Get the range of right ascension and declination of the image
    center, ra_span, dec_span = frame.coordinate_range

    # Find galaxies in the box defined by the center and RA/DEC ranges
    for name, position in galaxies_in_box(center, ra_span, dec_span):

        # Get galaxy information
        gal_name, position, gal_redshift, gal_type, gal_names, gal_distance, gal_inclination, gal_d25, gal_major, gal_minor, gal_pa = get_galaxy_info(name, position)

        # Calculate pixel position in the frame
        pixel_position = position.to_pixel(frame.wcs)

        # Check whether the pixel position falls within the frame
        if pixel_position.x < 0.0 or pixel_position.x >= frame.xsize: continue
        if pixel_position.y < 0.0 or pixel_position.y >= frame.ysize: continue

        # Fill the columns
        name_column.append(gal_name)
        ra_column.append(position.ra.value)
        dec_column.append(position.dec.value)
        redshift_column.append(gal_redshift)
        type_column.append(gal_type)
        alternative_names_column.append(", ".join(gal_names) if len(gal_names) > 0 else None)
        distance_column.append(gal_distance.value if gal_distance is not None else None)
        inclination_column.append(gal_inclination.degree if gal_inclination is not None else None)
        d25_column.append(gal_d25.value if gal_d25 is not None else None)
        major_column.append(gal_major.value if gal_major is not None else None)
        minor_column.append(gal_minor.value if gal_minor is not None else None)
        pa_column.append(gal_pa.degree if gal_pa is not None else None)

    # Determine the number of galaxies in the lists
    number_of_galaxies = len(name_column)

    # Indicate which galaxy is the principal galaxy
    principal_column = [False] * number_of_galaxies
    if number_of_galaxies > 0:
        principal_index = max(range(number_of_galaxies), key=lambda index: major_column[index])
        principal_column[principal_index] = True

    # Loop over the other galaxies, check if they are companion galaxies of the principal galax
    companions_list_list = [[] for _ in range(number_of_galaxies)]
    parent_column = [None for _ in range(number_of_galaxies)]
    for j in range(number_of_galaxies):

        # Skip the principal galaxy
        if j == principal_index: continue

        # By default, set the 'companion' flag to False
        companion = False

        # Set HII regions as companion galaxies
        if type_column[j] == "HII": companion = True

        # If the galaxies differ in name because of an 'a', 'b' at the end
        if name_column[j][:-1].lower() == name_column[principal_index][:-1].lower(): companion = True

        # If the current galaxy is a companion galaxy
        if companion:

            companions_list_list[principal_index].append(name_column[j])
            parent_column[j] = name_column[principal_index]

    companions_column = []
    for companion_list in companions_list_list:
        if len(companion_list) == 0: companions_column.append(None)
        else: companions_column.append(", ".join(companion_list))

    # Create the data structure and names list
    data = [name_column, ra_column, dec_column, redshift_column, type_column, alternative_names_column, distance_column,
            inclination_column, d25_column, major_column, minor_column, pa_column, principal_column, companions_column,
            parent_column]
    names = ["Name", "Right ascension", "Declination", "Redshift", "Type", "Alternative names", "Distance",
             "Inclination", "D25", "Major axis length", "Minor axis length", "Position angle", "Principal",
             "Companion galaxies", "Parent galaxy"]
    meta = {'name': 'stars'}

    # Create the catalog table
    catalog = tables.new(data, names, meta)

    # Set the column units
    catalog["Distance"].unit = "Mpc"
    catalog["Inclination"].unit = "deg"
    catalog["D25"].unit = "arcmin"
    catalog["Major axis length"].unit = "arcmin"
    catalog["Minor axis length"].unit = "arcmin"
    catalog["Position angle"].unit = "deg"
    catalog["Right ascension"].unit = "deg"
    catalog["Declination"].unit = "deg"

    # Return the catalog
    return catalog

# -----------------------------------------------------------------

def get_galaxy_info(name, position):

    """
    This function ...
    :param name:
    :param position:
    :return:
    """

    # Obtain more information about this galaxy
    try:

        ned_result = Ned.query_object(name)
        ned_entry = ned_result[0]

        # Get a more common name for this galaxy (sometimes, the name obtained from NED is one starting with 2MASX .., use the PGC name in this case)
        if ned_entry["Object Name"].startswith("2MASX "): gal_name = name
        else: gal_name = ned_entry["Object Name"]

        # Get the redshift
        gal_redshift = ned_entry["Redshift"]
        if isinstance(gal_redshift, np.ma.core.MaskedConstant): gal_redshift = None

        # Get the type (G=galaxy, HII ...)
        gal_type = ned_entry["Type"]
        if isinstance(gal_type, np.ma.core.MaskedConstant): gal_type = None

    except astroquery.exceptions.RemoteServiceError:

        # Set attributes
        gal_name = name
        gal_redshift = None
        gal_type = None

    except astroquery.exceptions.TimeoutError:

        # Set attributes
        gal_name = name
        gal_redshift = None
        gal_type = None

    except:

        # Set attributes
        gal_name = name
        gal_redshift = None
        gal_type = None

    # Create a new Vizier object and set the row limit to -1 (unlimited)
    viz = Vizier(keywords=["galaxies", "optical"])
    viz.ROW_LIMIT = -1

    # Query Vizier and obtain the resulting table
    result = viz.query_object(name.replace(" ", ""), catalog=["VII/237"])

    # Not found ... TODO: fix this ... this object was in the first query output
    if len(result) == 0: return name, position, None, None, [], None, None, None, None, None, None

    table = result[0]

    # Get the correct entry (sometimes, for example for mergers, querying with the name of one galaxy gives two hits! We have to obtain the right one each time!)
    if len(table) == 0: raise ValueError("The galaxy could not be found under this name")
    elif len(table) == 1: entry = table[0]
    else:

        entry = None

        # Some rows don't have names, if no match is found based on the name just take the row that has other names defined
        rows_with_names = []
        for row in table:
            if row["ANames"]: rows_with_names.append(row)

        # If only one row remains, take that one for the galaxy we are looking for
        if len(rows_with_names) == 1: entry = rows_with_names[0]

        # Else, loop over the rows where names are defined and look for a match
        else:
            for row in rows_with_names:

                names = row["ANames"]

                if name.replace(" ", "") in names or gal_name.replace(" ", "") in names:

                    entry = row
                    break

        # If no matches are found, look for the table entry for which the coordinate matches the given position (if any)
        if entry is None and position is not None:
            for row in table:
                if ('_RAJ2000' in row.colnames) and ('_DEJ2000' in row.colnames):
                    ra_key, dec_key = '_RAJ2000', '_DEJ2000'
                elif ('RAJ2000' in row.colnames) and ('DEJ2000' in row.colnames):
                    ra_key, dec_key = 'RAJ2000', 'DEJ2000'
                if np.isclose(astropy.coordinates.Angle(row[ra_key]+' hours').deg, position.ra.value) and np.isclose(astropy.coordinates.Angle(row[dec_key]+' degrees').deg, position.dec.value):
                    entry = row
                    break

    # Note: another temporary fix
    if entry is None: return name, position, None, None, [], None, None, None, None, None, None

    # Get the right ascension and the declination
    if ('_RAJ2000' in entry.colnames) and ('_DEJ2000' in entry.colnames):
        ra_key, dec_key = '_RAJ2000', '_DEJ2000'
    elif ('RAJ2000' in entry.colnames) and ('DEJ2000' in entry.colnames):
        ra_key, dec_key = 'RAJ2000', 'DEJ2000'
    position = SkyCoordinate(ra=entry[ra_key], dec=entry[dec_key], unit="deg", frame="fk5")

    # Get the names given to this galaxy
    gal_names = entry["ANames"].split() if entry["ANames"] else []

    # Get the size of the galaxy
    ratio = np.power(10.0, entry["logR25"]) if entry["logR25"] else None
    diameter = np.power(10.0, entry["logD25"]) * 0.1 * Unit("arcmin") if entry["logD25"] else None

    #print("  D25_diameter = ", diameter)

    radial_profiles_result = viz.query_object(name, catalog="J/ApJ/658/1006")

    if len(radial_profiles_result) > 0:

        radial_profiles_entry = radial_profiles_result[0][0]

        gal_distance = radial_profiles_entry["Dist"] * Unit("Mpc")
        gal_inclination = Angle(radial_profiles_entry["i"], "deg")
        gal_d25 = radial_profiles_entry["D25"] * Unit("arcmin")

    else:

        gal_distance = None
        gal_inclination = None
        gal_d25 = None

    # Get the size of major and minor axes
    gal_major = diameter
    gal_minor = diameter / ratio if diameter is not None and ratio is not None else None

    # Get the position angle of the galaxy
    gal_pa = Angle(entry["PA"] - 90.0, "deg") if entry["PA"] else None

    # Create and return a new Galaxy instance
    return gal_name, position, gal_redshift, gal_type, gal_names, gal_distance, gal_inclination, gal_d25, gal_major, gal_minor, gal_pa

# -----------------------------------------------------------------

def galaxies_in_box(center, ra_span, dec_span):

    """
    This function ...
    :param center:
    :param ra_span:
    :param dec_span:
    :return:
    """

    # Initialize a list to contain the galaxies
    names = []

    # Other way ?? Much more results ?
    #ra_radius = 0.5 * ra_span.value
    #dec_radius = 0.5 * dec_span.value
    #radius = math.sqrt(ra_radius**2 + dec_radius**2)
    #result_table = Ned.query_region(center, radius=radius)

    # Create a new Vizier object and set the row limit to -1 (unlimited)
    viz = Vizier(keywords=["galaxies", "optical"])
    viz.ROW_LIMIT = -1

    # Debugging
    log.debug("Querying the HYPERLEDA catalog ...")

    # Query Vizier and obtain the resulting table
    result = viz.query_region(center.to_astropy(), width=ra_span, height=dec_span, catalog=["VII/237"])

    # I noticed something strange happening once; where there were no entries in the result,
    # with the following parameters:
    #   center = (149.07614359, 69.24847936)
    #   ra_span = 1.600000128 deg
    #   dec_span = 1.3966667784 deg
    #   catalog = ["VII/237"]
    # When ra_span was only slightly changed (e.g. change the last digit to a '7'), output was normal
    # Thus, it seems that the query goes wrong with specific values of the width (and/or height), in which
    # case changing the value very slightly resolves the problem...
    # I am baffled by this and I see no reasonable explanation.
    if len(result) == 0:

        ra_span *= 1.0 + 1e-5
        result = viz.query_region(center.to_astropy(), width=ra_span, height=dec_span, catalog=["VII/237"])

    table = result[0]

    # Loop over the rows in the table
    for entry in table:
        name = "PGC " + str(entry["PGC"])
        if ('_RAJ2000' in entry.colnames) and ('_DEJ2000' in entry.colnames):
            coordinate = SkyCoordinate(ra=entry["_RAJ2000"], dec=entry["_DEJ2000"], unit="deg", frame="fk5")
        elif ('RAJ2000' in entry.colnames) and ('DEJ2000' in entry.colnames):
            coordinate = SkyCoordinate(ra=entry["RAJ2000"], dec=entry["DEJ2000"], unit="deg", frame="fk5")
        namepluscoordinate = (name, coordinate)
        names.append(namepluscoordinate)

    # Return the list of galaxies
    return names

# -----------------------------------------------------------------

def fetch_objects_in_box(box, catalog, keywords, radius, limit=None, column_filters=None):

    """
    This function ...
    :param box:
    :param catalog:
    :param keywords:
    :param radius:
    :param limit:
    :param column_filters:
    :return:
    """

    # Define the center coordinate for the box
    coordinate = SkyCoordinate(ra=box[0], dec=box[1], unit="deg", frame="fk5") # frame: icrs, fk5... ?

    # Make a Vizier object
    if column_filters is None:
        viz = Vizier(columns=['_RAJ2000', '_DEJ2000','B-V', 'Vmag', 'Plx'], keywords=keywords)
    else:
        viz = Vizier(columns=['_RAJ2000', '_DEJ2000','B-V', 'Vmag', 'Plx'], column_filters=column_filters, keywords=keywords)

    # No limit on the number of entries
    viz.ROW_LIMIT = limit if limit is not None else -1

    # Query the box of our image frame
    result = viz.query_region(coordinate.to_astropy(), width=box[3] * Unit("deg"), height=box[2] * Unit("deg"), catalog=catalog)

    region_string = "# Region file format: DS9 version 3.0\n"
    region_string += "global color=green\n"

    # Result may contain multiple tables (for different catalogs)
    for table in result:

        # For every entry in the table
        for entry in table:

            # Get the right ascension and the declination
            ra = entry[0]
            dec = entry[1]

            # Create a string with the coordinates of the star
            regline = "fk5;circle(%s,%s,%.2f\")\n" % (ra, dec, radius)

            # Add the parameters of this star to the region string
            region_string += regline

    # Return the region
    return regions.parse(region_string)

# -----------------------------------------------------------------

def fetch_object_by_name(name, radius):

    """
    This function ...
    :param name:
    :param color:
    :param radius:
    :return:
    """

    # Query the NED database for the object
    table = Ned.query_object(name)

    region_string = "# Region file format: DS9 version 3.0\n"
    region_string += "global color=green\n"

    # For every entry in the table
    for entry in table:

        # Get the right ascension and the declination
        ra = entry[2]
        dec = entry[3]

        #print coordinates.degrees_to_hms(ra=ra, dec=dec)

        # Create a string with the coordinates of the star
        regline = "fk5;circle(%s,%s,%.2f\")\n" % (ra, dec, radius)

        # Add the parameters of this star to the region string
        region_string += regline

    # Return the region
    return regions.parse(region_string)

# -----------------------------------------------------------------


Div 1 Stats – Other Divisions Are Available!
The Women's County Championship can be an unforgiving place to be a batsman – matches are mostly played on used club pitches, often with huge boundaries (in contrast to KSL) and unforgiving outfields where the ball will quickly run out of puff. So if you are thinking these numbers look low… perhaps they are, but there's a reason!
Middlesex's own Beth Morgan comes in at No. 2 – six years after retiring from England duty, she still looks a classy player, with the numbers and consistency to back it up – having reached double-figures in all 7 innings, with a high of 80 against Yorkshire.
Do I understand correctly,runs multiplied by strike rate !
Yup – Runs * Strike Rate – it is pretty arbitrary, but so is a classic "average", which gets horribly distorted by Not Outs in tournament cricket. Runs are obviously what it is all about, but if your Strike Rate is over 100, you deserve a little more credit for them… if it is under 100, a little less – this achieves that.
It deliberately doesn't take into account how many innings you have played (i.e. divide the result by the number of innings) because it is a measure of your contribution to the tournament as a whole.
Of course, there are plenty of other ways to calculate a ranking – many of them more sophisticated – but I've tried them, and oddly enough they actually tend to produce the same result at the end of the day.
One of the reasons I like ranking systems is that they sometimes pull out the unexpected – e.g. Katherine Brunt as the highest ranked England batsman in KSL17!


Understand that Sen. Toomey's voting record doesn't line up with his public remarks: PennLive letters.
Find out how often Toomey voted with President Trump. Toomey is one of the most reliable Republican votes, meaning he can be considered a safe vote for the Republican Party in Congress.
Learn about Toomey's positions on crime, corporations, civil rights, budget and economy, abortion and more.
Contact Senator Toomey by using the links below.
This link will take you to Senator Toomey's email form.


text:
Kasowitz Represents Owners of Staten Island Yankees in Winding Down Operation of Richmond County Ballpark
Kasowitz Benson Torres represented Nostalgic Partners, the owners of the former New York Yankees minor league affiliate, the Staten Island Yankees, in winding down its operation of the Richmond County Ballpark, a waterfront stadium with more than 7,000 seats in Staten Island. Nostalgic Partners had leased the ballpark from New York City's Economic Development Corporation (EDC) for purposes of operating the Staten Island Yankees. However, in 2020, Major League Baseball (MLB) decided to contract the minor leagues from 160 to 120 teams, and the New York Yankees chose to shut down the Staten Island Yankees.
Kasowitz, on behalf of Nostalgic Partners, negotiated the resolution of all its outstanding obligations to the EDC and the assignment of the lease and sale of property to Staten Island Entertainment (SIE), an organization backed by a group led by John Catsimatidis, CEO of Gristedes Food. SIE has since announced plans to have a team from the Atlantic League, a smaller league whose players are former MLB players, play in the stadium.
The Kasowitz team representing Nostalgic Partners is led by Jennifer S. Recine, partner and co-chair of the firm's Real Estate Litigation group, and partner David Szeker, head of the Real Estate Transactions group.
Jennifer S. Recine
David Szeker

redpajama_set_name: RedPajamaCommonCrawl


The airline wants to increase direct booking from its own site.
Bad news for travelers who scour online travel sites for the cheapest flights: On Thursday, JetBlue announced it would no longer sell tickets on the sites of 12 online travel agencies, reports Bloomberg.
In an effort to drive traffic back to its own website, JetBlue will end its partnership with small online agencies, including SmartFares.com, MyFlightSearch.com, CheapFlightFares.com, and FlightNetwork.com (the full list can be found in this New York Business Journal article). Airlines pay third-party websites fees to display their fares, and often customers purchase tickets without going to the airline's own website.
"This move is part of our structural cost program to reduce costs across the airline," said a JetBlue spokesperson in a statement. "By eliminating lower-tier online travel agencies, we're also helping ensure customers have the best experience possible since direct bookings deliver benefits to customers." The change mostly affects agencies who do not direct customers to JetBlue's site to complete the purchase, and the airline will continue to partner with larger sites like Priceline, Travelocity, Orbitz, and Kayak, who allow users to compare prices and schedules, but redirect them to the carrier's website to complete the booking. However, JetBlue hasn't ruled out the possibility of cutting ties with all third-party sites, including the giants. "Depending on the results of this effort, you may see us end additional relationships," the spokesperson added in the statement.
The cost-cutting decision may be indicative of the future of online booking, as other large airlines have already made similar changes. Southwest doesn't post fares on any third-party sites. In 2015, Delta removed its fares from more than 12 sites, including TripAdvisor. Though you can still see flight times, you have to leave TripAdvisor's site to see the actual fare. If anything, this is good news for travelers. By cutting out the middle man, airlines may be able to reduce the overall cost of tickets.


text:
Q: PHP directory mirroring I want to mirror a directory through php so i can the files without having to directly modify them.
I found this script (here) but i keep getting a 500 Internal Server Error when i try to set it up.
Could it be because its from 2004?
Are there any other ways to set this up or another method of doing this same thing?
here is some of the code i was using on a shared hosting plan
Agent file
<?php

error_reporting(0);

set_time_limit(0);

function recur_dir($dir)
{
    $dirlist = opendir($dir);
    while ($file = readdir ($dirlist))
    {
        if ($file != '.' && $file != '..' && $file != '.DS_Store' && $file != 'mirror_agent.php')
        {
            $newpath = $dir.'/'.$file;
            $permissions = substr(decoct(fileperms($newpath)),-4);
            if (is_dir($newpath))
            {
                echo '
dir|'.$newpath.'|'.$permissions;
                recur_dir($newpath);
            }else{
                echo '
file|'.$newpath.'|'.$permissions.'
'.bin2hex(file_get_contents($newpath));
           }
        }
    }
    closedir($dirlist);
    return $mod_array;
}

header('Content-type text/plain');
echo 'mirror_agent here';
recur_dir('.');

unlink(__file__);

?>

Client File
<?php

$mirror_agent = 'http://moddline.com/safe/mirror_agent.php';

function hex2asc($temp)
{
    for ($i = 0; $i < strlen($temp); $i += 2) $data .= chr(hexdec(substr($temp,$i,2)));
    return $data;
}

function file_write($filename, $filecontent, $mode='wb')
{
    if($fp = fopen($filename,$mode))
    {
        fwrite($fp, $filecontent);
        fclose($fp);
        return true;
    }else{
        return false;
    }
}

error_reporting(0);

set_time_limit(0);

$cont = file_get_contents($mirror_agent);
$files = explode("\n",$cont);

if(trim($files[0]) == 'mirror_agent here' && is_writeable(dirname(__file__)))
{

    for($i = 1; $i < count($files); $i++)
    {
        if(trim($files[$i]) != '')
        {
            $parts = explode('|',trim($files[$i]));
            $permissions = intval($parts[2], 8);
            if($parts[0] == 'dir')
            {

                mkdir($parts[1],$permissions);
                $done[] = $permissions.'|'.$parts[1];
            }elseif($parts[0] == 'file')
            {
                file_write($parts[1], hex2asc($files[$i+1]));
                chmod($parts[1],$permissions);
                $done[] = $permissions.'|'.$parts[1];
                $i++;
            }
        }
    }
    // output status
    echo '

following files were copied:';

    for($i = 0; $i < count($done); $i++)
    {
        echo '
'.$done[$i];
    }

    echo '

';

    unlink(__file__);
}else{
    echo '

ERROR:
'.$mirror_agent.'
does not respond like a mirror_agent should or
the directory '.dirname(__file__).' is not writeable.

';
}

?>

redpajama_set_name: RedPajamaStackExchange


text:
/* Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.flowable.engine.impl.jobexecutor;

import org.flowable.engine.impl.util.CommandContextUtil;
import org.flowable.job.service.JobHandler;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

/**
 * @author Joram Barrez
 */
public abstract class TimerChangeProcessDefinitionSuspensionStateJobHandler implements JobHandler {

    private static final String JOB_HANDLER_CFG_INCLUDE_PROCESS_INSTANCES = "includeProcessInstances";

    public static String createJobHandlerConfiguration(boolean includeProcessInstances) {
        ObjectNode jsonNode = CommandContextUtil.getProcessEngineConfiguration().getObjectMapper().createObjectNode();
        jsonNode.put(JOB_HANDLER_CFG_INCLUDE_PROCESS_INSTANCES, includeProcessInstances);
        return jsonNode.toString();
    }

    public static boolean getIncludeProcessInstances(JsonNode configNode) {
        if (configNode.has(JOB_HANDLER_CFG_INCLUDE_PROCESS_INSTANCES)) {
            return configNode.get(JOB_HANDLER_CFG_INCLUDE_PROCESS_INSTANCES).asBoolean();
        }
        return false;
    }

}

redpajama_set_name: RedPajamaGithub


text:
Home GCC UAE Dubai Emaar gives bidders more time for Expo pavilions
Emaar gives bidders more time for Expo pavilions
26 September 2017 7:39 AM By Colin Foreman
The tender closing dates have been moved to October
Local developer Emaar Properties has extended the tender closing dates for the contracts to build two pavilions at the Expo 2020 site in Dubai.
The closing date for the Mobility Pavilion is now 15 October, and the closing date for the Sustainability Pavilion is 23 October. The original closing date was in mid-September.
The contracts cover the Mobility and Sustainability pavilions.
The UK's Laing O'Rourke is providing pre-construction services for both pavilions. Emaar is the development manager.
Architects won design competitions for the two pavilions in 2016. The UK's Foster + Partners won the competition for the contract to design the Mobility pavilion, while Grimshaw Architects, also of the UK, submitted the winning entry for the Sustainability pavilion.
Also at the Expo site, Dubai World Trade Centre (DWTC) is tendering an estimated AED1.3bn ($353m) contract to build exhibition space at the Expo 2020 site in Dubai.
Known as the Co-Ex Campus, it has been designed to host events and performances as part of the Expo that starts in October 2020, as well as provide an arrival area for visitors travelling to the Expo on the new Route 2020 metro rail link.
The buildings will have a total built-up area of about 150,000 square metres, which includes about 46,000 sq m of exhibition space and 38,500 sq m for the arrival and general concourses.
The design consultant is Australia's Woods Bagot. The programme manager for the Expo 2020 site is a joint venture of the US' CH2M and the UK's Mace.
There has been a series of contract awards and tenders for construction work at the Expo site over the summer. DWTC awarded the local/Australian HLG Contracting an AED619m deal for the construction of two sections of the Expo Village development.
DWTC and its joint venture partner Emaar Properties awarded the local Arabtec Construction the AED363m contract to build the Project Star retail centre.
In early July, Arabtec was awarded the deal to build and operate the UAE Pavilion at the Expo 2020 site. Abu Dhabi's Masdar is the development manager for the scheme.
Earlier this year, the local/UK Al-Futtaim Carillion was awarded an AED2.2bn contract to build the Thematic Districts at the Expo site.
Dubai construction sector will continue to decline
17 July 2019 1:05 PM By Colin Foreman
More projects are being completed than started as Expo 2020 deadline looms
Dubai tenders next section of Shindagha road corridor
15 July 2019 8:06 AM By Colin Foreman
The contract covers the upgrade and construction of road junctions in the Deira corniche area
China State wins Emaar Beach Front towers
Beijing-based contractor will build two residential towers at Dubai Harbour for Emaar Development
Dubai's construction market dropped sharply in second quarter
09 July 2019 11:11 AM By Colin Foreman
Contract awards have failed to keep pace with the large volume of projects that are now being completed


Houston-based chocolatier takes home the most awards in global Americas competition, receiving three gold and four silver awards for their unique chocolate bon-bons.
Congratulations to Houston's Cacao & Cardamom chocolatier for winning not 1, not 2, but 7 International Chocolate Americas Awards!
HOUSTON, Texas, (Sept. 25, 2018) -- Cacao & Cardamom, a gourmet chocolate boutique inspired by ingredients and spices from around the world to bring a new twist to chocolate, topped this year's International Chocolate Americas competition earning seven awards for their hand-made, hand-painted, chocolate bon-bons.
The International Chocolate Awards recognizes the hard work and craft that goes into creating fine chocolate products and is established as a coveted honor for chocolatiers, seeing a record number of participants with over 800 entries from 16 different countries from North and Latin America. Cacao & Cardamom will move on to the World Final competition to take place in Florence, Italy at the end of October.
Cacao & Cardamom was founded in 2014 as a self-taught chocolatier running out of a home kitchen to celebrating the grand opening of their second store this Saturday, September 29, in Houston, Texas with a boutique farmer's market. The first-ever Cacao & Friends Farmer's Market highlights the local businesses used in the chocolatier's newest chocolate flavors, the HOUSTON collection, as well as provides guests a first look at the 5-foot, golden-plated, chocolate fountain, pouring dark and caramelized white chocolate. To learn more about the event, visit Cacao and Cardamom on Facebook (facebook.com/cacaoandcardamom).
Locally, Cacao & Cardamom has long been a Houston favorite among notable chefs, restaurateurs and chocolate connoisseurs including 51fifteen at Saks Fifth. Images of the award-winning chocolate are available to download here. To sample the winning chocolate, contact Sanah Sadaruddin at Creative Grammar (sanah@creativegrammar.co).
**Update November 18: Cacao & Cardamom's Passionfruit and Five Spice Praline placed Silver in the 2018 World Final which was judged in Florence Italy October 26-November 2, 2018.
Cacao & Cardamom is a chocolate boutique dedicated to creating one-of-a-kind handmade, hand-painted premium chocolate using the finest ingredients, exotic spices, nuts, flowers, roots, herbs and liqueurs. Founded by chocolatier Annie Rupani in 2014, the menu features over 40 varieties of sweet and savory signature chocolate bon-bons, as well as popular chocolate handbags and glitter pumps, custom mandients made with matcha and pop rocks and signature frozen drinking chocolate among other chocolate varieties. Guests can order chocolates in-store at the two Houston locations, online or by phone. Custom chocolates are available for social functions, corporate events, weddings and more. To learn more about Cacao & Cardamom, visit https://cacaoandcardamom.com or follow on social media (@CacaoandCardamom).


Office 365 Mailbox Location - Dublin or Amsterdam?
Posted on Tuesday, October 28th, 2014 at 5:26 pm.
A play on the film title from "Dude, where's my car?" in which, well actually, we can't remember the plot but we do remember the title and something about a scene with tattoos.
Putting movies to one side, customers often want to know where their mailboxes reside in Office 365 and Exchange Online. If my billing address is in Europe I can assume my data centres are located in Dublin and Amsterdam but can I verify that? Also, the mailboxes for individual users and resources might be in either of those locations. Here's where a little PowerShell comes in handy.
There's a useful getting started with Powershell resource on the Microsoft website. You can also search the web for myriad explanations but be aware many of these will be out of date especially if you're using Windows 8.1.
Windows 8.1 includes PowerShell by default so on the Start screen, type PowerShell, right-click Windows PowerShell in the search results and select Run as Administrator. I'll explain why you need to run it as admin in a moment.
So many memories of the old DOS window. PowerShell doesn't speak Office 365 by default so we have to teach it by installing the Windows PowerShell cmdlets for Office 365 management and deployment. Your keyboard should now be bristling with all the power you have at your fingertips.
1 – Set the PowerShell execution policy. The default setting for execution policy is restricted which would not allow PowerShell to run scripts at all; secure but not very useful. RemoteSigned tells PowerShell it can run scripts on the local machine but any scripts downloaded from the Internet must be signed by a trusted publisher. This is also why you need to run PowerShell as administrator; in order to change this setting.
2 – Set your Office 365 admin credentials. A popup window will appear where you type in your Office 365 admin user and password. This will also tell the PowerShell cmdlets which Office 365 tenant you want to connect to.
3 – In order to perform administrative tasks on Office 365 you can connect to the online service using the credentials you supplied.
4 – You can list all the Office 365 admin commands. Note that Exchange, SharePoint and the other cloud services have their own set of commands.
5 – To connect to Exchange Online, type the following commands. You don't need to change anything here; again, the tenant to connect to is specified by the login ID in the credentials.
6 – Return your mailbox information to see where they're located. If the server name begins with db you're in Dublin and if it's am you're in Amsterdam. Happy travels!


Business and Conference Venues in Mid Devon. Enjoy our guide to business meeting rooms through to large business and conference venues throughout Mid Devon. Mid provides an excellent back drop for your business and conferencing needs offering a diverse selection of venues to suit size and budget. View guide below.


Some of the best bingo sites employ security protocols that meet industry standards. This comprises of Secure Sockets Layer (SSL) 128 bit encryption. The technology helps ensure that your monetary transactions – both withdrawals and deposits – are carried out securely. These sites also use the latest billing platforms.
If you want to be assured of fair and secure gaming on bingo sites, opt for those committed to this aspect. Such bingo rooms typically offer patrons assurance of fair gaming clearly on their websites. They also use the Random Number Generator (RNG), a software feature specifically designed to ensure that the numbers called during bingo are arbitrary. Ideally, you should opt for a site that uses RNG audited and certified by credible companies.
Also, the feature should have been analyzed rigorously to test its effectiveness. With an RNG that meets industry standards, players can be assured of results that are random. This way, the bingo room operator will have no control over the numbers called, cards picked or the game results. Most of the fair bingo sites have this feature tested on a monthly basis by independent facilities and third-party monitors. They may also feature the verification reports on their website for patron access – if they follow accountability and transparency policies.
One of the key features to look for if you want fair and secure gaming on bingo sites is its payout percentage. Verified by third parties and auditing companies, the payout percentage is typically issued as a report to sites. The payout percentage of an online bingo room is the portion of the total money that a site pays to players as winnings. So, if a bingo room has a payout percentage of 98%, it means that percent of the money that was bet is paid out as winnings. Typically, you can be assured of a fair payout at a bingo site if it has a payout percentage that exceeds 96.5%.
One of the key reasons to go for fair and secure gaming on bingo sites is that when you game at an online bingo room, you will be providing it with both personal and financial data. Also, you will be using money transfer methods to deposit money in your bingo room account. As the security of this information is crucial, the site you game with should be capable of providing you with the best of security measures.


Today, we are getting to know finalist Gregor Ross.
Home City Market: Fresno, Calif.
My great-grandparents were both musicians. I was influenced at a young age.
When I was in eighth grade, I heard "Cemetery Gates" from Pantera for the first time and it was unlike anything I'd ever heard. I was raised on classic country and classic rock so when I heard that coming out of the speakers it blew my mind. The rest is history.
George Strait, Alabama, Waylon Jennings, Willie Nelson, Pantera, Corrosion of Conformity, as well as Mickey Gilley and anything off of the Urban Cowboy soundtrack.
I think it's the emotion that I deliver that sets me apart.
Alabama's Greatest Hits, Urban Cowboy soundtrack and Keith Whitley's Greatest Hits . . . and if I'm able to sneak a bonus album, Pantera's Official Live: 101 Proof.
"Slow Burn" by T.G. Shepard.
"Loud and Heavy" by Cody Jinks.
George Strait and Reba McEntire.
"The Fireman" by George Strait.
At a Chipotle in Lebec, California.
"Bluesman" by Hank Williams Jr.
Nothing yet, but I'm sure it'll happen soon enough.


text:
Q: Prevent f.range_field to submit data unless interacted with I have the following f.range_field that calls my update method in the controller:
= f.range_field :feeling, :in => 1..3, :step => '1'

Controller:
if @workout.update_attributes(workout_params)
  redirect_to team_user_workouts_path(current_user.team,
    current_user, athlete: params[:athlete])
else
  render(:edit, athlete: params[:athlete])
end

With a select_field I would usually include_blank: 'choose', which would make sure that if the select field has not been interacted with - the specific param does not submit. How do I achieve the same with a range field? Right now, it submits even if I don't interact with it.


Lancaster Chiropractor | Lancaster chiropractic care | PA | What are the Clinical Benefits of Laser Therapy?
Lancaster Chiropractor | What are the Clinical Benefits of Laser Therapy?. Dr. Kam Kettering is a Lancaster Chiropractor.


text:
Allyson Hobbs
Associate Professor of History
Ph.D., University of Chicago, History (2009)
A.B., Harvard University, Social Studies (1997)
Allyson Hobbs is an Assistant Professor in the History Department at Stanford University. She graduated magna cum laude from Harvard University and she received a Ph.D. with distinction from the University of Chicago. She has received fellowships from the Ford Foundation, the Michelle R. Clayman Institute for Gender Research, and the Center for the Comparative Study of Race and Ethnicity at Stanford. Allyson teaches courses on American identity, African American history, African American women's history, and twentieth century American history. She has won numerous teaching awards including the Phi Beta Kappa Teaching Prize, the Graves Award in the Humanities, and the St. Clair Drake Teaching Award. She gave a TEDx talk at Stanford, she has appeared on C-Span, MSNBC, National Public Radio, and her work has been featured on cnn.com, slate.com, and in the Los Angeles Times, The Chronicle of Higher Education, the Christian Science Monitor, and the New York Times.
Allyson's first book, A Chosen Exile: A History of Racial Passing in American Life, published by Harvard University Press in October 2014, examines the phenomenon of racial passing in the United States from the late eighteenth century to the present. A Chosen Exile won two prizes from the Organization of American Historians: the Frederick Jackson Turner Prize for best first book in American history and the Lawrence Levine Prize for best book in American cultural history. A Chosen Exile has been featured on All Things Considered on National Public Radio, Book TV on C-SPAN, The Melissa Harris-Perry Show on MSNBC, the Tavis Smiley Show on Public Radio International, the Madison Show on SiriusXM, and TV News One with Roland Martin. A Chosen Exile has been reviewed in the New York Times Book Review, the San Francisco Chronicle, Harper's, the Los Angeles Review of Books, and the Boston Globe. The book was selected as a New York Times Book Review Editor's Choice, a "Best Book of 2014" by the San Francisco Chronicle, and a "Book of the Week" by the Times Higher Education in London. The Root named A Chosen Exile as one of the "Best 15 Nonfiction Books by Black Authors in 2014."
Neo-Passing - Performing Identity after Jim Crow
The Blacker the Berry.....
Keywords for African American Studies
A Chosen Exile: A History of Racial Passing in American Life
Obama and the Paradigm Shift: Measuring Change
Driving While Black: Race, Space and Mobility in America - Allyson Hobbs
Allyson Hobbs is featured in a PBS Special "Driving While Black: Race, Space and Mobility in America". The discussion focuses on how the advent of the automobile brought new mobility and freedom for African Americans but also exposed them to discrimination and deadly violence, and how that history resonates today.
How to Build a Movement - Featured: Clay Carson, Estelle Freedman, Allyson Hobbs and Pamela Karlan
Growing up in the predominantly white town of Los Alamos, New Mexico, Clayborne Carson learned about the civil rights movement from the news: school desegregation, lunch counter sit-ins, the Freedom Riders. But in 1963, he joined the Student Nonviolent Coordinating Committee (SNCC)—Black rights activists who "exemplified the rebelliousness and...
Sunday Reading: Racial Injustice and the Police-Collection of Essays with 2016 Essay by Allyson Hobbs
This past week, protests took place in every U.S. state and in many foreign cities, an uprising ignited by the killing of George Floyd. The demonstrations speak to the larger malignancy of racism and police abuse over the decades. This week, we're bringing you a selection of pieces that examine racial injustice and police misconduct from both...
ahobbs@stanford.edu
Spatial History and Historical Geography
Urban History
A Chosen Exile: A History of Racial Passing in American Life has been selected as:
Winner, Frederick Jackson Turner Prize for Best First Book in American History (Organization of American Historians)
Winner, Lawrence Levine Prize for Best Book in American Cultural History (Organization of American Historians)
A New York Times Book Review Editor's Choice
2017 Summer Reading Lists for The Paris Review and Harvard University Press
Recommended Reading on "Racial Boundaries" by the New York Times
A San Francisco Chronicle Best Book of 2014
A Times Higher Education Book of the Week
The Root, Best 15 Nonfiction Books by Black Authors in 2014
A featured book on The New York Times' "Paperback Row"


text:
Hasta La Vista March!
Mornin'! It's 52° in Wildwood NJ. This is it March... you've been pretty darn good to us this year and no surprise you're heading out with a bit of a bang. It's mostly cloudy (some sun peeking through) and breezy with winds out of the North at 15-20mph. We're supposed to get rain early in the day (early afternoon) 70% chance as temps go up just a bit to around 56°. Winds will remain stiff out of the West at 15-25mph. Tonight... clouds begin to clear out as temps drop down in the low 40s with blustery March winds out of the NW at 20-30mph making it feel like 32°. Until next year March... Hasta la vista baby! Tomorrow is going to be sunny with mid-upper 40° temps.
Partly Sunny / Partly Cloudy Day
Delaware Bay - Sunset Beach , Cape May
Mornin'! It's 48° in Wildwood NJ. It's clear with breezes out of the North at 6-9mph. It'll be a partly sunny / partly cloudy day with temps in the mid-upper 50s and breezes out of the South at 13-16mph. Tonight... clouds roll in and cover the island with temps in the upper 40s / low 50s and breezes out of the South at 15-20mph. Tomorrow...showers begin in the morning.
TGIF and Another Nice One
Mornin'! It's 47° in Wildwood NJ. It's clear and a bit breezy (North at 9-13mph). Ms Sun just rose over the horizon. It's a lovely morning down the shore. It made me want to sing "Oh What A Beautiful Morning" from Oklahoma in my Gordon MacRae voice when I stepped outside! It'll be another pleasant day with partly sunny / partly cloudy skies. Temps will be in the mid-upper 50s. Breezes will be out of the S-SW then switch to the South at 10-12mph. Tonight... mostly clear (some clouds in the mix) with temps in the upper 40s and breezes out of the South at 8-11mph. Tomorrow... basically a repeat of today. Sunday... starts out okay, then rain showers come in late morning throughout the afternoon. Good weather for beginning to pack the suitcase for Key West next weekend!!!
Another Nice One
Mornin'! It's 38° in Wildwood NJ. It's calm with no breezes to note as the sky begins to brighten as sunrise is happening any moment now. It'll be a mostly sunny day with some clouds in the mix as Ms Sun keeps us on the warm side with temps in the mid-upper 40s. Breezes will be out of the S-SE at 7-12mph. Tonight... clouds roll in as it'll be mostly cloudy with temps in the mid-40s and breezes out of the South at 9-12mph. Tomorrow... mostly cloudy with peeks of sun, mid-50s and breezy. The weekend... Saturday is mostly cloudy and breezy with Sunday being the rainy day.
Sunrise: 6:48a.m.
Sunset: 7:20p.m
Happy Birthday Sis!
Mornin'! And, a very Happy Birthday to you Sis! This one's dedicated to you! If it weren't for you there would be no Wildwood weather blog! It's 33° in Wildwood NJ. It's clear as Ms Sun's due up in about 20 minutes. There's a light breeze out of the NE at 4-7mph. It's a lovely, crisp morning down the shore. It'll almost be a repeat of yesterday with plenty of sunshine (some clouds are in the mix this afternoon) with temps in the low 40s. Breezes will be out of the E-NE at 9-12mph. Tonight... clear with temps in the upper 30s and breezes out of the East at 7-9mph. Tomorrow... more of the same. I have to admit that March has really come through this year. Those gusty, annoying winds do come through every so often, but for the most part... March actually has had some lovely spring-like days (so far) for the first time in many years. I'm touching wood as I write that! With only 4 days to go... it appears we could make it through to April intact. As for this weekend... it's looking like another 50-50 with Saturday being the nicer of the 2 days as Sunday seems to have a rainy day in the forecast.
Sunny but Cold
Mornin'! It's 37° in Wildwood NJ. It feels like 26° though with that ol' windchill. Winds are currently out of the N-NE at 20-25mph. It's clear and Ms Sun is up as she'll be shining down today with plenty of sunshine and clear skies. Temps will rise into the mid-40s with windchills of upper 30s as N-NE winds stay checked in at 15-20mph. Tonight.. clear, upper 30s and N-NE winds at 5-9mph. Tomorrow... a repeat of today.
Low tide: 6:43a.m. and 6:53p.m.
Sunset: 7:18p.m.
Gray Monday
Mornin'! It's 46° in Wildwood NJ. It's cloudy and gray with very light breezes out of the N-NE at 2-4mph. It's quiet with only the sound of the waves roaring onto the beach from the other side of the island. The sky is brightening along the horizon and I'm thinking we may see peeks of Ms Sun through the cloud cover any moment now. The forecast is a gray day and start to the day week as there's a 40% chance of showers beginning later this afternoon with temps just about hitting 50°. NW winds at 5-10mph will become NE by the afternoon. Tonight... showers likely (70% chance) with temps in the mid-upper 30s. NE winds at 13-18mph will be in the night time mix. Tomorrow... partly sunny and breezy.
Sunshine Early Followed By A Cloudy Afternoon
Mornin'! It's 39° in Wildwood NJ. It's clear and calm with hardly a breeze at the moment (North 2-4mph). What a difference a day makes! It'll be a mostly sunny morning as temps climb up into the low-50s today. Winds will commence after mid-day at 10-13mph out of the S-SW. Clouds drift over us this afternoon too as it'll become a mostly cloudy afternoon and evening. Tonight... temps in the mid-40s with S-SW breezes at 11-16mph. Tomorrow... a cloudy start to the week with tomorrow evening possibly having rain showers (60% chance).
Partly Sunny Saturday
Enjoying dinner on the beach at Sunset - Key West on an April evening
Mornin'! It's 36° in Wildwood NJ. Windchill is 25° due to the W-NW winds at 25-35mph. March is doing its thing... brutality in the weather department! It feels like a freezing winters morning out there even with Ms Sun already shining down. It'll be mostly sunny today with temperatures in the upper 40s and feeling like the upper 30s with the W-NW winds (20-30mph+gusting). Tonight... clear, mid-30s with the winds simmered down at 13-18mph out of the W-NW. Tomorrow... partly cloudy, temps in the low 50s with W-SW winds at 10-20mph. March weather isn't going anywhere. 90 days until Summer! 2 weeks from today... Key West!
March Is Here!
Mornin'! It's 44° in Wildwood NJ. It's raining lightly with winds out of the W-NW at 20-25mph +gusting. The winds are what woke me as they're sounding much like a speeding train hauling ass down the street. It's making those light rains feel like stinging pellets. My hubby can vouch for that as he just took off after an empty milk gallon container from someone's recycle bin before it hit the harbor! One more save for the plastics in the ocean. March is here making its presence known that's for sure. The blustery winds will continue today through tomorrow. Things simmer down by Sunday. Expect early rain showers as it'll be partly cloudy today with temps just about tapping the 50° mark. Winds will be out of the W-NW at 28-40mph +gusting. Tonight... blustery, cloudy and a 30% chance of a passing shower around dinner time, low-40s, W-NW winds at 25-30mph +gusting. Tomorrow... Ms Sun's back along with the gusty winds that have decided to stay checked in as well as much colder temps. Sunday... sunny, calmer winds and temps back in the upper 40s.
Crapola Thursday
Me on Wildwood beach - circa 1955
Mornin'! It's 46° in Wildwood NJ. It's raining. It's breezy... E-SE at 15-20mph. It's noisy... the breezes howling along with the ocean's roar is loud and clear this early morn (and that's inside the house). No sunrise today. There was no full moonrise last evening either due to the cloud cover. It began raining even before turning in last night. For today... expect a raw and rainy day down the Shore as all forecasts are reporting 100% chance of rain with stiff winds out of the E-SE at 20-30mph +gusting. Temps will be in the upper 40s. Tonight... rain likely (70% chance) with temps in the low 40s and SE winds shifting to the W-SW at 20-30mph +gusting. Doubt if we'll have a moonrise tonight either. It'll be a crapola day and evening for sure. We'll probably see tidal flooding due to the rains along with that Super Moon's leftover gravitational pull. Remember... don't drive through salty, corrosive flood waters! The weekend's looking like typical March weather with partly sunny skies and very blustery winds making the wind chill (mid-upper 20s) go right through you.
High tide:8:57a.m. and 9:27p.m.
Vernal Equinox - Super Moon
North Wildwood - Hereford Lighthouse Garden
Mornin'! It's 33° in Wildwood NJ. It's clear as Ms Sun just rose over the ocean's horizon. It's quiet and still as there are no breezes to note at the moment. It's cold and crisp and briny with another frosty morning (there's frost layered on everything). It's Spring! Happy Spring! It'll be a lovely, cold, Spring day with a mix of clouds and sun and breezes out of the E at 9-12mph with temps in the low-mid 40s. Tonight... clouds roll in (hopefully not before the moonrise later) as temps stay in the low-40s with breezes out of the East at 7-9mph. Tomorrow... rainy and raw. The weekend... looks so far so good with breezy sunshine and 40° temps.
So, there are some celebrated things going on today as it's a special day throughout the world. It's the Spring Equinox which basically means Day and Night are just about the same length. Thus, "Equinox" means "equal". Also, the center of the Sun is directly above the earth's equator today. It usually happens this day (or near it 3/19, 3/20, 3/21) of March. It's the first time since 1981 that the Full Moon and Spring Equinox happen on the same day. This Full Moon is known as the Super Moon as tonight's moon will appear larger than usual since its proximity to earth is closer than normal. The moon actually becomes "full" at 9:43p.m. tonight and Spring's officially here at 5:58p.m. tonight. Let's all celebrate the dark half of the year passing! Get out and ready those gardens and summon those seeds to be planted as the earth becomes warmer and brighter.
Last Day Of Winter
Mornin'! It's 34° in Wildwood NJ. If it were pumpkin season there would be frost on them. Seems like everything's got frost on it this morning. It's clear and brisk with the sky brightening and becoming colorful along the horizon as Ms Sun's about to cross over any moment now. It'll be a pleasant day this last day of Winter... plenty of sunshine, temps in the mid-40s and breezes light out of the E-SE at 4-6mph. Tonight... clear, temps in the mid-upper 30s with breezes out of the S-SE at 3-5mph. It's St. Joseph's day today and celebrated all over the world by Christians. Since I'm married to a Joseph, having a son named Joseph, my father-in-law was a Joseph and his father was a Joseph, this date always stands out for me. Both my hubby and I had great-aunts who were St. Joseph nuns. Unbeknownst to me, my great-aunt (Sister Mary) prayed to St. Joseph during my entire pregnancy beseeching I'd have a healthy baby after losing our firstborn son (Kevin) to a congenital heart defect. That's when we had our second (healthy) son naming him Joseph adding all of that up after his birth. It was the perfect name. March 19th seems to bring it all back to the surface in a good way. Happy St Joseph's day! Until December... see you next year Winter! Life is good!
Last Monday Of Winter
North Wildwood - Waiting for the Full Moon Rise
Mornin'! It's 38° in Wildwood NJ. We're under overcast skies but at the moment Ms Sun is doing all she can to make a grand entrance through all that cloud cover. Could make for a lovely sunrise (which was an hour ago). Breezes are light out of the North at 3-5mph. There's a 40% chance of light rain or snow showers this morning which could continue through the early part of this afternoon. All forecasts are reporting mostly cloudy conditions today (a couple posted peeks of sun later today) as temps get into the low 40s. E-NE winds will check in at 8-10mph this afternoon and switch from the East at 5-8mph tonight. Tonight's temps... low 30s with mostly clear skies. Tomorrow... Ms Sun returns and so does the slightly higher temps... mid-upper 40s. Only a couple more days until Spring and the Full Moon!
Mornin'! Happy St. Patrick's Day! It's early and still dark outside. It's brisk - 35° with clear, starlit skies and hardly any breezes worth mentioning (North 2-4mph). It's High Tide too at the moment and there will be another one tonight. It's going to be a lovely, crisp day with temps in the mid-40s and plenty of sunshine. Winds will be out of the W-NW at 10-15mph. Tonight... clear with temps in the upper 30s and winds light and variable again out of the S-SW at 3-5mph. Tomorrow looks like a mostly gray day with rain showers by afternoon along with peeks of the sun by early evening. Could make for an exquisite sunset. Today's weather will be perfect for a walk in the sea air and a nice St. Patty's Day dinner of corned beef, cabbage, potatoes, and some freshly baked Irish soda bread!
St. Patty's Weekend!
Mornin'! It's 47° in Wildwood NJ. The Blog's a bit late as I slept in today. After spending a day and partial evening at my daughter's and son-in-law's home in a Philly suburb yesterday we arrived home late last night. I spent most of my time outdoors with my family and grandkids in their backyard enjoying the sunshine along with warm 74° temps. I don't think the coast came close to that type of weather yesterday as we left behind windy, cold, misty conditions. But, I sure enjoyed a beautiful taste of Spring right into dusk last night. We'll surely be enjoying more sunshine this weekend but with cooler mid-upper 40° temperatures. Expect a cool day with plentiful sunshine and blustery winds out of the W-NW at 18-24mph. Tonight... clear with temps in the low-mid 40s and NW winds at 10-15mph. Tomorrow... more sunshine, even cooler temps and less breezy. Oh, and we could wake to rain on Monday. Happy St. Patty's Weekend!
Mornin'! It' 50° in Wildwood NJ. March is showing itself this morning... gray and windy with S-SW winds at 18-22mph. It'll be a bad hair day this anniversary of the assassination of Julius Caesar (3/15). Expect a gray and somewhat rainy day with a 50% chance of scattered thunderstorms and rain showers with plenty of those March winds... S-SW at 20-25mph +gusting. Temps will rise up a bit... low-mid 50s. Tonight... 70% chance of rain with S-SW winds at 15-20mph and temps hovering around the 50° mark. This Irish Weekend will be sunny with temps in the mid-upper 40s and on the breezy side. Not too shabby.
The Clouds Are Assembling
Throwback Thursday - Wildwood Beach 1967
Mom and Grandmom getting their beach day on
Mornin'! It's 41° in Wildwood NJ. It's dark. At the moment we're under partial cloud cover but I could clearly see the stars in the gaps around the cloud formations. The sky is so black that the clouds almost look white even before dawn arrives. Unlike yesterday morning there's a breeze and it's coming off the ocean at 8-10mph. The burst of sea air hits immediately (putting a smile on my face of course as I suck it up for a quite a few minutes). March has been hitting home runs so far this month ("touch wood" as I still have an untrusting eyebrow up with this very shifty month). We're almost halfway through (and less than a week from Spring) and so far so good in the weather department. Today will be no exception. It won't be as sunny and feel as warm as yesterday. The temps will just about tap 50° again but with more clouds in the mix. We'll probably see only peeks of sun today. Winds will be out of the South at 10-15mph. Tonight... cloudy, 48° with South winds at 14-16mph. Tomorrow... scattered showers throughout the day and evening with temps sustaining those upper 40s / low 50s. The weekend's looking sunny and bright with a bit cooler temps... low-mid 40s. Ms Sun's been feeling really nice as of late and even with those cool temps... that sensation of that next "warm" season coming in seems to come and go more often than not.
On The Cloudy Side
Mornin'! It's 31° in Wildwood NJ. We're starting out the same as yesterday with a black, vivid, intense starry sky. It's really something to see when the sky is this clear in the pre-dawn. It's definitely a Winter phenomenon as you never get to witness this in the Summer months. I'm sure today's sunrise will be even more spectacular than that pre-dawn darkness. No breezes to note. It's crisp and cold and for some reason... not one-bit challenging standing on the back porch out in the cold taking it all in. It'll be a bit warmer and cloudier than yesterday. Expect some sunshine with milky cloud cover today as temps get up into the mid-40s. Breezes will be out of the S-SE at 11-15mph. Tonight... temps just about tapping 40° with mostly cloudy skies and Southerly breezes at 7-10mph. Tomorrow... even cloudier and warmer. Rain all day and night due in for Friday.
Breezy Blue Sky Tuesday
Mornin'! It's 39° in Wildwood NJ. The sky is beautiful as it's bursting with stars in the pitch darkness (it's always darkest before the dawn). There's a breeze out of the NW at 10-15mph giving me the urge to breathe deeply taking in that salt air brininess. It's crisp and cold yet feels wonderful even in a robe and slippers. It would be a great day to bundle up and stand at the dunes waiting for a sunrise photo shoot (which I've done numerous times). It'll be a sunny, cold winter's day with temps in the low 40s and breezes much stiffer than yesterday out of the NW at 15-20mph. Tonight... clear with temps in the upper 30s and calmer with N-NW breezes at 4-8mph. Tomorrow... just about the same as today with lighter breezes. And, just an fyi... there is a rain system due in on Friday.
Low tide:6:08a.m. and 6:09p.m.
Splendid Monday
Mornin'! It's 41° in Wildwood NJ. It's clear and calm with hardly a breeze in the sea air (Northerly breezes at 2-4mph). It's almost dawn as Ms Sun's checking in today. At the moment there's a layer of cloud cover along the horizon as she has her work cut of for her while rising this morning. But, once she rises it should be a mostly sunny day. It'll be a lovely day with plentiful sunshine and breezes out of W-NW at 10-15mph as temps climb into the low 50s. Tonight... clear, temps back where they are now (low 40s) and still the W-NW breezes at 15-18mph. Tomorrow... just about the same but even breezier. March is doing us very proud this year (touch wood).
Daylight Savings Time - Sunset's at 7:00 O'clock Tonight!
Mornin'! It's 45° in Wildwood NJ. We're officially in "daylight savings time" so if you didn't spring those clocks ahead one hour before turning in, you're an hour late. It's raining. It's a nice hard steady rain out there with breezes out of the North at 6-10mph. It's an absolutely gorgeous day to roll over and listen to the downpour as you drift back to sleep. It'll be raining all morning as this rain system will begin to drift on out of here by mid-day. Temps are heading into the 50s (low 50s) with S-SW winds at 10-20mph. Tonight... cloudy with temps in the low 40s and Westerly breezes at 10-15mph. Tomorrow... Ms Sun shows up once again with temps nearing 50°. 9 more days until Spring!
A Decent Day
Mornin'! It's 35° in Wildwood NJ. It's a quiet dark morning. No ocean waves sounds crashing from where I'm at as it's cloudy and still with no breezes to note. We may see areas of patchy fog early followed by cloudy skies. It should clear as Ms Sun's due in today with partly sunny skies as temps tap 40° with winds out of the E-NE at 5-10mph. Tonight... clouds take over as rain will be developing after midnight. Temps will drop just a bit into the mid-upper 30s with winds out of the E-SE at 15-25mph. Chance of rain tonight... 100% tonight, overnight and right into tomorrow. Expect early rain tomorrow until at least mid-day. Temps will be considerably higher tomorrow... low 50s. When you wake, you should be an hour ahead of today's time as it'll be Daylight Savings. It'll be still light in the early evening! Remember to turn those clocks ahead an hour before turning in! Spring is next up... 11 more days!
It's Coming!
https://youtu.be/QCn1jRdlwpA
Rain Showers Are Coming
Mornin'! It's 30° in Wildwood NJ. It's mostly clear with Ms Sun rising over the horizon as I type. There are no breezes to note this morning. It's crisp outside but actually a stunning Winter's morning with the sea air and the gorgeous sunrise colors filling the senses. The morning will be mostly sunny but the cloud cover will thicken and by noon have taken over completely bringing along with it the possibility of rain showers. There's anywhere from 50-80% chance of rain the 2nd half of the day into this evening. Temps will rise into the upper 30s / low 40s with breezes commencing out of the E-SE at 7-10mph. Tonight... rains will probably end before midnight as temps stay in the upper 30s with breezes out of the S-SE at 3-6mph. The weekend's still looking 50-50 with tomorrow being mostly cloudy with peeks of Ms sun off and on and Sunday being rainy in the morning / cloudy in the afternoon with temps actually tapping 50°. We're springing forward on the clocks this weekend don't forget!
Partly Sunny / Partly Cloudy
Throwback Thursday - Circa 1965
Uncle Sonny, Aunt Joan and Cousin John on Wildwood Beach
Uncle Sonny passed away this week - RIP
Mornin'! It's 22° in Wildwood NJ. It's clear and starlit. There's no moon in the clearly lit sky along with no breezes to note. It's very still and quiet and even though it's cold, it doesn't have that mean bite in the air. It'll become a bit blustery later this morning after Ms Sun rises. It'll be a mostly sunny day with temps in the mid-upper 30s (it'll feel like upper 20s) with breezes out of the West at 15-20mph and switching to the W-NW by late this afternoon. Tonight... mostly cloudy, with temps barely tapping 30° and winds out of the NW at 8-11mph. Tomorrow... pretty much "crapola" as it'll be cloudy with showers beginning late morning / early afternoon with temps in the upper 30s. The weekend's looking "eh" with Saturday being the sunny day while Sunday's looking mostly wet and blustery with rain showers. Just a reminder... turning the clocks ahead this weekend.
Wildwood - New Jersey Avenue
Mornin'! It's 24° in Wildwood NJ. It's dark with partial cloud cover and stiff breezes out of the W-NW at 15-20mph giving us a biting windchill of 11°. No moon to speak of as it's a New Moon today. It'll be a mostly partly sunny day with blustery winds out of the W-NW at 20-24mph and temps in the upper 20s. That ol' windchill will feel like it's in the mid-teens. Tonight... clear, NW winds at 20-25mph with temps in the upper 20s (windchill... mid-teens). Tomorrow... less windy with temps back in the 30s. Remember the tides will be higher than normal today from the New Moon. It's the first day of Lent and two weeks until the first day of Spring. It'll also be the beginning of Daylight Savings this weekend as we Spring forward an hour and completely mess up our babies and pets timeclocks.
Low tide1:49p.m.
Happy Mardi Gras!
New Orleans - Mardi Gras 2018
Mornin'! It's 26° in Wildwood NJ. It's clear and starlit with barely a breeze (NW 3-6mph). No moon as tomorrow's the New Moon meaning the moon is almost invisible (it's when the moon is between the earth and the sun catching the sun's light on the side of the moon facing away from the earth). New or Full... this time period of the month is when the tides are extremely high and low due to the moon's pull. Anyway... Happy Mardi Gras! It's Fat Tuesday and Shrove Tuesday and Fastnacht Tuesday and the last day of Carnival Season (which began on January 6th). Lent begins tomorrow however way you look at it. It'll be a lovely winter's day here along the Coast this Fat Tuesday. Expect plenty of Sunshine with temps in the mid-30s with breezes out of the W-NW at 10-15mph. Tonight... clear, northerly breezes at 7-15mph and temps in the upper 20s / low 30s. Tomorrow... more of the same but a bit blustery.
Sunny Monday Dry Out
Mornin'! It's 36° in Wildwood NJ. No precipitation at the moment with light NW breezes at 6-8mph. No snow. No icy mix. Just rain coming down last evening and very early morning. The rains have stopped as the thick rain system hit the road awhile ago as the island's begun the dry out. No flooding (although my backyard is one big puddle from all the heavy downpours). It'll be a sunny day with temps in the upper 30s and NW winds ramping up at 15-25mph. Windchill is back as it'll feel like 30° out there today. Tonight... clear and cold with temps in the low 20s and very blustery NW winds at 15-25mph bringing on more of the biting wind chill. Tomorrow looks like another sunny day with 10° colder temps and more (you guessed it) windchill. Missed the "snow" bullet again but March's biting blustery winds and windchills will be making their presence known throughout this entire upcoming week. Don't put the scarf and gloves away yet!
Gray and Wet
Mornin'! It's 37° in Wildwood NJ. We're under partial cloud cover with no breezes to note. It's very calm and quiet except for the sound of the surf in the far off distance. My bets are on Ms Sun displaying her Sunday colors this morning as this cloud cover makes way for her; at least temporarily as another gray day with rain is on the way. Temps are moving up only a couple degrees to around 39-40° with breezes out of the E-NE at 7-11mph. There's a wet afternoon up ahead as rain showers are due in after Noon. By late afternoon into the evening... more rain with E-NE breezes at 10-15mph. Tonight... rain and/or a wintry mix with temps in the mid-upper 30s and breezes still out of the E-NE at 10-15mph. Tomorrow... rain and/or a wintry mix to start as it'll become a sunny day by late morning / early afternoon. We could see some effects of the New Moon this coming Wednesday with minor flooding as the tides are noticeably higher than normal. You just may want to keep an ear open for flood sirens in case you have to move your vehicle to higher ground.
Grayness Abounds
Mornin'! It's 37° in Wildwood NJ. We're totally saturated from the rain yesterday and last night. That wet weather system is finally out to sea but in its trail is grayness and cloudiness. There's not a dry spot to be had. In fact, it's a bit of a misty morning. Breezes are light out of the N-NW at 3-5mph. It'll be a mostly gray day with temps tapping 40° with breezes out of the W-NW at 8-10mph. There's no rain in today's forecast. In fact, we might see the sun barely peeking through off and on today. Tonight... partly cloudy, temps in the upper 30s and breezes out of the W-NW switching to the W-SW all at 4-8mph. Tomorrow... it starts out as a dry day with peeks of sun and by early afternoon the clouds and rains come again. Expect rain and/or a wintry mix from around 3p.m. until dawn Monday when Ms Sun begins to shine again in the late afternoon.
March Gets Crackin' On A Wet Note
Mornin'! It's 33° in Wildwood NJ. It's snowing at a good clip. It's got little ice pellets in the mix too as I can hear it hitting my obscured (by snow) skylight. It's wet and heavy and is laying on everything it hits. It's a beautiful seashore wonderland out there! Breezes are out of the N-NE at 3-5mph. The beauty will cease to exist by afternoon as this possible 1-3" is turning to rain by mid-day. Temps are expected to rise a bit to 39° with NE breezes ramping up at 15-25mph winds. Why not? It's March after all! It's hard to welcome March... not my Fav (it's my least favorite of all the months of the year). Tonight... cloudy with periods of rain, temps in the low mid-30s and of course the NE winds at 15-25mph that are staying checked in. Rainfall near a half an inch. Tomorrow will begin with rain, be a mostly cloudy Saturday as clear skies develop in the evening. Sunday... a cloudy day with light snow showers and rain in the late afternoon / early evening.
Daylight Savings Time - Sunset's at 7:00 O'clock T...


text:
ILLENIUM is one of the most successful crossover electronic artists today. Hailed by Billboard as one of the Top Dance/Electronic Artists of the 2010s and recognized as part of Forbes' 2020 30 Under 30 class, the Denver-based producer/DJ born Nick Miller has topped the U.S. charts, garnered more than 4 billion collective streams and headlined world-class festivals—all within a few short years.
After emerging as a then-unknown bedroom producer in 2013, ILLENIUM first broke through on the strength of his early independent releases, including his 2014 self-released Risen EP and his 2016 debut album, Ashes. His follow-up album, Awake, expanded his vision and cultural impact. Released in September 2017, Awake features the ILLENIUM classics "Crawl Outta Love," featuring Annika Wells; "Fractures," featuring Nevve; and "Feel Good," with Gryffin featuring Daya, the latter of which garnered +166 million Spotify streams and +25 million YouTube views. A critical and commercial success, Awake topped the iTunes Top Electronic Albums Chart in 12 countries with over 100 million streams.
Where Ashes and Awake formed the ILLENIUM sound, Ascend, released in August 2019 on Astralwerks, secured his arrival as dance music's newest crossover king. Serving as both his third full-length album and his major label debut, Ascend was one of the biggest electronic releases of the year, counting +1 billion collective streams, topping Billboard's Top Dance/Electronic Albums chart and securing a Top 20 hit on the Billboard 200 chart. The album is led by the cross-format hits "Takeaway" with The Chainsmokers featuring Lennon Stella and "Good Things Fall Apart" with Jon Bellion; "Crashing" featuring Bahari; "In Your Arms" with X Ambassadors; and lead single "Take You Down," the latter of which chronicles his past battles with drug addiction and his triumphant recovery.
Onstage, ILLENIUM brings his empowering music to life via his dynamic live show—fully equipped with live keyboards, drum pads and cinematic visuals—that's seen him dominate the world's leading festivals, including Coachella, Lollapalooza, Bonnaroo and EDC Las Vegas, as well as his own international solo tours. His 2017 Awake Tour saw ILLENIUM selling out major U.S. arenas and venues. In 2019, he launched his Ascend Tour, a 42-date North American trek featuring a massive production design comprising a five-piece live band, which included ILLENIUM on guitar alongside fellow electronic stars Dabin (guitar) and Said The Sky (keyboard). As his most ambitious live excursion to date, the Ascend Tour sold out landmark venues like Madison Square Garden in NYC, STAPLES Center in Los Angeles and three consecutive nights at the legendary Red Rocks Amphitheatre in Denver.
Now as a newly independent artist, joining 12Tone Music Group, ILLENIUM enters his next creative phase with upcoming music, set for release through 2020, that speaks directly to his fans and presents the same much-needed escape he's delivered over the years.
ILLENIUM Releases Highly-Anticipated Video for "Nightlight"
Get a First Look Into ILLENIUM's Upcoming Album with New Single "Nightlight"
"Hearts on Fire"
ILLENIUM and Dabin Feat. Lights- Hearts on Fire (Official Video)
ILLENIUM, Tom DeLonge, Angels & Airwaves- Paper Thin (Official Video)
ILLENIUM - Nightlight (Official Music Video)
© 2021 12Tone Music, LLC


Hoojobs is a job board that brings together hiring companies with Public Relations, Communications and Social Media talent.
Ballyhoo \bal"ly*hoo\: effort to increase the importance or reputation of by favorable publicity; to make positive features known; to popularize and promote.
Post a job now for 30 days for $299 or buy a 6-Post Package for $1500 (a savings of $294) and post your jobs whenever you want.
Feel free to contact us or give us a call at 917-464-3727.


Whether you're selecting a motor for a new application or a replacement for one that has failed, you need a reliable way to match the capabilities and performance characteristics of various motors with the requirements of the application.
Fortunately, motors that conform with NEMA Std. MG 1-2016 or IEC Std. 60034-8:2007 must include all nameplate data that the respective standards require. What this entails will vary with motor type and size, so for example, rated field and armature current data would be required for direct current (dc) motors but not for alternating current (ac) motors. The focus here is on how the required nameplate data for NEMA and IEC motors can be helpful for selecting the right motor for an application.


From textured paints and wall glazes to cork flooring, Bioshield covers walls and floors -- naturally. Many products are zero VOC; you can even mix your own casein paints from affordably priced dry powder and pigments.
Get BioShield Paint Companycontact information, plus see product reviews we've published about the company.


Portrait of the mogul as a young man: Bill Gates before the billions.
GCN marks its 25th anniversary this year (it debuted in 1982, when Time magazine named the computer its Man of the Year), and we will devote a little space in each issue to some of the significant IT developments of the past quarter-century.
'Bill Gates, Microsoft Corp. founder, at a joint meeting of the Integrated Software Federal Users Group and the Capital PC Users Group in Washington. The Intel 80386 processor gave Intel dominance in the chip market and gave rise to the PC clone industry. In fact, the chip is still being produced, though only for embedded systems. Intel has announced it plans to discontinue production in September.
"I think it's such a powerful distribution medium ' it really is ' that the word 'distribution' should almost be equated with CD-ROM."