The mandate of the Canadian Council of Deans of Science is to promote excellence in scientific research and education in all Canadian Universities, and to promote the importance of scientific research, education and literacy to all levels of government, industry and the public sector.
To be a forum for discussion and sharing of best practices about scientific research and education for Deans of Science across the country.
To develop and promote academic leadership.
To develop future scientific research, innovation and education capacity in Canada by training high quality personnel in scientific research and education to support economic growth and innovation across Canada.
To promote Canadian success in scientific research and education.
To promote scientific literacy in the Canadian population.
To be an advisory body for government on issues of scientific research, innovation and technology policy development.
To be an advisory body at appropriate venues to discuss the requirements needed to sustain high quality infrastructure to support fundamental scientific research and innovation across the country.
To be an advisory body for government on issues of scientific education at all levels across the country.


Travel + Leisure Magazine -- Salt Lake keeps racking up the "top listings" as voted on by the readers of Travel + Leisure magazine. Voters gave top awards to this Utah city for being both clean and safe. The same could be said for its best dining, which has a big emphasis on organics. Three great places to find it: Oasis, the all-vegetarian Sage's Café, and Forage, which recently won the Best New Chefs designation from Food & Wine. You can try them all without any fiscal anxiety: AFC voters gave the city the No. 2 spot for affordability.


1. At ISEF what do most guys wear?
3. It says they will give me 25 embossed abstracts, is that enough for all judges to get one, even ones that aren't judging my project.
4. How many grand award judge will I speak to?
5. Do you buy your name tag when you get to ISEF because I thought it said they cost $15?
6. Is the Sociology and Human Behavioral Sciences category an easier category to win in compared to the others?
Hi Tcoles - Congratulations on being named to go to ISEF.
I'm sorry your questions haven't been answered yet. I am working to find an expert who can address the ISEF questions you've raised here and give you a bit of insight into ISEF.
1.) You will definitely want to wear business formal at the ISEF. When I went, I wore a suit with a tie (you know, dress shoes, slacks, collared button-up shirt, tie, blazer jacket, etc.). You don't really need a blazer jacket, but as long as you're wearing everything else you will be fine. Remember, you want to dress to impress--you'll be speaking with judges, representatives from industry and the military, and the public, so you want to look your best.
2.) Yes, there are lots of younger children who come--many local schools have field trips to the fair, so be prepared to explain your project in simple terms. There will be people of virtually every age there, though, so be prepared to explain your project at varying levels of complexity. You want it to be interesting and cool to kids, but at the same time informative. Practicing really helped me before I went to the fair, so maybe you could try that.
3.) You will have that many abstracts so that you can hand them out to people. As I recall, your judges will already have a copy of your abstract which they will have read before they come to see you (they will be prepared to talk to you), but I may be mistaken. It is definitely not enough for all of the judges in the entire fair to have some, but it will certainly be enough for you to give your judges some, and also hand them out to the public at the open house, and other interested people. Also, when I was there, most of us had a few left over, so we exchanged abstracts with our signatures on them, sort of like an ISEF yearbook. If you have any left over, it may be fun to do that with the friends you make at the fair.
4.) The number of judges who will speak with you will probably be around 8, which is how many I spoke with. You will receive a card with a schedule of when the judges will be by to talk to you, so you'll know in advance how many there are and when they will be visiting you. In addition, there are special interest judges such as those from the military and industries who may or may not want to speak with you. There is a separate judging day for these people, and you may be completely ignored by these people (like I was--they didn't want to talk to virtually anyone in my category), or you may be very popular among those judges. For this day there is no schedule, because they just talk to anyone whose project looks interesting and profitable. If you have a project dealing with alternative energy sources, you will most likely be visited by lots of these judges.
5.) I do not believe I purchased my nametag...you're probably thinking of the registration fee. I had to travel to get to Albuquerque, so to be honest I arrived almost too late to register on the day I got there, so registration was a bit of a rush. However, for me the trip was paid in full by the science fair committee from the local fair I received top honors in, so you may not even have to worry about the registration fee. By the way, in addition to the nametag, you will also receive a medal which you should wear whenever you're presenting on the judging floor. This medal means that you've been to the ISEF before. You receive one for every year you are there, so you might see people with as many as four of these medals on, which is exciting!
6.) No category is easier to win in. Every category is scrutinized equally. However, there are some categories which are easier to win special interest awards in (like I said earlier, the alternative energy projects got their attention almost exclusively), but those judges are unscheduled and unpredictable. Basically, there is no easy way to win at ISEF--everyone is working just as hard to impress the judges. The true measure of if it is easy to impress judges or not is if your project is relatively more informative and sophisticated. If you did more work than others, then you will probably have an easier time, but this has nothing to do with what category you are in. For instance, my project was not very impressive because I did not have sophisticated measurements (they were actually rather crude), whereas someone who did something similar was more impressive because he used a better measurement tool and advanced mathematics to produce better, more relevant results. But there is no way to know if you project is better than others, so really this is also no way to see if it will be easier on you than others. Don't worry about it being easy to win--worry about doing your best in order to try to win. It's not all about winning, but if you can impress the judges and come away with an honor, that means you really did some world-class impressive work.
I hope that my answers have helped. Please feel free to ask anything else of me, I will certainly answer you! You're going to have a great time at ISEF, and want to go back again. I hope you're not a senior in high school like I was, because when it was over I was disappointed that I had not started doing science fairs earlier because I would have loved to go to ISEF more than once.
Hey thanks, that was very helpful!
Wow - qualifying to go to ISEF as a freshman is quite an achievement. Congratulations!
I've been an ISEF judge for a few years and I agree with everything said here. You definitely should be prepared to describe your project "to a 3rd grader". Being able to boil it down to its simplest form not only allows you to communicate it to more people but it also helps you get a handle on different elements of the project, as well. Put yourself in the position of that younger person, what do you think they would find cool about what you did? Believe it or not, the judges might find that pretty interesting, too.
Also agree that no category is necessarily easier or harder to win in. Some categories have a lot more projects than others, but the number of awards per category is scaled accordingly. My particular experience is with the computer science category. It has a relatively small number of entries but we aren't able to give out as many awards, either.
I've seen some projects in the compsci category that seem to have very little to do with computers. I don't know for certain, but it appears that the student figured they'd enter it into the smaller computer science category to improve their chances of winning. That's a bad idea for 2 reasons. First, like I said, fewer projects means fewer awards. Secondly, the judges aren't as likely to be familiar with the topic and therefore not as likely to recognize outstanding work.
So make sure your project is entered in the most appropriate category, prepare well, and count on having a great time. As a freshman, you'll have the opportunity to learn from the other projects you see there and get better each year.


text:
Theresa May Champion or Charlatan ?
Posted by roz on 9th October 2017
Tags: Charlatan, Comment, Conservatives, Housing, imjussayin.com, Labour Policies, Opinion, politics, Theresa May, Tory Party Conference 2017
Many find Theresa May's 2017 conference speech memorable for either her coughing fit or the P45 prank. However, it's her speech that I find memorable. Its liberal overture is a sharp contrast to her vile nationalism just 12 months before. So, I think they show Theresa May for the person she is. And whatever her current label, charlatan might have to be on the list.
Champion or Charlatan
The coughing and p45 have distracted from the content of May's speech. She says she entered politics to help the underprivileged but presides over policies that are inherently unfair.
A year ago against the soundtrack of Sam Cooke's A Change Is Gonna Come May delivered a blistering attack on immigrants. It was a shameful nationalist speech design to woo the hardest UKIP supporters. It did, making nationalism Government policy.
However, this year in a volte-face Theresa May is compassionate and liberal and speaking for the voiceless. Both cannot be true she is either a people's champion or a charlatan.
May said 'Never allow the Left to pretend they have a monopoly on compassion.' But I ask where is May's?
The UN has denounced our government's welfare policies for failing to protect people with disabilities. It's heartless and embarrassing for Britain which has the sixth largest economy in the world.
To 'incentivise,' people to work her government continue to cut and cap benefits despite the record levels of child poverty. In some cases, caps are so severe that the High Court has ruled some illegal.
May's speech also argues the value of the free market (buying and selling without regulation). She says that it 'ushered in the collapse of Communism' in the Soviet Union. However, it came with grinding poverty and the rise of the Russian far-right. Russian oligarchs meanwhile are living large in London and land banking.
In Britain, the free market has seen a 'record numbers of jobs' created and matched by a record number of people in work and receiving state benefits. It's reverse welfare. We are subsidising business wages.
And while May decries Jeremy Corbyn and Labour she adopts Labour policies once jeered by the Tories. May is promising to hold tuition fees which they tripled, and freeze energy prices and build social housing.
The £2bn for affordable housing with some council properties only provides 5% of homes needed. On the other hand, 'May is pumping £10bn into a housing policy that worsens the housing crisis: Help to Buy has kept house prices high, provides subsidies to a small number of people, and does nothing to address the chronic shortage of low-cost housing'.
May has been using EU citizens' like pawns but now say that their rights will be guaranteed. That differs from draft reports which says they will not have any rights to be reunited with their families at all. In the meanwhile, the government is charging them for sending an email for basic information.
Theresa May Be Not
So, quoting Jo Cox; wearing a bracelet of Frida Kahlo, a member of the Communist party who dated Trotsky; and sprouting Labour lite politics does not a liberal you make.
Theresa May is a mediocre individual sitting in high powered positions because of class and privilege. Yes, that applies to many Tories but May is championing 'equality.'
Theresa May wears many labels. The 'Iron Lady Mark 2' before the election. 'Strong and stable' during the election. 'Nationalist' during last year's party conference and 'Liberal' during this year's. Now May is the 'calm' leader. Personally, I think the most accurate label would be a charlatan. Don't you?
Editorial Policy: Use quotations from this article subject to a full credit of the source and a direct link to the article on imjussayin.com
AM says:
14th October 2017 at 21:35
An interesting read. I'd agree with charlatan!
I Became A Low Achiever In 24 Hours
Is Racism A Requirement For Being Tory?
Trump – Keep On Protesting to Protect
Grenfell Fire Is Not About Theresa May, It's Bigger

