Suspected fragment shader problem, No color, OpenGL 4, GLFW 3, GLEW

I am using OpenGL 4.1, GLFW 3 and GLEW. I am trying to draw a simple triangle with the color purple.

The triangle is drawn, the color is not.

This code is from a tutorial, I had to update the GLFW calls to reflect GLFW 3.x. As far as I can tell, the color shader appears to be correct.

EDIT: Solved a problem where the GLFW window is unresponsive to key presses and mouse clicks. Need to include call to glfwPollEvents() within the drawing loop. Still no color.

#include <GL/glew.h> // include GLEW and new version of GL on Windows
#include <GL/glfw3.h> // GLFW helper library
#include <stdio.h>
#include <string>
#include <iostream>

int main () {
	GLFWwindow* window;

  // start GL context and O/S window using the GLFW helper library
  if(!glfwInit ()){

	  std::cout << "Failed at glfwInit()!" << std::endl;
	  return -1;

  // "hint" that the version 4.2 should be run with no back-compat stuff
  int major = 4;
	int minor = 1;
	glfwWindowHint (GLFW_CONTEXT_VERSION_MAJOR, major);
	glfwWindowHint (GLFW_CONTEXT_VERSION_MINOR, minor);
  // open a window of sixe 640x480 
  window = glfwCreateWindow(640, 480, "Window!!!", NULL, NULL);


	  std::cout << "Failed at window creation!" << std::endl;
	  return -1;


  // start GLEW extension handler
  GLenum err = glewInit ();
  if(GLEW_OK != err){

	  std::cout << "glewInit failed!!!" << std::endl;
	  return -1;

  // get version info
  const GLubyte* renderer = glGetString (GL_RENDERER); // get renderer string
  const GLubyte* version = glGetString (GL_VERSION); // version as a string
  printf("Renderer: %s
", renderer);
  printf("OpenGL version supported %s
", version);

	// tell GL to only draw onto a pixel if the shape is closer to the viewer
  glEnable (GL_DEPTH_TEST); // enable depth-testing
  glDepthFunc (GL_LESS); // depth-testing interprets a smaller value as "closer"

  int i;
  //A triangle's vertices
  float points[] = {

	  0.0f, 0.5f, 0.0f,
	  0.5f, -0.5f, 0.0f,
	  -0.5f, -0.5f, 0.0f

  //Create and setup vertex buffer object
  unsigned int vbo = 0;
  glGenBuffers(1, &vbo);
  glBindBuffer(GL_ARRAY_BUFFER, vbo);
  glBufferData(GL_ARRAY_BUFFER, 9 * sizeof(float), &points[0], GL_STATIC_DRAW);

  //Create and setup vertex array (or attribute?) object to store vbo point data
  unsigned int vao = 0;
  glGenVertexArrays(1, &vao);
  glBindBuffer(GL_ARRAY_BUFFER, vbo);
  glVertexAttribPointer(0,3, GL_FLOAT, GL_FALSE, 0, (GLubyte*)NULL);

  std::string vertex_shader = 
	  "in vec3 vp;"
	  "void main () {"
	  "	gl_Position = vec4(vp, 1.0);"

  std::string fragment_shader = 
	  "out vec4 frag_color;"
	  "void main() {"
	  "	frag_color = vec4 (0.5, 0.0, 0.5, 1.0f);"
  unsigned int vs = glCreateShader(GL_VERTEX_SHADER);
  const char* str = vertex_shader.c_str();
  glShaderSource(vs, 1, &str, NULL);
  unsigned int fs = glCreateShader (GL_FRAGMENT_SHADER);
  const char* strb = fragment_shader.c_str();
  glShaderSource (fs, 1, &strb, NULL);

  unsigned int shader_program = glCreateProgram();
  glAttachShader(shader_program, fs);
  glAttachShader(shader_program, vs);

  bool running = true;
  while (running){

	  glDrawArrays(GL_TRIANGLES, 0, 3);

	  running = !glfwGetKey(window, GLFW_KEY_ESCAPE) && !glfwWindowShouldClose(window);
	  glfwPollEvents(); //Needs to be called or else window is completely unresponsive to move, resize, close, key strokes, etc


  // close GL context and any other GLFW resources
  return 0;

Forgot to include version number and layout statement in shader files/strings! So does this mean the tutorial is wrong or do some shaders compile fine with