text:
Beyond wealth
Benjamin Rosman: preparing society for an AI-infused future
Pedro van Gaalen
Benjamin Rosman, a Professor in robotics and machine learning at Wits, decodes Artificial Intelligence and the impact it will have on society.
Get Focus insights straight to your inbox
Please complete all required fields before sending.
We look forward to sharing out of the ordinary insights with you
Sorry there seems to be a technical issue
For many, the unrelenting technological advancement that characterises the fourth industrial revolution can seem daunting and intimidating – scary even.
As part of Investec's Focus Talk series with industry leaders, innovators and changemakers, Head of Digital at Investec South Africa, Devina Maharaj interviewed Benjamin Rosman, Associate Professor at the University of the Witwatersrand, to contextualise these developments and make sense of their relevance in the modern context.
Rosman, who is a leading researcher in robotics, artificial intelligence (AI), decision theory and machine learning (ML), explained that today, AI serves as a broad umbrella term for many different sub-disciplines.
"At its core, it's about making machines do intelligent things," he stated.
What is supervised learning?
According to Rosman, the modern incarnation of ML is how we apply AI to data to create systems that get better at specific tasks or problem-solving through progressive exposure to more data or cumulative experience.
In this realm, two forms of ML exist – supervised and unsupervised learning.
Rosman elaborated that traditional supervised AI makes sense of formal statements and effectively breaks down the various irregularities we tend to encounter in the real world. This makes it simpler to write programs that solve difficult problems, whether that's recognising a face or translating text.
"In solving these problems, it's really hard to come up with the rules that define that problem," explains Rosman, who offered face recognition as an example.
The old programming approach would require programmers to come up with rules, like a face has two eyes over a nose, over a mouth. "You would also have to come up rules regarding what makes an eye and how you describe an eye in an image."
However, systems would often fail if additional variables were added, like someone's head was tilted or if they had only one eye.
Supervised machine learning solves this complexity. It enables programmers to collect millions of pictures of faces and of things that aren't faces and, instead of writing code to solve the problem, the machine figures out how to distinguish the faces using basic rules. It then continually and automatically fine-tunes its processing capabilities.
This can also be applied to various processes, like regressions where you might attempt to more accurately predict GDP growth or the weather. "That's basically supervised learning, which is probably the most commonly used and easiest ML application."
Conversely, unsupervised learning entails giving the machine an uncategorised data set to discover some sort of structure.
Benjamin Rosman, Associate Professor, Wits
My personal radical academic view on this is that jobs are immoral and we shouldn't have them. Jobs are the problem we should be solving and not the other way around.
What is reinforcement learning?
A third, more nascent area of interest in ML highlighted by Rosman is called reinforcement learning. "I think this is the really interesting AI problem – making long-term decisions."
According to Rosman, reinforcement ML augments human decision-making to confirm whether a specific future decision is correct.
"While this is further away in terms of widespread application, the questions you can ask would be around getting a robot to navigate certain environments or making long-term business decisions."
And it is reinforcement learning that is a forerunner to the exciting area of deep learning, where technology begins to solve more complex problems.
"Deep learning has lots of components and many layers to it, but essentially what you're effectively doing is solving what's been a thorn in ML's side for a while, which is feature engineering," explained Rosman.
Feature engineering simplifies categorisation by adding simple variables to what would otherwise be a complex algorithm. "The challenge is finding the right features to answer the questions you care about."
By adding additional variables, machines become better able to filter information and process what we can use to inform decisions. "However, this process requires lots of data, which is why everything's data hungry these days," added Rosman.
Prefer to listen in the car?
Listen to the full discussion between Prof Benjamin Rosman and Devina Maharaj.
Jump to the sections in the podcast that you are most interested in.
BR: Prof Benjamin Rosman
TS: Tim Spira, head of digital content, Investec
DM: Devina Maharaj
00:00: Intro
Benjamin Rosman: So, we're kind of at the point now we can take any reasonably focused task and probably automate it to better than human levels and this is being done like all the time now, as in anything from chest x-rays to playing video games.
Tim Spira: Hello everyone and welcome to the latest session of Investec's Focus Talks, a series of candid conversations with leaders, influencers and change makers. I'm Tim Spira, head of Digital Content at Investec, and I must begin by declaring an interest in today's talk. It's a disclosure I'm very proud to make. Benjamin Rosman is my first cousin.
Now I remember engaging with Benjy over the dinner table on some of the trickier issues in philosophy of mind when he was barely a teenager. Having studied philosophy, I no doubt held forth with a bit too much swagger, but even then, I was disarmed by his insights and questions. And when I tried the same trick a couple of years later and I quickly realised that I was way out of my depth.
Fortunately for me though - and for many listening in – Benjy is not only brilliant but also has a knack for distilling the complexity of his field — artificial intelligence and machine learning — into accessible clarity.
Benjy's also able to engage with the ethical and even existential issues thrown up by this relatively young science. And, perhaps most impressively, he has made great strides in building a community of experts in AI in Africa.
In 2017, he started the started the Deep Learning Indaba, an annual gathering of professional researchers in the field of deep learning— the study of algorithms that learn by trawling through gigantic data sets. That gathering is now the largest of its kind not just in Africa, but globally.
In March 2018 Benjamin received a Google Faculty research award — the first in machine learning in Africa. He also got behind the critical imperative to introduce more women into AI research – a cause he remains passionate about.
Benjamin has been lecturing in the school of computer science and advanced mathematics at Wits University since 2017 where he was recently made a professor.
His work is published in leading journals both locally and internationally and he has presented at conferences at such institutions as Brown university, Stanford and his Alma Mater, the University of Edinburgh, where he earned his PHD. He also recently became a faculty member at the Singularity University.
Now lets listen in to professor Benjamin Rosman in conversation with Investec's Head of Digital in South Africa, Devina Maharaj.
2:19: What is Artificial Intelligence?
Devina Maharaj: So I must say even as the Head of Digital, when it comes to AI and deep learning and machine learning and artificial neural networks, this topic scares me and I was quite intimidated I think, just hearing Ben's, like achievements just it's, it's mind-blowing I think just to have him here today. So welcome.
BR: Thanks, it's good to be here.
DM: Let's just kick off and start off around what is Artificial Intelligence. I think we hear the words Artificial Intelligence, machine learning, deep learning, can you give us a brief summary, in like I often say in like the Davina's dummy guide. What does that look like?
BR: Cool. Yes, I think AI is everything we haven't done yet. So if you looked at like this crazy sci-fi idea of a phone that you could just talk to you and tell it what to do ten years ago that would have been AI, now we're like naah it's just SIRI.
But really we tend to think of it as like a broad umbrella term for a whole lot of different sub-disciplines and it's really just about making machines do intelligent things, but the kind of modern incarnation of this which is all the ideas around machine learning, which I guess we'll talk more about, is trying to be able to do that from data. So, I want a system that as it gets exposed to more data or more experience with the world or something like that, it gets better at some tasks that it's trying to solve.
3:45: Supervised and unsupervised learning
DM: And in my research, trying to sound very smart and in this conversation, I discovered that machine learning has different aspects to it like supervised learning and unsupervised learning. Can you tell us a little bit of, a bit more about that and what does it actually mean?
BR: In AI that there's this thing we now call good old-fashioned AI and that's this idea that you've got a whole lot of formal statements about the world, and it's very powerful, you can do a lot with that, but it breaks down with the kind of irregularities that you find in the real world.
So the challenge was really that, if, like essentially if you're trying to write these kinds of programmes to solve difficult problems, like whether it's recognising a face or translating texts or anything like that, it's really hard to come up with the rules of what, like defines that problem. But on the other hand, it's quite easy to come up with examples.
So if I wanted to do face detection, right, the kind of old way of doing this would be I'd have to come up with the rules like a face has two eyes over nose over a mouth and then it breaks if someone's head is on the side or if they're a one-eyed pirate.
And then you still have to come up with the rules of like what makes an eye, like how do you describe an eye in an image? But it's really easy to collect millions of pictures of faces and millions of pictures of things that aren't faces, and this was like the first core idea of machine learning and this is, going back to your question, what we call supervised learning.
So the idea here is I can give a whole lot of examples of the thing I care about and of other things and essentially instead of me writing the code to solve the problem, I get the machine to figure out the code itself that does that.
There's a few other areas, and the main one there is this other idea which is called unsupervised learning and there you don't know the true labels so you might have for example a whole lot of images and I don't know what's in them, but I want my system to do is look at this data and try find some sort of structure in it.
5:44: Reinforcement learning
BR: And then the third major category, which was a very much a niche thing out of the way, nobody cared about until about a year or two ago, which is actually a thing I've been working on for a while, is this area called reinforcement learning and that's about what I think is really the interesting AI problem, and that's about making long-term decisions.
So, this area, reinforcement learning, is about asking the question of, if I get to make a whole lot of decisions, moving into the future - what's the right thing to do?
Now, this is a bit further away from kind of widespread application, but the kinds of questions you can ask there would be around getting a robot to navigate in some environment, or getting a computer to play chess or video games, or making long-term business decisions over the next 10 years, or treating a patient whose got a chronic condition coming into a clinic every month and you want to ask questions like should we change treatment or, or get different tests and that sort of thing.
6:42: Deep learning
DM: And is this where it kind of leads into that area of deep learning where it's solving much more complex problems?
BR: So you got this quite a deep structured model that, and we call it deep learning because it's got lots of components to it, lots of layers, essentially, and what effectively you're doing here is solving what's been a bit of a thorn in the side of machine learning for a while and that was feature engineering.
So if you wanted to classify the difference between say a dog and an elephant and the things you knew about it were the number of legs it has and the number of ears it has, you can take the smartest algorithm in the world or the smartest person in the room and they'll be useless, right, because you don't have like the right features to make the distinction you want. But if you just knew it's weight, right, then like you don't need to be smart at like, any dumb algorithm could tell the difference between those things.
So, the challenge is finding the right features to answer the questions you care about. And the easiest way to visualise this is with images. Right, so again in kind of slightly older-fashioned ways of doing machine learning to recognise faces you would have needed to go and manually write little bits of code that maybe look for ears or look for eyes like and maybe they don't even do it very well, but then you get a whole string of these features and then you take your image and pass it through those and now you've got a whole lot of information you can use to make your decisions.
But here what you do is you just give it the raw pixels and it will learn the kind of intermediate level representations that are required to make the decision.
So you learn these representations automatically rather than, from like as raw data as possible, and that's really the big idea behind deep learning. But it requires lots and lots of data which is why everything's data hungry these days because the models are very complicated.
8:28: AI in education and healthcare
DM: Can you tell us a little bit about that in terms of some real-life practical examples of how this could change the way we kind of live in the world, which I think is super exciting.
BR: We've been putting a lot of emphasis lately into particularly looking at problems around education and healthcare. We're building systems that, to learn to solve difficult technical problems need to be taken through a curriculum, that they can learn these skills, we should be able to customise curricula for students as well.
So we're looking at questions around personalisation of education there, which says if you know someone's engaging with some educational material and you can learn something about the way they're doing it you can actually make recommendations for the order in which they should traverse the material to get a better understanding of what's going on.
And we're also looking at similar kinds of questions in healthcare, as I said long-term treatment questions like diagnosis of different say, for example, lung conditions from chest x-rays, from blood smears, and also looking at ways to not just improve the diagnoses but also better understand why those diagnoses are being made and maybe find places where it would be useful to ask for other information, from like either the history of the patient or like other tests and that sort of thing.
9:48: The impact of AI on jobs
DM: What would be the thing that you would say excites you most about this field and what frightens you?
BR: Probably the same thing. So, there's a big question generally about what's called artificial general intelligence or in some hype sense artificial super intelligence. So, we're kind of at the point now we can take any reasonably focused task and probably automate it to better than human levels and this is being done like all the time now, as in anything from chest x-rays to playing video games.
And now a lot of the challenge is around broadening what our systems can do. So if we can build a system that can solve one problem, can we, you know, without changing anything in the underlying infrastructure, now get it to solve a completely different problem and then a third one and hopefully as it does this it gains more just general experience and expertise and it finds it easier to solve other problems. This is kind of the big goal at the moment, is this idea of a broader or more general intelligence.
And that's just a fascinating question because it really ties back to who we are and how we work and how we learn things, but it's also, I think, a potentially frightening thing I think to be working on for a number of reasons that mainly because humans might mess it up.
DM: I know when we chatted, I had cited off this research that, that I had read about that said the, the, actual net effect of AI on the workforce would actually be a positive one. You looked at me like no, not really, tell me about that and what, what, what are your thoughts?
BR: I mean the whole aim for a long time has been to try and automate what we used to call in robotics the dull, dirty and dangerous jobs.
Obviously, it's a different kind of problem in a place with a high unemployment, but there are a lot of things that people shouldn't be doing for various reasons. And like if you can free people up from certain things, they can focus on stuff they really care about. An example always like is someone in HR probably goes into HR because they're interested in working with people, not interested in doing infinite paperwork.
I also think a lot of the big challenges we face as a society are the kinds of things that work better when you throw more intelligence at them. So for example there have been projects on trying to optimise things like truck efficiency and there have been huge gains in these sorts of things that you can completely bring down the amount of fuel emissions, the amount of petrol these things need, just by running certain kinds of optimisation which is effectively a kind of machine learning.
And so I think there's a lot of potential there and the flip side I think there's a narrative that's told a lot about how for every job that gets automated away another 1.74 jobs get created and that might, if that's true, which I'm doubtful of, then it's true just in the very immediate future.
So, the two things people do are physical labour and cognitive labour and the whole physical labour thing, we've had robots in factories now since the 60's.
There's a lot of things obviously that are quite difficult and that takes longer, but a lot of the cognitive work we do is actually in a way much easier to solve. There's this thing called Moravec's paradox, it's basically this idea that stuff that we think is difficult is actually easier to automate, so things like some crazy complex thing you do in excel we can actually probably automate pretty easily, but walking is quite challenging.
I mean, it's very exciting to be working in these things. But like fundamentally if you automate out a whole lot of these jobs, then the question is, you know, there's just fewer jobs and what should people be doing? And so personally I feel that this is a longer-term discussion we need to have as a society about, what is the value of jobs and my personal radical academic view on this is jobs are immoral and we shouldn't have them.
And so, to me, actually jobs are a problem and we should be solving that and not the other way around.
DM: What does that mean, jobs are a problem?
BR: The reality is most people in the world do jobs that are terrible, like either physically, emotionally, psychologically and if you don't do this thing for like, I don't know, 8, 10, 12, 16 hours a day, at the end of the month you and your family die. Like, that's pretty shit. Like, this is not a thing we should be proud of as a society.
We've got this massive problem with unemployment and we've been struggling to figure out what to do about that may be the correct thing to do is find some way of saying like look, we've got machines that are coming along, maybe it's 20 years away, maybe it's 50 years away, but we're pretty sure this is coming.
And anything we care about we can get considerably more efficient at whatever it is ranging from farming to doing taxes and maybe instead of being scared of that we should embrace that and say, okay, so if there's a whole lot less work that needs to be done in society, right? What do we do about that? Do we wait for the day when you suddenly get 60% to 80% unemployment happening in the US and riots in the street and then go, 'Oh we didn't see this coming' or do we start preparing for it now and you know thinking about what is the world we actually want to live in, that is the best possible world we could build.
If you look at for example, so I think the biggest employer in the U.S. is driving and we all know like autonomous driving is something that dozens of companies e working on, they keep promising it's three years away and they've been promising this for about five years now, but, like it's very close and at some point you get, I mean when you get autonomous driving, then it doesn't make sense for people like Uber to keep drivers around, it doesn't make sense for big trucking companies to keep drivers around right?
So now you're going to put like one of the biggest sectors completely out of work overnight because it makes financial and economic sense, and it's also safer, you've got something like 1.2 million people dying in car accidents every year, right? That's barbaric, but somehow it's okay because it's driving, right and again, so it shouldn't be like an ethical thing to let people drive cars, but now what are you going to do with all these people that make a living from driving?
16:21: AI in Africa
DM: What do you see as the biggest challenges for us living in an emerging market, dealing with kind of the same challenges as you would in a developed country where it's almost, you've got to, the leap is just far bigger, because for me that is where I think the rubber starts hitting the road in all of these conversations living in South Africa.
BR: I think that a challenge with this kind of automation and bringing AI into the workplace is that it's really your kind of middle-class desk jobs that are most at risk, which means we should be very motivated to try and do something about this.
So, having said that, I think there's also a lot of opportunities to make things better in Africa. So, I've been involved in setting up this kind of network across Africa and what's been really inspiring is just seeing the kinds of projects people are working on.
So, we already know, like the kinds of leaps that like local societies have made with say cell phone technology and not even having to rely on landlines and that sort of thing.
But also, apps that will, you can take a photo of your cassava plants and diagnose if there's diseases, that sort of thing. I think that kind of thing is very empowering as well, so I think there's that which is possibly different to the kinds of situations you would see in developed countries where there's a number of kind of immediate problems that people are dealing with on the ground that you could just basically solve straight away.
DM: You are doing some amazing work with like the Deep Learning Indaba and tell us the story and how that became this global forum that actually is leading the way in this?
BR: So I did my masters and PhD in the UK and so reasonable size network of us that were abroad and at the time that was really my only option if I wanted to study further in these topics I had to go abroad and then came back with the vision. But we got chatting soon after I came back to a few other, many South Africans that either studied abroad and were now working here either at the CSIR or local universities, and then a few other expat South Africans that were now working mainly for Google.
And at the beginning of 2017 a few of us jumped on a Skype call and we thought no we need to do something. Let's have a little workshop and will like use our own money and fly the other ones that aren't in the country, fly them out here and maybe over a couple days, we probably find 30 to 50 people who actually would care about this in the country and just have a chat for a couple days.
And then we decided we would lose momentum, so let's do it right now and commit to doing this, this year. This was in 2017, and so we decided would host this thing at Wits and you know, it turns out a few months later we had an event of 330 people, we had over 750 applications, so we ran for six days.
It was a hardcore technical week, like a long week, every day was jam-packed. We had a number of speakers coming out from all over the place. So, it was aimed at you know masters students, PhD students, post-docs, academics and faculty, and people in technical roles in start-ups and in industry.
So, Google gave us a lot of money and a few other big tech companies to completely pay for, I think we paid for 60 students from around Africa to come, to fly out here, we paid for everything.
We've just had the third one, which was our first one outside of South Africa, it was at Kenyatta University in Nairobi. And there we had about 700 people and now we've got like UNESCO involved, we've got like parallel sessions on ethics, on policy, we're trying to get government's involved and open up discussions with governments about the way they should be doing these things.
We had attendees from over 40 African countries and actually there's a number of other programmes we've now attached to this. The one that I'm very excited about because I run that, is what we call the Indaba X Program. It's kind of like the Ted-x thing.
So, we had 13 events last year and then this year we had 27 events, which is half of Africa, and this included events running in Somalia, Sudan, DRC, Burkina Faso, like name it, we got stuff going on there.
Partially on the back of this Google opened their first research lab in Africa, which is in Accra in Ghana. Google and Facebook are funding a, what they now call the most prestigious master's programme in the world, which is running in Kigali, and I was lucky enough to be able to go teach there for a bit and these students some of them have three Masters or put their PHD's on hold.
Now a lot of them are getting jobs all over the world or into PHD programmes, the calibre of students is exceptional and there's a lot of interest now from a lot of the big tech companies.
So where we actually trying to push harder now to get our local companies involved in this because otherwise you're never going to hire a good person ever again with the interest that's being shown and the support that's been given by all the big tech companies and that's been just incredibly inspiring.
21:31: Existential issues raised by AI
DM: I think that's super exciting to hear from an Africa perspective and well done on that. When change happens people often ask what does this mean for me? And, and, I think if you were sitting in the audience and had to ask yourself that, in terms of what does that mean for me, if I work at a bank or I'm working in a job that could potentially have some level of automation or have a machine doing this better than I do. What does that mean? What would your answer be?
BR: There's things to think about on a lot of different levels. Like you know, what should you be thinking about for your kids? And what should like, what should you think about in terms of your own trajectory through your career? And these are hard questions to answer mainly because the time frames aren't certain.
I mean for me personally, one question that I think is quite useful is what do you actually get value from in your own life? The two questions that we always get when we have these kind of radical, pseudo-socialist type discussions, is you know, what do you do for income, but what do you do for value? And I think a lot of people defend jobs by saying this is what gives people value in life and I think that's wrong.
I think I mean it does give people value in life, but I think that's probably not the way to be living and maybe there is things to be thinking about like what would you actually do if you had this free time?
There are more and more companies that are doing things like trying to reduce work hours and that sort of thing which I think is the right kind of direction to be going in. But not very many people have the ability to enact those sorts of changes, but you know, thinking about what you'd like to be doing and actually keeping track of some of the changes that are happening in technology is another very useful thing to do.
So we often advise when we're talking to kids that want to go into various areas of tech that if, at least the present state of the world is everything is driven by computers, they're not completely autonomous, but they do everything, and if you can't tell computers what to do, then there's questions about your own relevance there.
So, like being able to communicate with what's happening in technology and with computers I think it's a very important thing to be able to do, but as I say, for the longer term, I think there's more, the questions are more philosophical.
23:54: Singularity's South Africa chapter
DM: So, let's jump there because we, I know you're a faculty member of Singularity University. Do you want to talk a little bit about that and how it relates to AI and what it might mean in the future.?
BR: Sure. The idea is, there's now chapters around the world, so South Africa is one of the newer chapters. And there's a number of faculty members, I think there's 12 of us at the moment in, with different areas of specialisation.
And really the idea is to act as a bit of a bridge between industry and various kinds of disruptors, whether it's in academia or start-ups or various different places and actually talk about some of the technologies and different ways of thinking that people are playing with, to, in a sense, try and help people prepare for the future, to think about ways they might embrace different kinds of technologies and actually just kind of foster better integration of some of these ideas into the into the real world.
24:53: Conclusion
DM: I know one of the burning things and I'll ask the question and leave you thinking about it for me, but I asked Ben last week when I met him is that, in all the AI, machine learning, deep learning thoughts that we have, is there anything still magical about human beings?
Is there something that makes us special as human beings and is it something that we can replicate? Consciousness, empathy and I know you have interesting views around it and all of us I think are waiting to kind of see where this goes. So, thank you. It was really, really interesting and definitely got our creative juices going.
BR: This is great to be here, and this is a very cool format so thanks.
DM: Okay. Great. Thanks.
TS: Thanks for listening to this Investec Focus Radio podcast. If you enjoyed this conversation, please take a moment to rate us and subscribe to Investec Focus Radio wherever you get your podcasts. And for more insights and expert views, please visit focus.investec.com
Practical applications of AI in education and healthcare
While deep learning won't offer a solution to every problem, the power of these modern techniques emerges when dealing with large structured data sets. In terms of how this could change the way we live in the world, Rosman highlighted applications in problem-solving around education and healthcare.
"Specifically, we're looking at questions around the personalisation of education. For instance, when someone engages with educational material, AI can learn something about the way they do it and can then make recommendations around how they should traverse the material to better understand it."
Rosman also highlighted the technical work going into taking any reasonably focused task and automating it to better-than-human levels. "This is being done all the time, in anything from taking x-rays to playing video games."
The current challenge is around building out scale by broadening what these systems can do beyond solving one problem.
"Can we, without changing anything in the underlying infrastructure, get it to solve a completely different problem and then a third one? Hopefully, as it does this, it gains more general experience and expertise and it finds it easier to solve other problems."
And this is the major goal the industry is chasing at the moment – the idea of a broader or more general intelligence. However, predicting the future impact of this development is difficult, admitted Rosman.
How AI is already impacting the job market
US manufacturing jobs lost between 2013 and 2019
Workers in the world's 12 largest economies that need to reskill in the next 3 years
IT job openings in the US in 2019
The impact of AI on employment
"In the near-term future, we'll continue to try and automate 'the dull, dirty and dangerous jobs'."
Of course, this raises questions around job losses and the role of humans in a society increasingly automated through technology.
"While there's obviously problems with high unemployment, there are many things that people shouldn't be doing for various reasons. And if you can free people up from certain tasks, they can focus on stuff they really care about," explained Rosman.
In addition, Rosman believes this will create opportunities for people to do things better in the short term. Opportunities will also emerge to employ people in the ML field, where there is currently a shortage of around 500,000 skilled workers in the US alone.
Layering intelligence over various problems currently faced in broader society could also optimise the way the world functions and operates, like improved transport efficiency to reduce fuel emissions.
"This can be achieved by running certain kinds of optimisation and applying some basic learning from data, which is effectively a kind of machine learning."
Of course, there is a longer-term discussion to be had regarding technology's impact on jobs and employment.
"The two jobs people perform are either physical or cognitive labour. There's are numerous tasks that are quite difficult and take longer, but Moravec's paradox suggests that stuff that we think is difficult is actually easier to automate."
The real question is what should people do instead of their current jobs? "My personal radical academic view on this is that jobs are immoral and we shouldn't have them. Jobs are the problem we should be solving and not the other way around."
Most people in the world perform jobs that are physically, emotionally or psychologically taxing, often up to 16 hours a day out of necessity to sustain them and their families.
"This is not something we should be proud of as a society. We must start preparing for the future now and think about the world we actually want to live in, which should be the best possible world we could build."
How AI will impact the driving industry - the biggest employer in the US
Americans employed in the trucking industry
Increase in autonomous vehicle job postings between 2015 and 2019
Before fully autonomous vehicles are being sold to private buyers
AI in Africa
As far as these challenges relate to emerging markets, Rosman believes countries like South Africa can lead the way in figuring out how industry 4.0 technology can create new jobs rather than replace them.
He also believes that there are opportunities to improve conditions in Africa and solve various immediate problems, particularly by leapfrogging legacy technologies.
"This includes the way that various apps and online markets are being used on the continent and the kinds of projects people are working on around healthcare, which are very empowering."
Rosman is one of the founders of The Deep Learning Indaba - the annual gathering of the African AI community which has grown from 350 attendees from across the continent in 2017 to 700 in 2019. The event has attracted the attention of global tech giants like Google who support the conference financially and by sending speakers like Jeff Dean, Google's head of all AI.
In the context of AI's impact on society, Rosman suggested there are various considerations on many different levels. "What should you think about for your kids? What should you think about in terms of your career trajectory? More importantly, what do you actually get value from in your life?"
He believes your job should define the value your derive from life because what you do for income and what do you do for value aren't necessarily the same thing.
"That's probably not the way we should live. Rather, consider if you had complete freedom to do whatever you wanted, what would you actually do?"
While these are hard questions to answer, mainly because the timeframes aren't certain, Rosman asserts that we'll need to have the answers to prepare for the future.
Content creator, editor and freelance writer
Pedro is an experienced communicator across print and digital media platforms based in Johannesburg. He attained a communications degree from RAU (now UJ), and began his PR and marketing career in 2000 in the motoring sector. He has built a career as a communications consultant and freelance writer, offering his experience, varied expertise and diverse background to various PR agencies, corporate clients and research houses.
Focus and its related content is for informational purposes only. The opinions featured on the site are not to be considered as the opinions of Investec and do not constitute financial or other advice. The information presented is subject to completion, revision, verification and amendment.
Watch more Focus Talks
{[post._tagTitle]}
{[getFirstElement(post.fields.primarytagtitle)]}
{[post._title]}
{[$index + 1]}
Your banking in One Place™
We offer a range of local and international banking services designed to suit your unique needs that you can access via your dedicated private banker and our 24/7/365 global Client Support Centre and online banking.
Your investments in One Place™
Turn your South African and/or foreign investment goals into reality with advice, insights and services backed by a truly global investment approach and expertise.
Get the dream retirement you've worked so hard for. Place your investment in a retirement vehicle or pension fund designed with your future needs in mind.
Browse further in


