text:
using namespace foundation;
using namespace std;

namespace renderer
{

//
// RendererServices class implementation.
//

namespace
{
    OIIO::TypeDesc g_float_array2_typedesc(OIIO::TypeDesc::FLOAT, 2);
    OIIO::TypeDesc g_float_array4_typedesc(OIIO::TypeDesc::FLOAT, 4);
    OIIO::TypeDesc g_int_array2_typedesc(OIIO::TypeDesc::INT, 2);

    OIIO::ustring g_empty_ustr;

    OIIO::ustring g_perspective_ustr("perspective");
    OIIO::ustring g_spherical_ustr("spherical");
    OIIO::ustring g_unknown_proj_ustr("unknown");
    OIIO::ustring g_trace_ustr("trace");
    OIIO::ustring g_hit_ustr("hit");
    OIIO::ustring g_hitdist_ustr("hitdist");
    OIIO::ustring g_N_ustr("N");
    OIIO::ustring g_Ng_ustr("Ng");
    OIIO::ustring g_P_ustr("P");
    OIIO::ustring g_u_ustr("u");
    OIIO::ustring g_v_ustr("v");

    // Coordinate systems.
    OIIO::ustring g_camera_ustr("camera");
    OIIO::ustring g_common_ustr("common");
    OIIO::ustring g_NDC_ustr("NDC");
    OIIO::ustring g_object_ustr("object");
    OIIO::ustring g_raster_ustr("raster");
    OIIO::ustring g_screen_ustr("screen");
    OIIO::ustring g_shader_ustr("shader");
    OIIO::ustring g_world_ustr("world");
}

RendererServices::RendererServices(
    const Project&              project,
    OIIO::TextureSystem&        texture_sys)
  : OSL::RendererServices(&texture_sys)
  , m_texture_sys(texture_sys)
  , m_project(project)
  , m_texture_store(nullptr)
{
    // Set up attribute getters.
    m_global_attr_getters[OIIO::ustring("object:object_instance_id")] = &RendererServices::get_attr_object_instance_id;
    m_global_attr_getters[OIIO::ustring("object:object_instance_index")] = &RendererServices::get_attr_object_instance_index;
    m_global_attr_getters[OIIO::ustring("object:assembly_instance_id")] = &RendererServices::get_attr_assembly_instance_id;
    m_global_attr_getters[OIIO::ustring("object:assembly_name")] = &RendererServices::get_attr_assembly_name;
    m_global_attr_getters[OIIO::ustring("object:assembly_instance_name")] = &RendererServices::get_attr_assembly_instance_name;
    m_global_attr_getters[OIIO::ustring("object:object_instance_name")] = &RendererServices::get_attr_object_instance_name;
    m_global_attr_getters[OIIO::ustring("object:object_name")] = &RendererServices::get_attr_object_name;

    m_global_attr_getters[OIIO::ustring("camera:resolution")] = &RendererServices::get_attr_camera_resolution;
    m_global_attr_getters[OIIO::ustring("camera:projection")] = &RendererServices::get_attr_camera_projection;
    m_global_attr_getters[OIIO::ustring("camera:pixelaspect")] = &RendererServices::get_attr_camera_pixelaspect;
    m_global_attr_getters[OIIO::ustring("camera:screen_window")] = &RendererServices::get_attr_camera_screen_window;
    m_global_attr_getters[OIIO::ustring("camera:fov")] = &RendererServices::get_attr_camera_fov;
    m_global_attr_getters[OIIO::ustring("camera:clip")] = &RendererServices::get_attr_camera_clip;
    m_global_attr_getters[OIIO::ustring("camera:clip_near")] = &RendererServices::get_attr_camera_clip_near;
    m_global_attr_getters[OIIO::ustring("camera:clip_far")] = &RendererServices::get_attr_camera_clip_far;
    m_global_attr_getters[OIIO::ustring("camera:shutter")] = &RendererServices::get_attr_camera_shutter;
    m_global_attr_getters[OIIO::ustring("camera:shutter_open")] = &RendererServices::get_attr_camera_shutter_open;
    m_global_attr_getters[OIIO::ustring("camera:shutter_close")] = &RendererServices::get_attr_camera_shutter_close;

    m_global_attr_getters[OIIO::ustring("path:ray_depth")] = &RendererServices::get_attr_ray_depth;
    m_global_attr_getters[OIIO::ustring("path:ray_length")] = &RendererServices::get_attr_ray_length;
    m_global_attr_getters[OIIO::ustring("path:ray_ior")] = &RendererServices::get_attr_ray_ior;
    m_global_attr_getters[OIIO::ustring("path:ray_has_differentials")] = &RendererServices::get_attr_ray_has_differentials;

    m_global_attr_getters[OIIO::ustring("surface_shader:diffuse")] = &RendererServices::get_attr_surface_shader_diffuse;
    m_global_attr_getters[OIIO::ustring("surface_shader:glossy")] = &RendererServices::get_attr_surface_shader_glossy;
    m_global_attr_getters[OIIO::ustring("surface_shader:emission")] = &RendererServices::get_attr_surface_shader_emission;

    m_global_attr_getters[OIIO::ustring("appleseed:version_major")] = &RendererServices::get_attr_appleseed_version_major;
    m_global_attr_getters[OIIO::ustring("appleseed:version_minor")] = &RendererServices::get_attr_appleseed_version_minor;
    m_global_attr_getters[OIIO::ustring("appleseed:version_patch")] = &RendererServices::get_attr_appleseed_version_patch;
    m_global_attr_getters[OIIO::ustring("appleseed:version")] = &RendererServices::get_attr_appleseed_version;

    // Set up user data getters.
    m_global_user_data_getters[OIIO::ustring("Tn")] = &RendererServices::get_user_data_tn;
    m_global_user_data_getters[OIIO::ustring("Bn")] = &RendererServices::get_user_data_bn;
    m_global_user_data_getters[OIIO::ustring("dNdu")] = &RendererServices::get_user_data_dndu;
    m_global_user_data_getters[OIIO::ustring("dNdv")] = &RendererServices::get_user_data_dndv;
    m_global_user_data_getters[OIIO::ustring("vertex_color")] = &RendererServices::get_user_data_vertex_color;
}

void RendererServices::initialize(TextureStore& texture_store)
{
    m_texture_store = &texture_store;
    m_camera = m_project.get_uncached_active_camera();

    if (m_camera)
    {
        m_cam_projection_str =
            strcmp(m_camera->get_model(), "pinhole_camera") == 0 ? g_perspective_ustr :
            strcmp(m_camera->get_model(), "thinlens_camera") == 0 ? g_perspective_ustr :
            strcmp(m_camera->get_model(), "spherical_camera") == 0 ? g_spherical_ustr :
            g_unknown_proj_ustr;

        m_shutter[0] = m_camera->get_shutter_open_begin_time();
        m_shutter[1] = m_camera->get_shutter_close_end_time();
        m_shutter_interval = m_camera->get_shutter_time_interval();
    }

    const CanvasProperties& props = m_project.get_frame()->image().properties();
    m_resolution[0] = static_cast<int>(props.m_canvas_width);
    m_resolution[1] = static_cast<int>(props.m_canvas_height);
}

OIIO::TextureSystem* RendererServices::texturesys() const
{
    return &m_texture_sys;
}

bool RendererServices::get_matrix(
    OSL::ShaderGlobals*         sg,
    OSL::Matrix44&              result,
    OSL::TransformationPtr      xform,
    float                       time)
{
    if (!xform)
        return false;

    const ShadingPoint::OSLObjectTransformInfo* obj_xform =
        reinterpret_cast<const ShadingPoint::OSLObjectTransformInfo*>(xform);

    result = obj_xform->get_transform(time);
    return true;
}

bool RendererServices::get_inverse_matrix(
    OSL::ShaderGlobals*         sg,
    OSL::Matrix44&              result,
    OSL::TransformationPtr      xform,
    float                       time)
{
    if (!xform)
        return false;

    const ShadingPoint::OSLObjectTransformInfo* obj_xform =
        reinterpret_cast<const ShadingPoint::OSLObjectTransformInfo*>(xform);

    result = obj_xform->get_inverse_transform(time);
    return true;
}

bool RendererServices::get_matrix(
    OSL::ShaderGlobals*         sg,
    OSL::Matrix44&              result,
    OSL::TransformationPtr      xform)
{
    if (!xform)
        return false;

    const ShadingPoint::OSLObjectTransformInfo* obj_xform =
        reinterpret_cast<const ShadingPoint::OSLObjectTransformInfo*>(xform);

    if (obj_xform->is_animated())
        return false;

    result = obj_xform->get_transform();
    return true;
}

bool RendererServices::get_inverse_matrix(
    OSL::ShaderGlobals*         sg,
    OSL::Matrix44&              result,
    OSL::TransformationPtr      xform)
{
    if (!xform)
        return false;

    const ShadingPoint::OSLObjectTransformInfo* obj_xform =
        reinterpret_cast<const ShadingPoint::OSLObjectTransformInfo*>(xform);

    if (obj_xform->is_animated())
        return false;

    result = obj_xform->get_inverse_transform();
    return true;
}

bool RendererServices::get_matrix(
    OSL::ShaderGlobals*         sg,
    OSL::Matrix44&              result,
    OIIO::ustring               from,
    float                       time)
{
    if (from == g_camera_ustr)
    {
        Transformd scratch;
        const Transformd& transform =
            m_camera->transform_sequence().evaluate(time, scratch);
        result = Matrix4f(transform.get_local_to_parent());
        return true;
    }

    return false;
}

bool RendererServices::get_inverse_matrix(
    OSL::ShaderGlobals*         sg,
    OSL::Matrix44&              result,
    OSL::ustring                to,
    float                       time)
{
    if (to == g_camera_ustr)
    {
        Transformd scratch;
        const Transformd& transform =
            m_camera->transform_sequence().evaluate(time, scratch);
        result = Matrix4f(transform.get_parent_to_local());
        return true;
    }

    return OSL::RendererServices::get_inverse_matrix(
        sg,
        result,
        to,
        time);
}

bool RendererServices::get_matrix(
    OSL::ShaderGlobals*         sg,
    OSL::Matrix44&              result,
    OIIO::ustring               from)
{
    if (from == g_camera_ustr)
    {
        if (m_camera->transform_sequence().size() > 1)
            return false;

        const Transformd& scratch =
            m_camera->transform_sequence().get_earliest_transform();
        result = Matrix4f(scratch.get_local_to_parent());
        return true;
    }

    return false;
}

bool RendererServices::get_inverse_matrix(
    OSL::ShaderGlobals*         sg,
    OSL::Matrix44&              result,
    OSL::ustring                to)
{
    if (to == g_camera_ustr)
    {
        if (m_camera->transform_sequence().size() > 1)
            return false;

        const Transformd& scratch =
            m_camera->transform_sequence().get_earliest_transform();
        result = Matrix4f(scratch.get_parent_to_local());
        return true;
    }

    return OSL::RendererServices::get_inverse_matrix(sg, result, to);
}

namespace
{

bool can_transform(const OSL::TypeDesc::VECSEMANTICS vectype)
{
    // We only transform points and vectors for now.
    return
        vectype == OSL::TypeDesc::POINT ||
        vectype == OSL::TypeDesc::VECTOR;
}

void transform(
    const OSL::Vec3&                  Pin,
    const OSL::Matrix44&              m,
    const OSL::TypeDesc::VECSEMANTICS vectype,
    OSL::Vec3&                        Pout)
{
    if (vectype == OSL::TypeDesc::POINT)
        Pout = Pin * m;
    else if (vectype == OSL::TypeDesc::VECTOR)
        m.multDirMatrix(Pin, Pout);
}

}

bool RendererServices::transform_points(
    OSL::ShaderGlobals*         sg,
    OSL::ustring                from,
    OSL::ustring                to,
    float                       time,
    const OSL::Vec3*            Pin,
    OSL::Vec3*                  Pout,
    int                         npoints,
    OSL::TypeDesc::VECSEMANTICS vectype)
{
    if (!can_transform(vectype))
        return false;

    if (to == g_NDC_ustr || to == g_raster_ustr)
    {
        if (from == g_world_ustr || from == g_common_ustr || from == g_shader_ustr)
            memcpy(Pout, Pin, npoints * sizeof(OSL::Vec3));
        else if (from == g_object_ustr)
        {
            // Convert from object to world.
            OSL::Matrix44 m;
            get_matrix(sg, m, sg->object2common, time);

            for (int i = 0; i < npoints; ++i)
                transform(Pin[i], m, vectype, Pout[i]);
        }
        else if (from == g_camera_ustr)
        {
            OSL::Matrix44 m;
            get_matrix(sg, m, g_camera_ustr, time);

            // Convert from camera to world.
            for (int i = 0; i < npoints; ++i)
                transform(Pin[i], m, vectype, Pout[i]);
        }
        else return false;

        // Transform to NDC.
        if (vectype == OSL::TypeDesc::VECTOR)
        {
            Vector2d ndc_p(-1.0, -1.0);

            if (sg)
            {
                m_camera->project_point(
                    time,
                    Vector3d(sg->P.x, sg->P.y, sg->P.z),
                    ndc_p);
            }

            for (int i = 0; i < npoints; ++i)
            {
                const OSL::Vec3 Q = sg->P + Pout[i];

                Vector2d ndc_q(-1.0, -1.0);
                m_camera->project_point(time, Vector3d(Q.x, Q.y, Q.z), ndc_q);
                Pout[i] = OSL::Vec3(
                    static_cast<float>(ndc_q[0] - ndc_p[0]),
                    static_cast<float>(ndc_q[1] - ndc_p[1]),
                    0.0f);
            }
        }
        else
        {
            assert(vectype == OSL::TypeDesc::POINT);

            for (int i = 0; i < npoints; ++i)
            {
                Vector2d ndc(-1.0, -1.0);
                m_camera->project_point(time, Vector3d(Pout[i].x, Pout[i].y, Pout[i].z), ndc);
                Pout[i] = OSL::Vec3(
                    static_cast<float>(ndc[0]),
                    static_cast<float>(ndc[1]),
                    0.0f);
            }
        }

        if (to == g_raster_ustr)
        {
            // Transform from NDC to raster.
            for (int i = 0; i < npoints; ++i)
            {
                Pout[i].x *= m_resolution[0];
                Pout[i].y *= m_resolution[1];
            }
        }

        return true;
    }

    return false;
}

bool RendererServices::trace(
    TraceOpt&                   options,
    OSL::ShaderGlobals*         sg,
    const OSL::Vec3&            P,
    const OSL::Vec3&            dPdx,
    const OSL::Vec3&            dPdy,
    const OSL::Vec3&            R,
    const OSL::Vec3&            dRdx,
    const OSL::Vec3&            dRdy)
{
    assert(m_texture_store);

    const ShadingPoint* parent =
        reinterpret_cast<const ShadingPoint*>(sg->renderstate);

    Vector3d pos;
    const ShadingPoint* origin_shading_point;

    if (P == sg->P)
    {
        Vector3d front(P);
        Vector3d back = front;

        Intersector::fixed_offset(
            parent->get_point(),
            parent->get_geometric_normal(),
            front,
            back);

        pos = sg->N.dot(R) >= 0.0f ? front : back;
        origin_shading_point = parent;
    }
    else
    {
        pos = Vector3d(P);
        origin_shading_point = nullptr;
    }

    const Vector3d dir(R);
    const ShadingRay ray(
        pos,
        normalize(dir),
        options.mindist,
        options.maxdist,
        parent->get_ray().m_time,
        VisibilityFlags::ProbeRay,
        parent->get_ray().m_depth + 1);

    // todo: move this out of the hot code path (but it must remain thread-local).
    TextureCache texture_cache(*m_texture_store);
    Intersector intersector(m_project.get_trace_context(), texture_cache);

    ShadingPoint shading_point;
    intersector.trace(
        ray,
        shading_point,
        origin_shading_point);

    ShadingPoint::OSLTraceData* trace_data =
        reinterpret_cast<ShadingPoint::OSLTraceData*>(sg->tracedata);

    trace_data->m_traced = true;

    if (shading_point.hit_surface())
    {
        trace_data->m_hit = true;
        trace_data->m_P = Imath::V3d(shading_point.get_point());
        trace_data->m_hit_distance = static_cast<float>(shading_point.get_distance());
        trace_data->m_N = Imath::V3d(shading_point.get_shading_normal());
        trace_data->m_Ng = Imath::V3d(shading_point.get_geometric_normal());
        const Vector2f& uv = shading_point.get_uv(0);
        trace_data->m_u = uv[0];
        trace_data->m_v = uv[1];
        return true;
    }

    return false;
}

bool RendererServices::getmessage(
    OSL::ShaderGlobals*         sg,
    OIIO::ustring               source,
    OIIO::ustring               name,
    OIIO::TypeDesc              type,
    void*                       val,
    bool                        derivatives)
{
    const ShadingPoint::OSLTraceData* trace_data =
        reinterpret_cast<ShadingPoint::OSLTraceData*>(sg->tracedata);

    if (trace_data->m_traced)
    {
        if (source == g_trace_ustr)
        {
            if (name == g_hit_ustr && type == OIIO::TypeDesc::TypeInt)
                reinterpret_cast<int*>(val)[0] = trace_data->m_hit ? 1 : 0;
            else if (name == g_hitdist_ustr && type == OIIO::TypeDesc::TypeFloat)
                reinterpret_cast<float*>(val)[0] = trace_data->m_hit_distance;
            else if (name == g_N_ustr && type == OIIO::TypeDesc::TypeNormal)
                *reinterpret_cast<OSL::Vec3*>(val) = trace_data->m_N;
            else if (name == g_Ng_ustr && type == OIIO::TypeDesc::TypeNormal)
                *reinterpret_cast<OSL::Vec3*>(val) = trace_data->m_Ng;
            else if (name == g_P_ustr && type == OIIO::TypeDesc::TypePoint)
                *reinterpret_cast<OSL::Vec3*>(val) = trace_data->m_P;
            else if (name == g_u_ustr && type == OIIO::TypeDesc::TypeFloat)
                reinterpret_cast<float*>(val)[0] = trace_data->m_u;
            else if (name == g_v_ustr && type == OIIO::TypeDesc::TypeFloat)
                reinterpret_cast<float*>(val)[0] = trace_data->m_v;
            else
                return false;

            // For now, set derivatives to zero.
            if (derivatives)
                memset(reinterpret_cast<char*>(val) + type.size(), 0, 2 * type.size());

            return true;
        }
    }

    return false;
}

bool RendererServices::get_attribute(
    OSL::ShaderGlobals*         sg,
    bool                        derivatives,
    OIIO::ustring               object,
    OIIO::TypeDesc              type,
    OIIO::ustring               name,
    void*                       val)
{
    // We don't support getting attributes from named objects, yet.
    if (object != g_empty_ustr)
        return false;

    // Try global attributes.
    AttrGetterMapType::const_iterator i = m_global_attr_getters.find(name);
    if (i != m_global_attr_getters.end())
    {
        AttrGetterFun getter = i->second;
        return (this->*(getter))(sg, derivatives, object, type, name, val);
    }

    // Try user data from the current object.
    if (object.empty())
        return get_userdata(derivatives, name, type, sg, val);

    return false;
}

bool RendererServices::get_array_attribute(
    OSL::ShaderGlobals*         sg,
    bool                        derivatives,
    OIIO::ustring               object,
    OIIO::TypeDesc              type,
    OIIO::ustring               name,
    int                         index,
    void*                       val)
{
    return false;
}

bool RendererServices::get_userdata(
    bool                        derivatives,
    OIIO::ustring               name,
    OIIO::TypeDesc              type,
    OSL::ShaderGlobals*         sg,
    void*                       val)
{
    UserDataGetterMapType::const_iterator i = m_global_user_data_getters.find(name);
    if (i != m_global_user_data_getters.end())
    {
        UserDataGetterFun getter = i->second;
        return (this->*(getter))(derivatives, name, type, sg, val);
    }

    return false;
}

#define IMPLEMENT_ATTR_GETTER(name)         \
    bool RendererServices::get_attr_##name( \
        OSL::ShaderGlobals*     sg,         \
        bool                    derivs,     \
        OIIO::ustring           object,     \
        OIIO::TypeDesc          type,       \
        OIIO::ustring           name,       \
        void*                   val) const

