text:
'use strict';

process.env.NODE_ENV = 'test';

var Shortid = require('shortid'),
    merge = require('merge'), // to merge two objects
    expect = require("chai").expect,
    should = require('chai').should(),
    assert = require('chai').assert,
    mongoose = require('mongoose'), // mongo connection
    constants = require('../config/constants'),
    GameModel = require('../model/game'),
    isValidDate,
    newGameData,
    gameModel;

isValidDate = function(d) {
    if (Object.prototype.toString.call(d) === "[object Date]") {
        if (isNaN(d.getTime())) {
            return false;
        }
        else {
            return true;
        }
    }
    else {
        return false;
    }
};

describe('model/game.js', function() {

    beforeEach(function(done) {
        constants.token.player1 = 'x';
        constants.token.player2 = 'o';
        constants.status.inprogress = 'inprogress';
        constants.status.finished = 'finished';
        constants.status.prestart = 'prestart';
        constants.status.ready = 'ready';
        constants.result.draw = 'draw';
        constants.player1 = 'player1';
        constants.player2 = 'player2';

        // standard game parameter for most tests
        newGameData = {
            player1: 'player_1',
            player2: 'player_2',
            fieldWidth: 3,
            fieldHeight: 3
        };

        gameModel = mongoose.model('Game');

        done();
    });

    describe('create()', function() {
        it('default values', function(done) {
            var newGameData1 = {
                    player1: 'player_1',
                    player2: 'player_2'
                };

            gameModel.create(newGameData1, function (err, game) {
                should.not.exist(err);

                expect(game.field).to.equal('');
                expect(game.fieldWidth).to.equal(10);
                expect(game.fieldHeight).to.equal(10);
                expect(game.activePlayer).to.equal('player1');
                expect(game.status).to.equal('prestart');
                expect(game.result).to.equal('');
                expect(game.created_at).to.be.null;
                assert.isArray(game.setCoord);
                expect(game.setCoord.length).to.equal(0);
                expect(game.moveCount).to.equal(0);
                expect(game.player1).to.equal('player_1');
                expect(game.player2).to.equal('player_2');

                done();
            });
        });
        it('field width and height', function(done) {
            var newGameData1 = merge(newGameData, {
                    fieldWidth: 20,
                    fieldHeight: 20
                });

            gameModel.create(newGameData1, function (err, game) {
                should.not.exist(err);
                expect(game.fieldWidth).to.equal(20);
                expect(game.fieldHeight).to.equal(20);
                done();
            });
        });
    });

    describe('getPiece() - private', function() {
        it('regular parameter', function() {
            expect(GameModel.getPiece('player1')).to.equal('x');
            expect(GameModel.getPiece('player2')).to.equal('o');
        });
        it('adapted constants', function() {

            constants.token.player1 = 'u';
            constants.token.player2 = 'e';

            expect(GameModel.getPiece('player1')).to.equal('u');
            expect(GameModel.getPiece('player2')).to.equal('e');
        });
        it('without parameter', function() {
            expect(GameModel.getPiece()).to.equal('o');
        });
        it('invalid parameter', function() {
            expect(GameModel.getPiece('player3000')).to.equal('o');
        });
    });

    describe('sortByPosition() - private', function() {
        it('sorting', function() {
            var input = [[2,4],[2,2],[2,6],[2,5],[1,2]];
            input.sort(GameModel.sortByPosition);

            expect(JSON.stringify(input)).to.equal('[[1,2],[2,2],[2,4],[2,5],[2,6]]');
        });
    });

    describe('initialize()', function() {
        it('field contents, gameId & created_at', function (done) {
            var fieldObj;

            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                expect(game.fieldWidth).to.equal(3);
                expect(game.fieldHeight).to.equal(3);

                game.initialize();

                expect(game.field).to.equal('[["","",""],["","",""],["","",""]]');
                expect(Shortid.isValid(game.gameId)).to.be.true;
                expect(isValidDate(game.created_at)).to.be.true;

                fieldObj = JSON.parse(game.field);
                expect(fieldObj).to.deep.equal([
                        [ '', '', ''],
                        [ '', '', ''],
                        [ '', '', '']
                    ]
                );
                done();
            });
        });
    });

    describe('makeMove()', function() {
        it('move count and status', function (done) {
            var moveData = {
                    x: 1,
                    y: 2
                };

            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                game.initialize();
                game.makeMove(moveData);

                expect(game.moveCount).to.equal(1);
                expect(game.status).to.equal('inprogress');

                done();
            });
        });
        it('move count and status adapted constants', function (done) {
            var moveData = {
                    x: 1,
                    y: 2
                };

            constants.status.inprogress = 'game-is-on';

            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                game.initialize();
                game.makeMove(moveData);

                expect(game.status).to.equal('game-is-on');

                done();
            });
        });
        it('piece position', function (done) {
            var moveData1 = {
                    x: 1,
                    y: 2
                },
                moveData2 = {
                    x: 1,
                    y: 1
                },
                moveData3 = {
                    x: 0,
                    y: 1
                };

            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                game.initialize();

                game.makeMove(moveData1);
                expect(game.field).to.equal('[["","",""],["","","x"],["","",""]]');

                game.makeMove(moveData2);
                expect(game.field).to.equal('[["","",""],["","x","x"],["","",""]]');

                game.makeMove(moveData3);
                expect(game.field).to.equal('[["","x",""],["","x","x"],["","",""]]');

                done();
            });
        });
    });

    describe('changeActivePlayer()', function() {
        it('active player', function (done) {
            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                game.changeActivePlayer();
                expect(game.activePlayer).to.equal('player2');

                game.changeActivePlayer();
                expect(game.activePlayer).to.equal('player1');

                done();
            });
        });
        it('active player adapted constants', function (done) {

            constants.player1 = 'player-number-one';
            constants.player2 = 'player-number-two';

            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                // because gameSchema.activePlayer is executed before changing the constants, we have to cheat here ...
                game.activePlayer = 'player-number-one';

                game.changeActivePlayer();
                expect(game.activePlayer).to.equal('player-number-two');

                game.changeActivePlayer();
                expect(game.activePlayer).to.equal('player-number-one');

                done();
            });
        });
    });

    describe('validateMoveData() & getValidateMoveDataError()', function() {
        it('valid parameter', function (done) {
            var moveData = {
                    x: 1,
                    y: 2,
                    username: 'player_1'
                };

            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                game.initialize();

                expect(game.validateMoveData(moveData)).to.be.true;
                expect(game.getValidateMoveDataError()).to.deep.equal({
                    text: '',
                    key: ''
                });

                done();
            });
        });
        it('game status finished', function (done) {
            var moveData = {
                    x: 1,
                    y: 2,
                    username: 'player_1'
                };

            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                game.initialize();

                game.status = 'finished';

                expect(game.validateMoveData(moveData)).to.be.false;
                expect(game.getValidateMoveDataError()).to.deep.equal({
                    text: 'this game is already over',
                    key: 'game_0003'
                });

                done();
            });
        });
        it('game status finished adapted constants', function (done) {
            var moveData = {
                    x: 1,
                    y: 2,
                    username: 'player_1'
                };

            constants.status.finished = 'game-is-finished';

            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                game.initialize();

                game.status = 'game-is-finished';

                expect(game.validateMoveData(moveData)).to.be.false;
                expect(game.getValidateMoveDataError()).to.deep.equal({
                    text: 'this game is already over',
                    key: 'game_0003'
                });

                done();
            });
        });
        it('wrong active player', function (done) {
            var moveData = {
                    x: 1,
                    y: 2,
                    username: 'player_2'
                };

            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                game.initialize();

                expect(game.validateMoveData(moveData)).to.be.false;
                expect(game.getValidateMoveDataError()).to.deep.equal({
                    text: 'it is not your turn',
                    key: 'game_0004'
                });

                done();
            });
        });
        it('coordinates out of bounds', function (done) {
            var moveData = {
                    x: 10,
                    y: 20,
                    username: 'player_1'
                };

            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                game.initialize();

                expect(game.validateMoveData(moveData)).to.be.false;
                expect(game.getValidateMoveDataError()).to.deep.equal({
                    text: 'coordinates are not within bounds',
                    key: 'game_0005'
                });

                done();
            });
        });
        it('slot already used', function (done) {
            var moveData = {
                    x: 1,
                    y: 1,
                    username: 'player_1'
                };

            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                game.initialize();

                game.field = '[["","",""],["","x",""],["","",""]]';

                expect(game.validateMoveData(moveData)).to.be.false;
                expect(game.getValidateMoveDataError()).to.deep.equal({
                    text: 'slot 1/1 cannot be used',
                    key: 'game_0006'
                });

                done();
            });
        });
    });

    describe('validateMoveDataPlayer()', function() {
        it('valid parameter', function (done) {

            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                game.initialize();

                expect(game.validateMoveDataPlayer('player_1')).to.be.true;
                expect(game.validateMoveDataPlayer('player_2')).to.be.false;

                game.activePlayer = 'player2';

                expect(game.validateMoveDataPlayer('player_1')).to.be.false;
                expect(game.validateMoveDataPlayer('player_2')).to.be.true;

                done();
            });
        });
        it('valid parameter adapted constants', function (done) {

            constants.player1 = 'player-number-one';
            constants.player2 = 'player-number-two';

            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                game.initialize();

                // because gameSchema.activePlayer is executed before changing the constants, we have to cheat here ...
                game.activePlayer = 'player-number-one';

                expect(game.validateMoveDataPlayer('player_1')).to.be.true;
                expect(game.validateMoveDataPlayer('player_2')).to.be.false;

                game.activePlayer = 'player-number-two';

                expect(game.validateMoveDataPlayer('player_1')).to.be.false;
                expect(game.validateMoveDataPlayer('player_2')).to.be.true;

                done();
            });
        });
    });

    describe('validateMoveDataInsideBounds()', function() {
        it('valid parameters', function (done) {

            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                game.initialize();

                expect(game.validateMoveDataInsideBounds(1, 1)).to.be.true;
                expect(game.validateMoveDataInsideBounds(2, 2)).to.be.true;
                expect(game.validateMoveDataInsideBounds(0, 2)).to.be.true;

                done();
            });
        });
        it('invalid parameters', function (done) {

            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                game.initialize();

                expect(game.validateMoveDataInsideBounds(10, 10)).to.be.false;
                expect(game.validateMoveDataInsideBounds(-1, -1)).to.be.false;

                done();
            });
        });
    });

    describe('validateMoveDataSlotAvailable()', function() {
        it('valid parameters', function (done) {

            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                game.initialize();

                expect(game.validateMoveDataSlotAvailable(1, 1)).to.be.true;
                expect(game.validateMoveDataSlotAvailable(2, 2)).to.be.true;
                expect(game.validateMoveDataSlotAvailable(0, 2)).to.be.true;

                done();
            });
        });
        it('invalid parameters', function (done) {

            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                game.initialize();

                game.field = '[["o","",""],["","x",""],["","o",""]]';

                expect(game.validateMoveDataSlotAvailable(1, 1)).to.be.false;
                expect(game.validateMoveDataSlotAvailable(0, 0)).to.be.false;
                expect(game.validateMoveDataSlotAvailable(2, 1)).to.be.false;

                done();
            });
        });
    });

    describe('finishGame()', function() {
        it('valid parameters', function (done) {

            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                game.initialize();
                game.finishGame('draw');

                expect(game.status).to.equal('finished');
                expect(game.result).to.equal('draw');
                assert.isArray(game.setCoord);
                expect(game.setCoord.length).to.equal(0);

                done();
            });
        });
        it('valid parameters adapted constants', function (done) {

            constants.status.finished = 'game-is-finished';
            constants.result.draw = 'game-ended-draw';

            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                game.initialize();
                game.finishGame('game-ended-draw');

                expect(game.status).to.equal('game-is-finished');
                expect(game.result).to.equal('game-ended-draw');

                done();
            });
        });
        it('width coordinates', function (done) {

            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                game.initialize();
                game.finishGame('draw', [ [0, 0], [1, 1], [2, 2] ]);

                assert.isArray(game.setCoord);
                expect(game.setCoord.length).to.equal(3);
                expect(game.setCoord[0]).to.deep.equal([0, 0]);
                expect(game.setCoord[1]).to.deep.equal([1, 1]);
                expect(game.setCoord[2]).to.deep.equal([2, 2]);

                done();
            });
        });
    });

    describe('usernameToPlayerX()', function() {
        it('valid parameters', function (done) {

            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                game.initialize();

                expect(game.usernameToPlayerX('player_1')).to.equal('player1');
                expect(game.usernameToPlayerX('player_2')).to.equal('player2');

                done();
            });
        });
        it('valid parameters adapted constants', function (done) {

            constants.player1 = 'player-number-one';
            constants.player2 = 'player-number-two';

            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                game.initialize();

                expect(game.usernameToPlayerX('player_1')).to.equal('player-number-one');
                expect(game.usernameToPlayerX('player_2')).to.equal('player-number-two');

                done();
            });
        });
    });

    describe('checkForDraw()', function() {
        it('move count', function (done) {

            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                game.initialize();

                game.moveCount = 5;
                expect(game.checkForDraw()).to.be.false;

                game.moveCount = 99;
                expect(game.checkForDraw()).to.be.false;

                expect(game.result).not.to.equal('draw');

                game.moveCount = 9;
                expect(game.checkForDraw()).to.be.true;

                expect(game.result).to.equal('draw');

                done();
            });
        });
    });

    describe('forfeit()', function() {
        it('player1', function (done) {
            var moveData = {
                    x: 1,
                    y: 2,
                    username: 'player_1'
                };

            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                game.initialize();

                game.forfeit(moveData);
                expect(game.result).to.equal('forfeit_player1');
                expect(game.status).to.equal('finished');
                assert.isArray(game.setCoord);
                expect(game.setCoord.length).to.equal(0);

                done();
            });
        });
        it('player2', function (done) {
            var moveData = {
                    x: 1,
                    y: 2,
                    username: 'player_2'
                };

            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                game.initialize();

                game.forfeit(moveData);
                expect(game.result).to.equal('forfeit_player2');
                expect(game.status).to.equal('finished');
                assert.isArray(game.setCoord);
                expect(game.setCoord.length).to.equal(0);

                done();
            });
        });
    });

    describe('acceptChallenge()', function() {
        it('valid parameter', function (done) {

            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                game.initialize();

                game.acceptChallenge('player_2').then(function() {
                    // resolve callback
                    expect(game.status).to.equal('ready');
                    done();
                }, function(error) {
                    // error callback
                    should.not.exist(error);
                    done();
                });

            });
        });
        it('valid parameter adapted constants', function (done) {

            constants.status.prestart = 'game-is-prestart';
            constants.status.ready = 'game-is-ready';

            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                game.initialize();

                game.status = 'game-is-prestart';

                game.acceptChallenge('player_2').then(function() {
                    // resolve callback
                    expect(game.status).to.equal('game-is-ready');
                    done();
                }, function(error) {
                    // error callback
                    should.not.exist(error);
                    done();
                });
            });
        });
        it('invalid player', function (done) {

            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                game.initialize();

                game.status = 'prestart';

                game.acceptChallenge('another-cool-player').then(function() {
                    // resolve callback
                    assert.notOk(true, 'failed');

                    done();
                }, function(error) {
                    // error callback
                    should.exist(error);
                    expect(error.text).to.equal('cannot accept challenge of game if user is not the challengee');
                    expect(error.key).to.equal('game_0016');

                    done();
                });
            });
        });
        it('invalid game status', function (done) {

            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                game.initialize();

                game.status = 'finished';

                game.acceptChallenge('player_2').then(function() {
                    // resolve callback
                    assert.notOk(true, 'failed');
                    done();
                }, function(error) {
                    // error callback
                    should.exist(error);
                    expect(error.text).to.equal('cannot accept challenge of game if status is not "prestart"');
                    expect(error.key).to.equal('game_0017');
                    done();
                });
            });
        });
        it('invalid game status adapted constants', function (done) {

            constants.status.prestart = 'game-is-prestart';

            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                game.initialize();

                game.status = 'finished';

                game.acceptChallenge('player_2').then(function() {
                    // resolve callback
                    assert.notOk(true, 'failed');
                    done();
                }, function(error) {
                    // error callback
                    should.exist(error);
                    expect(error.text).to.equal('cannot accept challenge of game if status is not "prestart"');
                    expect(error.key).to.equal('game_0017');
                    done();
                });
            });
        });
    });

    describe('sanitizeForOutput()', function() {
        it('check output', function (done) {
            var sanitized;

            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                game.initialize();

                sanitized = game.sanitizeForOutput();

                expect(sanitized.created_at).to.be.an('undefined');
                expect(sanitized.__v).to.be.an('undefined');
                expect(sanitized._id).to.be.an('undefined');

                done();
            });
        });
    });

    describe('modifyField()', function() {
        it('valid parameters', function (done) {

            gameModel.create(newGameData, function (err, game) {
                should.not.exist(err);

                game.initialize();

                game.modifyField(1, 1, 'R');
                expect(game.field).to.equal('[["","",""],["","R",""],["","",""]]');

                game.modifyField(1, 1, 'P');
                game.modifyField(0, 1, 'Q');
                expect(game.field).to.equal('[["","Q",""],["","P",""],["","",""]]');

                done();
            });
        });
    });
});


