text:
"""Utilities for installing Javascript extensions for the notebook"""

# Copyright (c) Jupyter Development Team.
# Distributed under the terms of the Modified BSD License.

from __future__ import print_function

import os
import shutil
import sys
import tarfile
import zipfile
from os.path import basename, join as pjoin, normpath

try:
    from urllib.parse import urlparse  # Py3
    from urllib.request import urlretrieve
except ImportError:
    from urlparse import urlparse
    from urllib import urlretrieve

from jupyter_core.paths import (
    jupyter_data_dir, jupyter_config_path, jupyter_path,
    SYSTEM_JUPYTER_PATH, ENV_JUPYTER_PATH,
)
from ipython_genutils.path import ensure_dir_exists
from ipython_genutils.py3compat import string_types, cast_unicode_py2
from ipython_genutils.tempdir import TemporaryDirectory
from ._version import __version__

from traitlets.config.manager import BaseJSONConfigManager
from traitlets.utils.importstring import import_item

DEPRECATED_ARGUMENT = object()

NBCONFIG_SECTIONS = ['common', 'notebook', 'tree', 'edit', 'terminal']

#------------------------------------------------------------------------------
# Public API
#------------------------------------------------------------------------------

def check_nbextension(files, user=False, prefix=None, nbextensions_dir=None, sys_prefix=False):
    """Check whether nbextension files have been installed

    Returns True if all files are found, False if any are missing.

    Parameters
    ----------

    files : list(paths)
        a list of relative paths within nbextensions.
    user : bool [default: False]
        Whether to check the user's .jupyter/nbextensions directory.
        Otherwise check a system-wide install (e.g. /usr/local/share/jupyter/nbextensions).
    prefix : str [optional]
        Specify install prefix, if it should differ from default (e.g. /usr/local).
        Will check prefix/share/jupyter/nbextensions
    nbextensions_dir : str [optional]
        Specify absolute path of nbextensions directory explicitly.
    sys_prefix : bool [default: False]
        Install into the sys.prefix, i.e. environment
    """
    nbext = _get_nbextension_dir(user=user, sys_prefix=sys_prefix, prefix=prefix, nbextensions_dir=nbextensions_dir)
    # make sure nbextensions dir exists
    if not os.path.exists(nbext):
        return False

    if isinstance(files, string_types):
        # one file given, turn it into a list
        files = [files]

    return all(os.path.exists(pjoin(nbext, f)) for f in files)

def install_nbextension(path, overwrite=False, symlink=False,
                        user=False, prefix=None, nbextensions_dir=None,
                        destination=None, verbose=DEPRECATED_ARGUMENT,
                        logger=None, sys_prefix=False
                        ):
    """Install a Javascript extension for the notebook

    Stages files and/or directories into the nbextensions directory.
    By default, this compares modification time, and only stages files that need updating.
    If `overwrite` is specified, matching files are purged before proceeding.

    Parameters
    ----------

    path : path to file, directory, zip or tarball archive, or URL to install
        By default, the file will be installed with its base name, so '/path/to/foo'
        will install to 'nbextensions/foo'. See the destination argument below to change this.
        Archives (zip or tarballs) will be extracted into the nbextensions directory.
    overwrite : bool [default: False]
        If True, always install the files, regardless of what may already be installed.
    symlink : bool [default: False]
        If True, create a symlink in nbextensions, rather than copying files.
        Not allowed with URLs or archives. Windows support for symlinks requires
        Vista or above, Python 3, and a permission bit which only admin users
        have by default, so don't rely on it.
    user : bool [default: False]
        Whether to install to the user's nbextensions directory.
        Otherwise do a system-wide install (e.g. /usr/local/share/jupyter/nbextensions).
    prefix : str [optional]
        Specify install prefix, if it should differ from default (e.g. /usr/local).
        Will install to ``<prefix>/share/jupyter/nbextensions``
    nbextensions_dir : str [optional]
        Specify absolute path of nbextensions directory explicitly.
    destination : str [optional]
        name the nbextension is installed to.  For example, if destination is 'foo', then
        the source file will be installed to 'nbextensions/foo', regardless of the source name.
        This cannot be specified if an archive is given as the source.
    logger : Jupyter logger [optional]
        Logger instance to use
    """
    if verbose != DEPRECATED_ARGUMENT:
        import warnings
        warnings.warn("`install_nbextension`'s `verbose` parameter is deprecated, it will have no effects and will be removed in Notebook 5.0", DeprecationWarning)

    # the actual path to which we eventually installed
    full_dest = None

    nbext = _get_nbextension_dir(user=user, sys_prefix=sys_prefix, prefix=prefix, nbextensions_dir=nbextensions_dir)
    # make sure nbextensions dir exists
    ensure_dir_exists(nbext)

    # forcing symlink parameter to False if os.symlink does not exist (e.g., on Windows machines running python 2)
    if not hasattr(os, 'symlink'):
        symlink = False

    if isinstance(path, (list, tuple)):
        raise TypeError("path must be a string pointing to a single extension to install; call this function multiple times to install multiple extensions")

    path = cast_unicode_py2(path)

    if path.startswith(('https://', 'http://')):
        if symlink:
            raise ValueError("Cannot symlink from URLs")
        # Given a URL, download it
        with TemporaryDirectory() as td:
            filename = urlparse(path).path.split('/')[-1]
            local_path = os.path.join(td, filename)
            if logger:
                logger.info("Downloading: %s -> %s" % (path, local_path))
            urlretrieve(path, local_path)
            # now install from the local copy
            full_dest = install_nbextension(local_path, overwrite=overwrite, symlink=symlink,
                nbextensions_dir=nbext, destination=destination, logger=logger)
    elif path.endswith('.zip') or _safe_is_tarfile(path):
        if symlink:
            raise ValueError("Cannot symlink from archives")
        if destination:
            raise ValueError("Cannot give destination for archives")
        if logger:
            logger.info("Extracting: %s -> %s" % (path, nbext))

        if path.endswith('.zip'):
            archive = zipfile.ZipFile(path)
        elif _safe_is_tarfile(path):
            archive = tarfile.open(path)
        archive.extractall(nbext)
        archive.close()
        # TODO: what to do here
        full_dest = None
    else:
        if not destination:
            destination = basename(normpath(path))
        destination = cast_unicode_py2(destination)
        full_dest = normpath(pjoin(nbext, destination))
        if overwrite and os.path.lexists(full_dest):
            if logger:
                logger.info("Removing: %s" % full_dest)
            if os.path.isdir(full_dest) and not os.path.islink(full_dest):
                shutil.rmtree(full_dest)
            else:
                os.remove(full_dest)

        if symlink:
            path = os.path.abspath(path)
            if not os.path.exists(full_dest):
                if logger:
                    logger.info("Symlinking: %s -> %s" % (full_dest, path))
                os.symlink(path, full_dest)
        elif os.path.isdir(path):
            path = pjoin(os.path.abspath(path), '') # end in path separator
            for parent, dirs, files in os.walk(path):
                dest_dir = pjoin(full_dest, parent[len(path):])
                if not os.path.exists(dest_dir):
                    if logger:
                        logger.info("Making directory: %s" % dest_dir)
                    os.makedirs(dest_dir)
                for file in files:
                    src = pjoin(parent, file)
                    dest_file = pjoin(dest_dir, file)
                    _maybe_copy(src, dest_file, logger=logger)
        else:
            src = path
            _maybe_copy(src, full_dest, logger=logger)

    return full_dest

def install_nbextension_python(module, overwrite=False, symlink=False,
                        user=False, sys_prefix=False, prefix=None, nbextensions_dir=None, logger=None):
    """Install an nbextension bundled in a Python package.

    Returns a list of installed/updated directories.

    See install_nbextension for parameter information."""
    m, nbexts = _get_nbextension_metadata(module)
    base_path = os.path.split(m.__file__)[0]

    full_dests = []

    for nbext in nbexts:
        src = os.path.join(base_path, nbext['src'])
        dest = nbext['dest']

        if logger:
            logger.info("Installing %s -> %s" % (src, dest))
        full_dest = install_nbextension(
            src, overwrite=overwrite, symlink=symlink,
            user=user, sys_prefix=sys_prefix, prefix=prefix, nbextensions_dir=nbextensions_dir,
            destination=dest, logger=logger
            )
        validate_nbextension_python(nbext, full_dest, logger)
        full_dests.append(full_dest)

    return full_dests

def uninstall_nbextension(dest, require=None, user=False, sys_prefix=False, prefix=None,
                          nbextensions_dir=None, logger=None):
    """Uninstall a Javascript extension of the notebook

    Removes staged files and/or directories in the nbextensions directory and
    removes the extension from the frontend config.

    Parameters
    ----------

    dest : str
        path to file, directory, zip or tarball archive, or URL to install
        name the nbextension is installed to.  For example, if destination is 'foo', then
        the source file will be installed to 'nbextensions/foo', regardless of the source name.
        This cannot be specified if an archive is given as the source.
    require : str [optional]
        require.js path used to load the extension.
        If specified, frontend config loading extension will be removed.
    user : bool [default: False]
        Whether to install to the user's nbextensions directory.
        Otherwise do a system-wide install (e.g. /usr/local/share/jupyter/nbextensions).
    prefix : str [optional]
        Specify install prefix, if it should differ from default (e.g. /usr/local).
        Will install to ``<prefix>/share/jupyter/nbextensions``
    nbextensions_dir : str [optional]
        Specify absolute path of nbextensions directory explicitly.
    logger : Jupyter logger [optional]
        Logger instance to use
    """
    nbext = _get_nbextension_dir(user=user, sys_prefix=sys_prefix, prefix=prefix, nbextensions_dir=nbextensions_dir)
    dest = cast_unicode_py2(dest)
    full_dest = pjoin(nbext, dest)
    if os.path.lexists(full_dest):
        if logger:
            logger.info("Removing: %s" % full_dest)
        if os.path.isdir(full_dest) and not os.path.islink(full_dest):
            shutil.rmtree(full_dest)
        else:
            os.remove(full_dest)

    # Look through all of the config sections making sure that the nbextension
    # doesn't exist.
    config_dir = os.path.join(_get_config_dir(user=user, sys_prefix=sys_prefix), 'nbconfig')
    cm = BaseJSONConfigManager(config_dir=config_dir)
    if require:
        for section in NBCONFIG_SECTIONS:
            cm.update(section, {"load_extensions": {require: None}})

def uninstall_nbextension_python(module,
                        user=False, sys_prefix=False, prefix=None, nbextensions_dir=None,
                        logger=None):
    """Uninstall an nbextension bundled in a Python package.

    See parameters of `install_nbextension_python`
    """
    m, nbexts = _get_nbextension_metadata(module)
    for nbext in nbexts:
        dest = nbext['dest']
        require = nbext['require']
        if logger:
            logger.info("Uninstalling {} {}".format(dest, require))
        uninstall_nbextension(dest, require, user=user, sys_prefix=sys_prefix,
            prefix=prefix, nbextensions_dir=nbextensions_dir, logger=logger)