IMPLEMENT_ATTR_GETTER(object_instance_id)
{
    if (type == OIIO::TypeDesc::TypeInt)
    {
        const ShadingPoint* shading_point =
            reinterpret_cast<const ShadingPoint*>(sg->renderstate);
        reinterpret_cast<int*>(val)[0] =
            static_cast<int>(shading_point->get_object_instance().get_uid());

        if (derivs)
            clear_derivatives(type, val);

        return true;
    }

    return false;
}

IMPLEMENT_ATTR_GETTER(object_instance_index)
{
    if (type == OIIO::TypeDesc::TypeInt)
    {
        const ShadingPoint* shading_point =
            reinterpret_cast<const ShadingPoint*>(sg->renderstate);
        reinterpret_cast<int*>(val)[0] =
            static_cast<int>(shading_point->get_object_instance_index());

        if (derivs)
            clear_derivatives(type, val);

        return true;
    }

    return false;
}

IMPLEMENT_ATTR_GETTER(assembly_instance_id)
{
    if (type == OIIO::TypeDesc::TypeInt)
    {
        const ShadingPoint* shading_point =
            reinterpret_cast<const ShadingPoint*>(sg->renderstate);
        reinterpret_cast<int*>(val)[0] =
            static_cast<int>(shading_point->get_assembly_instance().get_uid());

        if (derivs)
            clear_derivatives(type, val);

        return true;
    }

    return false;
}

