Their is already evidence of our failed creativity to create new jobs for people in the above present day employment statistics. The labor-participation rate in June was 62.6% which is the lowest since October of 1977. There were only about 5.38 million job openings for the 8,549,000 people classed as unemployed in April 2015.
"Historically, humans have contributed muscle and brains to production but we are now being outcompeted by machinery, in both areas, in many jobs. - Mark Walker Machines are encroaching in the last area that we have a competitive edge. So, unlike the displacement of labor during the First Great Transformation, there is no untapped category for surplus human labor to migrate to. Even supposing new sectors of the economy open up, their demand for human labor is likely to be very weak since these new sectors too will be faced with the question of whether to employ robots or humans. The cost advantage will lie with robots for the most part, and so there will be weak demand for human mental labor in the future just as the demand for human muscle dropped precipitously in the past."
An optimistic argument about job creation is difficult with the the type of jobs being created Job polarization - In a 2012 paper economists Nir Jaimovich and Henry Siu offered an alternative explanation for the jobless recovery phenomenon. Building upon work of economist David Autor, the two economists argued that the economy's jobless recovery is due to the growing trend of "job polarization."
If Jaimovich and Siu's conclusions correctly explain the labor market's recent dynamics, then what are the implications? For one, postrecession policies to stimulate labor market activity may have little effect since the jobless recovery is due to the downturn-induced disappearance of middle-skilled jobs. currently, they are mostly jobs that are susceptible James J. Hughes - They hopefully conclude that “as technology races ahead, low-skillworkers will reallocate to tasks that are non-susceptible to computerisation – i.e., tasks requiring creative and social intelligence” (Frey and Osborne, 2013). Since it is unlikely that half the work force could retrain for these creative and social intelligence occupations, or that the economy could absorb that many graphic designers, lobbyists and social workers.
But what if the capabilities of artificial intelligence, information technologies and robotics also encroach on creativity and social intelligence? Wearable health devices and distance consulting with fitness experts (e.g. FitOrbit and Optimized Fitness) is already encroaching of face-to-face personal training and therapy.
Scientific research is already being impacted by automation, with automated lab processes and data analysis dramatically increasing research productivity, and progress even being made on automating hypothesis generation. In the era of Big Data, scientific progress will be increasingly dependent on the automation of scientific discovery. to displacement by technology in the near future. The UK economy shows a shift to low-skilled jobs, every 10 middle-skilled jobs that disappeared in the UK between 1996 and 2008, about 4.5 of the replacement jobs were high-skilled and 5.5 were low-skilled. According to data from the U.S. Department of Labor, Of the top 10 "Occupations with the Most Openings," nine fall into government-designated wage categories of "very low" and "low," It turns out the vast preponderance of job openings these days consists of low-skill, hourly wage work with high turnover. The current slate of "help wanted" ads overwhelmingly involves cashiers, waitresses and waiters, personal care aides, janitors, those who stock store shelves, and the likes of Hardee's and Taco Bell.
Between 2009 and 2013, low-wage jobs outnumbered high-wage jobs by some 800,000 with 1.7 million versus 1.1 million jobs, though low-wage jobs made up less than one in five (19 percent) of all employment in 2009, they accounted for nearly 40 percent (39 percent) of all new jobs created out to 2013. Looked at this way, the recovery may not have been exactly jobless, but it has certainly been dominated far by poor quality, low-paying jobs. The recovery — if we can call it that — has been driven largely by low-wage jobs. Nationwide, low-wage jobs have grown at a 6 percent clip, roughly double the rate for overall job growth (3.1 percent) and the growth rate in high-wage jobs (3 percent). Home health care workers, food service workers, retail salespeople and custodians will account for nearly 1 million of the 2.4 million new, low-skill jobs expected to be added in the U.S. by 2017, according to a USA TODAY analysis of jobs data.
Gerald Huff - “If you look at the most common jobs, the top 50 occupations theres only one, software engineer, which is new in the last 100 years. People say oh we will invent whole new industries that people will work in, the new industries that we are inventing are not mass employers, they simply do not generate mass numbers of jobs of the kind we had in those other industries, we added 4x as much jobs in food service and retail than any other high tech industry in the last 20 years. Those are the jobs that we have been creating and those are the jobs that are very subject to automation.”
Historically, when job losses have been caused by productivity-enhancing technologies they have tended to create demand via higher incomes and lower prices, which have generated new jobs economy wide. However, in the more globalised economy, it remains to be seen whether the next wave of the industrial revolution will generate a net increase in employment within this country. Brynjolfsson and McAfee state: “Digital technologies change rapidly, but organisations and skills aren’t keeping pace. As a result, millions of people are being left behind. Their incomes and jobs are being destroyed, leaving them worse off than before the digital revolution. While the foundation of our economic system presumes a strong link between value creation and job creation, the Great Recession reveals the weakening or breakage of that link.
Many people are going to find their limited skills are no longer valuable, for many jobs they will find that Humans Need Not Apply. What happens if vast numbers of people can no longer make money by selling their labor and re-skillng takes years, how will they support themselves during this time, how will the economy sustain growth if another recession hits due to people losing jobs and being unable to pay mortgages, student loans and other debts? The Great Depression had unemployment rate in the U.S. of 25%, are we looking at a worse unemployment rate than that? How will an ageing population increased need for care services be supported, who is going to contribute into paying into the pension fund if less people have incomes to tax? What job opportunities Federico Pistono - "The old jobs are not coming back. The new jobs will be highly sophisticated, technically and creatively challenging jobs, and only a handful of them will be needed. The question is simple: what will the unskilled workers of today do? So far, nobody has been able to answer that question.
The reason for this, I think, is because there is no answer. Not in this system, not in the way it is designed to work." will a child born in 2015 have when they are 16 compared to a 16 year old today?
What happens when a 16 year old find all their skills are marginalized, James J. Hughes - A second major dynamic that will frame responses to technological unemployment will be the growing ratio of retirees to working age adults, known as the old-age dependency ratio. As fertility rates have fallen world-wide life expectancies have risen. As a consequence, even without technological unemployment, most industrialized countries are facing a decline in the ratio between the number of workers contributing to state health and pension systems and the seniors dependent on those systems.
In response to rising life expectancy and associated pension and medical costs, governments around the world have been cutting benefits and attempting to raise the retirement age to encourage seniors to stay in the labor force. The impact of technological unemployment will likely be borne most heavily by younger workers with fewer accumulated skills, leading to an intensification of the current inequality between the relatively affluent seniors and the impoverished young and middle-aged. This will contribute to political demands for “generational equity” and “entitlement reform” to trim Social Security and Medicare.or disability, older people are staying in the labor force at a higher rate. they have no skill that is deemed worth paying minimum wage for, what skills will they have that a robot or machine, older more experienced unemployed worker or a cheaper worker via outsourcing Outsourcing - Outsourcing has grown in the last decade, and recent statistics show that more than two million jobs were outsourced in 2013, with many of those opportunities going to workers in China and India.
43% of the IT sector was outsourced, 26% of distribution is now taken care of offshore, 12% of call center jobs are found overseas, and 38% of research and development (R&D) is taken care of by workers outside of the country. can’t do? Will the vulnerable and poor suffer the most? Economist Tyler Cowen observes that rich economies seem to be bifurcating into a small group of workers with skills that are highly complementary with machine intelligence, for whom he has high hopes, and the rest for whom not so much.
In this hyper connected world we are entering there will be global competition for jobs, younger people Youth Inactivity - Oxford Martin School’s report Now for the Long Term (2013) is the estimation that 621 million young people (15-24 year olds) worldwide are ‘idle’ – that is to say, not in education, work or training, or even looking for work.
Of that figure, about 74m are actively seeking work. Youth unemployment, the report notes, is over 50% in Greece and Spain, and levels of economic inactivity among the young are over 30% in the Middle East and North Africa. will find it difficult to get a foot onto the skills ladder for that first bit of experience if there are severely reduced retail, fast food jobs amd other low skilled entry level opportunities. College will be hard to financially save up for if less full time work is available Full Time vs Part Time - According to a global PwC survey 46% of HR professionals polled expect at least a fifth of their workers to be contractors or temporary staff by 2022, while half the participants in the survey in China believed that ‘traditional employment won’t be around in the future. Instead, people will have their own ‘brands’ and sell their skills to those who need them’ and pay through if less low skilled part time work is available or if parents lose jobs and can't offer financial support. The average savings account balance in the U.S. was $5,923 in 2011, according to a 2012 report by Pitney Bowes. It's normally the youth who find it hardest to find work, using Europe as a prime example. They may look to careers in the military but they are currently creating autonomous drones to replace pilots and plans to shrink infantry forces by using robots are in development.  If Google are successful in increasing the healthy lifespan by a few years then older people will not retire as early to allow younger workers to replace them, making it even harder for young people to find work.
Less men are working than ever before In the 1960s, only one in 20 American men between 25 and 54 was not working. According to Mr Summers’s extrapolations, in ten years the number could be one in seven. Less men are graduating from college compared to women, young males with with less education and expertise will fall behind. By 2012, the share of young women enrolled in college immediately after high school had increased to 71%, but it remained unchanged for young men at 61%.
For young low-skilled males a bleak future of having less income, less financial secururity, Interns - “As youth unemployment increased an entire generation saw internships replace a first job, Lack of job security for young people has become a society-wide problem."
Even in a country like France the number of internships shot up from 600,000 in 2006 to 1.6 million in 2012. “It’s become a way for young people to gain job experience, and it shouldn’t be,record rates of youth unemployment have been directly correlated with the rise of unpaid internships, which replace jobs and drive inequality, not only does the practice allow companies to get graduates’ skills on the cheap, it gives those who can afford to work for free an unfair advantage over their less well-off peers.” Perlin said in an email.
What is even more worrying for young workers is that this job experience is often pro bono: a 2013 EU report found that 59% of 18- to 35-year-olds across 27 EU member states hadn’t received any financial compensation for their most recent internship. less job opportunities and low social mobility. For the “lucky” males that are still able to live at home with their parents and not have to pay the current extortionate Housing Crisis - How many are avoiding buying a home because of this debt? It seems like people are simply ignoring this housing crisis. Some just tend to think that rising rents and home prices with no subsequent rise in income is somehow the standard way of doing things. In fact, that is not the case.
This is a new trend. But it is a trend brought on by cheap money in the hands of a few chasing after assets in the real economy. This is why many surveys show that most Americans are not participating in this recovery. Residential construction is simply not there like it has been in past recoveries. Why build when your audience can’t afford to buy? living costs they might see their failure to be able to be independent as their own fault. They will find it increasingly difficult to to court a partner, have a relationship, home, raise a family and so on as their parents did and become disillusioned as they realise the American dream is lost for them. In this lost generation an alienated underclass may develop where many males become depressed, angry, develop mental issues, drugs, crime, prison, and all over side effects correlated to poverty, unemployment and lack of opportunity.
If you have an increase of unemployed, hopeless, angry young men then expect social unrest such as rioting, more than half of the people between the ages of 16 and 64 were out of work in Sandtown-Winchester in Baltimore during the recent riots. In the more severe case they may become frustrated or scared and either side, the people who don't have jobs and the people who do but whose living conditions have deteriorated, may direct their anger at each other or at scapegoats such as minorities and blame immigrants “for taking our jobs” or a certain race or type of people as the cause of their problems and may revert to extreme forms of nationalism as has happened in the past. We are looking at 70% of low skilled work being automated which generally employs low educated people, an extreme party getting into power and capitalise on a vulnerable populace is not completely unthinkable, unfortunately, and one of my biggest concerns for our future.
This is not isolated to any country and not just developed worlds, there could be global conflicts between nations, violent revolutions are increasingly likely with increasing civil unrest too and could cause even more disruption and suffering. Almost 202 million people were unemployed in 2013 around the world, an increase of almost five million from the year before. If current trends continue, global unemployment is set to gradually worsen, reaching more than 215 million jobseekers by 2018. During this period, it is estimated that around 40 million net new jobs will be created every year, which is short of the 42.6 million people who will enter the labour market each year looking for work. Meanwhile, the global youth unemployment rate is almost three times as high as the adult unemployment rate. In certain countries, almost one-quarter of young people aged 15 to 29 are now neither in employment, nor in education or training. Advanced robotics will be especially bad for the Chinese economy which is largely dependent on manufacturing jobs.
Vivek Wadwa - Even if the Chinese automate their factories with AI-powered robots and manufacture 3D printers, it will no longer make sense to ship raw materials all the way to China to have them assembled into finished products and shipped back to the U.S. Manufacturing will once again become a local industry with products being manufactured near raw materials or markets. So China has many reasons to worry. I worry if we will create the new jobs fast enough and distribute the prosperity.
By 2050, world population is expected to increase from the current 7.2 billion people to 9.6 billion and there will be almost as many people in Nigeria as in the US, Ethiopia will have twice as many people as projected in the United Kingdom or Germany. Sustaining that many people if they can't find employment, add into the mix environmental disruptions from global warming causing even more resource scarcity in poorer regions will cause suffering, leading to more extremist groups to develop like ISIS but with potentially advanced terrorism in the use of drones or bio-weapons, the future looks very precarious, nationally and globally.
We can predict what jobs will face the most disruption and can see the trends on what types of new jobs are being created - They are both low skilled. There will be a huge drop in demand for traditional skills. Gaining an entirely new skill set Jeremy Rifkin - Rifkin points out that people that lose a low-skilled job often lose the only job they are able to do. Many of people involved for instance in assembly or packaging can barely read and write. They are on the lowest rung of ability and learning.
However, the new job that arises from the machine that ‘steals’ their job is one involving taking care of that machine, which often requires high school computer programming, if not a college degree in computer science. These are in turn qualifications requiring abilities at the higher end of the ladder.
In brief, “it is naive to believe that large numbers of unskilled and skilled blue and white collar workers will be retrained to be physicists, computer scientists, high-level technicians, molecular biologists, business consultants, lawyers, accountants, and the like. isn't easy, think about the 50 year old unemployed truck driver or the 26% of fast food workers with children, how are they meant to retrain while they experience increasing insecurity of employment and income? People will be caught off guard, the transformation could be too much too quick for too many people. There have been distinct losers in recent economic adjustments, particularly unskilled youth and workers unable to develop skills in demand, such as older males made redundant from traditional manufacturing roles. For these workers there is a vicious circle associated with their inability to re-engage with the labour market You cannot just take middle-aged workers out of factory, transport or retail environments, put them into classrooms and then expect them to immediately learn new skills for new jobs in that unfamiliar setting. We need better solutions to support while they re-skill and adapt. A career for life is over.
The societal upheaval of many people without a steady income training for new jobs, the strain and on families and stress on relationships may be too great while faced with problems of stagnant wages, rising wealth and income inequality and climate change. What is certain that humans have a limited skill set and each year robots are gaining them and improving upon them due to exponentially improving Computers, AI, Robotics and Automation tools. With so much change possible it should be great in the long run but bad in the interim period as society and governments struggles to adjusts with pace of change. As mentioned in the introduction, many forget to mention how terrible Moravec - who is anything but a Luddite or a left-wing extremist – recalls first of all the painful transition from the agricultural society to the industrial society. The human cost of millions of workers forced to cram in the suburban areas of industrial districts and to compete for badly paid jobs that were never enough to satisfy demand. This period brought child labor, precarious employment, and inhumane working hours without any social security, health care, trade unions, or pension schemes.
We exited this 19th century ‘savage capitalism’ because of trade unionization, revolutions and reforms, to finally arrive at the welfare state. In particular, the system has been saved thanks to the recurring reduction of working hours, aimed at counteracting technological unemployment and reducing exploitation. But in the era of robots will it be possible to continue with these reforms? the transition was for workers during the industrial revolution who faced disruption from agriculture to factory work, and just focus on the end result, our governments may be doing the same. Do we want to prepare for any problems a large disruption could bring or do we want to carry on dismissing it as Luddism?
Conclusion
The speed of technological innovation is rapidly increasing. All these technologies mentioned and the many more emerging ones being developed “should” Hugh Bradlow - "The changes caused by emerging and disruptive technology will have broad implications for society and challenge us to develop responses. The caveat on this utopian view of the future is that for society to benefit from the automation of work, we must have a means of distributing the wealth created by machines.The political and social implications of this change will occur at different speeds in different industries and markets. What is clear is that as a society these are questions we need to consider.
We need to better understand these changes and plan how to deal with these changes well in advance of their actual occurrence." be amazing. Less people having to work mundane jobs, more productivity, the ability to construct houses faster, cheaper and stronger, self driving cars saving lives and allowing disabled people to travel easier, 3D printing saving on transportation and environmental costs as goods no longer having to be shipped from China, cheaper access to expert knowledge and aid from around the world, a team of the best medical, legal, education experts available in your pocket, the list goes on...
It will be really incredible, once we reach this incredible future but we need to manage the journey there well so that everyone can experience Riccardo Campa - Services requiring efficiency rather than creativity will also be performed by robots. Will we all be assigned to frivolous or useless services? It could be one solution, but it would seem that even this road is blocked. The ‘service economy’ functions today because many humans willing to buy services work in the primary industries, and so return money to the service providers, who in turn use it to buy life’s essentials. As the pool of humans in the primary industries evaporates, the return channel chokes off; efficient, no-nonsense robots will not engage in frivolous consumption.
Money will accumulate in the industries, enriching any people still remaining there, and become scarce among the service providers. Prices for primary products will plummet, reflecting both the reduced costs of production, and the reduced means of the consumers. In the ridiculous extreme, no money would flow back, and the robots would fill warehouses with essential goods which the human consumers could not buy.
Moravec effectively reminds us that “an analogous situation existed in classical and feudal times, where an impoverished, overworked majority of slaves or serfs played the role of robots, and land ownership played the role of capital. In between the serfs and the lords, a working population struggled to make a living from secondary sources, often by performing services for the privileged.” and enjoy the increased wealth and prosperity of advancing technology, not just the 1%. We should all be able to equally welcome our new robotic overlords which have the potential to improve all of our lives substantially.
Given the rate of change of technology, preparation for dealing with this disruption must begin now. According to Thomas Piketty Thomas Piketty - “If you get slow growth alongside better financial returns, then inherited wealth will, on average, dominate wealth amassed from a lifetime's labour by a wide margin".
“Wealth will concentrate to levels incompatible with democracy, let alone social justice. Capitalism, in short, automatically creates levels of inequality that are unsustainable. The rising wealth of the 1% is neither a blip, nor rhetoric.” we are entering into an economy where the rate of return on capital outstrips the rate of growth, inherited wealth will always grow faster than earned wealth. If capitalism Riccardo Campa - "One of capitalism’s most durable myths is that it has reduced human toil. This myth is typically defended by a comparison of the modern forty-hour week with its seventy- or eighty-hour counterpart in the nineteenth century.” The problem is that “working hours in the mid-nineteenth century constitute the most prodigious work effort in the entire history of humankind.”
In the preindustrial era the situation was much different. Just to give a few examples, a thirteenth-century estimate “finds that whole peasant families did not put in more than 150 days per year on their land. Manorial records from fourteenth-century England indicate an extremely short working year -- 175 days -- for servile laborers. Later evidence for farmer-miners, a group with control over their worktime, indicates they worked only 180 days a year.”
There is no reason why a technologically advanced society should force its citizens to work harder than their ancestors, when they could work a lot less and without giving up their modern life standards. Among other things, this policy would also give workers more free time to take care of their children, the elderly and the disabled. Or they could just spend time with their families and friends, if the care of people is entrusted to robots. Unfortunately few are aware of the irrationality of our current situation." is failing and can no longer provide opportunity, social mobility or a better future for the next generation, if capitalism produces stagnant wages and higher living costs, unemployment, child poverty, global warming and rising wealth and income inequality which is creating a 2 class Riccardo Campa - Technological unemployment limits the demand for unskilled labor. It will also further centralize capital because the owners of the robots will be able to extract more profit from their machines in comparison to production based on human labor where profits need to be shared with workers.
However, the demand for skilled maintenance staff will increase, as will their salaries. This will divide society into a small group of owners of the means of production, the specialists in the realm of technology development and maintenance, the class servicing these groups, and the majority of population – those who cannot sell their labor on the labor market. society, if these trends Riccardo Campa - Technological unemployment limits the demand for unskilled labor. It will also further centralize capital because the owners of the robots will be able to extract more profit from their machines in comparison to production based on human labor where profits need to be shared with workers.
However, the demand for skilled maintenance staff will increase, as will their salaries. This will divide society into a small group of owners of the means of production, the specialists in the realm of technology development and maintenance, the class servicing these groups, and the majority of population – those who cannot sell their labor on the labor market. have no sign of stopping then we as a society need to start criticising capitalism. Albert Einstein - "The economic anarchy of capitalist society as it exists today is, in my opinion, the real source of the evil. We see before us a huge community of producers the members of which are unceasingly striving to deprive each other of the fruits of their collective labor—not by force, but on the whole in faithful compliance with legally established rules. In this respect, it is important to realize that the means of production—that is to say, the entire productive capacity that is needed for producing consumer goods as well as additional capital goods—may legally be, and for the most part are, the private property of individuals.
Private capital tends to become concentrated in few hands, partly because of competition among the capitalists, and partly because technological development and the increasing division of labor encourage the formation of larger units of production at the expense of smaller ones. The result of these developments is an oligarchy of private capital the enormous power of which cannot be effectively checked even by a democratically organized political society." We need to evaluate and decide whether or not its the best system for our future. Why the Market and Technology Aren’t Playing Well Together -
Our technology and our market system, once comfortable collaborators, are increasingly on a collision course. This is because these two institutions have fundamentally opposing goals. The goal of the marketplace is to find and exploit scarcity. The goal of technology is to find and eliminate scarcity. The second goal undermines the first.
Inequality arises from the fact that the few remaining scarce resources are increasingly concentrated in the hands of the few. We can think of the economy as like a game of musical chairs where the chairs are scarce resources. As the chairs get removed, fewer and fewer people have a place to sit.
In the past it has been possible to find new chairs to replace those that have been taken away. It might still be possible to do so. But it increasingly feels like the game is being played faster and faster—that the chairs are being removed much quicker than we can replace them. If the American Dream becomes to not have poor parents then maybe capitalisms time is up.
We need to aspire for a more sustainable and egalitarian society, move towards and promote people to organise their place of work and the means of production, Albert Einstein - "Production is carried on for profit, not for use. There is no provision that all those able and willing to work will always be in a position to find employment; an “army of unemployed” almost always exists. The worker is constantly in fear of losing his job. Since unemployed and poorly paid workers do not provide a profitable market, the production of consumers’ goods is restricted, and great hardship is the consequence. Technological progress frequently results in more unemployment rather than in an easing of the burden of work for all. This crippling of individuals I consider the worst evil of capitalism. Our whole educational system suffers from this evil. An exaggerated competitive attitude is inculcated into the student, who is trained to worship acquisitive success as a preparation for his future career.
I am convinced there is only one way to eliminate these grave evils, namely through the establishment of a socialist economy, accompanied by an educational system which would be oriented toward social goals. In such an economy, the means of production are owned by society itself and are utilized in a planned fashion. A planned economy, which adjusts production to the needs of the community, would distribute the work to be done among all those able to work and would guarantee a livelihood to every man, woman, and child. The education of the individual, in addition to promoting his own innate abilities, would attempt to develop in him a sense of responsibility for his fellow men in place of the glorification of power and success in our present society. which may increasingly be “the robots”, into more equal, fairer and democratic arrangements such as Worker Cooperatives. Mondragon - The Mondragon Corporation is a corporation and federation of worker cooperatives based in the Basque region of Spain, It is the world's biggest workers co-operative with annual sales over £13 billion ($19.44 billion). At the end of 2013, it employed 74,061 in four areas of activity: finance, industry, retail and knowledge.
At Mondragon, there are agreed-upon wage ratios between executive work and field or factory work which earns a minimum wage. These ratios range from 3:1 to 9:1 in different cooperatives and average 5:1. That is, the general manager of an average Mondragon cooperative earns no more than 5 times as much as the theoretical minimum wage paid in his/her cooperative.
They are a Democratic organisation, Its worker members own Mondragon collectively and make all its basic decisions, no private or individual ownership of Mondragon exists. In the MCC, the worker-members exercise the final power over capital (machines, technology, cash, investments). They are not just, as in capitalism, “the workers.” The managers each have one share, like the workers; because the workers outnumber the managers and democratic votes settle all matter, the workers can fire the managers, not the other way around. Governments need to redistribute wealth Inequality - In the US the top 0.1 percent are now worth more than the entire bottom 90 percent of the U.S. population, the top 1 percent of households in the United States received 8.9 percent of all pre-tax income in 1976.
In 2012, the top 1 percent share had more than doubled to 22.46 percent. The overall bounty is not being distributed equally, it is quickly accumulating at the top, leaving everyone else with less. through tax and encourage unions, especially for the increasing amount of unstable independent workers, they need to bring democracy, regulation and fair benefits to their work places. The Uber model, where all the financial risks go to the employee and they receive no employee benefits, regulations, or stability where they can be fired easily without warning can not be the future of employment for the next generation. Independent freelancers need to unionise. These measures will help promote fairer wages which will reduce the extreme forms of income inequality Redistribute Income - Less CEO’s stashing money away in tax havens and not spending it into the local economy. With wages spread out more evenly, more growth will occur, people will have more money which can be taxed to provide the better education facilities for people to retrain. we are experiencing. By reducing income inequality a shorter work week Vivek Wadhwa - "The only solution that I see is a shrinking work week. We may perhaps be working for 10 to 20 hours a week instead of the 40 for which we do today. And with the prices of necessities and of what we today consider luxury goods dropping exponentially, we may not need the entire population to be working.
There is surely a possibility for social unrest because of this; but we could also create the utopian future we have long dreamed of, with a large part of humanity focused on creativity and enlightenment." and more vacation time is now possible as people earn more per hour, as people cut down on hours then more available hours are created for unemployed people to work. This sustains economic growth, alleviates unemployment, increases leisure time and GDP and allow more tax to be gained to fund the next solution.
In many areas productivity has become divorced Robots do everything for us - Currently 13 people can produce enough cotton for 9.4 million T-shirts. If less people are required to make the things we need then surely that's a good thing for society? I was certainty jealous of the humans on indefinite galactic cruise vacation whilst watching Wall-E. from employment. We need to accept that it isn't immoral to be unemployed. We can’t continue with our attitude everyone must earn a living Buckminster Fuller - - "We must do away with the absolutely specious notion that everybody has to earn a living. It is a fact today that one in ten thousand of us can make a technological breakthrough capable of supporting all the rest.
The youth of today are absolutely right in recognising this nonsense of earning a living. We keep inventing jobs because of this false idea that everybody has to be employed at some kind of drudgery because, according to Malthusian-Darwinian theory, they must justify their right to exist.
So we have inspectors of inspectors and people making instruments for inspectors to inspect inspectors. The true business of people should be to go back to school and think about whatever it was they were thinking about before somebody came along and told them they had to earn a living." or victim blaming the poor or unemployed when they are obviously suffering and need the most help, not abuse. We have to agree as a society to support the unfortunate people who are disrupted, Soctt Santens - Give a man a fish, he eats for a day. Teach a man to fish, he eats for a lifetime. Build a robot to fish, do all men starve, or do all men eat?" not vilify them. Once this is achieved and reductions in wealth/income inequality it will be easier to create and fund an Unconditional Basic Income. This will guarantee every citizen a right to a minimum level of subsistence which will allow safety nets for people who are disrupted so they can safely be able to retrain and find new meaningful Less Work, More Leisure - I don't believe cutting the work week or basic income will make people lives meaningless, for proof just look how many people look forward to retiring or people who have retired, they seem pretty content. Claims that people need work because its the only way for people to have social aspect and benefits, purpose, fulfilment or prevent boredom is just not true.
Sport is just one simple example which can give people all those things, for others that desire to be productive there is plenty of work that needs doing but currently has no financial incentive such as caring for the elderly, volunteering for charities or community work. and engaging work without the fear Jeremy Rifkin - "The emerging new economy offers greater potential opportunity for self-development and promises more intense rewards than traditional employment.
And since intelligent technology will do most of the heavy lifting in an economy centred on sustainable abundance rather than scarcity, in a half-century from now our grandchildren may look back at mass-market employment with the same disbelief with which we look upon slavery and serfdom.
The idea that a human being's worth was measured almost exclusively by his or her productive output of goods, services and material wealth will seem primitive, even barbaric." of starvation, poverty, homelessness or other kinds of suffering that occur now. Just improving education Martin Ford - "The very conventional solution that we're always offered which was give people more training, give them more education so they can do a higher level job, that simply may not work because those jobs are also quite likely to be automated.
So I think we need to do something different and what I have proposed is that eventually we're going to have to move toward a Guaranteed Income where everybody is guaranteed at least some livable income in our society." won't be enough on it's own, the above solutions are vital and there are many others but with the huge length of this already I picked my top 3, I feel these are most effective and I hope we will be able to make the public more aware of the potential impact of Exponential Disruption we face and the policies to ease the transition into an abundant future for all.
What will mass amounts of humans have to offer in labor in 50 years that cant be done by the advancing ai, machines and software and why that shouldn't be a good thing, it means after centuries of struggling for survival we can finally sit back and enjoy being alive full time. All this technology is meant to make our lives better by freeing us from work. Can we not imagine a situation where the majority of our needs are taken care of, material and construction needs by 3D printers and robotics, energy by solar, wind and fusion, education and health by ai, food grown indoors and harvested by robots and fresh water extracted from the ocean? I discuss this incredible future of abundance on my website www.LiveLikeACat.com Live Like A Cat - We can see new technology which can produce abundant renewable energy and soon harness nuclear fusion to create an endless supply of cheap Energy. Once we have abundant energy it can be put to use turning sea water in fresh Water, using this to grow abundant amounts of food in new advanced higher yielding indoor farms, soon everyone will be vegetarians eating meat grown in labs.
The Materials we consume can be created using 3D printing. Health and Education looks to get much better thanks to technology, even the poorest will soon have access to the world best teachers and doctors.
Computers are getting exponentially more powerful, driving the capabilities of robot and automation tools, if they replace workers at a faster rate than job creation can keep up with then solutions to allow everyone to House themselves and still have an Income are discussed.
We are about to cross an ocean and awaiting at the other end is a fantastic land full of prosperity and abundance where all our needs are taken care off and no one suffers. Unfortunately towards the end of this journey the seas will become increasingly stormy and to make matter worse the majority of us have flimsy boats. We need to prepare people adequately for the stormy seas ahead by allowing people opportunities to rebuild and improve their boat along the journey, allow safety ropes for people who fall out of their boat, and ask some of the people with bigger boats to share some of their wood. This storm is coming, its up to us how many casualties we want to prevent. - Nathan Leigh
Go to top


