text:
Q: C++ Raytracer with opengl display skew in specific resolution I have a ray tracer (from www.scratchapixel.com) that I use to write a image to memory that I then  display at once using Opengl (glut).  I use the width and height and divide the screen to get a Opengl point for every pixels.  It kinda works.
My problem is that my width has to be between 500 and 799.  It cannot be <= 499 of >= 800, witch doesn't make sense to me.  The image becomes skew.  I have tried it on 2 computers with the same result.
799x480

800x480

Here's the full code:
#define _USE_MATH_DEFINES
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <fstream>
#include <vector>
#include <iostream>
#include <cassert>
// OpenGl
#include "GL/glut.h"

GLuint width = 799, height = 480;
GLdouble width_step = 2.0f / width, height_step = 2.0f / height;

const int MAX_RAY_DEPTH = 3;
const double INFINITY = HUGE_VAL;

template<typename T>
class Vec3
{
public:
    T x, y, z;
    // Vector constructors.
    Vec3() : x(T(0)), y(T(0)), z(T(0)) {}
    Vec3(T xx) : x(xx), y(xx), z(xx) {}
    Vec3(T xx, T yy, T zz) : x(xx), y(yy), z(zz) {}
    // Vector normalisation.
    Vec3& normalize()
    {
        T nor = x * x + y * y + z * z;
        if (nor > 1) {
            T invNor = 1 / sqrt(nor);
            x *= invNor, y *= invNor, z *= invNor;
        }
        return *this;
    }
    // Vector operators.
    Vec3<T> operator * (const T &f) const { return Vec3<T>(x * f, y * f, z * f); }
    Vec3<T> operator * (const Vec3<T> &v) const { return Vec3<T>(x * v.x, y * v.y, z * v.z); }
    T dot(const Vec3<T> &v) const { return x * v.x + y * v.y + z * v.z; }
    Vec3<T> operator - (const Vec3<T> &v) const { return Vec3<T>(x - v.x, y - v.y, z - v.z); }
    Vec3<T> operator + (const Vec3<T> &v) const { return Vec3<T>(x + v.x, y + v.y, z + v.z); }
    Vec3<T>& operator += (const Vec3<T> &v) { x += v.x, y += v.y, z += v.z; return *this; }
    Vec3<T>& operator *= (const Vec3<T> &v) { x *= v.x, y *= v.y, z *= v.z; return *this; }
    Vec3<T> operator - () const { return Vec3<T>(-x, -y, -z); }

};

template<typename T>
class Sphere
{
public:
    // Sphere variables.
    Vec3<T> center;                         /// position of the sphere
    T radius, radius2;                      /// sphere radius and radius^2
    Vec3<T> surfaceColor, emissionColor;    /// surface color and emission (light)
    T transparency, reflection;             /// surface transparency and reflectivity

    // Sphere constructor.
    // position(c), radius(r), surface color(sc), reflectivity(refl), transparency(transp), emission color(ec)
    Sphere(const Vec3<T> &c, const T &r, const Vec3<T> &sc,
        const T &refl = 0, const T &transp = 0, const Vec3<T> &ec = 0) :
        center(c), radius(r), surfaceColor(sc), reflection(refl),
        transparency(transp), emissionColor(ec), radius2(r * r)
    {}

    // compute a ray-sphere intersection using the geometric solution
    bool intersect(const Vec3<T> &rayorig, const Vec3<T> &raydir, T *t0 = NULL, T *t1 = NULL) const
    {
        // we start with a vector (l) from the ray origin (rayorig) to the center of the curent sphere.
        Vec3<T> l = center - rayorig;
        // tca is a vector length in the direction of the normalise raydir.
        // its length is streched using dot until it forms a perfect right angle triangle with the l vector.
        T tca = l.dot(raydir);
        // if tca is < 0, the raydir is going in the opposite direction.  No need to go further.  Return false.
        if (tca < 0) return false;
        // if we keep on into the code, it's because the raydir may still hit the sphere.
        // l.dot(l) gives us the l vector length to the power of 2.  Then we use Pythagoras' theorem.
        // remove the length tca to the power of two (tca * tca) and we get a distance from the center of the sphere to the power of 2 (d2).
        T d2 = l.dot(l) - (tca * tca);
        // if this distance to the center (d2) is greater than the radius to the power of 2 (radius2), the raydir direction is missing the sphere.
        // No need to go further.  Return false.
        if (d2 > radius2) return false;
        // Pythagoras' theorem again: radius2 is the hypotenuse and d2 is one of the side.  Substraction gives the third side to the power of 2.
        // Using sqrt, we obtain the length thc.  thc is how deep tca goes into the sphere.
        T thc = sqrt(radius2 - d2);
        if (t0 != NULL && t1 != NULL) {
            // remove thc to tca and you get the length from the ray origin to the surface hit point of the sphere.
            *t0 = tca - thc;
            // add thc to tca and you get the length from the ray origin to the surface hit point of the back side of the sphere.
            *t1 = tca + thc;
        }
        // There is a intersection with a sphere, t0 and t1 have surface distances values.  Return true.
        return true;
    }
};

std::vector<Sphere<double> *> spheres;

// function to mix 2 T varables.
template<typename T>
T mix(const T &a, const T &b, const T &mix)
{
    return b * mix + a * (T(1) - mix);
}

// This is the main trace function. It takes a ray as argument (defined by its origin
// and direction). We test if this ray intersects any of the geometry in the scene.
// If the ray intersects an object, we compute the intersection point, the normal
// at the intersection point, and shade this point using this information.
// Shading depends on the surface property (is it transparent, reflective, diffuse).
// The function returns a color for the ray. If the ray intersects an object, it
// returns the color of the object at the intersection point, otherwise it returns
// the background color.
template<typename T>
Vec3<T> trace(const Vec3<T> &rayorig, const Vec3<T> &raydir,
    const std::vector<Sphere<T> *> &spheres, const int &depth)
{
    T tnear = INFINITY;
    const Sphere<T> *sphere = NULL;
    // Try to find intersection of this raydir with the spheres in the scene
    for (unsigned i = 0; i < spheres.size(); ++i) {
        T t0 = INFINITY, t1 = INFINITY;
        if (spheres[i]->intersect(rayorig, raydir, &t0, &t1)) {
            // is the rayorig inside the sphere (t0 < 0)?  If so, use the second hit (t0 = t1)
            if (t0 < 0) t0 = t1;
            // tnear is the last sphere intersection (or infinity).  Is t0 in front of tnear?
            if (t0 < tnear) {
                // if so, update tnear to this closer t0 and update the closest sphere
                tnear = t0;
                sphere = spheres[i];
            }
        }
    }
    // At this moment in the program, we have the closest sphere (sphere) and the closest hit position (tnear)
    // For this pixel, if there's no intersection with a sphere, return a Vec3 with the background color.
    if (!sphere) return Vec3<T>(.5); // Grey background color.
    // if we keep on with the code, it is because we had an intersection with at least one sphere.
    Vec3<T> surfaceColor = 0; // initialisation of the color of the ray/surface of the object intersected by the ray.
    Vec3<T> phit = rayorig + (raydir * tnear); // point of intersection.
    Vec3<T> nhit = phit - sphere->center; // normal at the intersection point.
    // if the normal and the view direction are not opposite to each other,
    // reverse the normal direction.
    if (raydir.dot(nhit) > 0) nhit = -nhit;
    nhit.normalize(); // normalize normal direction
    // The angle between raydir and the normal at point hit (not used).
    //T s_angle = acos(raydir.dot(nhit)) / ( sqrt(raydir.dot(raydir)) * sqrt(nhit.dot(nhit)));
    //T s_incidence = sin(s_angle);
    T bias = 1e-5; // add some bias to the point from which we will be tracing
    // Do we have transparency or reflection?
    if ((sphere->transparency > 0 || sphere->reflection > 0) && depth < MAX_RAY_DEPTH) {
        T IdotN = raydir.dot(nhit); // raydir.normal
        // I and N are not pointing in the same direction, so take the invert.
        T facingratio = std::max(T(0), -IdotN);
        // change the mix value between reflection and refraction to tweak the effect (fresnel effect)
        T fresneleffect = mix<T>(pow(1 - facingratio, 3), 1, 0.1);
        // compute reflection direction (not need to normalize because all vectors
        // are already normalized)
        Vec3<T> refldir = raydir - nhit * 2 * raydir.dot(nhit);
        Vec3<T> reflection = trace(phit + (nhit * bias), refldir, spheres, depth + 1);
        Vec3<T> refraction = 0;
        // if the sphere is also transparent compute refraction ray (transmission)
        if (sphere->transparency) {
            T ior = 1.2, eta = 1 / ior;
            T k = 1 - eta * eta * (1 - IdotN * IdotN);
            Vec3<T> refrdir = raydir * eta - nhit * (eta *  IdotN + sqrt(k));
            refraction = trace(phit - nhit * bias, refrdir, spheres, depth + 1);
        }
        // the result is a mix of reflection and refraction (if the sphere is transparent)
        surfaceColor = (reflection * fresneleffect + refraction * (1 - fresneleffect) * sphere->transparency) * sphere->surfaceColor;
    }
    else {
        // it's a diffuse object, no need to raytrace any further
        // Look at all sphere to find lights
        double shadow = 1.0;
        for (unsigned i = 0; i < spheres.size(); ++i) {
            if (spheres[i]->emissionColor.x > 0) {
                // this is a light
                Vec3<T> transmission = 1.0;
                Vec3<T> lightDirection = spheres[i]->center - phit;
                lightDirection.normalize();
                T light_angle = (acos(raydir.dot(lightDirection)) / ( sqrt(raydir.dot(raydir)) * sqrt(lightDirection.dot(lightDirection))));
                T light_incidence = sin(light_angle);
                for (unsigned j = 0; j < spheres.size(); ++j) {
                    if (i != j) {
                        T t0, t1;
                        // Does the ray from point hit to the light intersect an object?
                        // If so, calculate the shadow.
                        if (spheres[j]->intersect(phit + (nhit * bias), lightDirection, &t0, &t1)) {
                            shadow = std::max(0.0, shadow - (1.0 - spheres[j]->transparency));
                            transmission = transmission * spheres[j]->surfaceColor * shadow;
                            //break;
                        }
                    }
                }
                // For each light found, we add light transmission to the pixel.
                surfaceColor += sphere->surfaceColor * transmission *
                    std::max(T(0), nhit.dot(lightDirection)) * spheres[i]->emissionColor;
            }
        }
    }
    return surfaceColor + sphere->emissionColor;
}