text:
Q: Full page Javascript confetti not working I want to create a webpage with a full page confetti effect.
I have tried to make it full page but if I put text on the page the confetti effect will move to the bottom.
I have tried to change this in HTML/CSS but so far I couldn't get it fixed.
Would someone be able to help me with this?
Thanks in advance?

var maxParticleCount = 70; //set max confetti count
    var particleSpeed = 1; //set the particle animation speed
    var startConfetti; //call to start confetti animation
    var stopConfetti; //call to stop adding confetti
    var toggleConfetti; //call to start or stop the confetti animation depending on whether it's already running
    var removeConfetti; //call to stop the confetti animation and remove all confetti immediately

    (function() {
     startConfetti = startConfettiInner;
     stopConfetti = stopConfettiInner;
     toggleConfetti = toggleConfettiInner;
     removeConfetti = removeConfettiInner;
     var colors = ["DodgerBlue", "OliveDrab", "Gold", "Pink", "SlateBlue", "LightBlue", "Violet", "PaleGreen", "SteelBlue", "SandyBrown", "Chocolate", "Crimson"]
     var streamingConfetti = false;
     var animationTimer = null;
     var particles = [];
     var waveAngle = 0;

     function resetParticle(particle, width, height) {
      particle.color = colors[(Math.random() * colors.length) | 0];
      particle.x = Math.random() * width;
      particle.y = Math.random() * height - height;
      particle.diameter = Math.random() * 10 + 5;
      particle.tilt = Math.random() * 10 - 10;
      particle.tiltAngleIncrement = Math.random() * 0.07 + 0.05;
      particle.tiltAngle = 0;
      return particle;
     }

     function startConfettiInner() {
      var width = window.innerWidth;
      var height = window.innerHeight;
      window.requestAnimFrame = (function() {
       return window.requestAnimationFrame ||
        window.webkitRequestAnimationFrame ||
        window.mozRequestAnimationFrame ||
        window.oRequestAnimationFrame ||
        window.msRequestAnimationFrame ||
        function (callback) {
         return window.setTimeout(callback, 16.6666667);
        };
      })();
      var canvas = document.getElementById("confetti-canvas");
      if (canvas === null) {
       canvas = document.createElement("canvas");
       canvas.setAttribute("id", "confetti-canvas");
       canvas.setAttribute("style", "display:block;z-index:999999;pointer-events:none");
       document.body.appendChild(canvas);
       canvas.width = width;
       canvas.height = height;
       window.addEventListener("resize", function() {
        canvas.width = window.innerWidth;
        canvas.height = window.innerHeight;
       }, true);
      }
      var context = canvas.getContext("2d");
      while (particles.length < maxParticleCount)
       particles.push(resetParticle({}, width, height));
      streamingConfetti = true;
      if (animationTimer === null) {
       (function runAnimation() {
        context.clearRect(0, 0, window.innerWidth, window.innerHeight);
        if (particles.length === 0)
         animationTimer = null;
        else {
         updateParticles();
         drawParticles(context);
         animationTimer = requestAnimFrame(runAnimation);
        }
       })();
      }
     }

     function stopConfettiInner() {
      streamingConfetti = false;
     }

     function removeConfettiInner() {
      stopConfetti();
      particles = [];
     }

     function toggleConfettiInner() {
      if (streamingConfetti)
       stopConfettiInner();
      else
       startConfettiInner();
     }

     function drawParticles(context) {
      var particle;
      var x;
      for (var i = 0; i < particles.length; i++) {
       particle = particles[i];
       context.beginPath();
       context.lineWidth = particle.diameter;
       context.strokeStyle = particle.color;
       x = particle.x + particle.tilt;
       context.moveTo(x + particle.diameter / 2, particle.y);
       context.lineTo(x, particle.y + particle.tilt + particle.diameter / 2);
       context.stroke();
      }
     }

     function updateParticles() {
      var width = window.innerWidth;
      var height = window.innerHeight;
      var particle;
      waveAngle += 0.01;
      for (var i = 0; i < particles.length; i++) {
       particle = particles[i];
       if (!streamingConfetti && particle.y < -15)
        particle.y = height + 100;
       else {
        particle.tiltAngle += particle.tiltAngleIncrement;
        particle.x += Math.sin(waveAngle);
        particle.y += (Math.cos(waveAngle) + particle.diameter + particleSpeed) * 0.5;
        particle.tilt = Math.sin(particle.tiltAngle) * 15;
       }
       if (particle.x > width + 20 || particle.x < -20 || particle.y > height) {
        if (streamingConfetti && particles.length <= maxParticleCount)
         resetParticle(particle, width, height);
        else {
         particles.splice(i, 1);
         i--;
        }
       }
      }
     }
    })();
 body, html {
     height: 100%;
    }
    body {
     height: 100%;
     background-color:#ff5abd;
     background-image: url("../img/bg.png");
     background-position: center;
     background-repeat: no-repeat;
     background-size: cover;
     position: absolute;
     font-family: Roboto;
     overflow: hidden;

    }

          <meta charset="utf-8">
          <meta content="width=device-width, initial-scale=1" name="viewport" />
          <meta name="description" content="">
          <meta name="author" content="">

          <title></title>

          <link href="bootstrap/css/bootstrap.min.css" rel="stylesheet">
          <link rel="stylesheet" href="css/style-1.css" />

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborump>

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborump>