redpajama_set_name: RedPajamaCommonCrawl


Last week I was in the Caribbean for an energy medicine retreat and workshop. I did have some time away from our classroom to be out-of-doors, and I was stunned by how bright it was. The colors were so vivid! It was the tropics, with the sun directly overhead in midday. So much light! I kept encouraging myself to let as much light as I could into my eyes, not fighting it or squinting, just turning away or shading my eyes if it momentarily became too much. I thought about a time 15-plus years in the past when I had thick hard plastic contacts, which I wore all day long. Back then my eyes were extremely sensitive to light. I used the darkest sunglasses I could find when it was sunny, and it often still seemed too bright outside for me. Welcoming the light instead of resisting it was a big change!
The painted conch shell above was given to me by a charming island woman selling jewelry she had created, right outside our restaurant just above the beach. She was so warm and friendly the joy beamed out of her. I did go back later and buy a small bracelet of beads from her, but it really didn't feel like she had given me the shell just to drum up business. It seemed like she was overflowing with good happy energy, and only wanted to share it.
When I walked into the restaurant to get lunch with the painted shell in my hand, I felt like I had acquired a treasure. I closely examined the vibrant colors and the texture of the surface, my vision delighted. I thought again, as I had all week, that it's easier to look at details when there's a lot of light. So the optimums (objects you enjoy looking at and see more clearly than most things) are plentiful. It felt like seeing was much more of a pleasure than a struggle, that everything was interesting! So I kept looking at details, so found more to be curious about, so looked at smaller details, the positive visual cycle continuously reinforcing itself.
For years I've realized, and taught my vision clients, that "the more you look, the more you'll see". My goal with this was to increase visual awareness (my own and that of others), hoping to pull us back from that automatic-pilot way of going through life, toward being present. Yet this was a new dimension — I didn't have to coax my reluctant self to reach outside of my comfort zone and look, I wanted to look! And the more I looked, the better it felt — I became increasingly joyful, like an exuberant child. These purple flowers I saw on my way back to my room are one example. I stood in the middle of the sidewalk gazing at them like I was new to the planet and had never seen a flower before!
OK, since I don't plan to move to the tropics, how can I translate that clearer more relaxed tropical vision to my home environment in NY? The answer is a list of practices I've all thought of before: slow down, surround myself with friendly happy people, spend as much time in Nature as I can, focus on remaining relaxed. This last point is key for me. If I'm more relaxed, I'll have less fear and feel safer. If it feels safe to me to look, I'll look more and see more and see it clearer. I'm keeping the colorful shell handy on my desk to remind me of these healthy habits. Maybe I can have tropical vision in NY state after all!
Previous Previous post: How Important is Visualization?
Next Next post: I've Tried Everything!


text:
Boise Public Library helps parents, kids beat the 'summer slide'
By: Stephanie Hale-Lopez
With school out for the summer, students are at risk of losing academic skills they gained throughout the school year.
To help kids retain and even expand on the knowledge they gained during the school year, the Boise Public Library is hosting a variety of free summer programs.
"When kids get out of school, we are immediately flooded with community members and it's awesome," said Danielle Boyd, Youth Services Librarian at the Boise Public Library. "This is how we like it to be. We don't want it to be empty or quiet, we want them here doing fun things."
From a STEAM camp focused on science, technology, engineering, art and math, to summer reading programs, the library is helping students overcome summer learning loss.
Studies show that kids demonstrate roughly two months of grade-level equivalency loss in both reading and math during the summer months. Known as the "summer slide," something as simple as reading for at least 30 minutes a day can help curb it.
"We want to see a literate community and give everybody an opportunity to have books, and this way, they can come in and have fun programs for free and keep reading and doing academic pursuits in the summer," Boyd said.
For more information on programs available at Boise Public Library, click here.


text:
Truro Bearcats, Kentville Wildcats split double-header
Wildcats will get the nod for final playoff spot
SaltWire Network | Posted: Aug. 13, 2018, 12:48 p.m. | Updated: Aug. 13, 2018, 12:56 p.m. | 3 Min Read
TRURO, N.S. – The Truro Bearcats and Kentville Wildcats met Sunday at Truro's TAAC Grounds to square off in a Nova Scotia Senior Baseball League double-header that would go a long way toward determining which team will go on to the playoffs.
It didn't go Truro's way.
The Bearcats (7-21) dropped the opener 14-4 but came back in the second outing to post a 16-6 win for a split, but it wasn't enough to put them in a position to overtake the Wildcats (11-19), with three games left on their schedule.
Regardless, it would have been an uphill battle since those remaining three games are all against league-leading and unbeaten Dartmouth Moosehead Dry (25-0).
The Bearcats host the Dry this Sunday in a double-header with games at 1 p.m. and 4 p.m. The third game is a make-up contest from Thursday night's rainout and is in Dartmouth but is yet to be rescheduled.
Game 1:
Wildcats 14
Bearcats 4
The Wildcats were cruising with a 7-1 lead after five innings before Truro rallied for three in the seventh to make it 7-4. A six-run seventh for Kentville thought, which included a grand slam by Dryden Schofield, sealed the deal.
The Bearcats were outhit 12-5 by the visitors. The game ended after eight, due to the 10-run mercy rule.
Adam MacAloney, who took the loss on the mound for Truro, belted a second-inning homer, Adam Lombard had a pair of doubles and scored a run, while John Chapman also had two doubles and drove in a run.
For the Wildcats, Schofield added a single to his grand slam and finished with four runs driven in. Colby Turple and Cody Shrider also belted home runs for Kentville.
Wildcats 6
Bearcats 16
Is their second outing the Bearcats managed to turn the tables on Kentville in a big way, jumping out to a 5-1 lead after the second. The Wildcats closed the gap though and got to within a run as they trailed 7-6 after their at-bat in the eighth. The Bearcats poured it on though, scoring nine times in their half of the eighth and taking the win 16-6 by way of the 10-run mercy rule.
Chapman took the win on the mound, with Jeff Chisholm coming on in relief in the seventh.
At the plate, Lombard had four singles for Truro, to go with an RBI and three runs scored. Matt Mingo drove in four runs with a single and a double and Darson Murphy drove in three, with two doubles and a single. Chisholm and Shawn Mullins each had a pair of singles and two RBIs.
Brad Fuller was losing pitcher for Kentville, who got two doubles, a single and three RBIs from David MacIntyre.


text:
Q: D3 Pie chart arc is invisible in transition to 180° I've a pie chart build with d3 and svg. I use transitions on the d attribute of the svg path to animate changes in the pie chart. Is works as expected except when the target size of the arc is >=180°. Then the arc path is invisible during the transition.
Demonstration: http://jsbin.com/EXeXUXE/4/edit
I think this is because d3 produces invalid path information during the transition:
Error: Problem parsing d="M1.4082973068957338e-14,-230A230,230 0 0.0000013720000000000002,1 135.1904225457546,186.07396897283516L0,0Z"

Am I doing something wrong? Is this a bug and is there a way to work arround?
Thanks

A: The problem here is that d3.svg.arc() uses the A SVG path command to draw the elliptical arc. The format of that command is as follows.
A (rx ry x-axis-rotation large-arc-flag sweep-flag x y)+

The meaning of the individual parameters is not important, the only thing relevant here are large-arc-flag and sweep-flag. According to the SVG spec

*

*Of the four candidate arc sweeps, two will represent an arc sweep of greater than or equal to 180 degrees (the "large-arc"), and two will represent an arc sweep of less than or equal to 180 degrees (the "small-arc"). If large-arc-flag is '1', then one of the two larger arc sweeps will be chosen; otherwise, if large-arc-flag is '0', one of the smaller arc sweeps will be chosen,

*If sweep-flag is '1', then the arc will be drawn in a "positive-angle" direction (i.e., the ellipse formula x=cx+rx*cos(theta) and y=cy+ry*sin(theta) is evaluated such that theta starts at an angle corresponding to the current point and increases positively until the arc reaches (x,y)). A value of 0 causes the arc to be drawn in a "negative-angle" direction (i.e., theta starts at an angle value corresponding to the current point and decreases until the arc reaches (x,y)).

As their names suggest, these are flags, i.e. 0/1 values. This is what d3.svg.arc() generates. However when you interpolate between them using .transition() with the default path tween, D3 interprets them as numerical values and not as flags. The means that intermediate paths will have values between 0 and 1 for these flags, which are illegal. It is because of that that the parsing fails.
To fix, use a custom tween (which you need to use for radial paths anyway). See e.g. here for an example that shows you how to do it.

redpajama_set_name: RedPajamaStackExchange


