text:
#ifndef B_MATRIX_H
#define B_MATRIX_H

#include <blob/types.h>
#include <blob/math.h>

#if defined(__linux__)
#include <string.h>
#include <iostream>
#endif
// FIXME: revise "virtual" and "const"
//#define Matrix_MaxLength (50*50)

namespace blob {

const int MATRIX_MAX_ROWCOL (50);
const int MATRIX_MAX_LENGTH (MATRIX_MAX_ROWCOL*MATRIX_MAX_ROWCOL);

/**
 * Implements generic Matrix object and operations.
 */
template <typename T> class Matrix
{
  public:
    /**
     * Initializes matrix from already allocated array.
     * \param rows   matrix number of rows
     * \param cols   matrix number of columns.
     * \param data   array with matriz elements allocation with the following
     *               distribution: [row0 row1 row2 ... rowN].
     */
    Matrix (uint8_t rows=0, uint8_t cols=0, T * data=NULL)
    {
      _nrows=rows;
      _ncols=cols;
      _data=data;
    }
    /**
     * Provides matrix number of rows.
     * \return matrix number of rows.
     */
    uint8_t nrows () const { return _nrows; }
    /**
     * Provides matrix number of columns.
     * \return matrix number of columns.
     */
    uint8_t ncols () const { return _ncols; }
    /**
     * Provides matrix number of elements.
     * \return matrix number of elements.
     */
    uint16_t length () const { return (uint16_t)_ncols*_nrows; }
    /**
     * Provides pointer to matrix data array.
     * \return pointer to matrix data array.
     */
    T * data () const { return _data; }
    /**
     * Changes matrix size and if necessary data array.
     * \param rows   matrix number of rows.
     * \param cols   matrix number of columns.
     * \param data   array with matriz elements allocation with the following
     *               distribution: [row0 row1 row2 ... rowN].
     */
    void refurbish (uint8_t rows, uint8_t cols, T *data = NULL)
    {
      _nrows=rows;
      _ncols=cols;
      if(data)
        _data=data;
    }
    /**
     * Makes zero all elements of matrix.
     * \return  true if successful, false otherwise.
     */
    bool zero ()
    {
      memset(_data,0,sizeof(T)*_nrows*_ncols);
      return true;
    }
    /**
     * Makes 1.0 all elements of matrix.
     * \return  true if successful, false otherwise.
     */
    bool ones ()
    {
      for(int i=0;i<length();i++)
        _data[i]=1;
    }
    /**
     * Makes identity matrix if matrix is square (nrows=ncols). Identity matrix
     * elements are: 1 if row=col 0 otherwise.
     * \return  true if successful, false otherwise.
     */
    bool eye ()
    {
      bool retval = false;
      if(_ncols == _nrows)
      {
        this->zero();
        for (int i=0; i<_nrows; i++)
        {
          _data[i*_ncols + i] = 1;
        }
        retval = true;
      }
    #if defined(__DEBUG__) & defined(__linux__)
      else
        std::cerr << "Matrix::cholinverse() error: Matrix is not square"
                  << std::endl;
    #endif

      return retval;
    }
    /**
     * Fills elements from matrix M into this.
     * \param M  matrix to copy from.
     * \return  true if successful, false otherwise.
     */
    bool copy (const blob::Matrix<T> & M)
    {
      bool retval = false;

      if (M.nrows()==_nrows && M.ncols()==_ncols)
      {
        memcpy(this->data(), M.data(), sizeof(T)*this->length());
        retval = true;
      }
      return retval;
    }
    /**
     * Fills elements from matrix M into this.
     * \param M      matrix to copy elements from.
     * \param row0   first row to substitute in this matrix.
     * \param col0   first column to substitute in this matrix.
     * \param row0m  first row to copy from matrix M.
     * \param col0m  first column to copy from matrix M.
     * \param nrows  number of rows to copy.
     * \param ncols  number of columns to copy.
     * \return  true if successful, false otherwise.
     */
    bool copy (const blob::Matrix<T> & M, uint8_t nrows, uint8_t ncols,
                                          uint8_t row0=0, uint8_t col0=0,
                                          uint8_t row0m=0, uint8_t col0m=0)
    {
      bool retval = false;

      if ((row0m+nrows)<=M.nrows()    && (col0m+ncols)<=M.ncols() &&
          (row0+nrows)<=this->nrows() && (col0+ncols)<=this->ncols())
      {
        for (int i=0; i<nrows; i++)
        {
          // _data[this->ncols()*(row0+i) + col0]
          // M(row0m+i,col0m) &M[M.ncols()*(row0m+i) + col0m]
           memcpy(&(this->_data[this->ncols()*(row0+i) + col0]), &M(row0m+i,col0m), ncols*sizeof(T));
        }
        retval = true;
      }
    #if defined(__DEBUG__) & defined(__linux__)
      else
        std::cerr << "Matrix::copy() error: "
                  << (int)_nrows << ">=" << (int)(nrows+row0) << "?"
                  << (int)_ncols << ">=" << (int)(ncols+col0) << "?"
                  << (int)M.nrows() << ">=" << (int)(nrows+row0m) << "?"
                  << (int)M.ncols() << ">=" << (int)(ncols+col0m) << "?"
                  << std::endl;
    #endif
      return retval;
    }

    /**
     * Provides element in given row and col.
     * \param row row the element is in.
     * \param col column the element is in.
     * \return  value of matrix element in given row and col.
     */
    T & operator () (const uint8_t row, const uint8_t col)
    {
      if(_data && (row<_nrows) && (col<_ncols))
        return _data[_ncols*row + col];
      else
        return _data[0];
    }
    /**
     * Provides element in given row and col.
     * \param row row the element is in.
     * \param col column the element is in.
     * \return  value of matrix element in given row and col.
     */
    const T & operator () (const uint8_t row, const uint8_t col) const
    {
      if(_data && (row<_nrows) && (col<_ncols))
        return _data[_ncols*row + col];
      else
        return _data[0];
    }
    /**
     * Provides element in given array position.
     * \param i column the element is in.
     * \return  value of matrix element in given row and col.
     */
    T & operator () (int i)
    {
      if(_data && (i<_nrows*_ncols))
        return _data[i];
      else
        return _data[0];
    }
    /**
     * Provides element in given array position.
     * \param i column the element is in.
     * \return  value of matrix element in given row and col.
     */
    const T & operator () (int i) const
    {
      if(_data && (i<_nrows*_ncols))
        return _data[i];
      else
        return _data[0];
    }
    /**
     * Provides element in given array position.
     * \param i column the element is in.
     * \return  value of matrix element in given row and col.
     */
    T & operator [] (int i)
    {
      if(_data && (i<_nrows*_ncols))
        return _data[i];
      else
        return _data[0];
    }
    /**
     * Provides element in given array position.
     * \param i column the element is in.
     * \return  value of matrix element in given row and col.
     */
    const T & operator [] (int i) const
    {
      if(_data && (i<_nrows*_ncols))
        return _data[i];
      else
        return _data[0];
    }
    /**
     * Adds this matrix with other matrix and stores the result in this matrix.
     * \param M  matrix to add.
     * \return  this matrix after adding matrix M.
     */
    Matrix<T> & operator += (const Matrix<T> & M) { this->add(M); }
    /**
     * Substracts a matrix to this matrix and stores the result in this matrix.
     * \param M  matrix to substract.
     * \return  this matrix after substracting matrix M.
     */
    Matrix<T> & operator -= (const Matrix<T> & M) { this->substract(M); }
    /**
     * Scales this matrix.
     * \param n  Scalar to scale this matrix.
     * \return  this matrix after scaling.
     */
    Matrix<T> & operator *= (const real_t & n) { this->scale(n); }
   /**
     * Scales this matrix (division).
     * \param n  Scalar to scale this matrix (division).
     * \return  this matrix after dividing.
     */
    Matrix<T> & operator /= (const real_t & n) { this->scale(1/n); }
    /**
     * Elementwise multiplies this matrix with other matrix and stores the
     * result in this matrix.
     * \param M  Matrix to elementwise multiply with.
     * \return  this matrix elementwise multiplied.
     */
    Matrix<T> & operator &= (const Matrix<T> &M) { this->multiplyElem(M); }
    /**
     * Equality condition operator. Matrix are equal if all elements are equal.
     * \param M Matrix to compare with.
     * \return  true if Matrix are equal, false otherwise.
     */
    bool operator == (const Matrix<T> & M) const
    {
      for(int i=0;i<length();i++)
        if(_data[i]!=M[i])
          return false;
      return true;
    }
    /**
     * Inequality condition operator. Matrix are equal if all elements are equal
     * \param M Matrix to compare with.
     * \return  true if Matrix are not equal, false otherwise.
     */
    bool operator != (const Matrix<T> &M) const
    {
      for(int i=0;i<length();i++)
        if(_data[i]!=M[i])
          return true;
      return false;
    }
    /**
     * Checks if any matrix elements are NaN (Not a Number)
     * \return  true if a Matrix element is NaN, false otherwise.
     */
    bool isNan (void) const
    {
      for(int i=0;i<length();i++)
        if(isnan(_data[i]))
          return true;
      return false;
    }
    /**
     * Checks if any matrix elements are infinite
     * \return  true if a Matrix element is infinite, false otherwise.
     */
    bool isInf (void) const
    {
      for(int i=0;i<length();i++)
        if(isinf(_data[i]))
          return true;
        return false;
    }
    /**
     * Checks if all matrix elements are zero
     * \return  true if all Matrix elements are zero, false otherwise.
     */
    bool isZero (void) const
    {
      for(int i=0;i<length();i++)
        if(_data[i]!=0)
          return false;
      return true;
    }
    /**
     * Adds matrix M elements to this matrix.
     * \param M      matrix to add elements from.
     * \return  true if successful, false otherwise.
     */
    bool add (const Matrix<T> & M)
    {
      return add(M,_nrows,_ncols,0,0);
    }
    /**
     * Adds matrix M elements to this matrix.
     * \param M      matrix to add elements from.
     * \param nrows  number of rows to sum.
     * \param ncols  number of columns to sum.
     * \param row0   first row to substitute in this matrix.
     * \param col0   first column to substitute in this matrix.
     * \return  true if successful, false otherwise.
     */
    bool add (const Matrix<T> & M, uint8_t nrows, uint8_t ncols,
                                           uint8_t row0=0, uint8_t col0=0)
    {
      bool retval = false;
      if ((row0+nrows)<=M.nrows()     && (col0+ncols)<=M.ncols() &&
          (row0+nrows)<=this->nrows() && (col0+ncols)<=this->ncols())
      {
        retval = true;
        for (int i=row0; i<row0+nrows; i++)
          for (int j=col0; j<col0+ncols; j++)
            _data[i*_ncols + j] += M(i,j);
      }
    #if defined(__DEBUG__) & defined(__linux__)
      else
        std::cerr << "Matrix::add() error: "
                  << (int)_nrows << ">=" << (int)(M.nrows()+row0) << "?"
                  << (int)_ncols << ">=" << (int)(M.ncols()+col0) << "?"
                  << std::endl;
    #endif
      return retval;
    }
    /**
     * Substracts matrix M elements from this matrix.
     * \param M  matrix to substract elements from.
     * \return  true if successful, false otherwise.
     */
    bool substract (const Matrix<T> & M)
    {
      return substract(M,_nrows,_ncols,0,0);
    }
    /**
     * Substracts matrix M elements from this matrix.
     * \param M      matrix to substract elements from.
     * \param nrows  number of rows to substract.
     * \param ncols  number of columns to substract.
     * \param row0   first row to substitute in this matrix.
     * \param col0   first column to substitute in this matrix.
     * \return  true if successful, false otherwise.
     */
    bool substract (const Matrix<T> & M, uint8_t nrows, uint8_t ncols,
                                                uint8_t row0=0, uint8_t col0=0)
    {
      bool retval = false;

      if ((row0+nrows)<=M.nrows()     && (col0+ncols)<=M.ncols() &&
          (row0+nrows)<=this->nrows() && (col0+ncols)<=this->ncols())
      {
        retval = true;
        for (int i=row0; i<row0+nrows; i++)
          for (int j=col0; j<col0+ncols; j++)
            _data[i*_ncols + j] -= M(i,j);
      }
    #if defined(__DEBUG__) & defined(__linux__)
      else
        std::cerr << "Matrix::substract() error: "
                  << (int)_nrows << ">=" << (int)(M.nrows()+row0) << "?"
                  << (int)_ncols << ">=" << (int)(M.ncols()+col0) << "?"
                  << std::endl;
    #endif

      return retval;
    }
    /**
     * Multiplies matrix A and B and stores the result into this matrix.
     * \param A  left matrix to multiply.
     * \param B  right matrix to multiply.
     * \return  true if successful, false otherwise.
     */
    bool multiply (const Matrix<T> & A, const Matrix<T> & B)
    {
      bool retval = false;

      if((A.ncols() == B.nrows()) &&
         (this->nrows() == A.nrows()) &&
         (this->ncols() == B.ncols()))
      {
        for (int i = 0; i < this->nrows(); i++)
        {
          for (int j = 0; j < this->ncols(); j++)
          {
            uint8_t index = i*this->ncols() + j;
            _data[index] = 0;
            for (int k = 0; k < A.ncols(); k++)
            {
              _data[index] += A[i*A.ncols()+k]*B[k*B.ncols()+j];
            }
          }
        }
        retval = true;
      }
    #if defined(__DEBUG__) & defined(__linux__)
      else
        std::cerr << "Matrix::multiply() error: "
                  << (int)A.ncols() << "==" << (int)B.nrows() << "?"
                  << (int)this->nrows() << "==" << (int)A.nrows() << "?"
                  << (int)this->ncols() << "==" << (int)B.ncols() << "?"
                  << std::endl;
    #endif
      return retval;
    }
    /**
     * Multiplies this matrix with diagonal elements in unidimensional matrix D
     * (row matrix or column matrix).
     * \param d  unidimensional matrix with diagonal elements.
     * \return  true if successful, false otherwise.
     */
    bool multiplyDiag (const Matrix<T> & d)
    {
      bool retval = false;

      if (((d.nrows()==_ncols)&&(d.ncols()==1)) || // this*d
          ((d.ncols()==_ncols)&&(d.nrows()==1)) && (_nrows==d.length()))
      {
        for (int i=0; i<_nrows; i++)
          for (int j=0; j<_ncols; j++)
            _data[_ncols*i + j] *= d[j];

        retval = true;
      }
      else if (((d.nrows()==_nrows)&&(d.ncols()==1)) || // D*this
               ((d.ncols()==_nrows)&&(d.nrows()==1)) && (_ncols==d.length()))
      {
        for (int i=0; i<_nrows; i++)
          for (int j=0; j<_ncols; j++)
            _data[_ncols*i + j] *= d[i];

        retval = true;
      }
    #if defined(__DEBUG__) & defined(__linux__)
      else
        std::cerr << "Matrix::multiplyDiag() error: " << (int)_ncols << "/"
                  << (int)_nrows << "==" << (int)d.nrows() << "/"
                  << (int)d.ncols() << "?" << (int)d.nrows() << "/"
                  << (int)d.ncols() << "== 1?" << std::endl;
    #endif

      return retval;
    }
    /**
     * Elementwise multiplies this matrix with matrix M.
     * \param M  matrix to elementwise multply with.
     * \return  true if successful, false otherwise.
     */
    bool multiplyElem (const Matrix<T> & M)
    {
      bool retval = false;

      if ((M.nrows()==_nrows)&&(M.ncols()==_ncols))
      {
        for (int i=0; i < _nrows; i++)
          for (int j=0; j < _ncols; j++)
            _data[_ncols*i+j] *= M[j];
        retval = true;
      }

      return retval;
    }
    /**
     * Scales this matrix.
     * \param n  Scalar to scale this matrix.
     * \return  true if successful, false otherwise.
     */
    bool scale (const T & n)
    {
      bool retval = false;

      if(_data)
      {
        for (int i = 0; i < _nrows*_ncols; i++)
        {
          _data[i] = n*_data[i];
        }
        retval = true;
      }
      return true;
    }
    /**
     * Transposes this matrix.
     * \return  true if successful, false otherwise.
     */
    bool transpose ()
    {
      int start, next, i;
      T tmp;

      for (start = 0; start <= _ncols*_nrows - 1; start++) {
        next = start;
        i = 0;
        do {
          i++;
          next = (next % _nrows)*_ncols + next/_nrows;
        } while (next > start);

        if (next < start || i == 1) continue;

        tmp = _data[next = start];
        do {
          i = (next % _nrows)*_ncols + next/_nrows;
          _data[next] = (i == start) ? tmp : _data[i];
          next = i;
        } while (next > start);
      }

      i=_ncols;
      _ncols = _nrows;
      _nrows = i;

      return true;
    }
    /**
     * Squared Euclidean norm of the matrix
     * \return  squared Euclidean norm of the matrix
     */
    T squareNorm () const
    {
      T ret=0;
      for(int i=0;i<this->length();i++)
        ret+=_data[i]*_data[i];
      return ret;
    }
    /**
     * Euclidean norm of the matrix
     * \return  Euclidean norm of the matrix
     */
    real_t norm () const { return math::sqrtr(this->squareNorm()); }
    /**
     * Normalizes (divides by norm) the matrix so that its norm is 1.0
     * \return  true if successful, false otherwise.
     */
    bool normalize ()
    {
      real_t norm=this->norm();
      for(int i=0;i<this->length();i++)
        _data[i]/=norm;
      return true;
    }
    /**
     * Permutes two rows of this matrix
     * \param row1  row to permute
     * \param row2  row to permute
     * \param ncols  columns to permute (e.g. if all remaining elements in the
     *               row are zero)
     * \param col0  column to start permutation at (e.g. if all previous
     *              elements are zero)
     * \return  true if successful, false otherwise.
     */
    bool permuteRows (uint8_t row1, uint8_t row2, uint8_t ncols, uint8_t col0=0)

    {
      if(row1>=_nrows || row2>=_nrows || (col0+ncols)>_ncols)
        return false;

      T aux=0;

      for(int i=col0;i<col0+ncols;i++)
      {
        aux=_data[_ncols*row1+i];
        _data[_ncols*row1+i]=_data[_ncols*row2+i];
        _data[_ncols*row2+i]=aux;
      }
      return true;
    }
    /**
     * Permutes two rows of this matrix
     * \param row1  row to permute
     * \param row2  row to permute
     * \return  true if successful, false otherwise.
     */
    bool permuteRows(uint8_t row1, uint8_t row2)
    {
      return permuteRows(row1,row2,_ncols,0);
    }
    /**
     * Permutes two columns of this matrix
     * \param col1  column to permute
     * \param col2  column to permute
     * \param nrows  rows to permute (e.g. if all remaining elements in the
     *               column are zero)
     * \param row0  row to start permutation at (e.g. if all previous elements
     *              are zero)
     * \return  true if successful, false otherwise.
     */
    bool permuteCols (uint8_t col1, uint8_t col2, uint8_t nrows, uint8_t row0=0)

    {
      if(col1>=_ncols || col2>=_ncols || (row0+nrows)>_nrows)
        return false;

      T aux=0;

      for(int i=row0;i<row0+nrows;i++)
      {
        aux=_data[_ncols*i+col1];
        _data[_ncols*i+col1]=_data[_ncols*i+col2];
        _data[_ncols*i+col2]=aux;
      }
      return true;
    }
    /**
     * Permutes two columns of this matrix
     * \param col1  column to permute
     * \param col2  column to permute
     * \return  true if successful, false otherwise.
     */
    bool permuteCols(uint8_t col1, uint8_t col2)
    {
      return permuteCols(col1,col2,_nrows,0);
    }
    /**
     * Shows the matrix elements in standard output
     */
    void print ()
    {
      for(int i=0; i<_nrows; i++)
      {
        for(int j=0; j<_ncols; j++)
    #if defined(__linux__)
          std::cout << " " << _data[i*_ncols + j];
        std::cout << std::endl;
    #elif defined(__AVR_ATmega32U4__)
        if(Serial)
        {
          Serial.print(" ");
          Serial.print(_data[i*_ncols + j]);
        }
        Serial.println("");
    #endif
      }
    }
    /**
     * Adds matrix M elements to this matrix.
     * \param A matrix to sum.
     * \param B matrix to sum.
     * \param R resulting matrix.
     * \return  true if successful, false otherwise.
     */
    static bool add (const Matrix<T> & A, const Matrix<T> & B, Matrix<T> & R)
    {
      return (R.copy(A) && R.add(B));
    }
    /**
     * Adds matrix M elements to this matrix.
     * \param A      matrix to sum.
     * \param B      matrix to sum.
     * \param R      resulting matrix.
     * \param nrows  number of rows to sum.
     * \param ncols  number of columns to sum.
     * \param row0   first row to substitute in this matrix.
     * \param col0   first column to substitute in this matrix.
     * \return  true if successful, false otherwise.
     */
    static bool add (const Matrix<T> & A, const Matrix<T> & B, Matrix<T> & R,
                                                uint8_t nrows, uint8_t ncols,
                                                uint8_t row0=0, uint8_t col0=0)
    {
      return (R.copy(A) && R.add(B,nrows,ncols,row0,col0));
    }
    /**
     * Substracts matrix M elements from this matrix.
     * \param A      initial matrix.
     * \param B      matrix to substract.
     * \param R      resulting matrix.
     * \return  true if successful, false otherwise.
     */
    static bool substract(const Matrix<T> & A,const Matrix<T> & B,Matrix<T> & R)
    {
      return (R.copy(A) && R.substract(B));
    }
    /**
     * Substracts matrix M elements from this matrix.
     * \param A      initial matrix.
     * \param B      matrix to substract.
     * \param R      resulting matrix.
     * \param nrows  number of rows to substract.
     * \param ncols  number of columns to substract.
     * \param row0   first row to substitute in this matrix.
     * \param col0   first column to substitute in this matrix.
     * \return  true if successful, false otherwise.
     */
    static bool substract(const Matrix<T> & A,const Matrix<T> & B,Matrix<T> & R,
                                              uint8_t nrows, uint8_t ncols,
                                              uint8_t row0=0, uint8_t col0=0)
    {
      return (R.copy(A) && R.substract(B,nrows,ncols,row0,col0));
    }
    /**
     * Scales this matrix.
     * \param n  Scalar to scale this matrix.
     * \param A  initial matrix.
     * \param R  resulting matrix.
     * \return  true if successful, false otherwise.
     */
    static bool scale (const T & n, const Matrix<T> & A, Matrix<T> & R)
    {
      return (R.copy(A) && R.scale(n));
    }
    /**
     * Multiplies matrix A and B and stores the result into this matrix.
     * \param A  left matrix to multiply.
     * \param B  right matrix to multiply.
     * \param R  resulting matrix.
     * \return  true if successful, false otherwise.
     */
    static bool multiply (const Matrix<T> & A, const Matrix<T> & B,
                                                                 Matrix<T> & R)
    {
      return R.multiply(A,B);
    }
    /**
     * Multiplies this matrix with diagonal elements in unidimensional matrix D
     * (row matrix or column matrix).
     * \param A  initial matrix.
     * \param d  unidimensional matrix with diagonal elements.
     * \param R  resulting matrix.
     * \return  true if successful, false otherwise.
     */
    static bool multiplyDiag (const Matrix<T> & A, const Matrix<T> & d,
                                                                 Matrix<T> & R)
    {
      return (R.copy(A) && R.multiplyDiag(d));
    }
    /**
     * Elementwise multiplies this matrix with matrix M.
     * \param A  left matrix to elementwise multiply.
     * \param B  right matrix to elementwise multiply.
     * \param R  resulting matrix.
     * \return  true if successful, false otherwise.
     */
    static bool multiplyElem (const Matrix<T> & A, const Matrix<T> & B,
                                                                 Matrix<T> & R)
    {
      return (R.copy(A) && R.multiplyElem(B));
    }
    /**
     * Transposes this matrix.
     * \param A  initial matrix to transpose.
     * \param R  resulting matrix.
     * \return  true if successful, false otherwise.
     */
    static bool transpose (const Matrix<T> & A, Matrix<T> & R)
    {
      return (R.copy(A) && R.transpose());
    }

  protected:
    uint8_t _nrows; /**< matrix number of rows */
    uint8_t _ncols; /**< matrix number of columns */
    T * _data;      /**< pointer to matrix element array */
};

/**
 * Implements real number Matrix object and operations.
 */
class MatrixR : public Matrix<real_t>
{
  public:
    /**
     * Initializes matrix from already allocated array.
     * \param rows   matrix number of rows
     * \param cols   matrix number of columns.
     * \param data   array with matriz elements allocation with the following
     *               distribution: [row0 row1 row2 ... rowN].
     */
    MatrixR (uint8_t rows = 0, uint8_t cols = 0, real_t *data = NULL);
    /**
     * Calculates this matrix Cholesky decomposition, resulting in a triangular
     * matrix. https://en.wikipedia.org/wiki/Cholesky_decomposition
     * \param zero  if true, lower triangle converted to zeros
     * \return  true if successful, false otherwise.
     */
    bool cholesky (bool zero=true);
    /**
     * Updates a cholesky factor matrix with a vector and returns the upper
     * triangular Cholesky factor of A + x*x', where x is a column vector of
     * appropriate length. cholupdate uses only the diagonal and upper triangle
     * of R. https://es.mathworks.com/help/matlab/ref/cholupdate.html
     * \param zero  if true, lower triangle converted to zeros
     * \return  true if successful, false otherwise.
     */
    bool cholupdate (MatrixR & v, int sign);
    /**
     * Restores original matrix from its Cholesky decomposition.
     * https://en.wikipedia.org/wiki/Cholesky_decomposition
     * \param zero  if true, lower triangle converted to zeros
     * \return  true if successful, false otherwise.
     */
    bool cholrestore (bool zero=true);
    /**
     * Inverses matrix lower triangular matrix
     * https://en.wikipedia.org/wiki/Triangular_matrix
     * \return  true if successful, false otherwise.
     */
    bool cholinverse ();
    /**
     * Performs LU factorization with L and U matrix in self matrix
     * \return  true if successful, false otherwise.
     */
    bool lu ();
    /**
     * Restores original matrix from LU factorization
     * \return  true if successful, false otherwise.
     */
    bool lurestore ();
    /**
     * Inverses matrix based on Cholesky decomposition (if positive-definite) or
     * LU decomposition otherwise.
     * \param isPositiveDefinite  Indicates if inverse can be performed based on
     *                            Chloesky decomposition.
     * \return  true if successful, false otherwise.
     */
    bool inverse (bool isPositiveDefinite=false);
    /**
     * Forces matrix definite positiveness.
     * \return  true if successful, false otherwise.
     */
    bool forcePositive ();
    /**
     * Forces matrix simmetry.
     * \return  true if successful, false otherwise.
     */
    bool simmetrize ();
    /**
     * Divides matrix A by B and stores the result into matrixR.
     * \param A  Dividend matrix.
     * \param B  Divisor matrix.
     * \param R  Resulting matrix
     * \return  true if successful, false otherwise.
     */
    static bool divide (const MatrixR & A, MatrixR & B, MatrixR & R);
    /**
     * Calculates this matrix Cholesky decomposition, resulting in a triangular
     * matrix. https://en.wikipedia.org/wiki/Cholesky_decomposition
     * \param A  original matrix
     * \param L  resulting cholesky decomposed lower triangular matrix
     * \return  true if successful, false otherwise.
     */
    static bool cholesky (const MatrixR & A, MatrixR & L);
    /**
     * Inverses matrix based on Cholesky decomposition
     * \param A  original matrix
     * \param R  resulting inverse matrix inv(A)
     * \return  true if successful, false otherwise.
     */
    static bool inverse (MatrixR & A, MatrixR & R,
                                      bool isPositiveDefinite=false);
    /**
     * Inverses matrix lower triangular matrix
     * https://en.wikipedia.org/wiki/Triangular_matrix
     * \param L  lower triangle Cholesky factor matrix
     * \param R  resulting inverse matrix inv(L)
     * \return  true if successful, false otherwise.
     */
    static bool cholinverse (const MatrixR & L, MatrixR & R);
    /**
     * Calculates this matrix LDL decomposition, resulting in a triangular
     * matrix and diagolar elements vector.
     * https://es.mathworks.com/help/dsp/ref/ldlfactorization.html
     * \param A  original matrix
     * \param L  resulting cholesky decomposed lower triangular matrix
     * \return  true if successful, false otherwise.
     */
    static bool ldl (const MatrixR & A, MatrixR & L, MatrixR & d);
    /**
     * Matrix QR decomposition. https://en.wikipedia.org/wiki/QR_decomposition
     * \param A  original matrix A=Q*R
     * \param Q  resulting mxm orthogonal matrix or unitary matrix
     * \param R  resulting mxn upper triangular matrix
     * \return  true if successful, false otherwise.
     */
    static bool qr (const MatrixR & A, MatrixR & Q, MatrixR & R);
    /**
     * Matrix LU decomposition with partial pivoting.
     * \param A  original matrix P*A=L*U
     * \param L  resulting lower triangular matrix
     * \param U  resulting upper triangular matrix
     * \param P  resulting pivot matrix
     * \return  true if successful, false otherwise.
     */
    static bool lu (const MatrixR & A, MatrixR & L, MatrixR & U, MatrixR & P);
    /**
     * Matrix LU decomposition without partial pivoting.
     * \param A  original matrix A=L*U
     * \param L  resulting lower triangular matrix
     * \param U  resulting upper triangular matrix
     * \return  true if successful, false otherwise.
     */
    static bool lu (const MatrixR & A, MatrixR & L, MatrixR & U);
    /**
     * Matrix LU decomposition without partial pivoting.
     * \param A  original matrix A=L*U
     * \param R  resulting lower and upper triangular matrix represented in same
     *           matrix.
     * \return  true if successful, false otherwise.
     */
    static bool lu (const MatrixR & A, MatrixR & R);
};

}

