presentation please close the door as quietly as possible yeah like that you want you can evaluate seasons in this link please tweet about the presentation about the conference and write blog posts about the conference and I should promote grand finale today and the end at the 1630 at the 105 there will be a awesome things to win and now please welcome new presenter Nathaniel McCallum and something about photography thank you very much everybody hear me all right we're going to start off with a question how many of you here have a laptop with an encrypted disk okay that's a really good number okay now we're going to do another question how many of you are feeling really guilty that your hand wasn't raised before anybody yeah all right we've got some honest people right because sometimes encryption can be a little bit of pain we're going to talk about some of the problems of key management and how we hope to solve them I do ask your patients we are having some technical difficulties my slide unfortunately is on the cloud it is not on a USB key and apparently the cloud provider had a massive data failure and the entire database or the entire data center went down there was the battery backup didn't work and all kinds of stuff so we're going to try to hobble through this and actually I was able to get a live feed here from their data center and unfortunately they're all running around like crazy right now because this is popping up everywhere in their data center and so we really need to ask a question right can we automate this because if you know usability is a major impediment to security this is something we should really try to solve so before we can answer that question let's look at how this encryption is typically done so it all starts off with a secret right oftentimes this secret is your your hard disk it could be some data that a service has but it's we have something that we want to keep secret and then we usually encrypt that secret and using an encryption key now as soon as your secret grows in size one of the things you're going to quickly realize is that you don't want to constantly re-encrypt your data because that's a lot of work in fact there was a really great talk about about lux to disk re-encryption they're going to be doing it live so it's really really cool stuff so check that out on the web if you didn't go to the talk but but yeah trying to re-encrypt anything that is of a sizable amount is just very difficult so what do we do in the case of compromised keys well we actually wrap this in another key okay so we have the encryption key which protects the data itself and then we have a key encryption key which protects the encryption key and the reason that we do this is that if the outer key is compromised we can just change the outer key without having to change the inner key okay then you don't have to re-encrypt your data and the typical way that this is often deployed as you saw in the beginning of my slide is that you start up your computer and you have some kind of a password and you type your password in and what that password does is it gives you the password is the key encryption key the key encryption key is then used to decrypt the encryption key and then the encryption key is used to decrypt the data and then of course this is distributed out to all of the admins who are supposed to have access to this device of course this this immediately comes with a problem you have multiple people all sharing this password and there are lots of ways to get around this Luxe gives you multiple slots for instance and that's a that's a great solution but it does have its limitations it doesn't scale and so one of the ways that we can try to automate this is we actually generate something that's a little stronger cryptographically so here we have a cryptographically strong random key and then we store this in some remote system which we can then fetch at a later time and this is pretty much the standard escrow model or is it can anybody tell what I'm missing here what's up more encryption keys you see because we can't just transfer this key over the wire because if we did so then anybody who was listening of course could immediately figure out what our key was and then we'd be sunk so we've got to encrypt the channel with which we distribute the key and this is typically done with TLS or with GSS API and now we're done right oh yeah we actually have to authenticate the parties right because we can't just send this magical key to some server if we don't know that the server is the server that is claiming to be so the server itself has to have a key as part of this authentication some kind of identity right and we're done right no because we're gonna fetch the key back so now we have to know that the client also has a key so that this server can verify that this person is supposed to get the key that they're supposed to get so anybody notice that a tendency here we're getting a lot more what keys okay so now we need a central place to manage all of these keys and this is typically done with either a KDC in the case of using Kerberos for instance with GSS API or you'll have some kind of a sort of certification authority if you're using TLS and of course you have to handle the issuance of the keys you have to handle the revocation of the keys because if anything happens if those keys are compromised then your key encryption key is compromised and so on down the chain and of course we also have to have backups right because we can't just deploy this now complex system without having some way to restore to this very complex state because keep in mind this escrow server is probably storing lots of keys from lots of different places and if we all of a sudden lose this escrow key we are lose this escrow server's data we're really sunk so we have to keep really accurate backups up to the minute right with all the keys that are changing hands and this is a fully stateful process here so finally we are done we can rest assured that there is not going to be any kind of problem whatsoever well you see we have this problem now that we're using encryption all over the place to try to protect our keys but we all we're doing is increasing complexity in the stack and anytime that we increase complexity in the stack we're increasing our attack surface and so every little link in this diagram now is a potential point of vulnerability for our system so what we've done here is we've made it truly easy to get the key back but we've also opened up ourselves to a lot of new risk so we've learned a few lessons here we've learned that complexity complexity increases the attack surface we learned that escrow is difficult to deploy and we also learned something else which is that speed matters because if we go back a slide here notice all of this complexity every single hop in this complex chain adds latency and so when you have a data server of a hundred thousand servers all coming up at the same exact time from a power outage what's gonna happen to this server right here we're gonna have a massive bottleneck a denial of services all of these servers come online at once and try to get their keys back so speed matters so question number two can asymmetric cryptography help us here and the answer is actually yes and what we did is a year ago actually after the last dev comp in some brainstorming meetings we came up with a new model and we called this the day of project day oh was Greek for I bind some so binding things together as the idea and one of the things that we wanted to do was we wanted to move the state out of the escrow server okay so in this case what we do is we take this key encryption key and we encrypted again using the public encryption key of the server notice we're doing asymmetric cryptography now this step can actually be done offline as long as the client has these the server's public key and the end result is that all of our secret secrets still reside on the client in this system right so we no longer have any complex state on the escrow side of the equation so then what we do is during the time in which we want to do decryption of this key we then send the encrypted key encryption key to the day of server the day of server just uses its local key which can be stored in memory so it's all very fast and stateless and it can return back the disc encryption key notice it didn't store anything and so we don't we no longer have a central point of compromise in the server and also we've reduced the load significantly because we're not calling out for this guy oh every time a request comes in so this is definitely an improvement however we have some keys here as well we have two keys in particular first we have a key for encrypting the channel where the key is being transferred across and second we have the asymmetric key pair for doing the public key crypto and so this is this is better we don't have like a full assortment of all of these arrays of keys but we still do have some keys which presents some complexity and we still do have the sort of heart bleed problem right if anybody can penetrate this outer layer of encryption then when the key is coming back and it's decrypted states to the client at that point if somebody can break the encryption then they can get the key so we also still have certificate authority and backups and one of the things that we discovered when writing this software and in fact there was releases of this software and one of the things we discovered that this part here actually made it pretty complex to deploy even with fairly step-by-step instructions when people were trying to reproduce this setup they had difficulty and we thought that that was not a really great way to start so we began to look again and we learned some lessons here asymmetric crypto makes it so that the server is stateless and we really like this feature because it means that we can get high performance it also means that we can reduce attack points like say on the disk chain and whatnot the asymmetric crypto also allows for offline provisioning which is a really nice feature particularly think of in cases you know where you might have spotty internet connectivity you can have the public key on the flash drive provision a whole bunch of systems and then when the network comes back up you can you can continue to work but one of the things that we identified was that sending the keys over the wire is a risk and we'd like to ask can we do better than that we also learn that x509 takes a lot of effort so our project died we killed it and we moved on to something which we think is better so let's move to question number three must the key go on the wire now my intention today is to kill someone with math so I want to see a hand if you're dead later so this is just standard alga mall encryption okay this is this is not me doing anything anything special what we do is the server generates a key pair sends the public key to the client the client will generate its key pair and will encrypt some data using it and then when you want and then now the data is encrypted and when you want to perform decryption on the other side the client returns at this K this a value in this K value to the server the K value is the encrypted value and the server performs a mathematical operation and returns the uppercase K here which is the plain text data okay so this is actually going to be the basis for the new crypto in this project we're going to move one step over watch very carefully we'll go back and forth a few times notice that nothing on the left-hand side changes okay so the left-hand side which of alga mall encryption is going to stay exactly the same in this key exchange we add only one thing which is we take this X value here and we generate we generate an ephemeral key pair and by mixing this additional ephemeral key pair at decryption time into the value that we send to the server we can send the key to the server the server performs its side of the mathematical equation and returns back the result and we can now calculate the K rather than the server calculating K now the interesting thing that this does is this means that there's no K ever on the server that means the server never knows anything about what's going on in the client it just simply says I can perform this mathematical operation and if you can contact me then I can perform it for you but it knows literally nothing about the client at least algorithmically so we created a new project called tang and this is the tang model it looks very similar to what we had before we have our secret in the middle we have our encryption key we have our key encryption key which is generated as part of the exchange with our tang server there's a lot of stuff missing in this slide now notice that there's no longer a TLS channel here and that's because this is done completely over the wire it's the same as a diffie helmet same properties as like a diffie helmet exchange or a public algal mole encryption by transferring these over values over the wire nobody gets any advantage and this is provably secure so the end result is that our key encryption key always stays local and the server never sees anything of course we still do have to have backups but our backups are much more limited in scope now and the reason for this is because we have we have in tang a set of keys for doing encryption these keys can be generated at will whatever whatever your key rotation policy states and at that time they can be inserted in backups but aside from key rotation there is absolutely no state whatsoever on the server and so this makes for a very very limited attack footprint the size of the server is extremely small this is the the project page here and this includes the server side demon with the clevis pin which we're going to talk about in a minute don't get too excited we are nearing our first release and it has an extensive test suite it's really fast so we can handle north of 30,000 requests per second so if you think of a data center where you've got a hundred thousand machines all coming up across the span of about five that's five seconds we can handle this on one computer so very very lightweight very very fast very very small attack surface and substantially tested so now that we have accomplished this task of taking that secret that we want that data and we've now bound it to a third party and it can only be decrypted in the presence of that third party let's do a little brainstorming about some of the other kinds of things that we could do obviously the the one that Intel would be very interested in us using is the trusted platform module and this indeed would guarantee that the for instance the disk is in the computer right because there's a physical connectivity is what we're testing for there and think start thinking now in terms not of keys but in terms of relationships right so in this first case we have a relationship between a disk being in a chassis in the second case we have a Bluetooth elli beacon so we can implement this tang protocol over Bluetooth low energy and you could say up in the ceiling of your office you could have this Bluetooth low energy beacon and only the people that are within that you know 30 feet 50 meters whatever the range is not 50 meters but whatever the range is on your on your Bluetooth beacon you know that's the range in which they will be able to perform decryption and if they go outside of that range they can't perform decryption anymore another case might be that we during the provisioning time we generate a random key and we print a QR code and you take that QR code and you stick it in a safe right and this is your this is your last ditch recovery at this point all other methods of decrypting the data have failed and so you take this physical key and you go and unlock the safe and get back your QR code and then you scan it in the in the webcam so obviously techniques like facial recognition fingerprint scans mobile phones can do the same thing with Bluetooth right using the same protocol and then the standard smart card and RFIDs so these are all different kinds of relationships that your data can have with objects now how many of you want to Josh Bresser's talk yesterday on security security everything it was a fantastic talk and one of the things that he said in this talk I think is really worth highlighting which is that security is not a binary and oftentimes when particularly doing encryption we often think in these binary terms right is the data secure or is it not secure and what are the things I wanted to do in shifting us to thinking about relationships between data and the third parties is that we can actually now begin to think in terms that are not necessarily binary and this is this should not surprise us at all because this is precisely the way that we human beings think when we walk into a room we can quickly assess many factors in the room and you know let's say I find a white fridge in a room well that may not be anything on its own but if I find a white fridge and you know a bunch of other white stuff and a surgical table and you know I might start to piece together that maybe this is a hospital right so we gather all of these pieces of data and we weigh them collectively and we establish the ratio relationships between them and based upon this we can reason about things and this is oftentimes the way that we reason about security right if you when you're asking the question maybe am I in a safe environment am I in a good part of town there's not a sign that says you are now entering you the bad part of town right if there was lots of people get sued probably so so there's not a sign that's telling us that and so the way we reason about it is that we enter into that environment and we begin to have relationships with all of the objects that are around us and we begin to reason in ways that are not necessarily binary about our relationships between these objects and so one of the questions we want to ask next is how do we make unlock policy non-binary and there's actually a way to do this it's a technique called some Shamir secret sharing and the way that Shamir's works is that it allows you to take a key one of your security keys here and you can split it up into an arbitrary number of subkeys you also during this operation define a threshold the threshold can be like one in which case if any of these keys are present then we can recalculate this key if the threshold is two we would need two out of these five to recalculate the main key and so on all the way up to five so we can now with Shamir has actually expressed complex relationships between objects so we can begin to as a computer reason in a way that is fairly similar to the way that humans reason which is one of the other things that that this can be nested right so you can actually then take Shamir and apply it again and split this key out and so you can have nested policy and using this we can create fairly complex sets of relationships between objects so let's take an example of a simple laptop this laptop's been issued to you by corporate IT you're probably being if you're using Linux you're probably encrypting with Luxe and Luxe has a great facility called slots and you can have so many slots and there's an or relationship between the keys well we can do the same we can express the same kind of relationship with Shamir's by simply specifying a threshold of one in this case either one of these keys will allow us to reconstitute this key as a result the admin can log in with his or her password or the user can log in with his or her password right and so this makes a lot of sense because you don't want the admin knowing what your password is you want to be able to use your password on a day-to-day basis but the admin also needs to be able to recover your data if something were to happen and so we can express this now in a Shamir's relationship with a threshold of one now let's add tang into the mix right so this is the same exact setup but now we're automated so we still have the admin password for recovery and we still have the user password for for the case where the tang server is not available but if the tang server is present we're gonna automatically unlock the laptop right which is a really really useful feature so think of how this might work and it may be an office setting where you walk into the office on Monday morning and you turn on your laptop and it boots and you don't type anything because it was on the corporate network and it was able to talk to the tang server it has a relationship with that tang server and therefore the description can work but then on Friday night you decide to take your laptop and go sit at a coffee shop well you're no longer on the corporate network you're now on some Wi-Fi hot spot and in this case you do not have access to tang so when you turn on your laptop you're gonna get prompted for a password so fairly simple ways to approach these begin to approach these complex relationships let's say we have a high security system right in this case we want to guarantee that no one user can decrypt the system by him or herself and in this case we've now set the threshold to two so we have three user passwords and so long as any two of them are there to type in their passwords they can now unlock the system here's a complex policy but one that actually has some use and now you can begin to think about the way that we human beings also relates to these objects in this policy we have three layers of nested shemures the first layer has a threshold of one and has a QR code as its as its method of input this is the recovery step right if all else fails you should be able to scan that hard-coded QR code and get into the system and the QR code is kept locked in the safe somewhere but if that if you can't do that now we move on to the next level at this next level we have a threshold of two which means that both of these branches must hold true so we must have TPM in other words the disk must be in the chassis so this allows now for the admin to pull the disk out of the chassis and use the QR code but in a normal case the disk must remain in the chassis now we go down our next branch our threshold here is two again which means that we need two methods of authentication and in this case we have four options we can type in our password we can scan our fingerprint we can contact this tank server or we can do blue to blue to the proximity right so let's say you're sitting at your desk in your office underneath the Bluetooth beacon and you're on the corporate network when you boot your system you're gonna get in automatically because these two are going to return values but now let's say you walk into the conference room and you're not sitting at your desk now you're going to still have access to 10 because you're on the corporate network but you're not going to be in proximity to your Bluetooth and so now we need to provide one of these other two and typically you're probably provided fingerprints again because it's easy you don't think about it you just swipe your finger now again you go out to the coffee shop and so we still need two methods of authentication in this case you can specify your password in your fingerprint so this is a fairly complex policy but you can actually think now about the scenarios in which this provides a very good user experience in high security environments which we've determined by analyzing our surroundings right so this is the quote I want to leave us on we need to let business policy drive crypto policy not vice versa and the reason I say this is because oftentimes we get in this conversation where we're asked well how can we keep our data secure and we can say well you have this one option or this two options right what we really need to be able to say now is we need to be able to describe scenarios where it's not just a binary and where we can in high security environments we can provide high usability where we don't even have to say enter passwords but then as we transition out of those high security environments into lower security environments at that point then our authentication policy gets stricter and stricter and so note that this is not binary we actually have multiple steps in these tiers so this is actually implemented by a project called clevis and you can see the URL there this is client side a pluggable key management so before when I said that Tang had a clevis pin a clevis pin is a plug-in for this framework so this actually provides HTTPS which is the standard escrow case that lots of people are already using so clevis can just go into that environment and work out of the box we also have support for custodia which is a really really awesome key transfer framework and api that semo is working on where are you semo in the back if you have questions talk to him it's really cool so we actually support that out of the box we have support for tang although it's not in this repo it's in the tang repo so we do that to avoid circular dependencies we have support for password and support for shamirs this is minimal dependencies we only require open SSL and lib Janssen but if you want HTTPS currently we require lib curl we are working also on early boot integration and this project is a little bit behind the tang project where the tang project is about to get its first release and is extensively tested this is still undergoing active development however I can give you a demo so we're gonna start off here by actually bringing up our tang server you can see that the tang server is actually already running but there's no keys so the first thing we're gonna do is we're gonna generate a key and to do this make that full size so to do this we run the tang gen command capital a means that we're gonna advertise this key we're gonna pick a crypto group to use and this is a signature key we also have to create a recovery key so that's it I don't have to do anything else my server has already picked up that those keys are available and we'll use them to any incoming connections so let's switch now to talking about clevis so we're gonna go to the provisioning step we're gonna start off pretty simple just a plain old password so what we have here is we have the clevis command and we're gonna provision this is gonna be our pin layout and we're only specifying one pin and that's password and then we're gonna store the provisioning metadata in a file called xxx so now we it's been we're being prompted for the password that we want to use on this provisioning I'm gonna type in foo and it generates our cryptographically strong master key this is we're using currently as 128 so this is 128 big key but it's encrypted using the password and now we can actually look in the file and we can see that it's just really a little bit of jason where we're encrypting the cryptographically strong key using the password and key derivation and a variety of other parameters there and by the way if you were in the lux talk you heard about the lux metadata area which is now going to be in jason notice that this is in jason wonder what that might be about so now we want to that's this is for setup right so we've now set up say our partition and the next thing we want to do is we want to unlock it and this process is called acquiring and so we run the acquire we type in our password again and we get back our cryptographic key so now we want to do this in a completely automated way so we're gonna provision again but this time we're going to use tang so again we're specifying just one pin which is a type tang and we have the the host to contact is local host so we're gonna run this and it's gonna ask us if we want to trust our keys this is the same exact type of behavior you would get in say SSH so we're gonna do trust on first use we're gonna trust those keys and it generates our secure crypto key there and we run the acquisition process again and without any password we get back the same key so this key by the way would be piped into your disk encryption or whatever else so let's look at one more example before we move on to nesting I'm gonna start this little HTTP server and all it does is you can post data to it and it retains the data and then you can get the data back so it's like a fairly typical escrow service and so we're gonna provision again and this time we are going to provision using our HTTP plug-in right there and we're gonna specify the format which is binary which means we're just sending the binary blob to the server so we run it again and you notice that we got a put request over here on the server so we've stored that in the HTTP server now we run acquisition we're gonna get that object back from the server and we have the same exact crypto key again all right now we are going to look at nesting these with shimmers so here's an example with shimmers so we our root plug-in is going to be shimmers and we're gonna have a threshold of one we're gonna have two children pins one of them is password and one of them is Tang so this handles the case where if the tank server is available you type in your password or you don't type in your password but if the tank server is not available then you type in your password so we'll provision this it asks us for a password and it will contact the tank server we trust the keys and it outputs our cryptographic key we run acquisition now watch this it's prompting for the password but I'm gonna do nothing and as soon as it gets the result back from the tank server then we get back the same key immediately we do not have to wait and type in a password because our threshold was one so we can now change this threshold to two and now we're gonna require both so we'll type in our password again we will trust our keys from the server and now we unlock using the acquisition step and now I'm gonna wait again and I'm getting the result from the server but it's not going to continue because our threshold is two at this point we have to type in our password in order to complete the chain and once the chain is completed we get our key back question what's happens of what oh yeah we can do that not a problem so let's stop I guess we can't let's do system so we'll stop the service and we'll stop the socket that activates the service and now we'll run our acquisition step again type in my password but it's gonna time out and not print a key because the tank server is not available and our exit status is non-zero yes I'm sorry what was the question I can't hear okay so rotation is not currently implemented it's gonna be coming hopefully soon and the way that it works is that with the key that we trusted at the beginning of that phase was actually not the key that we're using for distribution that's actually the signing key if you remember at the start of the demo I created two keys a signing key and a recovery key the signing key is used to sign the advertisement of what keys the server has and that's the key we trust so our trust follows the chain of signing keys then the signing keys can sign other signing keys and then they can also sign recovery keys so at that point what happens on the server is when you want to rotate the keys you just generate new keys like we just did and then you modify the the previous keys to not be advertised this means that the new the new clients will get the new keys but the old clients using the old keys will still continue to work and then when the when the clients running the old keys perform their rotation they will see the new keys in the advertisement upgrade to the new keys and after all the clients are updated then you can finally remove the old keys from the server what's that yes this is where the names come from by the way it comes from any of the old techniques for binding things together like old handcuffs for instance if you if you've ever seen in museums old Roman handcuffs they would you'd put your wrist through here and there would be a C shaped thing that's called the clevis and then the thing that it gets hooked to is the tang and then the pin is what binds it so that's where our terminology comes from any other questions yes nothing it's and that's the whole point is that because you're sitting at your desk we consider that to be a high security environment right and this is part of that acceptable risk trade-off so again security is not binary it's something that people want some trade-off for security so they want to identify areas or situations in which a higher security policy is required and other situations in which a lower security policy is required so the answer is nothing prevents that and that choice was not made by me that's something that's really important that choice was not made by me as a developer it was made by the administrator who deployed it and that was made based upon a business justifications which is why I said and I highlighted this phrase let the business policy drive the crypto policy not vice versa so they realized it was an acceptable trade-off and they chose that behavior what are their questions yes yes it's it's theoretical and we haven't implemented it well if you have a think pad you probably have a fingerprint scanner so the practicality is pretty high you use you would use the fingerprint to encrypt a random key and the random key would then be handed back to the chain and to undo the Shamir's chain yes that's exactly the way the fingerprint scanning works this is the the protocol itself I believe you're talking about the key exchange it's been it was published on on several crypto lists you were actually on those lists and you commented so I think that's I think that's why you're asking so yeah it was published to several crypto lists we also advertised it at the storage developer conference and there was a crypto guy there who looked at it so the answer is it's not as it's not been as we reviewed as I would like and you are happy to review it and we will we will definitely take that review can you think of some give me some ideas I'll take them okay looks like we're out of time thank you very much for coming if you are one of the people that ask questions there's I forgot to give out these scarves but they're up here if you want one come get them I think it went well