// Main rendering function. We compute a camera ray for each pixel of the image,
// trace it and return a color. If the ray hits a sphere, we return the color of the
// sphere at the intersection point, else we return the background color.
Vec3<double> *image = new Vec3<double>[width * height];
static Vec3<double> cam_pos = Vec3<double>(0);
template<typename T>
void render(const std::vector<Sphere<T> *> &spheres)
{
    Vec3<T> *pixel = image;
    T invWidth = 1 / T(width), invHeight = 1 / T(height);
    T fov = 30, aspectratio = T(width) / T(height);
    T angle = tan(M_PI * 0.5 * fov / T(180));
    // Trace rays
    for (GLuint y = 0; y < height; ++y) {
        for (GLuint x = 0; x < width; ++x, ++pixel) {
            T xx = (2 * ((x + 0.5) * invWidth) - 1) * angle * aspectratio;
            T yy = (1 - 2 * ((y + 0.5) * invHeight)) * angle;
            Vec3<T> raydir(xx, yy, -1);
            raydir.normalize();
            *pixel = trace(cam_pos, raydir, spheres, 0);
        }
    }
}

//********************************** OPEN GL ***********************************************

void init(void)
{
    /* Select clearing (background) color */
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glShadeModel(GL_FLAT);

    /* Initialize viewing values */
    //glMatrixMode(GL_PROJECTION);
    gluOrtho2D(0,width,0,height);
}

void advanceDisplay(void)
{
    cam_pos.z = cam_pos.z - 2;
    glutPostRedisplay();
}

void backDisplay(void)
{
    cam_pos.z = cam_pos.z + 2;
    glutPostRedisplay();
}

void resetDisplay(void)
{
    Vec3<double> new_cam_pos;
    new_cam_pos = cam_pos;
    cam_pos = new_cam_pos;
    glutPostRedisplay();
}

void reshape(int w, int h)
{
    glLoadIdentity();
    gluOrtho2D(0,width,0,height);
    glLoadIdentity();
}

void mouse(int button, int state, int x, int y)
{
    switch (button)
    {
    case GLUT_LEFT_BUTTON:
        if(state == GLUT_DOWN)
        {
            glutIdleFunc(advanceDisplay);
        }
        break;

    case GLUT_MIDDLE_BUTTON:
        if(state == GLUT_DOWN)
        {
            glutIdleFunc(resetDisplay);
        }
        break;

    case GLUT_RIGHT_BUTTON:
        if(state == GLUT_DOWN)
        {
            glutIdleFunc(backDisplay);
        }
        break;
    }
}

void display(void)
{
    int i;
    float x, y;
    /* clear all pixels */
    glClear(GL_COLOR_BUFFER_BIT);
    glPushMatrix();
    render<double>(spheres); // Creates the image and put it to memory in image[].
    i=0;
    glBegin(GL_POINTS);
    for(y=1.0f;y>-1.0;y=y-height_step)
    {
        for(x=1.0f;x>-1.0;x=x-width_step)
        {
            glColor3f((std::min(double(1), image[i].x)),
            (std::min(double(1), image[i].y)),
            (std::min(double(1), image[i].z)));
            glVertex2f(x, y);
            if(i < width*height)
            {
                i = i + 1;
            }
        }
    }
    glEnd();
    glPopMatrix();
    glutSwapBuffers();
}

int main(int argc, char **argv)
{
    // position, radius, surface color, reflectivity, transparency, emission color
    spheres.push_back(new Sphere<double>(Vec3<double>(0, -10004, -20), 10000, Vec3<double>(0.2), 0.0, 0.0));

    spheres.push_back(new Sphere<double>(Vec3<double>(3, 0, -15), 2, Vec3<double>(1.00, 0.1, 0.1), 0.65, 0.95));
    spheres.push_back(new Sphere<double>(Vec3<double>(1, -1, -18), 1, Vec3<double>(1.0, 1.0, 1.0), 0.9, 0.9));
    spheres.push_back(new Sphere<double>(Vec3<double>(-2, 2, -15), 2, Vec3<double>(0.1, 0.1, 1.0), 0.05, 0.5));
    spheres.push_back(new Sphere<double>(Vec3<double>(-4, 3, -18), 1, Vec3<double>(0.1, 1.0, 0.1), 0.3, 0.7));

    spheres.push_back(new Sphere<double>(Vec3<double>(-4, 0, -25), 1, Vec3<double>(1.00, 0.1, 0.1), 0.65, 0.95));
    spheres.push_back(new Sphere<double>(Vec3<double>(-1, 1, -25), 2, Vec3<double>(1.0, 1.0, 1.0), 0.0, 0.0));
    spheres.push_back(new Sphere<double>(Vec3<double>(2, 2, -25), 1, Vec3<double>(0.1, 0.1, 1.0), 0.05, 0.5));
    spheres.push_back(new Sphere<double>(Vec3<double>(5, 3, -25), 2, Vec3<double>(0.1, 1.0, 0.1), 0.3, 0.7));

    // light
    spheres.push_back(new Sphere<double>(Vec3<double>(-10, 20, 0), 3, Vec3<double>(0), 0, 0, Vec3<double>(3)));
    spheres.push_back(new Sphere<double>(Vec3<double>(0, 10, 0), 3, Vec3<double>(0), 0, 0, Vec3<double>(1)));

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(width, height);
    glutInitWindowPosition(10,10);
    glutCreateWindow(argv[0]);
    init();
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutMouseFunc(mouse);
    glutMainLoop();

    delete [] image;
    while (!spheres.empty()) {
        Sphere<double> *sph = spheres.back();
        spheres.pop_back();
        delete sph;
    }
    return 0;
}

This is where the image is written to memory:
Vec3<double> *image = new Vec3<double>[width * height];
static Vec3<double> cam_pos = Vec3<double>(0);
template<typename T>
void render(const std::vector<Sphere<T> *> &spheres)
{
    Vec3<T> *pixel = image;
    T invWidth = 1 / T(width), invHeight = 1 / T(height);
    T fov = 30, aspectratio = T(width) / T(height);
    T angle = tan(M_PI * 0.5 * fov / T(180));
    // Trace rays
    for (GLuint y = 0; y < height; ++y) {
        for (GLuint x = 0; x < width; ++x, ++pixel) {
            T xx = (2 * ((x + 0.5) * invWidth) - 1) * angle * aspectratio;
            T yy = (1 - 2 * ((y + 0.5) * invHeight)) * angle;
            Vec3<T> raydir(xx, yy, -1);
            raydir.normalize();
            *pixel = trace(cam_pos, raydir, spheres, 0);
        }
    }
}

This is where I read it back and write it to each point of Opengl:
void display(void)
{
    int i;
    float x, y;
    /* clear all pixels */
    glClear(GL_COLOR_BUFFER_BIT);
    glPushMatrix();
    render<double>(spheres); // Creates the image and put it to memory in image[].
    i=0;
    glBegin(GL_POINTS);
    for(y=1.0f;y>-1.0;y=y-height_step)
    {
        for(x=1.0f;x>-1.0;x=x-width_step)
        {
            glColor3f((std::min(double(1), image[i].x)),
            (std::min(double(1), image[i].y)),
            (std::min(double(1), image[i].z)));
            glVertex2f(x, y);
            if(i < width*height)
            {
                i = i + 1;
            }
        }
    }
    glEnd();
    glPopMatrix();
    glutSwapBuffers();
}

I have no idea what is causing this.  Is it a bad design?  An Opengl display mode?  I don't know.

A:
Is it a bad design?

Yes!  Upload your rendered scene to a texture and then render a quad with it:
// g++ -O3 main.cpp -lglut -lGL -lGLU
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <fstream>
#include <vector>
#include <iostream>
#include <cassert>
// OpenGl
#include "GL/glut.h"

GLuint width = 800, height = 480;
GLdouble width_step = 2.0f / width;
GLdouble height_step = 2.0f / height;

const int MAX_RAY_DEPTH = 3;

template<typename T>
class Vec3
{
public:
    T x, y, z;
    // Vector constructors.
    Vec3() : x(T(0)), y(T(0)), z(T(0)) {}
    Vec3(T xx) : x(xx), y(xx), z(xx) {}
    Vec3(T xx, T yy, T zz) : x(xx), y(yy), z(zz) {}
    // Vector normalisation.
    Vec3& normalize()
    {
        T nor = x * x + y * y + z * z;
        if (nor > 1) {
            T invNor = 1 / sqrt(nor);
            x *= invNor, y *= invNor, z *= invNor;
        }
        return *this;
    }
    // Vector operators.
    Vec3<T> operator * (const T &f) const { return Vec3<T>(x * f, y * f, z * f); }
    Vec3<T> operator * (const Vec3<T> &v) const { return Vec3<T>(x * v.x, y * v.y, z * v.z); }
    T dot(const Vec3<T> &v) const { return x * v.x + y * v.y + z * v.z; }
    Vec3<T> operator - (const Vec3<T> &v) const { return Vec3<T>(x - v.x, y - v.y, z - v.z); }
    Vec3<T> operator + (const Vec3<T> &v) const { return Vec3<T>(x + v.x, y + v.y, z + v.z); }
    Vec3<T>& operator += (const Vec3<T> &v) { x += v.x, y += v.y, z += v.z; return *this; }
    Vec3<T>& operator *= (const Vec3<T> &v) { x *= v.x, y *= v.y, z *= v.z; return *this; }
    Vec3<T> operator - () const { return Vec3<T>(-x, -y, -z); }

};