Play this exciting Trivia Game and test your knowledge of trivia questions across many different topics! You can choose your difficulty level that you want to play - Easy, Medium or Hard - or even play Random which will mix questions of different difficulty levels.
After each game, you can save your score to our High Score list! See if you can climb to the top of this list!
Play to win, and most importantly, play to prove that you're not a Bodoh Lah!
CloseQuestion No:
Difficulty:
Score:


| filehandle/stream = a valid variable set with the OpenFile, ReadFile command, or OpenTCPStream (v1.52+) |
|
Once you've opened a disk file (or stream) for reading, use this command to read a single byte at a time from the file/stream. Note, a byte is an integer that can take the values 0..255 and occupies 8 bits of storage. Since characters are stored as byte values this function can be used to read a file one character at a time. Reading beyond the end of file does not result in an error, but each value read will be zero.
Advanced notes The number that is stored by WriteByte is actually the least significant byte of an integer so negative numbers and numbers above 255 will still have a value between 0..255. Unless you understand how 32 bit integers are stored in 2's compliment notation this will seem strange but it is NOT a bug. Streams can only be used in Blitz Basic v1.52 or greater. |
|
; Reading and writing a file using ReadByte and WriteByte functions
; Initialise some variables for the example Byte1% = 10 ; store 10 Byte2% = 100 ; store 100 Byte3% = 255 ; store 255 ( the maximum value that can be stored in a Byte) Byte4% = 256 ; try to store 256 this will end up as 0 ( i.e. 256 - 256 = 0 ) Byte5% = 257 ; try to store 257 this will end up as 1 ( i.e. 257 - 256 = 1 ) Byte6% = -1 ; try to store -1 this will end up as 255 ( i.e. 256 -1 = 255 ) Byte7% = -2 ; try to store 256 this will end up as 254 ( i.e. 256 - 2 = 254 ) Byte8% = Asc("A") ; Store the ASCII value for the Character "A" ( i.e. 65 ) ; Open a file to write to fileout = WriteFile("mydata.dat ") ; Write the information to the file WriteByte( fileout, Byte1 ) WriteByte( fileout, Byte2 ) WriteByte( fileout, Byte3 ) WriteByte( fileout, Byte4 ) WriteByte( fileout, Byte5 ) WriteByte( fileout, Byte6 ) WriteByte( fileout, Byte7 ) WriteByte( fileout, Byte8 ) ; Close the file CloseFile( fileout ) ; Open the file to Read filein = ReadFile("mydata.dat") Read1 = ReadByte( filein ) Read2 = ReadByte( filein ) Read3 = ReadByte( filein ) Read4 = ReadByte( filein ) Read5 = ReadByte( filein ) Read6 = ReadByte( filein ) Read7 = ReadByte( filein ) Read8 = ReadByte( filein ) ; Close the file once reading is finished CloseFile( filein ) Print "Written - Read" Write Byte1 + " - " : Print Read1 Write Byte2 + " - " : Print Read2 Write Byte3 + " - " : Print Read3 Write Byte4 + " - " : Print Read4 Write Byte5 + " - " : Print Read5 Write Byte6 + " - " : Print Read6 Write Byte7 + " - " : Print Read7 Write Byte8 + " - " : Print Chr$( Read8 ) WaitKey() |