IMPLEMENT_ATTR_GETTER(assembly_instance_name)
{
    if (type == OIIO::TypeDesc::TypeString)
    {
        const ShadingPoint* shading_point =
            reinterpret_cast<const ShadingPoint*>(sg->renderstate);

        const AssemblyInstance& assembly_instance = shading_point->get_assembly_instance();
        const OIIO::ustring* name =
            reinterpret_cast<const OIIO::ustring*>(assembly_instance.get_name_as_ustring());

        reinterpret_cast<OIIO::ustring*>(val)[0] = *name;

        if (derivs)
            clear_derivatives(type, val);

        return true;
    }

    return false;
}

IMPLEMENT_ATTR_GETTER(assembly_name)
{
    if (type == OIIO::TypeDesc::TypeString)
    {
        const ShadingPoint* shading_point =
            reinterpret_cast<const ShadingPoint*>(sg->renderstate);

        const Assembly& assembly = shading_point->get_assembly();
        const OIIO::ustring* name =
            reinterpret_cast<const OIIO::ustring*>(assembly.get_name_as_ustring());

        reinterpret_cast<OIIO::ustring*>(val)[0] = *name;

        if (derivs)
            clear_derivatives(type, val);

        return true;
    }

    return false;
}

IMPLEMENT_ATTR_GETTER(object_instance_name)
{
    if (type == OIIO::TypeDesc::TypeString)
    {
        const ShadingPoint* shading_point =
            reinterpret_cast<const ShadingPoint*>(sg->renderstate);

        const ObjectInstance& object_instance = shading_point->get_object_instance();
        const OIIO::ustring* name =
            reinterpret_cast<const OIIO::ustring*>(object_instance.get_name_as_ustring());

        reinterpret_cast<OIIO::ustring*>(val)[0] = *name;

        if (derivs)
            clear_derivatives(type, val);

        return true;
    }

    return false;
}

IMPLEMENT_ATTR_GETTER(object_name)
{
    if (type == OIIO::TypeDesc::TypeString)
    {
        const ShadingPoint* shading_point =
            reinterpret_cast<const ShadingPoint*>(sg->renderstate);

        const Object& object = shading_point->get_object();
        const OIIO::ustring* name =
            reinterpret_cast<const OIIO::ustring*>(object.get_name_as_ustring());

        reinterpret_cast<OIIO::ustring*>(val)[0] = *name;

        if (derivs)
            clear_derivatives(type, val);

        return true;
    }

    return false;
}

IMPLEMENT_ATTR_GETTER(camera_resolution)
{
    if (type == g_int_array2_typedesc)
    {
        reinterpret_cast<int*>(val)[0] = m_resolution[0];
        reinterpret_cast<int*>(val)[1] = m_resolution[1];

        if (derivs)
            clear_derivatives(type, val);

        return true;
    }

    return false;
}

IMPLEMENT_ATTR_GETTER(camera_projection)
{
    if (type == OIIO::TypeDesc::TypeString)
    {
        reinterpret_cast<OIIO::ustring*>(val)[0] = m_cam_projection_str;
        return true;
    }

    return false;
}

IMPLEMENT_ATTR_GETTER(camera_fov)
{
    return false;
}

IMPLEMENT_ATTR_GETTER(camera_pixelaspect)
{
    if (type == OIIO::TypeDesc::TypeFloat)
    {
        reinterpret_cast<float*>(val)[0] = 1.0f;

        if (derivs)
            clear_derivatives(type, val);

        return true;
    }

    return false;
}

IMPLEMENT_ATTR_GETTER(camera_clip)
{
    if (type == g_float_array2_typedesc)
    {
        reinterpret_cast<float*>(val)[0] = 0.0f;
        reinterpret_cast<float*>(val)[1] = numeric_limits<float>::max();

        if (derivs)
            clear_derivatives(type, val);

        return true;
    }

    return false;
}

IMPLEMENT_ATTR_GETTER(camera_clip_near)
{
    if (type == OIIO::TypeDesc::TypeFloat)
    {
        reinterpret_cast<float*>(val)[0] = 0.0f;

        if (derivs)
            clear_derivatives(type, val);

        return true;
    }

    return false;
}

IMPLEMENT_ATTR_GETTER(camera_clip_far)
{
    if (type == OIIO::TypeDesc::TypeFloat)
    {
        reinterpret_cast<float*>(val)[0] = numeric_limits<float>::max();

        if (derivs)
            clear_derivatives(type, val);

        return true;
    }

    return false;
}

IMPLEMENT_ATTR_GETTER(camera_shutter)
{
    if (type == g_float_array2_typedesc)
    {
        reinterpret_cast<float*>(val)[0] = m_shutter[0];
        reinterpret_cast<float*>(val)[1] = m_shutter[1];

        if (derivs)
            clear_derivatives(type, val);

        return true;
    }

    return false;
}

IMPLEMENT_ATTR_GETTER(camera_shutter_open)
{
    if (type == OIIO::TypeDesc::TypeFloat)
    {
        reinterpret_cast<float*>(val)[0] = m_shutter[0];

        if (derivs)
            clear_derivatives(type, val);

        return true;
    }

    return false;
}

IMPLEMENT_ATTR_GETTER(camera_shutter_close)
{
    if (type == OIIO::TypeDesc::TypeFloat)
    {
        reinterpret_cast<float*>(val)[0] = m_shutter[1];

        if (derivs)
            clear_derivatives(type, val);

        return true;
    }

    return false;
}

IMPLEMENT_ATTR_GETTER(camera_screen_window)
{
    if (type == g_float_array4_typedesc)
    {
        const float aspect = static_cast<float>(m_resolution[0]) / m_resolution[1];
        reinterpret_cast<float*>(val)[0] = -aspect;
        reinterpret_cast<float*>(val)[1] = -1.0f;
        reinterpret_cast<float*>(val)[2] =  aspect;
        reinterpret_cast<float*>(val)[3] =  1.0f;

        if (derivs)
            clear_derivatives(type, val);

        return true;
    }

    return false;
}

IMPLEMENT_ATTR_GETTER(ray_depth)
{
    if (type == OIIO::TypeDesc::TypeInt)
    {
        const ShadingPoint* shading_point =
            reinterpret_cast<const ShadingPoint*>(sg->renderstate);
        reinterpret_cast<int*>(val)[0] = static_cast<int>(shading_point->get_ray().m_depth);

        if (derivs)
            clear_derivatives(type, val);

        return true;
    }

    return false;
}

IMPLEMENT_ATTR_GETTER(ray_length)
{
    if (type == OIIO::TypeDesc::TypeFloat)
    {
        const ShadingPoint* shading_point =
            reinterpret_cast<const ShadingPoint*>(sg->renderstate);
        reinterpret_cast<float*>(val)[0] = static_cast<float>(shading_point->get_distance());

        if (derivs)
            clear_derivatives(type, val);

        return true;
    }

    return false;
}

IMPLEMENT_ATTR_GETTER(ray_ior)
{
    if (type == OIIO::TypeDesc::TypeFloat)
    {
        const ShadingPoint* shading_point =
            reinterpret_cast<const ShadingPoint*>(sg->renderstate);
        reinterpret_cast<float*>(val)[0] = shading_point->get_ray().get_current_ior();

        if (derivs)
            clear_derivatives(type, val);

        return true;
    }

    return false;
}

IMPLEMENT_ATTR_GETTER(ray_has_differentials)
{
    if (type == OIIO::TypeDesc::TypeInt)
    {
        const ShadingPoint* shading_point =
            reinterpret_cast<const ShadingPoint*>(sg->renderstate);
        reinterpret_cast<int*>(val)[0] = static_cast<int>(shading_point->get_ray().m_has_differentials);

        if (derivs)
            clear_derivatives(type, val);

        return true;
    }

    return false;
}

IMPLEMENT_ATTR_GETTER(surface_shader_diffuse)
{
    if (type == OIIO::TypeDesc::TypeColor)
    {
        const ShadingPoint* shading_point = reinterpret_cast<const ShadingPoint*>(sg->renderstate);
        reinterpret_cast<float*>(val)[0] = shading_point->m_surface_shader_diffuse[0];
        reinterpret_cast<float*>(val)[1] = shading_point->m_surface_shader_diffuse[1];
        reinterpret_cast<float*>(val)[2] = shading_point->m_surface_shader_diffuse[2];

        if (derivs)
            clear_derivatives(type, val);

        return true;
    }

    return false;
}

IMPLEMENT_ATTR_GETTER(surface_shader_glossy)
{
    if (type == OIIO::TypeDesc::TypeColor)
    {
        const ShadingPoint* shading_point = reinterpret_cast<const ShadingPoint*>(sg->renderstate);
        reinterpret_cast<float*>(val)[0] = shading_point->m_surface_shader_glossy[0];
        reinterpret_cast<float*>(val)[1] = shading_point->m_surface_shader_glossy[1];
        reinterpret_cast<float*>(val)[2] = shading_point->m_surface_shader_glossy[2];

        if (derivs)
            clear_derivatives(type, val);

        return true;
    }

    return false;
}

IMPLEMENT_ATTR_GETTER(surface_shader_emission)
{
    if (type == OIIO::TypeDesc::TypeColor)
    {
        const ShadingPoint* shading_point = reinterpret_cast<const ShadingPoint*>(sg->renderstate);
        reinterpret_cast<float*>(val)[0] = shading_point->m_surface_shader_emission[0];
        reinterpret_cast<float*>(val)[1] = shading_point->m_surface_shader_emission[1];
        reinterpret_cast<float*>(val)[2] = shading_point->m_surface_shader_emission[2];

        if (derivs)
            clear_derivatives(type, val);

        return true;
    }

    return false;
}

IMPLEMENT_ATTR_GETTER(appleseed_version_major)
{
    if (type == OIIO::TypeDesc::TypeInt)
    {
        reinterpret_cast<int*>(val)[0] = APPLESEED_VERSION_MAJOR;

        if (derivs)
            clear_derivatives(type, val);

        return true;
    }

    return false;
}

IMPLEMENT_ATTR_GETTER(appleseed_version_minor)
{
    if (type == OIIO::TypeDesc::TypeInt)
    {
        reinterpret_cast<int*>(val)[0] = APPLESEED_VERSION_MINOR;

        if (derivs)
            clear_derivatives(type, val);

        return true;
    }

    return false;
}

IMPLEMENT_ATTR_GETTER(appleseed_version_patch)
{
    if (type == OIIO::TypeDesc::TypeInt)
    {
        reinterpret_cast<int*>(val)[0] = APPLESEED_VERSION_PATCH;

        if (derivs)
            clear_derivatives(type, val);

        return true;
    }

    return false;
}

IMPLEMENT_ATTR_GETTER(appleseed_version)
{
    if (type == OIIO::TypeDesc::TypeInt)
    {
        reinterpret_cast<int*>(val)[0] = APPLESEED_VERSION;

        if (derivs)
            clear_derivatives(type, val);

        return true;
    }

    return false;
}