Today, in the Republic of Korea, numerous attempts are made in diverse fields to transform agriculture, from depending only on the experience and know-how of farmers into a high-tech industry based on technology and data. The cherry tomato farmer, Kim Tae-hoon, utilizes ICT-based environmental control equipment in a five-span, Venlo-type smart farming greenhouse to grow cherry tomatoes. Once the information on the optimal environment for tomato farming is entered into the ICT-based environment control computer, the system automatically runs the equipment to create preset environmental conditions. Depending upon the amounts of solar radiation and cumulative light, the nutrient solution feeder mixes different ratios of nutrients and groundwater and supplies them directly to the plants, and Kim can keep track of the conditions of his plants based on the weights of the substrate and the drain solution. Although it has been less than two years since Kim began operating the smart farm, its production volume has more than tripled to an average of 20 to 21 kilograms per square meters per year, from 6 kilograms square meters in 2020 prior to smart farm introduction. Pig farmer, Pei Hong-Yao, introduced ICT equipment to a new pig house that he built in 2021. A variety of equipment is used to regulate the environment inside the pig house. An automatic feeder controls the feeding process, while keeping track of the amounts of feed provided and the remaining, giving the pigs a uniform growth environment. As a result, the new pig house with ICT equipment has shown not only much better performance in terms of the numbers of pigs shipped to market, but also a piglet sow per year figure that is about one piglet higher than in the past, and a significant decline in the stillbirth rate. Since 2017, Agricultural Technology Center in Huasong City has been applying a range of ICT technologies to vineyards. The center is developing and trialing a mobile app that allows farmers to control their farms and check several data points using their smartphones, as well as programs enabling them to collect environmental data from their farms and control them in real time. Based on accurate weather observations, the center also predicts outbreaks of pests and occurrences of adverse weather conditions and sends the information to each farm. A recent survey on grape smart farms found that, in comparison with 2018, labor and pesticide use declined by more than 20% in 2019, while the sugar content of grapes rose by more than 2 degrees bricks and farm household incomes grew by more than 10%. Smart Farm Innovation Valley is a government-run institution that offers a vivid picture of the current state of the Republic of Korea's agri-food system transformation. Yang Su-hee, a Smart Farm Incubation Project trainee at the Kimche Smart Farm Innovation Valley, received professional education and hands-on training at the Innovation Valley. Currently growing cherry tomatoes with fellow team members on a 4,000-metre-squared rental smart farm. In addition to the education provided there, the Smart Farm Innovation Valley serves as a base for demonstrating technology and equipment, and collecting the data from smart farms to enable creative young farmers to realize their dreams as farmer entrepreneurs. The government of the Republic of Korea is implementing ODA projects in agriculture to share its agricultural technology to build a more sustainable agri-food system. FAO will also play a key role through Digital Village Initiative for the transformation of the agri-food system.


