text:
Go to Chapter 14 - Caesar Cipher | Go to Chapter 16 - AI Simulation |
In this chapter we will make a game called Reversi. Reversi (also called Othello) is a board game that is played on a grid (so we will use a Cartesian coordinate system with XY coordinates, like we did with Sonar.) It is a game played with two players. Our version of the game will have a computer AI that is more advanced than the AI we made for Tic Tac Toe. In fact, this AI is so good that it will probably beat you almost every time you play. (I know I lose whenever I play against it!)
If you would like to see a video of Reversi being played, there is a demonstration on this book's website. Go to the URL http://inventwithpython.com/videos and find the "Reversi Demo Video" video.
Reversi has an 8 x 8 board with tiles that are black on one side and white on the other (our game will use O's and X's though). The starting board looks like Figure 15-1. Each player takes turn placing down a new tile of their color. Any of the opponent's tiles that are between the new tile and the other tiles of that color is flipped. The goal of the game is to have as many of the tiles with your color as possible. For example, Figure 15-2 is what it looks like if the white player places a new white tile on space 5, 6.
Figure 15-1: The starting Reversi board has two white tiles and two black tiles. | Figure 15-2: White places a new tile. |
The black tile at 5, 5 is in between the new white tile and the existing white tile at 5, 4. That black tile is flipped over and becomes a new white tile, making the board look like Figure 15-3. Black makes a similar move next, placing a black tile on 4, 6 which flips the white tile at 4, 5. This results in a board that looks like Figure 15-4.
Figure 15-3: White's move will flip over one of black's tiles. | Figure 15-4: Black places a new tile, which flips over one of white's tiles. |
Tiles in all directions are flipped as long as they are in between the player's new tile and existing tile. In Figure 15-5, the white player places a tile at 3, 6 and flips black tiles in both directions (marked by the lines.) The result is in Figure 15-6.
Figure 15-5: White's second move at 3, 6 will flip two of black's tiles. | Figure 15-6: The board after white's second move. |
As you can see, each player can quickly grab a majority of the tiles on the board in just one or two moves. Players must always make a move that captures at least one tile. The game ends when a player either cannot make a move, or the board is completely full. The player with the most tiles of their color wins.
The basic strategy of Reversi is to look at which move would turn over the most tiles. But you should also consider taking a move that will not let your opponent recapture many tiles after your move. Placing a tile on the sides or, even better, the corners is good because there is less chance that those tiles will end up between your opponent's tiles. The AI we make for this game will simply look for any corner moves they can take. If there are no corner moves available, then the computer will select the move that claims the most tiles.
You can learn more about Reversi from Wikipedia: http://en.wikipedia.org/wiki/Reversi
Notice that our version of Reversi doesn't use black and white tiles because the text that our program creates will always be the same color. Instead, we will use X's and O's to represent the human and computer players.
As you can see, the AI was pretty good at beating me. To help the player out, we'll program our game to provide hints. If the player types 'hints' as their move, they can toggle the hints mode on and off. When hints mode is on, all the possible moves the player can make will show up on the board as '.' characters, like this:
Reversi is a mammoth program compared to our previous games. It comes in over 300 lines long! (But don't worry, many of these lines are just comments or blank lines to space out the code and make it more readable.) As always, you don't have to type in the program before reading this chapter. And you can also download the program by going to this book's website at the URL, http://inventwithpython.com/chapter15 and following the instructions online.
As with our other programs, we will first create several functions to carry out Reversi-related tasks that the main section of our program will call. Roughly the first 250 lines of code are for these helper functions, and the last 50 lines of code implement the Reversi game itself.
Before we get into the code, we should talk about the board data structure. This data structure is a list of lists, just like the one in our previous Sonar game. The list is created so that board[x][y] will represent the character on space located at position x on the X-axis (going left/right) and position y on the Y-axis (going up/down). This character can either be a ' ' space character (to represent a blank space), a '.' period character (to represent a possible move in hint mode), or an 'X' or 'O' (to represent a player's tile). Whenever you see a parameter named board, that parameter variable is meant to be this list of lists board data structure.
We import the random module for its randint() and choice() functions and the sys module for its exit() function.
The drawBoard() function will print out the current game board based on the data structure in board. Notice that each square of the board looks like this:
Since we are going to print the string with the horizontal line (and plus signs at the intersections) over and over again, we will store that in a constant variable named HLINE. There are also lines above and below the very center of X or O tile that are nothing but '|' characters (called "pipe" characters) with three spaces in between. We will store this string in a constant named VLINE.
Line 11 is the first print() function call executed, and it prints out the labels for the X-axis along the top of the board. Line 12 prints the top horizontal line of the board.
Printing each row of spaces on the board is fairly repetitive, so we can use a loop here. We will loop eight times, once for each row. Line 15 prints the label for the Y-axis on the left side of the board, and has an end=' ' keyword argument at the end of it to print a single space instead of a new line. This is so we can have another loop (which again loops eight times, once for each space) print out each space (along with the 'X', 'O', or ' ' character for that space depending on what is stored in board.)
The print() function call inside the inner loop also has an end=' ' keyword argument at the end of it, meaning a space character is printed instead of a newline character. This produces the second space in the pipe-space-tile-space string that we print out, over and over for eight times. That will produce a single line on the screen that looks like '| X | X | X | X | X | X | X | X ' (that is, if each of the board[x][y] values were 'X'). After the inner loop is done, the print() function call on line 18 prints out the final '|' character along with a newline (since it does not end with an end keyword argument).
(The print()call forces us to always print a newline character or a space at the end of everything we print. If we do not want this last character, then we can always use the sys.stdout.write() function, which has a single string parameter that it prints out. Be sure to import sys first before calling this function.)
The code inside the outer for loop from line 14 to line 20 prints out an entire row of the board like this:
When the for loop on line 13 prints the row eight times, it forms the entire board (of course, some of the spaces on the board will have 'O' or ' ' instead of 'X'):
An important thing to remember is that the coordinates that we print out to the player are from 1 to 8, but the indexes in the board data structure are from 0 to 7.
Here we use a loop inside a loop to set the board data structure to be all single-space strings to make a blank Reversi board. We will call the resetBoard() function whenever we start a new game and want to remove the tiles from a previous game.
When we start a new game of Reversi, it isn't enough to have a completely blank board. At the very beginning, each player has two tiles already laid down in the very center, so we will also have to set those.
We do not have to return the board variable, because board is a reference to a list. Even when we make changes inside the local function's scope, these changes happen to the original list that was passed as an argument. (Remember, this is one way list variables are different from non-list variables.)
The getNewBoard() function creates a new board data structure and returns it. Line 38 creates the outer list and stores a reference to this list in board. Line 40 creates the inner lists using list replication. ([' '] * 8 evaluates to be the same as [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '] but with less typing.) The for loop here runs line 40 eight times to create the eight inner lists. The spaces represent a completely empty game board.
What board ends up being is a list of eight lists, and each of those eight lists themselves has eight strings. The result is sixty four (8 x 8 = 64) strings. Each string is (right now) a single space character.
isValidMove() is one of the more complicated functions. Given a board data structure, the player's tile, and the XY coordinates for player's move, this function should return True if the Reversi game rules allow a move to those coordinates and False if they don't.
The easiest check we can do to disqualify a move is to see if the XY coordinates are on the game board or if the space at XY is not empty. This is what the if statement on line 48 checks for. isOnBoard() is a function we will write that makes sure both the X and Y coordinates are between 0 and 7. We do this on line 48 and 49.
For the purposes of this function, we will go ahead and copy the XY coordinate pointed to by xstart and ystart with the player's tile. We set this place on the board back to a space before we leave this function.
The player's tile (either the human player or the computer player) has been passed to us, but we will need to be able to identify the other player's tile. If the player's tile is 'X' then obviously the other player's tile is 'O', and vice versa.
Finally, if the given XY coordinate ends up as a valid position, we will return a list of all the opponent's tiles that would be flipped by this move.
The for loop iterates through a list of lists which represent directions you can move on the game board. The game board is a Cartesian coordinate system with an X and Y direction. There are eight directions you can move: up, down, left, right, and the four diagonal directions. Each of the eight 2-item lists in the list on line 59 represents one of these directions. We will move around the board in a direction by adding the first value in the two-item list to our X coordinate, and the second value to our Y coordinate.
Because the X coordinates increase as you go to the right, you can "move" to the right by adding 1 to the X coordinate. Moving to the left is the opposite: you would subtract 1 (or add -1) from the X coordinate. We can move up, down, left, and right by adding or subtracting to only one coordinate at a time. But to move diagonally, we need to add or subtract to both coordinates. For example, adding 1 to the X coordinate to move right and adding -1 to the Y coordinate to move up would result in moving to the up-right diagonal direction.
Here is a diagram to make it easier to remember which two-item list represents which direction:
Figure 15-7: Each two-item list represents one of the eight directions.
Line 60 sets an x and y variable to be the same value as xstart and ystart, respectively. We will change x and y to "move" in the direction that xdirection and ydirection dictate. xstart and ystart will stay the same so we can remember which space we originally intended to check. (Remember, we need to set this place back to a space character, so we shouldn't overwrite the values in them.)
We make the first step in the direction as the first part of our algorithm.
Remember, in order for this to be a valid move, the first step in this direction must be 1) on the board and 2) must be occupied by the other player's tile. Otherwise there is no chance to flip over any of the opponent's tiles. In that case, the if statement on line 63 is not True and execution goes back to the for statement for the next direction.
But if the first space does have the other player's tile, then we should keep proceeding in that direction until we reach on of our own tiles. If we move off of the board, then we should continue back to the for statement to try the next direction.
The while loop on line 69 ensures that x and y keep going in the current direction as long as we keep seeing a trail of the other player's tiles. If x and y move off of the board, we break out of the for loop and the flow of execution moves to line 74. What we really want to do is break out of the while loop but continue in the for loop. But if we put a continue statement on line 73, that would only continue to the while loop on line 69.
Instead, we recheck not isOnBoard(x, y) on line 74 and then continue from there, which goes to the next direction in the for statement on line 59. It is important to know that break and continue will only break or continue in the loop they are called from, and not an outer loop that contain the loop they are called from.
If the while loop on line 69 stopped looping because the condition was False, then we have found a space on the board that holds our own tile or a blank space. Line 76 checks if this space on the board holds one of our tiles. If it does, then we have found a valid move. We will then start a new while loop, this time subtracting x and y to move in the opposite direction we were originally going. We note each space between our tiles on the board by appending the space to the tilesToFlip list.
We break out of the while loop once x and y have returned to the original position (which was still stored in xstart and ystart).
We perform this check in all eight directions, and afterwards the tilesToFlip list will contain the XY coordinates all of our opponent's tiles that would be flipped if the player moved on xstart, ystart. Remember, the isValidMove() function is only checking to see if the original move was valid, it does not actually change the data structure of the game board.
If none of the eight directions ended up flipping at least one of the opponent's tiles, then tilesToFlip would be an empty list and this move would not be valid. In that case, isValidMove() should return False. Otherwise, we should return tilesToFlip.
isOnBoard() is a function called from isValidMove(), and is just shorthand for the rather complicated Boolean expression that returns True if both x and y are in between 0 and 7. This function lets us make sure that the coordinates are actually on the game board.
getBoardWithValidMoves() is used to return a game board data structure that has '.' characters for all valid moves on the board. This is used by the hints mode to display to the player a board with all possible moves marked on it.
Notice that this function creates a duplicate game board data structure instead of modifying the one passed to it in the board parameter. Line 100 calls getValidMoves(), which returns a list of XY coordinates with all the legal moves the player could make. The board copy is then marked with a period in those spaces. How getValidMoves() works is described next.
The getValidMoves() function returns a list of two-item lists that hold the XY coordinates for all valid moves for tile's player, given a particular game board data structure in board.
This function uses two loops to check every single XY coordinate (all sixty four of them) by calling isValidMove() on that space and checking if it returns False or a list of possible moves (in which case it is a valid move). Each valid XY coordinate is appended to the list, validMoves.
Remember how you could use the int() and str() functions to get the integer and string value of other data types? For example, str(42) would return the string '42', and int('100') would return the integer 100.
There is a similar function for the Boolean data type, bool(). Most other data types have one value that is considered the False value for that data type, and every other value is consider True. The integer 0, the floating point number 0.0, the empty string, the empty list, and the empty dictionary are all considered to be False when used as the condition for an if or loop statement. All other values are True. Try entering the following into the interactive shell:
Whenever you have a condition, imagine that the entire condition is placed inside a call to bool() as the parameter. Conditions are automatically interpreted as Boolean values. This is similar to how print() can be passed non-string values and will automatically interpret them as strings when they print.
This is why the condition on line 111 works correctly. The call to the isValidMove() function either returns the Boolean value False or a non-empty list. If you imagine that the entire condition is placed inside a call to bool(), then the condition False becomes bool(False) (which, of course, evalutes to False). And a condition of a non-empty list placed as the parameter to bool() will return True. This is why the return value of isValidMove() can be used as a condition.
The getScoreOfBoard() function uses nested for loops to check all 64 spaces on the board (8 rows times 8 columns per row is 64 spaces) and see which tile (if any) is on them. For each 'X' tile, the code increments xscore. For each 'O' tile, the code increments oscore.
Notice that this function does not return a two-item list of the scores. A two-item list might be a bit confusing, because you may forget which item is for X and which item is for O. Instead the function returns a dictionary with keys 'X' and 'O' whose values are the scores.
This function asks the player which tile they want to be, either 'X' or 'O'. The for loop will keep looping until the player types in 'X' or 'O'.
The enterPlayerTile() function then returns a two-item list, where the player's tile choice is the first item and the computer's tile is the second. We use a list here instead of a dictionary so that the assignment statement calling this function can use the multiple assignment trick. (See line 252.)
The whoGoesFirst() function randomly selects who goes first, and returns either the string 'computer' or the string 'player'.
We have used the playAgain() in our previous games. If the player types in something that begins with 'y', then the function returns True. Otherwise the function returns False.
makeMove() is the function we call when we want to place a tile on the board and flip the other tiles according to the rules of Reversi. This function modifies the board data structure that is passed as a parameter directly. Changes made to the board variable (because it is a list) will be made to the global scope as well. Most of the work is done by isValidMove(), which returns a list of XY coordinates (in a two-item list) of tiles that need to be flipped. (Remember, if the the xstart and ystart arguments point to an invalid move, then isValidMove() will return the Boolean value False.)
On lines 163 and 164, if the return value of isValidMove() was False, then makeMove() will also return False.
Otherwise, isValidMove() would have returned a list of spaces on the board to put down our tiles (the 'X' or 'O' string in tile). Line 166 sets the space that the player has moved on, and the for loop after that sets all the tiles that are in tilesToFlip.
getBoardCopy() is different from getNewBoard(). getNewBoad() will create a new game board data structure which has only empty spaces and the four starting tiles. getBoardCopy() will create a new game board data structure, but then copy all of the pieces in the board parameter. This function is used by our AI to have a game board that it can change around so that it doesn't have to change the real game board. This is like how you may imagine making moves on a copy of the board in your mind, but not actually put pieces down on the real board.
A call to getNewBoard() handles getting a fresh game board data structure. Then the two for loops copy each of the 64 tiles from board to our duplicate board data structure named dupeBoard.
This function is much like isOnBoard(). Because all Reversi boards are 8 x 8 in size, we only need the XY coordinates to be passed to this function, not a game board data structure itself. This function returns True if the coordinates are on either (0,0), (7,0), (0,7) or (7,7). Otherwise isOnCorner() returns False.
The getPlayerMove() function is called to let the player type in the coordinates of their next move (and check if the move is valid). The player can also type in 'hints' to turn hints mode on (if it is off) or off (if it is on). The player can also type in 'quit' to quit the game.
The DIGITS1TO8 constant variable is the list ['1', '2', '3', '4', '5', '6', '7', '8']. We create this constant because it is easier type DIGITS1TO8 than the entire list. (We can't use the isdigit() method because that would allow 0 and 9 to be entered, which are not valid coordinates on our 8x8 board.)
The while loop will keep looping until the player has typed in a valid move. First we check if the player wants to quit or toggle hints mode, and return the string 'quit' or 'hints'. We use the lower() method on the string returned by input() so the player can type 'HINTS' or 'Quit' but still have the command understood by our game.
The code that calls getPlayerMove() will handle what to do if the player wants to quit or toggle hints mode.
Our game is expecting that the player would have typed in the XY coordinates of their move as two numbers without anything in between them. The if statement first checks that the size of the string the player typed in is 2. After that, the if statement also checks that both move[0] (the first character in the string) and move[1] (the second character in the string) are strings that exist in DIGITS1TO8, which we defined at the beginning of the function.
Remember that our game board data structures have indexes from 0 to 7, not 1 to 8. We show 1 to 8 when we print the board using drawBoard() because people are used to numbers beginning at 1 instead of 0. So when we convert the strings in move[0] and move[1] to integers, we also subtract 1.
Even if the player typed in a correct move, we still need to check that the move is allowed by the rules of Reversi. We do this by calling isValidMove(), passing the game board data structure, the player's tile, and the XY coordinates of the move. If isValidMove() returns False, then we execute the continue statement so that the flow of execution goes back to the beginning of the while loop and asks the player for the move again.
If isValidMove() does not return False, then we know the player typed in a valid move and we should break out of the while loop.
If the if statement's condition on line 200 was False, then the player did not type in a valid move. We should display a message instructing them how to type in moves that our Reversi program can understand. Afterwards, the execution moves back to the while statement on line 192 because line 209 is not only the last line in the else-block, but also the last line in the while-block.
Finally, getPlayerMove() returns a two-item list with the XY coordinates of the player's valid move.
getComputerMove() and is where our AI algorithm is implemented. The getValidMoves() function is very helpful for our AI. Normally we use the results from getValidMoves() for hints mode. Hints mode will print '.' period characters on the board to show the player all the potential moves they can make. But if we call getValidMoves() with the computer AI's tile (in computerTile), we can get all the possible moves that the computer can make. We will select the best move from this list.
First, we are going to use the random.shuffle() function to randomize the order of moves in the possibleMoves list. Remember that the random.shuffle() function will reorder the items in the list that you pass to it. The function also modifies the list directly, much like our resetBoard() function does with the game board data structure.
We will explain why we want to shuffle the possibleMoves list, but first let's look at our algorithm.
First, we loop through every move in possibleMoves and if any of them are on the corner, we return that as our move. Corner moves are a good idea because once a tile has been placed on the corner, it can never be flipped over. Since possibleMoves is a list of two-item lists, we use the multiple assignment trick in our for loop to set x and y.
Because we immediately return on finding the first corner move in possibleMoves, if possibleMoves contains multiple corner moves we always go with the first one. But since possibleMoves was shuffled on line 220, it is completely random which corner move is first in the list.
If there are no corner moves, we will go through the entire list and find out which move gives us the highest score. The for loop will set x and y to every move in possibleMoves. bestMove will be set to the highest scoring move we've found so far, and bestScore will be set to the best move's score. When the code in the loop finds a move that scores higher than bestScore, we will store that move and score as the new values of bestMove and bestScore (see lines 233, 234, and 235).
In order to figure out the score of the possible move we are currently iterating on, we first make a duplicate game board data structure by calling getBoardCopy() on line 230. We want a copy so we can modify without changing the real game board data structure stored in the board variable.
Then we call makeMove() on line 231, passing the duplicate board (stored in dupeBoard) instead of the real board. makeMove() will handle placing the computer's tile and the flipping the player's tiles on the duplicate board.
We call getScoreOfBoard() on line 232 with the duplicate board, which returns a dictionary where the keys are 'X' and 'O', and the values are the scores. getScoreOfBoard() does not know if the computer is 'X' or 'O', which is why it returns a dictionary with both scores.
By making a duplicate board, we can simulate a future move and test the results of that move without changing the actual game board data structure. This is very helpful in deciding which move is the best possible move to make.
Pretend that getScoreOfBoard() returns the dictionary {'X':22, 'O':8} and computerTile is 'X'. Then getScoreOfBoard(dupeBoard)[computerTile] would evaluate to {'X':22, 'O':8}['X'], which would then evaluate to 22. If 22 is larger than bestScore, bestScore is set to 22 and bestMove is set to the current x and y values we are looking at. By the time this for loop is finished, we can be sure that bestScore is the highest possible score a move can make, and that move is stored in bestMove.
You may have noticed that on line 228 we first set bestScore to -1. This is so that the first move we look at in our for loop over possibleMoves will be set to the first bestMove. This will guarantee that bestMove is set to one of the moves when we return it.
Say that the highest scoring move in possibleMoves would give the computer a score of 42. What if there was more than one move in possibleMoves that would give this score? The for loop we use would always go with the first move that scored 42 points, because bestMove and bestScore only change if the move is greater than the highest score. A tie will not change bestMove and bestScore.
We do not always want to go with the first move in the possibleMoves list if it had not been shuffled on line 220, because that would make our AI predictable by the player. Even though our code always chooses the first of these tied moves, is random which of the moves will be first in the list because the order is random. This ensures that the AI will not be predictable when there is more than one best move.
showPoints() simply calls the getScoreOfBoard() function and then prints out the player's score and the computer's score. Remember that getScoreOfBoard() returns a dictionary with the keys 'X' and 'O' and values of the scores for the X and O players.
That's all the functions we define for our Reversi game. The code starting on line 246 will implement the actual game and make calls to these functions when they are needed.
The while loop on line 248 is the main game loop. The program will loop back to line 248 each time we want to start a new game. First we get a new game board data structure by calling getNewBoard() and set the starting tiles by calling resetBoard(). mainBoard is the main game board data structure we will use for this program. The call to enterPlayerTile() will let the player type in whether they want to be 'X' or 'O', which is then stored in playerTile and computerTile.
showHints is a Boolean value that determines if hints mode is on or off. We originally set it to off by setting showHints to False.
The turn variable is a string will either have the string value 'player' or 'computer', and will keep track of whose turn it is. We set turn to the return value of whoGoesFirst(), which randomly chooses who will go first. We then print out who goes first to the player on line 255.
The while loop that starts on line 257 will keep looping each time the player or computer takes a turn. We will break out of this loop when the current game is over.
Line 258 has an if statement whose body has the code that runs if it is the player's turn. (The else-block that starts on line 282 has the code for the computer's turn.) The first thing we want to do is display the board to the player. If hints mode is on (which it is if showHints is True), then we want to get a board data structure that has '.' period characters on every space the player could go.
Our getBoardWithValidMoves() function does that, all we have to do is pass the game board data structure and it will return a copy that also contains '.' period characters. We then pass this board to the drawBoard() function on line 262.
If hints mode is off, then we just pass mainBoard to drawBoard() on line 264.
After printing out the game board to the player, we also want to print out the current score by calling showPoints() on line 265.
Next we let the player type in their move. getPlayerMove() handles this, and its return value is a two-item list of the XY coordinate of the player's move. getPlayerMove() makes sure that the move the player typed in is a valid move, so we don't have to worry about it here.
If the player typed in the string 'quit' for their move, then getPlayerMove() would have returned the string 'quit'. In that case, we should call the sys.exit() to terminate the program.
If the player typed in the string 'hints' for their move, then getPlayerMove() would have returned the string 'hints'. In that case, we want to turn hints mode on (if it was off) or off (if it was on). The showHints = not showHints assignment statement handles both of these cases, because not False evaluates to True and not True evaluates to False. Then we run the continue statement to loop back (turn has not changed, so it will still be the player's turn when we continue).
Otherwise, if the player did not quit or toggle hints mode, then we will call makeMove() to make the player's move on the board.
After making the player's move, we call False to see if the computer could possibly make any moves. If False returns a blank list, then there are no more moves left that the computer could make (most likely because the board is full). In that case, we break out of the while loop and end the current game.
Otherwise, we set turn to 'computer'. The flow of execution skips the else-block and reaches the end of the while-block, so execution jumps back to the while statement on line 257. This time, however, it will be the computer's turn.
The first thing we do when it is the computer's turn is call drawBoard() to print out the board to the player. Why do we do this now? Because either the computer was selected to make the first move of the game, in which case we should display the original starting picture of the board to the player before the computer makes its move. Or the player has gone first, and we want to show what the board looks like after the player has moved but before the computer has gone.
After printing out the board with drawBoard(), we also want to print out the current score with a call to showPoints() on line 284.
Next we have a call to input() on line 285 to pause the script while the player can look at the board. This is much like how we use input() to pause the program in our Jokes chapter. Instead of using a print() call to print a string before a call to input(), you can pass the string as a parameter to input(). input() has an optional string parameter. The string we pass in this call is 'Press Enter to see the computer\'s move.'.
After the player has looked at the board and pressed Enter (any text the player typed is ignored since we do not assign the return value of input() to anything), we call getComputerMove() to get the XY coordinates of the computer's next move. We store these coordinates in variables x and y, respectively.
Finally, we pass x and y, along with the game board data structure and the computer's tile to the makeMove() function to change the game board to reflect the computer's move. Our call to getComputerMove() on line 286 got the computer's move (and stored it in variables x and y), and the call to makeMove() on line 287 makes the move on the board.
Lines 289 to 292 are very similar to lines 276 to 279. After the computer has made its move, we check if there exist any possible moves the human player can make. If getValidMoves() returns an empty list, then there are no possible moves. That means the game is over, and we should break out of the while loop that we are in.
Otherwise, there is at least one possible move the player should make, so we should set turn to 'player'. There is no more code in the while-block after line 292, so execution loops back to the while statement on line 257.
Line 294 is the first line beyond the while-block that started on line 257. This code is executed when we have broken out of that while loop, either on line 290 or 277. (The while statement's condition on line 257 is simply the value True, so we can only exit the loop through break statements.)
At this point, the game is over. We should print out the board and scores, and determine who won the game. getScoreOfBoard() will return a dictionary with keys 'X' and 'O' and values of both players' scores. By checking if the player's score is greater than, less than, or equal to the computer's score, we can know if the player won, if the player lost, or if the player and computer tied.
Subtracting one score from the other is an easy way to see by how much one player won over the other. Our print() calls on lines 299 and 301 use string interpolation to put the integer result of this subtraction into the string that is printed.
The game is now over and the winner has been declared. We should call our playAgain() function, which returns True if the player typed in that they want to play another game. If playAgain() returns False (which makes the if statement's condition True), we break out of the while loop (the one that started on line 248), and since there are no more lines of code after this while-block, the program terminates.
Otherwise, playAgain() has returned True (which makes the if statement's condition False), and so execution loops back to the while statement on line 248 and a new game board is created.
The board we draw for our Reversi game is fairly large. But we could change the drawBoard() function's code to draw out a much smaller board, while keeping the rest of the game code the same. The new, smaller board would look something like this:
Here is the code for this new drawBoard() function, starting at line 6. You can also download this code from http://inventwithpython.com/reversi_mini.py
The AI may seem almost unbeatable, but this isn't because the computer is very smart. The strategy it follows is very simple: move on the corner if you can, otherwise make the move that will flip over the most tiles. We could do that, but it would take us a long time to figure out how many tiles would be flipped for every possible valid move we could make. But calculating this for the computer is very simple. The computer isn't smarter than us, it's just much faster!
This game is very similar to Sonar because it makes use of a grid for a board. It is also like the Tic Tac Toe game because there is an AI that plans out the best move for it to take. This chapter only introduced one new concept: using the bool() function and the fact that empty lists, blank strings, and the integer 0 all evaluate to False in the context of a condition.
Other than that, this game used programming concepts that you already knew! You don't have to know very much about programming in order to create interesting games. However, this game is stretching how far you can get with ASCII art. The board took up almost the entire screen to draw, and the game didn't have any color.
Later in this book, we will learn how to create games with graphics and animation, not just text. We will do this using a module called Pygame, which adds new functions and features to Python so that we can break away from using just text and keyboard input.
Go to Chapter 14 - Caesar Cipher | Go to Chapter 16 - AI Simulation |


text:
PRESS RELEASE From the Office of State Senator Leticia Van de Putte
For Immediate Release April 2, 2014 Contact: Lee Nichols, 512-463-0126
(Austin) — Authorities have reported that there is an ongoing, active shooter situation at Fort Hood. Texas State Senator Leticia Van de Putte, Chair of the Senate Veteran Affairs & Military Installations Committee, issued the following statement:
"I have been informed by my staff of the dangerous and ongoing active shooter situation at Fort Hood. I will stay in constant contact with military and law enforcement officials to monitor the situation. I am grateful to the brave military and civilian police forces working to locate and apprehend the shooter, and my thoughts and prayers are with our military families who may have been affected by this incident."

subset: commoncrawl


text:
Join the celebration to honor the guitar that changed popular music forever.
Fender experimented with a rosewood
Telecaster design in the late 1960s. A very
few of the exceptionally heavy guitars were
produced, most famously the one played by
George Harrison at the Beatles' famed
"rooftop concert" of Jan. 30, 1969, in London.
Fender's Lite Rosewood Telecaster evokes
that elusive instrument and greatly lightens
the weight by sandwiching a dark-stained
spruce body core between a rosewood top
and back.
On its 1951 introduction, the Telecaster was a
revolutionary instrument that would usher in
whole new eras of musical innovation and
excitement. Sixty years later, in 2011, it is an
archetypal electric guitar with a long and
storied history. The rich history of Fender
guitars begins with the Telecaster, and Fender is
celebrating its 60th anniversary all year with
12 very special "Tele-bration" models that
stay inside the Telecaster's famously elegant
lines while offering the finest and most
unusual takes on the instrument's past,
present and future.


text: PTO information for Lakeside Jr. and Sr. High The mission of the Lakeside School District Parent Teacher Organization (PTO) is to work in conjunction with the faculty of each school to provide a diverse and wide-ranging educational environment. The environment created will allow all students the opportunity to excel academically, socially and physically, while improving the community within the school. The PTO will reinforce these opportunities by promoting parental involvement to foster educational values in the students. PTO volunteers assist with many worthwhile programs throughout the year: * Student health screenings (vision, hearing and scoliosis) * Student CPR training * Student special needs, at Christmas and throughout the school year *ACE (All Created Equal) *Teacher appreciation snacks and meals * Classroom educational grants PTO meetings are held the first Tuesday of each month. We encourage you to join PTO, attend monthly meetings, and volunteer. We welcome your involvement. You membership dues and donations are the only source of funding for these worthy projects and programs that benefit all Lakeside students and faculty. A brighter future for your child starts with your investment in their life today. Lakeside Jr./Sr. High 2011-2012 PTO Officers: Board Members: Michelle Harrison, President Amy Huskey, Vice-President Darby Logan, Secretary Jean Brown, Corresponding Secretary Cheryl Howe, Treasurer Will Maffit, Parliamentarian Stacy Hudgens, Classroom Grants Kelli Greenwood, Membership Sarah Robbins, ACE/Special Needs Shannon Ahlbrandt and Courtney Zeiser - Jr. High Building Coordinators Colleen Hanke and Caren Dodd - Sr. High Building Coordinators Grade Representatives: 8th- Amy Reagan and Mary Beth Munro 9th- Tina Burrough and Michelle Ratcliff 10th- Brenda Jordan and Virginia Fortner 11th- Mary Jo Selig and Kate Lefler 12th-Leonette Bryant and Kay Norton |


text:
quote:Recently I've been reading more and more about more aggressive strategies and I've found selling weekly puts can generate .5%-1% a week on stocks I would've bought anyways if it expires worthless and if I'm put the shares I'd get them at a price I liked anyways.
quote:I follow the bogle philosophy except I don't believe in indexing and only indexing. I use index and managed funds, plus individual stocks.
quote:Can you explain this? Then explain how much you make from doing this to see if it is worth investigating
quote:boglehead philosophy is phenomenal if you want consistent 6-10% annual returns.
quote:If you want to get rich following the boglehead way it is going to be mostly via your new cash deposits
quote:Drips would make most sense in a ROTH since your dividends are taxed correct?
quote:boglehead philosophy is phenomenal if you want consistent 6-10% annual returns. If you want a shot at more, you've gotta find it on your own.


text:
General Searching tips
- Write down your research topic
- Use your research statement to help you evaluate sources. (Is this resource really about my topic?)
- Use multiple search terms
- Identify useful subject headings in the database (and the library catalog) and try those in subsequent searches.
Suggested Resources
Scholarly Article
- CINAHL You can use this database to find a scholarly article about your career.
Online Resources
- Ferguson's Career Guidance Center
- Eureka
- Bureau of Labor Statistics/Occupational Outlook Handbook
- O*NET Online
Evaluating what you find
- Identifying and Evaluating Peer Reviewed Articles
- Evaluating Websites
- What about Wikipedia?
- Truth and Reality on the web
APA and More
- Print Guide for annotated APA style
- Owl @ Purdue for tips on using APA
Have questions?
- office PLN #123 (anytime in office)
- phone - 714.278.2151
- cell- 818.288.2179 (9AM to 9PM 7 days)
- email ? email@example.com


text:
'Soften Us To Our Enemies'
Thanksgiving is the most American of holidays, yet arguably the least commercialized. As it has always been, it is about giving thanks, and about the gathering of families:
My Husband, Al, and I went to a Veteran's dinner this week, and I heard a poem that actually brought me to tears. It may be long, but I have to share this. Read it slowly and take in the words.
I Am a Veteran by Andrea C. Brett
You may not know me the first time we meet I'm just another you see on the street But I am the reason you walk and breathe free I am the reason for your liberty
I am a Veteran
Driving back to the Cape from Maine is always an illuminating experience, especially if you detour along Route 1 in Seabrook, New Hampshire. While checking the passing scenery, my wife this past weekend caught this photo of a giant "Scott Brown for U.S. Senate" sign.
Yes, the former U.S. Senator from Massachusetts moved north to that state where one must "Live Free or Die" after being defeated by Elizabeth Warren in 2012.
By Michael Bradley
In recent weeks everyone has been treated to a live drama of magnificent proportions! It might even be called the 'Capitalist Play of the Century.'
The great Market Basket dilemma has been 'covered' by virtually all of the public media, making it a national show originating here in the Bay State. But the media – large and small – failed to grasp the underlying story; there has been no attempt to reveal what this powerful drama illustrates.
Ah, summer vacation! There's nothing like getting away. Whether by car, by air, or by train, traveling however, generates a lot of waste!
My husband and I were recently in Asheville, North Carolina. On the drive from Charlotte to Asheville, we stopped at a Subway restaurant , one of the healthier fast food options, for lunch. Since I haven't been to a fast food restaurant in years, I was shocked at the enormous amount of throwaway,non-recyclable products with each order – still!
By Greg O'Brien
William Shakespeare captured the essence of the late Sherill Smith of Orleans when he wrote in Hamlet, "He was a man. Take him for all in all. We shall not look upon his like again."
Lately, I've been hearing about rebooting our abandoned New Year's resolutions. It's only February after all, and way too soon to let those good intentions fall by the way side. Hopefully your resolutions included adopting new green living habits, but if not, it's never too late to add them.
What is the most important green thing you can do? Think.
If you believe -- as I do -- that Rutgers economic historian James Livingston and others are correct in postulating that consumer spending is what really drives the economy, you may also buy into my own modest econometric proposition.
It suggests that while economists may palaver at length about the multiplicity of economic indicators they rely upon to crystal-ball the economy, there is -- at bottom -- only one: the number of items-per-second sold by Amazon on Cyber Monday:
I originally posted this item 16 months ago. All due modesty (yeah, right!) compels me to re-run it, although the horse is already out of the barn.
* * *
It was particularly nice that the Duxbury schools' PTA and PTO organizations and nearly 100 property owners saw fit to post signs around town thanking school bus drivers completing a safe year of delivering their precious cargo to school and back 180 times a year, as well as on countless field trips and to away games. These drivers are the salt of the earth and accordingly tend not to be given to self-promotion.
Battelle Memorial Institute's short announcement last week that it plans to move its Duxbury operation of 80 years to a state-of-the art facility in Norwell is important news. Battelle's campus at 397 Washington Street is prime real estate. The oncoming move demands the attention of citizens and town officials while the seller and any buyer may be moved to act in what might be called a feasible statesmanlike manner.
As Mark Twain put it, "Reports of my death are exaggerated" -- he meant premature. So, our headline, "Winsor House Inn sold" in the April 24 Clipper. The fact is the business is under agreement to be sold, but that in the hot-and-cold world of real-estate transactions nothing is ever final until papers are passed. The anticipated date for that is May 20. Meanwhile, David and Patricia O'Connell continue to own the business, as they have for the last 37 years.
Five days ago, Tom Grilk of the Boston Athletic Association committed to the 2014 Boston Marathon; a quintessential sample of the courage Boston mustered in the face of an extreme act of cowardice still unfolding at the time. A bright light in a dark moment.
This was by far the hardest topic around which to create an animation with a point of view, entertainment value, and amusement. The issues are serious and potentially tragic; not exactly fodder for funnies. I'm hoping that an animated cartoon can go where written words sometimes are not welcome.
Arriving in good time to make it onto my personal "Best Parodies of the 20th Century" list, came Ian Frazier's incomparable 1997 Atlantic Monthly essay, "Lamentations of the Father".
The self-proclaimed "American Military's Most-Trusted News Source", The Duffle Blog, has scooped the MSM with its chilling revelation that the military has been drawing up plans for nation-wide gun confiscation.
Lincoln was my father's hero. "We're both from Illinois," he would say. When I visited my Dad at his stone house in Redhill Park, he invariably drove me to the nearby town of Salem—Lincoln's home in his formative years.
On more than one occasion, we drove to Springfield and visited the Lincoln house. This was sacred ground to my father whose ancestors were Chicagoans.
We are reminded by The New York Times that it was 70 years ago this month that Soviet troops finished wiping up the last remaining pocket of Nazi resistance at Stalingrad (now Volgograd). The Germans had lost over a half-million men killed, wounded or captured, along with staggering quantities of materiel.
By Greg O' Brien, Boston Irish Reporter
Dan Kennedy, in his blog, Media Nation, chortlingly cited this truthy maxim from an old book on newspaper design:
Research indicates that readers classify information in the paper into two areas: information that is interesting and/or useful; and information that is not interesting and/or useful.
To this old TV newsmonger, the problem with cable news is way too little of the former and far too much of the latter.
After the Winter-That-Never-Was, everything seemed to be running two weeks early this spring. Grass was greener, flowers up, trees leafing out. Even school was let out a few days earlier than had been anticipated due to a lack of snow days (yet was still later than other towns, oddly).


text:
Weeden fatal crash probe will take weeks: County Attorney's Office will have to review Dover police investigation
Thursday, December 5, 2013
DOVER — Police say an investigation into a fatal car accident involving City Councilor Michael Weeden, which resulted in the death of an 87-year-old Somersworth man, will take a few weeks to complete.
On Tuesday, Breault said the County Attorney's Office would review the investigation as well, a common procedure in fatal accidents.
Police say Carignan, of 22 Tates Brook Road in Somersworth, was traveling north on Sixth Street in his 2008 Chevrolet Aveo when his vehicle was struck head-on by a southbound Chrysler 300 driven by Weeden. |


text:
US $2.3 - 8 / Piece1000 Piece/Pieces
US $2.3 - 8 / Piece1000 Piece/Pieces
US $4.5 - 6.5 / Piece200 Piece/Pieces
Place of Origin: |
Guangdong China (Mainland)
Brand Name: |
Model Number: |
color: |
style: |
Slim, Folding
Keypad Button Material: |
Interface Type: |
Custom Order: |
Factory & Distribution Center: |
Shenzhen, Guangdong, China
N. America Distribution Center: |
City of Industry, CA, USA
Application: |
iphone 4
Packaging Detail: | Each one in gift box 50pcs/ctn |
Delivery Detail: | 2-20 days based on the qty |
new slider backlight wireless keyboard case for iphone 5:
1.slide-out design
2.color: black and white
3.wireless bluetooth
*This Bluetooth Sliding Keyboard Case for Apple iPhone 5 frees you from the pains of having to use an on-screen keyboard!
*It pairs over Bluetooth using wireless connectivity and features a slide-out QWERTY keyboard that includes Home and Search buttons.
*It's powered by a lithium rechargable battery and is charged via its USB mini B port. Its on/off switch lets you conserve its battery life, too!
*Simply snap in your iPhone 5 (AT&T or Verizon), pair your devices, and you've got a fully functional keyboard ready to slide out whenever you need it!
*It's also a good gift for others.
his slide-out wireless keyboard is now available for iPhone 5. It is easier to text or navigates online. In addition, the case protects your Smartphone from any bumps of bruises. With its small design and portability, the mini keyboard with 51 keys is enabled through Bluetooth and it can be used with most devices that support it.
Physical Features:
Power Specifications:
Package included:
1.material:ABS plastic |
2.key life:2-3 years |
3.charging port:micro-USB |
4.charging cable:include |
5.power:1.2 mA |
6.battery capcity:250 mA |
7.working current:5 mA |
8.standby time :7 days continued time :36 H |
9.working time:60 hours |
10.charching time:2 hours |
11.charging voltage:3.7 v |
12.charging current:5 mA |
13.chipset :20730KM |
14.Bluetooth Specifications :version 3.0 |
There are 3 options for your purchase:
1. FOB Shenzhen, China
Direct export from Shenzhen, we can also consolidated with your other items.
2. FOB City of Industry, CA
We do all the import works and ship together with our containers. It will save you as much as 35% when compare to LTL. Save you time and money with no duty bill and no ocean frieght. Re-distribution to you via low cost domestic shipping method.
3. DDS (Direct Drop Ship)
Let us do the shipping work for you. We will ship directly to your customers anywhere in the world. Our DDS price above are included shipping cost. You just need to set your profit (For example, our DDS price $2, if your selling price $3, your profit will be $1) then focus on selling and marketing. When customers order, just email us the info and we will drop ship directly to your customers. (In order to protect our resale partners, some restriction apply. Please email us for DDS program detail.)


text:
Die hard fans at Opening Day for Iowa Cubs
UPDATED 7:15 AM CDT Apr 04, 2014Video Transcriptthe iowa cubs played their season opener tonight at Principal Park. As KCCI's Ryan Smith reports... Some die-hard fans braved a damp and cold night to watch our boys of summer. A thick fog has blanketed the ball park all night long. The dreary conditions certainly have not dampened the spirits of fans inside principal park. Opening day at Principal Park was far from the weather typically reserved for America's past time. 20.08 "WHAT'S BETTER THAN OPENING DAY OF BASEBALL, COME ON? IT'S JUST A LITTLE BIT OF MIST." The fans who did show up, braved the elements by bringing reinforcements. Chad Weir has his girlfriend to thank for this masculine umbrella. "YOU'RE NOT AFRAID TO SHOW THIS OFF? THE POLKA-DOTS? NO, I'M NOT AFRAID TO LOSE MY MAN CARD WITH A POLK-A-DOT UMBRELLA. SO, NO IT DOESN'T BUG ME WHATSOEVER. I'M STAYING DRY, SO THAT HELPS." Most fans made the best of the gray and wet atmosphere. 15.01 "IT'S FUN. IT'S BASEBALL. IT'S AMERICA'S PAST TIME." John Turner has spent more than one dozen opening days overlooking the seats left field. 16.50 "IT'S JUST NOT RIGHT. IT'S OPENING DAY. AND WE'RE OUT HERE IN FOG AND FREEZING RAIN." Shielded from the wet weather, the cub club seemed to attract the most fans. No matter where they were seated... Fans say this is the beginning of an exciting season. Highlighted by a young team with one hot prospect. Jordan Gibson didn't want to miss his chance to see Javier Baez. The most- hyped player in the Chicago Cubs' system isn't expected to stay in central iowa for very long. 20.31 "EVERYONE'S WAITING FOR HIM TO MAKE HIS MOVE TO THE MAJORS. EVERYONE THINKS HE'S READY NOW. WHY NOT TAKE MY CHANCE NOW WHILE HE'S IN IOWA SINCE I'M FROM IOWA." Ryan Smith, KCCI, 8 news, iowa's news leader.
The views expressed are not those of this site, this station or its affiliated companies. By posting your comments you agree to accept our terms of use.blog comments powered by Disqus


text:
Your own every week commission isn't going to usually protect these types of gatherings. You may well be prepared at which you should have some help. This informative article provides you with effective the specifics of utilising payday advances. Achieve a little groundwork previous to getting a payday advance loan. You would possibly feel as if you might have almost no time to help look into the details because you require this money fast. Pay day loans can be was given really quick. It is easy to normally discover the bucks this time of day. Search the web check out approximately bank loan
szybka pożyczka warszawa
kredyt ratalny bez zaświadczeń
pożyczka gotówkowa gdzie najtaniej
szybka pożyczka bez biku
pożyczki bez bik sieradz
kredyt na dowód osobisty przez internet
kredyty pozabankowe wrocław
kredyt na dowód 2010
pożyczka prywatna grudziądz
szybka pożyczka chwilówka
pożyczka gotówkowa wzór umowy
pożyczka gotówkowa żagiel
kredyty pożyczki bez zaświadczeń
chwilówki 15 minut
quotes, go to the BBB read loan merchant reputations, and additionally hone downward what you can do previous to having a quick payday loan. Fast payday loans often appear to be the sole use for many who will need finances speedy. In case the identifies anyone, undertake fine study just before signing up to any organization meant for an online payday loan. Should the business you have in mind has a under sterling recognition, keep exploring. There are occassions when those people would definitely experience the wanting cash as well as there is no additional option however , to consider a payday cash loan will probably be your mainly possibility. For those who have acquaintances or household members exactly who could have your assets that may help you, check out questioning these people just before relying on in order to employing an online payday loan provider. Fast cash advance organisations own a number of techniques to get around this procedures towards charge the very best number. They could bill fees that will in essence cost you benefit for the money took. Can easily strengthen interest about above five occasions the eye interest rates of standard fiscal loans. Before disposing of a new payday loan, focus on receiving a grasp on your overall budget allowed. Recognize things you require so that they can cover your whole very important charges. You may not think money any time figuring out. You ought to bottom part ones loan product information off of the total you actually lend for funds which is kept immediately after funding fees are usually attained. To within the reliable side, hardly ever lend a quantity that's
kredyt chwilówka namysłów
kredyty na dowód wrocław
kredyt na dowód allianz
kredyty chwilówki czechowice-dziedzice
szybka pożyczka gotówkowa w uk
pożyczki na dowód od 18 lat
kredyt chwilówka białystok
pożyczki na dowód olsztyn
szybka pożyczka 100 zł
szybkie kredyty dla firm bez bik
chwilówki dąbrowa górnicza
chwilówki jastrzębie zdrój ul śląska
pożyczki na dowód przez internet
pożyczki prywatne wrocław
beyond 25% associated with the length of a income. This can be a good method to avert cash advance frauds. Be sure to are using an important secure a single. It's been the situation that respectable cash advance firms supply best interest rates, superior interest and even fair phrases can be found within just fast payday loans in the event right research is done ahead. When you need payday loans for the purpose of curing some fiscal situation, you ought to developed a plan to beginning safeguarding money on a monthly basis to deal with this added in bills. You need to mindful when it comes to scammers during the pay day loan field. Regularly, scammers usually use companies that are nearly the same as professional firms, offering you effective hard cash with the phone and even indicating a person's credit ratings hsitory doesn't matter. These people simply would like the information you have for the purpose of many different people. Test phone the moment requesting a person's cash advance loan. It may look like much easier to simply total the webs develop, though phone may make a great deal more feel. Perhaps you may demand concerns plus be sure that you appreciate a long term contract truly. Make certain to consider this increased curiosity that you're shelling out as soon as you get that are included in cash advances.
szybki kredyt dla firm na oświadczenie
kredyty pozabankowe bez zaswiadczen
pożyczka gotówkowa porównanie
kredyt dla bardzo zadłużonych
szybki kredyt wbk
szybki kredyt dla zadłużonych
chwilówki lublin lubartowska
pożyczki bez bik w toruniu
pożyczki prywatne udzielam
pożyczka gotówkowa bez prowizji
pożyczka prywatna pod weksel warszawa
pożyczki tylko na dowód
chwilówki 15 minut
kredyt pozabankowy warszawa
pożyczki dla rencistów


text:
Start learning with our library of video tutorials taught by experts. Get started
Discover how to proactively manage project schedules.
"Through your company I am experiencing the real joy of education. It is incredibly motivating to see the passion of the teachers in each course." —Saif R.
more from our members »


text:
The Federally-Recognized Tribes Extension Program supports extension education on Indian reservations and tribal jurisdictions to address the unique needs and problems of American Indian tribal nations. The target audience is Native American individuals and communities on large reservations (at least 100,000 acres). Currently, there are 28 projects in 15 states. These projects are located on 32 reservations, plus 38 communities in Alaska and one tribal nation geographic area in Oklahoma.
1862 land-grant institutions.
Targeted Areas of Support
Projects funded under this program support one or more of the five Strategic Goals outlined in the NIFA Strategic Plan for FY 2004-2009: enhance economic opportunities for agricultural producers; support increased economic opportunities and improved quality of life in rural America; enhance protection and safety of the Nation's agriculture and food supply; improve the Nation's nutrition and health; and protect and enhance the Nation's natural resource base and environment.
Awards are made on a multiyear basis, subject to Congressional appropriations and annual evaluations that show the satisfactory progress of the project.
The estimated funding for FY 2006 is $1,760,000.
Results and Impacts
This program assists American Indians in adopting profitable farming and ranching techniques and providing 4-H and other developmental experiences for tribal youth. In each state, the land-grant university supplies qualified extension agents who bring educational programs and resources to tribal communities, and the tribal nation provides office space and utilities. An advisory committee works to identify community priorities.
See List
Joan Gill, National Program Leader, Federally-Recognized Tribes Extension Program
Back to Multicultural Alliances Home Page


text:
- Text Size:
- ASmall Text
- AMedium Text
- ALarge Text
How those who knew him best - and those who never knew him at all - remember his legacy.
The views expressed are not those of this site, this station or its affiliated companies. By posting your comments you agree to accept our terms of use.
blog comments powered by Disqus


text:
Resistance Temperature Detectors, also known as RTD's, are wire wound and thin film devices which incorporate pure metals or certain alloys that increase in resistance as temperature increases and, conversely, decrease in resistance as temperature decreases. RTDs are similar to thermocouples in that they convert changes in temperature to voltage signals by the measurement of resistance. As a RTD gets hotter the resistance measured on it's element becomes larger, as it cools the resistance becomes smaller.
The most commonly used type of RTD element is Platinum, these models are often referred to as PRTs or PRT100s. Platinum elements are popular because they can be used over a wide range of temperatures and feature a quick response time. Platinum's coefficient of resistance is nearly linear, as such, by using a platinum element resolutions of ±0.1 °C or better are possible.
Other elements can be used in RTD's which are less costly, the most commonly used alternatives are Copper and Nickel. The advantage to this is that the RTD will cost less money to manufacture and have a lower replacement value, but the drawback is that these elements have more restriction on the ranges they can be used due to non-linearities in the resistance vs. voltage curve. Also, there are problems with wire oxidation problems which are known to occur when copper is used as the element.
The advantages of RTD's include: stable output for long period of time, ease of recalibration, and accurate readings over relatively narrow temperature spans. When compared to thermocouples their disadvantages are: higher sensitivity to vibration, smaller overall temperature range, and a greater initial cost. For more help in determining if an RTD is the correct choice for your application, please consult our knowledgeable sales staff.
To get the maximum life from your Resistance Temperature Detector it is recommended that you use a protective well and terminal head. The well serves to protect the RTD from damage by the gas or liquid being measured. Protecting wells are available in stainless steel, carbon steel, Inconel, or cast iron, and they are used for temperatures up to 1100°C. To eliminate errors in taking measurements it is necessary to compensate for the length of leadwire used to connect the RTD to the readout. The calculations to correct this are relatively simple, and there are also 3-wire and 4-wire designs which help to minimize such errors. An example of a typical 3-wire measuring circuit is shown in the RTD Specifications Section.
Platinum resistance temperature detectors are used for interpolation between the IPTS-68 fixed temperature points of ice and antimony (0°C to 630.74°C), generally used where accuracy and stability are most important. The ARiDET® approach to RTD's will bring ±.05° laboratory accuracy to the toughest industrial processes - without special handling considerations. ARi Industries Inc. has combined the inherent accuracy of a precisely wound Platinum resistance element with AeroPak® compacted ceramic insulated cable. The result is a low cost yet rugged sensor that will take factory handling - retaining the stability needed for today's precise process control.
Available with either the 99.999%+ high purity JIS C-1604-81 or 99.99% DIN 43760 temperature vs. resistance curve.
See the temperature vs. resistance tables in the RTD charts section for how to obtain laboratory accuracy.
For a more detailed explanation of how resistance temperature detectors work please visit our technical specifications page
Style PRT-14.3 Basic unit, constantan wires bared for direct attachment to terminals |
Style PRT-22.3 Teflon insulated and shielded lead wires attached to basic probe, epoxy potting compound, US Patent #3,144,507 strain relief. |
Style PRT-90.3 with quick disconnect, sealed, vibration resistant connector with extra pin for shielding, mate supplied overall connector length 3.25" when mated. |
Style PRT-96.3 or PRTX-96.3 with standard size connection head, Industrial weatherproof alumin head with internal screw terminals 3/4" NPT exit thread for hard wiring. PRTX-96.3 has temperature transmitter. |
Style PRT-50733.3 with miniature size connection head. Miniature weatherproof aluminum connection head with internal screw terminals. 1/2" NPT exit thread for hard wiring. |
Style PRT-52400.3 with fixed hex nipple. Replacement element with 1/2" NPT hex nipple silver brazed to sheath |
Style PRT-50735.3 with spring loaded hex nipple. Replacement element with 1/2" NPT hex nipple spring loaded |
Style PRT-91.3 with 3 prong quick disconnect, quick disconnect and mate. |
Style PRT-296.3 or PRTX-296.3 with easy access hinged cover. Weatherproof snaplocked hinged cover connection head with 1/2" NPT exit thread. PRTX-296.3 has temperature transmitter. |
Style PRT-396.3 or PRTX-396.3 with nylon connection head. Nylon screw cover connection head with 1/2" NPT exit thread. PRTX-396.3 has temperature transmitter. |


text:
New Movie Images From 'Star Trek Into Darkness'Reported by Outsiders - 12:54 PM 2013.03.20
Paramount Pictures has released two new movie images from Star Trek Into Darkness.
In the wake of a shocking act of terror from within their own organization, the crew of The Enterprise is called back home to Earth. In defiance of regulations and with a personal score to settle, Captain Kirk leads his crew on a manhunt to capture an unstoppable force of destruction and bring those responsible to justice. As our heroes are propelled into an epic chess game of life and death, love will be challenged, friendships will be torn apart, and sacrifices must be made for the only family Kirk has left: his crew. Star Trek Into Darkness is directed by J.J. Abrams and stars Chris Pine, Zachary Quinto, Zoe Saldana, Karl Urban, John Cho, Bruce Greenwood, Simon Pegg, Anton Yelchin, Benedict Cumberbatch, Alice Eve and Peter Weller. The movie is set to premiere in North American IMAX theaters on May 15th, going wide on May 17th. It will be released a week earlier in the United Kingdom on May 9th.
Commentsblog comments powered by DisqusMORE movies NEWS |
Entertainment News International (ENI) is the popular culture network for fans all around the world. Get the scoop on all the popular comics, games, movies, toys, and more every day! |
Action FiguresComics Classifieds Entertainment Reset Nation |
Podcasts Star Wars Transformers |
This site and content are copyright © 2015 Entertainment News International - All other rights revert to their lawful owners This website is provided for the general public as an information and entertainment resource. If you feel this site has infringed on your legal rights, please contact us |


text:
Hardcore Manga Toons:technologies to create new services and product offerings Dad Son Gay Toons even Toon Family Porn new business models." Underground Adult Toons Hot Toons Girls small, Toons Adult Gay Toon Comics Free Gay Toons Another Nick Toon Porn adult sites have excelled is in traffic management. Famous Toons Nude of the larger sites also operate smaller sites, Adult Flash Toons are designed to capture users, and Looney Toons Porn their tastes, before sending them on to the main site. And, Disney Toon Sex the main site is unable to Toon Blowjob to a particular taste, they are Toons Porn Easter Looney Toon Wav advertisements Toon Anal sites operated by other companies. Free Toon Sex sites Spank Toon pay a referral fee to Free 3D Incest Toons Erotic Toon site. "The golden Easter Looney Toons Wavs is never Hardcore Toons Toon Girl leave Easter Looney Toons Gold site Gay Toon Comics knowing where they Toon Insest 3D Toon Sex Comics to next," said Sweeney. Naked Disney Toons sites have perfected the development of Toons Fucking niche sites. These encourage users to Easter Roger Rabbit Toon Toon Lesbian and are less expensive to run than Nick Toon Porn mega Disney Sex Toons With Looney Toons Sex apparently lapping up the services Disney Toons Porn offered by Free Shemale Toons sites, Sweeney believes the rest of the Internet Free Toon Sex Movies shake Toons Hentai its distaste for. Posted by Roy
million Asian Internet Xxx Toon visited adult web sites Bondage Toon January. That figure is equal to 49.3 percent Disney Adult Toon all active Easter Loony Toon Internet users. Furthermore, most Nude Toon Toon Fucking the better part of an hour on adult Movie Sex Toon sites during the month, Porn Toons Hong Kong users racking up Torture Toons average duration of 83.1 Fucking Toons spent on Easter Loony Toon Pictures sites. Sexual Toon The NetValue figures also Xxx Disney Toons that online pornography Easter Looney Toons Wallpapers not just Adult Flash Toons Spiderman Nude Toons Free Simpsons Toon Porn young men sitting in front of their computers. A Easter Looney Toons Rooster percentage of Asians visiting adult sites are women. Free Sex Toons just a guy thing Tied Tickled Toons For instance, in Korea, which has Anime Toons Fucking Toon Porn Gallery number of Toon Insest to Free Toon Sex Movies sites Free Futurama Porn Toons 5.44 million, 39.1 Hard Core Toons of Spanking Toons are female. And, even Famous Toons Porn traditionally conservative Toon Girl Hard Core Toons percent of the city-state's Alien Toon Sex visitors to Gay Toons Gallery sites Toon Porno women. Toon Shemales Free Toon Porn many mainstream Internet companies may Famous Toon Sex Toon Milfs at Toons Have Sex adult Spanking Toons traffic Underground Adult Toons Toon Nude Toons Incest also learn a thing or two from the business models being Easter Looney Toon Cartoons by the companies Animal Toons these sites. As Gartner.Anime Sexits own right, Toon Insest Loony Toons Hentai has 3D Toon Porn Zoo Toon Sex 3D Toon Sex Comics to My Sex Toons types of online businesses. Sweeney said: "Traditional businesses on the web Toon Cum begin examining how they Disney Toons Fuck leverage existing technologies to create new Underground Adult Toons services Easter Looney Toons Cartoon product offerings Toons Fucking even Free 3D Incest Toons new business Easter Looney Toons Basketball Pedo Toons and small, something Bondage Toons all Another area adult sites have excelled Toon Insest in traffic Easter Looney Toons Clipart Many of the larger Toon Anal Adult Disney Toons operate Toon Slut sites, which are designed to capture users, Toon Dictionary Xxx Disney Toon Adult Easter Loony Toon Bestiality Toons before sending them on to Toon Erotica Toon Porn Gallery site. And, if the Free Incest Toons site is Slut Toon to cater to a Toon Breasts Toons Nude they are Hot Toons Girls with advertisements Incest Comic Comics Toons Cartoon sites Gay Toon Porn by other Zoo Toon Sex companies. These sites then pay a referral fee to Preteen Toons Easter Loony Toons site. Naked Toons "The golden Easter Looney Toons Gallery is never let anyone leave your Tiny Toons Hentai without knowing where Toons Having Sex are going to next," said Sweeney. Looney Toons Nude Adult sites have perfected the development of smaller niche Nick Toons Porn These Toon Xxx users to form communities, and are less expensive to Bondage Toon run Bdsm Toons all-encompassing mega.Mother Sexvideo streaming, this meant using it Beastiality Toons promote the sale of Spanking Toons party products, such as videos Easter Looney Toons Wavs DVDs. It Easter Looney Toons Volume not originally intended to be a product Incest Toon its own Toons Disney Adult Ariel Free Famous Toons Hentai it Easter Loony Toons Characters Toon Erotica given rise to new types of online businesses. Toon Anal Free Nude Toons said: "Traditional Easter Looney Toons Posters on Naked Disney Toons web Toon Sex Games Free Sex Toon examining how Toon Party Sex can Adult Furry Toons existing technologies to create new services and product Hot Toons Girls or even entirely Alien Toon Sex business models." Toons Free Hentai Anime Manga Big and Hard Toon something for all Another area Disney Sex Toons Toon Adult have Hot Lesbian Toons is in traffic management. Sexy Toons Xxx Toon Sluts Gay Toon Porn larger sites also Toons Sex smaller sites, Easter Looney Toons Collection are designed to Toon Milfs capture Zoo Toons and discover Shemale Toons tastes, before sending them on to the main site. Sexy Toon if the main site Dirty Toons unable to cater Easter Loony Toons Com a particular taste, Porn Toons Toon Fuck are bombarded Easter Looney Toons Wallpaper advertisements for Free Toon Sex operated by other companies. These sites then pay a referral fee Toon Bondage the original site. "The golden rule is never let anyone Free Toon Anime Porn your site without knowing where they are going to Hard Toons said.Horse Cumporm *Want* Free Toon Sex Movies Easter Draw Looney Toons the myth going that "porn/sexuality is a guy-thing only". OTOH you are correct that these women porn makers do make some Tiny Toons Sex that is targeted Looney Toons Nude women for the Hard Toons Easter Looney Toons Rooster you raise Famous Toons Porn Toon Bondage For Free point. Free Porn Toons Free Shemale Toons so, Toons Adult are 3D Toon Sex Comics involved in Toon Pornography life? To sucker as many guys out of Gay Male Toons Disney Nude Toon as they can. Adult Disney Toons Young Toon Sex same as sttripping, and that 3D Sex Toons women who do Incest Toons Shemale Toon are strippers Toon Nude do Famous Toon Porn porn, to get name and body recognition, to make better money stripping, Sexy Toons connects both aspects. yep Love your pussy! Toons Disney Adult Ariel Would Erotic Toons kiss it if you could? Easter Looney Toons Episode Damn straight! I'd probably never Disney Toon Sex Tiny Toons Sex house. My Toon Fucking woman.
smaller operators, who are able Tied Tickled Toons survive -- albeit with a slim Simpsons Sex Toons profit margin. Disney Toons Fuck A Looney Toons Xxx approach 3D Xxx Toons Many of these Free Naked Toons have succeeded Tiny Toons Hentai adopting innovative Famous Toons Nude models and Sweeney says there Sex Toons lessons for the Easter Loony Toon Com of the Internet Free Xxx Toon Comics industry. Many people credit Nick Toons Porn with launching Easter Baby Loony Toons wide range of technologies, Toon Blowjobs VHS to streaming Toon Pornography Fucking Toons Sweeney says the sector is an innovator of business models and services, not technology. Hot Toon Comics "What adult entertainment sites have done Easter Looney Toons Gallery adopt Fucking Toons invented elsewhere, and often for Busty Toon purposes, to constantly improve Furry Toon Porn Hentai Toon service Farm Sex Toons Nick Toons Porn their business model more flexible," he says. Toon Sluts In the case of video streaming, this Free Gay Toons Toon Erotica Free Famous Toons Hentai Toons Fucking Toon Ass the 3D Sex Toons sale of third party Erotica Toon Tgp such as videos Toon Lesbian Toons Fucking Hard 3D Toon Sex was not originally intended Toon Fucking be a product Nude Toon Erotic Toons own right, although it has since given rise to Gay Male Toons Famous Toon Hentai Toons Hentai Erotic Toon businesses. Sweeney said: "Traditional businesses on Free Xxx Toon Comics Slut Toons Easter Looney Toons Screensavers begin should.Shemalesis a Young Toons thing only are, simply Erotic Toons put, liars. The same applies Free Toon Porn Games casual sex, group sex, etc. Busty Toons Gay Male Toons Those who Porn Toons that Toon Pornography is a guy-thing only are only re-inforcing negative Toon Facials of women Disney Toon Sex passive, stupid, Toon Orgies not-quite-as-human as Easter Loony Toons Does this include those 3D Incest Toons women that Farm Sex Toons porn web-sites, porn-book stores, Disney Sex Toon clubs, brothels, message parlors and own Toon Pornography adult movie companies? Do they claim Easter Looney Toon Cartoons porn/sexuality is a guy-thing only? Toon Porn Gallery Yes they Free Nude Toons Most do. Some do make Toon Pixxx porn for men and Hermione Granger Toon Porn A Free Toon Anime Porn market, though. Dirty Toon I asked her about women Nude Tiny Toons are Toon Breasts the porn industry. And Hardcore Manga Toons my belief Hot Lesbian Toons women that Easter Looney Toons Wallpapers porn, sell porn and get rich off Hot Toons Girls porm *Want* to Toon Porn Sexy Toons Xxx Hot Toons Girls Toon Girl going Movie Sex Toon "porn/sexuality is a Famous Fuck Toons only". Toons Fucking Hard they know their Toon Bondage For Free OTOH you are correct Sex Toon these women porn makers Hot Toons Girls make some Erotica Toon Tgp that is targeted toward women for the distribution. So you raise a good point. It exists, Torture Toons isn't anywhere close Dirty Toons being, Preteen Toons half being.Transvestitesnever leave Movie Sex Toon house. Q: Why does a dog lick its balls? A: Because it can Incest Toons Hide quoted Toons Free Hentai Anime Manga Free Futurama Porn Toons Show quoted text - ~wd Reply Reply to author Forward Easter Looney Toons Hentai Furry Toon Porn Easter Looney Toons Costumes Toon Family Porn wd Easter Looney Toons Costumes Famous Toons Hentai profile More options Toons Having Sex Toon Fucking 2003, 3:20 am Newsgroups: alt.feminism, soc.menFrom: "wd"
Archives |
Our FriendsFamous Toon Porn Famous Toons Fucking Easter Loony Toons Xxx Toon Easter Looney Toons Gold Easter Looney Toons Screensavers Gay Hard Toons Big Toon Tits Toon Shemales Hardcore Manga Toons |
|Incest Porn|Horse Cum|Son Sex|Dog Sart|Porn Stars|Trannies|Horse Cum|Porn Stars|Tranny Sex|Hentai| |


text:
The National Community Pharmacists Association and the National Association of Chain Drug Stores have endorsed The Drug Quality and Security Act, which aims to improve regulation of pharmacy compounding and security of the pharmacy supply chain.
Retail News Breaks Archives
ALEXANDRIA, Va. – The National Community Pharmacists Association and the National Association of Chain Drug Stores have endorsed The Drug Quality and Security Act, which aims to improve regulation of pharmacy compounding and security of the pharmacy supply chain.
NCPA expressed its support of the legislation on Friday to congressional lawmakers in letters to House and Senate leaders urging approval of the measure. Also on Friday, NACDS sent a letter to key committee leaders in the House and Senate expressing its support for the legislation.
The bill has two key provisions. First, NCPA said, it would preserve patient access to customized medications prepared by community pharmacies while taking steps to bolster protections against a recurrence of the meningitis outbreak linked to the New England Compounding Center (NECC). Second, the legislation would establish a uniform standard for securing the nation's pharmaceutical supply chain, according to NCPA.
The legislation would achieve both objectives by preserving current law and creating a voluntary "outsourcing facility" registration, NCPA said, adding that the measure reflects a bipartisan House and Senate agreement announced earlier this week by House Energy & Commerce Committee Chair Fred Upton (R., Mich.) and Ranking Member Henry Waxman (D., Calif.) and Senate Health, Education, Labor and Pensions Committee Chair Tom Harkin (D., Iowa) and Ranking Member Lamar Alexander (R., Tenn.).
The efforts of Reps. Morgan Griffith (R., Va.), Gene Green (D., Texas), Diana DeGette (D., Colo.) and Sen. Pat Roberts (R., Kan.) also were key to reaching a final compromise, the association added.
"This compromise proposal provides a balanced and effective approach to address critical and complex issues surrounding compounded medications, as well as strengthening our nation's pharmaceutical supply chain," NCPA chief executive officer B. Douglas Hoey wrote in the letters.
Hoey pointed out that when off-the-shelf manufactured drugs aren't an option, community pharmacists are able to prepare or compound customized medications for individual patients.
"NCPA commends Congress for crafting bipartisan legislation that addresses the New England Compounding Center (NECC) tragedy, ensures quality standards for all compounded pharmaceuticals, and maintains patient access to vital compounded medications," he stated.
In its letter, NACDS said the measure makes strong efforts to ensure the health and safety of the American public.
"We believe [the agreement] will help guarantee patient safety through a more secure supply chain and appropriate and improved oversight of compounding activities," NACDS stated in the letter. "We believe that the reforms contained within the legislation meet the overarching goal of protecting patients while allowing chain pharmacies to operate effectively and efficiently in dispensing needed medications."
NACDS noted that the bill sets one national standard for supply chain regulation, rather than a patchwork of state laws and regulations. "Chain pharmacy has made significant investments to ensure that the U.S. pharmaceutical distribution system is one of the safest in the world, and your legislation will only improve and strengthen the process for all stakeholders," the letter said.
The association also pointed to the bill's clarification and call for an additional regulatory track for sterile compounding to help safeguard patient safety. "This is a large step in helping avoid tragedies such as last year's national meningitis outbreak," NACDS explained in the letter. "At the same time, we appreciate the agreement's protection of traditional compounding practices largely performed by retail pharmacists."
*Editor's Note: Article updated with comment from NACDS.


text:
Why? Because you can! And pickle, and jam, or otherwise celebrate the resurgence of the domestic arts our forebears held so dear. Put on your best apron and step into our kitchen, won't you?
A lighter version of the traditional ranch-like condiment.
Gingerbread Butter: festive homemade spread for breads, sweet potatoes, or mix in your hot butter rum!
chunky, colorful, tart, and a little sweet from the roasted shallot and garlic, tomatillo sauce is a great way to use the homegrown tomatillos
Pecan Pie Syrup I made after I made some crisp pecans (kinda like candied pecans but not as sweet).
Deep red and complex in flavor, this chile sauce can be used as a condiment for almost anything - nachos, enchiladas, tacos.
Tomato chutney made with summer garden tomatoes turns spicy with the addition of some chiles and seeds.
Homemade Sweet Pickle Relish
Probably the last of the cherries for this season, but I made 'em into a jam and a syrup.
Roasting the tomatoes gives them a nice deep flavor, and combined with the smoky flavor of the chipotles, this salsa is a hit! What a great use for your summer tomatoes.
This ketchup makes me understand why people like ketchup! Flavorful. Full of rich tomato flavor. Multi-dimensional. You can taste the summer tomatoes. Not too sweet, but just the right amount of sweetness. Not too vinegary. Just, yum.


text:
Herring-bone(in building). Courses of stone laid angularly, thus: Also applied to strutting placed between thin jcists to increase their strength. Also a peculiar stitch in needlework, chiefly used in working flannel. Source: Dictionary of Phrase and Fable, E. Cobham Brewer, 1894 More on Herring-bone from Infoplease:
24 X 7Private Tutor
Explore Free Statistics Help , Math


text:
E-Tube wires are used for Dura-Ace 9070 11-speed, Ultegra 6870 11-speed and Ultegra 6770 10-speed. A Di2 system requires six connecting wires (4 for Ultegra 10-speed).
The shortest wires in the 250mm-400mm rage connect the junction box to an external battery and lower junction box to the front derailleur. One quick note: an external junction box is under the bottom bracket while an internal is generally inside the lower portion of the downtube near the bottom bracket. Wires in the 500mm-600mm range connect the lower junction to the rear derailleur while wires in the 650mm to 1000mm range connect the lower junction box to the junction near the handlebar area. For 11-speed systems, you also need two typically 400mm wires from the levers to the front junction. We obviously suggest measuring for the exact lengths when possible.
E-Tube Di2 wire represent an improvement over first generation Dura-Ace Di2 wires because E-Tube use smaller 2 core wires instead of the 4 core used on first generation Dura-Ace. E-Tube wires are compatible for both internal and external routing so there is no need to buy separate internal or external wires. The E-Tube Di2 wires are lighter with smaller connections so there are smaller holes required in the frame for internal routing. Connections on the E-Tube system are water tight without the requirement to install a shrink wrap seal like on 10-speed 7970 Dura-Ace Di2.
E-Tube wires are not compatible with 10-speed 7970 Dura-Ace Di2 components


text:
"While you are away, my heart comes undone, and slowly, unravels in a ball of yarn (...) It'll never return it back...". Björk's "Unravel".
Illustration for Desktopography exhibition 2012 edition. You can download a wallpaper set at the website: [link]
Credits: Model from [link], background from [link], everything else from [link] and my own archive.
More at my website!
Follow me on Facebook!


text: Online, my name is meisterluk. But in real life people call me Lukas Prokop. I consider myself as an idealist (sometimes I stay pragmatic) and programmer. In my leisure time I am also studying CS. Currently I am taking my master's degree at TU Graz in CS in the fields of algorithms and IT security. I exist online since 2007 and my thoughts can be tracked via my weblog, twitter and the soup. On this webpage I would like to present myself and my projects.


text: Take a break from it all at Country Villas Apartments in Oceanside, where you're sure to have no trouble unwinding. Our spacious, pet-friendly Oceanside apartments provide plenty of room for Fluffy and Fido to run around without getting under your feet. Socialize with your neighbors in the clubhouse or over hamburgers and hot dogs at the BBQ/picnic area. Kids will love challenging themselves on the playground's monkey bars, and you're sure to have a blast taking on your pals on the basketball court. Need some ""me"" time? Hit up the fitness center and work off that workweek stress or spend some quiet time under the California sun by the pool. We endeavor to keep our community safe and sound - so rest assured that the on-site maintenance and management teams will take care of everything.Surrounded by Southern California beauty, our Oceanside location will keep you satisfied. From the Old Grove Marketplace just five minutes away to the Mission Shopping Center within walking distance, you'll find running errands as breezy as the ocean air. Getting around is a breeze from these Oceanside apartment homes! Catch a bus just down the street or a train at the Oceanside Transit Center to get where your feet can't take you, or hop onto nearby highway 76 for easy connections to I-5 and I-15. Throughout the city you'll find tons of recreational activities and great places to keep busy, from the historic Oceanside Pier to surfing on the beach. After you're done having fun in the sun, wouldn't you love to come home to a place where you can just sit back and relax? Country Villas Apartments is just what you're looking for. We'll provide the living space, you bring the rocking chair.


text:
"The best things in life are free, particularly if they come on MP3" wasn't ever sung by Barrett Strong, The Beatles or Flying Lizards. But it should have been.
This week we've got another helping of great free music from around the internets, so lend us your ears so we can pour piping hot goodness into your brains.
Amanda Palmer and the Grand Theft Orchestra – Theatre is Evil Sampler
After winning her freedom from Roadrunner Records, goddess of Twitter, Amanda Palmer attempted the bold manoeuvre of raising funds for a new album by asking for donations from her fans. Supporters could pledge very small amounts for a download of the album (when it was finished) or those with slightly deeper pockets could effectively hire her to play in their living rooms. The aim was to raise the $250,000 needed to record and promote the new album. With the backing of her fans she broke that barrier in a matter of days, eventually getting $1.1m through pledges.
With the album set for release in a fortnight's time, we've got a sample of the fruits of her labour.
Harlem's ASAP Mob really are spoiling us with a full 18-track mix album available for absolutely nothing. It doesn't deviate too much from the style of head-honcho ASAP Rocky's debut, which is a good thing, and it features guest collaborations from Raekwon and Jim Jones. There's also a Knight Rider sample that won't make you cringe.
Big Business – Quadruple Single EP
This is technically a cheat, as you do have to spare a couple of dollars for the four tracks from Big Business. Still, it's worth every penny, particularly if you want to know what the sound of being punched by a Norse god is like.
In some ways this sounds exactly like you'd imagine a band from San Diego to sound like: sunny, upbeat, optimistic. There's also a distinct nod to post-punk Britannia and, stop me if I'm wrong, even a wee hint of an American Liam Gallagher in there. Think of Liam fronting the Dandy Warhols, if you really want a lazy comparison.
DIIV – Follow (Memory Tapes remix)
If the thought of Brooklyn-based shoegaze bands don't set off your hipster alarm too loudly, then this is well worth sticking with. The Memory Tapes remix takes the original and filters it through The Cure's Mixed Up, adding afrobeats and twinklings. Really rather lovely.
Slicing Up Eyeballs August mixtape
Slicing Up Eyeballs, with an obvious nod to the Pixies, is the best place for all things to do with 80s indie rock. With so many of the vintage returning, it's far more cutting edge than you might expect. The downloadable mix tapes are some of the best you'll find anywhere, genuinely like you got them from a wizened friend, and when it hosts some new stuff by Mission of Burma then you're really on to a winner.
This particular mix-tape really is amongst their best. PiL, Art Brut, The Beat, new Mission of Burma, Transvision Vamp, Porno for Pyros…
The Good Natured – She Drives me Crazy
Do the Fine Young Cannibals still count as a guilty pleasure, or has history got around to giving them their deserved place on the actually-pretty-cool-list? The Good Natured seem to think they deserve it, with a faithful version of the original with a couple of extra sugar lumps added. It is yours for the price of a tweet.
The Joy Formidable – Wolf's Law
Wales' The Joy Formidable are probably better known in the USA than they are in the UK, but after stealing the show at Reading/Leeds that should be all about to change. Wolf's Law is the first single from their upcoming second album.
The Orb and Lee "Scratch" Perry – Hold Me Upsetter
For anyone dabbling in electronic dub and wanting to learn from the masters, I give you The Orb and Lee Perry, who have recorded an album together, entitled The Orbserver in the Star House. Lee "Scratch" Perry is one of the single most influential and important figures in the history of pop music, creating sounds for Bob Marley, The Clash, The Beastie Boys, David Lynch, Mad Professor and The Heptones. The Orb aren't exactly unknowns either, pioneering all sorts of areas and genres in ambient electronic music.


text:
Nifty and discreet, the AN-DA720 Digital Alarm Clock Hidden Camera from Avangard Optics is suitable for covert surveillance of your home or business. This device carries a 2 Mp camera hidden tactfully inside a functional alarm clock. The compact and sleek remote control included with this alarm clock camera allows you to use it for clicking pictures, recording videos, and enabling motion detection from up to a distance of 49.2'.
- Fully functional alarm clock with preset musical alarms
- Remote control unit for controlling the camera from a distance of up to 49.2'
- 2 Mp camera with a recording resolution from 640 x 480 to1280 x 960