#undef IMPLEMENT_ATTR_GETTER

#define IMPLEMENT_USER_DATA_GETTER(name)         \
    bool RendererServices::get_user_data_##name( \
        bool                    derivatives,     \
        OIIO::ustring           name,            \
        OIIO::TypeDesc          type,            \
        OSL::ShaderGlobals*     sg,              \
        void*                   val) const

IMPLEMENT_USER_DATA_GETTER(tn)
{
    if (type == OIIO::TypeDesc::TypeVector)
    {
        const ShadingPoint* shading_point =
            reinterpret_cast<const ShadingPoint*>(sg->renderstate);

        const Vector3d& tn = shading_point->get_shading_basis().get_tangent_u();
        OSL::Vec3 v(
            static_cast<float>(tn.x),
            static_cast<float>(tn.y),
            static_cast<float>(tn.z));

        reinterpret_cast<float*>(val)[0] = v.x;
        reinterpret_cast<float*>(val)[1] = v.y;
        reinterpret_cast<float*>(val)[2] = v.z;

        if (derivatives)
            clear_derivatives(type, val);

        return true;
    }

    return false;
}

IMPLEMENT_USER_DATA_GETTER(bn)
{
    if (type == OIIO::TypeDesc::TypeVector)
    {
        const ShadingPoint* shading_point =
            reinterpret_cast<const ShadingPoint*>(sg->renderstate);

        const Vector3d& bn = shading_point->get_shading_basis().get_tangent_v();
        OSL::Vec3 v(
            static_cast<float>(bn.x),
            static_cast<float>(bn.y),
            static_cast<float>(bn.z));

        // Make sure Bn points in the same direction as dPdv.
        if (v.dot(sg->dPdv) < 0.0f)
            v = -v;

        reinterpret_cast<float*>(val)[0] = v.x;
        reinterpret_cast<float*>(val)[1] = v.y;
        reinterpret_cast<float*>(val)[2] = v.z;

        if (derivatives)
            clear_derivatives(type, val);

        return true;
    }

    return false;
}

IMPLEMENT_USER_DATA_GETTER(dndu)
{
    if (type == OIIO::TypeDesc::TypeVector)
    {
        const ShadingPoint* shading_point =
            reinterpret_cast<const ShadingPoint*>(sg->renderstate);

        const Vector3d& dndu = shading_point->get_dndu(0);
        reinterpret_cast<float*>(val)[0] = static_cast<float>(dndu.x);
        reinterpret_cast<float*>(val)[1] = static_cast<float>(dndu.y);
        reinterpret_cast<float*>(val)[2] = static_cast<float>(dndu.z);

        if (derivatives)
            clear_derivatives(type, val);

        return true;
    }

    return false;
}

IMPLEMENT_USER_DATA_GETTER(dndv)
{
    if (type == OIIO::TypeDesc::TypeVector)
    {
        const ShadingPoint* shading_point =
            reinterpret_cast<const ShadingPoint*>(sg->renderstate);

        const Vector3d& dndv = shading_point->get_dndv(0);
        reinterpret_cast<float*>(val)[0] = static_cast<float>(dndv.x);
        reinterpret_cast<float*>(val)[1] = static_cast<float>(dndv.y);
        reinterpret_cast<float*>(val)[2] = static_cast<float>(dndv.z);

        if (derivatives)
            clear_derivatives(type, val);

        return true;
    }

    return false;
}

IMPLEMENT_USER_DATA_GETTER(vertex_color)
{
    if (type == OIIO::TypeDesc::TypeColor)
    {
        const ShadingPoint* shading_point =
            reinterpret_cast<const ShadingPoint*>(sg->renderstate);

        const Color3f& cv = shading_point->get_per_vertex_color();
        const OSL::Color3 v(cv.r, cv.g, cv.b);

        reinterpret_cast<float*>(val)[0] = v.x;
        reinterpret_cast<float*>(val)[1] = v.y;
        reinterpret_cast<float*>(val)[2] = v.z;

        if (derivatives)
            clear_derivatives(type, val);

        return true;
    }
    return false;
}

#undef IMPLEMENT_USER_DATA_GETTER

void RendererServices::clear_derivatives(
    const OIIO::TypeDesc&       type,
    void*                       val)
{
    if (type != OIIO::TypeDesc::TypeString)
        memset(reinterpret_cast<char*>(val) + type.size(), 0, 2 * type.size());
}

}   // namespace renderer


text:
Home / Headline News / In Flames Announce 20TH Anniversary Edition Of Breakout record 'Clayman'
In Flames Announce 20TH Anniversary Edition Of Breakout record 'Clayman'
Mark Smitty Neal June 11, 2020 Headline News, Music Video, News, Single Leave a comment
Sweden's influential and long revered heavy metal giants IN FLAMES are celebrating two major milestones in 2020 with their 30th anniversary as a band, and 20th anniversary of their seminal, critically acclaimed album, Clayman. In honor of this monumental occasion, Nuclear Blast Records presents a special 20th Anniversary Edition of Clayman, to be released on August 28th. Now available for pre-order here.
Friday, June 5th the band releases the lyric video for the first single, "Clayman (Re-Recorded)"here: https://youtu.be/pY-KFWxB_00
Front man, Anders Fridén says of the 20th Anniversary Edition:
"This record changed our career in a number of ways. Being the 20th anniversary this year, we had to do something massive for the fans. Going back into the studio to re-record some of the original tracks took us right back in time to when we first recorded them. Every detail of the new artwork and visuals was deeply thought out keeping in mind what the Jesterheads would want to see most. This one's for you. Thank you for 20 years of Clayman."
Clayman 20th Anniversary Edition comes entirely remastered by Ted Jensen (PANTERA, DEFONTES, GOJIRA) and features all new artwork in a 16-page booklet, a brand-new instrumental medley plus 4 re-recorded versions of fan-favorites such as "Only For The Weak" and "Pinball Map". Re-recorded songs were produced by Howard Benson (MY CHEMICAL ROMANCE, MOTÖRHEAD) and mixed by Chris Lord-Alge (GREEN DAY, ROB ZOMBIE). The record will be released digitally as well as on CD Digipak and a 2xLP colored vinyl packaged in a deluxe trifold that includes an oversized booklet, 11 remastered tracks on a 12" record and 5 bonus tracks on a 10" record in a printed sleeve.
Preceding the physical release of Clayman 20th Anniversary Edition, IN FLAMES will digitally release the Clayman 2020 EP on July 24th, which features the 2020 versions of "Only For The Weak", "Bullet Ride", "Pinball Map", "Clayman" and a new instrumental track, "Themes and Variations in D-Minor".
Pre-order your copy of Clayman 20th Anniversary Edition in the format of your choice here: www.inflames.com/Clayman2020
Pre-save the album on Spotify, Apple Music and Deezer and listen to the "Clayman" (Re-Recorded) single at: https://geni.us/InFlamesClayman2020
Listen and follow "In Flames – The Complete Discography" on Spotify: https://nblast.de/InFlamesSptfyComplete
In further celebration of the anniversary, IN FLAMES has teamed up with KNOTFEST to stream their Wacken 2018 headline performance and will be offering an exclusive, limited edition t-shirt during the stream. The show will air today @ 11am PST/ 2pm EST/ 8pm CET @ www.Knotfest.com for 72 hours.
Due to the ongoing COVID-19 pandemic, THE METAL TOUR OF THE YEAR with MEGADETH, LAMB OF GOD, TRIVIUM and IN FLAMES has been postponed to 2021. New dates will be announced as rescheduled. All tickets purchased will be honored accordingly.
Clayman 20th Anniversary Edition Track Listing:
Bullet Ride
Pinball Map
Only For The Weak
…As The Future Repeats Today
Square Nothing
Clayman
Satellites and Astronauts
Brush The Dust Away
Suburban Me
Another Day In Quicksand
Themes and Variations in D-Minor (instrumental)
Only For The Weak (Re-recorded)
Bullet Ride (Re-recorded)
Pinball Map (Re-recorded)
Clayman (Re-recorded)
Tags heavy metal In Flames Music Video
About Mark Smitty Neal
NewYork Based Photographer. Music Enthusiast with a background in Graphic Design. Whether I'm shooting a live event or just out wondering the streets its about capturing the moment.
Previous Destruction Release New Single "Nailed To The Cross"
Next Enslaved Announce Cinematic Summer Tour
Ten Penny Gypsy Releases Vintage-Themed Music Video for Studio Outtake "River N' Me"
Lasciaté Reforms, Releases Video For New Single "IED"
The Hate Club release intense, animated video for "Burn in Hell"
Metalcore act I, OF THE STORM has released its newest single, the tastefully blended, cyberpunk-influenced track "Cataclysm". Musically …

redpajama_set_name: RedPajamaCommonCrawl


We are thrilled that you'll be joining us this summer for Axis Connect 2017! Please submit your deposit or tuition payment below. To take advantage of the Early Bird rates, payments must be made in full by April 15th.
Deposit of $250.00 secures your spot and is applied toward your tuition.