Hello, everyone. My name is Donald Mac and I'm Amy and we are both PMs at Microsoft on the visual studio for Mac team we are here today to show you how to work in visual studio for Mac and Show you some of our favorite tips tricks and some of the things that we really like about visual studio for Mac So down what can visual studio for Mac do for me? You know I'm not so sure. I'm not so sure What can visual studio do for you? well Let's say it this way if I would have put it in a nutshell right you can build a number of things, you know You can build apps games services for mobile web desktop and the cloud So yeah, just a few things right and I know I know this really excites you So, you know, it excites me sometimes too, but don't worry We will go into this in a lot more detail over the course of this presentation So I'd like to start off with a brief introduction About what visual studio for Mac is a visual studio for Mac is a native Mac OS application That has the look and feel that you would expect on a Mac So for those of you who are familiar with the Macs are you going to feel that same same thing that you feel on? On the Mac for any other application for those of you that are used to visual studio on Windows We know that you know, it's going to feel a little bit different for you It might be a little bit jarring because because of those differences But where possible we try to make make be very mindful of those differences to make it easier for you Speaking of making things easier. We also try to make it easy for you to Download and get running with visual studio from that pretty pretty easily Once you've downloaded and installed it. It's a this is single Single download that you can get once you've downloaded and installed it You can activate it using your existing visual studio subscription Just by logging into the IDE It's not a problem at all if you don't have one of those visual studio Subscriptions you can if you're if you're eligible you can you can use visual studio from Mac community edition now from the Moving on we have a few different types of projects that we support in visual studio for Mac From the file new solution menu. You can actually access a variety of different Project templates you can create we have some of them listed here. You can create dotnet core apps ASP dotnet core projects You can do a cross-platform mobile development with Xamarin You can deploy connect to Azure work with Azure functions, and then actually something that I'm pretty excited about myself And I'm personally, you know, I really enjoy it visual studio for Mac is actually now the home of of Unity on the Mac and You can develop your unity apps unity games not just games, but apps too using visual studio for Mac So right now with visual studio for Mac you can we have support for C sharp Which is a language you can common. It's commonly used for creating cross-platform apps cross-platform applications And we actually support up through C sharp 7, which is the the latest versions and for those of you who are a One of those strongly type functional programming language persons. We're looking out for you guys, too I think Amy knows some folks that F sharp ends So you also have the ability in visual studio for Mac to write and debug in F sharp Something that I'd also like to talk about is some of the web the web bits We also have added a support for Razer for JavaScript TypeScript You can do HTML CSS We give you access to syntax highlighting to IntelliSense if you're one of those web developers and writing for the web And speaking of IntelliSense, you'll be happy to know that IntelliSense is actually well IntelliSense along with all of our analyzers code fixes Refactoring that visual studio from Mac and give you it's it's all powered by Roslin Which is the the same engine that visual studio on on Windows users So if you are accustomed to those features on Windows, you'll see those transfer over to the Mac as well We also know it's very important to test and Some of us a little bit better at testing than others if you're a little bit more responsible then Feel a little bit more responsible than I am. You'll be happy to know that you can You can use a few different kinds of tests Templates are built into VS for Mac. You can do MS test and unit X unit tests All in visual studio from Mac which will help you to you know maintain your code health And show code coverage all that sort of good stuff if you again if you're a responsible person The last thing I wanted to talk about for now, I know I don't have it listed here But I did want to actually I do have it listed here. Sorry But the last thing I want to talk about I'm going to talk about later again is version control So we're going to talk about get subversion later on as well as team foundation version control, so we'll talk about those later and You know, we have a you know visual studio for Mac is a nice ID. There's a lot of features in it And I think Amy might have some tips for us about the ID So do you want to show us show some of the things that you know about the ID? Yeah, absolutely I'd love to show you guys on a tour of the ID So first off there's a couple of different types of settings that you want to be aware of whenever you're personalizing the The ID these are the ID preferences These are used to make the ID function in the way that you wanted to Things like themes code folding. These are all ID preferences and you can find them from the preferences menu Which I'll be showing you in just a second We've also got project options which affect how your app is built. So things like Build configurations compiler options. They're all included there And you can get to the project options either by right-clicking on the project name in the solution pad or just by double-clicking on it And they'll bring it up And then policies which relate to your code styling and format And you can adjust these again through their preferences dialogue So what I'm going to do now is Give you a little demo so we can run through and I can show you some of the interesting things in visual studio for Mac right Thanks, Amy So, you know as we were saying everyone has their own personal preferences over how they want the IDE to look and feel and act You know if we Like how many times have you heard people argue over tabs or spaces, right? So I want to show you some ID preferences that you can use to get visual studio for Mac working just the way you want it And then I'll also give you a quick tour of the IDE itself so This is the welcome page. So whenever you open up visual studio for Mac for the first Eighth tenth a hundredth time. This is the first thing that you're going to see You could open a new project from here open an existing project. You can see all your recent projects But before we get into that I wanted to show you how to customize the IDE So to access the preferences that's just through the visual studio menu item right here And there's a ton of things that you can access through here We have a lot of people asking for Dark theme and we introduced that Probably a year ago Our designers were really put to work with this They designed every single little icon for dark thing just so that it looks like as amazing on dark theme as it does On light theme. I'm so you can just you can just change that in here. Yeah, Amy and I think are both really really Strong supporters of light theme. Yeah, I'm one of those people who use light theme for everything But I will say that as far as dark themes go, you know, it's not bad I know ours is amazing. A lot of people really like the dark theme So, you know to each their own, but I guess I guess we're a little bit on the same side there, right? Okay, so Next thing that's super important is key findings So with the key bindings in visual studio for Mac, you can actually set that this game So if you're coming from another idea, whether it be visual studio for Mac on Windows Xcode you can just choose something that matches, you know, what you're familiar with I'm just gonna keep it with the the standard one for now But what I am gonna do is show you how to add a key finding So we just added this cool report a problem tool a little while ago and I love filing bugs I Fallen bugs is my favorite We work in the same office and I think every morning Amy kicks the door down and she says how many bugs am I gonna find today? I want to be easier for myself to make, you know to file bugs So to do that, I'm gonna add You keep binding for the report a problem feature get easy. Yeah, so Let me see. I'm just gonna set like So I'm just gonna select it here. I searched for it. I'm just going to set the binding command D Doesn't look like that's taken Cool If it was taken what happens? It would just prop it would come up and tell me that there's conflict Oh, cool. I have to choose something else nice. Yeah, no, it will complain I'm just going to add that And there we go See I can show you come on D. There we go. Easy peasy. That's awesome. Didn't have to use my eyes. That's awesome Look ma no hands Okay So that's the environment. I'm like the text editor section in Preferences is probably one of my favorite. There's tons of stuff that you can do in here In the general section you can enable code folding. I find that really handy Especially whenever I'm looking through like huge code files just to try and navigate a little bit easier Another one markers and rulers So I Don't know about anybody else in here But I If I had a dollar for every time I didn't have a matching brace and I you know I ran my app and the compiler started yelling at me and I was about to start crying and then I realized that I had just you know Not included a brace I'd have like at least 10 bucks But so now I once I find this feature turned it on and now I always like to just double-check make sure that You know, I've got my match of braces there I also like to just double-check and So I can see my current line just so I know where I am in the file And I also like to make sure highlighted dead fire references turned on one thing That's really handy there is if the reference is assigned it will actually be highlighted in red And if it's referenced it will be in blue So it's a handy tip there Again Coming back to braces Once I realized that I could just insert a matching brace. That was really handy for me Because then the compiler doesn't try to make quite as much and I'm much happier And you can also add, you know smart semicolon placement here, too If that's your thing in case you forget those semicolons. Yep And Another cool feature is color theme. So while you can change the The theme of the idea in general you can also change the theme Of the editor So we have a variety of different things here, but we also do support Visual Studio themes and text me of themes. You can just add those And apply it and it will it will work straight away Yeah So as I mentioned so policies are what we use to describe the code style in and formatting So I just want to show you that really quickly as well So Yeah, so in the source code section under code formatting I'm just gonna look at the C sharp code source code for now But you can do this for you know anything else f sharp xml. Whatever it is you're using you can set Your your preferred policy or whatever policy it is that using mono visual studio If you want to edit that as well, you can just go to the C sharp format tab just hit edit and Let's see I'm gonna insert space Yeah And it'll give you a little preview of exactly what's going on as well. So you can just customize that policy kind of as you want And yeah, so that's setting your policies So you can also use this preferences menu to set the new good source locations version control message style and various other things I Do highly encourage Anybody just to check out if you haven't you know browse through the preferences menu before just check it out and go and see all The features in there, and I'm sure you'll find You know something that you didn't know was in there. It'll be quite a nice treat So if I'm working with you on some shared code and we have some different opinions on You know how we want to work there. Yeah, what do we do there? Okay? So that's a great question. So we now I have support as well for editor config files Which means that you know you can have your spaces and I can have my tabs and You know whenever we're printing the file and we're using it all together with the team Then Miguel is happy and that's yeah, that's how matters at the end of the day Yeah, so Now that you've got your ID working the way you want it. Let me give you a lay of the land and the ID itself so I'm just going to Open up my super cool app, which is just an iOS Single view app straight from the template And you see whenever we open this up. We have what's called a workspace here Above the workspace is your toolbar. So you have your round debug buttons. You've got your project configurations here You've also got your notification bar So whenever, you know, you're uploading to Azure whenever your project's building you can see exactly what's going on then And you've got your search over here can also very easily access the search Through the command full stop option And that will just come up there so as I was saying we've also got We usually use what's called works pieces and the workspace consists of the document area And the document area would be like the code editor as we have here if you're using a designer file It you know, it'd be the designer surface for an iOS storyboard or something and it's surrounded by Complementary pads.  So you've got code debug design test so that can very easily jump between the different different layouts It is important to It's important to note that by default visual studio for Mac will open any new solution That you have in a new workspace and actually close the current workspace But however, you can open more than one solution in a single workspace by going to file and open And just select the you know, the solution file that you want go to options and uncheck this close current workspace and Then hit open and it will open in the same workspace Now if you're using a solution or if you want to open a solution that you've recently used You can actually go to file recent solutions hold down the control key and Just select it and again, it'll just open in the in the workspace and see workspace So say I want to open So I want to open a new file here and this is from a different solution altogether I can actually play around with My documents here and I can have them side by side so I can just pull it pull the tab out Move it to the side and there we have it side by side. It's pretty cool If you want if you're using more than one monitor as well You can actually pull it right out of the IDE and have as a separate window all together. It's pretty pretty nice Finally one thing that I do want to mention is that on a Mac all apps are single instance And what that means is that once it's kind of like already open here if you click on it again in the dock That It will just open the same instance that you're in if you Want to open a new instance you can just do that in the command line So just with open dash and Let's see applications And that'll just open a new instance for you And this was life-changing when I figured this out a couple of years ago when I when I started using Macs Absolutely life-changing it's pretty cool pretty cool All right, all right, let's get this back up All right So thank you very much for that in me sure thanks for that run through I would like to talk a little bit now about ASP Dotnet call in visual studio for Mac. So we can hit the next slide there Awesome so ASP dotnet call allows you to do just do a few things you can develop and build some awesome cloud-based Internet connected cross-platform applications and you can you can you know have the ability to create web apps You can create services back ends You know something if you you really want to you can even do something like Connecting your coffee pot to the internet using IOT and at the moment Visual studio from Mac supports dotnet core 2.1, which is again the latest version of the dotnet core APS SDK and you'll be able to with this create web apps using Razer pages or MVC in addition to ASP dotnet web API projects With this also comes IntelliSense formatting and all those other features that you're used to for various files like razor files temp type script JavaScript CSS HTML files and Something that's really cool. You can also hook up with docker and throw your ASP debt dotnet core Pages or projects into containers One thing that I do want to say as well as that in inside of visual studio from Mac You can actually configure the location of your dotnet core SDK in case you had a previous install or you want multiple installs of dotnet core So you can go into the preferences page, which Amy showed us earlier and and change the location there and Then I did want to get us up and running with a little bit of a demo Just to see a little bit of what we can do with ASP dotnet core so I'm gonna get the get the idea up and running and Fire away, so I'm gonna show you Once we we clean this out, all right So I'm gonna show you a a new the templates that we have for dotnet core So if you go into file File any solution We'll open this up. These are templates for dotnet core if we scroll down here You'll see Yeah, and you'll see that we've got a few options here. I'm going to select a dotnet core web app Now this is a razor template and the preferred way to create pages in HTML And I know that there's an MVC one below it and you might be asking well You know, when do I pick between razor and MVC? If you're looking to do just a you know an HTML website Raisa is going to be a choice if you're looking to do something that will also serve like as a web API You know go with MVC There's good news about this though, you know, you're not locked into one of them if you choose one over the other It's not you know the end of the world. You can actually add MVC you raise the pages even web API bits to all of your projects and shuffle things around so instead of going through and creating a app I'm going to Going to open one up that I conveniently just have here, you know, just randomly on the computer So As this looks up, I just wanted to show one thing really quick Amy's actually going to touch on this a little bit later and that's if you right-click on your project here Go over to publish. You can actually publish some of your functions or products too as your Dotnet call web app. Yeah, you can publish your dotnet. What dotnet call web app to show as well so I'll just show you quickly some Some code completion and tell us then so I'm going to go down to my ASP.net Web app I'm going to go down here and to my index page And I'm going to add a new property here Let's just add it. Let's just throw it here I'm actually going to use a little bit of a cheat code a little template here. So I'm going to type in prop hit tab and It's going to fill this out for me. I'm going to make a string Hit tab again. I'm going to call it totes prop because it's totally a property And then I'm going to go over to my my index CSHTML not my dot CS1 and you'll see if I Let's say at model Sorry There we go. I can do totes and it's it's there, you know, I can access that So I'm just going to get rid of that because I'm just being a little silly there But what I think is really important is showing you how to configure multiple builds in Visual Studio for Mac so if I select my entire solution and Hit options here You can go down to my run configurations and I'll add a new configuration I'd call it that totes all Because it's totally gonna run all of my my projects I'm gonna create that Double-click that and I'm gonna select all the projects All the projects in my solution hit okay and now I'm going to run it and There we go. So that is that is going so while that's going I will say a couple things Oh one thing here. It's Something that's really cool to know is that With the latest versions of ASP.net core when you create a project that actually has support for HTTPS built into it so you can easily convert over to a To a secure website if you'd like Oh, and yeah, thank you Amy. So I was actually really silly I created that So this is really good. This is a really good lesson If you don't select that build configuration, then it won't run everything. So we only run the function there. So I'm gonna Close that and let's start again So a good catch. Thank you, Amy So that'll take just a little bit there as it spins up. It's running that function. It's creating that Or getting that ASP.net core website ready So that will just pop up in a sec. We're going to go to this website here and There it is. All right. So what we're going to do here. This is an ASP.net core website It is here to Take these files from me. There's a dog.jpeg file here.  I'm gonna open this up And I'm gonna submit it and what what's happening here is This ASP.net core website is Taking this picture uploading. It's a blob storage and it's triggering a function to get the image analyzed So if we go back here We'll see up. There we go. It's coming through here So now this is coming back through cognitive services and it's saying okay This was a dog lying on a wood floor. There's definitely some floor and there's definitely some dog in it That's pretty accurate. I think So now that we've brought up functions a little bit here I would like to to hand over to Amy. So I'm just gonna close this up make everything nice and clean and And scooch over so so Amy can Work with you guys Awesome. Thanks, Tom. Yeah, thank you. Thanks for catching my mistake there. Of course anytime All right Cool. So yeah, so as Dom is saying I want to show you guys a little bit by azure functions So hopefully you have heard about azure functions because they're super cool But they're also pretty new technology. Just over a couple of years old They're a serverless event driven way to get a quick task Like up and running so think like Imager order processing or something that you just like want to run on a schedule And it does that with like the need for you to build the whole application infrastructure behind it In addition azure functions ties in with Existing azure services or third-party services such as twillow, which we just saw the advert earlier And there's a number it's really easy to get started as we have a number of different templates Available. So for example like blob trigger GitHub web hooks and allows you to get started really quickly With the common scenarios So azure functions in visual studio from mac So what what kind of support do we have here? Well, all of our templates They're supported for the the v2 azure functions run time. We also have dotnet core 2.0 plus support Uh, there's a ton of templates that are actually available through the new project dialogue So you can just go In like create a new project select the template And from there you can you can actually configure the template with your connection string and whatnot And you have it something that's up and running. You can actually just run it there locally We do now have local debugging And my favorite with our newest release We're super excited to announce that you can now publish your function to azure Which and I'll show you just show you this in a couple of minutes So it's it's pretty cool So visual studio from agni allows you to create azure functions from start finish It allows you to go from file new to publish it publishing it on azure and getting it up and running So yeah pretty cool pretty cool so Let me give you a little glimpse into The world of azure functions on visual studio for mac Awesome. So I'll just open this. I'm just going to work with this same app that dom had just introduced So this this super cool web app allows you to Upload a photo Up into blob storage This triggers the the function and runs it through cognitive services and is basically analyzed Um So like I was saying, oh, I kind of kind of want to run it to to show off my cat So the the dog is is uh, one of my close friends dogs, but the cat hair Is uh, it's amy's own cat And I dare say the cat is cuter than the dog. Yeah Yeah, like Um, there's no costume on this cat She doesn't need one Okay, so I'm going to submit that and go back to my function And it should just take a little A little bit I've done everything right I think it's working. It's running um Yeah, and so this is so this function itself is actually just running locally. Um, so this is just running on my machine. Um the You know, the only connection to to azure is just the to the blob storage and uh by two cognitive services Um, yep, it looks like a cat looking at the camera. Awesome. That's exactly what it is Nice.  So this, um, this function was created from the blob trigger function Um, it was created from the blob trigger function Uh template which you can find just through the new project dialogue And that's just located under cloud and general I just hit next And you can just select your initial template from here. Um We have some documentation as well online that describes these in a little bit more detail If you want to try and figure out which one is the right one for you So Call my function amy because yeah Um, not amy is cool function. No, okay No, this is just just showing the template. Um, and so this connection string setting is you would just get it from The the portal. Um, so you can just copy your connection string from there put it in here It will have it all set up and running for you. Um, as soon as you hit create Um, so, you know debugging locally is cool But, um, you know, what if I want to use this like in my app? Like what if I want to actually, um, do something with with this that's not just on my machine? Um, so what I want to do is, uh, publish this function to azure So I'm going to show that to you guys now Um, so to publish to azure, we're just going to right click on the function publish And publish to azure So whenever you publish to azure, um, it's going to take whatever you're signed in to visual studio from mac with Um, and and use that see if there's a sub an azure subscription Um, and kind of go through, um Go through and it will display all the azure app services that is or that is connected to any subscription that you've logged in with Um, so I do have a couple here, but I Want you know for the sake of demo, I just want to show you how to create a new app service. So we're just going to hit the new button here Um, I'm going to call it something, uh function Amy Don't know come Cool And this has to be globally unique as well So it will tell you if if this has been taken before it won't actually let you go ahead and create it If the name's already taken You want to sub select your subscription? And you'll want to, um, select your resource group So I want to make sure that I'm selecting the resource group that the storage account that my function is using And my.net core app is using um So I want to make sure that I've got the the resource group that has that storage account I'm going to create a custom service plan Obviously the the pricing region is is dependent on your personal circumstances So I'm going to try and go for a consumption I'm going to go for the east u.s And let me see net comp Plan function really good at naming stuff Um, okay next and we want to use the storage account that we want to create So If I hit create Should create my app service And publish everything to azure Here's where the magic happens Here's where I hope the internet doesn't feel on me And this takes Just a couple minutes sometimes. Yeah, it normally takes a couple of minutes to do I mean it depends if you're using existing Like app services or stuff if it's an existing app service. It doesn't need to create everything So, um, it it's a little bit shorter Um, obviously depending on your internet speed and everything as well Things can just take a little bit of time Um, but yeah Cool, it looks like sayed's in the channel answering all your questions. Thanks. Sayed Yeah, thank you Are there any other questions or anything while we're waiting for this? It must be because we're doing such a good job such explaining everything All right, so this is looking good it's publishing to azure Don't feel on me. No, I didn't do that Uh, so I think You know, maybe while we uh, we wait for the second here. Um, I'll just give you a preview Um, of what I'll just jump into next Um, I'd like to talk a little bit about version control I know that's pretty important to a lot of people And we do have some uh, some new support for For tfvc, so Um, I will definitely talk about that. Cool. Can't wait for it and uh, all right. Yeah, so, um You will be prompted for this right now Um, this is just making sure that whenever you are Uploading to the portal that the application settings of your function Um are using the the v2 runtime Um, so you just want to hit yes here Boom There we go. It all worked and it's a happy face, right? It's good whenever. Yeah. Yeah, it's a happy winky face um But yeah, so that is azure functions in visual studio for mac. Yeah, so let's pop back. Uh, yeah, there we are Hi us Hi everyone out there So, uh, let's uh, let's chat a little bit about version control Uh There's some version control options for you in visual studio for mac. Uh support for uh team Team foundation version control. There we go. I'm going to say tfvc from now on to avoid tongue twisters but But support for that is currently in preview in visual studio for mac. It's uh, it's actually available Via an extension so you can add it into You can add it into visual studio for mac via the extension manager and uh Via the gallery tab in the extension manager and you can access the extension manager from the extension menu item In that visual studio Menu bar item which amy pulled from the preferences open from Once you've installed that extension for tfvc make sure you restart visual studio for mac Just to make sure everything is Nice and smooth and then as that extensions in preview are actually We're actually updating that fairly regularly. So, uh, you know, keep it up to date by going back to that place That extension manager go into the updates tab and you know checking for updates on a periodic basis Yeah, and please try it out and file bugs. Oh, yeah. Yeah, we showed you how to file bugs, too We'll show you a little bit more of that later, too So With that extension installed you can connect to tfs you can connect to vsts Create you can connect to repositories there. You can create workspaces Navigate projects perform all the things that you know that you're used to doing with version control And now let's move over to git and subversion. Uh, those are both actually built into visual studio for mac the support there so The version control menu item and the the menu bar is going to be your best friend when you're working with these Um It's important to know that actually git is installed by default on your mac So macs come with git installed. It's not usually the the most recent version of git So you will probably want to go and update it. Um, you know, make sure you're on a recent version But you know that advice aside now that that's taken care of You know, you can you can hook up to git repositories. You can push you can pull You can do everything else that you can normally do with git Um And then similarly with subversion same similar story, uh, you can you know, check out update Check back in commit Something important though on the mac subversion is not pre-installed like it is So you're going to have to Install subversion and one of the really easy ways to do that on the mac is by installing the The xcode command line tools. So I definitely recommend doing that if you'd like to use subversion Uh, now you may be familiar with the ability that uh, that you have on windows in vs 2017 to uh, To clone git repos to vs 2017 from uh vsts We're actually working right now on enabling that for vs for mac So stay tuned for more information on that And then I think amy actually has a few few little bits of information that she wants to share with you Before we close up Yeah, so there's just another little bit of information that I um, I just want to wrap up with Um important things to know just to make sure that you're really getting the best out of the IDE um So that is making sure that your IDE is can is being kept up to date Or if you'd like to live on the wild side, um to check out our previews or even better our um our weekly bills So we have um three maybe four channels um in the in the updater dialogue um That is stable, which is you know, which it's your the releaseable content that that we want to be um That we're pretty happy with We have uh the beta channel, which is our preview So you can stay up there for all the like juicy goodness And the alpha channel is our weekly build, which is literally the latest and greatest content We also have dynamic channels Um, which you know, we will add them for specific purposes such as um Xcode 10. Yeah, so um Hope you iOS developers Yeah for um, if you were trying to keep your I open summer in iOS app up to date for iOS 12 We were sending Xcode 10 updates through the that dynamic channel It just meant it was much easier for you rather than having to go to the web and and download everything from there You'll also get notified Either through the toolbar or just by a pop-up whenever there are notifications So I highly recommend that you stay on top of that You know to update you just bring up the updater dialogue Select the channel that you want um And you can switch to that channel Dialogue install Everything you know how to do And like I was saying earlier, we'd have this new report a problem dialogue That came out this new feature. I think literally just the start of this week. Yeah, be right Um, so this is in the seven six four release of visual studio for mac From this dialogue, it makes it really easy for you to be able to Browse any followed issues that you have Search for any issues to do with visual studio for mac or to actually Report a new problem just from right within the IDE So it just makes it really easier easy for you to you know to give us that feedback Which you know, we we always really appreciate everybody that takes the time to um to feedback to us. Yeah, we we We absolutely love to get the feedback it helps us make a better product for you And the more details that you can give us in these issues that you're filing The better it allows us to you know To address them a little bit more quickly with a little less back and forth So if you're going to be filing issues and you want to see if you can beat Amy in the filing bugs department Feel free and thank you Yeah So thank you guys so much for taking the time to listen to us. We really appreciate it Um, if you want some more information, um, I can always go to aka.ms and forward slash visual studio for mac if you have never um Used visual studio for mac before now. You're interested. You can download it from that page. Um, if you want to get up to scratch on visual studio, we've got the the awesome awesome content written By our docs team aka.ms forward slash vs mac hyphen docs Um, so it's really good to keep up with all the content there And if you have questions That either we can't answer now or you just want to talk to us or you want to just listen to what we have to say You can follow us on twitter. Um, time you take it. Tom is sound dumb One of these days i'll i'll update that but not right now But thank you for listening to us. Yeah, it was thank you so much. We really appreciate it. Yeah, thanks everyone