A: Hello Stef and welcome to the site. The JS script you provided will always "append" (read "add") the area where the confetti drops as the last part of your page. This area has an id of "confetti-canvas" which you can give styling to be adding a rule to the style section of your page:
#confetti-canvas {
  position:absolute;
  top:0;
}

This will move the canvas to the top of your page, and it will ignore the regular page flow so it lies on top of your text.

redpajama_set_name: RedPajamaStackExchange


Access and exposure are the guiding elements of Youth Careers as young workers navigate their path to career success. Career awareness, exploration and work experience are key elements to understanding the job market and finding the best fit for individual pathways.
As an employer, we value your participation and hope you will join us. Together we can create lasting change.
MassHire Metro South/West Youth Careers works to empower disadvantaged and disengaged youth in the Metro Southwest region of Boston. Through education and work experiences, the Youth Careers program gives young adults the tools to overcome barriers and move into self-sustaining employment in sectors of the economy where there is a need.
Access and exposure are the guiding elements of Youth Careers as inexperienced young workers traverse the path to career success. Career exploration and hands-on learning are key to gaining an understanding of the job market and finding the best fit in terms of employment.
Knowing what you want to do in the future is half of the battle. The other half is about preparing to get the job. Learn the skills you need to ace the interview, prepare a resume that will outshine the competition, and more.