template<typename T>
class Sphere
{
public:
    // Sphere variables.
    Vec3<T> center;                         /// position of the sphere
    T radius, radius2;                      /// sphere radius and radius^2
    Vec3<T> surfaceColor, emissionColor;    /// surface color and emission (light)
    T transparency, reflection;             /// surface transparency and reflectivity

    // Sphere constructor.
    // position(c), radius(r), surface color(sc), reflectivity(refl), transparency(transp), emission color(ec)
    Sphere(const Vec3<T> &c, const T &r, const Vec3<T> &sc,
        const T &refl = 0, const T &transp = 0, const Vec3<T> &ec = 0) :
        center(c), radius(r), surfaceColor(sc), reflection(refl),
        transparency(transp), emissionColor(ec), radius2(r * r)
    {}

    // compute a ray-sphere intersection using the geometric solution
    bool intersect(const Vec3<T> &rayorig, const Vec3<T> &raydir, T *t0 = NULL, T *t1 = NULL) const
    {
        // we start with a vector (l) from the ray origin (rayorig) to the center of the curent sphere.
        Vec3<T> l = center - rayorig;
        // tca is a vector length in the direction of the normalise raydir.
        // its length is streched using dot until it forms a perfect right angle triangle with the l vector.
        T tca = l.dot(raydir);
        // if tca is < 0, the raydir is going in the opposite direction.  No need to go further.  Return false.
        if (tca < 0) return false;
        // if we keep on into the code, it's because the raydir may still hit the sphere.
        // l.dot(l) gives us the l vector length to the power of 2.  Then we use Pythagoras' theorem.
        // remove the length tca to the power of two (tca * tca) and we get a distance from the center of the sphere to the power of 2 (d2).
        T d2 = l.dot(l) - (tca * tca);
        // if this distance to the center (d2) is greater than the radius to the power of 2 (radius2), the raydir direction is missing the sphere.
        // No need to go further.  Return false.
        if (d2 > radius2) return false;
        // Pythagoras' theorem again: radius2 is the hypotenuse and d2 is one of the side.  Substraction gives the third side to the power of 2.
        // Using sqrt, we obtain the length thc.  thc is how deep tca goes into the sphere.
        T thc = sqrt(radius2 - d2);
        if (t0 != NULL && t1 != NULL) {
            // remove thc to tca and you get the length from the ray origin to the surface hit point of the sphere.
            *t0 = tca - thc;
            // add thc to tca and you get the length from the ray origin to the surface hit point of the back side of the sphere.
            *t1 = tca + thc;
        }
        // There is a intersection with a sphere, t0 and t1 have surface distances values.  Return true.
        return true;
    }
};

std::vector<Sphere<double> *> spheres;

// function to mix 2 T varables.
template<typename T>
T mix(const T &a, const T &b, const T &mix)
{
    return b * mix + a * (T(1) - mix);
}

// This is the main trace function. It takes a ray as argument (defined by its origin
// and direction). We test if this ray intersects any of the geometry in the scene.
// If the ray intersects an object, we compute the intersection point, the normal
// at the intersection point, and shade this point using this information.
// Shading depends on the surface property (is it transparent, reflective, diffuse).
// The function returns a color for the ray. If the ray intersects an object, it
// returns the color of the object at the intersection point, otherwise it returns
// the background color.
template<typename T>
Vec3<T> trace(const Vec3<T> &rayorig, const Vec3<T> &raydir,
    const std::vector<Sphere<T> *> &spheres, const int &depth)
{
    T tnear = INFINITY;
    const Sphere<T> *sphere = NULL;
    // Try to find intersection of this raydir with the spheres in the scene
    for (unsigned i = 0; i < spheres.size(); ++i) {
        T t0 = INFINITY, t1 = INFINITY;
        if (spheres[i]->intersect(rayorig, raydir, &t0, &t1)) {
            // is the rayorig inside the sphere (t0 < 0)?  If so, use the second hit (t0 = t1)
            if (t0 < 0) t0 = t1;
            // tnear is the last sphere intersection (or infinity).  Is t0 in front of tnear?
            if (t0 < tnear) {
                // if so, update tnear to this closer t0 and update the closest sphere
                tnear = t0;
                sphere = spheres[i];
            }
        }
    }
    // At this moment in the program, we have the closest sphere (sphere) and the closest hit position (tnear)
    // For this pixel, if there's no intersection with a sphere, return a Vec3 with the background color.
    if (!sphere) return Vec3<T>(.5); // Grey background color.
    // if we keep on with the code, it is because we had an intersection with at least one sphere.
    Vec3<T> surfaceColor = 0; // initialisation of the color of the ray/surface of the object intersected by the ray.
    Vec3<T> phit = rayorig + (raydir * tnear); // point of intersection.
    Vec3<T> nhit = phit - sphere->center; // normal at the intersection point.
    // if the normal and the view direction are not opposite to each other,
    // reverse the normal direction.
    if (raydir.dot(nhit) > 0) nhit = -nhit;
    nhit.normalize(); // normalize normal direction
    // The angle between raydir and the normal at point hit (not used).
    //T s_angle = acos(raydir.dot(nhit)) / ( sqrt(raydir.dot(raydir)) * sqrt(nhit.dot(nhit)));
    //T s_incidence = sin(s_angle);
    T bias = 1e-5; // add some bias to the point from which we will be tracing
    // Do we have transparency or reflection?
    if ((sphere->transparency > 0 || sphere->reflection > 0) && depth < MAX_RAY_DEPTH) {
        T IdotN = raydir.dot(nhit); // raydir.normal
        // I and N are not pointing in the same direction, so take the invert.
        T facingratio = std::max(T(0), -IdotN);
        // change the mix value between reflection and refraction to tweak the effect (fresnel effect)
        T fresneleffect = mix<T>(pow(1 - facingratio, 3), 1, 0.1);
        // compute reflection direction (not need to normalize because all vectors
        // are already normalized)
        Vec3<T> refldir = raydir - nhit * 2 * raydir.dot(nhit);
        Vec3<T> reflection = trace(phit + (nhit * bias), refldir, spheres, depth + 1);
        Vec3<T> refraction = 0;
        // if the sphere is also transparent compute refraction ray (transmission)
        if (sphere->transparency) {
            T ior = 1.2, eta = 1 / ior;
            T k = 1 - eta * eta * (1 - IdotN * IdotN);
            Vec3<T> refrdir = raydir * eta - nhit * (eta *  IdotN + sqrt(k));
            refraction = trace(phit - nhit * bias, refrdir, spheres, depth + 1);
        }
        // the result is a mix of reflection and refraction (if the sphere is transparent)
        surfaceColor = (reflection * fresneleffect + refraction * (1 - fresneleffect) * sphere->transparency) * sphere->surfaceColor;
    }
    else {
        // it's a diffuse object, no need to raytrace any further
        // Look at all sphere to find lights
        double shadow = 1.0;
        for (unsigned i = 0; i < spheres.size(); ++i) {
            if (spheres[i]->emissionColor.x > 0) {
                // this is a light
                Vec3<T> transmission = 1.0;
                Vec3<T> lightDirection = spheres[i]->center - phit;
                lightDirection.normalize();
                T light_angle = (acos(raydir.dot(lightDirection)) / ( sqrt(raydir.dot(raydir)) * sqrt(lightDirection.dot(lightDirection))));
                T light_incidence = sin(light_angle);
                for (unsigned j = 0; j < spheres.size(); ++j) {
                    if (i != j) {
                        T t0, t1;
                        // Does the ray from point hit to the light intersect an object?
                        // If so, calculate the shadow.
                        if (spheres[j]->intersect(phit + (nhit * bias), lightDirection, &t0, &t1)) {
                            shadow = std::max(0.0, shadow - (1.0 - spheres[j]->transparency));
                            transmission = transmission * spheres[j]->surfaceColor * shadow;
                            //break;
                        }
                    }
                }
                // For each light found, we add light transmission to the pixel.
                surfaceColor += sphere->surfaceColor * transmission *
                    std::max(T(0), nhit.dot(lightDirection)) * spheres[i]->emissionColor;
            }
        }
    }
    return surfaceColor + sphere->emissionColor;
}

// Main rendering function. We compute a camera ray for each pixel of the image,
// trace it and return a color. If the ray hits a sphere, we return the color of the
// sphere at the intersection point, else we return the background color.
Vec3<double> *image = new Vec3<double>[width * height];
static Vec3<double> cam_pos = Vec3<double>(0);
template<typename T>
void render(const std::vector<Sphere<T> *> &spheres)
{
    Vec3<T> *pixel = image;
    T invWidth = 1 / T(width), invHeight = 1 / T(height);
    T fov = 30, aspectratio = T(width) / T(height);
    T angle = tan(M_PI * 0.5 * fov / T(180));
    // Trace rays
    for (GLuint y = 0; y < height; ++y) {
        for (GLuint x = 0; x < width; ++x, ++pixel) {
            T xx = (2 * ((x + 0.5) * invWidth) - 1) * angle * aspectratio;
            T yy = (1 - 2 * ((y + 0.5) * invHeight)) * angle;
            Vec3<T> raydir(xx, yy, -1);
            raydir.normalize();
            *pixel = trace(cam_pos, raydir, spheres, 0);
        }
    }
}

//********************************** OPEN GL ***********************************************

void advanceDisplay(void)
{
    cam_pos.z = cam_pos.z - 2;
    glutPostRedisplay();
}

void backDisplay(void)
{
    cam_pos.z = cam_pos.z + 2;
    glutPostRedisplay();
}

void resetDisplay(void)
{
    Vec3<double> new_cam_pos;
    new_cam_pos = cam_pos;
    cam_pos = new_cam_pos;
    glutPostRedisplay();
}