text:
Displaying items by tag: sustainability
Sustainability To The Fore At This Weekend's RYANI Youth Championships
Youth sailors from all over Northern Ireland are getting ready for RYANI's Youth Championships weekend at Strangford Lough Yacht Club from today, Saturday 21 September, with over 160 sailors competing for the coveted Northern Ireland Schools Cup and Club Trophy.
As previously reported on Afloat.ie, this is the 30th year of the popular competition — and this year there is a focus on reducing plastic and ensuring the event is more environmentally sustainable in line with The Green Blue Charter.
In 2018, The Green Blue and RYANI delivered a series of workshops to educate clubs and instructors in Strangford Lough on the importance of protecting marine habitats and species in this area of natural beauty.
A new-look website has also recently been launched which provides useful resources as well as educational activities for young boaters that can be delivered on the water and onshore.
The most popular of these is Marine CSI, which gives young people the chance to become marine 'special agents' by analysing fingerprints, unscrambling puzzles and testing water samples.
By working towards an environmentally self-regulating boating community, The Green Blue aims to help boaters minimise the impact they have on the environment and protect wildlife and its habitats so they can enjoy the marine environment far into the future.
Strangford Lough Yacht Club
Sailing Towards Leadership in Sustainable Shipping Stena Line Outlines
#ferries - Artificial Intelligence (AI) assisted vessels to save fuel, battery power propulsion, huge reduction of single use plastic on board, continued low level of crew and passenger accidents and an increased rate of female leaders. These are some of the highlights in leading ferry company Stena Lines sustainability review for 2018.
The ferry operator has now released its third sustainability review "A Sustainable Journey" describing initiatives, improvements and challenges in the operations from the sustainability perspective as well as results on their ambitious sustainability targets. The review also highlights the main initiatives the company has worked on during the past year.
Stena Line CEO Niclas Mårtensson said: "With size comes responsibility and our ambition is to improve our operations every year to become a leader in sustainable shipping. The past year we have had exiting developments pairing artificial intelligence with the know-how of our experienced employees on-board as well as increased focus on electrification. We have continued our efforts within crew and passenger safety as well as launching a new initiative for more diversity in our operations. This is a very exciting time for our company and I'm proud that Stena Line continues help shape the industry for European short-sea transportation."
A sustainability strategy for Stena is divided into five focus areas tied to the UN Global Goals for sustainable development with ambitious targets set in each focus area. They are Equality & Inclusion, Good Health & Wellbeing, Clean Energy, Responsible Consumption, Life Below Water.
"We have more than 5,500 employees who all make big and small contributions towards our sustainability targets and it's great to see that we are making good progress in many areas while maintaining a safe and efficient operation. Our industry has a big challenge with our fossil dependence and our total carbon emissions increased in line with freight volumes so we have more to do in this area. The initiatives started within electrification are relatively new to our industry but extremely important going forward as we gradually move to low-carbon operations,"said Erik Lewenhaupt, Head of Sustainability.
The full review can be found through this link which leads to a download pdf file.
Published in Ferry
The Ocean Race & 11th Hour Racing Forge Partnership For Ocean Health On Earth Day
On Earth Day (Monday 22 April) The Ocean Race and 11th Hour Racing have forged a partnership that aims to bring sustainability initiatives to the heart of the race.
The Ocean Race says it is building on its position as the sustainability leader in global sport by announcing a visionary partnership with 11th Hour Racing — the largest of its kind in sport.
The legendary round-the-world sailing event and its premier partner will focus on a broad range of initiatives to promote the restoration of ocean health, embedding sustainability in all event operations.
As part of this 'Racing with Purpose' initiative, the partners have committed to a comprehensive action plan to initially:
Convene 11 Ocean Race Summits and Innovation Workshops, focused on ocean health, with the first being held in Europe in September 2019.
Work with experts and sailing teams to explore the use of state-of-the-art renewable energy systems onboard the IMOCA 60 and VO65 classes during the next edition of The Ocean Race in 2021.
Inspire school children around the world to take action for the ocean through a multi-lingual, curriculum-based, education programme, to be released in May 2019.
Continue the powerful science program developed in the last Ocean Race, which gathered critical oceanographic and microplastics data, and examine ways that all teams are able to participate in this groundbreaking research.
Inspire millions of Race Village visitors with the possibility of a sustainable world through interactive experiences at each stopover.
Johan Salen, managing director of The Ocean Race, said: "Through this partnership with 11th Hour Racing, and by harnessing the power of sport, we are using our collective global influence and extensive networks to reach millions of people to affect meaningful, long-term change for ocean health.
"The sailing community has a deep connection with the sea so it's natural that we would work together to safeguard its future. The integration of our collective vision within every area of our operations will engage and inspire the wider sailing community, teams, our stakeholders and suppliers, future host cities, schoolchildren and, of course, the race fans to take decisive action on this urgent issue."
11th Hour Racing says it works with the sailing community and maritime industries to advance solutions that protect and restore the health of our oceans.
The renewed and expanded partnership is intended to build on the momentum of the multi-award winning Sustainability Programme, featured in the past edition of the race, of which 11th Hour Racing was the founding principal partner.
"11th Hour Racing has developed an impact-driven model with sustainability at the core of all of its programs," said Wendy Schmidt, co-founder of 11th Hour Racing and president of The Schmidt Family Foundation.
"During the last edition of this iconic race around the planet, we raised visibility with the race crews, fans and students all over the world about the breadth of issues threatening the oceans and innovative solutions to address them, some that we already can put into practice. These efforts were a powerful catalyst for positive action.
'This is a unique opportunity to create a coalition between sport, business, and policymakers.'
"Together, we have the power to deliver science and sustainability through the platform of sport. 11th Hour Racing is excited to continue its collaboration with The Ocean Race to create one of the most forward thinking and unique sport sponsorships of our time."
The Ocean Race Summits aim to provide a platform that uses a mix of storytelling and groundbreaking announcements to help advance solutions to environmental issues. Industry-led Innovation Workshops will explore ways to evolve business models and reduce impact on the environment.
Growing the Learning Programme, used during the previous race by more than 110,000 children in 41 countries, a new science and sailing module will be launched this spring. This will provide the next generation with the tools to become future ocean advocates.
Published in Volvo Ocean Race
11th Hour Racing
Damian Foxall Named Irish Sailing Sustainability Ambassador
Irish Sailing has named Volvo Ocean race veteran Damian Foxall as its sustainability ambassador.
The national governing body for sailing in Ireland says the Kerry sailor — who served as sustainability manager for Vestas 11th Hour Racing in the most recent edition of the VOR — "has committed to helping us support sailors, clubs and centres to make sailing in Ireland environmentally sustainable and help reduce our carbon footprint.
"We are excited to announce that he has committed to attending a number of Irish Sailing events to help share advice on sustainability and environmental impact.
"Damian brings a wealth of knowledge and experience to the table for us all to learn from. He completed 10 round-the-world races and is a passionate ocean conservationist."
The ocean consultant will be guest speaker at the Irish Sailing Cruising Conference in Lough Ree Yacht Club next Saturday 16 February, and will also be presenting Irish Sailing's first Sustainability Award at tonight's Volvo Irish Sailing Awards – just a few days after his recent skiing adventures on Ireland's highest peak.
Published in ISA
Irish Sailing
Damian Foxall
'No Compromise' On Sustainability In Volvo Ocean Race Says Damian Foxall
#VOR - Kerry sailor and Volvo Ocean Race veteran Damian Foxall had a very different role in the most recent edition of the round-the-world yacht race.
As sustainability manager for Vestas 11th Hour Racing, Foxall was responsible for guiding the team towards the title of the race's 'most sustainable'. His secret? "No compromise."
Foxall spoke to Sport Sustainability Journal upon the publication of his team's comprehensive sustainability report, which outlines various initiatives from grants for local projects along the route, to carbon reduction and offsetting on the yacht and among the crew.
The latter included the likes of reduced plastic packaging for official race clothing supplied by Musto, to 'meatless Mondays' below deck.
"The further we got into the race … we found sustainability brought a depth and strength to our team," Foxall says.
Sport Sustainability Journal has much more on the story HERE.
Inland Fisheries Ireland Signs Up To Save Energy With SEAI
#IFI - Inland Fisheries Ireland has officially signed up to the Sustainable Energy Authority of Ireland's (SEAI) Partnership Programme, which helps integrate energy management into public sector organisations.
This new partnership will see IFI follow a clear path to achieving targeted energy savings of 33% across the public sector, with a view to achieving year-on-year savings of greater than 3% on top of the 21% increase in efficiency already reached sector-wide.
The State fisheries body says it has already commenced a number of energy saving initiatives in recent years, which include the introduction of 'green patrols' for fisheries officers using kayaks and bicycles to patrol angling areas on inland waterways; installing solar panels and insulation on buildings; fuel monitoring and fleet audits; altering lighting; and trialling an electric vehicle.
IFI chief executive Dr Ciaran Byrne commented: "As custodians of the fisheries resource, Inland Fisheries Ireland recognises the importance of energy management as a highly cost-effective means of reducing greenhouse gas emissions and helping to reverse climate change.
"Today [Tuesday 7 March] we have formally committed to reducing our energy usage and our carbon emissions and we look forward to working with the SEAI on reaching our goal by 2020.
"There are many benefits to energy efficiency and aside from environmental reasons; we are also motivated by the desire to operate in a lean manner. We know that many organisations can achieve 20% monetary savings in energy use through proven management and technology solutions so as an organisation, we will benefit year on year."
Jim Gannon, CEO of the SEAI, added that the agency "is working closely with the public sector to help them to achieve energy savings and agencies such as IFI have a key role to play.
"Already, public bodies have achieved more than €600 million in energy efficiency savings in the last few years with SEAI's assistance. With more partnerships like the one Inland Fisheries Ireland has committed to today, even more public sector savings can be achieved as we move towards a low carbon future."
Published in News Update
Lough Neagh Joins List Of Top 100 Sustainable Destinations
#Tourism - Lough Neagh joins an exclusive list of 100 'sustainable destinations' after its success in a global tourism competition this week.
As the News Letter reports, the largest inland waterway in the island of Ireland was put forward for evaluation by the Green Destinations Top 100 team, which narrowed down 150 nominees around the world to those taking sustainability most seriously for locals and tourists alike.
Eimear Kearney of the Lough Neagh Partnership was on hand to accept the prestigious designation at the Global Sustainability Competition in Ljubljana, Slovenia.
"For Lough Neagh to be named among the 100 greenest of destinations worldwide is a real achievement," she said.
The partnership has recently launched a new scheme to improve habitats for protected bird species around the lough, according to BBC News.
The good news for Lough Neagh comes in the same week that a number of maritime tourism operators were featured at the 2016 Irish Responsible Tourism Awards, as previously reported on Afloat.ie.
Published in Aquatic Tourism
Dublin Port Hails Recycling Rates In Latest Sustainability Report
#DublinPort - Dublin Port achieved a 97% recycling rate in 2015, according to its latest sustainability report.
Published over the summer, the report also highlights a 97% reduction in water consumption and a successful surveillance audit for the ISO 14001 environmental management standards among its achievements in a year that saw significant increases in imports and exports, trade vehicles and passenger numbers.
Trade volumes have continued to rise into 2016, with an 8% increase in the first six months of this year, as previously reported on Afloat.ie.
This is the third sustainability report released by the Dublin Port Company since statistics were first compiled for 2013.
Published in Dublin Port
Green Business Hub For Belfast Lough Foreshore
#BelfastLough - Belfast Lough's north foreshore will soon be home to a concentration of sustainable businesses that promises to be a first for Northern Ireland.
UTV News reports on the Cleantech Hub, a 30-acre waterfront site at Giant's Park aimed at firms in the renewables, environmental and low-carbon sectors.
Already adjacent to the site is a plant that converts gas from landfill to electricity powering 2,500 homes.
And it's hoped that the new scheme "will now firmly position the city as a leading destination for green technology, enhancing the profile of the sector here, as well as generating interest beyond these shores," according to David McNellis of agents Lisney, managing the hub on behalf of Belfast City Council.
UTV News has more on the story HERE.
Published in Belfast Lough
Cleantech Hub
Marine Minister Launches Draft National Strategic Plan For Sustainable Aquaculture
#Aquaculture - Marine Minister Simon Coveney yesterday (12 June) launched a public consultation on a draft National Strategic Plan for Sustainable Aquaculture Development, proposing 24 actions and initiatives to boost the sustainable growth of aquaculture.
The reformed Common Fisheries Policy requires EU member states to prepare multi-annual national strategic plans to drive forward the sustainable development of aquaculture, and the draft plan launched this week has been prepared in that context.
Commenting on the plan, Minister Coveney said: "Aquaculture is a rapidly growing industry internationally with very rapid expansion opportunities identified over the coming decades to meet the ever growing seafood demand arising from population growth and increased consumption in Asia.
"Aquaculture internationally produced 67 million tonnes of farmed fish in 2012 and it is projected to increase to 85 million tonnes by 2022. That global projection to increase aquaculture production by 18 million tonnes by 2022, puts in context the proposals in the National Strategic Aquaculture Plan to increase Irish aquaculture production by 45,000 tonnes, across all species, by 2023.
"While the targets in the plan are ambitious in the context of the past performance of this industry nationally, they are modest in the context of the global expansion which this industry will experience over the next seven years."
Minister Coveney added that "our aquaculture industry has long been recognised as an area with potential to grow significant value and employment and to sustainably provide the raw material to enhance our processed seafood exports. Clearly, that has not happened and there are many complex reasons for that.
"At the same time, concerns have been raised about the environmental sustainability of the industry. In this plan, I have sought to identify all of the issues affecting both the growth potential and sustainability of the aquaculture industry and I am proposing a suite of 24 tailored actions to boost sustainable growth, while allaying legitimate areas of concern.
"With these initiatives, I believe we can get our aquaculture sector back on a path of sustainable growth and provide much needed jobs in our coastal communities."
Actions proposed in the draft plan include the introduction of a set of guiding principles for the sustainable development of aquaculture, recommended to the minister by the Marine Institute, together with scale limits and phasing in relation to the development of individual offshore salmon farms, also recommended by the Marine Institute.
Other initiatives include a review of the regulatory framework for aquaculture licensing and associated administrative procedures, and financial supports to build capacity, foster knowledge, innovation and technology transfer and expert advice and training for aquaculture operators in business planning, disease management and environmental best practice.
Submissions on the draft plan and related environmental report and appropriate assessment are invited by 24 July 2015 to [email protected] Relevant documents are available for download HERE.
Published in Fishing