> Pac-Man. The screen tells you everything you need to know.
That was Ted Nelson, widely acknowledged as a visionary.
at: Dream Machines/Computer Lib and Literary Machines.
to speak with him and some of his cohorts over the years.
Previous by Thread: Originator of "hypertext"


In this tough economic climate, everyone is searching for easier how to find the biggest bang with regards to bucks and skin care is no different. We simply have to read more for our money. We can't always pay the products we're accustomed to purchasing because time may come when discovered choose between skin care or paying the insurance on our motor. Well, here are some handy, cheap beauty and skincare tips that anyone use if they are on a budget.
Watch your diet, reduce intake of oily and deep deep-fried food and enhance consumption of high fiber fruits and vegetables. Drink sufficient water in the day time but stop water supply 2 hours before sleep to reduce water storage. Try to avoid staying up late putting more stress onto the skin.
Lots of product lines have gotten far too complicated -- aside from being costly, they occupy too lots of time. You will keep it simple, and merely as thriving. Many of us overindulge epidermis we have anyway -- if we're dry, frequently overmoisturize; if we're oily, we often overstrip.
These are generated by an increased level of melanin the actual planet skin, which occurs after sun bathing and naturally as you age. This can be achieved way to get rid of parents safely is as simple using a herbal whitening cream with extrapone nutgrass. Factor isnrrrt listed naturally inhibits melanin as well soothes the skin. Natural vitamin e d-alpha is identified as to prevent age spots.
Effective uncomplicated. but easy to forget! it keeps the hands nice http://skincareuncover.com/ and warm, and shields them from the harm of fluctuating cold and hot weather and temperatures.
Your skin cream, to avoid face wrinkles, must address all three of these natural methods. Why do I call them "natural"? Well, this is because they in order to all together with age. In a lot of magazine articles, they may tell in order to definitely change your diet, exercise more, or protect pores and skin from UV sunrays. Elements in the supplement all fine skincare tips, but doing them still won't target view skin agers.
Depending personal skin type, you might like to shift from your regular water-based moisturizers to an oil-based lotion. This will assist in protecting skin color from type of extreme moisture thinning. Water-based lotions and creams generally absorb faster and dry out more easily instead of keeping your skin soft and supple. Select moisturizers that have a natural oil, like jojoba or grapeseed, given that key item. Many studies have revealedthat the using jojoba oil has helped to reduce stretch marks and facial lines. Grapeseed Oil is an efficient antioxidant that has been proven tobenefit aging skin.
Follow these 7 learn how to get the most skin look after your skin pores. Have a wrinkle free smooth, supple and bright skin. Purchase it the middle of the attention remember when you are out in public places. No more frustration, no more worry.