What's going on guys and gals? Brad here for late in sports cards. We're ripping 2021-22 Prisman NT basketball two box number six random teams. Here is the list one more time. You can find that on the website at any time and thank you for joining. Nice you got a laptop Brad? Definitely you can add me on steam and stuff man. Fair use has to be transformative I'm pretty sure. Namious Kada got a hyper lamella ball widescreen and next Rocky Otto Miles McBride. I will be playing that Bradley. We can group up. I'll be playing that Wrath classics. Is that the new like expansion? Well it's uh they're re-releasing an older expansion. What are you talking about that? Aaron Wiggins. They're also releasing a new expansion around the same time. Silver Lonnie Walker. Hyper Malcolm Brogdon. Beats. What's that move? How's it going? Well that's a David Johnson red wave. It'll be topping. Red De'Aaron Fox. Yes I will be playing on a fresh server. 100% dude. That's the way to do it. Everybody back at level one so there's no death knights running around the first couple weeks. Got Jalen Green. Rockets. Silver Quentin Grimes. Purple Ice is Dennis Schroeder. Nice Grimes there and Damien Lillard. Yeah you're welcome Vaughn. I knew that needed to be a sound effect before I even started here. Jeremiah Robinson Earl. Red Wave. Laurie Markinen. Hyper Siankham. Yeah I wonder if they're gonna do any tweaks to uh the stats for death knights Bradley. Got Isaiah Livers. They were so broken dude. Dallin O'Banton. Silver Chuma Okiki. Widescreen. Donovan Mitchell. They had a skill when the when they first came out where if you were in like a 2v2 match or like a 1v1 match and you killed the death knight normally you would win. The other player's dead. They had a skill where it would bring them back as a ghoul and then if they killed you as the ghoul they would win.   Alperin Shangoon. It was it was horrible. Jalen Johnson. Orange Jeremy Grant. It's a 49. Guy's 17 left on the next break. Okay another Prismanty two boxer. Ayoto Sunmu. Jason Preston. Ola Dipo Silver. Roki Kaminga. I'm literally about to go into the gaming room and throw stuff around. I should. Good. Charles Bassie. You should go like. Scotty Lewis. Jalen Suggs. Rookie. And Ben Wallace. Red. All I did was wave at Caleb too. And then he's like talking smack. What's wrong with him? Jaden Springer. Caleb's a menace. I don't know what I did. Ayoto Sunmu. Silver. There you go. And a Jalen Brunson to 199. Yeah the Pulsars are very pretty. Very pretty. We pulled one of those Mojo. Prismatic. Yeah. Guy Keon Johnson. Redway. Reggie Lewis. Chris Paul. I'm literally going to gaming and like mess something up. Why are they messing with Sam? I don't know. I just don't even know what I did to that. Trey Murphy. That's Silver. Demian Lillard. Prismatic. James Wiseman. And Thunder. Jeremiah Robinson Earl. Rookie Bass Ayoto. Bass on the back. I haven't played in so long I had to send a pic of my ID to Blizzard to get my authentic ID removed. That's funny dude. That's what I'm saying Mikey. Like you I'm used to you. It's like whatever at this point but got lane. Matt's about to come in and be like. Matt comes in and says something about my time playing. Sam you have to hurry up. Sorry. You're good Brad. Chris Daps for Zingus 75. Rich said Sam you need to work on learning group breaks as much as you can this week and next week. Yeah no I'm shadowing pretty much all of this week and next week. One of one. Demana Sabonis Pacers. That is a from last year's flawless. Silver Larry Bird. Art Silver. Jersey Larry Bird to 99. Celtics. Have I seen anything good since? Everything everywhere all at once was incredible. Got LeBron James Jersey to 99. Yeah we should have kept Kenzie back from the national. That would have fixed a lot. Yeah. Got Jersey Otto to 99. Carous Le Vert. Cavs. That's so pretty. That's nasty. Pink. RPA. Bones Highland to 25. Look at that. Wow. I like the pink. The pink is beautiful this year. They did a good job. Yeah. Jersey Spurs to 99. Lonnie Walker. Got Jersey Bulls to 99. Joe Kim Noah. Got T-Wolds. Otto Gold. 10 of 10. Wally Zerbia. Nice. Wally. There you go. And Rockets. Rocky Otto. 10 of 25. Josh Christopher. Low numbered Christopher Otto. And there you go guys. One second we'll recap. Yes. Next break. 17 to go guys. If we could get that filled up that would be fantastic. Antiprism Two Boxer. We just have two more for the beginning of the night I mean. Got Joe Kim Noah. Lonnie Walker. LeBron. Got Larry Bird. Josh Christopher. Wally Zerbiak. Carous Le Vert. Jeremiah Robinson Earl. Miles McBride. And RPA Bones Highland. Beautiful. And there you go guys. That'll do it. Coming up next like I said is another two boxer antiprism.