void mouse(int button, int state, int x, int y)
{
    switch (button)
    {
    case GLUT_LEFT_BUTTON:
        if(state == GLUT_DOWN)
        {
            glutIdleFunc(advanceDisplay);
        }
        break;

    case GLUT_MIDDLE_BUTTON:
        if(state == GLUT_DOWN)
        {
            glutIdleFunc(resetDisplay);
        }
        break;

    case GLUT_RIGHT_BUTTON:
        if(state == GLUT_DOWN)
        {
            glutIdleFunc(backDisplay);
        }
        break;
    }
}

GLuint tex = 0;
void display(void)
{
    int i;
    float x, y;
    render<double>(spheres); // Creates the image and put it to memory in image[].

    std::vector< unsigned char > buf;
    buf.reserve( width * height * 3 );
    for( size_t y = 0; y < height; ++y )
    {
        for( size_t x = 0; x < width; ++x )
        {
            // flip vertically (height-y) because the OpenGL texture origin is in the lower-left corner
            // flip horizontally (width-x) because...the original code did so
            size_t i = (height-y) * width + (width-x);
            buf.push_back( (unsigned char)( std::min(double(1), image[i].x) * 255.0 ) );
            buf.push_back( (unsigned char)( std::min(double(1), image[i].y) * 255.0 ) );
            buf.push_back( (unsigned char)( std::min(double(1), image[i].z) * 255.0 ) );
        }
    }

    /* clear all pixels */
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();

    glEnable( GL_TEXTURE_2D );
    glBindTexture( GL_TEXTURE_2D, tex );
    glTexSubImage2D
        (
        GL_TEXTURE_2D, 0,
        0, 0,
        width, height,
        GL_RGB,
        GL_UNSIGNED_BYTE,
        &buf[0]
        );

    glBegin( GL_QUADS );
    glTexCoord2i( 0, 0 );
    glVertex2i( -1, -1 );
    glTexCoord2i( 1, 0 );
    glVertex2i(  1, -1 );
    glTexCoord2i( 1, 1 );
    glVertex2i(  1,  1 );
    glTexCoord2i( 0, 1 );
    glVertex2i( -1,  1 );
    glEnd();

    glutSwapBuffers();
}

int main(int argc, char **argv)
{
    // position, radius, surface color, reflectivity, transparency, emission color
    spheres.push_back(new Sphere<double>(Vec3<double>(0, -10004, -20), 10000, Vec3<double>(0.2), 0.0, 0.0));

    spheres.push_back(new Sphere<double>(Vec3<double>(3, 0, -15), 2, Vec3<double>(1.00, 0.1, 0.1), 0.65, 0.95));
    spheres.push_back(new Sphere<double>(Vec3<double>(1, -1, -18), 1, Vec3<double>(1.0, 1.0, 1.0), 0.9, 0.9));
    spheres.push_back(new Sphere<double>(Vec3<double>(-2, 2, -15), 2, Vec3<double>(0.1, 0.1, 1.0), 0.05, 0.5));
    spheres.push_back(new Sphere<double>(Vec3<double>(-4, 3, -18), 1, Vec3<double>(0.1, 1.0, 0.1), 0.3, 0.7));

    spheres.push_back(new Sphere<double>(Vec3<double>(-4, 0, -25), 1, Vec3<double>(1.00, 0.1, 0.1), 0.65, 0.95));
    spheres.push_back(new Sphere<double>(Vec3<double>(-1, 1, -25), 2, Vec3<double>(1.0, 1.0, 1.0), 0.0, 0.0));
    spheres.push_back(new Sphere<double>(Vec3<double>(2, 2, -25), 1, Vec3<double>(0.1, 0.1, 1.0), 0.05, 0.5));
    spheres.push_back(new Sphere<double>(Vec3<double>(5, 3, -25), 2, Vec3<double>(0.1, 1.0, 0.1), 0.3, 0.7));

    // light
    spheres.push_back(new Sphere<double>(Vec3<double>(-10, 20, 0), 3, Vec3<double>(0), 0, 0, Vec3<double>(3)));
    spheres.push_back(new Sphere<double>(Vec3<double>(0, 10, 0), 3, Vec3<double>(0), 0, 0, Vec3<double>(1)));

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(width, height);
    glutInitWindowPosition(10,10);
    glutCreateWindow(argv[0]);
    glutDisplayFunc(display);
    glutMouseFunc(mouse);

    glGenTextures( 1, &tex );
    glBindTexture( GL_TEXTURE_2D, tex );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
    glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
    glTexImage2D( GL_TEXTURE_2D, 0, 3, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL );

    glutMainLoop();

    delete [] image;
    while (!spheres.empty()) {
        Sphere<double> *sph = spheres.back();
        spheres.pop_back();
        delete sph;
    }
    return 0;
}

A: How to load and display images is also explained on www.scratchapixel.com. Strange you didn't see this lesson:
http://www.scratchapixel.com/lessons/3d-basic-lessons/lesson-5-colors-and-digital-images/source-code/
It's all in there and they explain you how to display images using GL textures indeed.

redpajama_set_name: RedPajamaStackExchange


We're fortunate that our office is less than a mile from this amazing video production company. Lean and mean, Outsider's small team takes on big projects, from inspiring brand advertising work to short, punchy "explainer" videos that simplify complex ideas for new audiences. We're proud to be Outsider's go-to writing partner.
We've contributed scriptwriting and editing for more than a dozen Outsider projects, including videos for CoverMyMeds, Pelotonia, Orange Barrel Media, Florida Keys Brewing Company, Cardinal Health, and others. They're one of the best-kept creative secrets in our market, and we love working with them.
Gregor is the definition of a creative partner and has consistently met and exceeded our expectations. He works hard to understand the goals of each project, he always delivers, and we're always aligned. Working with him has made our company stronger.


text:
(Pl. 49a): Te Piki, near East Cape, Haweran (oxygen isotope stage 7, 200 000 years B.P.) (M49092, National Museum of N.Z.), a topotype of the form named P. edita by Powell (1934),
Beu & Maxwell (1990): Chapter 16; p. 361; pl. 49 a.
Synonymy: Fusus sulcatus Lamarck 1816, pl. 424, fig. 3, "Liste des objets", p. 6; Fusus dilatatus Quoy & Gaimard 1833, p. 498; Fusus zelandicus Quoy & Gaimard 1833, p. 500; Fusus adustus Philippi 1845 (in 1845-1847), p. 21; Verconella adusta mandarinoides Powell 1927b, p. 558; Verconella accipitris Finlay 1930b, p. 68; Verconella allani Finlay 1930b, p. 71; Verconella falsa Finlay 1930b, p. 71; Austrosipho (Verconella) edita Powell 1934, p. 271; Verconella adpressa Powell 1947a, p. 168; Siphonalia mandarina of Suter 1913c, p. 370 (not of Duclos, 1831)
Type species of Penion Fischer, 1884, and of Verconella Iredale, 1914
Classification: Buccinulidae
Description: Large for family (120-170 mm high), tall and narrow, with spire slightly shorter than aperture and long, narrow, weakly twisted and recurved, widely open anterior canal. Whorls evenly convex to strongly angled (angled medially on spire whorls), with or without large, antero-posteriorly compressed nodules (present on shoulder angle of angled specimens only; highly variable). Sculpture of many prominent spiral cords, highly variable in size, number and spacing, 1 large, high one and 1 low, narrow one alternating regularly on many specimens. Low fasciole and very shallow pseudumbilicus present on most large shells. Aperture large, oval, lips smooth and simple, with low parietal callus pad. Protoconch large (3-4 mm high), subcylindrical, of 2.5-3 smooth, weakly inflated whorls, with bluntly rounded apex.
Comparison: Powell (1927b, 1947a) accepted relatively little variation in Penion species and named several forms as species that are now considered to be sculptural variants of one species, although recently (Powell 1979) he listed the same names as we have (based on Recent specimens) as synonyms of P. sulcatus. Finlay (1930b) similarly named several fossil forms that in our opinion are merely part of the variation of P. sulcatus. Penion has a large, heavy embryonic shell (several in each large, horny egg capsule) and direct development, producing subtle genetic differences between populations around the country, but there is no evidence that the variation is regular in any geographical pattern. Ponder (1973, p. 416) showed that P. mandarina (Duclos) applies to an Australian species, and the earliest name for the New Zealand one is P. sulcatus (Lamarck). He later (Ponder 1975) illustrated the holotype of P. dilatatus, showing that this name applies to the nodulose, adustus form of P. sulcatus. He therefore selected P. cuvierianus as the name for the species previously known as P. dilatatus. P. cuvierianus reaches a considerably larger size than P. sulcatus (to at least 250 mm high), has a thinner and more elongate shell, consistently finer spiral sculpture (although the extremes of the two species overlap), biangled nodules around the periphery on the most common, coarsely nodulose form (biangled nodules are rare in P. sulcatus), and a taller protoconch of 3.5-4 whorls. It seems likely that P. cuvierianus has a similar range of sculptural variation to P. sulcatus, and that P. ormesi (Powell) is based on specimens of P. cuvierianus lacking shoulder nodules. Penion includes the common large buccinoidean "whelks" of the New Zealand area, and P. sulcatus is common from intertidal to outer shelf depths on a variety of hard to soft substrates, whereas P. cuvierianus occurs only on soft substrates on the continental shelf. Fossils of P. sulcatus are common at Castlecliff (particularly small specimens, in Tainui Shellbed) and are easily distinguished from Buccinulum, Aeneator and Glaphyrina species by their much larger, subcylindrical protoconch. P. cuvierianus is much less common as a fossil, although it, too, occurs at Castlecliff.
Distribution: Mangapanian-Recent. Recent, New Zealand (types of Fusus sulcatus, F. dilatatus, F. zelandicus, F. adustus, Verconella adusta mandarinoides, V. adpressa); Castlecliff, Wanganui, Castlecliffian (type of V. falsa); Okauawa Stream, Kereru Road, central Hawke's Bay (type of V. accipitris); Nukumaru, "papa band", i.e., probably Tewkesbury Formation, Nukumaru Beach, west of Wanganui, Nukumaruan (type of V. allani); Te Piki, Cape Runaway, near East Cape, Haweran (oxygen isotope stage 7) (type of Austrosipho edita). Widespread but never common in shallow-water to mid-shelf formations throughout New Zealand of Mangapanian to Haweran age.