def _set_nbextension_state(section, require, state,
                           user=True, sys_prefix=False, logger=None):
    """Set whether the section's frontend should require the named nbextension

    Returns True if the final state is the one requested.

    Parameters
    ----------
    section : string
        The section of the server to change, one of NBCONFIG_SECTIONS
    require : string
        An importable AMD module inside the nbextensions static path
    state : bool
        The state in which to leave the extension
    user : bool [default: True]
        Whether to update the user's .jupyter/nbextensions directory
    sys_prefix : bool [default: False]
        Whether to update the sys.prefix, i.e. environment. Will override
        `user`.
    logger : Jupyter logger [optional]
        Logger instance to use
    """
    user = False if sys_prefix else user
    config_dir = os.path.join(
        _get_config_dir(user=user, sys_prefix=sys_prefix), 'nbconfig')
    cm = BaseJSONConfigManager(config_dir=config_dir)
    if logger:
        logger.info("{} {} extension {}...".format(
            "Enabling" if state else "Disabling",
            section,
            require
        ))
    cm.update(section, {"load_extensions": {require: state}})

    validate_nbextension(require, logger=logger)

    return cm.get(section).get(require) == state

def _set_nbextension_state_python(state, module, user, sys_prefix,
                                  logger=None):
    """Enable or disable some nbextensions stored in a Python package

    Returns a list of whether the state was achieved (i.e. changed, or was
    already right)

    Parameters
    ----------

    state : Bool
        Whether the extensions should be enabled
    module : str
        Importable Python module exposing the
        magic-named `_jupyter_nbextension_paths` function
    user : bool
        Whether to enable in the user's nbextensions directory.
    sys_prefix : bool
        Enable/disable in the sys.prefix, i.e. environment
    logger : Jupyter logger [optional]
        Logger instance to use
    """
    m, nbexts = _get_nbextension_metadata(module)
    return [_set_nbextension_state(section=nbext["section"],
                                   require=nbext["require"],
                                   state=state,
                                   user=user, sys_prefix=sys_prefix,
                                   logger=logger)
            for nbext in nbexts]

def enable_nbextension(section, require, user=True, sys_prefix=False,
                       logger=None):
    """Enable a named nbextension

    Returns True if the final state is the one requested.

    Parameters
    ----------

    section : string
        The section of the server to change, one of NBCONFIG_SECTIONS
    require : string
        An importable AMD module inside the nbextensions static path
    user : bool [default: True]
        Whether to enable in the user's nbextensions directory.
    sys_prefix : bool [default: False]
        Whether to enable in the sys.prefix, i.e. environment. Will override
        `user`
    logger : Jupyter logger [optional]
        Logger instance to use
    """
    return _set_nbextension_state(section=section, require=require,
                                  state=True,
                                  user=user, sys_prefix=sys_prefix,
                                  logger=logger)

def disable_nbextension(section, require, user=True, sys_prefix=False,
                        logger=None):
    """Disable a named nbextension

    Returns True if the final state is the one requested.

    Parameters
    ----------

    section : string
        The section of the server to change, one of NBCONFIG_SECTIONS
    require : string
        An importable AMD module inside the nbextensions static path
    user : bool [default: True]
        Whether to enable in the user's nbextensions directory.
    sys_prefix : bool [default: False]
        Whether to enable in the sys.prefix, i.e. environment. Will override
        `user`.
    logger : Jupyter logger [optional]
        Logger instance to use
    """
    return _set_nbextension_state(section=section, require=require,
                                  state=False,
                                  user=user, sys_prefix=sys_prefix,
                                  logger=logger)

def enable_nbextension_python(module, user=True, sys_prefix=False,
                              logger=None):
    """Enable some nbextensions associated with a Python module.

    Returns a list of whether the state was achieved (i.e. changed, or was
    already right)

    Parameters
    ----------

    module : str
        Importable Python module exposing the
        magic-named `_jupyter_nbextension_paths` function
    user : bool [default: True]
        Whether to enable in the user's nbextensions directory.
    sys_prefix : bool [default: False]
        Whether to enable in the sys.prefix, i.e. environment. Will override
        `user`
    logger : Jupyter logger [optional]
        Logger instance to use
    """
    return _set_nbextension_state_python(True, module, user, sys_prefix,
                                         logger=logger)

def disable_nbextension_python(module, user=True, sys_prefix=False,
                               logger=None):
    """Disable some nbextensions associated with a Python module.

    Returns True if the final state is the one requested.

    Parameters
    ----------

    module : str
        Importable Python module exposing the
        magic-named `_jupyter_nbextension_paths` function
    user : bool [default: True]
        Whether to enable in the user's nbextensions directory.
    sys_prefix : bool [default: False]
        Whether to enable in the sys.prefix, i.e. environment
    logger : Jupyter logger [optional]
        Logger instance to use
    """
    return _set_nbextension_state_python(False, module, user, sys_prefix,
                                         logger=logger)

def validate_nbextension(require, logger=None):
    """Validate a named nbextension.

    Looks across all of the nbextension directories.

    Returns a list of warnings.

    require : str
        require.js path used to load the extension
    logger : Jupyter logger [optional]
        Logger instance to use
    """
    warnings = []
    infos = []

    js_exists = False
    for exts in jupyter_path('nbextensions'):
        # Does the Javascript entrypoint actually exist on disk?
        js = u"{}.js".format(os.path.join(exts, *require.split("/")))
        js_exists = os.path.exists(js)
        if js_exists:
            break

    require_tmpl = u"        - require? {} {}"
    if js_exists:
        infos.append(require_tmpl.format(GREEN_OK, require))
    else:
        warnings.append(require_tmpl.format(RED_X, require))

    if logger:
        if warnings:
            logger.warning(u"      - Validating: problems found:")
            for msg in warnings:
                logger.warning(msg)
            for msg in infos:
                logger.info(msg)
        else:
            logger.info(u"      - Validating: {}".format(GREEN_OK))

    return warnings

def validate_nbextension_python(spec, full_dest, logger=None):
    """Assess the health of an installed nbextension

    Returns a list of warnings.

    Parameters
    ----------

    spec : dict
        A single entry of _jupyter_nbextension_paths():
            [{
                'section': 'notebook',
                'src': 'mockextension',
                'dest': '_mockdestination',
                'require': '_mockdestination/index'
            }]
    full_dest : str
        The on-disk location of the installed nbextension: this should end
        with `nbextensions/<dest>`
    logger : Jupyter logger [optional]
        Logger instance to use
    """
    infos = []
    warnings = []

    section = spec.get("section", None)
    if section in NBCONFIG_SECTIONS:
        infos.append(u"  {} section: {}".format(GREEN_OK, section))
    else:
        warnings.append(u"  {}  section: {}".format(RED_X, section))

    require = spec.get("require", None)
    if require is not None:
        require_path = os.path.join(
            full_dest[0:-len(spec["dest"])],
            u"{}.js".format(require))
        if os.path.exists(require_path):
            infos.append(u"  {} require: {}".format(GREEN_OK, require_path))
        else:
            warnings.append(u"  {}  require: {}".format(RED_X, require_path))

    if logger:
        if warnings:
            logger.warning("- Validating: problems found:")
            for msg in warnings:
                logger.warning(msg)
            for msg in infos:
                logger.info(msg)
            logger.warning(u"Full spec: {}".format(spec))
        else:
            logger.info(u"- Validating: {}".format(GREEN_OK))

    return warnings

#----------------------------------------------------------------------
# Applications
#----------------------------------------------------------------------

from .extensions import (
    BaseExtensionApp, _get_config_dir, GREEN_ENABLED, RED_DISABLED, GREEN_OK, RED_X,
    ArgumentConflict, _base_aliases, _base_flags,
)
from traitlets import Bool, Unicode

flags = {}
flags.update(_base_flags)
flags.update({
    "overwrite" : ({
        "InstallNBExtensionApp" : {
            "overwrite" : True,
        }}, "Force overwrite of existing files"
    ),
    "symlink" : ({
        "InstallNBExtensionApp" : {
            "symlink" : True,
        }}, "Create symlink instead of copying files"
    ),
})

flags['s'] = flags['symlink']

aliases = {}
aliases.update(_base_aliases)
aliases.update({
    "prefix" : "InstallNBExtensionApp.prefix",
    "nbextensions" : "InstallNBExtensionApp.nbextensions_dir",
    "destination" : "InstallNBExtensionApp.destination",
})

class InstallNBExtensionApp(BaseExtensionApp):
    """Entry point for installing notebook extensions"""
    description = """Install Jupyter notebook extensions

    Usage

        jupyter nbextension install path|url [--user|--sys-prefix]

    This copies a file or a folder into the Jupyter nbextensions directory.
    If a URL is given, it will be downloaded.
    If an archive is given, it will be extracted into nbextensions.
    If the requested files are already up to date, no action is taken
    unless --overwrite is specified.
    """

    examples = """
    jupyter nbextension install /path/to/myextension
    """
    aliases = aliases
    flags = flags

    overwrite = Bool(False, config=True, help="Force overwrite of existing files")
    symlink = Bool(False, config=True, help="Create symlinks instead of copying files")

    prefix = Unicode('', config=True, help="Installation prefix")
    nbextensions_dir = Unicode('', config=True,
           help="Full path to nbextensions dir (probably use prefix or user)")
    destination = Unicode('', config=True, help="Destination for the copy or symlink")

    def _config_file_name_default(self):
        """The default config file name."""
        return 'jupyter_notebook_config'

    def install_extensions(self):
        """Perform the installation of nbextension(s)"""
        if len(self.extra_args)>1:
            raise ValueError("Only one nbextension allowed at a time. "
                         "Call multiple times to install multiple extensions.")

        if self.python:
            install = install_nbextension_python
            kwargs = {}
        else:
            install = install_nbextension
            kwargs = {'destination': self.destination}

        full_dests = install(self.extra_args[0],
                             overwrite=self.overwrite,
                             symlink=self.symlink,
                             user=self.user,
                             sys_prefix=self.sys_prefix,
                             prefix=self.prefix,
                             nbextensions_dir=self.nbextensions_dir,
                             logger=self.log,
                             **kwargs
                            )

        if full_dests:
            self.log.info(
                u"\nTo initialize this nbextension in the browser every time"
                " the notebook (or other app) loads:\n\n"
                "      jupyter nbextension enable {}{}{}{}\n".format(
                    self.extra_args[0] if self.python else "<the entry point>",
                    " --user" if self.user else "",
                    " --py" if self.python else "",
                    " --sys-prefix" if self.sys_prefix else ""
                )
            )

    def start(self):
        """Perform the App's function as configured"""
        if not self.extra_args:
            sys.exit('Please specify an nbextension to install')
        else:
            try:
                self.install_extensions()
            except ArgumentConflict as e:
                sys.exit(str(e))