Megan Blumenreich is Assistant Professor of Education at The City College of New York, The City University of New York, where she teaches teacher research. She previously taught public school in Compton, California. In addition, she was Director of The Learning Center, an educational program at New York Presbyterian Hospital for HIV-positive children. She has published articles on HIV, equity, and qualitative research.
Email planningservices@heinemann.com if you would like to contact Megan Blumenreich directly about professional development support.


"Next time you visit, you'll get to cook here," said my mom as she showed me her new kitchen. Because her house had flooded in Houston's heavy rains of 2016, she had spent the most of the past year rebuilding her house. When I was there in April, it wasn't quite ready for her to move into yet, but I was giving her advice on how to organize her new space. Everyone has gifts to offer and as a kitchen person, I reckon one of mine is good ideas about where pots and pans should go in relation to the oven and stove.
Since my mom's an Episcopal priest, her house is a rectory. This means that it's not only her home but also a space where people in her church gather for meetings and celebrations. Shortly after my visit, she moved back and it seemed like every time I talked to her she was having another party, sometimes several in one weekend. When they restored her kitchen, she had opened the space by tearing down walls and lengthening the counters so it was more conducive to people visiting as they served themselves from a long line of dishes, bowls, and plates.
Now, my mom's not only a Texan who loves her home state's cuisine, but she's also proud of her kids, so she enjoys cooking from my blog and books and bragging about where she got the recipe. I had put her on testing duty last year for Queso!, so she's been serving lots of dishes from that over the summer, as melted cheese always makes for a fine party food, though for potlucks she also enjoys sharing Aaron Franklin's pinto beans and the peach cobbler recipe from my first cookbook.
That cobbler is an adaptation of one made by my great-grandmother. Of course, I've tinkered with it a bit and besides being seasoned with the traditional cinnamon I also stir in a dash of ginger, too. That makes it a little exotic, but it's still a homey, classic dessert that can feed lots of people easily. Mom says it's not only a cinch to make but it's always a hit.
This past week, as I'm sure you know, a hurricane hit Texas. The coastal towns of Rockport and Port Aransas were wrecked by the wind and the storm, and much of the Houston area is drowning in water, too. The flooding and devastation are tragic and every time I look at pictures, I feel hopeless and distraught.
My mom's house began to flood early Sunday so she's currently staying with friends on higher and drier land. Before the storm she had been in Oregon visiting my brother and his family, so I assumed she'd just stay there and wait until it passed, but she said she wanted to come home to be there for her church. And she has, as every day she prays with her parishioners on Facebook. Since many are without homes or stranded right now, those moments have been a gift for them.
My heart goes out to all those who have been affected by the storm. Yet despite the destruction, there've also been glimmers of hope. For instance, people have opened their homes and businesses to those have been displaced; people have navigated their boats through the water to rescue those who were stranded; people have donated cash and goods to local shelters; and people have cooked for those who had no longer had the means to feed themselves. Indeed, if we put aside our differences, offer our gifts, and treat each other with generosity and kindness, we can make it through this challenging time.
My strengths are in the kitchen, but since I'm so far and can't do anything on the ground, I like to donate to local groups that help feed people, such as The Houston Food Bank, The Food Bank of Corpus Christi, Southeast Texas Food Bank, and Feeding Texas. Here's a list of other groups also providing assistance and relief.
But I've also been cooking, as that helps me feel better, too. If you're feeding others or just want a comforting dish, here's the peach cobbler that fed so many of my mom's friends this summer. It brought them joy and in these challenging times, perhaps it will bring some joy to you and yours, too. And I have hope for our future, as Texans are brave, generous, and strong.
Pour the melted butter into a 10-inch cast-iron skillet or a 9-inch baking pan. Whisk together the flour, sugar, baking powder, and salt until well blended then stir in the milk until smooth. Evenly pour the batter over the butter but do not stir!
Toss the peaches with the cinnamon and ginger then layer on top of the batter. Bake uncovered for 45 minutes or until lightly browned. Serve warm.
Tracy–So glad your family's homes are still standing. At least she covered the downstairs with tile instead of carpet, so that should mitigate some of the damage!
I have a very similar, cherished recipe from my grandmother. The ginger is a great addition. I'll be sure to include that on the next go 'round. As always, thanks for the great Texas foods resource. I've been craving sour cream chicken enchiladas lately. Your recipe gets me as close to home as possible without buying a ticket.
Sorry for your Mom's loss. But it's great to see the nation, if not at least the south, coming together to support those in need. Too bad it takes a storm to do it. We are heading to the coast from SATX Friday with four truck loads of supplies.
Vicky Lynn–Ginger with peaches is one of my favorite combinations. And thank you for reminding me it's been too long since I had sour cream chicken enchiladas!
THoey1963–Yes, it is always heartening to see people coming together. And enjoy your new skillet! It's just about the only think I cook with these days.
hey Lisa: I am a Houston Native living in Louisville, KY and my heart aches watching all the flooding. Takes me back to Hurricane Katrina(12yrs ago) friends/family were affected. praying for your mother and all of Texas. My family/friends there are OK. Thanks for giving me a little peace/joy with this Peach Cobbler recipe. Reminds me of my summers at my grandmothers in Houston and it makes me smile.
So glad she's safe and alive. The stories are heartbreaking. Will make this lovely cobbler this weekend and keep Texas in my heart. Thank you for sharing.
I'm am so sorry for your Mom's loss. It brightens my day knowing she is helping her parishioners through this. The whole southern Texas coast has been wrecked. We now have rivers flooding areas that were originally spared by the rain. It is heartbreaking.
I was taking food to our first responders. Do you think this would double/triple well? Not sure I can even find peaches at the store because every store is low on groceries. But it is such a comforting food, I would love to try. Thank you!
I think there might be a typo in the recipe. 1/4 cup of butter is not 1 stick – 1 stick is 1/2 cup. Maybe 1/4 lb.?
April–So glad your family is okay! And there are no better memories then a summer with your grandparents.
Petrone–Yes, please keep Texas in your heart. Thank you.
Christy–Yes, it should double or triple very well. I'd bake it for longer, though. Perhaps add 10 minutes and then check on it.
Anon–Thank you for spotting this. Much appreciated and now fixed!
new to your blog – we are praying for TX too – it's very good to see so many of them facing this super tough time with care for each other (strangers or not) and working together. They are showing us the way forward in this, I hope and pray! …. lovely recipe of course… and I loved reading about your Mother's kitchen. We are so blessed to have such good strong Mothers.
Lisa, so sorry to hear about your mom's place. My folks had to evacuate and can't check on the house since the neighborhood is still flooded from the Addicks Reservoir spillover. Our hometown is strong, and everyone will grow stronger through this. Let's all keep praying and doing what we can. Hugs.
Keeping your family in my prayers. Hope they are ok.
So sorry for your mom to go through this flood again. My two daughters live in Houston, but they were blessed with no damage to their homes. I am forwarding this recipe to my daughter as she is cooking to take meals to the first responders at the fire station near her house. Thank you for this post, it brightened my day!
elizabeth–Welcome! I agree, seeing everyone coming together and helping one another has been such a bright spot.
talida–Oh, no! I'm so sorry and I hope they get to see their home soon and it's not too bad.
Carolyn Doss–The first responders will love this. I'm glad your daughters are okay and are able to cook for them!
As a fellow second time flood experiencer I know how your Mom is feeling these days. This has been a hard, hard week for all Houston and SE Texas, doubly so for this of us who flooded a mere 16 months ago. I too did some work in my kitchen when I rebuilt last year; my builder is hopeful he can salvage some of it and then rebuild the rest. It's hard, but I have been blessed to be helped and loved by so many people as I start to recover.Prayers for your Mom and so so many others here in our wonderful city.
As a Houstonian, I too am so thankful for the first responders, and I hope that your mother's home/rectory is on its way to drying out. Where is you mother's church?
I will definitely make this cobbler for those who housed me.
Anon–Ground ginger. Thank you for asking, I'll now clarify that in the recipe.
Sending prayers to your mom and all of the rest of Texas.
I have buttermilk instead of milk; is there a way to adjust the recipe to use buttermilk?
MPM–I've never made the recipe with buttermilk but I reckon it could turn out just fine.


text:
The following highways are numbered 10N.

United States
 U.S. Route 10N (Montana) (former)
 U.S. Route 10N (Minnesota) (former)
 New Jersey Route 10N (former)

See also
List of highways numbered 10

redpajama_set_name: RedPajamaWikipedia


Back to our birthplace: everyone's invited!
Session 1: "Youth Climate Action": This session aims at highlighting inspiring stories and successes of young people, from all over the world, passionate to change the world.
Session 2: "Redesign the World": In this workshop participants will take on the role of social entrepreneurs as they start ideas for a better world.
The evening is free of charge and the participants do not need to pre-register in order to participate. Both activites will be held in English. We will be offering free snacks and non-alcoholic drinks during the break.
We want to thank our amazing partners: Hållbart Universitet – Lund Students for Sustainability, the City of Lund, and Ungdomsforum för Agenda 21 (UFO). Without their support and contribution this event would not be possible.