text:
10 Years On, The Future Tense
30Mar 2018 29 Mar 2018
Not pictured: Me, on the rail, losing my shit, taking photos like this of R.E.M.
Man, we had no clue, did we?
R.E.M. released Accelerate upon the world and it was immediately hailed by major outlets and by some fans as a much needed "return to form." The incredibly disappointing Around the Sun (2004) had done much to dampen the spirits of the R.E.M. faithful, despite it finding vibrant new life live on stage during the Dubya years. What we really needed, we cried, was this! Upbeat rock 'n' roll! We had a Murmurs.com Survivor themed match, "killing" off a song every week until we had settled on a favorite. Long posts were published. Videos were filmed. Theories of tours and setlists abounded. We joined this weird thing called Twitter to follow remroaddawg's setlist tweets.
Imagine being in Athens while all your internet friends are watching Vince Moon's ninetynights footage. Oh that blur? That's obviously Five Points, Broad, and so on. Yeah, I've been to Philomath. I could see the Steeple from my workplace. The fabled trestle was still somewhat stable. Sure, I've been to the end of it. Nearly fell. Twenty years of my life flashed before my eyes. This is all absolutely true, by the way, here are photos.
And so when the album finally landed in America on April 1, 2008, it felt like everything that had been waiting in the wings finally converged into the purest, most ATHENS type thing I could've ever hoped to experience. I didn't miss it after all! The magic didn't dry up in the late 90s! The B-52s just put out Funplex! The Modern Skirts are playing new material from their upcoming album (due in October)! Venice is Sinking just recorded their third album and is currently working on their second (welcome to Athens). HOLY SHIT PYLON IS PLAYING AND I'M ON THE POSTER FOR THE SHOW.
Me, losing my shit at a Pylon show
Yeah, our President sucked and I was working nearly full time while going to school full time and also doing my radio show at WUOG at night. But the air was electric. Change was coming. So much happened so quickly that I started a little blog to try and record it all. I met Bertis that year, I voted for Obama, I celebrated Mike Mills' fiftieth birthday with him djaying for FOUR HOURS at WUOG. I saw my first and only R.E.M. show. I got PAID to write about MUSIC for Flagpole. What a weird, wonderful year.
Ten short years later and R.E.M. is gone as are Pylon and the Tasty World and the Modern Skirts and the Melting Point and nearly every single band I covered in my first two years as AMJ. My poor little blog was one of the lost music blogs of the mid-aughts, done in by my own need to work full time and not having the money or time for it.
But When I listen to Accelerate now, it's impossible for me to separate it from that time in my earliest twenties when everything was ahead of me. I could go into detail about how boringly pop and same sounding the first four tracks are, how the record was less a return to form than a return to radio friendly, etc. But I won't. Because "Sing for the Submarine" will do me in every time. Because "Houston" became relevant again far too soon. Because the lyric sheet for "I'm Gonna DJ" (ATL 08) is framed and sitting on my desk and sometimes it's okay to not pick every little thing apart.
Not all music is meant to last forever. Songs have to end. Life moves you along. Every day seems to be another chance for everything to fall into chaos. The President is somehow even worse than the Dubya years. We've all lost so many good people close to us. But I'm still here, somehow, and so are you. Twenty year old me could have never dreamed of the things I've gotten to do since '08. Hope is out there. To Wit…
'Cause if heaven does exist with a kickin' playlist, I don't wanna miss it at the end of the world. Let's go.
#rematl
Previous Coming This Week
Next You didn't miss it
« Oct Jul »