This document defines the EPICS V4 communication protocol called "pvAccess." pvAccess is a high-performance network communication protocol for signal monitoring and scientific data services interconnect. It is designed to support the structured data types of the EPICS V4 "shared memory" data exchange system called pvData, for optimized interoperability of control system endpoints. It is a successor of EPICS Channel Access.
The connection setup requirements and individual message constructs of pvAccess are described. It is intended that sufficient detail is given for a reader to create an interoperable pvAccess implementation. A reference implementation is being created by the EPICS V4 Working Group.
For more information about the EPICS, please refer to the home page of the Experimental Physics and Industrial Control System.
This is the 15th December 2011 version of the pvAccess Protocol Specification. This version was approved by the EPICS V4 Working group to be published as the Second Public Working Draft of the specification. This public working draft is intended for the EPICS community to review and comment. Resulting comments will drive subsequent revisions of the specification and the EPICS V4 Working Group's reference implementation.
The present implementation of pvAccess largely reflects the specification as written here. Another document will soon be written to track the status of the reference implementation with respect to the specification, showing what has yet to be implemented.
The terms MUST, MUST NOT, SHOULD, SHOULD NOT, REQUIRED, and MAY when highlighted (through style sheets, and in uppercase in the source) are used in accordance with RFC 2119 [RFC2119]. The term NOT REQUIRED (not defined in RFC 2119) indicates exemption.
pvAccess is a high-performance network communication protocol. It is primarily designed for efficient signal monitoring and the data requirements of a service oriented architecture. It is a successor of of EPICS Channel Access.
TCP/IP is used for data transmission. UDP/IP is normally used for discovery, although discovery over TCP/IP is also allowed. The protocol itself supports IPv6, i.e. all addresses are IPv6 encoded.
pvAccess depends heavily on pvData [pvData homepage] [Please convert this to a reference to Bibliography at bottom of the document]. All data are sent as pvData objects. The protocol is optimized to send the minimum amount of data [subject to what? should say "send the minimum amount of data while maintaining some condition", otherwise minimum is just 0]. pvAccess supports segmented messages and thus allows the sending of large amounts of data using small buffers. The maximum message size is not limited with respect to the send or receive buffer sizes.
The pvAccess protocol definition consists of three major parts:
The goals of the pvData data encoding are simplicity and efficiency. In keeping with these goals, the encoding does not align primitive types on word boundaries and therefore eliminates the wasted space, and additional complexity, that alignment requires. The pvAccess data encoding simply produces a stream of contiguous bytes; data contains no padding bytes and need not be aligned on word boundaries. However, array encoding is an exception. All arrays are aligned to 64-bit boundaries (the first element of each array is padded). The message header is then also 64-bit aligned.
For connection-oriented communication (TCP/IP), byte-order is negotiated between client and server - server wins [How can there be a negotiation if the server always wins?]. In order to allow all the intermediates to forward data without requiring it to be unmarshaled (so that the intermediates can forward requests by simply copying blocks of binary data), and in order not to require a specific byte-order for connection-less protocols (UDP), each message indicates its own endianness.
Many of the types involved in the data encoding, as well as several protocol message components, have an associated size (or "count"). Size values are always a non-negative number and encoded in one of two ways:
Using this encoding to indicate size is significantly cheaper than always using a 32-bit integer to store the size. This is especially true when marshalling sequences of short strings: counts of up to 253 require only a single byte instead of four. This comes at the expense of counts greater than 253, which require five bytes instead of four. However, for sequences or strings of length greater than 253, the extra byte is insignificant.
The basic types are encoded as shown in Table 1. Integer types (byte, short, int, long) are represented as two’s complement numbers. Floating point types (float, double) use the IEEE-754 standard formats [IEEE_754-1985 Wiki [Please move ref to a Bibliography]].
| Type | Encoding |
|---|---|
| boolean | A single byte with value non-zero value for true, 0 for false. |
| byte | Signed 8-bit integer. |
| short | Signed 16-bit integer. |
| int | Signed 32-bit integer. |
| long | Signed 64-bit integer. |
| float | 32-bit float (IEEE-754 single-precision float). |
| double | 64-bit float (IEEE-754 double-precision float). |
Strings are encoded as a size, followed by the string contents in a UTF-8 format array of bytes. Strings are not null terminated. An empty but non-null string is encoded with a size of zero.
On the wire, pvAccess transmits all strings as Unicode strings in UTF-8. Non-C++ bindings of the pv normative implementations (pvAccess and pvData [Add biblio references] in particular) will use strings in their language-native Unicode representation and convert automatically to and from UTF-8 for transmission, so applications can transparently use characters from non-English alphabets. However, for C++, how strings are represented inside a process depends on the platform as well as the mapping that is chosen for a particular string. The default mapping is to std::string.
Arrays are encoded as a size representing the number of elements in the array, followed by the elements encoded as specified for their type [Add reference to types].
BitSet is a pvData internal data type that represents a group of bits. It is serialised as a byte array.
pvAccess defines a structure to inform endpoints about completion status. It is nominally defined as:
struct Status { byte type; // enum { OK = 0, WARNING = 1, ERROR = 2, FATAL = 3 } string message; string stackDump; // optional (provides more context data about the error), can be empty };
In practice, since the majority of Status instances would be OK with no message and no
stackDump, a special definition of Status is made in the common case that all three
of these conditions are met. If Status would be OK and no message and no stackDump
are to be sent, then the special type value -1
is used and string fields are omitted:
struct StatusOK { byte type = -1; };
NOTE: a decision was made not to use a potentially large set of hardcoded error codes (enum), covering predicted issues. Rather, Status uses a short summary error "type" code, and permits any status message. This allows Status to express problems precisely, and avoids book-keeping problems.
Each pvData datum (i.e. an instance of PVField) has an introspection description (i.e. an instance of a Field). A PVField is encoded as raw values. The Field provides metadata, which describes the data type of its associated PVField [Should include a statement about what happens when a PVField expresses a structure. Maybe "If a PVField expresses a structure, then its Field will describe each member of that structure"]. Since many different PVField instances share the same introspection description, it can be cached to avoid repeatedly sending it over the wire. Thus, Field encoding starts with a byte whose value must be one of the following: NULL, ID only or ID with actual Field serialization. The ID is encoded as short, and is a key used to cache Field descriptions. This cache is called the "introspection registry." IDs are valid only within one connection. Moreover, they can be defined only by the sender. The receiver only keeps track of IDs to be able to do deserialization. Since communication is full-duplex this implies two introspection registries per connection.
| Field Encoding | Type | Description |
|---|---|---|
| 0xFF | NULL_TYPE_CODE | No introspection data. |
| 0xFE + ID | ONLY_ID_TYPE_CODE | Serialization contains only an ID (that was assigned by one of the previous FULL_WITH_ID descriptions). |
| 0xFD + ID + FieldDesc | FULL_WITH_ID_TYPE_CODE | Serialization contains an ID (that can be used later, if cached) and full interface description. |
An actual Field introspection description (FieldDesc) is encoded as a byte that consists of 2 nibbles (4-bits). The upper nibble (MSBs) defines Field type (i.e. Type), the low nibble (LSBs) defines the data type (i.e. ScalarType) for scalar and scalarArray types. That byte is then followed by the Field instance name encoded as a string. Structure and structureArray types require more description. A structure requires an array of Fields (size followed by one or more Field as described above). StructureArray is similar, in addition it requires the name of the structure.
| FieldDesc Encoding | Type | Description |
|---|---|---|
| 0x00 | ScalarType (0b0000xxxx) + name | scalar | Scalar. |
| 0x10 | ScalarType (0b0000xxxx) + name | scalarArray | Array of scalars. |
| 0x20 (0b00100000) + name + Field[] | structure | Structure. |
| 0x30 (0b00110000) + name + (structure name + Field[]) | structureArray | Array of structures. |
| Encoding | ScalarType |
|---|---|
| 0 (0b0000) | boolean |
| 1 (0b0001) | byte |
| 2 (0b0010) | short |
| 3 (0b0011) | int |
| 4 (0b0100) | long |
| 5 (0b0101) | float |
| 6 (0b0110) | double |
| 7 (0b0111) | string |
Given the following structure, as my be expressed by a pvData PVStructure:
structure test1 structure timeStamp long secondsPastEpoch int nanoSeconds structure[] value structure org.epics.ioc.test.testStructure double value structure location double x double y string factoryRPC structure arguments int size structure element double value structure alarm int severity string message structure timeStamp long secondsPastEpoch int nanoSeconds
The introspection description of the above structure would be encoded by pvAccess as the following:
FD 00 01 20 05 74 65 73 74 31 05 FD 00 02 20 09 .... .tes t1.. .... 74 69 6D 65 53 74 61 6D 70 02 04 10 73 65 63 6F time Stam p... seco 6E 64 73 50 61 73 74 45 70 6F 63 68 03 0B 6E 61 ndsP astE poch ..na 6E 6F 53 65 63 6F 6E 64 73 FD 00 03 30 05 76 61 noSe cond s... 0.va 6C 75 65 20 6F 72 67 2E 65 70 69 63 73 2E 69 6F lue org. epic s.io 63 2E 74 65 73 74 2E 74 65 73 74 53 74 72 75 63 c.te st.t estS truc 74 75 72 65 02 06 05 76 61 6C 75 65 FD 00 04 20 ture ...v alue ... 08 6C 6F 63 61 74 69 6F 6E 02 06 01 78 06 01 79 .loc atio n... x..y 07 0A 66 61 63 74 6F 72 79 52 50 43 FD 00 05 20 ..fa ctor yRPC ... 09 61 72 67 75 6D 65 6E 74 73 01 03 04 73 69 7A .arg umen ts.. .siz 65 FD 00 06 20 07 65 6C 65 6D 65 6E 74 03 06 05 e... .el emen t... 76 61 6C 75 65 FD 00 07 20 05 61 6C 61 72 6D 02 valu e... .al arm. 03 08 73 65 76 65 72 69 74 79 07 07 6D 65 73 73 ..se veri ty.. mess 61 67 65 FE 00 02 age. ..
Data (i.e. PVField) basically encodes only its data ["Data encodes only its data!" - disambiguate and remove circularity]. The only exception is structureArray. Before each structure of an array there is a boolean flag indicating whether the structure is null or not.
Each structure can have a BitSet instance defining what subset of that structure's fields have been serialized. This allows partial serialization of structures. That is, sending only fields that have changed rather than the entire structure. Each node of a structure corresponds to one bit; if a bit is set then its corresponding field has been serialized, otherwise not. BitSet does not apply to array elements [Clarify role of BitSet with respect to structureArray]>.
bit# field 0 structure 1 structure timeStamp 2 long secondsPastEpoch<PHONE_NUMBER> 3 int nanoSeconds 819000000 4 structure[] value structure org.epics.ioc.test.testStructure double value 100 structure location double x 0 double y 0 structure org.epics.ioc.test.testStructure double value 200 structure location double x 5 double y 10 5 string factoryRPC org.epics.ioc.support.rpc.ExampleChannelRPCFactory 6 structure arguments 7 int size 2 8 structure element 9 double value 0 10 structure alarm 11 int severity 0 12 string message 13 structure timeStamp 14 long secondsPastEpoch 0 15 int nanoSeconds 0
The structure above requires 16 bits, i.e. 2 bytes.
NOTE: for performance reasons BitSet implementation stores bits as longs, however serialization is optimized to send only least possible number of bytes (the LSB part that covers all the bits set).
If the bit corresponding to a structure node is set then all the fields of that node have to be de-/serialized. The example below shows the case where an entire structure is sent, i.e. bit 0 is set:
01 01 00 00 00 00 4D 48 00 48 .. .... MH.H 30 D0 F2 C0 02 01 40 59 00 00 00 00 00 00 00 00 0... ..@
NOTE: first six bytes are erased in the illustration above because they were not part of this example structure's serialization.
The pvAccess protocol uses two protocol message types:
Each message consists of a message header and, optionally, a message payload that immediately follows the header. The message part is aligned to 64-bits.
Each protocol message has a fixed 8-byte header that is encoded as if it were expressed by the following structure:
struct pvAccessHeader { byte magic; byte version; byte flags; byte messageType; int payloadSize; };
| Member | Description |
|---|---|
| magic | pvAccess protocol magic code, 0xCA. |
| version | Protocol reversion. |
| flags | Message flags. |
| messageType | Message type (i.e. create, get, put, process, etc.). |
| payloadSize | Message payload size (non-aligned, in bytes). |
| bit | Description |
|---|---|
| 0 | Application/Control [0/1] message. |
| 1,2,3 | Unused |
| 4 | First message (of set of segmented messages). |
| 5 | Last message (of set of segmented messages). |
| 6 | Unused. |
| 7 | Little/Big [0/1] endian byte order. |
NOTE: If bits 4 and 5 are both set this indicates this message is between the first and last message of a set of segmented messages. If neither is set then this message is not part of a segmented set What about if either but not both is set?.
This section describes all the application messages (0-th bit of pvAccessHeader.flags is not set) for different pvAccessHeader.messageType values.
In order to understand specific application messages it is strongly recommended to be familiar with the pvAccess client interface.
Beacons are sent over UDP to clients. Beacons are only used to announce new servers and server restarts.
struct beaconMessage { short beaconSequenceId; long startupTimeSeconds; int startupTimeNanos; byte[16] serverAddressIPv6; short serverPort; FieldDesc serverStatusIF; [if serverStatusIF != null] PVField serverStatus; };
| Member | Description |
|---|---|
| beaconSequenceId | Beacon sequence ID (counter w/ rollover). Can be used to detect UDP routing problems. |
| startupTimeSeconds | Server startup time (seconds past 1.1.1970). |
| startupTimeNanos | Server startup time (nanoseconds part). |
| serverAddressIPv6 | Server IPv6 address (or IPv6 encoded IPv4 address). |
| serverPort | Server port (where server TCP/IP is listening). |
| serverStatusIF | Optional server status Field description. |
| serverStatus | Optional server data. |
A beacon received from an as yet unknown serverAdddressIPv6:serverPort means new server has come online. A beacon with the same serverAdddressIPv6:serverPort address as one already received but different startupTime{Seconds,Nanos} means that a server was restarted.
NOTE: it was agreed by the EPICS V4 Working Group that servers would have time set on every restart (via NTP).
NOTE: beacons are no longer used to report server-alive status (this is done by monitoring TCP/IP traffic – if there is traffic from a server, then that server is alive). This reduces UDP traffic. A server must at least send a couple of beacons to notify that it is alive (e.g. 1Hz). After this it can stop sending them, or send at a low rate (one per every couple of minutes) to report serverStatus. [Not clear whether the server must initially send beacons at some rate (as suggested by giving a rate of 1Hz example, or only once.]
A "connection validation" message must be first application message sent from the server to a client when a TCP/IP connection is established. The message indicates that the server is ready to receive requests; the client must not send any messages on the connection until it has received a connection validation message from the server.
The purpose of the connection validation message is two-fold:
The connection validation message guarantees that a server is not in the middle of shutting down when the server's TCP/IP stack accepts an incoming connection and so avoids the race condition.
struct connectionValidationRequestToClient { int serverReceiveBufferSize; int serverReceiveSocketBufferSize; }; struct connectionValidationResponseFromClient { int clientReceiveBufferSize; int clientReceiveSocketBufferSize; short priority; // for now in range of [0-100] };
An Echo diagnostic message is usually sent when there is a suspicion that the server is no longer functional (no TCP/IP traffic). It can also be sent over UDP/IP to get list of all servers.
struct echoRequest { byte[] somePayload; }; struct echoResponse { byte[] samePayloadAsInRequest; };
A channel "search request" message can be sent over UDP/IP, however UDP congestion control is highly recommended to implemented in this case. ["can" indicates there is an alternative; clarify when UDP/IP and when not, if not then what's the alternative and in what circumstances]
struct searchRequest { int searchSequenceID; byte replyRequired; // 0x01 if “response required” (even for not found channels), otherwise 0x00 struct { // not serialized as pvData int searchInstanceID; string channelName; } channels[]; };
The response to a search request MUST be sent as messageType 0x04, see below.
A "search response" message MUST be sent as the response to a search request (0x03) message.
struct searchResponse { int searchSequenceID; boolean found; byte[16] serverAddressIPv6; short serverPort; int[] searchInstanceIDs; };
NOTE: we enforce TCP here, what about making it more generic and returning URI instead. [Seems two things are being said by this note. Split them up. If search response MUST be made in TCP say so explicitly. The question should be a separate note.]
[Insert the purpose and function of the create channel message]
struct createChannelRequest { struct { // not serialized as pvData int clientChannelID; // generated by a client string channelName; } channels[]; }; struct createChannelResponse { // per channel int clientChannelID; int serverChannelID; // generated by a server Status status; //TODO short accessRights; };
NOTE: A server MUST store the clientChannelID and respond back with its value in a destroyChannelMessage, see below [in what circumstances]. A client uses the serverChannelID value for all subsequent requests on the channel. Client side code MUST NOT make any assumptions about how given IDs are generated. IDs MUST be unique within a connection but MAY be recycled [recycled within what scope?.
[Insert the purpose and function of the destroy channel message]
struct destroyChannelRequest { struct { // not serialized as pvData int clientChannelID; int serverChannelID; } channels[]; };
NOTE: A server MAY send this message to a client to notify the client about remote channel destruction. Subsequently, a client MUST MUST, or MAY? start sending search request messages for the channel.
[Insert the purpose and function of the channel get message]
[Insert explanatory text for EVERY SINGLE message struct, even if its function, definition and content values appear self evident.]
struct channelGetRequestInit {
int serverChannelID;
int requestID;
byte subcommand = 0x08;
FieldDesc pvRequestIF;
PVField pvRequest;
};
[Insert explanatory text for EVERY SINGLE message struct, even
if its function, definition and content values appear self evident.]
struct channelGetResponseInit {
int requestID;
byte subcommand; // same as in request
Status status;
FieldDesc pvStructureIF;
};
[Insert explanatory text for EVERY SINGLE message struct, even
if its function, definition and content values appear self evident.]
struct channelGetRequest {
int serverChannelID;
int requestID;
byte subcommand = 0x40 mask for GET; 0x10 mask for DESTROY;
};
[Insert explanatory text for EVERY SINGLE message struct, even
if its function, definition and content values appear self evident.]
struct channelGetResponse {
int requestID;
byte subcommand; // same as in request
Status status;
BitSet changedBitSet;
PVField pvStructureData;
};
struct channelPutRequestInit {
int serverChannelID;
int requestID;
byte subcommand = 0x08;
FieldDesc pvRequestIF;
PVField pvRequest;
};
[Insert explanatory text for EVERY SINGLE message struct, even
if its function, definition and content values appear self evident.]
struct channelPutResponseInit {
int requestID;
byte subcommand; // same as in request
Status status;
FieldDesc pvPutStructureIF;
};
[Insert explanatory text for EVERY SINGLE message struct, even
if its function, definition and content values appear self evident.]
struct channelPutRequest {
int serverChannelID;
int requestID;
byte subcommand = 0x00 mask for PUT; 0x10 mask for DESTROY;
BitSet toPutBitSet;
PVField pvPutStructureData;
};
[Insert explanatory text for EVERY SINGLE message struct, even
if its function, definition and content values appear self evident.]
struct channelPutResponse {
int requestID;
byte subcommand; // same as in request
Status status;
};
[Insert explanatory text for EVERY SINGLE message struct, even
if its function, definition and content values appear self evident.]
struct channelGetPutRequest {
int serverChannelID;
int requestID;
byte subcommand = 0x40;
};
[Insert explanatory text for EVERY SINGLE message struct, even
if its function, definition and content values appear self evident.]
struct channelGetPutResponse {
int requestID;
byte subcommand; // same as in request
Status status;
PVField pvPutStructureData;
};
struct channelPutGetRequestInit {
int serverChannelID;
int requestID;
byte subcommand = 0x08;
FieldDesc pvRequestIF;
PVField pvRequest;
};
[Insert explanatory text for EVERY SINGLE message struct, even
if its function, definition and content values appear self evident.]
struct channelPutGetResponseInit {
int requestID;
byte subcommand; // same as in request
Status status;
FieldDesc pvPutStructureIF;
FieldDesc pvGetStructureIF;
};
[Insert explanatory text for EVERY SINGLE message struct, even
if its function, definition and content values appear self evident.]
struct channelPutGetRequest {
int serverChannelID;
int requestID;
byte subcommand = 0x00 mask for PUT_GET; 0x10 mask for DESTROY;
BitSet toPutBitSet;
PVField pvPutStructureData;
};
[Insert explanatory text for EVERY SINGLE message struct, even
if its function, definition and content values appear self evident.]
struct channelPutGetResponse {
int requestID;
byte subcommand; // same as in request
Status status;
PVField pvGetStructureData;
};
[Insert explanatory text for EVERY SINGLE message struct, even
if its function, definition and content values appear self evident.]
// get remote put structure data struct channelGetPutRequest { int serverChannelID; int requestID; byte subcommand = 0x80; }; struct channelGetPutResponse { int requestID; byte subcommand; // same as in request Status status; PVField pvPutStructureData; };[Insert explanatory text for EVERY SINGLE message struct, even if its function, definition and content values appear self evident.]
// get remote get structure data struct channelGetGetRequest { int serverChannelID; int requestID; byte subcommand = 0x40; }; struct channelGetGetResponse { int requestID; byte subcommand; // same as in request Status status; PVField pvGetStructureData; };
struct channelMonitorRequestInit { int serverChannelID; int requestID; byte subcommand = 0x08; FieldDesc pvRequestIF; PVField pvRequest; }; struct channelMonitorResponseInit { int requestID; byte subcommand; // same as in request Status status; FieldDesc pvStructureIF; };[Insert explanatory text for EVERY SINGLE message struct, even if its function, definition and content values appear self evident.]
struct channelStartMonitorRequest {
int serverChannelID;
int requestID;
byte subcommand = 0x44;
};
[Insert explanatory text for EVERY SINGLE message struct, even
if its function, definition and content values appear self evident.]
struct channelStopMonitorRequest {
int serverChannelID;
int requestID;
byte subcommand = 0x04;
};
struct channelDestroyMonitorRequest {
int serverChannelID;
int requestID;
byte subcommand = 0x10;
};
[Insert explanatory text for EVERY SINGLE message struct, even
if its function, definition and content values appear self evident.]
struct channelMonitorResponse { int requestID; byte subcommand; // same as in request BitSet changedBitSet; PVField pvStructureData; BitSet overrunBitSet; };
struct channelArrayRequestInit {
int serverChannelID;
int requestID;
byte subcommand = 0x08;
FieldDesc pvRequestIF;
PVField pvRequest;
};
[Insert explanatory text for EVERY SINGLE message struct, even
if its function, definition and content values appear self evident.]
struct channelArrayResponseInit {
int requestID;
byte subcommand; // same as in request
Status status;
FieldDesc pvArrayIF;
};
[Insert explanatory text for EVERY SINGLE message struct, even
if its function, definition and content values appear self evident.]
struct channelGetArrayRequest { int serverChannelID; int requestID; byte subcommand = 0x40 mask for GET; 0x10 mask for DESTROY; size offset; // -1 == unspecified size count; // -1 == unspecified }; struct channelGetArrayResponse { int requestID; byte subcommand; // same as in request Status status; PVField pvArrayData; };[Insert explanatory text for EVERY SINGLE message struct, even if its function, definition and content values appear self evident.]
struct channelPutArrayRequest { int serverChannelID; int requestID; byte subcommand = 0x00 mask for PUT; 0x10 mask for DESTROY; size offset; // -1 == unspecified PVField pvArrayData; }; struct channelPutArrayResponse { int requestID; byte subcommand; // same as in request Status status; };[Insert explanatory text for EVERY SINGLE message struct, even if its function, definition and content values appear self evident.]
struct channelSetLengthRequest { int serverChannelID; int requestID; byte subcommand = 0x80 mask for SET_LENGTH; 0x10 mask for DESTROY; size offset; // -1 == unspecified size count; // -1 == unspecified }; struct channelSetLengthResponse { int requestID; byte subcommand; // same as in request Status status; };
// destroys any request with given requestID struct channelDestroyRequestInit { int serverChannelID; int requestID; };
struct channelProcessRequestInit { int serverChannelID; int requestID; byte subcommand = 0x08; FieldDesc pvRequestIF; PVField pvRequest; }; struct channelProcessResponseInit { int requestID; byte subcommand; // same as in request Status status; };[Insert explanatory text for EVERY SINGLE message struct, even if its function, definition and content values appear self evident.]
struct channelProcessRequest { int serverChannelID; int requestID; byte subcommand = 0x00 mask for PROCESS; 0x10 mask for DESTROY; }; struct channelProcessResponse { int requestID; byte subcommand; // same as in request Status status; };
struct channelGetFieldRequest { int serverChannelID; int requestID; string subFieldName; // entire record if empty }; struct channelGetFieldResponse { int requestID; Status status; [if status is success] FieldDesc subFieldIF; };
struct message { int requestID; byte messageType; // info = 0, warning = 1, error = 2, fatalError = 3 string message; };
struct channelRPCRequestInit { int serverChannelID; int requestID; byte subcommand = 0x08; FieldDesc pvRequestIF; PVField pvRequest; }; struct channelRPCResponseInit { int requestID; byte subcommand; // same as in request Status status; };[Insert explanatory text for EVERY SINGLE message struct, even if its function, definition and content values appear self evident.]
struct channelRPCRequest { int serverChannelID; int requestID; byte subcommand = 0x00 mask for RPC; 0x10 mask for DESTROY; FieldDesc pvStructureIF; PVField pvStructureData; }; struct channelRPCResponse { int requestID; byte subcommand; // same as in request Status status; FieldDesc pvResponseIF; PVField pvResponseData; };
Each TCP connection has an associated priority [defined where?], which can be used by a server to prioritize requests. Regardless of how many channels are handled by either client or server, each client and server pair will be connected with exactly one TCP connection for each priority level. The priority is specified when TCP connection is being established.
When establishing a TCP connection, a simple handshake is performed. The client
opens a TCP connection to the server and waits until the Connection Validation
message is received. The server MUST initially send a Set byte-order control message
to notify the client about byte-order the to be used for this TCP connection. After
that the server MUST send the Connection Validation
connectionValidationRequestToClient
message. If client correctly decodes
the Connection Validation message it responds with a
connectionValidationResponseFromClient
response message. After that, client
may start sending requests [which messages may it send
specifically?]. The client SHOULD keep the connection established until the last active
channel gets destroyed. However, to optimize resource reallocation it might delay
connection destruction [delay until when?].
Both parties monitor incoming connection traffic. As long there is incoming traffic, the TCP connection is considered as healthy; if there is no incoming traffic detected within a predetermined period of time [on what timescale?], an echo message MAY BE sent to the other party to trigger incoming traffic to appear. If there no response in a predetermined period of time, the connection MAY BE marked as unresponsive. The connection MAY BE reported to be responsive when an incoming traffic is again detected. Alternatively, incoming traffic monitoring MAY BE be omitted and echo message periodically sent. [Must it be that one or the other of these strategies must be used, or is it permitted to use neither? Can user level code indicate which strategy must be used? If so, how?.
Usually flow control algorithms wait for congestion to occur before they are triggered. They are causal. However, due to the isolated nature of TCP connection - there are always only two parties involved - it is possible to predict congestions using the following algorithm:
A pvAccess implementation SHOULD implement flow control such that each endpoint should try to send as much monitoring data as it can subject to an upper limit calculated with respect to the amount of other party's free receive buffer size. Were this limit to be reached, monitors would start pilling up in the monitors' circular buffer queues [how can monitors start pilling up in monitors anything - is "monitor" being used in two ways?]
The intention of flow control is to avoid having the following behavior (under pure TCP flow control):
Such as situation as described above would result in monitors as below (identified by their sequential number):
0 1 2 3 4 (buffers full) 7 8 9 10 11 12 (buffers full) 22 23 24 25 26 27 28 (buffers full)Flow control can make this better:
0 1 2 3 4 (buffers full) 7 8 (buffers full, but for less time since the server would send only as much as the client can handle) 10 11 (...) 14 15 (...) 18 19
pvAccess uses broadcast/multicast channel discovery mechanism via UDP; search messages are usually sent to a broadcast addresses and servers hosting searched channels respond with a message containing their TCP address and port. In addition pvAccess transparently supports multicast, if an address is a multicast address the implementation should transparently handle it.
To be specified: Proper UDP congestion control needs to be implemented to prevent flooding the network with UDP search messages. Currently a simple and robust algorithm is used in the reference implementation. The algorithm needs to be specified (or some more clever algorithm invented).
This section describes all the control messages (0-th bit of pvAccessHeader.flags is set) for different pvAccessHeader.messageType values.
Payload size field holds the value of total bytes sent.
Payload size field holds the acknowledge value of total bytes received (must match previously received marked value).
7-th bit of header flags field indicated selected byte-order. Payload equals 0.
The following are known items that should be specified in future revisions:


TwilightPunkster K64
09-Mar-19 09:35 AM
can you set up a default unreal project, basically with HDR, Linear coloring, PP, and look into plugin development, wrap me a good example, I can basically then port 6AM and the core plugin to connect with Komodod
sorry discord is lagging, my mem is overloaded
damn machines are too slow for my awesomeness
@fmproductions does unreal have an asset store?
we probably need a stack of crazy


${_(sorted_field)}
Ticket
Owner
${ticket[sorted_field]}
${ticket['type']}#${ticket['id']}: ${ticket['summary']}
Owner: ${ticket['owner']}
Open Date: ${ticket['due_assign']}
Close Date: ${ticket['due_close']}
Complete: ${ticket['complete']}%
Description: ${ticket['description']}
#${ticket['id']}:${ticket['summary'][0:10]}
${ticket['owner']}
|
${weekdays[cur.weekday()]}
${cur.month}/${cur.day}
${cur.year}/${cur.month}
term:
assign = -1
if cls < 0 and not (assign != -1):
cls = 0
if (cls - assign + assign) > term:
cls = term - 1
todow = (cls-assign+1)*dw
if assign*dw+todow > term*dw:
todow = (term-assign)*dw
latew = 0
if base > assign:
latew = (base-assign+1)*dw
if latew > todow:
latew = todow
complete = ticket['complete']
if complete == None or complete == "" or todow <= 0:
complete = 0
else:
complete = int(complete)*barw/100-(gap)*dw
if assign*dw+complete > term*dw:
complete = (term-assign)*dw
?>
|


The parasite script is the main script in charge for your development and deployment process.
It mainly uses the Gulp build system in order to perform its tasks.
Running parasite
or parasite --help
will display all of the available options.
The flow of the development process is as follows:
parasite dev
: you should run this in the background in order to support the development environment.
If you prefer, you can use parasite dev-server
, which also runs the server
(if you use an IDE capable of running the server, it'll be more convenient using the IDE, as you can debug the server side code using breakpoints).
parasite test
: you can run the tests any time you wish.
parasite deploy
: deploy the master branch into the production parasite server.
At the end of the deployment process, if all goes well (pulling the code in parasite, building, running tests),
the deploy
script is run. You should put there any code which should execute in order to update
the server.


OpenWindow()
Syntax
Result = OpenWindow(#Window, x, y, InnerWidth, InnerHeight, Title$ [, Flags [, ParentWindowID]])Description
Opens a new window according to the specified parameters. The new window becomes the active window, it's not needed to use SetActiveWindow() (unless the window is created as invisible).
Parameters
#Window A number to identify the new window. #PB_Any can be used to auto-generate this number. x, y The initial position of the window, in pixels (unless one of the center flags is used). If 'x' or 'y' is set to #PB_Ignore, the OS will choose a position for the window. InnerWidth, InnerHeight The required client area, in pixels (without borders and window decorations). Title$ The title of the newly created window. Flags (optional) Can be a combination of the following values: #PB_Window_SystemMenu : Enables the system menu on the window title bar (default). #PB_Window_MinimizeGadget: Adds the minimize gadget to the window title bar. #PB_Window_SystemMenu is automatically added. #PB_Window_MaximizeGadget: Adds the maximize gadget to the window title bar. #PB_Window_SystemMenu is automatically added. (MacOS only: #PB_Window_SizeGadget will be also automatically added). #PB_Window_SizeGadget : Adds the sizeable feature to a window. #PB_Window_Invisible : Creates the window but don't display. #PB_Window_TitleBar : Creates a window with a titlebar. #PB_Window_Tool : Creates a window with a smaller titlebar and no taskbar entry. #PB_Window_BorderLess : Creates a window without any borders. #PB_Window_ScreenCentered: Centers the window in the middle of the screen. x,y parameters are ignored. #PB_Window_WindowCentered: Centers the window in the middle of the parent window ('ParentWindowID' must be specified). x,y parameters are ignored. #PB_Window_Maximize : Opens the window maximized. (Note: on Linux, not all Windowmanagers support this) #PB_Window_Minimize : Opens the window minimized. #PB_Window_NoGadgets : Prevents the creation of a GadgetList. UseGadgetList() can be used to do this later. #PB_Window_NoActivate : Don't activate the window after opening.ParentWindowID (optional) The WindowID the new window belongs to. 'ParentWindowID' value can be easily obtained with WindowID().
Return value
Nonzero if the window was successfully created, zero otherwise. If #PB_Any was used for the #Window parameter then the generated number is returned on success.
Remarks
All possible events in a window are handled with the WindowEvent() and WaitWindowEvent() functions.
Windows only: for special situations callbacks are used, see description at SetWindowCallback(). On Windows, the height and width of a window with a titlebar can't be less than around 100 pixels. To open smaller windows, use the "#PB_Window_BorderLess" flag.
Important: A window should not be opened in a thread, as there is some limitation on OS X and Linux. A debugger error will be raised.
See Also
CloseWindow()
Supported OS
All


The 2017 CILIP Carnegie Medal longlist has been announced. This prestigious book prize recognises the best children’s and Young Adult titles published each year.
The prize was established in 1936 in memory of the Scottish-born industrialist and philanthropist Andrew Carnegie (1835-1919). Carnegie used his wealth to set up ore than 2,800 libraries, claiming that his use of a library as a child contributed to his successful career. The Medal is awarded by CILIP - the Chartered Institute of Library and Information Professionals.
The shortlist will be announced on Thursday 16 March, and the winner will be presented with their award on Monday 19 June. As well as a gold medal and £5,000, they will receive £500 worth of books to donate to their local library.
Aubrey and the Terrible Yoot, by Horatio Clare
“Aubrey is a rambunctious boy who tries to run before he can walk and has crashed two cars before he’s old enough to drive one. But when his father, Jim, falls under an horrendous spell Aubrey is determined to break it. Everyone says his task is impossible, but with the help of the animals of Rushing Wood, Aubrey will never give up and never surrender - even if he must fight the unkillable Spirit of Despair itself: the TERRIBLE YOOT!”
 Now Prez has come to live with them. But, though he seems cheerful and helpful, he never says a word.
“Then one day Prez answers the door to someone claiming to be his relative. This small, loud stranger carries a backpack, walks with a swagger and goes by the name of Sputnik. As Prez dithers on the doorstep, Sputnik strolls right past him and introduces himself to everyone in the household. Prez is amazed at the response. The family pat Sputnik on the head, call him a good boy and drop food into his mouth. It seems they all think Sputnik is a dog. It’s only Prez who thinks otherwise. But Prez soon finds himself having to defend the family from the chaos and danger unleashed by Sputnik, as household items come to life.”
Unbecoming, by Jenny Downham
“Katie’s life is falling apart: her mum’s controlling, her dad’s run off, she’s in love with someone whose identity she can’t reveal and now her estranged grandmother’s turned up on the doorstep and Katie’s expected to take care of her. Soon Katie discovers she’s not the only one in her family hiding the truth. If she’s going to get her life back together, she’s going to have to expose everyone’s deepest secrets - including her own.
“Spanning three generations of women in one family, Jenny sensitively addresses dementia, single motherhood, and teenage angst.”
The Bone Sparrow, by Zara Fraillon
“Subhi is a refugee. Born in a detention centre, all he knows of the world is that he’s at least 19 fence diamonds high, that the nice jackets never stay long, and at night the sea finds its way to his tent, bringing with it unusual treasures. Bringing him Jimmie.
“Jimmie lives on the Outside. Carrying a notebook that she’s unable to read and wearing a sparrow made out of bone around her neck - both talismans of her family’s past and the mother she’s lost - she strikes up an unlikely friendship with Subhi across the fence. As he reads aloud the tale of how Jimmie’s family came to be, both children discover the importance of their own stories in writing their futures.”
How Not To Disappear, by Clare Furniss
“Hattie’s summer isn’t going as planned. Her two best friends have abandoned her: Reuben has run off to Europe to ‘find himself’ and Kat is in Edinburgh with her new girlfriend. Meanwhile Hattie is stuck babysitting her twin siblings and dealing with endless drama around her mum’s wedding. Oh, and she’s also just discovered that she’s pregnant with Reuben’s baby.
“Then Gloria, Hattie’s great-aunt who no one even knew existed, comes crashing into her life. Gloria’s fiercely independent, rather too fond of a gin sling and is in the early stages of dementia. Together the two of them set out on a road trip of self-discovery - Gloria to finally confront the secrets of her past before they are erased from her memory forever and Hattie to face the hard choices that will determine her future.”
The Smell of Other People’s Houses, by Bonnie-Sue Hitchcock
“Alaska, 1970: growing up here is like nowhere else. Ruth wants to be remembered by her grieving mother. Dora wishes she was invisible to her abusive father. Alyce is staying at home to please her parents. Hank is running away for the sake of his brothers. Four very different lives are about to become entangled. Because if we don’t save each other, how can we begin to save ourselves?”
Whisper To Me, by Nick Lake
“Cassie’s heart was broken when she was younger, by a tragedy she can barely talk about. She lives near the beach, with her angry father and his collection of reptiles, and a voice that whispers strange, dark thoughts into her mind. Cassie is 17 and she is unravelling.
“Even when she first meets him, the boy, the one, she can’t begin to imagine that anything could happen between them. That he might be someone amazing. That in the course of one summer, she will go to the darkest places and back again, with him by her side. That she might have to hurt him to save herself. Told in flashbacks, as a letter from heartbreaker to heartbroken, this powerful, unforgettable novel is intense, explosive and utterly gripping.”
Beetle Boy, by M. G. Leonard
“Darkus is miserable. His dad has disappeared, and now he is living next door to the most disgusting neighbours ever. A giant beetle called Baxter comes to his rescue.
“But can the two solve the mystery of his dad’s disappearance, especially when links emerge to cruel Lucretia Cutter and her penchant for beetle jewellery? A coffee-mug mountain, home to a million insects, could provide the answer - if Darkus and Baxter are brave enough to find it.”
The Stars at Oktober Bend, by Glenda Millard
“Alice is 15, with hair as red as fire and skin as pale as bone, but something inside her is broken. She has a brain injury, the result of an assault.
“Manny was once a child soldier. He is 16 and has lost all his family. When Manny first sees Alice, she is sitting on the rusty roof of her river house, looking like a carving on an old-fashioned ship, sailing through the stars. He has a poem in his pocket and he knows the words by heart. And he is sure that girl has written them. When Manny and Alice meet they find the beginnings of love and healing.”
Pax, by Sara Pennypacker
“Pax was only a kit when his family was killed and he was rescued by ‘his boy’, Peter. Now the country is at war and when his father enlists, Peter has no choice but to move in with his grandfather. Far worse than leaving home is the fact that he has to leave Pax behind.
“But before Peter spends even one night under his grandfather’s roof he sneaks out into the night, determined to find his beloved friend. This is the story of Peter, Pax, and their journeys back to each other as war rampages throughout the country.”
Railhead, by Philip Reeve
“The Great Network is a place of drones and androids, Hive Monks and Station Angels. The place of the thousand gates, where sentient trains criss-cross the galaxy in a heartbeat. It is also a place of great dangers - especially for someone who rides the rails and rides his luck the way Zen Starling does.
“Once Zen was just a petty thief, stealing to support his family and living by his wits. Now everything has changed. Zen is still a thief - but it could be that the key to the whole universe rests on finding out what else he is…”
Beck, by Mal Peet with Meg Rosoff
“Born from a street liason between a poor young woman and an African soldier in the 1900s, Beck is soon orphaned and sent to the Catholic Brothers in Canada. Shipped to work on a farm, his escape takes him across the continent in search for belonging. Enduring abuse and many hardships, Beck has times of comfort and encouragement, eventually finding Grace, the woman with whom he can finally forge his life and shape his destiny as a young man.”
Started by Mal Peet and finished by Meg Rosoff following Peet’s death.
Orbiting Jupiter, by Gary D. Schmidt
“A heartbreaking story, narrated by 12-year-old Jack, whose family is caring for 14-year-old Joseph. Joseph is misunderstood. He was incarcerated for trying to kill a teacher. Or so the rumours say. But Jack and his family see something others in town don’t want to.
“What’s more, Joseph has a daughter he’s never seen. The two boys go on a journey through the bitter Maine winter to help Joseph find his baby - no matter the cost.”
The Marvels, by Brian Selznick
“In The Marvels, Selznick crafts another remarkable artistic and bookmaking achievement that weaves together two seemingly unrelated stories - one in words, the other in pictures - with spellbinding synergy.
“The illustrated story begins in 1766 with Billy Marvel, the lone survivor of a shipwreck, and charts the adventures of his family of actors over five generations. The prose story opens in 1990 and follows Joseph, who has run away from school to an estranged uncle’s puzzling house in London, where he, along with the reader, must piece together many mysteries.”
Salt to the Sea, by Ruta Sepetys
“It’s early 1945 and a group of people trek across Germany, bound together by their desperation to reach the ship that can take them away from the war-ravaged land. Four young people, each haunted by their own dark secret, narrate their unforgettable stories.
“This novel is based on a true story from the Second World War. When German ship the Wilhelm Gustloff was sunk in port in early 1945 it had over 9000 civilian refugees, including children, on board. Nearly all were drowned.”
Island, by Nicky Singer
“Urban teenager Cameron arrives in an uninhabited Arctic island. He’s prepared for ice and storms and, stripped of his smart technology, possibly boredom. But he’s not prepared for 24-hour daylight and erupting graves!
 But, as the island reveals itself to him, he begins to see, and hear, things that push him right to the edge of the possible. One of them is an Inuit girl. The other is a large white bear.”
Dreaming the Bear, by Mimi Thebo
“Dad made me come to this snowy wilderness. My natural habitat is the shopping mall and the multi-screen cinema. I miss my friends and I’m not good at skiing or chopping wood or living without wi-fi.
“Mum, Dad and Jem are all thriving here but I’m getting weaker and sicker with each day that passes. Then I find the bear. She’s huge and scary, but she makes me feel alive and connected to this amazing place. The thing is, she needs me just as much as I need her. And I don’t know if I’m strong enough.”
Time Travelling with a Hamster, by Ross Welford
"”My dad died twice. Once when he was thirty nine and again four years later when he was 12.”
“On Al Chaudhury’s 12th birthday his beloved Grandpa Byron gives him a letter from Al’s late father. In it Al receives a mission: travel back to 1984 in a secret time machine and save his father’s life.
“Al soon discovers that time travel requires daring and imagination. It also requires lies, theft, setting his school on fire and ignoring philosophical advice from Grandpa Byron. All without losing his pet hamster, Alan Shearer…”
Wolf Hollow, by Lauren Wolk
“Annabelle has lived in Wolf Hollow all her life: a quiet place, still scarred by two world wars. But when cruel, manipulative Betty arrives in town, Annabelle’s calm world is shattered, along with everything she’s ever known about right and wrong.
“When Betty accuses gentle loner Toby - a traumatised ex-soldier - of a terrible act, Annabelle knows he’s innocent. Then Betty disappears. Now Annabelle must protect Toby from the spiralling accusations and hysteria, until she can prove to Wolf Hollow what really happened to Betty.”
The Serpent King, by Jeff Zentner
“Dill’s father is in jail for an unspeakable crime.
“Dill’s only respite from poverty and prejudice are his two friends: Lydia and Travis. Travis is an oddball, finding sanctuary from his violent father in his obsession with an epic fantasy saga. Lydia is fast-talking and fiercely creative, pinning her hopes on her achingly cool fashion blog. Dill fears his heart will break when she escapes to a better life in New York.
“Dill wants to get through his final year of high school in one piece. But there’s a dark secret at the heart of his family, a serpent poisoning his blood, filling him with despair. Dill must confront this legacy of madness and desperation before it tears him apart.”