Hello My name is Mary. I used to be a very active member here but have not logged in for a long time. I am in need of a reading. My mind is at its last call. I am in a panic about loosing my job every day. Should i look for another? I have to ask my daughter if I can move in with her tonight or i will loose everything, even my home if she says no. I feel death and doom along with panic attacks every day. I just need some guidance on what to do next. All readers I thank you in advance for your time and incite.
Sorry to hear you are feeling this way. How did things go when you spoke to your daughter?
What is making you feel this way about your work? Keeping an eye out for a new role wouldn't be a bad thing, you might come across something you would really like to do, I would advise not mentioning this to anyone at work though.
You are describing symptoms of anxiety and depression, I would advise seeking guidance from a medical professional, don't be worried about doing this or about telling your daughter how you are feeling. You don't need to deal with this alone.
Thank you Cass My daughter and her boyfriend said no. They said i have been worse before and i can make it through this too. I groom dogs for a living and my quality had gone down. I am on medicine for depression and feel like i am in a deep rut even with a med change. Thanks for the advice you are spot on.
Things will work out how they are meant to, but of course you need to put in effort.
That effort is overwhelming you because you feel helpless and alone in this. You know you need an ally and you need help, but figuring out how to get it is leaving you feeling empty handed. It might be making you feel that other stuff simply don't want to deal with you.
And that is not correct. It isn't YOU they don't want to deal with, but stress. It is possible that your daughter feels helpless about how to help you or see your stress. She must worry about her own.
In fact, it seems you may not want to deal with the stress either. You want to find an immediate solution -- because you are scared, and the only way to not be scared is to have at least one comfort, a way to know that if you fail, you will not be left in the unknown trying desperately to stay safe.
First, ground yourself when you feel panic about it. Put yourself in the here and now. You are currently safe and you have one thing to concentrate on.
That is either keeping up with your current job, or delicately moving on.
Remember to be kind and patient to yourself in your thoughts. It is necessary to be gentle as you speak to yourself, rather than inpatient and angry at yourself and your reactions.
Challenge yourself, gently, in your work environment. Make it a positive space through grounding alone if you have to.
That makes so much sense. I can see the release coming. I have been stuck in my own head, i agree. Thank you so much for replying .


Food is a life force and although some may say some food are bad for you, the truth is simpler "Everything is bad when you take it in excess". Now that we have established that fact lets move on to the topic of the day.
As Nigerians and African's, the palm oil is something that we thrive on, we literally cannot go without using it for many of our dishes. Now according to fitness and health experts, the palm oil isn't bad but as usual do not take it in excess. For me this means you have to look for creative ways to make some of your meals that require the use of the palm oil.
One of this meals we use the palm oil a lot for is Beans. Now for most people around the world beans is prepared in a soup type of way without using any type of oil but for us we don't prepare it any other way than with the addition of palm oil and the TRUTH- you don't always need palm oil to be able to make beans.
Beans is one of the healthiest food we have and so it very much needs to be on your diet, you should at least have it once a week and so rather than getting tired of the usual way you make it, watch this video on how to make palm oil-less beans.
Are there other ways you prepare beans without the use of palm oil? Share with us in the comment section below, we would like to be in on your secret.


text:
Q: Changing Slider's Height I have a slider. When I set its height, the selection border changes but the slider height is still the same (22px).
Here's a screenshot:

I believe that I need to change some properties in the default style but I couldnt understand what - I want to make the height dynamic - if I change to 200 it will be 200, if I change to 158 it will be 158 and so on...
I succeed to change the height to something specific by changing the HorizontalThumb Height to specific height (changed to different height than what I set)

A: UPDATE 2
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
    <Grid.RowDefinitions>
        <RowDefinition x:Name="SliderRow" />
        <RowDefinition Height="0.5*" />
        <RowDefinition Height="0.1524*" />
    </Grid.RowDefinitions>
    <Button Click="Button_Click_1" Content="Mail" Visibility="Collapsed" />
    <Slider Height="{Binding Path=ActualHeight,ElementName=SliderRow}" Style="{StaticResource MyCustomSlider}"/>
</Grid>

UPDATE 1
Ok, I got what you want. You want to increase the track height as well when you increase height of slider itself. Then you need to customize the slider. I replaced {StaticResource SliderTrackThemeHeight} with {TemplateBinding Height}, so when slider's height is increased the slider track will also be increased.
Style
<Style TargetType="Slider" x:Key="MyCustomSlider">
    <Setter Property="Background" Value="{StaticResource SliderTrackBackgroundThemeBrush}" />
    <Setter Property="BorderBrush" Value="{StaticResource SliderBorderThemeBrush}" />
    <Setter Property="BorderThickness" Value="{StaticResource SliderBorderThemeThickness}" />
    <Setter Property="Foreground" Value="{StaticResource SliderTrackDecreaseBackgroundThemeBrush}" />
    <Setter Property="ManipulationMode" Value="None" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Slider">
                <Grid Margin="{TemplateBinding Padding}">
                    <Grid.Resources>
                        <Style TargetType="Thumb" x:Key="SliderThumbStyle">
                            <Setter Property="BorderThickness" Value="1" />
                            <Setter Property="BorderBrush" Value="{StaticResource SliderThumbBorderThemeBrush}" />
                            <Setter Property="Background" Value="{StaticResource SliderThumbBackgroundThemeBrush}" />
                            <Setter Property="Template">
                                <Setter.Value>
                                    <ControlTemplate TargetType="Thumb">
                                        <Border Background="{TemplateBinding Background}"
                                        BorderBrush="{TemplateBinding BorderBrush}"
                                        BorderThickness="{TemplateBinding BorderThickness}" />
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </Grid.Resources>
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="Normal" />
                            <VisualState x:Name="Pressed">
                                <Storyboard>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="HorizontalDecreaseRect"
                                                            Storyboard.TargetProperty="Fill">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SliderTrackDecreasePressedBackgroundThemeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="HorizontalTrackRect"
                                                            Storyboard.TargetProperty="Fill">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SliderTrackPressedBackgroundThemeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="VerticalDecreaseRect"
                                                            Storyboard.TargetProperty="Fill">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SliderTrackDecreasePressedBackgroundThemeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="VerticalTrackRect"
                                                            Storyboard.TargetProperty="Fill">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SliderTrackPressedBackgroundThemeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="HorizontalThumb"
                                                            Storyboard.TargetProperty="Background">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SliderThumbPressedBackgroundThemeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="HorizontalThumb"
                                                            Storyboard.TargetProperty="BorderBrush">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SliderThumbPressedBorderThemeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="VerticalThumb"
                                                            Storyboard.TargetProperty="Background">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SliderThumbPressedBackgroundThemeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="VerticalThumb"
                                                            Storyboard.TargetProperty="BorderBrush">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SliderThumbPressedBorderThemeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="Disabled">
                                <Storyboard>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="HorizontalBorder"
                                                            Storyboard.TargetProperty="Stroke">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SliderDisabledBorderThemeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="VerticalBorder"
                                                            Storyboard.TargetProperty="Stroke">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SliderDisabledBorderThemeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="HorizontalDecreaseRect"
                                                            Storyboard.TargetProperty="Fill">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SliderTrackDecreaseDisabledBackgroundThemeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="HorizontalTrackRect"
                                                            Storyboard.TargetProperty="Fill">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SliderTrackDisabledBackgroundThemeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="VerticalDecreaseRect"
                                                            Storyboard.TargetProperty="Fill">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SliderTrackDecreaseDisabledBackgroundThemeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="VerticalTrackRect"
                                                            Storyboard.TargetProperty="Fill">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SliderTrackDisabledBackgroundThemeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="HorizontalThumb"
                                                            Storyboard.TargetProperty="Background">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SliderThumbDisabledBackgroundThemeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="HorizontalThumb"
                                                            Storyboard.TargetProperty="BorderBrush">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SliderThumbDisabledBackgroundThemeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="VerticalThumb"
                                                            Storyboard.TargetProperty="Background">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SliderThumbDisabledBackgroundThemeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="VerticalThumb"
                                                            Storyboard.TargetProperty="BorderBrush">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SliderThumbDisabledBackgroundThemeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="TopTickBar"
                                                            Storyboard.TargetProperty="Fill">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SliderTickMarkOutsideDisabledForegroundThemeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="HorizontalInlineTickBar"
                                                            Storyboard.TargetProperty="Fill">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SliderTickMarkInlineDisabledForegroundThemeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="BottomTickBar"
                                                            Storyboard.TargetProperty="Fill">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SliderTickMarkOutsideDisabledForegroundThemeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="LeftTickBar"
                                                            Storyboard.TargetProperty="Fill">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SliderTickMarkOutsideDisabledForegroundThemeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="VerticalInlineTickBar"
                                                            Storyboard.TargetProperty="Fill">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SliderTickMarkInlineDisabledForegroundThemeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="RightTickBar"
                                                            Storyboard.TargetProperty="Fill">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SliderTickMarkOutsideDisabledForegroundThemeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="PointerOver">
                                <Storyboard>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="HorizontalDecreaseRect"
                                                            Storyboard.TargetProperty="Fill">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SliderTrackDecreasePointerOverBackgroundThemeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="HorizontalTrackRect"
                                                            Storyboard.TargetProperty="Fill">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SliderTrackPointerOverBackgroundThemeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="VerticalDecreaseRect"
                                                            Storyboard.TargetProperty="Fill">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SliderTrackDecreasePointerOverBackgroundThemeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="VerticalTrackRect"
                                                            Storyboard.TargetProperty="Fill">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SliderTrackPointerOverBackgroundThemeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="HorizontalThumb"
                                                            Storyboard.TargetProperty="Background">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SliderThumbPointerOverBackgroundThemeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="HorizontalThumb"
                                                            Storyboard.TargetProperty="BorderBrush">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SliderThumbPointerOverBorderThemeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="VerticalThumb"
                                                            Storyboard.TargetProperty="Background">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SliderThumbPointerOverBackgroundThemeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="VerticalThumb"
                                                            Storyboard.TargetProperty="BorderBrush">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource SliderThumbPointerOverBorderThemeBrush}" />
                                    </ObjectAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                        <VisualStateGroup x:Name="FocusStates">
                            <VisualState x:Name="Focused">
                                <Storyboard>
                                    <DoubleAnimation Storyboard.TargetName="FocusVisualWhiteHorizontal"
                                                Storyboard.TargetProperty="Opacity"
                                                To="1"
                                                Duration="0" />
                                    <DoubleAnimation Storyboard.TargetName="FocusVisualBlackHorizontal"
                                                Storyboard.TargetProperty="Opacity"
                                                To="1"
                                                Duration="0" />
                                    <DoubleAnimation Storyboard.TargetName="FocusVisualWhiteVertical"
                                                Storyboard.TargetProperty="Opacity"
                                                To="1"
                                                Duration="0" />
                                    <DoubleAnimation Storyboard.TargetName="FocusVisualBlackVertical"
                                                Storyboard.TargetProperty="Opacity"
                                                To="1"
                                                Duration="0" />
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="Unfocused" />
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <Grid x:Name="HorizontalTemplate" Background="Transparent">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" />
                            <ColumnDefinition Width="Auto" />
                            <ColumnDefinition Width="*" />
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="17" />
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="32" />
                        </Grid.RowDefinitions>

                        <Rectangle x:Name="HorizontalTrackRect"
                            Fill="{TemplateBinding Background}"
                            Grid.Row="1"
                            Grid.ColumnSpan="3" />
                        <Rectangle x:Name="HorizontalDecreaseRect"
                            Fill="{TemplateBinding Foreground}"
                            Grid.Row="1" />
                        <TickBar x:Name="TopTickBar"
                            Visibility="Collapsed"
                            Fill="{StaticResource SliderTickmarkOutsideBackgroundThemeBrush}"
                            Height="{StaticResource SliderOutsideTickBarThemeHeight}"
                            VerticalAlignment="Bottom"
                            Margin="0,0,0,2"
                            Grid.ColumnSpan="3" />
                        <TickBar x:Name="HorizontalInlineTickBar"
                            Visibility="Collapsed"
                            Fill="{StaticResource SliderTickMarkInlineBackgroundThemeBrush}"
                            Height="{TemplateBinding Height}"
                            Grid.Row="1"
                            Grid.ColumnSpan="3" />
                        <TickBar x:Name="BottomTickBar"
                            Visibility="Collapsed"
                            Fill="{StaticResource SliderTickmarkOutsideBackgroundThemeBrush}"
                            Height="{StaticResource SliderOutsideTickBarThemeHeight}"
                            VerticalAlignment="Top"
                            Margin="0,2,0,0"
                            Grid.Row="2"
                            Grid.ColumnSpan="3" />
                        <Rectangle x:Name="HorizontalBorder"
                            Stroke="{TemplateBinding BorderBrush}"
                            StrokeThickness="{TemplateBinding BorderThickness}"
                            Grid.Row="1"
                            Grid.ColumnSpan="3" />
                        <Thumb x:Name="HorizontalThumb"
                        Background="{StaticResource SliderThumbBackgroundThemeBrush}"
                        Style="{StaticResource SliderThumbStyle}"
                        DataContext="{TemplateBinding Value}"
                        Height="{TemplateBinding Height}"
                        Width="{TemplateBinding Height}"
                        Grid.Row="1"
                        Grid.Column="1" />
                        <Rectangle x:Name="FocusVisualWhiteHorizontal"
                            IsHitTestVisible="False"
                            Stroke="{StaticResource FocusVisualWhiteStrokeThemeBrush}"
                            StrokeEndLineCap="Square"
                            StrokeDashArray="1,1"
                            Opacity="0"
                            StrokeDashOffset="1.5"
                            Grid.RowSpan="3"
                            Grid.ColumnSpan="3" />
                        <Rectangle x:Name="FocusVisualBlackHorizontal"
                            IsHitTestVisible="False"
                            Stroke="{StaticResource FocusVisualBlackStrokeThemeBrush}"
                            StrokeEndLineCap="Square"
                            StrokeDashArray="1,1"
                            Opacity="0"
                            StrokeDashOffset="0.5"
                            Grid.RowSpan="3"
                            Grid.ColumnSpan="3" />
                    </Grid>

                    <Grid x:Name="VerticalTemplate" Visibility="Collapsed" Background="Transparent">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="*" />
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="17" />
                            <ColumnDefinition Width="Auto" />
                            <ColumnDefinition Width="17" />
                        </Grid.ColumnDefinitions>

                        <Rectangle x:Name="VerticalTrackRect"
                            Fill="{TemplateBinding Background}"
                            Grid.Column="1"
                            Grid.RowSpan="3" />
                        <Rectangle x:Name="VerticalDecreaseRect"
                            Fill="{TemplateBinding Foreground}"
                            Grid.Column="1"
                            Grid.Row="2" />
                        <TickBar x:Name="LeftTickBar"
                            Visibility="Collapsed"
                            Fill="{StaticResource SliderTickmarkOutsideBackgroundThemeBrush}"
                            Width="{StaticResource SliderOutsideTickBarThemeHeight}"
                            HorizontalAlignment="Right"
                            Margin="0,0,2,0"
                            Grid.RowSpan="3" />
                        <TickBar x:Name="VerticalInlineTickBar"
                            Visibility="Collapsed"
                            Fill="{StaticResource SliderTickMarkInlineBackgroundThemeBrush}"
                            Width="{TemplateBinding Height}"
                            Grid.Column="1"
                            Grid.RowSpan="3" />
                        <TickBar x:Name="RightTickBar"
                            Visibility="Collapsed"
                            Fill="{StaticResource SliderTickmarkOutsideBackgroundThemeBrush}"
                            Width="{StaticResource SliderOutsideTickBarThemeHeight}"
                            HorizontalAlignment="Left"
                            Margin="2,0,0,0"
                            Grid.Column="2"
                            Grid.RowSpan="3" />
                        <Rectangle x:Name="VerticalBorder"
                            Stroke="{TemplateBinding BorderBrush}"
                            StrokeThickness="{TemplateBinding BorderThickness}"
                            Grid.Column="1"
                            Grid.RowSpan="3" />
                        <Thumb x:Name="VerticalThumb"
                        Background="{StaticResource SliderThumbBackgroundThemeBrush}"
                        Style="{StaticResource SliderThumbStyle}"
                        DataContext="{TemplateBinding Value}"
                        Width="{TemplateBinding Height}"
                        Height="{TemplateBinding Height}"
                        Grid.Row="1"
                        Grid.Column="1" />
                        <Rectangle x:Name="FocusVisualWhiteVertical"
                            IsHitTestVisible="False"
                            Stroke="{StaticResource FocusVisualWhiteStrokeThemeBrush}"
                            StrokeEndLineCap="Square"
                            StrokeDashArray="1,1"
                            Opacity="0"
                            StrokeDashOffset="1.5"
                            Grid.RowSpan="3"
                            Grid.ColumnSpan="3" />
                        <Rectangle x:Name="FocusVisualBlackVertical"
                            IsHitTestVisible="False"
                            Stroke="{StaticResource FocusVisualBlackStrokeThemeBrush}"
                            StrokeEndLineCap="Square"
                            StrokeDashArray="1,1"
                            Opacity="0"
                            StrokeDashOffset="0.5"
                            Grid.RowSpan="3"
                            Grid.ColumnSpan="3" />
                    </Grid>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Usage