redpajama_set_name: RedPajamaCommonCrawl


I have been using Glip for project management system since 2014 and watched it improve. Have tried many many other options such as asana, slack. Most other options are too expensive or only have a portion of the features I'm looking for. Kept coming back to glip. The only features I'd love to have that are missing is a burn rate feature, integrated time tracking and more full on gant chart. I do know there are things such as harvest for time tracking but it seems to be time consuming and cumbersome to sync the projects, then go and track the hours. etc etc. And as a project manager I want to know how much of the budget is used, and gant chart to service my agile/scrum project management system. And I'd pay happily a monthly fee for these services. Thanks!


text:
2015, 3 stars, Action/Disaster
Jurassic World – 3 stars
Very much in the vein of Godzilla, Jurassic World is just gripping and exciting enough, you almost look past its flaws.
The script is cobbled-together from the Spielberg factory and is largely a knock-off. We come to the park with kids scarred by impending divorce bond (two, like in the first movie) where they are met by their aunt, a park executive, who has no parenting instincts (ala' Sam Neill, in the first movie). There is also a bad guy who wants to use velociraptors for, you guessed it, military purposes, and plenty of discussions about the ethics of all of this (much less impressive coming from the likes of B.D Wong and Chris Pratt, as opposed to Sir Richard Attenborough and Jeff Goldblum). And our heroes live because the dinosaurs fight amongst themselves (again, as in the first movie).
Speaking of Pratt, he's in a bit of bind here. Pratt's wheelhouse is a certain goofy but childishly masculine charm, best represented in Guardians of the Galaxy and Moneyball (as the confused, boyish catcher-turned-first-baseman). Here, when Pratt flashes that charm – mainly in banter with the aunt, Bryce Dallas Howard – he's fun to watch. But Pratt also tries to play it straight, and he simply lacks the gravitas to do so. A fair comparator is Bruce Willis, who went from the light comedy of TV and Moonlighting to the sarcastic aside of John McClane in the Die Hard flicks to a plausible straight hero. But Willis started late and had the rough look of an older man, coupled with a menace he could draw upon. Pratt ain't there yet and it's hard to tell when he is being serious or joking.
There's also a fair amount of lazy plotting. It is never adequately explained why certain features of the new, terrifying animal – Indominus Rex – were allowed to manifest themselves in the creature (such as its ability to think like George Patton) without also injecting a kill switch. Also, the response of the park staff is less professional than what you might get on a windy day at Busch Gardens, and if Busch Gardens keeps you on a metal track for the Old Time Antique Car Ride, there is no way a park would allow its patrons to self-navigate dinosaurs in one of these:
Still, this is an easy and fun movie which, at last count, has made enough dough to bail out Greece.


text:
Q: Cofinality of a set Let $(I, \leq)$ be a directed set. Suppose that $I$ has uncountable cofinality and that one can decompose $I$ as a countable union $I = \bigcup_{n = 0}^\infty I_n$, is it true that at least one of the $I_n$ is cofinal in $I$?

A: No: let $I := \omega_1 \times \omega \space$ with the product order, i.e. $(\alpha, n) \le (\beta, m)$, if $\alpha \le \beta$ and $ n\le m$. It is easy to see that $(I, \le)$ is directed and has cofinality $\omega_1$.
It is $I = \bigcup_{n \in \omega} (\omega_1 \times \{n\})$, but no $\omega_1 \times \{n\}$ is cofinal in $I$.
On the positive side, we have that at least one of the $I_n$ is unbounded:
Assume not and choose for each $n \in \omega$ an upper bound $x_n$ of $I_n$. Then $\{x_n: n \in \omega\}$ is a countable set, which is cofinal in $I$.

redpajama_set_name: RedPajamaStackExchange


When we last wrote about Theresa May's deal, we urged the postponement of a vote on it. This was because MPs had been given less than a day to study a mass of new texts: a joint instrument, a unilateral declaration, a supplement to the framework for the future relationship and a new statement on the agreement as a whole. We said that the Government would do better to postpone the second "meaningful vote", and give the Commons time to study the documents, because trying to bounce it was bound to cause a backlash. So it proved. May lost her vote by a whopping margin of 149.
That was a fortnight ago. So now that MPs have had a chance to read the texts, what should they do when a third meaningful vote comes – as it could soon? Do those documents make any difference to the deal?
In some respects, we can't help regretting the advice we gave – because that last question is almost impossible to answer definitively. Get an opinion from a lawyer and you can always find another. Enter, from one wing, Messrs Cash, Howe and Raab of the European Research Group. They advise, for example, that the European Court of Justice could rule on the so-called "good faith" obligation. Enter, from another, Richard Ekins, Stephen Laws and Guglielmo Verdirame of Policy Exchange. They counsel, by contrast, that it could not.
Cash and company will raise you "Whaling in the Antarctic (Australia v. Japan)". Ekins and friends will trump that with "the Gabcikovo-Nagymaros Project (Hungary v. Slovakia)", or try to. Neither side agree about the Vienna Convention of the Law of Treaties. Before you know where you are, you are lost in a pullulating forest of legal jabberwocky – "good faith", "best endeavours", "mutual respect", "all appropriate measures". Instead of tiptoeing into it, you might as well have a whirl at something easier – such as ConservativeHome's new game: backstop bingo. Arbitration panel – load of flannel! Not worth a mention – Vienna Convention! There is a temptation to end up believing whatever you want to believe.
Now to say that a question is very hard to answer isn't to say that it isn't worth asking. On balance, Anthony Speaight, together with the Policy Exchange academics, makes a plausible case for suggesting Northern Ireland would not be locked permanently into the Single Market and Customs Union after the agreement of the joint instrument. Considered as a whole, the documents seem to suggest some movement. If you don't trust lawyers' pleas, watch politicians' body language. The Irish Government is very twitchy about the unilateral declaration.
For all that, it strains belief to imagine that dispute about the backstop will be settled in a court of law – with bewigged figures trading obscure terminology for huge fees. No: it will be decided by the same rough business that has shaped the Brexit negotiations to date: politics. Where does that leave MPs as a third meaningful vote looms tantalisingly into view?
The first point to make is that one cannot rule out a No Deal outcome. The Prime Minister made that point this week (while contradicting herself in the process). The EU could simply decide that there is no agreement on April 12, assuming that Parliament hasn't approved the deal by then. This is already the endpoint that Emmanuel Macron seems to want. But pro-Leave MPs cannot trust to the French President saving Brexit. Angela Merkel wants a deal. So does Leo Varadkar, who is gambling on one, since No Deal would pulverise Irish farming. Sensitivity to the interests of its smaller members has been a mark of the EU side of the negotiation to date.
Some Leavers previously argued, rather in the manner of the eBible Fellowship predicting the end of the world, that Brexit cannot be stopped and will happen on Friday. That judgement call doesn't look very sound this morning. Maybe we will leave the EU this week. But as we write, that looks marginally less likely, if anything, than the end of the world. Eurosceptics would be badly advised to trust in either coming on April 12.
What will happen instead? The likelihood is boiling down to May's deal or Letwin's deal, as we call it. We can't say much about the former that we haven't said before. It has its good points and its bad ones, mainly the backstop. The latter threatens either to trap the country in the Customs Union, thus wrecking the prospect of meaningful trade deals worldwide; or else allow the rest of the United Kingdom to leave it but compel Northern Ireland to remain it it, which has knock-on implications for Scotland and "our precious Union".
We believe that Brexit is more like a film than a photo – that's to say, where one is on day one isn't where one will be in year five. Leaving the EU is a process, not an event. The core problem with the backstop is that it freezes that film into Groundhog Day, thus obviating gains that the deal offers elsewhere – such as May's wins on money and borders, and her fighting the EU to a standstill over laws. The new legal documents, like love in the film, may offer a backstop escape. Or they may not. And doubtless there are nasties in the small print of the agreement that few have yet fastened on.
Letwin's deal is May's plus whatever the Commons slaps on top – formal Customs Union membership; Single Market membership too, perhaps. To remain in both would deliver Brexit de jure but not de facto. And such an outcome would leave little to negotiate in trade talks. We would have settled for high alignment and free movement. There would be little left to haggle about other than food and fish. For those who believe in Brexit, a Letwin deal is undoubtedly worse than May's deal. This is the logic that Jacob Rees-Mogg recognised in our Moggcast yesterday.
It may be that Parliament can't settle on either version. In which case we will, most likely, enter a long extension. A few Brexiteers actually want one. They think that it would give time to depose May, replace her with Boris Johnson or Dominic Raab, turn the ship round – and deliver SuperCanada. But the natural majority in the Commons is for a form of Norway, not one of Canada. One would need a new House to deliver it. That would mean a general election. Is it really likely that this would produce a pro-SuperCanada Commons? Might it not deliver a Marxist Government instead?
Indeed, a long extension, and a Commons unable to settle on any particular proposal, risks a second referendum. MPs, unable to agree what to do with the Brexit baby, would hurl it back from the Clock Tower at the voters, who have instructed them to nurse it.
We do not envy the Commons having to negotiate this maze. There is an argument for viewing a third meaningful vote as a moral question only. This site admires those MPs who have approached Brexit with conviction. The Prime Minister ought to be grateful to those who helped to sink the first meaningful vote – the Steve Bakers and Dominic Grieves, the Andrea Jenkyns' and the Justine Greenings. For without them, she would not have gained the joint instrument and unilateral declaration in which the Government now puts such emphasis. But politics is about pragmatism as well as principle. As that proto-Eurosceptic, Rab Butler, put it, politics is the art of the possible.
That conclusion has led us to a perhaps surprising place. Our practical concern is focused on the effect of any Brexit deal on public confidence in our political system. This site is committed to leaving the EU. But there is no gain from self-government if government itself loses the trust of voters. For government of any kind is impossible without trust. Trust is the cement in legitimacy. If Brexit happens, it may turn out well – or badly. But it is indisputable that the system's delivery of it has shaken trust in the system to its roots. Government, Opposition, Parliament, the civil service: all, to a greater or lesser degree, are implicated.
Inside Parliament, the pressure is on Conservative rebels to fold – or would be, were there still a functioning government. Some, like David Davis, have gone one way; then the other, and are weighing whether or not to reverse ferret. Others are feeling the pressure of May's chicken game. Exhausted, battered, bewildered, almost functionless, MPs could be forgiven for wanting to lie down until Brexit goes away. It won't. Debate on the Withdrawal Agreement is only a prelude to debate on the Political Declaration.
Outside it, the flavour is different. Voters may not understand good faith or best endeavours, meaningful votes or indicative votes, but they clock the people. They have a marvellous way of smelling a rat – of goggleboxing May's vacillation, Jeremy Corbyn's vacuity, Philip Hammond's evasiveness and negativity, Mark Francois' fixity, Michael Gove's fluidity, Johnson's ambition, Anna Soubry's grandstanding, the Cabinet's collective cowardice, the collapsed whipping, Letwin's wise follies, John Bercow's bias. Contrary to May's low-grade and self-destructive statement last week, the sum of polling doesn't suggest strong support for her deal.
Rather, voters are confused, exasperated – and wishing a plague on both Houses, Commons and Lords alike. Leaver and Remainer, No Dealer and Second Referendumer, they grasp a simple point. We were promised Brexit on March 29 over a hundred times. It isn't happening. Confronted by the No Deal fence, May shied from it. The future is obscure. Trust is savaged. And now it turns out that we must put off Brexit Day whether or not MPs vote to do so. Britain has a marvellous history of resisting demagogues, but the failure to negotiate an orderly Brexit may have opened the door to them. The grandmother of all public inquiries is coming. And senior civil servants are running for the hills.
So as they mull this dispiriting story, how should MPs prepare to vote – assuming that the Speaker allows them to at all? May's deal or Letwin's deal? From the point of view of principle, there is a case for holding out against the former, though the new legal texts have dented it. From that of pragmatism, the deal of the Prime Minister in Name Only is better than that of the Prime Minister in All But Name. And from that of trust in politics? The scarifying, lacerating truth is that we are past the point where it will make a difference.


This revolutionary degree is specifically for teachers of philosophy in schools, significantly those who ship, or wish to ship, the AQA A Level in Philosophy. By the end of the course, college students will have the ability to perceive the theoretical links between philosophy and psychology and could have information of debates regarding consciousness, functionalism and the pc mannequin of thoughts, mental causation, and different related subjects.
This programme is suited to anyone interested professionally or personally in questions in regards to the moral and political justification of education, educational aims and values in liberal societies, the nature of knowledge and understanding, and the tutorial implications of various philosophical traditions.
This programme allows college students to discover further the relevance of ethics, political philosophy, philosophy of mind and epistemology to modern academic issues and to carry philosophical considering to bear on their very own instructional issues including skilled apply.
The 1996 Education Act part 7 says that the parent of every child of obligatory school age shall trigger him to obtain efficient full-time training suitable to his age capability and aptitude and to any particular wants he might have either by common attendance at school or in any other case.
The centre is committed to rigorous exploration of a variety of philosophical approaches, encompassing such matters as the aims of education, teaching, learning, and the curriculum, democracy, citizenship, philosophy with children, new know-how, and the atmosphere.