class UninstallNBExtensionApp(BaseExtensionApp):
    """Entry point for uninstalling notebook extensions"""
    version = __version__
    description = """Uninstall Jupyter notebook extensions

    Usage

        jupyter nbextension uninstall path/url path/url/entrypoint
        jupyter nbextension uninstall --py pythonPackageName

    This uninstalls an nbextension.
    """

    examples = """
    jupyter nbextension uninstall dest/dir dest/dir/extensionjs
    jupyter nbextension uninstall --py extensionPyPackage
    """

    aliases = {
        "prefix" : "UninstallNBExtensionApp.prefix",
        "nbextensions" : "UninstallNBExtensionApp.nbextensions_dir",
        "require": "UninstallNBExtensionApp.require",
    }

    prefix = Unicode('', config=True, help="Installation prefix")
    nbextensions_dir = Unicode('', config=True, help="Full path to nbextensions dir (probably use prefix or user)")
    require = Unicode('', config=True, help="require.js module to load.")

    def _config_file_name_default(self):
        """The default config file name."""
        return 'jupyter_notebook_config'

    def uninstall_extensions(self):
        """Uninstall some nbextensions"""
        kwargs = {
            'user': self.user,
            'sys_prefix': self.sys_prefix,
            'prefix': self.prefix,
            'nbextensions_dir': self.nbextensions_dir,
            'logger': self.log
        }

        arg_count = 1
        if len(self.extra_args) > arg_count:
            raise ValueError("only one nbextension allowed at a time.  Call multiple times to uninstall multiple extensions.")
        if len(self.extra_args) < arg_count:
            raise ValueError("not enough arguments")

        if self.python:
            uninstall_nbextension_python(self.extra_args[0], **kwargs)
        else:
            if self.require:
                kwargs['require'] = self.require
            uninstall_nbextension(self.extra_args[0], **kwargs)

    def start(self):
        if not self.extra_args:
            sys.exit('Please specify an nbextension to uninstall')
        else:
            try:
                self.uninstall_extensions()
            except ArgumentConflict as e:
                sys.exit(str(e))

class ToggleNBExtensionApp(BaseExtensionApp):
    """A base class for apps that enable/disable extensions"""
    name = "jupyter nbextension enable/disable"
    version = __version__
    description = "Enable/disable an nbextension in configuration."

    section = Unicode('notebook', config=True,
          help="""Which config section to add the extension to, 'common' will affect all pages."""
    )
    user = Bool(True, config=True, help="Apply the configuration only for the current user (default)")

    aliases = {'section': 'ToggleNBExtensionApp.section'}

    _toggle_value = None

    def _config_file_name_default(self):
        """The default config file name."""
        return 'jupyter_notebook_config'

    def toggle_nbextension_python(self, module):
        """Toggle some extensions in an importable Python module.

        Returns a list of booleans indicating whether the state was changed as
        requested.

        Parameters
        ----------
        module : str
            Importable Python module exposing the
            magic-named `_jupyter_nbextension_paths` function
        """
        toggle = (enable_nbextension_python if self._toggle_value
                  else disable_nbextension_python)
        return toggle(module,
                      user=self.user,
                      sys_prefix=self.sys_prefix,
                      logger=self.log)

    def toggle_nbextension(self, require):
        """Toggle some a named nbextension by require-able AMD module.

        Returns whether the state was changed as requested.

        Parameters
        ----------
        require : str
            require.js path used to load the nbextension
        """
        toggle = (enable_nbextension if self._toggle_value
                  else disable_nbextension)
        return toggle(self.section, require,
                      user=self.user, sys_prefix=self.sys_prefix,
                      logger=self.log)

    def start(self):
        if not self.extra_args:
            sys.exit('Please specify an nbextension/package to enable or disable')
        elif len(self.extra_args) > 1:
            sys.exit('Please specify one nbextension/package at a time')
        if self.python:
            self.toggle_nbextension_python(self.extra_args[0])
        else:
            self.toggle_nbextension(self.extra_args[0])

class EnableNBExtensionApp(ToggleNBExtensionApp):
    """An App that enables nbextensions"""
    name = "jupyter nbextension enable"
    description = """
    Enable an nbextension in frontend configuration.

    Usage
        jupyter nbextension enable [--system|--sys-prefix]
    """
    _toggle_value = True

class DisableNBExtensionApp(ToggleNBExtensionApp):
    """An App that disables nbextensions"""
    name = "jupyter nbextension disable"
    description = """
    Enable an nbextension in frontend configuration.

    Usage
        jupyter nbextension disable [--system|--sys-prefix]
    """
    _toggle_value = None

class ListNBExtensionsApp(BaseExtensionApp):
    """An App that lists and validates nbextensions"""
    name = "jupyter nbextension list"
    version = __version__
    description = "List all nbextensions known by the configuration system"

    def list_nbextensions(self):
        """List all the nbextensions"""
        config_dirs = [os.path.join(p, 'nbconfig') for p in jupyter_config_path()]

        print("Known nbextensions:")

        for config_dir in config_dirs:
            head = u'  config dir: {}'.format(config_dir)
            head_shown = False

            cm = BaseJSONConfigManager(parent=self, config_dir=config_dir)
            for section in NBCONFIG_SECTIONS:
                data = cm.get(section)
                if 'load_extensions' in data:
                    if not head_shown:
                        # only show heading if there is an nbextension here
                        print(head)
                        head_shown = True
                    print(u'    {} section'.format(section))

                    for require, enabled in data['load_extensions'].items():
                        print(u'      {} {}'.format(
                            require,
                            GREEN_ENABLED if enabled else RED_DISABLED))
                        if enabled:
                            validate_nbextension(require, logger=self.log)

    def start(self):
        """Perform the App's functions as configured"""
        self.list_nbextensions()

_examples = """
jupyter nbextension list                          # list all configured nbextensions
jupyter nbextension install --py <packagename>    # install an nbextension from a Python package
jupyter nbextension enable --py <packagename>     # enable all nbextensions in a Python package
jupyter nbextension disable --py <packagename>    # disable all nbextensions in a Python package
jupyter nbextension uninstall --py <packagename>  # uninstall an nbextension in a Python package
"""

class NBExtensionApp(BaseExtensionApp):
    """Base jupyter nbextension command entry point"""
    name = "jupyter nbextension"
    version = __version__
    description = "Work with Jupyter notebook extensions"
    examples = _examples

    subcommands = dict(
        install=(InstallNBExtensionApp,"Install an nbextension"),
        enable=(EnableNBExtensionApp, "Enable an nbextension"),
        disable=(DisableNBExtensionApp, "Disable an nbextension"),
        uninstall=(UninstallNBExtensionApp, "Uninstall an nbextension"),
        list=(ListNBExtensionsApp, "List nbextensions")
    )

    def start(self):
        """Perform the App's functions as configured"""
        super(NBExtensionApp, self).start()

        # The above should have called a subcommand and raised NoStart; if we
        # get here, it didn't, so we should self.log.info a message.
        subcmds = ", ".join(sorted(self.subcommands))
        sys.exit("Please supply at least one subcommand: %s" % subcmds)

main = NBExtensionApp.launch_instance

#------------------------------------------------------------------------------
# Private API
#------------------------------------------------------------------------------

def _should_copy(src, dest, logger=None):
    """Should a file be copied, if it doesn't exist, or is newer?

    Returns whether the file needs to be updated.

    Parameters
    ----------

    src : string
        A path that should exist from which to copy a file
    src : string
        A path that might exist to which to copy a file
    logger : Jupyter logger [optional]
        Logger instance to use
    """
    if not os.path.exists(dest):
        return True
    if os.stat(src).st_mtime - os.stat(dest).st_mtime > 1e-6:
        # we add a fudge factor to work around a bug in python 2.x
        # that was fixed in python 3.x: http://bugs.python.org/issue12904
        if logger:
            logger.warn("Out of date: %s" % dest)
        return True
    if logger:
        logger.info("Up to date: %s" % dest)
    return False

def _maybe_copy(src, dest, logger=None):
    """Copy a file if it needs updating.

    Parameters
    ----------

    src : string
        A path that should exist from which to copy a file
    src : string
        A path that might exist to which to copy a file
    logger : Jupyter logger [optional]
        Logger instance to use
    """
    if _should_copy(src, dest, logger=logger):
        if logger:
            logger.info("Copying: %s -> %s" % (src, dest))
        shutil.copy2(src, dest)

def _safe_is_tarfile(path):
    """Safe version of is_tarfile, return False on IOError.

    Returns whether the file exists and is a tarfile.

    Parameters
    ----------

    path : string
        A path that might not exist and or be a tarfile
    """
    try:
        return tarfile.is_tarfile(path)
    except IOError:
        return False

def _get_nbextension_dir(user=False, sys_prefix=False, prefix=None, nbextensions_dir=None):
    """Return the nbextension directory specified

    Parameters
    ----------

    user : bool [default: False]
        Get the user's .jupyter/nbextensions directory
    sys_prefix : bool [default: False]
        Get sys.prefix, i.e. ~/.envs/my-env/share/jupyter/nbextensions
    prefix : str [optional]
        Get custom prefix
    nbextensions_dir : str [optional]
        Get what you put in
    """
    conflicting = [
        ('user', user),
        ('prefix', prefix),
        ('nbextensions_dir', nbextensions_dir),
        ('sys_prefix', sys_prefix),
    ]
    conflicting_set = ['{}={!r}'.format(n, v) for n, v in conflicting if v]
    if len(conflicting_set) > 1:
        raise ArgumentConflict(
            "cannot specify more than one of user, sys_prefix, prefix, or nbextensions_dir, but got: {}"
            .format(', '.join(conflicting_set)))
    if user:
        nbext = pjoin(jupyter_data_dir(), u'nbextensions')
    elif sys_prefix:
        nbext = pjoin(ENV_JUPYTER_PATH[0], u'nbextensions')
    elif prefix:
        nbext = pjoin(prefix, 'share', 'jupyter', 'nbextensions')
    elif nbextensions_dir:
        nbext = nbextensions_dir
    else:
        nbext = pjoin(SYSTEM_JUPYTER_PATH[0], 'nbextensions')
    return nbext

def _get_nbextension_metadata(module):
    """Get the list of nbextension paths associated with a Python module.

    Returns a tuple of (the module,             [{
        'section': 'notebook',
        'src': 'mockextension',
        'dest': '_mockdestination',
        'require': '_mockdestination/index'
    }])

    Parameters
    ----------

    module : str
        Importable Python module exposing the
        magic-named `_jupyter_nbextension_paths` function
    """
    m = import_item(module)
    if not hasattr(m, '_jupyter_nbextension_paths'):
        raise KeyError('The Python module {} is not a valid nbextension, '
                       'it is missing the `_jupyter_nbextension_paths()` method.'.format(module))
    nbexts = m._jupyter_nbextension_paths()
    return m, nbexts