text:
var comb = require("comb"),
    asyncArray = comb.async.array,
    isFunction = comb.isFunction,
    isUndefined = comb.isUndefined,
    isDefined = comb.isDefined,
    isBoolean = comb.isBoolean,
    isString = comb.isString,
    argsToArray = comb.argsToArray,
    isInstanceOf = comb.isInstanceOf,
    isHash = comb.isHash,
    when = comb.when,
    merge = comb.merge,
    toArray = comb.array.toArray,
    ModelError = require("./errors").ModelError,
    plugins = require("./plugins"),
    isUndefinedOrNull = comb.isUndefinedOrNull,
    AssociationPlugin = plugins.AssociationPlugin,
    QueryPlugin = plugins.QueryPlugin,
    Promise = comb.Promise,
    PromiseList = comb.PromiseList,
    HashTable = comb.collections.HashTable,
    hitch = comb.hitch,
    Middleware = comb.plugins.Middleware,
    EventEmitter = require("events").EventEmitter,
    util = require("util"),
    define = comb.define,
    patio;

var MODELS = new HashTable();

var applyColumnTransformMethod = function (val, meth) {
    return !isUndefinedOrNull(meth) ? isFunction(val[meth]) ? val[meth] : isFunction(comb[meth]) ? comb[meth](val) : val : val;
};