<Slider Height="72" VerticalAlignment="Center" HorizontalAlignment="Center" Width="500" Style="{StaticResource MyCustomSlider}"/>

Slider's track height is assigned via standard style & resource. Its key is SliderTrackThemeHeight and default is 11. So you need to write below line in App.xaml ONLY and whenever you want to change it you can access the resource and change it.
<x:Double x:Key="SliderTrackThemeHeight">50</x:Double>

You can set from code behind like this.
Application.Current.Resources["SliderTrackThemeHeight"] = YOUR_DYNAMIC_VALUE;

Slider styles and templates - MSDN


text:
'use strict';

Object.defineProperty(exports, '__esModule', {
  value: true
});

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }

var _react = require('react');

var _react2 = _interopRequireDefault(_react);

var _DateConstants = require('./DateConstants');

var _DateConstants2 = _interopRequireDefault(_DateConstants);

var _util = require('../util/');

function isSameDay(one, two) {
  return one.getYear() === two.getYear() && one.getMonth() === two.getMonth() && one.getDayOfMonth() === two.getDayOfMonth();
}

function beforeCurrentMonthYear(current, today) {
  if (current.getYear() < today.getYear()) {
    return 1;
  }
  return current.getYear() === today.getYear() && current.getMonth() < today.getMonth();
}

function afterCurrentMonthYear(current, today) {
  if (current.getYear() > today.getYear()) {
    return 1;
  }
  return current.getYear() === today.getYear() && current.getMonth() > today.getMonth();
}

function getIdFromDate(date) {
  return 'rc-calendar-' + date.getYear() + '-' + date.getMonth() + '-' + date.getDayOfMonth();
}

function noop() {}

function handleDayClick(current) {
  this.props.onSelect(current);
}

function handleCellMouseEnter(current) {
  this.props.onDayHover(current);
}