if __name__ == '__main__':
    main()

redpajama_set_name: RedPajamaGithub


text:
Scientists Are Working On Mind Control Techniques To "Disable Parts Of The Brain" In Hopes Of "Weakening A Person's Faith In God" And "Changing Their Attitudes About Immigration"
In a bizarre study, a joint team of American and British scientists are claiming powerful magnetic pulses to the brain will temporarily change people's thoughts on a variety of topics, such as their belief in God and their stance on immigration.
Published in the Social Cognitive and Affective Neuroscience Journal, the report stated scientists used a unique metal coil to create strong magnetic fields around specific parts of the brain.
They later named this practice "Trancranial Magnetic Stimulation" and masked its real use as a treatment for depression.
Advertisement: CraftBeerClub.com-Monthly Club that Delivers the Finest American Craft Beer to Your Doorstep! Click here!
Much like hypnotism, the researchers are claiming targeting a certain part of the brain with the magnet will temporarily change people's beliefs and views.
According to the Independent:
The team, comprised of scientists from the University of York and the University of California, Los Angeles (UCLA), used 39 politically moderate students as test subjects.
The two were split into two groups – one, the control group, was given a sham dose of magnetism that was not strong enough to influence brain activity.
The other got a strong pulse of TMS that was strong enough to temporarily shut down their posterior medial frontal cortex (pMFC), a part of the brain that "plays a key role in both detecting discrepancies between desired and current conditions and adjusting subsequent behaviour to resolve such conflicts."
In other words, this part of the brain processes threats and conflicts, and decides how to respond to them.
Before receiving their doses of TMS, both groups were asked about their own deaths. In this area, the tests built on previous studies, which have shown that being confronted with the threat of death can alter a person's belief in God.
Some think this particular technique, along with others, have been used for decades by agencies like the CIA in a project called MKUltra.
Image Credit: onlyinfotech
Published in Conspiracy, Science and Technology
trancranial magnetic stimulation
Conspiracy , U.S.
Confessions Of A Dead Man: Personal Driver Of Jeffrey Epstein And Other Elites Tells All
Conspiracy , World
Massive Fire Spotted On Private Island Owned By Billionaire Jeffrey Epstein
Conspiracy , Crime
FLASHBACK: Leaked Surveillance Cameras Allegedly Show Children "Trapped" Inside "Underground Rooms" Located On Jeffrey Epstein's Private Island
Entertainment , Politics
FLASHBACK: California Governor's Wife Jennifer Siebel Newsom Played Hooker In 2007 Flick 'The Trouble With Romance'
Conspiracy , Entertainment , Opinion , Social Media
Joe Rogan EXPOSED: Popular Podcaster Is Secretly Funded By Twitter CEO Jack Dorsey And Billionaire George Soros
U.S. , Weird
VIDEO: Massive Pyramid-Shaped UFO Seen Hovering Over Pentagon
Conspiracy , Opinion
The Death Of Isaac Kappy: Was It Really A Suicide Or Is There More To The Story?
Conspiracy , U.S. , Weird

redpajama_set_name: RedPajamaCommonCrawl


text:
Чинампи (, з мови науатль) — плавучі острови, які створювали індіанці (ацтеки, майя) задля ведення сільського господарства. Чінампи давали декілька врожаїв на рік. Ацтек будували чінампи на озері Тескоко.

У болотистих низинах на ґрунт вбивали палі, потім з'єднували їх лозою. Всередину ділянок засипався метровий шар землі. В дощові сезони чінампи ставали островами. На припіднятті поля постійно додавались органічні рештки водяних рослин, що дозволяло постійно підтримувати на високому рівні родючість ґрунту.

Розквіт цієї системи землеробства припадає на 600—900 рр.

Штучні острови
Економіка ацтеків

redpajama_set_name: RedPajamaWikipedia


We are offering LCL Import Custom Clearing Services to our valubale clients.
As per the detailed requirements of our valued clients, we are actively involved in offering a wide array of LCL Import Custom Clearing Services to the customers. With the help of an experienced team of workers we are rendering these services within the promised period of time. These services are preferred choice of the customer owing to their customization and reliability. Apart from this, one can avail these products at nominal prices from us.
Looking for LCL Import Custom Clearing Services ?


Beautifully maintained updated 3 bedroom, 2 bath home with Formal living room with certified Blaze King, gas heat, A/C, separate den/family room and a lovely cheery sun room. Great kitchen with stainless appliances. All on .27 acre, with a 16×16 shop, green house, covered deck, RV parking and dog run. Private back yard with many perennials and privacy fenced.


text:
Worldwide tablet shipments continue to decline in Q120
By Back End News on May 4, 2020
The ongoing COVID-19 pandemic furthered the decline of the worldwide tablet market as global shipments fell to 24.6 million units, down 18.2% year over year during the first quarter of 2020 (1Q20), according to preliminary data from the International Data Corp. (IDC) Worldwide Quarterly Tablet Tracker.
Detachables continued to grow and gain market share with year-over-year growth of 56.8%, mainly driven by iOS devices, while slate tablets saw shipments decline 36.4% compared to the first quarter of 2019.
Apple continued to be the top vendor although a large number of shipments throughout 2019 and the closure of factories in the first quarter (due to COVID-19) led the company to produce fewer units than expected, leading to a significant decline of 30.4%. However, the company still leads in the detachable market as every iPad with the exception of the mini now offers a detachable keyboard. This positions Apple's tablet lineup as one that can cater to productivity as much as entertainment.
IDC: Shipments of PCs and tablets to continue slow decline through 2023
IDC: Traditional PC shipments saw sharp decline in Q120
Samsung retained the number two position and recorded shipment growth of 3.9% year over year. Even with the ongoing global crisis, the company managed to ship five million units in the quarter as many customers resorted to buying devices for e-learning and work from home. There was growth across both the detachable and slate portfolios. Samsung also launched the Galaxy Tab S6 5G, making the company the first vendor to introduce 5G in tablets, however, the model was not released across many geographies.
Huawei shipped three million units in 1Q20 for a year-over-year decline of 8.3%. The company managed to record growth across its detachable portfolio, however, the company's shipments are predominantly from their slate tablets and hence the growth in detachables did not compensate for their overall tablet shipment decline. Additionally, the company continues to struggle in markets outside China due to political backlash and the lack of Google services.
Lenovo moved up to the fourth position and was one of the two companies in the top 5 with positive growth. The company shipped 1.6 million units for year-over-year growth of 1.9%. This growth was mainly from Japan, the USA, and Western Europe while most of the other regions recorded a decline.
Amazon.com secured its place in the fifth position with a year-over-year decline of 24.5%. The company also lost share from 6.3% in 1Q19 to 5.8% in the most recent quarter. While Western Europe has been able to slightly increase its shipment share in the past few quarters, the United States still accounted for more than three-quarters of the company's sales and continued to be the biggest driver.
Categories: Devices
Tagged as: idc, International Data Corp., tablet, Tablet Shipments, Tablets
78% of Filipinos say network connections key to employment opportunities
MediaTek enables Android phones with cutting-edge AV1 video codec technology
Published by Back End News
View all posts by Back End News


text:
Battery & Fuel Cell >
Apr 6, 2019 - 12:10 pm
Daimler starts building new battery sub-plant
battery assemblyBattery productionBrühlDaimlerGermanyMercedes-Benz CarsUntertürkheim
Daimler company Mercedes Benz Cars has now begun construction work on the planned battery sub-plant on its Brühl site situated at the company's home grounds in the Stuttgart district of Untertürkheim. Batteries for future electric vehicles of the EQ family will soon be assembled on an area of 12,000 square meters.
The sub-plant is to be inaugurated as part of Mercedes-Benz's own global battery production network. "The laying of the foundation stone (…) is a good signal for the sustainability of mobility and a commitment to the location," says Daimler CEO Dieter Zetsche. "Battery factory at the Brühl sub-plant stands for our promise to make both our cars as well as their production even greener. In future, we will assemble the heart of the electric car – the battery – here ourselves"
Daimler is investing more than one billion euros in the battery production network being set up under the umbrella of Mercedes-Benz Cars. This currently consists of nine (planned) factories at seven locations on three continents: In Germany, a battery assembly plant has in operation since 2012 in Kamenz, Saxony, and a second battery factory is being built there that is scheduled to start operation this spring. Then there are the three plants in and around Stuttgart; a planned plant in Sindelfingen, near Stuttgart, plus the two sub-plants in the Stuttgart districts of Unterkücken and Hedelfingen, which includes the Brühl sub-plant mentioned above. Overseas battery production is currently under construction in Beijing (China), in Tuscaloosa (USA) and in Bangkok (Thailand). Jawor in Poland will be added as the ninth location at the beginning of the next decade.
The current e-mobility offensive at the company's home base grounds in Untertürkheim, Stuttgart was preceded in 2017 by a long dispute between the management and the works council. Both sides finally agreed to further develop the plant into a "high-tech location" for electrical components. Against this background, it was decided to establish a new battery assembly facility on site as well as the assembly of electric drive modules for front and rear axles. Currently, 19,000 employees work in the six parts of the Untertürkheim grounds.
Michael Häberle, Works Council Chairman Mercedes-Benz Untertürkheim Plant said that: "Many colleagues working in gasoline and diesel engine production have to be qualified for the new alternative powertrains and especially for working on the high-voltage systems. We have signed a job security agreement with the company through to the end of 2029. That is why investments in issues with long-term prospects are necessary at the location. This includes today's ground-breaking for the battery factory."
The battery production network is a key element the Mercedes-Benz Cars strategy to electrify its entire portfolio from 2022 and offer various electrified alternatives in each segment – including more than ten purely electric cars. The Stuttgart-based company assembles the batteries itself and purchases the cells required for this from CATL, among others.
daimler.com
Author: Carrie Hampel
Innolith battery said to achieve 4 x energy density
Volkswagen and Ganfeng launch lithium cooperation
https://www.electrive.com/2019/04/06/daimler-begins-the-next-plant-in-its-battery-production-network/