var Model = define([QueryPlugin, Middleware], {
    instance: {
        /**
         * @lends patio.Model.prototype
         */

        __ignore: false,

        __changed: null,

        __values: null,

        /**
         * patio  - read only
         *
         * @type patio
         */
        patio: null,

        /**
         * The database type such as mysql
         *
         * @type String
         *
         * */
        type: null,

        /**
         * Whether or not this model is new
         * */
        __isNew: true,

        /**
         * Signifies if the model has changed
         * */
        __isChanged: false,

        /**
         * Base class for all models.
         *
This is used through {@link patio.addModel}, NOT directly.

         *
         * @constructs
         * @augments comb.plugins.Middleware
         *
         * @param {Object} columnValues values of each column to be used by this Model.
         *
         * @property {patio.Dataset} dataset a dataset to use to retrieve models from the database. The dataset
         *                          has the {@link patio.Dataset#rowCb} set to create instances of this model.
         * @property {String[]} columns a list of columns this models table contains.
         * @property {Object} schema the schema of this models table.
         * @property {String} tableName the table name of this models table.
         * @property {*} primaryKeyValue the value of this models primaryKey
         * @property {Boolean} isNew true if this model is new and does not exist in the database.
         * @property {Boolean} isChanged true if the model has been changed and not saved.
         *
         * @borrows patio.Dataset#all as all
         * @borrows patio.Dataset#one as one
         * @borrows patio.Dataset#avg as avg
         * @borrows patio.Dataset#count as count
         * @borrows patio.Dataset#columns as columns
         * @borrows patio.Dataset#forEach as forEach
         * @borrows patio.Dataset#isEmpty as empty
         * @borrows patio.Dataset#first as first
         * @borrows patio.Dataset#get as get
         * @borrows patio.Dataset#import as import
         * @borrows patio.Dataset#insert as insert
         * @borrows patio.Dataset#insertMultiple as insertMultiple
         * @borrows patio.Dataset#saveMultiple as saveMultiple
         * @borrows patio.Dataset#interval as interval
         * @borrows patio.Dataset#last as last
         * @borrows patio.Dataset#map as map
         * @borrows patio.Dataset#max as max
         * @borrows patio.Dataset#min as min
         * @borrows patio.Dataset#multiInsert as multiInsert
         * @borrows patio.Dataset#range as range
         * @borrows patio.Dataset#selectHash as selectHash
         * @borrows patio.Dataset#selectMap as selectMap
         * @borrows patio.Dataset#selectOrderMap as selectOrderMap
         * @borrows patio.Dataset#set as set
         * @borrows patio.Dataset#singleRecord as singleRecord
         * @borrows patio.Dataset#singleValue as singleValue
         * @borrows patio.Dataset#sum as sum
         * @borrows patio.Dataset#toCsv as toCsv
         * @borrows patio.Dataset#toHash as toHash
         * @borrows patio.Dataset#truncate as truncate
         * @borrows patio.Dataset#addGraphAliases as addGraphAliases
         * @borrows patio.Dataset#and as and
         * @borrows patio.Dataset#distinct as distinct
         * @borrows patio.Dataset#except as except
         * @borrows patio.Dataset#exclude as exclude
         * @borrows patio.Dataset#is as is
         * @borrows patio.Dataset#isNot as isNot
         * @borrows patio.Dataset#eq as eq
         * @borrows patio.Dataset#neq as neq
         * @borrows patio.Dataset#lt as lt
         * @borrows patio.Dataset#lte as lte
         * @borrows patio.Dataset#gt as gt
         * @borrows patio.Dataset#gte as gte
         * @borrows patio.Dataset#forUpdate as forUpdate
         * @borrows patio.Dataset#from as from
         * @borrows patio.Dataset#fromSelf as fromSelf
         * @borrows patio.Dataset#graph as graph
         * @borrows patio.Dataset#grep as grep
         * @borrows patio.Dataset#group as group
         * @borrows patio.Dataset#groupAndCount as groupAndCount
         * @borrows patio.Dataset#groupBy as groupBy
         * @borrows patio.Dataset#having as having
         * @borrows patio.Dataset#intersect as intersect
         * @borrows patio.Dataset#invert as invert
         * @borrows patio.Dataset#limit as limit
         * @borrows patio.Dataset#lockStyle as lockStyle
         * @borrows patio.Dataset#naked as naked
         * @borrows patio.Dataset#or as or
         * @borrows patio.Dataset#order as order
         * @borrows patio.Dataset#orderAppend as orderAppend
         * @borrows patio.Dataset#orderBy as orderBy
         * @borrows patio.Dataset#orderMore as orderMore
         * @borrows patio.Dataset#orderPrepend as orderPrepend
         * @borrows patio.Dataset#qualify as qualify
         * @borrows patio.Dataset#reverse as reverse
         * @borrows patio.Dataset#reverseOrder as reverseOrder
         * @borrows patio.Dataset#select as select
         * @borrows patio.Dataset#selectAll as selectAll
         * @borrows patio.Dataset#selectAppend as selectAppend
         * @borrows patio.Dataset#selectMore as selectMore
         * @borrows patio.Dataset#setDefaults as setDefaults
         * @borrows patio.Dataset#setGraphAliases as setGraphAliases
         * @borrows patio.Dataset#setOverrides as setOverrides
         * @borrows patio.Dataset#unfiltered as unfiltered
         * @borrows patio.Dataset#ungraphed as ungraphed
         * @borrows patio.Dataset#ungrouped as ungrouped
         * @borrows patio.Dataset#union as union
         * @borrows patio.Dataset#unlimited as unlimited
         * @borrows patio.Dataset#unordered as unordered
         * @borrows patio.Dataset#where as where
         * @borrows patio.Dataset#with as with
         * @borrows patio.Dataset#withRecursive as withRecursive
         * @borrows patio.Dataset#withSql as withSql
         * @borrows patio.Dataset#naturalJoin as naturalJoin
         * @borrows patio.Dataset#naturalLeftJoin as naturalLeftJoin
         * @borrows patio.Dataset#naturalRightJoin as naturalRightJoin
         * @borrows patio.Dataset#naturalFullJoin as naturalFullJoin
         * @borrows patio.Dataset#crossJoin as crossJoin
         * @borrows patio.Dataset#innerJoin as innerJoin
         * @borrows patio.Dataset#fullOuterJoin as fullOuterJoin
         * @borrows patio.Dataset#rightOuterJoin as rightOuterJoin
         * @borrows patio.Dataset#leftOuterJoin as leftOuterJoin
         * @borrows patio.Dataset#fullJoin as fullJoin
         * @borrows patio.Dataset#rightJoin as rightJoin
         * @borrows patio.Dataset#leftJoin as leftJoin
         * */
        constructor: function (options, fromDb) {
            if (this.synced) {
                this.__emitter = new EventEmitter();
                this._super(arguments);
                this.patio = patio || require("./index");
                fromDb = isBoolean(fromDb) ? fromDb : false;
                this.__changed = {};
                this.__values = {};
                if (fromDb) {
                    this._hook("pre", "load");
                    this.__isNew = false;
                    this.__setFromDb(options, true);
                    if (this._static.emitOnLoad) {
                        this.emit("load", this);
                        this._static.emit("load", this);
                    }
                } else {
                    this.__isNew = true;
                    this.__set(options);
                }
            } else {
                throw new ModelError("Model " + this.tableName + " has not been synced");
            }
        },

        __set: function (values, ignore) {
            values = values || {};
            this.__ignore = ignore === true;
            Object.keys(values).forEach(function (attribute) {
                var value = values[attribute];
                //check if the column is a constrained value and is allowed to be set
                !ignore && this._checkIfColumnIsConstrained(attribute);
                this[attribute] = value;
            }, this);
            this.__ignore = false;
        },

        __setFromDb: function (values, ignore) {
            values = values || {};
            this.__ignore = ignore === true;
            var schema = this.schema;
            Object.keys(values).forEach(function (column) {
                var value = values[column];
                // Typecast value retrieved from db
                if (schema.hasOwnProperty(column)) {
                    this.__values[column] = this._typeCastValue(column, value, ignore);
                } else {
                    this[column] = value;
                }
            }, this);
            this.__ignore = false;

        },

        /**
         * Set multiple values at once. Useful if you have a hash of properties that you want to set.
         *
         * NOTE: This method will use the static restrictedColumns property of the model.
         *
         * @example
         *
         * myModel.setValues({firstName : "Bob", lastName : "yukon"});
         *
         * //this will throw an error by default, assuming id is a pk.
         * myModel.setValues({id : 1, firstName : "Bob", lastName : "yukon"});
         *
         * @param {Object} values value to set on the model.
         *
         * @return {patio.Model} return this for chaining.
         */
        setValues: function (values) {
            this.__set(values, false);
            return this;
        },

        _toObject: function () {
            if (this.synced) {
                var columns = this._static.columns, ret = {};
                for (var i in columns) {
                    var col = columns[i];
                    var val = this.__values[col];
                    if (!isUndefined(val)) {
                        ret[col] = val;
                    }
                }
                return ret;
            } else {
                throw new ModelError("Model " + this.tableName + " has not been synced");
            }
        },

        _addColumnToIsChanged: function (name, val) {
            if (!this.isNew && !this.__ignore) {
                this.__isChanged = true;
                this.__changed[name] = val;
            }
        },

        _checkIfColumnIsConstrained: function (name) {
            if (this.synced && !this.__ignore) {
                var col = this.schema[name], restrictedCols = this._static.restrictedColumns || [];
                if (!isUndefined(col) && (col.primaryKey && this._static.isRestrictedPrimaryKey) || restrictedCols.indexOf(name) !== -1) {
                    throw new ModelError("Cannot set primary key of model " + this._static.tableName);
                }
            }
        },

        _getColumnValue: function (name) {
            var val = this.__values[name];
            var getterFunc = this["_get" + name.charAt(0).toUpperCase() + name.substr(1)];
            var columnValue = isFunction(getterFunc) ? getterFunc.call(this, val) : val;

            return columnValue;
        },

        _setColumnValue: function (name, val) {
            var ignore = this.__ignore;
            val = this._typeCastValue(name, val, ignore);
            var setterFunc = this["_set" + name.charAt(0).toUpperCase() + name.substr(1)];
            var columnValue = isFunction(setterFunc) ? setterFunc.call(this, val, ignore) : val;
            this._addColumnToIsChanged(name, columnValue);
            this.__values[name] = columnValue;
            if (this._static.emitOnColumnSet) {
                this.emit("column", name, columnValue, ignore);
            }
        },

        //Typecast the value to the column's type if typecasting.  Calls the database's
        //typecast_value method, so database adapters can override/augment the handling
        //for database specific column types.
        _typeCastValue: function (column, value, fromDatabase) {
            var colSchema, clazz = this._static;
            if (((fromDatabase && clazz.typecastOnLoad) || (!fromDatabase && clazz.typecastOnAssignment)) && !isUndefinedOrNull(this.schema) && !isUndefinedOrNull((colSchema = this.schema[column]))) {
                var type = colSchema.type;
                if (value === "" && clazz.typecastEmptyStringToNull === true && !isUndefinedOrNull(type) && ["string", "blob"].indexOf(type) === -1) {
                    value = null;
                }
                var raiseOnError = clazz.raiseOnTypecastError;
                if (raiseOnError === true && isUndefinedOrNull(value) && colSchema.allowNull === false) {
                    throw new ModelError("null is not allowed for the " + column + " column on model " + clazz.tableName);
                }
                try {
                    value = clazz.db.typecastValue(type, value);
                } catch (e) {
                    if (raiseOnError === true) {
                        throw e;
                    }
                }
            }
            return value;
        },

        /**
         * Convert this model to an object, containing column, value pairs.
         *
         * @return {Object} the object version of this model.
         **/
        toObject: function () {
            return this._toObject(false);
        },

        /**
         * Convert this model to JSON, containing column, value pairs.
         *
         * @return {JSON} the JSON version of this model.
         **/
        toJSON: function () {
            return this.toObject();
        },

        /**
         * Convert this model to a string, containing column, value pairs.
         *
         * @return {String} the string version of this model.
         **/
        toString: function () {
            return JSON.stringify(this.toObject(), null, 4);
        },

        /**
         * Convert this model to a string, containing column, value pairs.
         *
         * @return {String} the string version of this model.
         **/
        valueOf: function () {
            return this.toObject();
        },

        _checkTransaction: function (options, cb) {
            return this._static._checkTransaction(options, cb);
        },

        addListener: function () {
            var emitter = this.__emitter;
            return emitter.addListener.apply(emitter, arguments);
        },
        on: function () {
            var emitter = this.__emitter;
            return emitter.on.apply(emitter, arguments);
        },
        once: function () {
            var emitter = this.__emitter;
            return emitter.once.apply(emitter, arguments);
        },
        removeListener: function () {
            var emitter = this.__emitter;
            return emitter.removeListener.apply(emitter, arguments);
        },
        removeAllListeners: function () {
            var emitter = this.__emitter;
            return emitter.removeAllListeners.apply(emitter, arguments);
        },
        setMaxListeners: function () {
            var emitter = this.__emitter;
            return emitter.setMaxListeners.apply(emitter, arguments);
        },
        listeners: function () {
            var emitter = this.__emitter;
            return emitter.listeners.apply(emitter, arguments);
        },
        emit: function () {
            var emitter = this.__emitter;
            return emitter.emit.apply(emitter, arguments);
        },

        getters: {
            /**@lends patio.Model.prototype*/

            /*Returns my actual primary key value*/
            primaryKeyValue: function () {
                return this[this.primaryKey];
            },

            /*Return if Im a new object*/
            isNew: function () {
                return this.__isNew;
            },

            /*Return if Im changed*/
            isChanged: function () {
                return this.__isChanged;
            },

            /**@lends patio.Model.prototype*/

            primaryKey: function () {
                return this._static.primaryKey;
            },

            tableName: function () {
                return this._static.tableName;
            },

            dataset: function () {
                return this.__dataset || (this.__dataset = this._static.dataset);
            },

            removeDataset: function () {
                return this.__removeDataset || (this.__removeDataset = this._static.removeDataset);
            },

            queryDataset: function () {
                return this.__queryDataset || (this.__queryDataset = this._static.queryDataset);
            },

            updateDataset: function () {
                return this.__updateDataset || (this.__updateDataset = this._static.updateDataset);
            },

            insertDataset: function () {
                return this.__insertDataset || (this.__insertDataset = this._static.insertDataset);
            },

            db: function () {
                return this._static.db;
            },

            schema: function () {
                return this._static.schema;
            },

            columns: function () {
                return this._static.columns;
            },

            synced: function () {
                return this._static.synced;
            }

        }
    },

    static: {
        /**
         * @lends patio.Model
         */

        synced: false,

        /**
         * Set to false to prevent the emitting of an event on load
         * @default true
         */
        emitOnLoad: true,

        /**
         * Set to false to prevent the emitting of an event on the setting of a column value
         * @default true
         */
        emitOnColumnSet: true,

        /**
         * Set to false to prevent empty strings from being type casted to null
         * @default true
         */
        typecastEmptyStringToNull: true,

        /**
         * Set to false to prevent properties from being type casted when loaded from the database.
         * See {@link patio.Database#typecastValue}
         * @default true
         */
        typecastOnLoad: true,

        /**
         * Set to false to prevent properties from being type casted when manually set.
         * See {@link patio.Database#typecastValue}
         * @default true
         */
        typecastOnAssignment: true,

        /**
         * Set to false to prevent errors thrown while type casting a value from being propogated.
         * @default true
         */
        raiseOnTypecastError: true,

        /**
         * Set to false to allow the setting of primary keys.
         * @default false
         */
        isRestrictedPrimaryKey: true,

        /**
         * Set to false to prevent models from using transactions when saving, deleting, or updating.
         * This applies to the model associations also.
         */
        useTransactions: true,

        /**
         * See {@link patio.Dataset#identifierOutputMethod}
         * @default null
         */
        identifierOutputMethod: null,

        /**
         * See {@link patio.Dataset#identifierInputMethod}
         * @default null
         */
        identifierInputMethod: null,

        /**
         * Set to false to prevent the reload of a model after saving.
         * @default true
         */
        reloadOnSave: true,

        /**
         * Columns that should be restriced when setting values through the {@link patio.Model#set} method.
         *
         */
        restrictedColumns: null,

        /**
         * Set to false to prevent the reload of a model after updating.
         * @default true
         */
        reloadOnUpdate: true,

        __camelize: false,

        __underscore: false,

        __columns: null,

        __schema: null,

        __primaryKey: null,

        __dataset: null,

        __db: null,

        __tableName: null,

        /**
         * The table that this Model represents.
         * READ ONLY
         */
        table: null,

        /**
         * patio  - read only
         *
         * @type patio
         */
        patio: null,

        init: function () {
            var emitter = new EventEmitter();
            ["addListener", "on", "once", "removeListener",
                "removeAllListeners", "setMaxListeners", "listeners", "emit"].forEach(function (name) {
                    this[name] = hitch(emitter, emitter[name]);
                }, this);
            if (this.__tableName) {
                this._setTableName(this.__tableName);
            }
            if (this.__db) {
                this._setDb(this.__db);
            }
        },

        sync: function (cb) {
            var ret = new Promise();
            if (!this.synced) {
                var db = this.db, tableName = this.tableName, supers = this.__supers, self = this;
                ret = db.schema(tableName).chain(function (schema) {
                    if (!self.synced && schema) {
                        self._setSchema(schema);
                        if (supers && supers.length) {
                            return when(supers.map(function (sup) {
                                return sup.sync();
                            })).chain(function () {
                                self.synced = true;
                                supers.forEach(self.inherits, self);
                                return self;
                            });
                        } else {
                            self.synced = true;
                            return self;
                        }
                    } else {
                        var error = new ModelError("Unable to find schema for " + tableName);
                        self.emit("error", error);
                        throw error;

                    }
                });
            } else {
                ret.callback(this);
            }
            if (isFunction(cb)) {
                ret.classic(cb);
            }
            return ret.promise();
        },

        /**
         * Stub for plugins to notified of model inheritance
         *
         * @param {patio.Model} model a model class to inherit from
         */
        inherits: function (model) {
        },

        /**
         * Create a new model initialized with the specified values.
         *
         * @param {Object} values  the values to initialize the model with.
         *
         * @returns {Model} instantiated model initialized with the values passed in.
         */
        create: function (values) {
            //load an object from an object
            var Self = this;
            return new Self(values, false);
        },

        load: function (vals) {
            var Self = this, ret;
            if (!this.synced) {
                //sync our model
                ret = this.sync().chain(function () {
                    var m = new Self(vals, true);
                    //call the hooks!
                    return m._hook("post", "load").chain(function () {
                        return m;
                    });
                });
            } else {
                var m = new Self(vals, true);
                //call the hooks!
                ret = m._hook("post", "load").chain(function () {
                    return m;
                });
            }
            return ret;
        },

        _checkTransaction: function (opts, cb) {
            if (isFunction(opts)) {
                cb = opts;
                opts = {};
            } else {
                opts = opts || {};
            }
            var retVal = null, errored = false, self = this;
            return this.sync().chain(function () {
                if (self.useTransaction(opts)) {
                    return self.db.transaction(opts, function () {
                        return when(cb()).chain(function (val) {
                            retVal = val;
                        }, function (err) {
                            retVal = err;
                            errored = true;
                        });
                    }).chain(function () {
                        if (errored) {
                            throw retVal;
                        } else {
                            return retVal;
                        }
                    }, function (err) {
                        if (errored) {
                            throw retVal;
                        } else {
                            throw err;
                        }
                    });
                } else {
                    return when(cb());
                }
            });
        },

        /**
         * @private
         * Returns a boolean indicating whether or not to use a transaction.
         * @param {Object} [opts] set a transaction property to override the {@link patio.Model#useTransaction}.
         */
        useTransaction: function (opts) {
            opts = opts || {};
            return isBoolean(opts.transaction) ? opts.transaction === true : this.useTransactions === true;
        },

        _setDataset: function (ds) {
            this.__dataset = ds;
            if (ds.db) {
                this._setDb(ds.db);
            }
        },

        _setDb: function (db) {
            this.__db = db;
        },

        _setTableName: function (name) {
            this.__tableName = name;
        },

        _setColumns: function (cols) {
            var proto = this.prototype;
            if (this.__columns) {
                this.__columns.forEach(function (name) {
                    delete proto[name];
                });
            }
            this.__columns = cols;
            cols.forEach(function (name) {
                this._defineColumnSetter(name);
                this._defineColumnGetter(name);
            }, this);
        },

        _setPrimaryKey: function (pks) {
            this.__primaryKey = pks || [];
        },

        _setSchema: function (schema) {
            var columns = [];
            var pks = [];
            for (var i in schema) {
                var col = schema[i];
                var name = applyColumnTransformMethod(i, this.identifierOutputMethod);
                schema[name] = col;
                columns.push(name);
                col.primaryKey && pks.push(name);
            }
            this.__schema = schema;
            this._setPrimaryKey(pks);
            this._setColumns(columns);
        },

        _defineColumnSetter: function (name) {
            /*Adds a setter to an object*/
            this.prototype["__defineSetter__"](name, function (val) {
                this._setColumnValue(name, val);
            });
        },

        _defineColumnGetter: function (name) {
            this.prototype["__defineGetter__"](name, function () {
                return this._getColumnValue(name);
            });
        },

        _getDataset: function () {
            var ds = this.__dataset, self = this;
            if (!ds) {
                ds = this.db.from(this.tableName);
                ds.rowCb = function (vals) {
                    return self.load(vals);
                };
                this.identifierInputMethod && (ds.identifierInputMethod = this.identifierInputMethod);
                this.identifierOutputMethod && (ds.identifierOutputMethod = this.identifierOutputMethod);
                this.__dataset = ds;
            } else if (!ds.rowCb) {
                ds.rowCb = function rowCb(vals) {
                    return self.load(vals);
                };
            }
            return ds;
        },

        _getQueryDataset: function () {
            return this._getDataset();
        },

        _getUpdateDataset: function () {
            return this._getDataset();
        },

        _getRemoveDataset: function () {
            return this._getDataset();
        },

        _getInsertDataset: function () {
            return this._getDataset();
        },

        /**
         * @ignore
         */
        getters: {
            /**@lends patio.Model*/

            /**
             * Set to true if this models column names should be use the "underscore" method when sending
             * keys to the database and to "camelize" method on columns returned from the database. If set to false see
             * {@link patio.Model#underscore}.
             * @field
             * @default false
             * @type {Boolean}
             */
            camelize: function (camelize) {
                return this.__camelize;

            },

            /**
             * Set to true if this models column names should be use the "camelize" method when sending
             * keys to the database and to "underscore" method on columns returned from the database. If set to false see
             * {@link patio.Model#underscore}.
             * @field
             * @default false
             * @type {Boolean}
             */
            underscore: function (underscore) {
                return this.__underscore;

            },

            /**@lends patio.Model*/

            /**
             * The name of the table all instances of the this {@link patio.Model} use.
             * @field
             * @ignoreCode
             * @type String
             */
            tableName: function () {
                return this.__tableName;
            },

            /**
             * The database all instances of this {@link patio.Model} use.
             * @field
             *  @ignoreCode
             * @type patio.Database
             */
            db: function () {
                var db = this.__db;
                if (!db) {
                    db = this.__db = patio.defaultDatabase;
                }
                if (!db) {
                    throw new ModelError("patio has not been connected to a database");
                }
                return db;
            },

            /**
             * A dataset to use to retrieve instances of this {@link patio.Model{ from the database. The dataset
             * has the {@link patio.Dataset#rowCb} set to create instances of this model.
             * @field
             *  @ignoreCode
             * @type patio.Dataset
             */
            dataset: function () {
                return this._getDataset();
            },

            removeDataset: function () {
                return this._getRemoveDataset();
            },

            queryDataset: function () {
                return this._getQueryDataset();
            },

            updateDataset: function () {
                return this._getUpdateDataset();
            },

            insertDataset: function () {
                return this._getInsertDataset();
            },

            /**
             * A list of columns this models table contains.
             * @field
             *  @ignoreCode
             * @type String[]

             */
            columns: function () {
                return this.__columns;
            },

            /**
             * The schema of this {@link patio.Model}'s table. See {@link patio.Database#schema} for details
             * on the schema object.
             * @field
             *  @ignoreCode
             * @type Object
             */
            schema: function () {
                if (this.synced) {
                    return this.__schema;
                } else {
                    throw new ModelError("Model has not been synced yet");
                }
            },

            /**
             * The primaryKey column/s of this {@link patio.Model}
             * @field
             *  @ignoreCode
             */
            primaryKey: function () {
                if (this.synced) {
                    return this.__primaryKey.slice(0);
                } else {
                    throw new ModelError("Model has not been synced yet");
                }
            },

            /**
             * A reference to the global {@link patio}.
             * @field
             *  @ignoreCode
             */
            patio: function () {
                return patio || require("./index");
            }
        },

        /**@ignore*/
        setters: {
            /**@lends patio.Model*/
            /**@ignore*/
            camelize: function (camelize) {
                camelize = camelize === true;
                if (camelize) {
                    this.identifierOutputMethod = "camelize";
                    this.identifierInputMethod = "underscore";
                }
                this.__camelize = camelize;
                this.__underscore = !camelize;

            },
            /**@ignore*/
            underscore: function (underscore) {
                underscore = underscore === true;
                if (underscore) {
                    this.identifierOutputMethod = "underscore";
                    this.identifierInputMethod = "camelize";
                }
                this.__underscore = underscore;
                this.__camelize = !underscore;

            }
        }
    }

}).as(exports, "Model");