redpajama_set_name: RedPajamaCommonCrawl


So the year 2013 is about to end and this is the time of gifting.. I don't follow the Christmas gifting but still managed to finish up some pending gifting projects and did some quick gifts as well. If you did follow my earlier posts you would remember I was knitting a sweater and was about to quit… I managed to finish it but was not quite happy with the neck and so redid the neckband and now it is ready to be gifted.


Other tags that relate to Win or Lose?
Probability. Chemistry. Experimental probability. Tree diagrams. Probability distributions, expectation and variance. Biology. Combining probabilities. Conditional probability. Interactivities. Theoretical probability.
How can this prisoner escape?
What are the likelihoods of different events when you roll a dice?
Can you design your own probability scale?
How do you describe the different parts?
If two of these unusually numbered dice are thrown, how many different sums are possible?
If a coin rolls and lands on a set of concentric circles what is the chance that the coin touches a line ?
Four fair dice are marked differently on their six faces. Choose first ANY one of them. I can always choose another that will give me a better chance of winning. Investigate.
Alison and Charlie are playing a game. Charlie wants to go first so Alison lets him. Was that such a good idea?
What's the Point of Squash?
Under which circumstances would you choose to play to 10 points in a game of squash which is currently tied at 8-all?
In a race the odds are: 2 to 1 against the rhinoceros winning and 3 to 2 against the hippopotamus winning. What are the odds against the elephant winning if the race is fair?
The four digits 5, 6, 7 and 8 are put at random in the spaces of the number : 3 _ 1 _ 4 _ 0 _ 9 2 Calculate the probability that the answer will be a multiple of 396.


text:
Results for agency
Makers' voices: four themes for material literacy in contemporary sculpture
Barrett, E., 20/11/2020, In: Journal of Visual Art Practice. 19, 4, p. 351-372 22 p.
Networked Learning: Inviting Redefinition
Networked Learning Editorial Collective, 22/07/2020, (E-pub ahead of print) In: Postdigital Science and Education. 3, p. 312–325 14 p.
Research output: Contribution to Journal/Magazine › Journal article
Making material meaningful: Identifying and analysing the role of material in contemporary sculptural practice and criticism
Barrett, E., 07/2020, Lancaster University. 254 p.
'It's the organization that is wrong': Exploring disengagement from organizations through leadership development
Larsson, M., Holmberg, R. & Kempster, S., 1/04/2020, In: Leadership. 16, 2, p. 141-162 22 p.
Young children's consumer agency: the case of French children and recycling
Schill, M., Godefroit-Winkel, D. & Hogg, M., 1/03/2020, In: Journal of Business Research. 110, p. 292-305 14 p.
Stigma, the Moral Career of a Concept: Some Notes on Emotions, Agency, Teflon Stigma, and Marginalizing Stigma
Müller, T., 1/02/2020, In: Symbolic Interaction. 43, 1, p. 3-20 18 p.
Research output: Contribution to Journal/Magazine › Editorial › peer-review
The big two dictionaries: Capturing agency and communion in natural language
Pietraszkiewicz, A., Formanowicz, M., Gustafsson Sendén, M., Boyd, R. L., Sikström, S. & Sczesny, S., 1/08/2019, In: European Journal of Social Psychology. 49, 5, p. 871-887 17 p.
Social actors "to go": An analytical toolkit to explore agency in business discourse and communication
Darics, E. & Koller, V., 1/06/2019, In: Business and Professional Communication Quarterly. 82, 2, p. 214-238 25 p.
Organising food differently: towards a more-than-human ethics of care for the Anthropocene
Beacham, J., 1/07/2018, In: Organization. 25, 4, p. 533-549 17 p.
Involving customers in innovation: knowledgability and agency as process variables
Peters, L., Pressey, A., Gilchrist, A. J. P. & Johnson, W., 5/03/2018, In: Journal of Business and Industrial Marketing. 33, 2, p. 164-173 9 p., 0083.
Bad, mad or sad? legal language, narratives, and identity constructions of women who kill their children in England and Wales
Weare, S. F., 1/06/2017, In: International Journal for the Semiotics of Law. 30, 2, p. 201-222 22 p.
More results »


text:
Your Source for NPR News
Public Radio Presents Schedule
Tuned to Yesterday Schedule
Campbell Conversations
Community Forum Series
HealthLink on Air
New York in the World
Tuned to Yesterday
From the Soil with Sollecito
The Heidi Allen Case
Nature of Things with John Weeks
StorySharingCNY
The Strategic Minute
Tuned to Yesterday Dialer
How to support WRVO
Car Donation Program
Sustaining Program
About WRVO Public Media
Transmitter Status
Smart Speaker Listening
WRVO Public Media
WRVO-2: PRX Remix
WRVO-3: BBC World Service
Cuomo's State of the State speech comes as New York faces deficit
By Karen DeWitt • Jan 8, 2020
governorandrewcuomo / Flickr
Gov. Andrew Cuomo is set to deliver his State of the State message on Wednesday, at a time when New York faces its worst budget deficit in a decade.
The state begins the new year facing a $6 billion budget gap, and closing the deficit is likely to dominate the session.
Blair Horner with the New York Public Interest Research Group, a longtime Albany observer, said lawmakers are facing a big challenge.
"The big gorilla of the session is going to be how do they deal with the budget deficit," Horner said. "And that's not easy."
The main reason for the deficit is growth in spending on Medicaid. Cuomo's budget officials have already suggested delaying a Medicaid payment into the next fiscal year, for the second year in a row, to partially offset the gap.
Assembly Speaker Carl Heastie has said his Democratic members will look at new revenues, and he has not ruled out raising taxes on the wealthy. His counterpart, Senate Leader Andrea Stewart-Cousins, said raising taxes is not the first option that she would consider.
It's an election year in 2020, and some Senate Democrats, including Stewart-Cousins, represent parts of the New York City suburbs, where new taxes are particularly unpopular, and they worry Republican opponents could make them a campaign issue.
Cuomo, speaking at a business lunch on Monday, said he's not planning to include tax increases in his deficit-closing proposal. He said he disagrees with the views of many politicians that "more money" is the answer.
"There's not necessarily a correlation between more money and a better product," Cuomo said.
The governor also hinted that he might not accept proposals to raise spending on school aid. The State Board of Regents has recommended a $2 billion increase.
"You are already spending more money per pupil than any state in the United States of America," Cuomo said. "But you're in the middle when it comes to performance."
Cuomo said the rising health care costs that have fueled the deficit also have to be "addressed structurally."
Horner said closing the deficit could force lawmakers to make some unpopular choices.
"In an election year, the Legislature is not going to want to do cuts," Horner said. "It's a tricky balance."
Cuomo already has released more than 30 separate State of the State proposals in the past couple of weeks, and most would not immediately cost the state much money. They include banning single-use plastic foam containers, cracking down on underage vaping, and studying how to bring high-speed rail to New York.
Some of his plans could even bring in revenues for the state. Cuomo is expected to announce a proposal to legalize the adult recreational use of marijuana.
Melissa Moore with the Drug Policy Alliance said profits from the legal sale of cannabis also should be directed to help people in communities who were adversely affected by the decades-long marijuana prohibition.
"By reinvesting tax revenue back into exactly the communities that have been the hardest hit by criminalization and the war on drugs," Moore said. "And making sure that we are building up those communities."
The governor's speech came in the wake of several violent incidents of anti-Semitism, including a knife attack at a rabbi's home north of New York City during Hanukkah that injured five people, one severely. Cuomo said he'll address the issue of the growing number of hate crimes in his speech, and will propose a bill to create the crime of domestic terrorism.
"Because these people are domestic terrorists, and I want them prosecuted that way," the governor said to applause.
Whatever the governor proposes, the Legislature is going to have less time this year to act on it.
The session is going to be a few weeks shorter this year. The adjournment date is set for early June, instead of the traditional end of the month. That's because, for the first time, primaries for state offices will be held in late June, and lawmakers will need time to campaign.
New York state budget
© 2020 WRVO Public Media


text:
Q: What does Phonegap local storage return if not set? Me and my team are developing a Phonegap app, and are encountering some issues. One of our functions looks like this:
var email = localStorage.getItem("email");
if (email != "" && email.type != undefined) {
    //Do stuffs
} else {
    //Do other stuffs
};

But, despite the local storage item 'email' being set to my email, it still executes the contents of the else statement, not the main if block. Maybe the answer is right under our noses, we just don't know (its 6 am here, very tired), so any help is appreciated.

A: Could you try like this.
var email = window.localStorage.getItem("email");

A: In general I believe localStorage.getItem returns null if it is unset. So you should be able to just do
var email = localStorage.getItem("email");
if (email) {
    //Do stuffs
} else {
    //Do other stuffs
};

Note that the empty string "" is falsy (evaluates as false) in JavaScript.

A: This is because the email will always return null if not set. I recommend just doing:
var email = localStorage.getItem("email");
 if (email !== null) {
   //Do stuffs
 } else {
   //Do other stuffs
 };


GHAZIABAD: A special CBI court on Friday extended the judicial custody of former Noida chief engineer Yadav Singh and his accomplice Ramender Singh till June 3 in a corruption case.
The CBI is investigating the disproportionate assets case against the duo.
On Friday, Vinod Kumar Goyal, managing partner, Tirupati Construction Company, who was also named in the CBI chargesheet, surrendered in court and was sent to judicial custody.
"Vinod Kumar Goyal was the only person who responded to the summons issued by the court. He was sent to judicial custody. For others, the court will issue fresh summons," said B P Singh, public prosecutor.
On March 29, special CBI judge (anti-corruption) G Sree Devi had issued summons to 12 persons including Yadav Singh's wife Kusumlata, junior engineers Devi Ram Arya, Rajeev Kumar, R D Sharma, Om Pal Singh, assistant project engineer J P Singh and representatives of three firms named in the chargesheet. However, only Vinod Kumar Goyal appeared before the court.
Yadav Singh was chief engineer of Noida Authority, Greater Noida Authority and Yamuna Expressway Industrial Development Authority.
Raids conducted by the Income Tax Department in November 2014 showed that Singh owned huge property disproportionate to his known sources of income.