romaticsexlatin . BlueEyedFloyd. BrianNICE. SeexyyGirl.
HayleyEffectAndrewCoxFR0MheavensHellenBlue .BabieYourHotDreammhotkagneyAddilynn .alettaoceanxxxViolkaTKviol3thazeAnnaAlexys .BlondyStacysaltandpepper30TipForTitslongleggedcat .HellenBlueBellaLissaAChloeNightCarlaFlame .HardSexyLoverXLAprilCatiniBellaLissaBlueEyedFloyd .CrazyIrisEbonyPoissonTienGirlBabie .3livesquirtRussellSmoothLadyMonniquewickedwest123 .sexyboyalexx69YourHotDreammwickedwest123QUEEN0ftheDAMNED .DginaKlodCarlaFlame3livesquirtBlueEyedFloyd .OnlySex2YouXaickaxxChloeBrillanceAlmaCastell .
DianahotSSSBabieBabieLovesKelly .HotLatinBootyStassiAkiAiriCamilaDayDreams .RudeBoyEternalHellenBlueViolkaTKGaryKenneth .JoanaFoxxLovesKellyHellenBlueBlueEyedFloyd .DginaKlodAbbyGreyAshleyWilsonAshleyWilson .AndrewCoxSweetJakeBlueEyedFloydHotLatinBooty .LadyMonniqueviol3thazeA0InnaSaraVianni4u .ChloeBrillanceDianahotSSSSeexyyGirlAshleyWilson .sweetprettyguySummerAlexiaLiliFAlmaCastell .SummerAlexiaDIRTYSEBASSEmmaShemaleManuelaHotForYou .DIRTYSEBASSYourHotDreammEmmaShemaleJulianJohnston .


text:
Inspired by the landscape & large Catholic family, Jones seeks ninth year in parliament
by Sarah Gore | May 10, 2019 | Govt & Politics, News
Stephen Jones is re-contesting his seat of Whitlam in the upcoming election – a seat he sits in with pride.
"I am proud of the region where I grew up, the Illawarra— the place where I first acquired my interest in politics. The Illawarra is the place where I learned that the Australian Labor Party is part of a broad, progressive movement committed to social justice and to equity," Mr Jones said in his maiden speech.
He entered politics in 2010 after a successful career in the union movement – first as a lawyer and then as secretary.
The blue-collar seat of Whitlam touts mining, engineering and manufacturing as its key industries. The 110,000-plus voters in Whitlam have typically supported the union-affiliated Labor Party, who have held the seat since 1984.
It's not only unionism that attracts Mr Jones to his hometown, he's also enamoured with its landscape.
Mr Jones has spent a large amount of time passionately talking about the views of the Illawarra from a small patch of grass halfway down Macquarie Pass.
"From where you stand you see the defining feature of the electorate; it is the rugged and beautiful Illawarra Escarpment," he said.
"It is a segment of the Great Dividing Range. At first it was a source of cedar and then coal. It is the cause of our prodigious rainfall and our summer storms.
For eons it has also been the passage through which human beings have travelled in exchange of culture, artefacts and food and it is now a passage to the coast."
Mr Jones also credits his large family for instilling hard-working values.
"I come to this parliament believing that the values that formed around the dinner table of a large Catholic family, and on the creaking wooden desks towered over by the Sisters of the Good Samaritan, and later the Christian Brothers, will help me to serve my electorate, my party and my country," he said.
Heading into the election campaign, Mr Jones is held a number of parliamentary party positions, including Assistant Shadow Minister for Health, Shadow Minister for Regional Communications and Shadow Minister for Regional Services, Territories and Local Government.


text:
Danny Simpson
Danny Simpson says Toon can turn it around
DEFIANT Danny Simpson today insisted Newcastle United still have the quality to stay out of the Premier League danger zone this season.
Get the biggest Newcastle United FC stories by email
The Magpies capitulated at the Hawthorns to make it five games without a win since beating table-toppers Arsenal last month.
However, Simpson feels his team-mates have the answers to the problems bamboozling the black-and-whites.
Right-back Simpson claims United are learning their lessons in the Premier League, but need to start banking points fast to stave off the threat of a second relegation in three seasons.
Simpson was naturally down after the Hawthorns defeat – but certainly not out.
He told the Chronicle: "We can turn it round.
"With the way this league is this season we know can.
"We are doing better against the bigger teams this season for some reason.
"We need to put this defeat behind us and start thinking about Liverpool."
United hit the dizzy heights of the top seven after beating Arsenal a month ago at the Emirates, but there has been more pain than pleasure since that victory in the capital.
Simpson added: "I don't think we have overachieved.
"We have a good squad, but in the first part of the season we stuck to our game plan and did not make mistakes or concede silly goals.
"In the last few games we have made errors at the back."
Simpson believes Newcastle are still readjusting to life in the Premier League.
He said: "The facts are if you make a mistake in the Championship you can get away with it, but in the Premier League you will be punished.
"West Brom had nothing until we started making mistakes and losing the ball."
Simpson, though, still had respect for the Baggies.
He added: "They kept the ball well and, although we did not have much of the ball, I could not see them scoring."
Now Simpson is after a big improvement from the Toon's back four.
He said: "We need to stop conceding goals and individually it has been happening quite a lot.
"To go a goal down away from home it was always going to be a struggle.
"In the second half we started well and it looked like we could get back in – we had a couple of chances.
"When it went to 2-0, though, it is hard to come back, especially after conceding a sloppy goal.
"Now we just have to keep things positive and try to put it right."
Newcastle United FC NewsletterPrivacy notice
Subscribe to our Newcastle United FC newsletterPrivacy noticeEnter email Subscribe


We visited the company Blacklane, a global professional driver service. Here is the interview – and have a look at the team and their cool & stylish HQ office in Berlin.
Blacklane, founded in 2011, is the global professional driver service, covering the first and last miles of your journey. We provide peace of mind for passengers and drivers in more than 50 countries, 250 cities and 500 airports around the world.
We guarantee high-quality rides at fair, fixed and all-inclusive rates. All drivers are commercially licensed and insured.
Our state-of-the-art systems and a multi-lingual 24/7 Customer Service team coordinates tens of thousands of quality cars in real time. You can schedule rides on our website or iOS or Android apps.
Our core business is professional driver services. This includes transfers and hourly bookings in any of our 250 cities in 50 countries as well as our events service.
Blacklane partners with limousine service providers around the globe and matches demand and supply on an international scale. Bookings from global customers come in through our website and apps or distribution partners and are then offered to our partners. They have the liberty to accept the offered bookings when they fit with their schedule.
The two founders, Jens Wohltorf and Frank Steuer, had been friends for years.
They first met at Berlin's Technical University lab for Distributed Artificial Intelligence in 2002, and although their careers led them in different directions, they always had the idea to work together.
In 2009 Jens was a Principal at BCG in Chicago and traveling almost all the time. But while flights and hotels were pretty easy to organize and manage, the ground transportation piece was always painful: receipts, multiple currencies, fragmented car service companies and taxis around the world with wildly differing quality standards. This made him dislike Monday mornings and Friday evenings.
It was a combination of Jens' observations and Frank's technological expertise that led to the idea for Blacklane. Frank flew over to the US, they talked the idea through and decided that there would be a huge opportunity in unifying this inefficient industry. Blacklane was born in September 2011.
Blacklane is currently available in more than 250 cities and 500 airports in 50 countries, which you can view here.
Blacklane recently expanded its footprint in the Asia Pacific Region by adding 64 new cities to our portfolio. We will continue to expand where our customers are traveling to best serve them.
Blacklanes aspires to take the stress out of travel. We want to close the missing link in the travel chain: the first and last miles of your trip. To achieve that, we will continue launching new cities, improving the online and physical experiences and partnering with the world's best limousine service providers.
Are you investing in other ventures?
At the moment this is not something we are pursuing.
We currently employ around 220 people and we are looking for more.
The average age at Blacklane is currently 32 years.
Working at Blacklane means taking on responsibility for your own tasks, thinking and acting across departments, and supporting your co-workers. The means going the extra mile and being creative.
Blacklane is a special place to work: It offers the agile, informal aspects of a startup while at the same time the professionalized processes and workflows of larger companies. We are currently 220 people in two offices, and we have more than 40 nationalities in our workforce. The global background and variety of degrees of seniority make our team colourful and diverse.
Yes, we do offer relocation support. We often hire people from outside Germany and quite a few from outside the European Union. This means helping out with visa proceedings and finding a place to live, if needed. We also offer language classes to help non-Germans integrate better and empowering them for life in Germany.
We have a spacious and beautiful former factory building in Berlin-Schöneberg, which was built in 1902. The building has 5 floors, partly in use by Blacklane and partly by two other companies. In addition, we opened an office in Singapore earlier this year.
No, Blacklane is extremely lucky to have a wonderful in-house office management team in place that went above and beyond to not only design such an appealing and functional office space but also working hard to maintaining its beauty and the historic character of the building.
Thank you Blacklane Team for this interview & the photoshooting!


text:
Home / News / : Penn National, DraftKings highlight October slump for sports betting stocks
: Penn National, DraftKings highlight October slump for sports betting stocks
Since the U.S. Supreme Court struck down the Professional and Amateur Sports Protection Act (PASPA) in 2018, sports-betting companies have surged in popularity. In response, sports betting companies have begun jockeying for customers in a "gold rush" style of competition.
As of the end of November, 30 U.S. states, as well as Washington, D.C., offer some form of legalized sports wagering, according to the American Gaming Association.
Many sports-betting operators are also publicly held companies, and some have non-sports betting aspects of their business, like entertainment and casino operations.
Here is how sports-betting stocks performed in November:
Shares of DraftKings Inc.
DKNG,
plummeted 26.4% in November, drastically underperforming a roughly 1.03% drop from the S&P 500
SPX,
over the same period.
DraftKings is coming off a rough October that saw more losses for its stock price.
During the company's third-quarter earnings report, the Boston-based sports betting company posted widening losses and revenue that missed forecasts.
"On a same state basis and taking into consideration lower than expected hold primarily due to NFL game outcomes, third quarter revenue would have been $40 million higher," the company stated.
Along with Zillow
and Virgin Galactic
SPCE,
DraftKings joined MarketWatch's list of stocks that are down at least 50% from their 2021 highs.
DraftKings is down 32.68% YTD.
Penn National Gaming
Shares of Penn National Gaming Inc.
PENN,
sunk 28.9% in November after a tumultuous month.
On Nov. 4, Penn National lost $2.69 billion in valuation after an earnings miss, the most the gambling company has lost from a stock decline in its 27-year history on the public markets, according to Dow Jones Market Data.
Additionally, allegations emerged against Dave Portnoy, founder of Penn-owned Barstool Sports, detailing occasions where he was aggressive and rough with women. According to the story from Business Insider, one woman who had intimate relations with Portnoy said she felt like she was a "human sex doll." Another woman said she fought mental health issues like depression after their encounter.
Portnoy denied many of the allegations, calling them "jarring," before adding that "cancel culture has been coming for me for a decade."
Penn was also not chosen as an approved sports betting operator by the New York State Gaming Commission, and therefore cannot accepts legal wagers in the state.
Penn National Gaming is down 44.5% YTD.
Shares of Caesars Entertainment Inc.
CZR,
dropped 17.9% in November, joining other slumping sports betting stocks.
Caesars did get some good news however when it was selected as one of the nine approved sports betting operators in New York.
The New York State Gaming Commission also approved sports betting licenses for DraftKings, FanDuel, Bally Sports
BALY,
BetMGM, PointsBet, WynnBet, Kambi and Resorts World.
Caesars is up 13.92% YTD.
Shares of Wynn Resorts Ltd.
WYNN,
dropped 9.9% in November amid news of the new Omicron variant of the coronavirus.
Wynn's robust in-person casino business could be impacted by any new restrictions related to further outbreaks of COVID-19, especially in the tourist-heavy Las Vegas. Such volatility in the company's stock was apparent in the early stages of the COVID-19 pandemic in 2020.
As stated above, Wynn's online gaming organization WynnBet was recently approved for a sports betting license in New York.
Wynn is down 31.29% YTD.
Shares of MGM Resorts
MGM,
dropped 16.56% in November after reporting a surprise profit for the company's third quarter.
MGM also recently stated it intended to sell operations of The Mirage hotel and casino on Las Vegas Strip.
"We are committed to continuing to maintain and develop our existing Las Vegas portfolio with no plans for other changes on the Strip at this time," Chief Executive Bill Hornbuckle said in a letter to employees.
MGM Resorts is down 23.61% YTD.
The NFL season is one of the busiest times of the year for U.S. sportsbooks, and many states including Virginia and New Jersey have already set state betting records.
The Roundhill Sports Betting & iGaming ETF
BETZ,
a tier-weighted index of global sports-betting & iGaming companies, is down 26.06% over the past three months, compared with the S&P 500, which is up 0.66% over that same period.
Cannabis Watch: Green Thumb Industries rallies as profit doubles
US productivity is stalling out and employees are less willing to 'engage in hustle culture,' as 1 in 5 Americans admit to doing the 'bare minimum' at work
Next Avenue: 'You think you know someone until you work 100-hour weeks together.' How to keep the peace in the family business.
Next Avenue: These new retirement communities sound ideal, so why do so many towns resist them?
The Ratings Game: 'It's not an earnings release, it's a crime scene': Analysts, and social media, react to Intel's awful quarter.