#endif // B_MATRIX_H

redpajama_set_name: RedPajamaGithub


text:
Q: NullPointerException with HikariCP I get the following error when starting my application:
java.lang.NullPointerException
        at me.MyApp.MyApp.Database.getConn(Database.java:30) ~[?:?]
        at me.MyApp.MyApp.Models.MyAppModel.<init>(MyAppModel.java:18) ~[?:?]

Here is how I've set up my Database class:
public class Database {
    private static MyApp instance = MyApp.getInstance();
    private static Config config = new Config();

private static HikariDataSource ds = new HikariDataSource();

static {

    HikariConfig dbConfig = new HikariConfig();
    dbConfig.setJdbcUrl("jdbc:mysql://localhost:3306/" + config.get("database.database"));
    dbConfig.setUsername(config.get("database.username"));
    dbConfig.setPassword(config.get("database.password"));
    dbConfig.setDriverClassName("com.mysql.jdbc.Driver");
    dbConfig.addDataSourceProperty("cachePrepStmts", "true");
    dbConfig.addDataSourceProperty("prepStmtCacheSize", "250");
        dbConfig.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");

}

    public static Connection getConn() {
        try {
            return ds.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

}

And here is my model class that triggers the error:
public class MyAppModel {

    private MyApp instance = MyApp.getInstance();
    private Connection connection;

    public MyAppModel() {
        connection = Database.getConn();
    }

    public void createTable() {
        BukkitRunnable r = new BukkitRunnable() {
            @Override
            public void run() {
                try {
                    String sql = "CREATE TABLE IF NOT EXISTS `myapp` ( " +
                            " `id` INT NOT NULL AUTO_INCREMENT ," +
                            "`uuid` VARCHAR(255) NOT NULL ," +
                            " `join_message` VARCHAR(255) NOT NULL ," +
                            " `quit_message` VARCHAR(255) NOT NULL ," +
                            " `change_points` INT NOT NULL," +
                            " `last_modified` TIMESTAMP NOT NULL," +
                            " PRIMARY KEY (`id`)" +
                            ")";
                    Statement statement = connection.createStatement();
                    statement.executeUpdate(sql);
                } catch(SQLException e) {
                    e.printStackTrace();
                }
            }
        };

        r.runTaskAsynchronously(instance);
    }
}

I think MyAppModel connection returns null and I'm handling the TryCatch handling wrong, but I'm not entirely sure why it's returning null. What am I doing wrong?
I understand the concept of a NullPointerException but not why my application is giving me this error.

A: In your getConn() function you call ds.getConnection() but the variable ds has never been created within your class. Make sure you initialize the HikariDataSource object called ds.
Sorry I was confused by the objects being used so change the dbConfig back to what you had and just create the new HikariDataSource object using its constructor according to the javadocs -> HikariDataSource(HikariConfig configuration)
Therefore you will need to switch the initialization of the objects and use your dbConfig object within the constructor of your HikariDataSource object.
private static HikariConfig dbConfig;
static { //keep this the same
    dbConfig = new HikariConfig();
    dbConfig.setJdbcUrl("jdbc:mysql://localhost:3306/" + config.get("database.database"));
    dbConfig.setUsername(config.get("database.username"));
    dbConfig.setPassword(config.get("database.password"));
    dbConfig.setDriverClassName("com.mysql.jdbc.Driver");
    dbConfig.addDataSourceProperty("cachePrepStmts", "true");
    dbConfig.addDataSourceProperty("prepStmtCacheSize", "250");
    dbConfig.addDataSourceProperty( "prepStmtCacheSqlLimit", "2048");
}

private static HikariDataSource ds = new HikariDataSource(dbConfig); //intialize here with your newly created HikariConfig object

redpajama_set_name: RedPajamaStackExchange


If you were looking for the most expensive F-Series pickup truck or you just wanted plenty of luxury features usually found in a limo in your new trusty workhorse, then Ford has just revealed the new Super Duty Limited series.
Positioned as the absolute king of the F-Series range, the new Super Duty Limited models combine technology and comfort features that are usually reserved for premium flagship sedans with their inherent strengths, including a tow capacity of more than 30,000lbs in the case of the F-450 Limited.
Speaking of which, the new Ford F-450 Limited now starts from $87,100, with the company acknowledging that if a customer checks every box on the options list the total will be as much as $94,455 or just above $100,000 when you include taxes and fees.
You might ask yourself what's the point of a nearly $100k pickup truck and Ford will tell you that more than 50 percent of the Super Duty range's sales this year are about high-end models, like the Lariat, King Ranch and Platinum Series, so clearly the demand is there for the taking.
The Limited series adds features like custom Camelback two-tone leather seats, premium stitched leather-wrapped steering wheel, armrests and instrument panel, a suede headliner, hand-finished dark ash wood trim and the obligatory special badging.
A special twin-bar satin grille with chrome accents, quad-beam LED lights and a satin-finished tailgate applique are bespoke to Limited models while each one has a dedicated serial number laser-etched on the center console armrest.
The range-topping Super Duty models also come with a range of class-exclusive tech features, including a high-definition 360-degree camera with Trailer Reverse Guidance, BLIS with trailer coverage, adaptive cruise control and more.
Ford's new Super Duty Limited trucks will be powered by the 6.7-liter Powerstroke V8 diesel across the F-250 ($80,835), F-350 ($82,010) and F-450 ($87,100) versions, with a single- or dual-rear-wheel configurations, with the first examples to arrive at dealerships this winter.
100k for a Ford truck….wow….
due to the fact that it prolly takes about $70k to bring them to boomerang country.
If Australians are willing to pay $150(AU, I assume which is still a crazy $117K US) for a "basic" (I suspect it's well equipped) F150, shame on them.
Another luxury plaything for Albertans.
It's so ridiculous I love it… If there's a market for it and they can capture it good for them because they will never get those prices from any of their sedans Ford or Lincoln!
Funny thing is that he same pickup with a Lincoln badge wouldn't stand a chance.
This truck is for the construction boss or billionaire land owner…why can't they have their Rolls Royce experience in their trucks?
I somehow like it, but it doesn't fit on European city streets anyway, so that's 100k saved for me.
The amount of hard plastics in there love it.
I like the hard plastic every where, even the touch points.
Gonna be hard to find a parking spot with this thing….
Correction – TWO parking spots.
I want this with a slight lift kit and offroading wheels/tires.
King of the full size trucks.
Like another hole in the head.
No biggie here! Ford already has at least two models right at $100,000 with the Roush F150 and the Tonka F150.
Amazing Amazing!! Big Trck Pick Up Luxury for me now!! Trailer Motorcycles Can Am Spyder F3, Honda Goldwing F3B more motorcycles touring luxury.
To be honest, the only feature that appeals to me over the rest of the range are the massaging seats. On long drives those are incredible.
An early California? A disgrace to the prancing horse, its the modern day equivalent to the Mondial.
I'd rather have the truck.
Yea, but the Ford will still be running 18 months from now.
If people will pay $80k to over $100k for POS Cadilacs then why not.
What do they pay for the good Cadillacs?
CGI Andre the Giant for the Euro market.
Godzilla for the Asian market.
Got a winner here folks.
What do you think owners will tow /haul with this truck?
PROBABLY A BOAT LIKE THE ONE IN THE PIC.
Why not, I love it.


With everything revolving around the internet today, it's just impossible to stay away from the network connecting devices, especially internet. Therefore, I would like to introduce you to the top 10 best types of routers review for your consideration.
The NETGEAR Nighthawk AC1750 Smart Dual Band WiFi Router (R6700) not only provides the benefit of wireless connectivity, but also monitors and controls the network. Set up is easy. You need no prior experience to handle this one. Expect full 5 GHz coverage in your home with this router in use. You need not to adjust with the dead ends. It could even provide connectivity at the surrounding areas of your house.
The Linksys AC1900 Dual Band Wireless Router is undoubtedly speedy. It is a multi-user Wireless router offering the benefit of Multiple-Input and Multiple-Output. Plus, it boasts amazing port selection and a number of management options. However, you find it a little pricy, but the value is worth it. The Linksys EA7500 Max-Stream AC1900 MU-MIMO Gigabit Router offers high-speed dual-band benefit. You can enjoy your favourite game online without any interruption, with multiple contents streaming on other connected devices simultaneously.
This model is sure to amaze you with its connectivity speed. The Nighthawk X4S AC2600 Smart Wi-Fi Router supports MIMO. This feature boosts the internet speed for Wi-Fi clients that are supported in a crowded home. You are not going to face any hassles with heaving uploading and downloading on having this device. To its downside, this Wi-Fi model shares bloated Web interface like its predecessors. So this may be an ideal pick for the ones who are used to connecting external hard drives to their routers. It will affect the network storage performance. Nevertheless, it can efficiently handle a dozen of devices at once. It leaves no dead ends at a large home covering 4,000 square feet area.
The TP-Link Archer C1200 is packed with a number of smart features that make it one of a kind. It comes with all the basic features that one looks for a simple and reliable router. Operational from a smartphone app this internet-connecting device comes with a modern hardware that boosts its connectivity power. However, it's a dust magnet and fingerprint router, but that doesn't make it worthless. The speed it generates on 5GHz wireless network is remarkable. Moreover, it can be fixed on walls. This one lets you save space yeah!
With 253Mbps upload speed and 152Mbps download speed the Linksys Max-Stream AC2200 is yet another perfect Wireless router. You can expect an extremely high performance from this system. It's worth it for futuristic homes as it includes future-proofed specifications. It benefits the users with seamless connectivity on a number of wireless devices at the same time. You can easily connect almost 15+ (could be 2 PC's, 5 smartphones, 2 tablets, 2 laptops) devices at once.
This smart Wi-Fi router offers steady and impressive range for running multiple devices at the same time. It comes with 1GHz dual core processor, which makes it an optimal choice for mobile devices, streaming music/videos, and gaming. The NETGEAR Nighthawk AC1900 boasts dual band- 2.4GHz offers 600 Mbps speed, 5GHz gives 1300 Mbps speed. It is equipped with five Gigabit Ethernet ports facilitating the users to hardwire Blu-Ray players or gaming console. You can reap the benefit of uninterrupted gaming, browsing or streaming with the Nighthawk in use. The adjustable external antennas added to this router boost the signals to a greater extent.
This Linksys Wi-Fi Tri-Band Router can easily connect over 20 devices. Arlo Cameras, iPads, Rokus, laptops, Xbox, 2 4K HDTV's- you can run all these and much more with this device. It even facilities the users with speedy transfers (of around 900 Mbps) on wired clients This Wi-Fi router gives great speed all over a house constructed within 3000 sq. ft. area. You can even stream music at your neighbours using this system. That's pretty cool yeah!
With the capacity to hit an 802.11ac rating this TP-Link Smart Wi-Fi Router has upped the performance game. It gives a great value for money by doing 802.11ac at bandwidth rated up to 1300Mbps, and 802.11n at 600Mbps. Plus, it comes with has three removable external antennas that offer great support as expected. The MAC address filtering feature, Guest Zone support and beamforming technology make it even more reliable device.
This user-friendly alternative to home wireless coverage is the next best "crop" in the line. With high-end satellite and router, this Orbi system offers enhanced management and LAN connectivity options to the users. It's smart, fast and offers high speed internet connectivity to all the corners of the house (some Wi-Fi routers lack this feature). It can provide strong wireless connection The Tri-band delivers optimum speed irrespective of the number of devices connected to it.
This cheap pricing Wifi system is totally worth its price. You just need 15 minutes to set up its units. It offers top-sustained speed that ranges over 470 megabits per sec. It's a perfect buy for the ones looking for an elegant and simple Wi-Fi system that uses user-centric app. The Bluetooth smart ready feature adds another star to its capabilities. The added advantage of wired backhaul enhances the overall worth of this Google network connecting system.
So, find your favorite one? I hope you do!


Please send me emails about new KidScore features, articles, and special events.
Only your first name and last initial will be visible to other users. We never share full names or e-mail addresses with anyone.
Don't have a KidScore account? Click to join for free!


text:
Detlef Blöcher (born 15 January 1953 in Frankfurt am Main) has been Director of the Christian Relief and Missionary Work DMG interpersonal in Sinsheim near Heidelberg from 2000 to May 2018. In the years before he worked as a lecturer in the Arab world and as human resources manager for the DMG. He is the author of several international studies and numerous specialist articles.

Biography
The promoted physicist worked in medical research and teaching in Germany, later in his specialty in cancer research and as a lecturer in the Middle East. In 1991 he became human resources manager at DMG. In 2000, he took over the management of Manfred A. Bluthardt.

Since 1996 Detlef Blöcher is also an associate of the World Evangelical Alliance (WEA), on whose behalf he has directed several missiological research projects. In this context specialized articles about the studies REMAP I and REMAP II, dealing with the methods, effectiveness and limitations of modern Christian mission work, have been published. In addition Blöcher is an expert on Christian missions and development aid and has published numerous specialist articles in Christian journals such as the magazine Entscheidung and idea spectrum.

Since 2004 Blöcher has also been active as chairman of the "Arbeitsgemeinschaft Evangelikaler Missionen" (AEM, Arbeitsgemeinschaft Evangelical Missions).

Publications

References

1953 births
20th-century German physicists
Living people
Scientists from Frankfurt

redpajama_set_name: RedPajamaWikipedia


text:
ArtistsProjectsExhibitionsNewsPrivateAdvisoryContact
Kim Rugg
Don't Mention The War
Selected WorksThumbnailsBack
Envelope pieces. Please see artist's page for individual works.
Don't Mention The War, 2003
newsprint (The Guardian) 26 pieces
25 x 16.25 inches (63.5 x 41.3 cm) each (framed)
I Still Haven't Decided What To Do Next, 2007
reconfigured comic book
The Eagle Has Landed, 2007
newsprint (The Washington Post)
Attack on Iraq, 2003
newsprint (The Daily Mail)
Not Enough Detail, 2007
Encoded, 2007
newsprint (The Times)
Disappearance, 2007
newsprint (The Financial Times)
A Very Unscientific Survey, 2007
newsprint (The Santa Monica Mirror)
Kennedy Will Face Charges, 2007
newsprint (The Sun)
Snakes and Ladders, 2007
Mark Moore Gallery is pleased to present new works by emerging artist Kim Rugg. Rugg's work involves reducing and dismantling an object to its most elemental parts and then reconstructing it to reveal new meanings, to obliterate original ones, to change or destroy its function and to prompt the viewer to consider the familiar from an entirely new perspective. Often this method of deconstruction and reconstruction becomes politically charged. Her newspaper works – through her removal of the message – allow the viewer to consider the vehicle for the message, to contemplate the unquestioned ephemera of the day to day. Rugg exposes the hidden meaning within each structural component, and shows how the information we process is "informed" before we even begin to think. By demonstrating the ease at which information can be rearranged and altered, Rugg calls into question what is commonly assumed to be neutral documentation. Somewhat paradoxically, Rugg's stamp and envelope pieces - whilst visually being very different - retain their original function; they are sent through the mail unperturbed. Consequently, these works are far more subversive as, to a degree, they actively undermine established, regulated systems. Rugg's work inspires the viewer to not only reconsider, but perhaps to even challenge, what is so casually understood as the accepted and unchangeable.
I like to think that Rugg is changing the world, if only in her imagination, alchemically blasting the news out of existence by snipping it up into a million little pieces.
Kim Rugg graduated with a BA in painting from the City and Guilds of London Art School in 2002. In 2004 she received her MFA from the Royal College of Art, London, where she was awarded the Thames and Hudson prize. Recently, she has predominantly exhibited in London, as well as participating in numerous art fairs across the United States, including Pulse New York, Art Chicago and Pulse Miami. This will be Rugg's inaugural solo show at the Mark Moore Gallery as well as being her first in the United States.
For more information regarding this artist or the opening event, please contact the gallery at 310.453.3031, info@markmooregallery, or www.markmooregallery.com
Around The Galleries
6507 Sycamore Glen Drive
Orange CA 92869
info@markmoorefineart.com
by appointment daily

redpajama_set_name: RedPajamaCommonCrawl


text:
Study Explores Reasons Behind Alcohol Abuse in Non-Heterosexual Women
Non-heterosexual women who feel a disconnect between who they are attracted to and how they identify themselves may have a higher risk of alcohol abuse, according to a new study led by Amelia E. Talley, an assistant professor in Texas Tech University's Department of Psychological Sciences.
Study Suggests Earning a College Degree Before, But Not After, Getting Married Protects Against Obesity
People who earn a college degree before getting married are much less likely to become obese than those who graduate from college after getting married, according to a new study.
Consumers Increasingly Face Companies' Creative Smoke and Mirrors, Study Finds
Heavily marketed as a safer, healthful alternative to smoking, electronic cigarettes are under fire from California health officials who have declared "vaping" a public health threat, hoping to head off the type of deceptive manipulation that tobacco companies succeeded with for decades, according to researchers.
Pressure to 'Publish or Perish' May Discourage Innovative Research, Study Suggests
The traditional pressure in academia for faculty to "publish or perish" advances knowledge in established areas. But it also might discourage scientists from asking the innovative questions that are most likely to lead to the biggest breakthroughs, according to a new study spearheaded by a UCLA professor.
The Challenge of Diverse Public Schools
Decades of successful integration efforts are at stake when one school district fights over school proximity and school "balancing."
The Superstrong Black Mother
When a Baltimore mom hit her son to keep him away from protests, many applauded her—but the myth of the superstrong Black mother does more harm than good.
Pride and Prejudice and Professionalism
LGBT educators struggle to balance professionalism and pride in the classroom, splittling, knitting, or quittting, in the words of the authors.
Is the Grass Greener on the Other Side of the Pacific?
China and the U.S. look to each other's educational systems as they try to balance individualism and collectivism, ability and effort, and grade school and college rigor.
"Both Sides of the Story": History Education in Post-Apartheid South Africa
Scholars have documented the emergence of apparently race-neutral discourses that serve to entrench racial stratification following the elimination of de jure segregation. These discourses deny the existence of both present-day racism and the contemporary effects of histories of racial oppression. Researchers posit that individuals are socialized into these views, but little empirical attention has been paid to the processes through which such socialization occurs.
(-) Remove Biosociology filter Biosociology


text:
MyHHR News Locations
Associate Recruiting Working At HHR Available Positions
About Us Diversity Pro Bono
NHTSA Issues Guidance on Connected Cars
Client Advisories
Saved To MyHHR
View MyHHR
On Monday, October 23, 2016, the National Highway Traffic Safety Administration ("NHTSA") issued "Cybersecurity Best Practices for Modern Vehicles," a proposed guidance for car manufacturers and suppliers of vehicle systems. The proposed guidance addresses cybersecurity concerns with connected cars and other vehicles with a focus on ensuring that vehicle systems are designed to "take appropriate and safe actions, even when an attack is successful." NHTSA is soliciting public comments on the proposed guidance for 30 days. Following that window, the proposed guidance will take effect, although it will only be voluntary and non-binding on the automotive industry.
The proposed guidance may be found on NHTSA's website: www.nhtsa.gov. We summarize the agency's main recommendations below.
General Cybersecurity Guidance
1. Follow the NIST Standards
NHTSA recommends that the automotive industry follow the National Institute of Standards and Technology's documented Cybersecurity Framework, which is structured around five principal functions: "Identify, Protect, Detect, Respond, and Recover." According to NHTSA, the industry's approach to cybersecurity protections for vehicles should:
be built upon risk-based prioritized identification and protection of safety-critical vehicle control systems and personally identifiable information;
provide for timely detection and rapid response to potential vehicle cybersecurity incidents in the field;
design-in methods and measures to facilitate rapid recovery from incidents when they occur; and
institutionalize methods for accelerated adoption of lessons learned across the industry through effective information sharing, such as through participation in the Automotive Information Sharing and Analysis Center ("Auto ISAC").
2. Adopt Information Technology Security Controls
The proposed guidance recommends that the automotive industry review and consider existing industry standards, such as the ISO 27000 series standards, and other best practices, such as the Center for Internet Security's Critical Security Controls for Effective Cyber Defense ("CIS CSC"). The CIS CSC are based on attack data pulled from various sources. While the controls do not specifically address automotive networks or devices, they may be adopted for the automotive industry. NHTSA suggests that the automotive industry consider the following CIS CSC recommendations:
performing cybersecurity gap assessments,
developing implementation roadmaps,
effectively and systematically executing cybersecurity plans,
integrating controls into vehicle systems and business operations, and
reporting and monitoring progress through iterative cycles.
Automotive Industry Cybersecurity Guidance
1. Focus on Cybersecurity in the Vehicle Development Process
The proposed guidance calls on the automotive industry to engineer systems with the goal of making them safe from potential cybersecurity threats and vulnerabilities. Companies are urged to make cybersecurity a priority and to evaluate privacy and cybersecurity risks throughout the entire life cycle of a vehicle: conception, design, manufacture, sale, use, maintenance, resale and decommissioning. The safety of vehicle occupants and other road users should be the primary consideration in assessing cybersecurity risks.
The proposed guidance also encourages the automotive industry to establish rapid detection and remediation capabilities. If a cyber attack is detected, the safety risk to vehicle occupants and surrounding road users should be mitigated and the vehicle should be transitioned to a reasonable risk state.
2. Top-Down Emphasis on Product Cybersecurity
NHTSA recommends that companies prioritize vehicle cybersecurity and demonstrate management commitment to doing so by:
allocating dedicated resources within the organization focused on researching, investigating, implementing, testing, and validating product cybersecurity measures and vulnerabilities;
facilitating seamless and direct communication channels through organizational ranks related to product cybersecurity matters; and
enabling an independent voice for vehicle cybersecurity related considerations within the vehicle safety design process.
NHTSA suggests that companies (i) appoint a high-level corporate officer to be exclusively and directly responsible for product cybersecurity and (ii) provide this executive with appropriate staff, authority and resources.
3. Greater Information Sharing
The proposed guidance stresses information sharing among industry members. It notes that the automotive industry has established the Auto ISAC, which became fully operational on January 19, 2016. While a large number of motor vehicle and equipment manufacturers are involved in the Auto ISAC, NHTSA encourages all members of the vehicle manufacturing industry to participate in it.
4. Implement a Vulnerability Reporting Policy
NHTSA suggests that automotive manufacturers enhance information sharing by implementing cybersecurity vulnerability reporting and disclosure policies. NHTSA envisions that automotive industry members will create their own policies or adopt policies used in other industries. Automotive industry members should make information on vulnerabilities available to cybersecurity researchers so that the information may be shared with other organizations that manufacture or design vehicle systems.
5. Implement an Incident Response Process
The proposed guidance calls on members of the automotive industry to implement a documented process for responding to incidents, vulnerabilities and exploits. This process would cover impact assessment, containment, recovery and remediation actions, as well as associated testing.
NHTSA recommends that industry members report incidents to the Auto ISAC as soon as possible and to the United States Computer Emergency Readiness Team ("US-CERT") in accordance with the US-CERT Federal Incident Notification Guidelines. Industry members may also report incidents to the industrial control systems CERT.
NHTSA further proposes that the automotive industry define metrics to periodically assess the effectiveness of their response processes and document details of each identified and reported vulnerability, exploit or incident. Industry members should periodically run response capability exercises to test the effectiveness of their disclosure policy and internal response processes.
6. Engage In Self-Auditing
In addition to implementing a cybersecurity process based on a sound systems-engineering approach, NHTSA recommends that automotive industry members document the details related to the cybersecurity process to allow for both auditing and accountability. This documentation may include risk assessments, penetration test results and organizational decisions. These documents should be retained throughout the expected life span of the associated product.
Risk assessments should consider vulnerabilities and potential impacts throughout the supply chain. At a minimum, organizations should (i) assess cybersecurity risks to safety-critical vehicle control functions and personally identifiable information and (ii) design assessments to cover internal vehicle networks, external wireless networks, and any interface that an electronic control unit presents to the world. To guide their risk assessments, industry members should ask the following questions:
What are the functions?
What are the implications if they were compromised?
What are the potential safety hazards that could be exposed by these vulnerabilities?
What is the safety risk to society and the value risk to the organization?
What can be done to minimize exposure to the potential loss or damage?
What design decisions could be made with respect to the risk assessment process?
Who/what are the threats and vulnerabilities?
Penetration Testing and Documentation
NHTSA also recommends penetration tests. These tests should be done by qualified testers who have not been part of the development team and are highly incentivized to identify vulnerabilities. With respect to such testing, organizations should maintain written reports that document the disposition of any cybersecurity vulnerabilities.
If a vulnerability is fixed, the details of the fix should to be documented. If a vulnerability is not addressed, the reasoning behind the acceptability of the underlying risk should also be documented.
The automotive industry should establish procedures for internal review and documentation of cybersecurity-related activities. One suggested approach is for members of the automotive industry to produce annual reports on their cybersecurity practices. Among other things, the annual reports could discuss the current state of implemented cybersecurity controls, findings from self-auditing activities, and records maintenance.
7. Fundamental Vehicle Cybersecurity Protections
NHTSA recommends:
limiting developer/debugging access in production devices and electronic control units;
protecting and securing keys and passwords;
limiting access to vehicle maintenance diagnostics;
controlling access to firmware;
limiting the ability to modify firmware;
limiting network ports, protocols and services to essential functionality only;
using segmentation and isolation techniques in vehicle architecture design;
controlling internal vehicle communications and safety messages;
logging cybersecurity events to detect trends in cyber-attacks;
using encryption to protect communications between the vehicle and external servers; and
controlling connections to cellular wireless networks.
Additional Recommendations
NHTSA believes that an educated workforce is crucial to improving the cybersecurity posture of motor vehicles. It encourages industry members not to limit cybersecurity educational activities to the current workforce or to technical individuals, but to support activities that will enrich the future workforce and non-technical individuals. NHTSA suggests that manufacturers, suppliers, and other stakeholders work together with NHTSA to help support these educational efforts.
Aftermarket Devices and Serviceability
The proposed guidance also addresses third parties, such as aftermarket device manufacturers and third-party service providers. Consumers may bring aftermarket devices (e.g., insurance dongles) and personal equipment (e.g., cell phones) into cars and connect them with vehicle systems through manufacturer-provided interfaces (Bluetooth, USB, OBD-II port, etc.). Both the automotive industry and the aftermarket device manufacturers therefore need to consider the risks presented by these devices and provide reasonable protections.
NHTSA also recommends that the automotive industry consider the serviceability of vehicle components and systems by individuals and third parties. It encourages the automotive industry to provide strong vehicle cybersecurity protections that do not unduly restrict access by authorized third-party repair services.
Seth D. Rothman
Tyler Grove
Related Areas of Focus
Data Privacy & Cybersecurity
Hughes Hubbard & Reed LLP
Privacy Policy & Notice Cookie Policy Legal Notices & Methodologies Attorney Advertising Lehman Contact
Rio de Janeiro*
*In cooperation with Saud Advogados
Hughes Hubbard Promotes Two to Partnership and Two to Counsel View News Article
Firm Assists CBS in $30B Merger With Viacom View News Article
Associate Recruiting Working At HHR


text:
Find A Park > Joyce Kilmer Park > Monuments > Louis J. Heintz Memorial
Joyce Kilmer Park
Back to Monuments List
View all monuments in NYC Parks, as well as temporary public art installations on our NYC Public Art Map and Guide.
Louis J. Heintz Memorial
This text is part of Parks' Historical Signs Project and can be found postedwithin the park.
This monument in Joyce Kilmer Park honors Louis J. Heintz (1861-1893), early Bronx civic leader, and the first Street Commissioner for the district of the Bronx. French sculptor Pierre Feitu (b.1868) created the bronze figure of Heintz. The monument was dedicated in 1909 at the Grand Concourse, which Heintz advocated in behalf of as Street Commissioner.
Heintz was born in Manhattan in 1861 and began his career with the John Eichler Brewing Company, which was owned by his uncle; Heintz served as president of the Brewers' Board of Trade of New York. After a section of the Bronx known as the 23rd and 24th Wards was annexed by New York City in the 19th century, Heintz became involved with the campaign by Bronx residents to create a separate board of improvements for the district. Heintz contributed to the campaign out of his own pocket, and became well regarded in the community in the process.
After the successful campaign he became the Bronx's first Street Commissioner, essentially the position for which he had been lobbying, and worked on initial plans for the Grand Concourse. A rising political star, Heintz contracted a cold during Presidential inauguration ceremonies for one-time New York Governor Grover Cleveland (1837–1908) and died soon thereafter.
The monument once included a draped female figure called "Fame" that was depicted inscribing the words on the granite pedestal; it was vandalized and removed to storage. The monument was conserved in 2000.
Click map for directions
Louis J. Heintz Memorial Details
Sculptor: Pierre Feitu
Architect: William Welles Bosworth
Description: Standing figure with integral plinth on a pedestal on a three-step base; a female figure stands at the front of the pedestal in the act of writing an inscription on it
Materials: Figures--bronze; Pedestal and steps--Somesound granite
Dimensions: Total H: 19'6" W: 9' D" 9'
Cast: 1905
Dedicated: 1909
Inscription: 1) Signed on integral plinth, proper left: PIERRE FEITU NY 1909 /
2) Founder's mark on integral plinth, proper right: AUBRY BRO'S FOUNDERS N.Y. /
3) Front of pedestal: LOUIS J. HEINTZ
4) Front of pedestal, words being written by Fame: TO COMMEMORATE / THE FOUNDING OF / THE PROGRESS AND / PROSPERITY OF THE / BRONX /
5) Plaque at pedestal rear: JOHN J. RONNER / JOHN H. KNOPPEL / WILLIAM G. MC CREA / LOUIS A. RISSE / LOUIS F. FAFFEN / ADOLPH C. HUPFEL / MATHEW P. BREEN / HENRY C. SCHRADER / ARTHUR C. BUTTS / 1905 /
Please note, the NAME field includes a primary designation as well as alternate namingsoften in common or popular usage. The DEDICATED field refers to the most recent dedication, most often, butnot necessarily the original dedication date. If the monument did not have a formal dedication, the yearlisted reflects the date of installation.
For more information, please contact Art & Antiquities at (212) 360-8163
Directions to Joyce Kilmer Park
NYC PARKS JOINS UNIQLO FOR NEW PUBLIC ART CELEBRATION
NYC PARKS JOINS GLOBAL APPAREL RETAILER UNIQLO FOR NEW PUBLIC ART CELEBRATION
NYC PARKS ANNOUNCES SLATE OF SPRING AND SUMMER PUBLIC ART EXHIBITIONS AROUND THE CITY
Wi-Fi Hot Spots
Heinrich Heine Fountain
Louis J. Heintz Monument
More About Joyce Kilmer Park
Council Member: Diana Ayala
Park ID: X028
Property Type: Community Park