text:
Le fusil Potzdam modèle d'infanterie 1723 ou M1723/M1740 du Potzdam fut la première arme d'épaule standard de l' armée prussienne. C'était le rival du fusil Charleville (1717) de fabrication française et du Brown Bess (1722) fabriquée en Grande-Bretagne.

Origine du nom
Potzdam, tout près de Berlin, était le lieu de résidence préféré de Frédéric le Grand de Prusse, ainsi que la ville où le mousquet a été fabriqué, d'où son nom.

Après son couronnement en 1740, Frédéric II dote son armée de la version 1723 du mousquet prussien alors en vigueur. Le mousquet de Potzdam s'était déjà fait un nom en étant le premier mousquet de fabrication allemande standard, et le modèle commandé en 1740 a renforcé Potzdam comme arsenal clé d'Allemagne. Les mousquets ont été largement utilisés par les Prussiens et les soldats des différentes principautés allemandes au . Les troupes hessiennes embauchées par les Britanniques ainsi que des troupes d'autres principautés allemandes dans les treize colonies britanniques révoltées d'Amérique ont également utilisé les mousquets contre les rebelles.

Bien que le M1723/M1740 ait finalement cédé la place au Fusil Potzdam modèle d'infanterie 1809, il était encore utilisé par les soldats prussiens à la bataille de Waterloo en 1815 et au-delà.

Notes et références

Arme militaire fabriquée en Allemagne
Pages avec des traductions non relues


Jetradar compares airfares from Manchester to Bangalore with hundreds of airlines (including Lufthansa, British Airways, Air France) and dozens of online travel agencies in one single place. We provide you with all the options to find the cheapest flights to Bangalore, you choose where to book. Also there you can find airlines special offers from Manchester to Bangalore. The cheapest round-trip price found within the last week was C$874. The cheapest oneway price found within the last week was C$911.
The distance between Manchester and Bangalore is 5079 miles (or 8174 kilometers).
When you fly from Manchester to Bangalore, don't forget about the time difference. The time in Bangalore is 05:30 from the Manchester time. The current time in Bangalore is 06:18 AM and 12:48 AM in Manchester. Check this again shortly before your flight.
The currency exchange rate between Manchester (MAN) and Bangalore (BLR) is 1 GBP = 83.71 INR.


text:
The Toxic Remnants of War Project:
exploring state responsibility for the
toxic legacy of military activities.
Using citizen science to assess environmental damage in the Syrian conflict
Posted by Doug Weir	on Jan 22, 2016	in Blog, Conflict waste, Environmental damage, Health, News, Policy, Protection of civilians, Remediation, Syria, UNEP	| No Comments
For new and ongoing conflicts across the world, the need to document their impact on civilians and the environment upon which they depend is encouraging the development of new research tools and methodologies. Traditional approaches for monitoring environmental risks are notoriously reliant on field access for experts. But with civilians increasingly able to access the Internet and mobile networks, and with their growing use by warring parties, new opportunities are being created for the collection of environmental data, by experts and civilians alike.
Following on from the blog Online Identification of Conflict Related Environmental Damage, which focused on Syria, this blog briefly examines the potential for using citizen science tools in Syria to quantify the extent of environmental degradation. Could citizen science tools inform both efforts to reduce threats to public health from environmental risks, and longer term remediation plans?
The conflict in Syria is entering its fifth year. It has resulted in widespread destruction to residential and industrial areas, critical infrastructure, the oil and gas industry and the total collapse of environmental governance in affected areas. Moreover, the hosting of refugees in neighbouring countries is placing a huge strain on national infrastructure, natural resources and biodiversity. What information there is available from within Syria indicates that the environmental impact of the fighting has resulted in toxic and hazardous hotspots, with acute and chronic risks to public health.
The rise of citizen science in the last four decades has opened up new opportunities for humanitarian and environmental organisations, with the range of hardware and software applications available steadily increasing. Citizen science can be defined as: "Scientific work undertaken by members of the general public, often in collaboration with or under the direction of professional scientists and scientific institutions," and it has greatly contributed to broadening the participation of non-scientists in a range of scientific projects. So, could citizen science be used to identify and monitor environmental impacts in Syria and other conflicts, and what other benefits might arise from civilians participating in such projects?
Community led citizen science projects are increasingly common in peacetime, gathering environmental data on everything from air pollution to biodiversity. Could these approaches be used in conflict and post-conflict settings to gather data on environmental risks and in doing so help empower communities?
Monitoring and assessing environmental impacts through citizen science in conflict and post-conflict settings could help overcome specific difficulties relating to the documentation of environmental hazards caused by conflict. Overall, environmental data collection during conflicts is often minimal, primarily because of the security constraints faced by external specialists. A further constraint is that of technical expertise and access to monitoring equipment. Where comprehensive environmental impact assessments (EIAs) are done, these may only be possible following the cessation of hostilities and the restoration of security. Political and funding constraints often mean that many conflicts are not thoroughly assessed in this way.
For conflicts where post-conflict EIAs are undertaken, data from citizen science initiatives could help broaden the temporal scope of the EIA, highlighting changes to environmental quality over time. They could also help direct those undertaking post-conflict assessments to environmental problems and, by increasing visibility and raising awareness of environmental threats during the conflict itself could help encourage the support of the international donors that fund formal EIAs.
Moreover, being able to contribute to analysing the conflict's environmental impact on their community, and receive feedback and support, could prove a useful tool for risk education and in strengthening civilians' sense of agency in such settings. In Syria's case, civilian access to smartphones and the Internet is widespread, potentially providing opportunities for both civilians and humanitarian organisations to contribute to data collection efforts.
What tools are available?
Different citizen science tools can provide different levels of scientific detail and accuracy. The more complex tools can help provide highly informative analytical outputs that help quantify problems. The more simple tools can produce less technical outputs but can nevertheless act as a stepping stone for more thorough scientific investigation.
Table 1 lists a number of peacetime citizen science tools and their outcomes that could be applicable in Syria in order to record, asses and share data
Photos and video footage
Images and footage of environmental damage can be recorded and shared for verification and analysis. Footage such as this can help guide further in-depth assessment and help inform residents of risks. Observation and recording.
SMS data entry, smart phone applications
Questionnaires can be shared widely and rapidly within a residential population. They can record anecdotal and visual evidence of environmental damage. Anecdotal evidence and recording.
Mobile phone and handheld technology applications
These technologies are application reliant and can include a number of useful tools. Smart phones are widely available. Observation and recording, anecdotal evidence, analysis.
Often included in smart phone applications this tool can aid the rapid mapping of data to help highlight hotspots of environmental damage. Geo-locating/geo-tagging.
The technical knowledge needed varies between kits and what is being tested for. Many kits need little or no training and are easy to use, with little chance for error. Cost may be a barrier to their widespread use. Sampling and analysis
Observation & recording
One of the least technical forms (requiring the least training) of citizen science is observation and recording, where visual changes to the environment are documented. In peacetime settings these are often easily identifiable environmental changes, such as the time of year colour change occurs in leaves or tree species. For recording toxic remnants of war (TRW) in Syria, this could be used for recording the presence of asbestos in conflict rubble, which is easily identifiable without the need for handling; the recording and geo-tagging of craters where artillery has fallen and could contain explosive residues as well as UXOs; or attacks on industrial sites where hazards substances are stored or processed.
The data could be fed into a larger database or mapping system by social media, email or SMS, or via specially developed data input applications that are readily available to stakeholder groups. This would require a coordinated effort that includes UN specialists, humanitarian organisations, environmental experts and civil society to provide analysis and feedback to those participating in the project.
Observation and recording could simply be the retention of photographic evidence following the targeting of urban areas, which would provide an on the ground view for first responders and residents who may need advice on risk avoidance if certain forms of environmental contamination are present. It could also aid more long-term environmental clean-up programmes[i].
Anecdotal and visual evidence can be recorded electronically via SMS and smartphone applications. Programmes such as "Textit" allow a number of specific questions to be put to residents, and also provide advice based on the responses given. Mobile phones are widely available in Syria and can send data to the central database whenever there is a signal present, without relying on constant access to a mobile phone network. This could be beneficial in conflict zones where communication services can be intermittent. The incoming data would be useful as an initial assessment of the most prominent and widespread environmental problems in a given area and could help guide the use of further citizen science applications for more detailed assessment[ii].
Sampling and analysis
Some peacetime citizen science schemes involve the use of basic sampling techniques; these may require some instruction in how to use the low-cost apparatus. One example is the Air Monitoring Network in the UK. These uncomplicated technologies would be easily transferable to conflict and post-conflict settings, or even peacetime military settings such as domestic firing ranges. Tools for measuring contamination would be applicable in scenarios where there could be acute health hazards such as contaminated water resources, exposure to explosive or industrial substances and contamination in densely populated or agricultural areas.
Other common forms of conflict pollution may need a higher level of technical expertise and training. This is necessary to obtain laboratory acceptable samples for analysis to identify substances such as the heavy metals that are associated with the use of munitions (lead, mercury, copper, zinc, antimony, tin or arsenic) in built-up areas and which may be linked to chronic exposure illnesses such as cancers and kidney disease.
Table 2: Examples of sampling, analysis and data entry technologies for citizen science.
Tech name
Recording harmful military practices or conflict pollution
Required technology
Level of technicality needed
Usable without training?
Textit Questionnaire undertaken by SMS participation. Can help record anecdotal evidence of targeted infrastructure and easily visible impacts. Data is sent when a phone signal is available. No paper is needed, can have a wide coverage and requires fewer personnel to
conduct the surveys. Military practices. Visually noticeable incidents of pollution e.g. water discolouration. Mobile phone capable of SMS. Low: Ability to use a SMS is the minimum requirement. Yes: Phone
users will likely already know how to use SMS.
Expray Spray on colour change test for a wide range of explosive compounds. Can be applied to any solid surface to give rapid detection. Conflict pollution. Explosive residues in soils and on solid surfaces. Detection spray kit and colour change
chart. Smart
phone or internet access for data and location input. Low: Ability to follow instructions on how to use detection,spray and ability to enter data into citizen science repository. Yes: No training needed but would be preferable to avoid incorrect use.
Water quality test kits Low cost testing kit of water quality markers,(turbidity, BOD, conductivity, pH). Can show a change in water quality but not the cause. Indirect measurement of the impacts of conflict pollution. Test kit. Smart phone or internet access for test result and location input. Medium: Understanding of the scientific principles behind the various markers is not required but can help with on the spot analysis. No: Guidance in the use of the test kits,is necessary to ensure their proper use and usable data.
Diffusion tubes Measures particulate matter in the air over a set period of time from a fixed location. Multiple
tubes can be set up at one time to get coverage over a wide area. Conflict pollution: respirable particulate matter (PM10) in the air such as from rubble. Diffusion tubes. Access
to a courier service for analysis at a laboratory. Low: The placement and collection of the tubes needs no
expertise. No: Tubes can be set in place with little or no,instruction.
Smartphones and mobile phone networks can also provide a platform for informing civilians on safety and security issues. One example operating in Syria is the International Committee of the Red Cross' (ICRC) GPS based map, which informs Aleppo's citizens on where safe drinking water can be accessed. In another example, Norwegian People's Aid (NPA) initiated a website informing civilians of the dangers of unexploded ordnance (UXOs). Finally a project organised by Safecast sought to monitor radiation through open data collection in Iraq after the 2003 war. Though limited to those having a (smart)phone and internet access, these technologies build better streams of information that can help increase civilian protection by informing them of safe locations, resources and information on a range of hazards.
Mutual benefits
Citizen science is very much about the participation of non-scientifically trained but concerned volunteers. Projects could allow Syrians to become involved in decision-making processes and give communities a voice in telling the world about how war impacts their livelihoods and health, helping to demand change in military practices and holding states and individuals to account.
Residents can learn scientific and analytical skills, gain more knowledge about their neighbourhoods and how to protect and preserve sensitive environments, while sharing their own knowledge with the rest of the world. There is a real potential to develop an understanding of environmental principles and the relationship between a healthy environment and good health, food security and clean drinking water, as well as promoting ideas of environmental peace building and co-operation.
Improved information awareness and exchange could also alleviate broader psycho-social concerns. Civilians are often left in the dark with regard to changes in their environment and potential exposures to a range of hazardous substances. General concerns over wellbeing can also result in psycho-social impacts, when ill-defined environmental risks are attributed to health problems, which can results in a sense of helplessness and strengthen grievances. Providing clarity and information could help counter this. Information on specific environmental hazards could encourage behavioural changes that serve to minimise harm and in doing so help build stronger resilience mechanisms for conflict-affected communities, providing information resources to allow them to adapt to changes in their environment.
Limitations and additional risks
Undertaking citizen science in conflict and post-conflict zones carries with it risks and limitations that are not present in the peacetime settings for which many methodologies were developed. This requires particular care and attention in the training for, and conduct of, activities in these contexts. Some cases of contamination may involve substances with an extremely high level of toxicity, requiring personal protective equipment (PPE), and some background knowledge of how the substance behaves and potential exposure routes, in order to safely sample or assess its impact.
Asking citizen scientists to undertake high risk assessments in locations such as industrial sites can't be justified so data on these sites may be limited to anecdotal and visual assessment. Locations of interest may also be littered with UXOs, again placing citizen scientists at unnecessary risk. There is also the risk of conducting any sampling or observation and recording in active conflict zones, where there is the real and immediate risk to life from weapons use.
There are also logistical issues to consider, such as delivering sampling kits and chemicals across borders and into conflict zones. Two of the principal aims of citizen science initiatives during conflict are to overcome the time delay between a conflict ending and impact assessment teams conducting environmental studies, as well as the overall lack of data collection. Restrictions on the movement of equipment and samples could therefore seriously hinder projects.
These problems could potentially be overcome by including test kits in humanitarian aid packages and promoting the use of DIY alternatives, such as the use of sticky tape to sample particulate matter instead of diffusion tubes.
Citizen science applications have not been widely used in post-conflict zones to record and quantify environmental damage and conflict pollution before now. Although the available technologies and methodologies have a solid track record in peacetime settings, such as in community-led air monitoring – and even in more extreme settings, such as in tracking the movement of poachers – it is still unclear if they could be successfully applied in conflict contexts.
Nevertheless, and in spite of the risks and imitations outlined above, the Toxic Remnants of War Project believes that these approaching are worth exploring and piloting. If successful, the use of citizen science would be extremely useful in documenting harm and giving communities a voice in sharing and tackling the risks they face to their livelihoods and health, long after the conflicts they have lived through are over.
Andy Garrity is a researcher with the Toxic Remnants of War Project, which studies the environmental and humanitarian risks from conflict and military pollution, @AndyTRW; @detoxconflict.
Wim Zwijnenburg is the project leader for humanitarian disarmament at PAX, a Dutch peace organization and works on conflict and environment related issues in the Middle East. @wammezz @Paxforpeace
This blog was first published on Belling Cat.
[i] Some of these techniques have already been implemented in Syria under the guise of citizen journalism where human rights abuses have been recorded, verified and even mapped out during the ongoing conflict. A good independent example of this is the Syrian Observatory for Human Rights.
[ii] However questions relating to the secure transfer and storage of data would need to be resolved first in order to protect the identities of civilian participants.
Conflict waste
ICRC Nordic Pledge
Mine action
NSAGs
Oil infrastructure
PMSCs
Protection of civilians
research@toxicremnantsofwar.info
Bridge 5 Mill, 22a Beswick Street,
Ancoats, Manchester, UK, M4 7HR.
© 2020 Toxic Remnants of War Project All Rights Reserved.
Design by Ultimate Holding Company