Thank you Impact in exchange for Media Group for this honour. 50 most influential women list 2018. Wow, it's been a fabulous year. I remember the day I joined Parli Agro, almost as if it was yesterday. Frutti and I are coincidentally as old as each other. And we've grown together as best friends. Growing Frutti has been one of the most amazing yet the most challenging experiences ever. The last four years have perhaps been the biggest game-changing years for us when we decided to rebuild the brand. I remember when we first introduced the new packaging by Pentagram. There were so many people who wrote in and commented wondering whether we had lost it. Often this is the biggest challenge with older brands. Breaking out of the mould that gets created just by time. It was probably one of the most frightening decisions and honestly the fact that someone had developed something so good but at the same time so frightening made us all the more excited to take that risk and really go out there to disrupt the conventional, the same old, often don't really get you anywhere. Ever since Frutti grew in rank from number three to becoming number two nationally it further achieved the number one position in many markets and today it is growing rapidly far ahead of the category at a double digit growth rate for the last three years. There are so many people who have been a part of this journey with Frutti but I definitely want to recognize the contribution of Sagmeister and Walsh, a creative team from New York, for really opening up this whole new world of design, advertising and collaboration for us. The willingness to break boundaries and explore with curiosity is critical to all leadership. I'd like to believe that it is that that has brought our brands and me to where we are today and I encourage you all to do more of what scares you, do more of what pushes the limit and do more of what isn't being done. Good luck and congratulations to everyone on the list this year and thank you again from Frutti and me.