text:
LoadingFlower
=============

Overview
--------
LoadingFlower is a small program for creating a loading indicator image.

System Requirements
-------------------
- [Processing](http://processing.org/)
- [ImageMagick](http://www.imagemagick.org/script/index.php)

Creating loading.gif
--------------------
1. Start Processing.app and open `main/main.pde`.
2. Run it.
3. Open your console, and execute `png2gif.sh`.
4. Done!

If you want to customize an appearance, edit `config.json`.

License
-------
MIT License. See `LICENSE.txt` for more information.


The CF Group was incorporated in 2000 as a North American Manufacturing and Distribution company.
The CF Group has proudly placed our trusted name in air filtration on the new series of filters. The Can-Lite has been developed with ease of installation, durability and effectiveness in mind. The Can-Lite is manufactured the same way as the Original Can-Filter (proven packed bed design). The difference is in the carbon; special low density carbon is used in the Can-Lite. The Can-Lite is available in the 1400 model.


دوره آموزش Autodesk Inventor 2015 از موسسه Infinite Skills را به درخواست دوستان در سایت قرار دادیم.
In this Autodesk Inventor 2015 training course, expert author Adam Cooper teaches you the fundamental tools and techniques needed to create your own 3D digital prototypes and modeling projects. This course is designed for the absolute beginner, meaning no prior experience with Inventor is required.
You will start with a tour of the Inventor 2015 user interface, and then jump into learning about basic sketching. Adam will teach you how to sketch basic features, such as creating an extrusion, secondary features, and work features. This video tutorial will teach you how to sketch advanced features, use parameters and equations, and work with duplication tools. You will then move into the assembly environment, learning how to build an assembly from the parts you created, interact with the assembly, and create a presentation view of the assembly. Finally, you will cover basic view creation and dimensioning methods.
Once you have completed this computer based training course, you will have a comprehensive understanding of how to use the tools in Inventor 2015 to create your own modeling projects. Working files are included, allowing you to follow along with the author throughout the lessons.


Nine & Dine's are back!!!
Nine & Dines are back !
Come join us on Sunday afternoons for these fun events and great meals!
This non-competitive, enjoyable golf event is a great opportunity to bring a partner out to enjoy the golf course and partake in a special meal.
Come out, meet new people and enjoy a beautiful Steelwood afternoon!


No, it isn't a dream. This variety really does combine the form of a hybrid tea with the free-flowering habit of a floribunda and the hardiness and vigor of a shrub - all in one bush! And the blooms are worth repeating: borne in small clusters, they are large and perfectly cupped with medium pink petals and a scrumptious raspberry fragrance. Very disease resistant.


text:
Q: Sort array of string based on @number in the string content I want to
var myArray = [
    "some text here, @8 00001#p0030",
    "some text here, @6 00001#p0030",
    "some text here, @4 00001#p0030",
    "some text here, @3 00001#p0030",
    "some text here, @1 00001#p0030",
    "some text here, @2 00001#p0030",
    "some text here, @1 00001#p0030",
    "some text here, @1 00001#p0030",
    "some text here, @8 00001#p0030",
    "some text here, @9 00001#p0030"
];

into something like this
var myArray = [
    "some text here, @1 00001#p0030",
    "some text here, @1 00001#p0030",
    "some text here, @1 00001#p0030",
    "some text here, @2 00001#p0030",
    "some text here, @3 00001#p0030",
    "some text here, @4 00001#p0030",
    "some text here, @6 00001#p0030",
    "some text here, @8 00001#p0030",
    "some text here, @8 00001#p0030",
    "some text here, @9 00001#p0030"
];

Is there a way to possible sort it based on @number present inside the string?

A: U can try this

var myArray = [
"some text here, @8 00001#p0030",
"some text here, @6 00001#p0030",
"some text here, @4 00001#p0030",
"some text here, @3 00001#p0030",
"some text here, @1 00001#p0030",
"some text here, @105 00001#p0030",
"some text here, @2 00001#p0030",
"some text here, @11 00001#p0030",
"some text here, @1 00001#p0030",
"some text here, @1 00001#p0030",
"some text here, @8 00001#p0030",
"some text here, @9 00001#p0030"
];

var sorted = myArray.sort(function(a, b) {
    var sbr1=a.substr(a.indexOf("@")+1);
    var num1=parseInt(sbr1.substr(0,sbr1.indexOf(" ")));
    var sbr2=b.substr(b.indexOf("@")+1);
    var num2=parseInt(sbr2.substr(0,sbr2.indexOf(" ")));

    if (num1 > num2)
        return 1;
    else if (num1 < num2)
        return -1;

    return 0;
});
console.log(sorted);


Since 2009, Hangsen has been the forerunner of the global e-cigarette industry.
USP Grade Raw Materials Made in the U.S.
With the expansion of our business in the UK, we have established our UK office in Manchester.
This year saw the opening of our Europe Center which increased our monthly production capacity to 6,000,000+ bottles. The Europe Center is our strategic asset for the EU market.
Our North America Center is established this year in an effort to strengthen our presence in the highly mature local e-cigarette market. Up to this point, the establishment of current our global operation is complete.
We celebrated a phenomenal milestone of our developpement. We had sold 100,000,000 bottles of e-liquids worldwide, making us the world's No.1 e-liquid brand by volume.
The year 2017 is a brand new start for us. We have undertaken the complete rebranding of Hangsen and have restructured our product portfolio. The arrival of the new Hangsen is destined to make the e-cigarette industry more vibrant and exciting.


Call Finishing Touch Landscape Construction, a top choice for landscape maintenance in Rockaway NJ that gives your property a complete makeover, transforming it into a practical and lovely area. Based in Boonton NJ, we're capable of handling a large selection of landscaping services for customers in the Northern NJ area. Under the direction of our owner, we have developed our unsurpassed reputation as not only as a landscape architecture company, but also as a top tumbled hardscapes contractor, landscape lighting company, and pavers contractor. Our proficient stoneworkers are fully trained in Old World stone tooling techniques, so each work is entirely well-designed and unique, which gives that particular classic vibe that would not be achieved any other way. Finishing Touch Landscape Construction is a landscaper in Rockaway NJ that uses the highest quality materials to enhance your home and business's landscape.
Finishing Touch Landscape Construction has been a respected choice for a landscaper in Rockaway NJ for hardscapes for more than 30 years, offering a large selection of choices for the composition and style of retaining walls, walkways, and patios. For example, when you select us as your manufactured decorative walls contractor, you can to have a boulder wall, a brick wall, or an Old World fashion natural stonewall installed. Although creating visually pleasing hardscape projects is our goal, we don't ever neglect their functionality and consistently ensure that your water drainage management design and earth stabilization strategy are working optimally. As a full service landscaper in Rockaway NJ as well, our highly trained staff at Finishing Touch Landscape Construction can choose the perfect shrubbery to complement your beautiful new hardscape designs.
Cutting edge energy saving lighting has grown commonplace for houses and businesses. As a modern independent landscape lighting company in Rockaway NJ, we provide an extensive variety of energy saving light fixture options. Make a safer and more appealing environment by better illuminating your home and property with a landscape light plan developed by our expert lighting designers. When the time comes to illuminate your property, Finishing Touch Landscape Construction is among the best choices for a landscape contractor in Rockaway NJ skilled in outdoor lighting design.
In addition the our other services we provide in terms of landscaping in Rockaway NJ, our expertise as a patios and walkways contractor is another benefit of working with Finishing Touch Landscape Construction. Our brilliant design team is going to work with our clients to transform their outdoor living areas into somewhere that is great for productivity and relaxation with well-installed pathways. By providing both modern and traditional landscape designs we're in a position to give you the landscape you have always wanted. We'll travel to your property to offer a complimentary consultation along with a quote for your landscape design. Book an appointment for a landscape maintenance contractor in Rockaway NJ for patios and walkways with a free consultation today by contacting Finishing Touch Landscape Construction.


text:
Sorority hosts community reception to honor TPD Major Audrey Smith
The Alpha Kappa Alpha Sorority, Delta Kappa Omega Chapter, honored one of their own during a community reception on Saturday, September 27.
Sorority hosts community reception to honor TPD Major Audrey Smith The Alpha Kappa Alpha Sorority, Delta Kappa Omega Chapter, honored one of their own during a community reception on Saturday, September 27. Check out this story on tallahassee.com: http://on.tdo.com/1wlwNz7
TLH Published 10:20 p.m. ET Oct. 22, 2014
The Alpha Kappa Alpha Sorority, Delta Kappa Omega Chapter, honored one of their own during a community reception on Saturday, September 27. Major Audrey Smith is the first African-American female to achieve the rank of Major in the history of the Tallahassee Police Department.
The event was the brainchild of fellow TPD employee and sorority member, Connie E. Jenkins-Pye. Jenkins-Pye said that she wanted the community to know that "Audrey is a humble public servant, that she always gives, and that Audrey believes 'to whom much is given, much is required'."
"We are so very proud of Audrey," said Kym Grady Holcomb, President, Delta Kappa Omega Chapter. "She is an effective leader wherever she serves. We are a better organization and a better community because of her wonderful contributions."
During the reception Major Smith had an opportunity to thank those individuals who she felt gave her the support she needed to succeed. Reflections offered by Major Smith's daughter and sister shared heartfelt expressions about their loved one.
Tallahassee Chief of Police Michael DeLeo also gave remarks during the reception. " I think I made it very clear that one of the reasons she got promoted was because she sees the bigger picture of not only what she brings to the department in the way she treats people—she's respectful, compassionate, and so much class—but also because she's so active in the community, that's so important."
"I am overjoyed, I'm excited, a little overwhelmed, but of course pleased that the people that I care about the most have shown me how much they care about me and what I mean to them, to our community and to our agency, the Tallahassee police department," said Major Smith.
When asked what motivates her from day to day, Major Smith said it's always been her dream to be a leader in the Tallahassee Police Department—an agency she has served for over 25 years.
Major Smith says she's dedicated and determined to be of service. "I am gratified just knowing that there are people out there who benefit from what I do, not only as an officer but as a human being. I enjoy what I do and I take my experiences whether they're personal or professional to try to help somebody else be better in life."
Read or Share this story: http://on.tdo.com/1wlwNz7
It's time to nominate 25 Women for 2020
Adults can follow green trail blazed by Greta
Dip into homegrown flavor with Local Delights
Deer vs. gardener: Who will win?
Church honors black pioneers in law, medicine
Bowled over: Spoon up comfort with lasagna soup


text:
Lorrie Moore (born Marie Lorena Moore; January 13, 1957) is an American writer, critic, and essayist. She is best known for her short stories, some of which have won major awards. Since 1984, she has also taught creative writing.

Biography

Marie Lorena Moore was born in Glens Falls, New York, and nicknamed "Lorrie" by her parents. She attended St. Lawrence University. At 19, she won Seventeen magazine's fiction contest. The story, "Raspberries," was published in January 1977. After graduating from St. Lawrence, she moved to Manhattan and worked as a paralegal for two years.

In 1980, Moore enrolled in Cornell University's M.F.A. program, where she was taught by Alison Lurie. Upon graduation from Cornell, Moore was encouraged by a teacher to contact literary agent Melanie Jackson, who agreed to take her as a client. In 1983, Jackson sold Moore's collection Self-Help, almost entirely stories from her master's thesis, to Knopf.

Works

Short stories
Her short story collections are Self-Help (1985), Like Life, the New York Times bestseller Birds of America, and Bark. She has contributed to The Paris Review. Her first story to appear in The New Yorker, "You're Ugly, Too," was later included in The Best American Short Stories of the Century, edited by John Updike.  Another story, "People Like That Are the Only People Here," also published in The New Yorker, was reprinted in the 1998 edition of the annual collection The Best American Short Stories; the tale of a young child falling sick, the piece was loosely patterned on events in Moore's own life. The story was also included in the 2005 anthology Children Playing Before a Statue of Hercules, edited by David Sedaris.

Moore's Collected Stories was published by Faber in the UK in May 2008. It included all the stories in each of her previously published collections, excerpts from her novel Anagrams, and three previously uncollected stories first published in The New Yorker.

Moore's latest collection, Bark, was published in 2014. It became a finalist of the The Story Prize and was short-listed by Frank O'Connor International Short Story Award.

Novels
Moore's novels are Anagrams (1986), Who Will Run the Frog Hospital? (1994), and A Gate at the Stairs (2009). Anagrams with its experimental form received rather cold critical response. Who Will Run the Frog Hospital is the story of a woman vacationing with her husband who recalls an intense friendship from her adolescence. A Gate at the Stairs takes place just after the September 11 attack and is about a 20-year-old Midwestern woman's coming of age.

Children's books
Moore has written a children's book entitled The Forgotten Helper, about an elf whom Santa Claus mistakenly leaves behind at the home of the worst child on his "good" list.  The elf must help the child be good for the coming year so Santa will return next Christmas.

Essays
Moore writes occasionally about books, films, and television for The New York Review of Books. A collection of her essays, criticism and comment was published by Knopf as See What Can Be Done in April 2018.

Academic career
Moore was the Delmore Schwartz Professor in the Humanities at the University of Wisconsin–Madison, where she taught creative writing for 30 years. She joined the faculty there in 1984 and left to join the faculty at Vanderbilt University in the fall of 2013, where she is now the Gertrude Conaway Vanderbilt Professor of English.

She has also taught at Cornell University, as the Sidney Harman Writer-in-Residence at Baruch College, and at the MFA in Creative Writing program at the University of Michigan, as well as at Princeton and NYU.

Bibliography

Short stories
 1985 – Self-Help;
 1990 – Like Life;
 1998 – Birds of America;
 2008 – The Collected Stories;
 2014 – Bark;
 2020 – Collected Stories;

Novels
 1986 – Anagrams;
 1994 – Who Will Run the Frog Hospital?;
 2009 – A Gate at the Stairs;
 2023 - I Am Homeless If This Is Not My Home;

Children's books
 1987 – The Forgotten Helper;

Non-fiction

2018 – See What Can Be Done;

Awards
Moore won the 1998 O. Henry Award for her short story "People Like That Are the Only People Here," published in The New Yorker on January 27, 1997. In 1999, Moore was named as the winner of The Irish Times International Fiction Prize for Birds of America. In 2004, she was selected as winner of the Rea Award for the Short Story, for outstanding achievement in that genre.

She was elected to the American Academy of Arts and Letters in 2006, and is a fellow of the Wisconsin Academy of Sciences, Arts & Letters. In 2008, she delivered Oxford University's annual Esmond Harmsworth Lecture in American Arts and Letters at the university's Rothermere American Institute. Her 2009 novel, A Gate at the Stairs, was a finalist for the 2010 PEN/Faulkner Award for Fiction and for the Orange Prize for Fiction. Bark was shortlisted for the 2014 Frank O'Connor International Short Story Award and was a finalist for The Story Prize.

References

External links
"About Lorrie Moore: A Profile" Ploughshares (Fall 1998)
Salon interview (1998)

The Believer interview (2005)
Interview with Lorrie Moore, Lewis Burke Frumkes Radio Show (October 2009)
Interview for KCRW's Bookworm (October 22, 2009)
"Words, Wit, & Wild Hearts: A Conversation with Author Lorrie Moore", On Wisconsin (Spring 2010)
Moore's essays for The New York Review of Books
Archive of Moore's writings for The New Yorker

1957 births
20th-century American novelists
21st-century American novelists
American women novelists
American women short story writers
Cornell University alumni
Living people
Members of the American Academy of Arts and Letters
O. Henry Award winners
PEN/Malamud Award winners
People from Glens Falls, New York
University of Wisconsin–Madison faculty
Vanderbilt University faculty
University of Michigan faculty
20th-century American women writers
21st-century American women writers
20th-century American short story writers
21st-century American short story writers
PEN/Faulkner Award for Fiction winners
Novelists from New York (state)
Novelists from Michigan
Novelists from Tennessee
Novelists from Wisconsin
American women academics


text:
Alabama Arizona Arkansas Federal Bureau of Prisons California Colorado Connecticut Florida Georgia Hawaii Idaho Illinois Indiana Iowa Kansas Kentucky Louisiana Maine Maryland Massachusetts Michigan Minnesota Mississippi Missouri Montana Nebraska Nevada New Jersey New Mexico New York North Carolina North Dakota Ohio Oklahoma Oregon Pennsylvania Rhode Island South Carolina South Dakota Tennessee Texas Utah Vermont Virginia Washington Washington D.C. West Virginia Wisconsin Wyoming
Sex Offender Search
County Profiles County & City Jails Courts Juvenile Detention Facilities Parole & Probation Agencies Prison Maps State & Federal Prisons Tribal Jails Substance Abuse Treatment Centers
Nation-Wide Arkansas Arizona Connecticut Florida Idaho Illinois Indiana Kentucky Maine Maryland Michigan Minnesota Missouri Montana Nebraska Nevada New York North Carolina North Dakota Ohio Oklahoma Rhode Island South Carolina Texas
Prison News > Solitary confinement's mockery of human rights
Solitary confinement's mockery of human rights
New York state recently announced reforms to the practice of solitary confinement in its jails and prisons. The changes include a ban on this extreme punishment for adolescents, pregnant women and the developmentally disabled. [read the full story here]
Washington Post, Saturday, April 5, 2014
Tags: Prison Conditions & Corruption, New York
Search Prison News
Prison News by State (US)
Caliornia
nbcmontana.com
Prison News by Province (Canada)
Canada Nationwide
Home | Terms | Contact | Site Map
© insideprison.com. All rights reserved.