function checkAndAddDBToTable(db, table) {
    if (!table.contains(db)) {
        table.set(db, new HashTable());
    }
}

var allModels = [];
/**@ignore*/
exports.create = function (name, supers, modelOptions) {
    if (!patio) {
        (patio = require("./index"));
        patio.on("disconnect", function () {
            allModels.length = 0;
            MODELS.clear();
        });
    }
    var db, ds, tableName, modelKey;
    if (isString(name)) {
        tableName = name;
        db = patio.defaultDatabase || "default";
    } else if (isInstanceOf(name, patio.Dataset)) {
        ds = name;
        tableName = ds.firstSourceAlias.toString();
        db = ds.db;
    }
    var hasSuper = false;
    if (isHash(supers) || isUndefinedOrNull(supers)) {
        modelOptions = supers;
        supers = [Model];
    } else {
        supers = toArray(supers);
        supers = supers.map(function (sup) {
            return exports.getModel(sup, db);
        });
        hasSuper = true;
    }

    var model;
    checkAndAddDBToTable(db, MODELS);

    var DEFAULT_PROTO = {instance: {}, "static": {}};
    modelOptions = merge(DEFAULT_PROTO, modelOptions || {});
    modelOptions.instance._hooks = ["save", "update", "remove", "load"];
    modelOptions.instance.__hooks = {pre: {}, post: {}};
    //Mixin the column setter/getters
    modelOptions["static"].synced = false;
    modelOptions["static"].__tableName = tableName;
    modelOptions["static"].__db = (db === "default" ? null : db);
    modelOptions["static"].__supers = hasSuper ? supers : [];
    modelOptions["static"].__dataset = ds;
    model = define(supers.concat(modelOptions.plugins || []).concat([AssociationPlugin]), modelOptions);
    ["pre", "post"].forEach(function (op) {
        var optionsOp = modelOptions[op];
        if (optionsOp) {
            for (var i in optionsOp) {
                model[op](i, optionsOp[i]);
            }
        }
    });
    allModels.push(model);
    if (!(MODELS.get(db).contains(tableName))) {
        MODELS.get(db).set(tableName, model);
    }
    return model;
};

