The example code is indeed not optimal.
1&3. You are completely right about the wrong indices. Seems to be a plain mistake in the tutorial.
I myself define my triangles for a square in the following order:
2--3
| \ |
0--1
(fency text art of the square)
Then the triangles are 0,1,2 and 3,2,1
OR, use TRIANGLE_STRIP, which results in 4 indices, simple in the order: 0,1,2,3

This should also fix the texturing issue.
e
2. I'm not sure if changing the view port is the right solution here. It may cause the triangle to be drawn right, but other stuff might get broken in the future because of this fix. I myself have never used the viewport command in openGL 3. Can you see what happens if you remove both viewport calls? (why are there 2 viewport calls in there anyway??).
General hint:
The tutorial code binds fixxed numbers to the attributes. Since the compiler has already done this, it is better to retrieve the attribute locations after compiling and store them in variables. The biggest advantage is that you make it impossible for magic numbers to exist, since you are forced to use the variable name.
instead of GL20.glEnableVertexAttribArray(0);, you would get GL20.glEnableVertexAttribArray(vertexLoc); which reads a lot easier.
setting vertexLoc: vertexLoc = glGetAttribLocation(pId, "in_Position");
In this way it is also possible to check if vertexLoc is -1, which may indicate that the attribute has been optimized out of you shader, hence it has no location.