text:
Gubernatorial candidates must strengthen criminal justice reform
Nketiah Berko, Staff Writer
In 2017, the Louisiana state legislature passed a comprehensive set of bills aimed at reforming the state's criminal justice system. Accruing widespread support, this initiative marked a major drive by Gov. John Bel Edwards' administration to address Louisiana's long-standing criminal justice woes. Primarily focusing on nonviolent offenders, the legislative package began to replace a paradigm of punishment with a more humanistic justice system. As Louisiana prepares to enter the gubernatorial election cycle, potential candidates must commit themselves toward similarly socially conscious criminal justice reform.
Czars Trinidad | Senior Staff Artist
The series of bills, signed by Edwards and sponsored by a bipartisan collection of lawmakers, implemented a series of policy reforms supported by a wide array of Louisiana society. Passing in the Republican-held state legislature, the various reforms were backed by business groups, law enforcement agencies and conservative criminal justice reform advocates alike. This widespread support has demonstrated the depoliticization of these issues, a welcome sign. On the national level, a polarized Congress joined last December to sign the FIRST STEP Act, with even the self-proclaimed "law-and-order" president signing onto major legislation reducing federal drug sentences.
The 10 bills signed into law were comprehensive in scope. Reducing the system's reliance on punitive prison sentences, the reforms reduce both penalties for habitual offenders and sentencing terms, instead increasing parole and probation eligibility as well as opening drug courts. Furthermore, the legislation facilitates the re-entry of formerly incarcerated persons into society by reducing the financial burdens of incarceration and eliminating obstacles to employment and public assistance. These efforts have already borne noteworthy results, ceding Louisiana's title as the carceral capital of the U.S. to Oklahoma. Moreover, the state has yielded $14 million in savings from the reforms, proving that these reforms have been both a moral and financial success.
Despite its initial success, however, the recent reforms still leave much to be desired from Louisiana's bloated criminal justice system. In 2015, 30 percent of Louisianans were in jail because they could not afford bail. A 2017 state auditor's report revealed that the state frequently incarcerates people long past their release date. For inmates detained up to three years past their release date, these individuals are denied the liberty to which they, like the rest of us, are due. Thefts as grotesque as any other, these stories showcase a system still in desperate need of reform.
Therefore, as Louisianans prepare for the 2019 election cycle, we must not relegate these concerns to the back of our collective conscience. The power to imprison, depriving our fellow citizens of their liberty, is the most serious power held by the state, and it should never be used lightly. Unfortunately, political provocateurs have harped upon the issue to reverse the 2017 reforms and hinder future progress, peddling in the fear and dehumanization of our fellow citizens. With a slate of statewide offices on the ballot this year, most notably the races for attorney general and governor, these fragile gains are at risk. Louisianans, however, must hold candidates accountable to a platform supporting both the recent and future reforms of a failing system. Our responsibility to our fellow citizens, incarcerated or otherwise, demands no less.
flytedesk: Box (In-Story)
Almost Ivy: Examining Tulane's reputation as a backup for Ivy League schools
Lana del Rey, unexpected gay icon
From the Basement: New Orleans says bye bye to Baby Cakes
Celebrities who love, live in New Orleans
Best fried chicken in NOLA for the fried chicken fiend
flytedesk: Sidebar (Middle)
Read us in print!


text:
Trent Worthington
Compositions and Arrangements in Choral Music
You are here: Home / Arrangements / Yes We Can Can
Yes We Can Can
SATB Piano
The song is written by Allen Toussaint, and this arrangement was written for Eva Bostrand and A Joyful Noise. It's not really an arrangement at all, but more like a transcription of a solo performance by Allen Tourssaint from youTube. I added some piano bits here and there, and a little bit of harmony for the choir. I have three complimentary arrangements of this song: SATB, SA and TB. Eva asked me to write a flexible arrangement that could be performed by any combination of SATB, TB, and SA, with piano and optional rhythm section. The SATB is shown here, the SA works as a standalone arrangement, and the TB (as recorded here, but with different vocal lines than the SATB) works with the other arrangements and also as a standalone.
http://trentworthington.ca/wp-content/uploads/2017/07/Yes-We-Can-Can.mp3 Yes We Can Can SATB
Search by Voicing
Search by Accompaniment
Copyright © 2021 — Trent Worthington • All rights reserved. • Log in