exports.syncModels = function (cb) {
    return asyncArray(allModels).forEach(function (model) {
        return model.sync();
    }, 1).classic(cb).promise();
};

var checkAndGetModel = function (db, name) {
    var ret;
    if (MODELS.contains(db)) {
        ret = MODELS.get(db).get(name);
    }
    return ret;
};

exports.getModel = function (name, db) {
    var ret = null;
    if (isDefined(name)) {
        !patio && (patio = require("./index"));
        if (isFunction(name)) {
            ret = name;
        } else {
            if (!db && isInstanceOf(name, patio.Dataset)) {
                db = name.db;
                name = name.firstSourceAlias.toString();
            }
            var defaultDb = patio.defaultDatabase;
            if (db) {
                ret = checkAndGetModel(db, name);
                if (!ret && db === defaultDb) {
                    ret = checkAndGetModel("default", name);
                }
            } else {
                db = patio.defaultDatabase;
                ret = checkAndGetModel(db, name);
                if (!ret) {
                    ret = checkAndGetModel("default", name);
                }
            }
        }
    } else {
        ret = name;
    }
    if (isUndefinedOrNull(ret)) {
        throw new ModelError("Model " + name + " has not been registered with patio");
    }
    return ret;
};

redpajama_set_name: RedPajamaGithub


text:
A New Paradigm in eClinical Technology
eClinical Software
TrialStat EDC
Electronic Patient Report Outcomes (ePRO / eCOA)
Randomization / IWRS
Pharmacovigilance – AEs and SAEs Management
Vendor Neutral Imaging Archive
SimpleTrials CTMS
High Speed Private Cloud
Study Design & Configuration
Rescue Studies
Randomization & Supply Management
Custom Software Development & Validation
On Air!
eClinical Technology and Industy News
Meet with Christopher Kata at the"6th Annual Clinical Operations in Oncology Trials West Coast" on April 30th & May 1st 2019
Meet with Christopher Kata, Director of Sales & Marketing on April 30th & May 1st 2019 at the 6th Annual Clinical Operations in Oncology Trials!
Christopher Kata, Director of Sales & Marketing
When: April 30th & May 1st 2019 at 7:45 am – 5:00 pm
Where: Burlingame, California
Registration: http://www.arena-international.com/oncologywestcoast
6th Annual Clinical Operations in Oncology Trials to the West Coast 2019
Arena International is excited to announce the return of the 6th Annual Clinical Operations in Oncology Trials to the West Coast on April 30th-May 1st 2019
As one of the only oncology operationally focused events in the West Coast, this meeting will aim to provide strategies to allow for operationally meaningful and targeted oncology trials to engage West Coast physicians and patients.
The event will be led by a myriad of industry specialists from the West Coast who will deliver solution and strategy through a variety of interactive formats: panel discussion, spotlight Q&As, roundtables and more! This conference will also provide a platform for industry professionals to network with some of the most innovative vendors in the market.
While maintaining the primary focus of its previous years, our 2019 event will look at how to prepare for the ever-changing dynamic of the oncology industry, and provide insight into the latest technological and therapeutic solutions.
We hope to see you in April, make sure to register your place today!
← Meet with Christopher Kata at "Outsourcing in Clinical Trials South East" on March 26th & 27th in North Carolina
Statement by FDA Commissioner Scott Gottlieb, M.D., Director of FDA's Center for Drug Evaluation and Research Janet Woodcock, M.D. and Director of FDA's Center for Biologics Evaluation and Research Peter Marks, M.D. on Expanded Access –Looking Forward →
Discover What Sets TrialStat Apart From Ordinary EDC Platforms
Click the image or button below to explore our interactive infographic which illustrates the comprehensive and unique capabilities of the TrialStat eClinical Suite.
Explore The Infographic
Request Your Demo Today!
From rapid database build through database lock, we deliver consistent quality on-time and on-budget. Ready to upgrade your eClinical toolkit?
Confirm You're Not A Robot:
Sutro Biopharma Announces Update from STRO-002, Luveltamab Tazevibulin (Luvelta), Phase 1 Dose-Expansion Study and Registrational Plans in Advanced Ovarian Cancer January 27, 2023
Alterity Therapeutics Launches ATH434 Phase 2 Clinical Trial in the United States for the Treatment of Individuals with Multiple System Atrophy January 27, 2023
Zenas BioPharma Announces First Patient Dosed in Phase 3 Clinical Study of Obexelimab for the Treatment of Immunoglobulin G4-Related Disease (IgG4-RD) January 27, 2023
Scipher Medicine Acquires CrossBridge and its SaaS Platform to Collect and Map Patient Molecular, Outcomes and Claims Data in Real Time January 26, 2023
Bio4t2 announces first patient infused with CAR-T targeting solid tumors January 26, 2023
Announcements (1,126)
Ask Us Anything (12)
Biopharmaceutical (155)
Canadian Clinical Research (22)
Cancer Research (223)
Cel therapy (37)
Decentralized Trials (5)
Diagnostics (63)
eClinical Technology (13)
Expanded Access (12)
FDA (152)
gene therapy (38)
Huntington's Disease (2)
Industry News (1,288)
Medical Imaging (18)
NDA (45)
Neurodegenerative (7)
Plaque Psoriasis (1)
Pre-Clinical Testing (79)
Radiopharmaceuticals (7)
Real World Data (5)
Risk Based Monitoring (2)
Vaccines (48)
Virtual & Hybrid Trials (1)
Wearables (6)
Archives Select Month January 2023 (54) December 2022 (50) November 2022 (64) October 2022 (63) September 2022 (59) August 2022 (67) July 2022 (58) June 2022 (66) May 2022 (63) April 2022 (61) March 2022 (70) February 2022 (60) January 2022 (61) December 2021 (49) November 2021 (66) October 2021 (62) September 2021 (63) August 2021 (69) July 2021 (39) June 2021 (47) May 2021 (35) April 2021 (31) March 2021 (29) February 2021 (33) January 2021 (42) December 2020 (34) November 2020 (34) October 2020 (25) September 2020 (22) August 2020 (26) July 2020 (23) June 2020 (13) May 2020 (21) April 2020 (24) March 2020 (23) February 2020 (6) January 2020 (6) December 2019 (2) November 2019 (1) October 2019 (2) September 2019 (6) August 2019 (4) June 2019 (3) May 2019 (1) March 2019 (2) February 2019 (1) January 2019 (3) November 2018 (3) October 2018 (6) September 2018 (4)
TrialStat Solutions Inc.
16751, TransCanada Hwy
Kirkland (Montreal), QC
Canada H9H 4J4
Technical Support: 1-866-416-7828 ext. 2
Reach Us By Email
Meet Us Virtually
We are hosting a series of webinars over the coming months and would love to have you attend.
© 2023 TrialStat Solutions Inc. All Rights Reserved.