var DateTBody = _react2['default'].createClass({
  displayName: 'DateTBody',

  getDefaultProps: function getDefaultProps() {
    return {
      onDayHover: noop
    };
  },

  render: function render() {
    var props = this.props;
    var iIndex = undefined;
    var jIndex = undefined;
    var current = undefined;
    var dateTable = [];
    var showWeekNumber = props.showWeekNumber;
    var value = props.value;
    var selectedValue = props.selectedValue;
    var today = value.clone();
    var prefixCls = props.prefixCls;
    var cellClass = prefixCls + '-cell';
    var weekNumberCellClass = prefixCls + '-week-number-cell';
    var dateClass = prefixCls + '-date';
    var dateRender = props.dateRender;
    var disabledDate = props.disabledDate;
    var todayClass = prefixCls + '-today';
    var selectedClass = prefixCls + '-selected-day';
    var inRangeClass = prefixCls + '-in-range-cell';
    var lastMonthDayClass = prefixCls + '-last-month-cell';
    var nextMonthDayClass = prefixCls + '-next-month-btn-day';
    var disabledClass = prefixCls + '-disabled-cell';
    var firstDisableClass = prefixCls + '-disabled-cell-first-of-row';
    var lastDisableClass = prefixCls + '-disabled-cell-last-of-row';
    today.setTime(Date.now());
    var month1 = value.clone();
    month1.set(value.getYear(), value.getMonth(), 1);
    var day = month1.getDayOfWeek();
    var lastMonthDiffDay = (day + 7 - value.getFirstDayOfWeek()) % 7;
    // calculate last month
    var lastMonth1 = month1.clone();
    lastMonth1.addDayOfMonth(0 - lastMonthDiffDay);
    var passed = 0;
    for (iIndex = 0; iIndex < _DateConstants2['default'].DATE_ROW_COUNT; iIndex++) {
      for (jIndex = 0; jIndex < _DateConstants2['default'].DATE_COL_COUNT; jIndex++) {
        current = lastMonth1;
        if (passed) {
          current = current.clone();
          current.addDayOfMonth(passed);
        }
        dateTable.push(current);
        passed++;
      }
    }
    var tableHtml = [];
    passed = 0;
    for (iIndex = 0; iIndex < _DateConstants2['default'].DATE_ROW_COUNT; iIndex++) {
      var weekNumberCell = undefined;
      var dateCells = [];
      if (showWeekNumber) {
        weekNumberCell = _react2['default'].createElement(
          'td',
          { key: dateTable[passed].getWeekOfYear(), role: 'gridcell',
            className: weekNumberCellClass },
          dateTable[passed].getWeekOfYear()
        );
      }
      for (jIndex = 0; jIndex < _DateConstants2['default'].DATE_COL_COUNT; jIndex++) {
        var next = null;
        var last = null;
        current = dateTable[passed];
        if (jIndex < _DateConstants2['default'].DATE_COL_COUNT - 1) {
          next = dateTable[passed + 1];
        }
        if (jIndex > 0) {
          last = dateTable[passed - 1];
        }
        var cls = cellClass;
        var disabled = false;
        var selected = false;

        if (isSameDay(current, today)) {
          cls += ' ' + todayClass;
        }

        var isBeforeCurrentMonthYear = beforeCurrentMonthYear(current, value);
        var isAfterCurrentMonthYear = afterCurrentMonthYear(current, value);

        if (selectedValue && Array.isArray(selectedValue)) {
          if (!isBeforeCurrentMonthYear && !isAfterCurrentMonthYear) {
            var startValue = selectedValue[0];
            var endValue = selectedValue[1];
            if (startValue) {
              if (isSameDay(current, startValue)) {
                selected = true;
              }
            }
            if (startValue && endValue) {
              if (isSameDay(current, endValue) && !selectedValue.hovering) {
                selected = true;
              } else if ((0, _util.compareByDay)(current, startValue) > 0 && (0, _util.compareByDay)(current, endValue) < 0) {
                cls += ' ' + inRangeClass;
              }
            }
          }
        } else if (isSameDay(current, value)) {
          selected = true;
        }
        if (isBeforeCurrentMonthYear) {
          cls += ' ' + lastMonthDayClass;
        }
        if (isAfterCurrentMonthYear) {
          cls += ' ' + nextMonthDayClass;
        }
        if (disabledDate) {
          if (disabledDate(current, value)) {
            disabled = true;

            if (!last || !disabledDate(last, value)) {
              cls += ' ' + firstDisableClass;
            }

            if (!next || !disabledDate(next, value)) {
              cls += ' ' + lastDisableClass;
            }
          }
        }

        if (selected) {
          cls += ' ' + selectedClass;
        }

        if (disabled) {
          cls += ' ' + disabledClass;
        }

        var dateHtml = undefined;
        if (dateRender) {
          dateHtml = dateRender(current, value);
        } else {
          dateHtml = _react2['default'].createElement(
            'span',
            {
              key: getIdFromDate(current),
              className: dateClass,
              'aria-selected': selected,
              'aria-disabled': disabled },
            current.getDayOfMonth()
          );
        }

        dateCells.push(_react2['default'].createElement(
          'td',
          { key: passed,
            onMouseDown: disabled ? noop : handleDayClick.bind(this, current),
            onMouseEnter: disabled ? noop : handleCellMouseEnter.bind(this, current),
            role: 'gridcell',
            title: (0, _util.getTitleString)(current), className: cls },
          dateHtml
        ));

        passed++;
      }
      tableHtml.push(_react2['default'].createElement(
        'tr',
        {
          key: iIndex,
          role: 'row' },
        weekNumberCell,
        dateCells
      ));
    }
    return _react2['default'].createElement(
      'tbody',
      { className: prefixCls + 'tbody' },
      tableHtml
    );
  }
});

exports['default'] = DateTBody;
module.exports = exports['default'];

redpajama_set_name: RedPajamaGithub


I can assure you that Flynn is just as talented as his father. He's starred in three video projects, and has narrated two audiobooks of the same series.
And his twitter displays his full name.
Just a little correction. The titles he's spotted in are "The War on Drugs: Holding On", "Everybody's Drunk but Me, by Alexis Babini" (he starred alongside his GF), and "Taking Back the City, by Jo Blakk". All three of these films can be found on Youtube.com.
The audiobooks can be found on audible.com, just type Flynn's name or the authors name, Jasper T Scott.


text:
Q: How to use Stream.CopyTo on .NET Framework 3.5? I found upload code and this code contains the Stream.CopyTo method.
Example:
  file.Stream.CopyTo(requestStream); // .NET Framework 4.0

How can I copy "file.Stream" to "requestStream"?

A: You can't, basically. It's only implemented in .NET 4. You can write a similar method yourself though... and even make it an extension method:
// Only useful before .NET 4
public static void CopyTo(this Stream input, Stream output)
{
    byte[] buffer = new byte[16 * 1024]; // Fairly arbitrary size
    int bytesRead;

    while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0)
    {
        output.Write(buffer, 0, bytesRead);
    }
}


Soloy, March 26, 2007 - Olympia, WA - Soloy Aviation Solutions signs agreement with Airwork NZ (New Zealand) for AS350 conversion kit sales and support.
This greement confirms Airwork's commitment to operators throughout the region who choose Honeywell LTS101 power for their AS350 helicopters. Airwork's years of experience inspecting and supporting the LTS101 series engine made it an easy decision for Soloy to choose Airwork to represent the new AS350SD2 conversion product line.
In addition to Airwork's LTS101 experience, Soloy also recognizes their first hand knowledge of the AS350 fleet operating in Australia and New Zealand as a plus for the promotion of the new Soloy product line.
Airwork New Zealand is ideally positioned to provide complete Soloy AS350SD2 conversion kit installation and support for all its AS350 customers.
By combining Airwork's Turbine Support, an approved Honeywell Maintenance Center, and their maintenance / modification skills, Airwork has the ability to carry out upgrades either at the customers' base or the closest Airwork facility. Airwork also is approved by the New Zealand Civil Aviation Authority as a training organization. Airwork New Zealand is administered from the company's central office at Ardmore Airfield, Auckland and has bases throughout New Zealand and Australia.
Soloy Aviation Solutions is the industry leader in engine accessory applications and re-engine modifications for helicopters and fixed wing aircraft. In-house capabilities include design, analysis, testing and manufacturing under an FAA approved quality system. In over 35 years, Soloy has obtained multiple certified applications and is currently certifying a new configuration of the Soloy Cessna 206H "Mark 2" with the Rolls-Royce 250-B17F powerplant.