text:
Tagged: China
BRICS dilemma, folly or curse?
Master of Junk
IT WAS never meant to be anything more than a political union, similar in status to the non-aligned states. Economically, only two of the five BRICS nations, China and India are doing well, the rest are all currently in junk status. Russia was junked in 2015, followed by Brazil in 2016 and South Africa in 2017. In many respect it is Russia which has tilted BRICS in favour of junk, and has lead the pack in this regard, with the result, there is now a Good BRICS and a Bad BRICS story.
Goodness BRICS
Let's take a look at what is good here. So far as the China is concerned, the need to create markets for its overproduction of goods has meant that it is forced to continue investing in overseas markets, and the result is largely of benefit to us.
South Africa, an outlier so far as size is concerned, has seen several deals involving, variously, the creation of an entire city in Modderfontein, the relocation of a Hisense television factory to our shores, and the latest investment of 11Bn Rand towards a new car factory in PE. So in addition to our ample resources and export market, there is now significant beneficiation of goods within the country, in an evolving relationship, all producing goods which in turn end up in the West.
India, another global leader, has taken a slightly different tack. The past decade has seen successive major investments by Asian-based entrepreneurs in the South African economy. Beginning with Lakshmi Mittal, who bought former state-owned ISCOR shortly after democracy, to create ArcelorMittal. More recently the Indian billionaire Anil Agarwal bought a substantial stake in Anglo American, a traditional dual-listed South African business, which has relocated its headquarters to London. The pattern is thus one of picking up bargains, arguably to the benefit of stakeholders. Though trade between the two countries is booming, this is often however at the cost of local clothing and textile workers.
Badness BRICS
Where trade with the two Asian economic giants of BRICS has tended to benefit South Africa. The reverse is true when it comes to Russia. Instead of buying out state-owned enterprises (SOEs) as in Mittel, relieving taxpayers of an unnecessary drain on the treasury, or simply just investing money, the Russian strategy has been instead to hijack the remaining SOEs whilst foisting projects upon us of dubious merit. In effect it is Russia which has engaged in what can only be called a form of state capture, and nuclear colonialism.
The proposed Rosatom nuclear deal along with its many intrigues under Malusi Gigaba is very bad for South Africa, both economically and politically. Apart from the fact that the deal will result in an unnecessary 1Trn Rand expenditure from the treasury on nuclear technology already past its sell-by-date, — bringing to a halt and seriously compromising a highly successively renewable energy programme — it will not only relieve the country of taxpayers money, but will also remove scarce foreign exchange.
If implemented the Rosatum deal would commit South Africa to paying forward for its electricity in Dollars for the next 60 years — a currency that Russia desperately needs in order to balance its own books. In effect no money is being invested by Russia as such. Instead, the country would borrow money on the open market against its forward production, in order to buy moribund technology from Russia in a similar deal already concluded with Saudi Arabia. The 'sukuk deal' financed Medupi and Kusile in this way, and albeit local technology which benefitted, the resulting finance model is no doubt to the ultimate detriment of the economy and climate. See how Saudi money dried up.
Written by davidrobertlewis 1 Comment Posted in Economics, Uncategorized	Tagged with Brazil, BRICS, China, India, Russia, South Africa
Will Brexit give way to a Brixit?
THE EXIT of the United Kingdom from the European Community is not solely a result of economic forces (who would vote for market turmoil?), but is rather an abject political lesson in democratic power relations. Will Brexit give way to a Brixit, the dissolution of BRICS?
If it wasn't the constant flow of immigrants from the continent that riled the British voter, then it was the growing centralisation of power in Brussels, the plethora of EU legislation, the imposition of European laws and legal precedents and the resulting erosion of the powerful common law in Britain, which appears to have put paid to the European union for the meantime.
As Larry Kudlow writing for CNBC online put it: "For a country which has routinely acted to limit the power of royalty, which holds stock in documents such as the Magna Carta … Britain will regain its political freedom, its autonomous self-government, and its independence from an European Union that is spinning out of control under the power of establishment elites, unelected and unaccountable socialist bureaucrats, and a court that is increasingly making legal decisions that replace Britain's powerful common law."
The same uneasy indictment could easily apply to other economic blocs such as SADC, the AU and its much vaunted rival and successor, BRICS. In the short space of two decades, South Africa's political leaders have taken our nation into a number of regional and international, monetary and economic unions. The introduction of the Rand-based Southern African Development Community (SADC) on 17 August 1992 was quickly followed by the African Union (AU) 26 May 2001, and then BRICS on 16 May 2008.
By all accounts South Africa is thus a serial unionist. Having arisen like the United Kingdom as an aggregation of several states, including the Boer Republics, Cape Colony and Natal. The country's first experience as an economic and political union was as a member of the British Empire, followed by the Commonwealth, a block of 52 nations. Then another bout of Republican nationalism followed, with successive periods of relative isolation resulting from apartheid.
Upon the emergence of the new era, a majority government,the Bill of Rights and an inclusive democracy, South Africa embarked on an outward path, which lead to a regional 15 member economic block in Southern Africa including Botswana, Namibia, Lesotho and Swaziland. This was quickly followed by the rise of the 54 member African Union under Mbeki. By all purposes, an attempt to emulate the emergence of the EU.
The result inside the country was a long boom, as South Africa became the gateway of choice to the rest of Africa. But then things began to unravel somewhat. Not content with being a regional superpower within the AU, South Africa, ever much the Casanova of politics, jumped into bed with Brazil, Russia, India and China to form BRICS. All of which, except for India, have atrocious levels of public debt and weak currencies. Brazil was recently given junk status.
It is this awkward attempt to create an alternative to the Post-WW2 Bretton Woods structures such as the IMF and World Bank, which has presented huge problems. The grouping is not simply a marriage of convenience, predicated on the numbers, like the G20, but has come to dominate foreign policy, to the detriment of both the SADC region and the increasingly insignificant AU. Under the Zuma administration, one could be forgiven for thinking that both SADC and the AU no longer exist. The result can be seen in the re-emergence of regional conflict, such as the political turmoil in Mocambique and continental instability.
Time to think the unthinkable. Time for a Brixit?
Written by davidrobertlewis Leave a comment Posted in Development, Economics, Uncategorized	Tagged with Brazil, Brexit, Brixit, China, India, Russia, South Africa
Zuma's Afrochinistan Affair
IF LOCAL economic fall-out and the prospect of capital flight ultimately put paid to President Zuma's short term economic plans, take a look at what happened to the country's macro-economic outlook.
After meeting with Chinese President Xi Jinping earlier this month, Zuma announced that he was replacing South Africa's finance minister with a relative unknown, David van Rooyen, effectively downgrading the status and prestige of the portfolio, which all ended in a massive flipflop, see here.
As to why the President thought he could do this, was not immediately self-evident to the media. Granted, there were many reasons offered by pundits as to why the President would want to remove Nene — the alleged friction around the SAA and Nuclear deals, the inconvenient problem of fiscal prudence and fund raising and so on.
But then Zuma announced that he was redeploying Min. Nene to the BRICS bank. Arguably outsourcing the treasury, and moving Nene to a position in which the Minister had apparently not even been short-listed, never mind appointed. Was this global real-politiek playing itself out at the expense of the country, or simply another expedient marriage?
If you see the BRICS New Development Bank (NDB) as just another bank, all fine, it is easy to forget that NDB aims to counterbalance Bretton Woods structures such as the World Bank, a central bank of central banks, but at what price? Will participation entail domestic interference? Changes in foreign policy? The Nene saga does not bode well.
The covert power-game, surrounding the emergence of a supranational, global cabal — an economic elite focused around the NDB, is really what has been revealed over the course of the month.
Unaccountable, autocratic and without any particular national loyalty, save for the amorphous arrangement which is BRICS, NDB and its cronies, (along with its capacity for intrigue), has been seen by the Zuma administration as the quick fix solution to all manner of national, regional and personal troubles. In other words, a veritable license to print money or issue bonds outside the local economy, that exists as some form of debt birthed out of the peculiar position which its one anchor tenant, China holds within the world economy.
A positive spin, would see it as a safety net, courtesy of the Chinese (PRC), but such conclusions are not necessarily foregone. China itself, experienced a major stock market meltdown, requiring drastic intervention by the PRC party. Turning South Africa into a client-state is thus not necessarily conducive to long-term economic growth and stability. The Johannesburg Stock Exchange (JSE) for example, is a lot older than the Shanghai Stock Exchange (SSE), 1887 versus 1990, a difference of 103 years.
China recently announced that it was issuing Rand-denominated bonds to pay for infrastructure in South Africa, a duty usually the preserve of the Reserve Bank and the treasury.
The events of the past weeks thus beg the question: Does Jacob Zuma see himself as the President-elect of a new country called Afrochinistan? A nation-less, global politician, who recently made the startling statement that his party came before his own country, a leader of a political movement, which now sees itself as the equivalent of the PRC ruling party, in which party congresses are held in what is effectively a one-party state that has no state, except the currency markets.
Clearly Zuma, until the events of yesterday, which saw Pravin Gordhan reappointed, had ceased being accountable to the people of his own country, never mind his own party.
With so many bilaterals, trilaterals and Paris Conference of the Parties, the Zuma administration has really began looking as if it has permanently relocated itself outside of the country. Then, along came a major upset, an open rebellion within the ranks, the reality of Rands and Cents.
Following upon the heels of the Gupta controversy (merely a sad attempt to marry Indian and South African politics), the Xi Jinping meeting has resulted in ANC apparatchiks announcing parallel policies that could take South Africa in the direction of the Chinese political system, with the tragic consequence of an erosion in civil liberties, individual rights and freedoms.
If it isn't the controversial Cybercime Bill, which could see a National Firewall censoring the Internet, then it is the clampdown on Press Freedom, (or as some might see it, a general purchase of the press), the embrace of radical terrorist groups such as Hamas, and the Dalai Lama debacle, all of which speak to a failure to protect the nation's secular legacy of peace and human rights, and especially the rights of religious, ethnic and cultural minorities.
Written by davidrobertlewis 1 Comment Posted in Economics, Uncategorized	Tagged with BRICS, China, South Africa, Zuma
Link Trade with China to Human Rights and a Free Tibet
LINKING trade with China to human rights and a free Tibet, might sound like mutton cloth, but it could save South Africa's textile and clothing industry. Hemmed in literally by the World Trade Organisation's rules that determine how each nation conducts trade, South Africa is being swamped by cheap imports of fabric and clothing from abroad, in particular China.
Skirting around this issue may seem impossible in today's globalised world, however there is nothing stopping our parliament from enacting trade sanctions that link imports to the development of human rights and even a Free Tibet. China, a nation still without a real democracy, occupied Tibet, a soveriegn nation during the fifties. Once home to a thriving Buddhist community, Tibetans along with the Dalai Lama were forced to flee their homeland.
When will South African's cotton on, that such aggression is not only a travesty of justice but trade with China means sacrificing human rights — an issue measured not just in clothing, but in local unemployment that is ravishing the textile sector in the Western Cape. Time then to say Lhasa and to link the development of human rights in China, and democracy before trade?
CHECK OUT THE GOVERNMENT OF TIBET IN EXILE
Written by davidrobertlewis Leave a comment Posted in Free Tibet	Tagged with China, Free Tibet


YARDLEY, PA (April 6, 2015) – The Spring, 2015 issue of HealthyPet Magazine, a seasonal publication dedicated to delivering relevant and educational pet wellness content to pet owners through veterinarians, will showcase the "softer side" of veteran television and movie actor Titus Welliver, who has spent his life raising, rescuing and loving pets and animals.
Welliver, who fans of the wildly-popular television show Lost will remember as the sinister "man in black," or "Smokey" to some, has been busy shooting the detective television drama Bosch for Amazon television. But his busy and successful career in TV and film hasn't stopped him from his lifelong obsession with rescuing and raising animals of virtually all shapes and sizes.
Today, Welliver's love of animals extends to a family of four dogs and two cats who live with him and his daughter, Cora, and his wife, Jose Sempkens Welliver, an animal lover herself who brought four rescued horses into the family.
Titus Welliver's inspiring story of animal love and rescue can only be read in HealthyPet magazine, which is exclusively available through veterinary professionals. Contact your veterinarian for the latest issue of HealthyPet Magazine.


Persistent Inequality: Boston's Boom Must Serve Everyone | IBA Boston | Inquilinos Boricuas en Acción empowers and engages individuals and families to improve their lives through high-quality affordable housing, education, and arts programs.
November kicked off in observance of Latina Equal Pay Day, calling attention to the fact that, on average, Latinas earn 53 cents to every dollar earned by non-Hispanic white men. This fact and this day expose a blatant reality: that wealth and power are not shared equally nationwide and even within our city. A recent report from The Boston Foundation, Boston's Building Boom … But For Whom?, highlights that while Boston's economy is booming, the benefits are unfortunately not felt by all. Among the many findings in the report, familiar challenges and conditions still exist that must be addressed and solved. We've provided a few key takeaways from the study below.
Inequality by race continues to persist and divide communities. In Boston, Latino men who grew up in low-income households rank 24th in economic mobility and, although compared to other cities Boston ranks first for annual incomes among black men, they still make considerably less than white males.
The city's cost of living continues to negatively impact minority communities. The combination of rising housing prices and slow income growth has created an atmosphere where many hardworking residents can no longer afford to live in Boston. As an indication of this, the report found that nearly 7-in-10 white households own homes, versus less than half of Black and Latino households. While these findings are disheartening, our commitment to providing educational opportunities, economic mobility, arts and housing to people who may not otherwise have the means has been a critical component of everything we do since our establishment 50 years ago and remains as strong as ever. In fact, by the end of the year, IBA will be adding 146 units to our 521-unit affordable housing portfolio. But our work doesn't stop there. In addition to supporting Mayor Walsh's decision to increase the number of affordable housing units to be built under his Imagine 2030 plan, we will continue to encourage developers and policymakers to incentivize building more onsite affordable housing in core urban areas to ensure that low-income and minority residents aren't pushed to the peripheries of our neighborhoods.


text:
Cephalanthus (kogelbloem) is een geslacht uit de sterbladigenfamilie (Rubiaceae) met een zestal soorten  uit de gematigde klimaatzone van Amerika en tropische gebieden in Zuidelijk Afrika, Zuidoost-Azië en Amerika.

Kenmerken
De soorten uit het geslacht Cephalanthus zijn struiken of kleine bomen (5–15m). De enkelvoudige bladeren zijn gerangschikt in tegenoverstaande paren of kransen van drie. De bloemen vormen een dichte bolvormige bloeiwijze.

Naam
De naam Cephalanthus is samengesteld uit de Oudgriekse woorden κέφαλη (kephalē), hoofd, en ἄνθος (anthos), bloem, en heeft betrekking op de bolvormige bloemhoofdjes. Het geslacht wordt in het Nederlands aangeduid met de naam 'kogelbloem', en in Amerika als 'buttonbush' (letterlijk: kno(o)pstruik).