text:
Home / Publications & Research / Covid-19 and education / Reviewing the evidence on extending school time: the good, the bad and the pretty strong
Reviewing the evidence on extending school time: the good, the bad and the pretty strong
It is no secret that Sir Kevan Collins' recommendations for close to £15bn of education recovery spending were rejected by HM Treasury on the basis that the evidence for extending school time was weak and inconsistent. This ultimately led Sir Kevan to resign as Education Recovery Commissioner.
Following on from this, the government has established a review of the evidence on school time, which is expected to inform decisions in the upcoming spending review.
In this blog, I argue that the empirical evidence is by no means weak. In fact, there is strong evidence that extending school time can improve test scores if extra time is an extension of normal teaching practices and the curriculum, draws on school staff and is linked to schools existing activities in as many ways as possible.
Don't trust international correlations
There are a range of international comparisons of the effects of extending school time, some of which are positive (Rivkin and Schiman, 2015) about the effects, whilst others downplay the effects of extra instructional time (OECD, 2018). However, there are important reasons to think international comparisons are at best, uninformative, and at worst, actively misleading.
First, one should totally discount any evidence based on international correlations between test scores and school time. This can only tell you about the effects of school time if we can hold everything else about different countries – including their socio-economic structures, education institutions and other relevant factors – constant, which is clearly not possible. Furthermore, such correlations could be biased downwards if policymakers extend school time in response to poor performance.
Second, and much more importantly, the effect of extended school time clearly depends on how the time is used and examples across countries include a whole host of different ways extra time was used. As a result, the average effect of extra time across different countries and studies often includes some very positive cases and some weak or negative examples. It is therefore more informative to look at individual examples to understand how extra time has been used well, and how it has been used badly.
The positive effects of extending school time
There are a range of studies across individual countries showing clear positive effects of extended school time:
Italy – An after school programme led by pupils' main teacher improved maths scores amongst disadvantaged students, but had little effect on language scores (Battistin and Meroni, 2016)
Israel – A remedial after school programme for disadvantaged young people led by teachers improved high school graduation rates and was rapidly scaled up (Lavy and Schlosser, 2005)
Denmark – New national regulations on primary school hours improved maths test scores, but there was no evidence of an effect on literacy scores (Jensen, 2013)
Chile – A government-mandated longer school day led to improvements in maths and language scores (Bellei, 2009)
These positive examples share a remarkable number of similarities in their design and effects. All the programmes were led by pupils' main teacher and/or integrated into existing school activities. The effects were also stronger for maths. This latter point is important as all the evidence on lost learning points to lower progress in maths than in literacy, which suggests that maths and numeracy skills are more sensitive to the effects of schools and teachers.
Learning from the weak and negative cases
There are also a range of examples where the effects of extended school time were relatively weak or close to zero. These are just as important to understand in order to avoid the pitfalls of past policies:
Extended school services in the US – After school and summer school programmes in the US had little effect on achievement scores, with evidence suggesting this is because they were poorly attended, activities were rarely linked to empirical evidence and often unrelated to normal school classes (Slavin, 2021)¸ James-Burdumy et al, 2005, Henrich et al, 2010).
After school teaching in Netherlands – Children attended after school classes at different sites with instruction based on the work of Robert Marzano. There were no significant effects on maths or language scores (Meyer and Kleveren (2013)
Shine on Manchester – Saturday schools provided extra literacy and numeracy lessons based on music themes, but had not significant effects on pupil achievement (EEF ,2018)
These weak cases share a number of key features. Activities were often separate to existing classes and the curriculum, involved methods or activities that had not been properly trialed yet, were often run by different staff separate to the school and were sometimes run in totally different places.
This combination of positive and weak evidence therefore strongly suggests that the most successful examples of extended school time have ensured strong connections with existing school teaching, staff and the curriculum. This is confirmed by meta-analysis, which find positive effects of programmes led by teachers and based on traditional teaching methods and when they incorporate evidence-based tutoring programmes (Kidron and Lindsay, 2014, Lauer et al, 2006).
Linking to evidence on tutoring
There are also clear crossovers with the evidence on when tutoring works best, summarised in an excellent review of the evidence (Nickow et al, 2020).
Who? – Effects are largest when led by teachers (0.5 standard deviations), though this is clearly an expensive approach and effects are still very large when tutoring is undertaking by well-trained teaching assistants and paraprofessional (0.4 standard deviations).
When? – Effects are largest in literacy for children just starting school (0.5 standard deviations), but are consistently large for maths throughout primary school ages (0.4 standard deviations).
How? – Larger effects are seen for programmes during the school day (0.4 standard deviations), but are still sizeable for after school programmes (0.2 standard deviations). There are slightly larger effects for longer and more frequent programmes.
Importantly, this tells us quite a lot about why tutoring might be effective. The stronger evidence on in-school programmes points to the importance of integration with existing classes and activities, and potential benefits from customisation and more immediate feedback for students. The stronger evidence on teacher-led approaches points to the importance of human capital and training. The larger effects on maths also mirror the evidence on lost learning and extended school time. The fact that extending the length of programmes only has a modest effect on outcomes suggest that creating extra time is not enough. To be effective, tutoring and extended school time needs to be delivered by staff with high levels of training and linked strongly to existing classes and teaching.
Enrichment and extra-curricular activities
Finally, there is also a body of evidence looking at the effects of extra-curricular and enrichment activities (Shlruf, 2010). Here, there is weak evidence of effects on student achievement. However, this is a somewhat unfair benchmark given that the goals of extra-curricular and enrichment activities are much wider, encompassing pupil well-being, happiness and mental health. This is one reason EPI has recommended any extra school time be used for both academic and enrichment activities, with the EEF toolkit also recommending that extended school time should incorporate both academic and enrichment activities to be successful.
The ultimate success of any extended school time will also be heavily shaped by attendance levels and framing extra time after normal school hours as being (at least partially) used for sport and the arts might end up being more appealing for pupils. There is also a clear risk that without extra time, such extra-curricular activities might get heavily squeezed out of normal school time if schools are more focused on catching up on literacy and numeracy levels.
In any case, the most effective approaches would need to learn from the successful example across the country where schools have already implemented modest extensions to the school day, including how it is framed, funded, organised and staffed.
Conclusions and summary
In conclusion, the evidence on extending school time is actually quite strong, both from the successful examples and from the less successful ones. Unsurprisingly, the effects of extending school time depends on how the time is used. It is most effective when it draws on existing and well-trained staff, integrated to existing classes and activities, based on sound empirical evidence and is more effective for maths. Providing this approach is followed, extra funding to enable extended school time is likely to yield consistent and strong returns.
Luke Sibieta
Research FellowView Details
EPI research for the Department for Education on pupil learning loss
Education recovery and resilience in England


Legal tangles got you stuck?
We understand that life often spins out of control, throwing unexpected curve balls at every turn.
Maybe you've met with a devastating accident or facing a divorce, or creditors knocking at your door. Whatever your crisis, chances are that you will have to go through legal proceedings.
But you aren't the only one facing legal challenges. Thousands of people in Wisconsin find themselves inundated with various legal issues - and there's much more at stake than just money. Legal problems can cause emotional turmoil as well. Endless bureaucracy, baffling reams of paperwork and harassing calls from creditors can make anyone's life simply unbearable.
Legal issues do affect your lives; but if you know your rights and the correct course of action, it becomes easy for you to see light at the tunnel end.
That's why when you hire us; you not only get the right legal advice, but also benefit from unnecessary delays.
Experience – Our attorney list includes trial lawyers with an impressive track record.
Multiple Practice Areas - Our attorneys have expertise in areas such as Personal Injury, Bankruptcy, Family Law, and Real Estate Law.
Comprehensive Legal Cover - You can count on us for simple to complex legal issues.
If you are facing legal difficulties, don't delay!
Call our experienced attorneys and know your rights before it's too late.
Get legal consultation and put an end to your legal problems now!


In a 20-minute display of madcap invention, the Neil Cowley Trio brought a musical re-enactment of recent British weather to Islington Town Hall for the PRS Foundation. Featuring a storm lashed opener, 'Balkaseltzer', written by guesting Derry musicians, Robert Peoples and Marty Coyle, the Trio blasted the chattering music bizzers into stunned silence, then into startled applause. Just when you think you've got Cowley in the bag - Satie, Debussy, Glass, Reich, Monk - he flips you with a new composition 'Queen', a labyrinth of deep orchestral melancholy, flowing melody, a poignant winter landscape.
Deeply moving, it's soon offset by the Pythonesque 'She Eats Flies', where the Trio give new meaning to the term virtuosity. Evan Jenkins' atom splitting percussion and bassist Rex Horan's relentless sonority underpin the frenzied inspirational insanity of Cowley, a true piano headbanger - Joe Zawinul meets Jerry Lee Lewis - to mark this collective as one of the most vital of modern times. The NCT push beyond technicality towards magical telepathy. The term 'jazz', as we know it, need not apply, but the concept certainly does. Relentless, questing, searching. It's been a while since jazz pulled the rug out and dealt in uncertainty. Like our weather.


as a non IT person, i found it very easy to upload my artwork in pdf form and next thing it arrive in 4 days, all perfect. brilliant.
Very happy with the quick turnaround and even more happy with the quality of the prints. Will most definately use digital printing again, great price too!
Great service! Really quick delivery and high quality printing – highly recommend and I would definitely use them again!
Very quick delivery. Excellent communication- they will email and phone you if they have any issues with the dimensions of your artwork before printing to make sure you are completely happy as a customer. I recommend Digital Printing to any company in need of a reliable business partnership.
I was dead chuffed with my order. The stickers came out exactly how I wanted and the haribo sweets were a nice touch! Thank you so much.
Amazing price and service. Ordered 15 laminated booklets for a great price and turnaround was absolutely spot on. Order placed on Monday, shipped on Tuesday and received on Thursday via standard delivery.


In Sydney's north shore the owner of an apartment approached Sunscreen Window Tinting with a problem.
Throughout the daytime heat was building, especially during the summer months where afternoon temperatures become unbearable. As the sun streamed in on the new floorboards, fading became an issue. Combating the heat and damaging ultra violet sun rays, blinds would need to be drawn all afternoon. This defeated the purpose of a glass window and any potential views would be blocked off. Air conditioning units would also have trouble keeping up with the constant heat that entered the building through the fixed windows in the stairwell.
Problem: The apartments owner did not want to change the external look of the building and decided the film should only be applied to the stairwell which had the heat issue. As traditional window films are either dark or highly reflective, the owner was faced with a problem if he wanted to keep the building looking the same from the outside whilst solving the heat issue.
Solution: Sunscreen Window Tinting's 3M Prestige PR70 Series shows how far technology has advanced for window films on buildings and homes. The model uses a Multi-layer optical film technology which provides a window film product with a totally clear finish and a host of advantages.
Results: The 3M Prestige PR70 provides residential and commercial property owners with a high performance clear window film that combines benefits given by heavily tinted or reflective films and cutting out the darkened rooms or mirrored windows. Having 1% higher reflectivity than the glass they cover means Prestige films will keep the appearance of your building. After performing installation on 60 windows, no disruption to the owner in a straight forward and efficient was what Suncreen Window Tinting promised. Air conditioning levels were also cut back too which would cut back costs for energy during the summer months.


Discover your family links with DNA Testing. Ancestral Discovery is the most refined and easy to understand DNA genealogy test on the market. With this simple DNA Ancestry test, you can identify your locations of strongest probable genetic origins.
Discover how your genetics link you to world population groups with a simple and powerful DNA test. Ancestral Origins- Discovery is one of the most refined and easy to understand DNA genealogy test on the market. With this simple DNA Ancestry test, you can identify your locations of strongest probable genetic origins.
Our newest update makes Ancestral Origins the only ancestral test on the market to look at a full DNA markers! With a newly updated and expanded report, as well as your customized Ancestral Origins map, this is the ancestry test to give you greater insight into your family history.


The vast majority of cleaning products on the commercial market are packed with harsh chemicals that are bound by outdated laws that still allow horrific animal testing and sucky non-recyclable plastic bottles.
Reducing the number of chemicals in your household doesn't have to be hard work. In this blog post, I will talk about some of the best all natural cleaning products and how to make some simple, budget-friendly and non-toxic DIY natural cleaning recipes that will start you on a journey of all natural, cruelty-free & zero-waste house cleaning!
Cleaning your house naturally is an easy way to reduce the number of toxins you, your family & your home are exposed to, it is much safer for your skin and environment, as well as being child & pet-friendly!
One of the best thing about natural cleaning is that these products are always available, easy to find, great on a budget & last a long time!
If you're following us on Instagram, you may have already seen these bright & beautiful jars of our natural cleaning bathroom recipes. Natural cleaning recipes work wonders in your shower, bath, bins & toilet.
Once you've squeezed a lemon, devoured a grapefruit or enjoyed those limes in a yummy mojito, keep ALL of your used citrus peels in a paper bag in the freezer which will keep them fresh & smelling lovely. When ready to use just slice up (ideally in a large mason jar) & fill to the top with vinegar to make your 'concentrate'.
Leave for at least a couple of weeks (the longer the better) & then pour one part of the concentrate to 3 parts water in your reusable or DIY spray bottle. And that's it! The strong vinegar scent is lessened by the beautiful zesty citrus smell & it really does clean as good as it smells! I also use this combo for mopping my hardwood floors.
To naturally clean tiles, dip a damp cloth into a bowl of bicarbonate of soda and wipe down tiles. For tough stains around the bathtub or grouting use white vinegar on your cloth & then scrub with a natural scrub powder made up of 2 parts bicarbonate of soda & natural salt with a wooden brush.
Likewise, to make your toilet shine, pour some bicarb down the toilet followed by a cup of vinegar to create an awesome bubbly reaction that can settle & then be scrubbed for shining white results! Also, a great way to unblock sinks naturally.
Mix all of the above ingredients together in a glass spray bottle. Spray on windows and use newspaper in circular motions to clean. It's as easy & cheap as that and again super child & pet-friendly- for those of you who have fellow little window tongue washers!
Making your own natural air freshener DIY style is not only the sure way of making your home cruelty-free, chemical & plastic free, it's also super fun to make and can even be a great gift due to their delicious smell & multiple uses!
I originally made this natural cleaning spray for my yoga mat to keep it clean & smelling divine as Namaste. But since making up the bottle it's constantly moving around the house either as a natural bathroom air freshener spray, bed linen and room spray. It could also be used outside the house as a natural air freshener for your car.
Simply fill up ¾ of your little glass spray bottle with distilled waters, ¼ of witch hazel, add 5 drops of tea tree oil and 5 drops of lemongrass - this combination will give you a cleansing, invigorating and uplifting scent. Shake up ingredients & voilà a gorgeous spray!
The other combination of essential oils you can use is eucalyptus which again is cleansing with calming lavender - great for a relaxing pillow spray. Again, you can play around with the essential oils you would like to use!
So there you have it, a few cruelty-free and truly beautiful cleaning ideas to get you started on the journey! Bicarbonate of soda (baking powder) is the number one natural cleaning agent and it provides natural cleaning for the oven, DIY jewellery cleaning and is an excellent deodoriser and therefore great for natural carpet cleaning, cleaning your mattress, natural oven cleaner, the fridge, upholstery bins & drains. The combination of bicarb with white vinegar and a few drops of your chosen essential oils should leave you & your house gleaming from the inside out.
If you have any natural cleaning recipes, DIY successes or tips please leave them in the comments below!


text:
In November 1969, Native American activists occupied Alcatraz Island and held it for nineteen months to bring attention to past injustices and contemporary issues confronting Native Americans, as state in this proclamation, drafted largely by Adam Fortunate Eagle of the Ojibwa Nation.
To the Great White Father and All His People:
We, the native Americans, re-claim the land known as Alcatraz Island in the name of all American Indians by right of discovery.
We wish to be fair and honorable in our dealings with the Caucasian inhabitants of this land, and hereby offer the following treaty:
We will purchase said Alcatraz Island for twenty-four dollars ($24) in glass beads and red cloth, a precedent set by the white man's purchase of a similar island about 300 years ago. We know that $24 in trade goods for these 16 acres is more than was paid when Manhattan Island was sold, but we know that land values have risen over the years. Our offer of $1.24 per acre is greater than the 47 cents per acre the white men are now paying the California Indians for their land.
We will give to the inhabitants of this island a portion of that land for their own, to be held in trust by the American Indian Government — for as long as the sun shall rise and the rivers go down to the sea — to be administered by the Bureau of Caucasian Affairs (BCA). We will further guide the inhabitants in the proper way of living. We will offer them our religion, our education, our life-ways, in order to help them achieve our level of civilization and thus raise them and all their white brothers up from their savage and unhappy state. We offer this treaty in good faith and wish to be fair and honorable in our dealings with all white men.
We feel that this so-called Alcatraz Island is more than suitable for an Indian Reservation, as determined by the white man's own standards. By this we mean that this place resembles most Indian reservations, in that:
It is isolated from modern facilities, and without adequate means of transportation.
It has no fresh running water.
It has inadequate sanitation facilities.
There are no oil or mineral rights.
There is no industry so unemployment is great.
There are no health care facilities.
The soil is rocky and non-productive; and the land does not support game.
There are no educational facilities.
The population has always exceeded the land base.
The population has always been held as prisoners and kept dependent upon others.
Further, it would be fitting and symbolic that ships from all over the world, entering the Golden Gate, would first see Indian land, and thus be reminded of the true history of this nation. This tiny island would he a symbol of the great lands once ruled by free and noble Indians.
USE TO BE MADE OF ALCATRAZ ISLAND
What use will be made of this land?
Since the San Francisco Indian Center burned down, there is no place for Indians to assemble and carry on our tribal life here in the white man's city. Therefore, we plan to develop on this island several Indian institutes:
1. A Center for Native American Studies will be developed which will train our young people in the best of our native cultural arts and sciences, as well as educate them to the skills and knowledge relevant to improve the lives and spirits of all Indian peoples. Attached to this center will be traveling universities, managed by Indians, which will go to the Indian Reservations in order to learn the traditional values from the people, which are now absent in the Caucasian higher educational system.
2. An American Indian Spiritual center will be developed which will practice our ancient tribal religious ceremonies and medicine. Our cultural arts will be featured and our young people trained in music, dance, and medicine.
3. An Indian Center of Ecology will be built which will train and support our young people in scientific research and practice in order to restore our lands and waters to their pure and natural state. We will seek to de-pollute the air and the water of the Bay Area. We will seek to restore fish and animal life, and to revitalize sea life which has been threatened by the white man's way. Facilities will be developed to desalt sea water for human use.
4. A Great Indian Training School will be developed to teach our peoples how to make a living in the world, improve our standards of living, and end hunger and unemployment among all our peoples. This training school will include a center for Indian arts and crafts, and an Indian Restaurant serving native foods and training Indians in culinary arts. This center will display Indian arts and offer the Indian foods of all tribes to the public, so they all may know of the beauty and spirit of the traditional Indian ways.
5. Some of the present buildings will be taken over to develop an American Indian Museum, which will depict our native foods and other cultural contributions we have given to all the world. Another part of the Museum will present some of the things the white man has given to the Indians, in return for the land and the life he took: disease, alcohol, poverty, and cultural decimation (as symbolized by old tin cans, barbed wire, rubber tires, plastic containers, etc.). Part of the museum will remain a dungeon, to symbolize both Indian captives who were incarcerated for challenging white authority, and those who were imprisoned on reservations. The Museum will show the noble and the tragic events of Indian history, including the broken treaties, the documentary of the Trail of Tears, the Massacre of Wounded Knee, as well as the victory over Yellow-Hair Custer and his army.
In the name of all Indians, therefore, we re-claim this island for Indian nations, for all these reasons. We feel this claim is just and proper, and that this land should rightfully be granted to us for as long as the rivers shall run and the sun shall shine.
SIGNED, INDIANS OF ALL TRIBES
November 1969 San Francisco, California
← Gloria Steinem on Equal Rights for Women (1970)
29. The Triumph of the Right →