text:
Q: Composition of Partially Ordered Sets Prove or disprove: If $R$ and $S$ are partial orderings on $A$, then $R \circ S$ is a partial ordering on $A$.
I started out defining $R$ and $S$ but I am unsure how to use the definition of partially ordered sets to prove that the composition of the two are also partially ordered. Also one thing I have been thinking is how can you guarantee the composition of these two exist?

A: Here is a counter example
Take $A = \{1, 2, 3 \}$
$R = \{ (1, 1), (2, 2), (3, 3), (1, 2)\}$
$S = \{(1, 1), (2, 2), (3, 3), (2, 3), (3, 1), (2, 1)\}$
$S \circ R = \{(1, 1), (2, 2), (3, 3), (2, 3), (2, 1), (3, 1), (1, 2), (1, 3)\}$
But $S \circ R$ is not antisymmetric
So it's not a partial order

A: Here $R \subseteq AXA$  and   $S \subseteq AXA$ are the two relations .. now composition $S \circ R$ is defined by
$ (a, b) \in S \circ R \iff  \exists$ $x \in  A$ such that $(a, x) \in R \land (x, b) \in S$
.. use this as definition .. and after that every thing falls in place automatically ..

redpajama_set_name: RedPajamaStackExchange


text:
Die Communauté de communes de la Vallée du Prunelli ist ein ehemaliger französischer Gemeindeverband mit der Rechtsform einer Communauté de communes im Département Corse-du-Sud in der Region Korsika. Sie wurde am 17. Dezember 2003 gegründet und umfasste sechs Gemeinden. Der Verwaltungssitz befand sich im Ort Bastelicaccia.

Historische Entwicklung
Mit Wirkung vom 1. Januar 2017 wurde der Gemeindeverband aufgelöst und seine Mitgliedsgemeinden auf die Communauté de communes de la Haute Vallée de la Gravona und die Communauté de communes de la Pieve de l'Ornano et du Taravo aufgeteilt.

Ehemalige Mitgliedsgemeinden
 Bastelica
 Bastelicaccia
 Cauro
 Eccica-Suarella
 Ocana
 Tolla

Vallee du Prunelli
Gegründet 2003
Aufgelöst 2016


text:
Bagassi is a town in the Bagassi Department of Balé Province in southern Burkina Faso. It is the capital of the Bagassi Department and the town has a total population of 2977.

References

External links
Satellite map at Maplandia.com

Populated places in the Boucle du Mouhoun Region
Balé Province


text:
var buster = require("buster-core");

module.exports = {
    create: function (opt) {
        var reporter = buster.create(this);
        opt = opt || {};
        reporter.io = opt.io || require("util");
        reporter.testCount = 0;
        reporter.contexts = [];

        return reporter;
    },

    listen: function (runner) {
        runner.bind(this, {
            "suite:end": "suiteEnd", "context:start": "contextStart",
            "context:end": "contextEnd", "test:success": "testSuccess",
            "test:start": "testStart", "test:deferred": "testDeferred",
            "test:failure": "testEnd", "test:error": "testEnd",
            "test:timeout": "testEnd", "context:unsupported": "contextUnsupported"
        });

        return this;
    },

    suiteEnd: function () {
        this.io.puts("1.." + this.testCount);
    },

    contextStart: function (context) {
        this.contexts.push(context.name);
    },

    contextEnd: function () {
        this.contexts.pop();
    },

    contextUnsupported: function (data) {
        var name = data.context.name;
        var features = data.unsupported;
        var plural = features.length > 1 ? "s" : "";
        this.testCount += 1;
        this.io.puts("not ok " + this.testCount + " " + name + " # SKIP " +
                     "Unsupported requirement" + plural + ": " + features.join(", "));
    },

    testStart: function (test) {
        this.testCount += 1;
        test.name = this.contexts.concat([test.name]).join(" ");
        this.test = test;
    },

    testSuccess: function (test) {
        this.test.passed = true;
        this.testEnd(test);
    },

    testDeferred: function (test) {
        this.test.deferred = true;
        this.test.comment = test.comment;
        this.testEnd(test);
    },

    testEnd: function (test) {
        this.io.puts(label(this.test) + this.testCount + " " +
                     this.test.name + directive(this.test));
    }
};

function directive(test) {
    return test.deferred ? " # TODO " + (test.comment || "Deferred") : "";
}

function label(test) {
    return test.passed ? "ok " : "not ok ";
}


On Tuesday, May 7, the Minnesota Spokesman-Recorder (MSR) newspaper sponsored its 19th Annual Graduation Celebration to acknowledge African and African American senior students finishing high school. This year's event was held at Sabathani Community Center in South Minneapolis.
Scholarship winners (l-r) Evan Beto, Kayla Wright, Tour'e Walter Gates, MSR Publisher and CEO Tracey Williams-Dillard, Cara Claflin, Devyn Smith and Mohamed Malim.
Shed G, co-host of The KMOJ Radio Morning Show, emceed the event, which awarded six graduates Cecil E. Newman Scholarships and two graduates Launa Q. Newman scholarships.
Cecil Newman is the founder of MSR; his wife, Launa Q. Newman, carried on as publisher after her husband's death. The food served was home style, with many in attendance returning for seconds. Keynote speaker University of St. Thomas School of Law Professor Nekima Levy-Pounds addressed the importance of this generation taking up the baton of social and economic justice and running hard with it, as there remains much work to be done.


Solar power is a heavyweight in the renewable category, and is growing at 40% annually, faster than any other form of electricity generation on the planet! Asia is playing a key role in the development of the global solar energy industry.
Solar Energy Asia 2008 will provide the largest Asian networking platform where key players from the Solar Energy Industry including energy users and producers, manufacturers of energy equipment, parts and supplies, builders, architects, solution providers, investors, analysts, regulators and other solar energy industry specialists will gather to discuss the latest strategic, regulatory, technical and economic issues, identifying viable business ventures and form strategic partnerships in a fast evolving industry.
The Washington International Renewable Energy Conference (WIREC 2008) will bring together government, civil society and private business leaders to address the benefits and costs of a major and rapid scale-up in the global deployment of renewable energy technology.


text:
'He Is in a Good Place Mentally'
On Saturday, Calvin Kattar will return to his Ultimate Fighting Championship in the UFC headline fight on ESPN 32. Kattar (22-5, 6-3 UFC) has been on the sidelines for a year after dropping a unilateral decision on earlier featherweight kingpin Max Holloway at UFC on ABC 1. In that fight, "Blessed" got 50-43, 50-43 and 50-42 nods from the judges after showing supremacy in boxing. A lesser man might not have made it through five rounds on this version of Holloway, but Kattar bit his mouthpiece and survived to hear the judges' decision. According to Kattar's trainer and manager, Tyson Chartier, the fight had no impact on the mentality of "The Boston Finisher," ready to step back into the Octagon and prove his worth against the resounding gig Chikadze.
"I think there was a misunderstanding in the media, maybe this fight shook his confidence or something, but he's still hungry," Chartier told Sherdog. "[That fight] showed him like, 'Okay, I have to feel that level, now I have to figure out how to get there.' That's what the last year was all about resting and then figuring out how to get to the next level. Mentally he's in a good position, we had a great camp, I think 13 weeks, now we've been sitting for almost 14 weeks that we've already been in camp, so [there was] plenty of time to prepare for Giga. It was good. I have seen [Calvin] improve enormously both physically and mentally in these 14 weeks. It's almost like the guys are back together. It's been a year, I missed it, I'm glad he's going out and competing next [Saturday]. "
After the turmoil that engulfed the £ 145 division in the last few days after Holloway's withdrawal from the championship trilogy clash with Alexander Volkanovski, Chartier stated that the UFC had not reached out to promote the Chikadze-Kattar affair as title eliminator . He also discussed the camp they had for Chikadze and made his prediction for the fight.
Time stamp:
(00:00) Introduction
(02:00) Calvin's mental and physical situation
(03:16) The adjustments they made after the Holloway fight
(04:10) Get Ross Levine to imitate Chikadze's style
(05:25) His thoughts on the situation in the featherweight class
(06:45) Whether they are following a title fight in the event of a win
(08:27) Who should fight for the championship next?
(10:18) His prediction for the fight
(10:59) Selection of Francis Ngannou – Ciryl Gane
(11:35) Picking Brandon Moreno – Deiveson Figureido
(12:37) Outro
Tudor Leonte began writing about mixed martial arts for Italian media in 2013. His journey with Sherdog began in 2018 and it now covers One Championship and countless European shows. You can follow him on Twitter @Mr.TudorLeonte.
#Good #Place #Mentally
GOOD Mentally place


Posted by Jonathan Fries on October 27th, 2015 .
I've worked with a lot of bar code scanners over the years.
In this era of ubiquitous miniature super-computers (you have on in your pocket or on your desk) you can take advantage of the camera and processing power in those device to do bar code scanning.
You can, and sometimes that's the right choice.
And sometimes, well, sometimes nothing but dedicated hardware will do.
It's easy to use, fast, reliable, and simple to pair with a mobile device.
I am testing with the Socket and I am flying through bar codes at a rate you can only dream of when you are standing at the self-checkout.
I also don't have to deal with any produce. That helps too.