text:
How To Bet On Horse Races For Beginners
21 Απριλίου 2021 Ημερομηνία
Our Football Tips & Predictions
Nhl Picks & Predictions
Breaking News: Scott Brown Unveiled As New Rangers Player
Betway Premier League Prediction
No league in the world is growing as rapidly as America's flagship division. Ride the wave with us as we offer free predictions for both the Eastern and Western Conferences. Boasting a thrilling brand of full-throttle, heavy metal football, many of the world's most exciting teams ply their trade in the Bundesliga. One thing's for sure, you'll never be bored when betting on Germany's best. To take full advantage of these tips, check out our Free Bets page for the latest, most lucrative offers from Britain's best bookies.
This numbers consists of the first betting line received from one of our Las Vegas or Global Sportsbooks. The opening line varies depending on the sportsbook but it provides a clear-cut rating that the oddsmakers use. If you're betting on the NBA or any other sport, it's a great idea to view the open line first.
Whether it's sign up bonus free bets, cash back on first and reload deposits, or even the rare no deposit bonus; we break down player rewards and guide bettors to the best of the bunch. After signup, customers can fund their bankroll with popular deposit options that are backed by top security Fantasy Nascar Pool Hosting & Management features, which move money fast and safely. Once there, bettors in Canada who are of legal age have access to an extensive list of handicapping options. There are 1000+ events in Real Time with our premium live wagering system. The practical use of the formula has been demonstrated for gambling and the same idea was used to explain diversification in investment management.
We take pride in our ability to provide a perspective from a sports fan and data nerd. Some of the folks on our team have worked in professional leagues before, like the National Basketball Association . Others have played and coached college football, while most are just avid fans with a passion for sports and drive to create a valuable product. California is the largest market in the US and we can only hope California sports betting legislation is once again introduced in 2021. People have been betting online in California illegally for years, but that takes tax dollars out of the state and increases player risk. The watch will be on in the early stages of 2022 as they are expected to pick back up where they left off in 2021.
Check out the table below for the ultimate bookmakers list. At the heart of the Superbettips is an algorithm that considers a huge range of factors. Broadly, there are two layers of data – primary factors include basic statistics like the average number of goals or the team's past performance. Events like transfers, suspensions and injuries are also factored in. The secondary set considers data that might affect player motivation, like weather or life events.
The page will list links to local assistance organizations, a questionnaire, and instructions on how to exclude / set limits. Watch the horse in the paddock.This is my favorite way to handicap a horse. Before every race, the horses are paraded around in an area of the track called the paddock. It gives you a chance to see how the horse looks and is behaving before the race starts.
Money Back As A Free Bet
Using in-depth printouts from a database second to none, Hollywood then takes into account injuries, weather, form, historical trends, league and offshore sources, and of course line movements. The Vegas Steam Line is a unique combination of some of the sharpest sports minds in the business. With over 50 years of combined sports handicapping knowledge, the Vegas Steam Line has found a way to bring you the most consistant winning selections around. Besides being good, they aren't afraid to show you just how good they are.


text:
Kiyonaga ist der Familienname folgender Personen:

 Takeru Kiyonaga (* 1994), japanischer Fußballspieler
 Torii Kiyonaga (1752–1815), japanischer Farbholzschnittkünstler


text:
Home Uncategorized Red Bull Take On Exciting New Cryptocurrency Sponsorship
Red Bull Take On Exciting New Cryptocurrency Sponsorship
Red Bull gives you wiiings, that's what they say right? According to recent reports, Red Bull could be about to give you one thing better than wings – cryptocurrency.
Okay, Red Bull aren't giving away Bitcoin, nor are they giving away cryptocurrency, however leading Formula 1 race team, Aston Martin Red Bull have recently announced a new partnership with FuturoCoin who will be sponsoring the Red Bull Formula 1 team for the 2019 race season.
This is a very exciting move for the crypto industry given that Formula 1 is one of the most popular motorsports in the world. In 2016, the Formula 1 season was watched by 390 million viewers, so we can bet that quite a few people are going to be made aware of FuturoCoin as a result of this new sponsorship deal. Perhaps we'll see 390 million new people invest in Bitcoin as a result of this? (We can dream at least).
According to The Checkered Flag, Christian Horner the Team Principal at Red Bull is very excited about the new sponsorship deal because he himself is super keen on the future of cryptocurrency and blockchain technology. Horner has commented:
"In recent years, the rise of blockchain technology and cryptocurrencies has been truly remarkable, and we're delighted to be the first Formula One team to embrace this, through our partnership with FuturoCoin. Secure digital currencies are on the leading edge of technological development and we are very excited to be part of this revolution."
Roman Ziemian, the Co-founder of FuturoCoin draws some sort of comparisons between FuturoCoin and the sheer speed and technology behind Formula 1. I think Ziemian is jesting that FuturoCoin is as technologically advanced and as fast as an Aston Martin Red Bull Formula 1 car:
"Cryptocurrencies and Formula One are very similar and their values are much alike; speed, technology and being ahead of their time. I'm a huge fan of motorsport and F1 has always intrigued me. The sponsorship is an exciting new chapter for our company and will be a global platform for us to drive awareness of FuturoCoin."
Paulina Woźniak, the CEO of FuturoCoin's management company has also added:
"We are very proud that FuturoCoin will be the first cryptocurrency in the world to appear on a Formula One car. In addition, we are looking forward to working alongside Aston Martin Red Bull Racing, a prestigious brand that is recognised across the world."
Previous articleEthereum (ETH)'s Average Number of New Daily Accounts Increases Despite Price Crash
Next articleRipple Announces 11 New Partnerships as Part of Its University Blockchain Research Initiative
'No loss lottery' makes $1m in equity finance
Kieran Burns - February 5, 2020
Despite criticisms, PoolTogether is most likely able to build a DeFi initiative with a new $1M equity injection, a new USDC pool...
Crypto mining, boosters Iran economy with $8.5 bn
Amir Hossein Saeedi Naeini, an official with Iran's ICT Guild Organization, reports that the crypto mining industry can boost...
European Central Bank begins research on benefits of euro CBDC
President of the European Central Bank (ECB) Christine Lagarde has announced that the ECB has assembled a task force to look into...
Bahamas sets to launch own digital currency
Like several other countries, The Bahamas' digital currency pilot project went live in Exuma as residents are now allowed to enroll...