Taxonomie
Carl Linnaeus publiceerde de geslachtsnaam Cephalanthus, met de soorten Cephalanthus occidentalis en Cephalanthus orientalis, in 1753 in zijn Species plantarum; de kenmerken van het geslacht verschenen in 1754 in Genera plantarum. In Species plantarum verwees hij naar zijn eigen Flora zeylanica (1747) en naar eerdere publicaties door Jan Frederik Gronovius (Flora virginica, 1739) en Adriaan van Royen (Florae leydensis prodromus, 1740), maar die beide auteurs verwezen voor de naam Cephalanthus op hun beurt naar Genera plantarum (1737) en Hortus Cliffortianus (1738), beide van Linnaeus zelf. In de tweede editie van Species plantarum, van 1762, plaatste Linnaeus de soort Cephalanthus orientalis in het geslacht Nauclea. Daarmee werd het type van het geslacht automatisch de enige andere soort die oorspronkelijk door Linnaeus in het geslacht was geplaatst: Cephalanthus occidentalis.

De drie Amerikaanse soorten zijn:
 Cephalanthus occidentalis, van het zuidoosten van Canada tot in het midden en oosten van de VS
 C. salicifolius, uit Mexico, Honduras en het zuiden van Texas
 C. glabratus, uit centraal Zuid-Amerika
De Aziatische soorten zijn:
 C. tetrandra, uit tropisch Azië, van India tot China en Thailand
 C. angustifolius, uit Laos, Cambodja en Vietnam
De Afrikaanse soort is:
 C. natalensis

Sterbladigenfamilie

redpajama_set_name: RedPajamaWikipedia


Indulge yourself in the ultimate sensory spa experience at one of Europe's most prestigious hotels. Voted 'Best Wellness Luxury Spa' at the 2015 Luxury Hotel Awards, Palacio's Banyan Tree Spa provides the perfect setting for a transforming break that promises to leave you feeling deeply relaxed and wonderfully re-energised. Prepare to surrender yourself, body and soul.
Enjoy a 3 or 5 night pampering programme delivered within the exquisite surroundings of the stunning, sea-fronted 5 Star Palacio Estoril and its award-winning Banyan Tree Spa. Relaxing and rejuvenating treatments combine with a choice of daily fitness activities designed to rest and revive body and mind.


text:
Do We Have a Contract?
Be careful about the deals you make . . . and with who
Latest Page
Volume 2, issue #2, Page 1
23rd Oct 2022, 10:14 AM in Do We Have a Contract? Volume 2 #2
Do We Have a Contract? Volume 1 #1 Do We Have a Contract? Volume 1 #2 Do We Have a Contract? Volume 1 #3 Do We Have a Contract? Volume 1 #4 Do We Have a Contract? Volume 2 #1 Volume 2, issue #2, Page 1 Volume 2, issue #2, Page 2 Volume 2, issue #2, Page 3 Volume 2, Issue 2, Page 4 Volume 2, Issue 2, Page 5 Volume 2, Issue 2, Page 6 Volume 2, Issue 2, Page 7 Volume 2, Issue 2, Page 8 Volume 2, Issue 2, Page 9 Volume 2, Issue 2, Page 10 Volume 2, Issue 2, Page 11 Volume 2, Issue 2, Page 12 Volume 2, Issue 2, Page 13 Volume 2, Issue 2, Page 14 Volume 2, Issue 2, Page 15 Volume 2, Issue 2, Page 16 Volume 2, Issue 2, Page 17 Volume 2, Issue 2, Page 18 Volume 2, Issue 2, Page 19 Volume 2, Issue 2, Page 20 Volume 2, Issue 2, Page 21 Volume 2, Issue 2, Page 22 Volume 2, Issue 2, Page 23 Volume 2, Issue 2, Page 24 Volume 2, Issue 2, Page 25 Volume 2, Issue 2, Page 26 Do We Have a Contract? Volume 2 #3 Do We Have a Contract? Volume 2 #4
Rate this comic: 5 4 3 2 1
UNCANNY YARNS 23rd Oct 2022, 10:14 AM
Short upload this week, but it's the only way this fits!
Comic Profile
Hosted by ComicFury


text:
Home » Art Culture » Society » Paving way for hope: In Darjeeling, a bulldozer connects...
Paving way for hope: In Darjeeling, a bulldozer connects remote villages to civilisation, saves lives
Shaswata Kundu Chaudhuri
13 Sep 2022 17:08:PM
The bulldozer's work in connecting remote mountainous and forest villages to civlization has reduced the villages' mortality rates.
Far from being ominous, the bulldozer has been there to clear more than 30 landslides and dug roads in nearly 100 remote and inaccessible villages over the past year in the districts of Darjeeling and Kalimpong.
Illustrations by Satwik Gade
A non-motorable road can be as precarious as the space between life and death. This is what inhabitants of Naya Basti, a forest village in the Himalayan district of Darjeeling in West Bengal, learnt recently.
A remote hamlet at the top of a hill — it would take a person about two hours to reach the main road. But all that changed when a bulldozer was brought in to clear out a 3-kilometre path through dense woods and forests, connecting the village to the outside world; cutting short the commute time from 2 hours to 20 minutes.
Unpaved still, this 3-kilometre road's biggest impact has been in reducing the village's mortality rate. Earlier, patients had to be manually carried on stretchers down the hill on foot trails to access the main road from where cars could be availed to reach the hospital. Lives were lost along the way. With the new development, ambulances can now directly reach the village, giving patients a better chance for survival.
Earlier, patients had to be manually carried on stretchers down the hill on foot trails to access the main road from where cars could be availed to reach the hospital. Lives were lost along the way.
We exist at a time when a utilitarian JCB bulldozer has assumed an identity of its own. It is no less a mean machine, given its recent unpropitious acts, propelled by those in power. Months ago, an anti-encroachment drive by South Delhi Municipal Corporation (SDMC), was averted at Shaheen Bagh, New Delhi, when residents intervened. This is where anti-CAA protests took place two years ago. A day later it was New Friends Colony and also Mangolpuri by North Delhi Municipal Corporation (NDMC), which witnessed its threat.
Far removed from the heat and dust of the capital, the same heavy machine has been used for an altruistic purpose. The bulldozer used to pave the way for people in Darjeeling belongs to Ajoy Edwards, owner of Glenary's bakery and Darjeeling Branch President of Gorkha National Liberation Front (GNLF).
Though bulldozers are usually associated with destruction, contractors and corruption, this one has become an icon for humanitarian work. It is expensive to hire one, but its services are provided free of cost as part of the numerous philanthropic activities carried out by the Edwards Foundation, a charity organisation run by Edwards' wife, Namrata.
The bulldozer's services are provided free of cost by the Edwards Foundation, a philanthropic organisation run by Ajoy and Namrata Edwards.
Besides digging, the bulldozer has been extensively used to clear roads and helps in rescue efforts during landslides brought on by monsoons. The natural disaster causes roads to collapse or become buried under rubble, effectively blocking off communication and making certain areas inaccessible.
"Every time a village or road was blocked, the bulldozer was sent, even to far-flung areas all around Darjeeling and Kalimpong," said Edwards. The bulldozer's operator, Wangdi, informed that he cleared more than 30 landslides and dug roads in nearly 100 villages over the past year.
Though it was first deployed for landslide relief work, villagers gradually began to request its services for constructing roads to connect their villages to the main roads, as some sanctioned roads were incomplete or didn't reach villages. In some villages, such as Samthar Kavi in Kalimpong, a completely new track had to be cut through the forest.
Villagers requested the bulldozer's services to connect their villages to the main roads, as some sanctioned roads were incomplete or didn't reach villages.
The bulldozer has been extensively used to clear roads and helps in rescue efforts during landslides brought on by monsoons.
Lessening the burden
Apart from making these villages accessible, communication has improved and rations reach directly. Earlier, villagers had to carry heavy piles of sand and cement on their heads uphill for construction purposes. Now, cars do the same job, saving them the effort.
"For farmers, transporting their produce costs around Rs 100-150. Now they can avail transportation for Rs 15 only," said Arun Chhetri from Lopchu Peshok, Darjeeling. This area, famous for tea gardens, saw six roads being built by the bulldozer.
Apart from making these villages accessible, communication has improved and rations reach directly.
It takes about a week or more to dig a road, depending upon the terrain and previously existing paths. During this time, Wangdi lives in that village. "The Foundation provides me with diesel costs for about 4-5 days. The rest is covered by the villagers who also help me dig the road," he said.
The bulldozer has also been used to make playgrounds. "The area of our small playground was increased to a nine-a-side field. The Foundation provided footballs and jerseys for 60-70 village kids and funds to renovate and paint our community hall. It also took care of the treatment of a boy who had to undergo neurosurgery," said Pramod Tamang from Simkuna 3rd Mile, a village about 14 km from Darjeeling town.
The bulldozer has also been used to make playgrounds.
Philanthropic ways
The Foundation worked tirelessly during the pandemic to help people as well. It covered rent and paid for cooking gas in urban areas and offered monetary grants to 1800 migrant workers who were stranded in different places across the country, so that they could return to their villages. It also distributed gloves and face masks to 80 tea gardens in Darjeeling, as well as to hundreds of taxi drivers.
During the monsoon, when poor people's houses leaked, tarpaulins, food packets and essential medicines were distributed in rural areas. Glenary's offered daily breakfast to about 30 daily wage workers for four months during the first lockdown and distributed bread and bakery items to orphanages, old-age homes and rehab centers. This is only a fraction of Edwards's benevolence; he has been at it for the past two decades with private funding.
Buddha Tamang, a farmer and member of GNLF who oversaw the bulldozer's work in Kalimpong, blames political corruption for the despicable state of affairs in rural areas. "The government receives funds for development work, none of which percolates to the grassroot level. So, we try to help villages by making roads," he said.
The bulldozer has been there to clear more than 30 landslides and dug roads in nearly 100 remote and inaccessible villages over the past year in the districts of Darjeeling and Kalimpong.
Even though the roads dug by the bulldozer are not complete, they are usable. The villages aren't cut off from civilisation anymore. Vikas Pradhan, the owner of Darjeeling's Revolver hotel, summed it up succinctly: "The bulldozer remains on standby for any clearing and rescue effort required. To have it during moments of crises is not just a novelty but a true lifesaver. It has become a symbol of hope for many so far."
Landslides Triggered By Heavy Rain
Published: 13 Sep 2022 13:18:PM