In molecular biology, TauD refers to a protein domain that in many enteric bacteria is used to break down taurine (2-aminoethanesulphonic acid) as a source of sulphur under stress conditions. In essence, they are domains found in enzymes that provide bacteria with an important nutrient.
This protein family consists of TauD/TfdA taurine catabolism dioxygenases. The Escherichia coli tauD gene is required for the utilization of taurine (2-aminoethanesulphonic acid) as a sulphur source and is expressed only under conditions of sulphate starvation. TauD is an alpha-ketoglutarate-dependent dioxygenase catalyzing the oxygenolytic release of sulphite from taurine. The 2,4-dichlorophenoxyacetic acid/alpha-ketoglutarate dioxygenase from Burkholderia sp. (strain RASC) also belongs to this family. TfdA from Ralstonia eutropha (Alcaligenes eutrophus) is a 2,4-D monooxygenase.
^ Eichhorn E, van der Ploeg JR, Kertesz MA, Leisinger T (September 1997). "Characterization of alpha-ketoglutarate-dependent taurine dioxygenase from Escherichia coli". J. Biol. Chem. 272 (37): 23031–6. doi:10.1074/jbc.272.37.23031. PMID 9287300.
^ Suwa Y, Wright AD, Fukimori F, Nummy KA, Hausinger RP, Holben WE, Forney LJ (July 1996). "Characterization of a chromosomally encoded 2,4-dichlorophenoxyacetic acid/alpha-ketoglutarate dioxygenase from Burkholderia sp. strain RASC". Appl. Environ. Microbiol. 62 (7): 2464–9. PMC 168028 . PMID 8779585.
^ Streber WR, Timmis KN, Zenk MH (July 1987). "Analysis, cloning, and high-level expression of 2,4-dichlorophenoxyacetate monooxygenase gene tfdA of Alcaligenes eutrophus JMP134". J. Bacteriol. 169 (7): 2950–5. PMC 212332 . PMID 3036764.
This family consists of taurine catabolism dioxygenases of the TauD, TfdA family. TauD from E. coli P37610 is a alpha-ketoglutarate-dependent taurine dioxygenase . This enzyme catalyses the oxygenolytic release of sulfite from taurine . TfdA from Burkholderia sp. Q45423 is a 2,4-dichlorophenoxyacetic acid/alpha-ketoglutarate dioxygenase . TfdA from Alcaligenes eutrophus JMP134 P10088 is a 2,4-dichlorophenoxyacetate monooxygenase . Also included are gamma-Butyrobetaine hydroxylase enzymes EC:1.14.11.1 .
This domain is found in TauD/TfdA taurine catabolism dioxygenases. The Escherichia coli tauD gene is required for the utilisation of taurine (2-aminoethanesulphonic acid) as a sulphur source and is expressed only under conditions of sulphate starvation. TauD is an alpha-ketoglutarate-dependent dioxygenase catalysing the oxygenolytic release of sulphite from taurine [PUBMED:9287300]. The 2,4-dichlorophenoxyacetic acid/alpha-ketoglutarate dioxygenase from Burkholderia sp. (strain RASC) also belongs to this family [PUBMED:8779585]. TfdA from Ralstonia eutropha (Alcaligenes eutrophus) is a 2,4-D monooxygenase [PUBMED:3036764].
This domain is also found in gamma-butyrobetaine hydroxylase (GBBH), the enzyme responsible for the biosynthesis of L-carnitine, a key molecule of fatty acid metabolism. The GBBH monomer consists of this catalytic double-stranded beta-helix (DBSH) domain, which is found in all 2-ketoglutarate (2KG) oxygenases, and a smaller N-terminal domain [PUBMED:20599753].
This clan represents the conserved barrel domain of the 'cupin' superfamily  ('cupa' is the Latin term for a small barrel). The cupin fold is found in a wide variety of enzymes, but notably contains the non-enzymatic seed storage proteins also.
For those sequences which have a structure in the Protein DataBank, we use the mapping between UniProt, PDB and Pfam coordinate systems from the PDBe group, to allow us to map Pfam domains onto UniProt sequences and three-dimensional protein structures. The table below shows the structures on which the TauD domain has been found. There are 181 instances of this domain found in the PDB. Note that there may be multiple copies of the domain in a single PDB structure, since many structures contain multiple copies of the same protein sequence.


We have arrived! The one and only Swansea City podcast: The JackCast. Today Matt, Steve and Scott discuss Swansea's latest FA Cup triumph over Birmingham and talk about the contrasting talents of Wilfried Bony and Alvaro Vasquez; the latest transfer gossip from the Liberty Stadium and they preview the crucial upcoming games against Fulham and West Ham.
This entry was posted in The JackCast Podcast and tagged Alvaro Vasquez, Birmingham City, FA Cup, Fulham, Swansea City, The JackCast, West Ham, Wilfriend Bony by thejackcast. Bookmark the permalink.


State investigators believe they've identified the driver of a truck from which a rock fell and killed an 8-year-old boy Thursday on the Sterling Highway but have yet to release a name or further details about the incident.
"Investigators have tentatively identified the vehicle and driver involved," Jonathon Taylor of the Department of Public Safety said in a Friday email.
However, Taylor said, investigators are still looking for anyone who saw the incident, which claimed the life of Noah Schwebach, and said anyone who might have information should contact the Soldotna post of the Alaska State Troopers at (907) 262-4453.
Troopers on Thursday said Schwebach was in the middle back seat of a Volkswagen GTI Hatchback that was northbound on the Sterling Highway and was struck by a rock that fell from a southbound rock truck. The rock went through the windshield and hit the boy, troopers said. He died at the scene.
Anchorage School District spokeswoman Catherine Esary said Schwebach was a student at Mt. Spurr Elementary on Joint Base Elmendorf-Richardson. No one answered the door of the Schwebach family home Friday in Eagle River.
The incident occurred near Mile 58.7 of the Sterling Highway on the Kenai Peninsula, near its intersection with the eastern end of Skilak Lake Road, where the highway is being resurfaced and widened, according to the project website.
Contractor Granite Construction is the overseeing the project. On Friday, the company issued a statement saying it's cooperating with investigators and unaware of any of its trucks or drivers being involved.


text:
Q: How to decode an URI with UTF-8 characters in C++ I need to decode an URI in C++. I found several questions about it, but they all fail to deal with UTF-8 encoding and accents (I'm interested in accurately dealing with ASCII characters).
Then, I went with a broadly used library like libcurl... but it also failed to address the UTF-8 encoding. Here's what I'm doing
string UriHelper::Decode(const string &encoded)
{
    CURL *curl = curl_easy_init();
    int outlength;
    char *cres = curl_easy_unescape(curl, encoded.c_str(), encoded.length(), &outlength);
    string res(cres, cres + outlength);
    curl_free(cres);
    curl_easy_cleanup(curl);
    return res;
}

The problem is that a%C3%A1e%C3%A9i%C3%ADo%C3%B3u%C3%BA gets decoded as aáeéiíoóuú when it should be aáeéiíoóuú. If I use a%E1e%E9i%EDo%F3u%FA it works just fine.
Is there any library out there that can take care of differently encoded URIs and deal with them?
Thanks!

A: There is nothing wrong with your decoding. The printing of the decoded URL is the problem. The output device that you print to is configured to accept strings encoded in ISO-8859-1, not in UTF-8.
Either configure the output device to accept strings encoded in UTF-8 or convert the decoded URL from UTF-8 to ISO-8859-1.

A: As Oswald said, the problem isn't with the decoding... but with the method I'm using for showing the string. As I don't really need to deal with UTF-8 strings, I'm going to go with his second suggestion and convert it to ISO-8859-1.
Borrowed the idea (and most of the code) from this answer Is there a way to convert from UTF8 to iso-8859-1?
In order to do this, I added a dependency to iconv.
Here's my UriHelper.h
#pragma once

using namespace std;

static class UriHelper
{
public:
    static string Encode(const string &source);
    static string Decode(const string &encoded);
};

And this is my UriHelper.cpp
#include "UriHelper.h"
#include <curl/curl.h>
#include <iconv.h>

string UriHelper::Encode(const string &source)
{
    CURL *curl = curl_easy_init();
    char *cres = curl_easy_escape(curl, source.c_str(), source.length());
    string res(cres);
    curl_free(cres);
    curl_easy_cleanup(curl);
    return res;
}

string UriHelper::Decode(const string &encoded)
{
    CURL *curl = curl_easy_init();
    int outlength;
    char *cres = curl_easy_unescape(curl, encoded.c_str(), encoded.length(), &outlength);
    string res(cres, cres + outlength);
    curl_free(cres);
    curl_easy_cleanup(curl);

    //if it's UTF-8, convert it to ISO_8859-1. Based on https://stackoverflow.com/questions/11156473/is-there-a-way-to-convert-from-utf8-to-iso-8859-1/11156490#11156490
    iconv_t cd = iconv_open("ISO_8859-1", "UTF-8");

    const char *in_buf = res.c_str();
    size_t in_left = res.length();

    char *output = new char[res.length() + 1];
    std::fill(output, output + res.length() + 1, '\0');
    char *out_buf = &output[0];
    size_t out_left = res.length();

    do {
        if (iconv(cd, &in_buf, &in_left, &out_buf, &out_left) == (size_t)-1) {
            //failed to convert, just return the value received from curl
            delete[] output;
            iconv_close(cd);
            return res;
        }
    } while (in_left > 0 && out_left > 0);

    string outputString(output);
    delete[] output;
    iconv_close(cd);

    return outputString;
}


text:
import Model from 'ember-data/model';
import attr from 'ember-data/attr';
import { hasMany } from 'ember-data/relationships';

export default Model.extend({
  description: attr('string'),
  name: attr('string'),
  slug: attr('string'),

  userCategories: hasMany('user-category', { async: true }),
});


text:
Q: Implementing microprofile health checks with EJB application I have a EJB application (Ear) deployed on open liberty in kubernetes environment.
I am trying to implement health checks (liveliness and readiness) using the microprofile health feature supported by liberty (https://openliberty.io/docs/20.0.0.12/health-check-microservices.html).
Do I need to have seperate web application deployed or just implementing the health check classes in EJB module (without web module) works.

A: It depends what you want to do. You can just add classes implementing livness/readiness to your existing web module or you can create separate one, that will just have various checks.
The best practice would be to have checks in the same module that is providing the service, in case you would later want to separate these services into different containers.
In Liberty checks from all web modules are aggregated and calculated together, so if you have multiple checks you may see something like this:
{
"checks":[
  {
     "data":{},
     "name":"myejb-bean",
     "status":"DOWN"
  },
  {
    "data":{},
    "name":"service1",
    "status":"UP"
    }],
"status":"DOWN"
}


text:
I Miss You – czwarty singel brytyjskiego zespołu Clean Bandit, promujący ich drugi album studyjny, zatytułowany What Is Love?. Powstały przy gościnnym udziale amerykańskiej piosenkarki Julii Michaels. Singel został wydany 27 października 2017. Twórcami tekstu utworu są Julia Michaels, Jack Patterson i Grace Chatto, natomiast jego produkcją zajęli się Patterson, Chatto oraz Mark Ralph.

"I Miss You" jest utrzymany w stylu muzyki dance. Utwór był notowany na 4. miejscu na liście najlepiej sprzedających się singli w Wielkiej Brytanii oraz 92. pozycji listy najlepiej sprzedających się singli w Stanach Zjednoczonych.

Personel
Opracowano na podstawie materiału źródłowego.
 Jack Patterson – autor tekstu, produkcja, miksowanie, fortepian, syntezator
 Grace Chatto – autorka tekstu, produkcja, wiolonczela, miksowanie
 Luke Patterson – perkusja
 Julia Michaels – autorka tekstu, wokal
 Mark Ralph – produkcja, miksowanie
 Stuart Hawkes – inżynier masteringu
 Keith Gretlein – inżynier
 Rob Cohen – inżynier
 Drew Smith – miksowanie
 Tom AD Fuller – miksowanie

Lista utworów

Notowania i certyfikaty

Notowania tygodniowe

Certyfikaty

Historia wydania

Przypisy

Single Clean Bandit
Single wydane w roku 2017


In 2017, 90% of Fortune 500 companies utilized 3PLs.
Once a company grows, it's necessary to turn to outsourcing for shipping and logistic needs. However, even with these tasks in a third party's hands, businesses can find themselves trapped in a nightmare.
If you're experiencing these ten signs, it's time to look for a new shipping and logistics partner.
The pricing model your 3PL providers should be transparent and predictable. Unfortunately, too often owners find themselves facing varying rates.
Those rates may change depending on the owner's growth, any special service requests, upfront fees and increasing contractual rates with shippers. If a logistics partner is giving you excuses about price hikes, they shouldn't be.
Senior VP of Transplace Ben Cubitt explains that there is almost always a carrier that provides lower contract deals to brokers. Good 3PL companies find and exploit inefficiencies to receive lower pricing.
Those lower costs translate to transparent and predictable prices for companies outsourcing to them.
If your company experiences exponential growth, inexperienced shipping organizations may not keep up. Furthermore, increased growth may mean consumers are out of reach of your current provider. If your provider can't supply expedited shipping or other services that are in high demand, customers might look elsewhere.
While rapid growth is a "good" problem to have, it's best to turn to a more proficient company before your reputation suffers.
Buyers today expect to know what is occurring with their accounts and merchandise at all times. In fact, almost half of online shoppers have reported abandoning a seller because of poor order transparency.
Unfortunately, sometimes logistics companies fail to provide the communication customers want. News of returns, delayed orders and other mishaps may not reach you until after an angry customer calls or posts to social media.
To see where your company is headed and how you can reach your next milestone, you need to have the data about orders, shipments, arrivals and more.
When a 3PL fails to provide that information or makes it difficult to access it, you lose out on valuable data that could help your organization and your customers. Agreeing to work with a shipment provider means you trust that company to handle your company's data in a responsible manner.
When a company outsources, there is an agreed-upon decision regarding events such as product replenishments, inventorying and more. Additionally, the 3PL's software uploads to your e-commerce store, making it possible for customers to buy goods easily.
If anything goes awry in any of these departments, it leads to issues that harm your relationship with customers.
The best logistics providers discuss any concerns with you so that they can be overcome. This is a mark of a healthy relationship and a professional team.
However, some logistics companies overlook issues that create obstacles for your business, leaving you at a loss. This has a negative impact on your revenue, reputation, and customers.
As such, it's integral that your third-party provider communicates with you about any concerns. They should also be willing to discuss options and find a solution that works for all parties.
According to Paul Stewart, General Counsel to the GST Corporation and the director of Optimum Resolutions & Consulting (ORC), the most contentious issue 3PLs and business owners debate over is liability.
Increased liability is an after-effect of turning to a third party for services. Liability or secondary liability is becoming a troublesome worry for businesses. Without proper risk protection, companies can face steep and unexpected expenses.
Consequently, it's important that your contract spells out your policies and protect your firm. If not, contemplate finding another provider to work with.
You might have an excellent Transportation Provider who is on top of everything. However, if you rely only on the single shipping and logistics company, you may run into obstacles in the future.
If your company grows, there is a chance you will need further special services and an ability to ship products at a wider range. Some providers can't meet these new expectations.
Due to this possibility, it's best to work with a 3PL that offers many different services. In fact, most companies partake in multi-channel logistics.
Having a third party manage your shipping and logistic needs is an excellent way to reduce your anxiety and help your company grow. However, to enjoy these benefits, it's necessary to have a logistics company that caters to you rather than to your wallet.
At ATS, we offer deep discounts, all types of shipping and a team that not only gets the job done but believes in transparency and openness to foster relationships.
Contact ATS now for a discovery call to determine how our solutions will streamline your transportation needs.


text:
What to Remember About Keyword SEO
With a recent Google announcement that titles and descriptions are the best opportunity for many websites to optimize their digital presence, perhaps it's time to concentrate SEO efforts on the use of keywords... again.
Keyword optimization really sits at the very core of any good search engine optimization campaign, but the question is, what do you need to do and remember to ensure those efferts are effective? First, make sure you're not making any major mistakes. Let's first take a look at two of the most common errors made by search engine optimization professionals today:
Targeting Unrealistic Keywords
Picking a set of keywords (the keyword list in SEO parlance) is the foundation of any good search engine optimization campaign but there are some things to watch out for including targeting of totally unrealistic keywords. What you're really looking for is a balance between volume and relevance; an opportunity to appeal to a consumer with a relevant term that has sufficient volume to ensure the effort requried to optimzie doesn't get wasted. It should go without saying but it's best to concentrate only on relevant terms, and for the quickest and biggest bang for your buck, start on the long tail and build from there.
Focusing on the Singular Form of Keywords
Sure, most search engines map certain words to a primary term (for example misspellings) but there are numerous variations of terms and search phrases that you'll want to include in the copy/content on your website. There are an abundance of keyword resarch tools available (some of which are listed in the infographic below) and, of course, SEO software solutions that can be leveraged to identify realistic variations of keywords that will be useful to target on your website.
Keyword selection and use is an important part of SEO; spend the time to optimize the digital experience using terms and phrases important to users and you'll find you're on the right track to 'Net success.


A role has become available for an enthusiastic chemist to join CuanTec's facility at the European Centre for Marine Biotechnology, near Oban.
CuanTec is a blue biotechnology company, established in January 2017, who is seeking to expand its highly motivated workforce. CuanTec is made up of a small but innovative team who are dedicated to the pioneering use of food waste to reduce landfill waste. We work first-hand with the fisheries industry, diverting their food by-products from landfill and creating chitinous based food preserving agents such as preservative dips and anti-bacterial compostable bio-plastic packaging. Ultimately tackling the ever-expanding issue of waste food and single-use plastics.
At present CuanTec is a young company that is rapidly moving forward into production. In light of the current state of development of CuanTec Ltd applicants would be expected to manage a multi-disciplinary role within this small company and embrace the challenges of working in a fast-paced changing environment. The applicant should be enthusiastic and relish a challenge.
CuanTec would like to appoint a Senior Chemist, with relevant industry background, to undertake duties in formulation, product development, QC and production of a biodegradable / compostable plastic alternative food-packaging derived from waste chitin.
As an experienced Industrial chemist you will be able to take the lead role in chitosan formulation for the development of biodegradable and ultimately compostable food packaging.
CuanTec Ltd use a biological approach for the recovery of chitin from shellfish waste; there is scope for process optimisation and the development of relevant chemical analyses for QC at different steps of production. In this regard the chemist may be called upon for input in method development or process optimisation.
A PhD (or equivalent) in chemistry, QC, polymer chemistry or materials science or engineering including bioengineering or similar.
Knowledge of materials characterisation techniques.


MONDAY, July 15 (HealthDay News) — The diabetes drug metformin may do more than help control blood sugar levels: New research suggests it may also reduce the risk of dementia.
"Metformin could have a possible neuroprotective effect in the brain," said study author Dr. Rachel Whitmer, an epidemiologist in the division of research at Kaiser Permanente in Oakland, Calif.
Whitmer is scheduled to present the findings Monday at the Alzheimer's Association International Conference in Boston. Research presented at medical meetings should be viewed as preliminary until published in a peer-reviewed journal.
"They initiated one of four single-agent therapies: metformin, sulfonylureas, thiazolidinediones (TZDs) or insulin," Whitmer said.
Metformin makes muscle tissue more receptive to insulin, a hormone necessary for sugar (glucose) to get into the body's cells and tissues to provide fuel. It also decreases the amount of glucose made in the liver. Sulfonylureas stimulate the production of insulin. TZDs make muscle and fat tissue more receptive to insulin, and they decrease the amount of glucose made in the liver. Insulin injections are used to help cover the increased need for more insulin because people with type 2 diabetes aren't able to use insulin produced by the body as efficiently.
"The idea that how we treat diabetes could affect all-cause dementia is very exciting," Lipton said.


The aim of the 2.0 Connect Series was to bring together young aspiring entrepreneurs with senior, emerging leaders and industry experts to learn and draw inspiration from those leaders and also to be mentored by them.
For the first time in Cote D'Ivoire on Thursday February 2nd 2017 at the Novotel Hotel Abidjan, we gathered top government officials, institutions, large companies, entrepreneurs and young professionals to share experiences and reflections on mentoring as well as the challenges of the West African Agro-industry. Mentorship sessions tagged Inspiring NextGen Series #INGS which are 1-on-1 and group mentorship sessions kickstarted the event followed by sessions tagged Network with the leader series (#NLS) where an influential leader – Jean Claude BROU, Minister of Industries and Mines, Cote D'Ivoire – was the Guest of honor, panel president and gave a 30-minute speech/presentation. There was further a panel discussion on The Future of Agribusiness in Africa with panelists from National Governments, AFDB, Private Sector. Finally, we had a mini Start up Africa Competition with entrepreneurs' pitching agro solutions for Africa and an interaction by the entrepreneurs with the audience for mentorship, funding and other opportunities!
The event featured prominent Government officials, OCP Africa representatives, experts in agriculture; founder of Africa 2.0, Mamadou Toure and other highly experienced and successful career and business people (who served as mentors) from the various Africa 2.0 country chapters.


For the optimum performance and efficiency your oil boiler needs regular servicing.
Normal manufacturers recommend every 12 months. Our service procedure is carried out as laid down by OFTEC.
We contact you when the boiler service is due and arrange a mutually convenient time to carry out the work.
If whilst servicing, it is discovered a boilers part needs replacing we would give you an accurate costing of the extra work required.