er long it took you to get to 2 billion the first time if you're lucky you now have that much time to resolve this issue and fix whatever needs to be fixed or change the data type which is probably what you're gonna need to do. I will say be careful break and just like an emergency break if your problem is you're going too fast like the emergency break helps with that if your problem but when you do stop like that like it's really hard to control a car when you like just pull the emergency break like 20 miles an hour. Don't ask me how I know that. So you will be spinning a little bit out of control yes sir say again. So you it's hard. You just want the max value integer that's less than zero and that will give you the last one you did. Yeah don't do that right. So there are other things as well that could happen if you're playing interesting tricks if you're assuming that the order of integers increasing always is gonna match you know like here's the latest one and we always know this is the latest one because it's the highest number in the system that this is gonna break that. So this could still break things in your application for sure so but the hope is that it like if you're inserting data you at least buy yourself some time to go fix this in a more proper way. And so let's talk about some of the more proper ways there's actually a few other cases this will break too and I'll get to those. So we'll go through these relatively quick and there's some pseudo coding here don't don't worry too much about it I'll kind of walk you through it but imagine if we have a table right this table till the M there's an integer and a jth on B we ported this for Mongo at one point and so we have two columns and we run out of space on the integer well the first way to go at fixing this we can add another column future y to replace our y column that'll be a big int so now you see a table there future y with a big int and then you can create a view and one of the nice things about Pestgres you have transactional Ddl so you can do some really neat tricks you alter the old M table and you do some transactions so you alter the old M table rename it to something like other M and then you make a view that looks like the previous M table where you mash the big int and then call them together and just return that back as the y table so the view looks like the old one but under the hood and you see the highlighted part so we have a view now public M and then there's that coalesce of the two fields from the other round table so I'm just gonna pull those two pieces together now, like I said, it's pseudocode and I don't want you trying to use it in production so I don't give you the full deal but you may have to add triggers for insert and update or delete depending on exactly what you're doing and I would say may which means you probably will have to do that you may not be all of those like if it's an insert only table obviously you don't need triggers for updating and delete but you'll probably have to do an insert where you're mapping data around but this will buy you time to allow you to start backfilling all of the data that was in the first column into that new column that we built and that's a slightly painful situation but you backfill all that data so you do an update of every row in the table and that's only two billion updates so hopefully it doesn't take too long but at least you're taking new data in while that's going on and then when you get it done with that again we make use of that transactional DDL we can drop the view that we had we alter the table other M and now we rename the future Y column to Y and commit all that and now you look at the M table and you've changed it from Y as an integer to Y as a big integer watch that sequence though because if you haven't addressed your sequence problem that could bite you so just be aware of that and at that point if you had done like the negative trip if you find that early enough you can do that without really having to mess with anything if you've flipped it negative and now you get into this like this will still work but you need to make sure you flip it back to something that's over two billion so there are definitely corner tapes to watch out for if you're doing that kind of method but it's certainly doable again have done that in production more times than I really want to admit and we've had to use that quite a bit so yay you can also do that at the table level so that was at the column level just add a new column onto the same table you may have cases where you need to do it some other way here we're doing again a new public M where we have a big inch which is the primary key but here we have Y as an integer field so maybe that's like a foreign key or something go into some other table we create a table future M and this one we're gonna change Y from integer to big inch because maybe the foreign key field now is getting new values in that are not they're too big for it and we do the same kind of trick here we're gonna alter the table rename that to original M again we create a new view they coalesce those columns together and we present that to the user so now when they look at the view they get public M and now it looks like there are too big in columns as a view of course season with triggers and update insert manage that stuff as needed it definitely depends here we probably need one because we have two tables in mind here right so we've got two tables we're dealing with so we need triggers on M to handle the inserts and the updates going over to the other table and adding like where X equals one so like if you insert on the new column we wanna populate both fields on the other one and then actually you may wanna add triggers on the other one to do a backpopulation into the first table so in any case once you backfill right you update your two billion rows now all the columns have all the data and we're gonna do the same transactional DDL trick again we drop the view we rename the table back and we commit it and now you've got you know X and Y as big in again watch out for sequence values I would say you can play the same trick right as views with like tables using logical replication or foreign data wrappers it is more complex and definitely wanna say I glossed over a lot of things in those examples I just kinda wanna give you like the basic outline of like you can make new columns and new data types and those could be anything right if you were using like a text field and realize like actually we're just storing UUID values so maybe wanna turn that into UUIDs right you could use the same basic method to do that like make a new column put some triggers in place to do the data changes and have that happen but I will say the more complex your schema the more likely this is to be a real pain because if you have a lot of like dependent views or you have triggers on tables or you know just any of that constraints and whatnot you have to account for all that stuff you know in that like DDL transaction piece so that can be more complicated if you have like you know 20 dependent views on the table in question you've gotta actually go and like reconfigure all those views to look at the new table so that takes more time and effort the upside is that time and effort you can put in you know it doesn't it's not like while the system is live in production necessarily like you get those inserts flowing again get the system up then all of that is like stuff you can test out on a test system right and make sure the code's gonna work when you go and deploy it so I believe it or not I do sometimes test stuff not directly in production so there are definitely other problems to consider I don't wanna make it seem like I've solved all the problems so the first thing is you had to think about your app code so as noted already some people here do really funny things in their application that they shouldn't be doing and that's with my full on DBA hat because I love telling developers like you shouldn't do that and if I am the developer I usually say to the DBA like well no your database should just work better but in this case we out of the DBAs are out and over the app developers here so like the app developers are the wrong ones right so they're doing it wrong so if your app was based on you know original ORM schema so if you've used something like rails or grails or whatever Django or any of those like you usually have like a section where you're supposed to map out what your columns are on the table and what the data types are and all that you have to make sure you go back and update those models within either like the Django or the rails code right not just within the database you need to do it in production out of band of what you're doing inside your app structure but then also make sure you go and update the app another really fun thing that you might run into is you know what type what number types does my language support and are those the same as what my database supports so like let's say you're using a language where it uses unsigned ints instead of ints and the simple way to think about it is if an integer is like negative 2.1 billion to a positive 2.1 billion an unsigned integer is 0 to 4.2 billion right so it's all in the positive space so when you do that emergency break I'm gonna flip it to negative and that'll solve all my problems well if your programming language doesn't know how to deal with a negative number because it thinks it's an unsigned int that's not actually gonna solve your problem you're in real trouble now and I apologize but you know Postgres job market's pretty hot you'll be alright just saying also I would say you know again modern systems these days complex distributed systems they're like ogres which is to say they have many layers right as we all recall let's say you're getting values from like an API or you're feeding values into an API from an integer field and you publish some public spec that says this API returns integer values and now you switch it to big inch values and you fix all that in your database and so now your app starts passing out you know larger than 2.1 billion values out to the public and now their apps start breaking if you have a compiled app where it's compiled in to believe it's gonna be an integer and now you're giving it values that aren't that way you have to like recompile the app if you'd like to put those two ideas together imagine you have a mobile app that has been told it's going to get integer values and now you need to recompile the mobile app and the good thing about that is when you recompile a mobile app with an integer overflow fix there's actually a little flag you can push when you push it to like Google or Apple that tells them I have an integer overflow problem please put this out immediately to all people who are downloading our app and have them update it and so it'll get through the approval process like instantaneously basically like they just fast fast so I'm making all that up yeah so if you have that kind of situation with a distributed application or you've sent out code to people like you have to figure out like how do we get them the new code so they can actually get the new values from the API that we're doing so and if you have multiple apps hitting that database or every app has to go and make sure that it's still going to work that leads me to another little piece of code idea that I've run into that I've had to use here's where I create a new primary key selecting function right so if you think about the normal definition where you have ID and then it's like NextVal off of the sequence NextVal is just a function and in Postgres you can sub in pretty much any other function as long as it does the right stuff meaning gives you the data you know data that fits in the data type you can put another function in there and change it from NextVal so we've generated different versions of this where we're gonna generate a primary key ID and the way that I've set this one up you know we're gonna randomly send values through the system and in this case you know we will pick from which sequence we wanna actually pull the value from so we have our regular like PK ID sequence maybe that's the default one that was on the table right that's the one that ran you out of space and now we have an experimental primary key ID sequence and in that one we can set the sequence value to negative we can put it to like you know four billion to see if there's an unsigned in problem whatever we need to do we can go to nine billion and make sure that like that's gonna work so you can play around with those values and then the idea is you just feed those values through your system right so like one percent of your traffic is gonna get these and also because this is in a function you can change the function definition without having to do DDL on the table so you can also make those experiences really easy to turn on and off and you can decide whatever is the right percentage so we usually would go with like one percent or less you know maybe you want 10% or whatever and you can put more logic into that if you want to right you could say like maybe if we see this as an insert on an employee versus a customer or something like let's send the fake values through but it allows you to seed those values through your system because honestly like I've found most people don't really know if you tell them like hey we need to switch this positive number to a negative number is that gonna break your mobile app? Like the mobile app people don't know like they're just not gonna know I'm sorry so the only way to really know for sure and it's not even their fault right like there's seven different API layers away from the database so like they think it'll work but in any case so you can see that through make sure it gets all the way through and see what interesting effects you get if you have some weird order by because you're a bad person and that's how you code you can see the effects of that weird order by like it happens so I think that's mostly it I do have some additional readings you can look at and so we talk about some of these I gotta say where some of these ideas were generated from but it turns out totally coincidentally DoorDash has a couple of blog posts that they've put up and I include these as slides I'll put the slides online or I think if you Google advance into big int conversions you probably can find these slides I think I already have them on my slide share account but there's a couple of different ones where they talk about these same techniques of using triggers and multiple views and that kind of thing in order to reshape their data and clean up situations in the heat of like an outage probably the way you're gonna wanna do it is you're kinda focused on just solving your problem but when you do that one where it's like a new table and that kind of method you can actually go fix up a lot of problems in there cause you can add not mill clauses or put in new defaults or whatever that you needed before or something like any of those anything you wanna clean up you can do other fields that you aren't the integer problem but you just wanna change some other data types anything like that you can do so there's a few sort of public posts from a couple of companies here that have done this kind of thing and actually talked about it publicly so you can get even more detail on that and those really go into more of the code piece of it so other than that I think that is all for now any questions any application of ours wanna heckle me some more okay good all right well then I guess we're good thank you everybody Hello Tess check, check, check testing check one, check, check Hey did y'all know that Enterprise DB is a sponsor of our PostgreSQL track here at Southern Cal Linux Expo EDB helps organizations get the most out of PostgreSQL nearly 1,500 customers worldwide have chosen EDB software services and support our offices worldwide enable us to deploy our global expertise locally and support our customers more efficiently Hi everybody this is the PostgreSQL ask me anything section we've got a distinguished panel of PostgreSQL experts here let's let them introduce themselves starting from here and going that way Hello, I guess this is on y'all hearing I'm Robert Treat I've done PostgreSQL a long time and nobody will hire me to do it anymore I guess so I come to conferences and just talk about it I'm Stephen Frost I'm one of the committers major contributors of PostgreSQL and I've been working on it for a long time Chris Momjin working on PostgreSQL 96 Hi, my name is Jaime Casanova I'm from Ecuador and the CEO of a Latin-based PostgreSQL support company specializes in Spanish support I'm Mark Wong I live in Portland I think I've been involved since 2003 doing random stuff Cool So this is an AMA Do y'all have any burning PostgreSQL questions? I have some that I can use to in case things slow down a little bit but let's start with y'all who's got a question for the PostgreSQL folks I'll play Phil Donahue here Yeah, yeah Somebody get a patch accepted into the PostgreSQL base Great question Oh, sure I have two now There you go You do have two That'd be interesting So, I mean, the common way is you post the patch to the Hacker's mailing list and you add it to what is called our CommitFest application This is commitfest.postgreSQL.org There's a number of Wiki articles and things like that on wiki.postgreSQL.org that if you search on that So one of them that seems reasonable is if you search for developer on the wiki site you can come find us so you want to be a PostgreSQL developer thing and that's got a lot of different resources on it But the main way of getting a patch into PostgreSQL is putting it up on the Hacker's mailing list and then registering into CommitFest and then kind of following along as people respond and make comments and shred it for the first couple of rounds is usually how it goes I don't know if anybody else wanted to serve? Yeah, one of the common mistakes I see is people sort of just showing up with a patch and then trying to go forward with it If you look at the to-do list there's sort of a flow we like to follow because what we find is if somebody shows up with a patch just out of the blue we often have to go backward with that patch to say okay, I understand you have a patch but like, do we really want this patch? What is this patch trying to solve? Is this the best way to solve that patch? Is there a history of how we've dealt with this missing issue before that makes a patch maybe not the right direction or we can give you guidance before you actually start coding something then we have to talk about the implementation how would we go at it? What would the user API be? And once we have clarity on that then the patch is much more likely to be accepted. So a lot of people who are new show up with a patch, could be small, could be big and there's no reason, there's no explanation of why I care about this change what it does, why you chose that user API and then you end up having to sort of undo a lot of stuff to kind of get to the core of the problem so starting at what's at the top of the to do list in terms of desirability and then implementation and the user API and then going to the patch is much more likely. So I'm saying talk first then patch is usually the better approach. Yeah, I mean I certainly agree with that I think the only thing I was trying to lay out was kind of the mechanics of it if you have a typo patch, post it to the list and register it in the commit fest, right? If you're thinking about developing some new capability or new feature definitely make sense to float it on the list first and have a conversation with the hackers about it just to ideally avoid any wasted effort, right? That's the idea there. I would say what I would recommend is why don't we have, they just ask the question we'll repeat it, that way we're not sending the mic back and forth.  So the question is about common security issues that you might end up dealing with from maybe a default Postgres configuration. I'd say from my part at least running the application as super user is like the number one pitfall that people just automatically do all the time. You really want to lock down your users and what their permissions have and what permissions they have right from the get go as part of your development of your schema and the application and all of that. The other big one that used to be a gotcha that we actually made progress on is create access on the public schema is something that we're actually changing which I think is a big thing. So revoking the create right from the public schema from public is a common thing. Yeah, in 15 we changed that so that that won't be included going forward. I mean, there's probably other, yeah, the HBA defaults. Well, on most of the distributions it's okay but you definitely don't want to use the trust method for authentication so that's a common gotcha if you're building from source. There's also a talk on this tomorrow, I'm told. So that's, come to that talk and ask the same question. One other quick thing, if you're into security, like really seriously, I'll pimp it. If you Google Postgres Stig, F-T-I-G, yeah, there is things for it. I think primarily developed by Crunchy Data and you can find that and kind of align that to your organizational needs. Yeah, there's both a Stig and a CIS benchmark. So the Stig is DOD, DISA and the CIS benchmark more or less the same thing, but for commercial. Yeah, go ahead. But definitely use, Graham, for your... By the way, there is this opinion that passwords cannot be similar one to the other and in progress implementing that is actually insecure because you need to know what the text of the password is for doing that. And the way Postgres manages passwords, it doesn't know the real text of the string. So please don't try to implement that, you are not doing security security. I love certificate authentication, so just saying. Yeah, if you're really smart, Kerberos, if you're not certificate. So there's a lot of, the question is there's a lot of talk about distributed databases, particularly Cockroach and Ugubite too. What's the Postgres project's take on the implementation of distributed databases for the community? I was just trying to remind you to repeat the question, but I can't handle it with it, okay. I mean, I don't know that I would necessarily speak for the entire project, I'm sure each one of us has their own general opinions about that question. There's trade-offs with it, right, just like there are with a lot of other things. When you start going into a distributed database environment, you're dealing with a lot of additional latency between the nodes and if you end up having to do the kind of, provide the kind of guarantees that you get with SQL and RDBMS and ACID compliance and all of that, you end up having to do things like a lot of lock management that can be really painful between different nodes, things like that. I think there's a lot of trade-offs there. I don't necessarily know that they're bad or good, but it's a different type of design of a system. In terms of what Postgres is actively doing, certainly we're doing a lot of improvements with Postgres FTWs. We're doing a lot of improvements around things like partitioning, so you can start building your own kind of federated environment using the various FTWs that are available, which are, is a really very capable way of building out that kind of horizontal scalability that a lot of people are asking for when they look at a distributed database environment. That's really what they're going for. It's not that they want it to be distributed, it's that they're looking at that from a scalability thing, but of course, even with FTWs and things like that, you're gonna have to deal with the complications that come with that, but I think, I would say the project continues to move in a direction that allows us to leverage multiple systems concurrently, as long as you're willing to accept the trade-offs that come along with that. Yeah, I had a customer ask me this last week. They said basically, where do you see Postgres can't go or has trouble going? And certainly embedded, I think the idea of us going to an embedded environment like SQL Lite would probably contort Postgres so much that it would not be a good move because we're more of a generic database. I think the distributed is kind of on the other direction, that to go in that direction with Postgres at this point would kind of contort Postgres in a way that would make it harder to use and more complicated to use maybe as a generic database. I think as we grow, again, as you were saying, as we go to the foreign data wrappers, as we maybe have an ability to do distributed locks better, which would probably come with sharding, then I can start to see Postgres kind of moving organically in that direction as we have, sort of sharding is going to be foreign data wrappers and parallelism and partition push down, right? So would distributed eventually look like that with something like logic replication? EDB has a distributed Postgres, which is sort of taking Postgres and morphing it in that direction. I think it's really complicated when I see it now and I'm not sure we would go that direction, but I don't know, the question, I look at Ugubite or Cockroach and I say, okay, they took a dramatic step and went right to distributed and kind of left the non-distributed behind, right? I don't see us doing that. I think the real question is, would we be able to grow organically into that space? And I don't know the answer. It'd be interesting to find out. I didn't think we'd grow into sharding organically and I think we will. So whether we're gonna grow organically in distributed or not is a great question. No, but that's a different sheet. That was my thought, but it wasn't. It's not really different sheet. It's not a different sheet, no. I think one of the things that's interesting that's being worked on in that same space is client-side encryption that Peter Eisenhower has been spending a good bit of work on. And I think that that's a great direction, I think, for us to be going in as one option, right? I don't think it's the only option. I think TDE is another way that we wanna go, but I would say there are some other databases up there that provide those kind of primitives for doing client-side encryption, but it's not as, I wouldn't consider it as prevalent, right? As the more typical TDE that you see with the other products that are out there. Yet, there's certainly advantages to doing the encryption on the client-side if you're able to, there's disadvantages to it's trade-offs, but I think that's an interesting feature that's currently being worked on. So table, yeah, so Bruce mentioned table access methods. So I think it'll be very interesting once we get to the point of having an alternative table access method in core besides, the traditional one that we have that's called HEAP. So this is, you're talking about things like ZHEAP or Citus columnar store. I think columnar in general will be interesting, but again, it's not really something that one would argue is differentiated, right? It's not, I think JSON B would be a good example of something that we really kind of took and ran with early on that was something that wasn't as prevalent among the other systems. Some of the work that's been going into actually implementing some of the features from the SQL standard, I think period is one of them that has gotten some work that, it turns out that there are other database systems. It's funny because the standard will run off and write things sometimes and nobody implements it. So there are some things in that area that I think we may end up getting before other database systems and that might be something that's differentiating us. Even though the feature already exists in the standard, some of these features have been written in the standard like match expressions and things like that maybe one other database did, but most of them did not. So those could be interesting things that I know that there's been interest in. I haven't seen a lot of patches for that though, so I don't know, it's all very early on in terms of the thought around those kind of things. I actually feel like I don't keep up with some of the new developments that's as much, but how's that temporal data type looking? So the question is, has FTW performance improved since nine? Oh, is FTW performing well enough today to look into? So are you doing postgres or postgres? Yeah, so that's the big thing related to sharding actually. The Japanese and a bunch of people have all been pushing things like wear clothes pushed down, order by pushed down, joined pushed down, parallelism of the shards, but parallelism along foreign data wrappers in a partition, pushed down of aggregates.  And that was very naive. Because we were pushing toward sharding, obviously that every year has gotten, I have a, my website has a presentation about sharding and there's one slide that basically says, okay, nine, six we did this, 10 we did this, 11 we did this, and 12 we did this, and then 13 we did that, and 14 we did that. So there's been dramatic changes every year in that, yeah. I would say read-only sharding is certainly something that can be tested to see what you get numbers on. I haven't seen a lot of people excited about it, unfortunately, but I think it's ready. I think read-write sharding, we still need a better distributed lock manager and a distributed snapshot manager. Now we have solutions for that, but we need to get to square one and we haven't really seen enough people wanting to test it, yeah. One of the things I think we may end up, the distinguishing question that we got, one of the things I think it has been distinguishing Postgres for good or for bad is the cloud deployments of Postgres. I mean, it's Google, it's Amazon, it's Alibaba, it's Microsoft, right? Everybody's got their own custom cloud deployment, and I think that the concept of some of the storage layer of Postgres moving into the literal cloud infrastructure customization is a distinguishing feature of Postgres because it's open source. Not necessarily done by the community, but it is a distinguishing feature of currently deployed cloud versions of Postgres, and I think that could have dramatically affected. In fact, Maboo talked about using, you've talked about using specialized hardware and stuff, so there's a lot of this lower level storage change that I think is gonna be distinguishing in the coming years for Postgres. I think that's pretty clear because nobody else is doing it but us, and the numbers are crazy good, right? So the table access method might allow people to make a version of a cloud specific or hardware specific version of Postgres that doesn't have to fork the code and plugs into the table access method. That's absolutely correct, yeah. So I guess it's getting back to the question we had earlier, table access method, and a cloud and a specialized hardware environment. Yeah, we're doing column and stuff like that, but I think this would be, in terms of performance, potentially orders of magnitude more important, I think. I mean, so the question is about Postgres in containers, and I like to share a little anecdote of, I was doing Postgres in v-servers, back when v-servers were a thing. I mean, I don't know how many people here remember that, but it was like a patch you had to patch the Linux kernel with, which was kind of the precursor to containers. So Postgres in containers is not actually something that's that new, and there are certainly trade-offs to doing it, right? Some people are not a big fan of it. I would argue that the issue with containers is less about the fact that it's a container, and a lot more about the fact that a lot of systems have been designed around the idea that containers, and often the storage underneath the containers are ephemeral, and they just go away, that's okay, right? Because we'll just re-download that or re-image it or whatever, and so you really have to be cognizant of the storage that you're using underneath the Postgres, which is true even in the non-container space, right? It's true anywhere. It's just that in the non-container space, it's a lot more typical to just have traditional storage where f-sync works, right? Whereas in some container storage systems, f-sync is quite intentionally not actually going to f-sync things, right? So that's where you really have to make sure that you're using the right storage modules underneath of Postgres and making sure that they actually do what Postgres needs them to do. So there's more to think about, I feel like, in when you're deploying Postgres in a container environment, and so I think that's a place where you just wanna make sure that you've thought through those issues or work somebody who does, there are some, there are other things around memory management that are also can be challenging in containers, which is arguably a Linux kernel issue, at least that's my consideration for it, and Linux kernel people have been given patches to try to make it better, and unfortunately they have yet to agree that that makes sense, so that's an issue, but that's something that we're also working on on the Postgres side to try to find a way to deal with that on the Postgres side to avoid runaway queries causing problems, basically, but in a reasonably managed environment where you don't have arbitrary queries coming in that end up sucking up tons of memory, that's not something that you have to stress about, you can work around it and address that risk that way. Of course, you have the same problem in a misconfigured Linux server if you don't go set over-commit memory, right? You're gonna have potentially the same problem of the UMKiller running around killing things, like it's not actually a new thing, it's just that in the container world you don't have quite as many tools there easily available to prevent that kind of thing from happening because over-commit memory, and we're talking about like Kubernetes or something, it doesn't, you can't set it, right? And you can't set it on a per-container basis, so that's where it becomes a bit more of a pain if you don't have the ability to control what the queries are that you're sending to the database. But, yeah. So, I, what?  Yeah, so in Leipzig there was a talk, or I'm not sure if it was a full talk, but someone was mentioning, there was a discussion about this kernel issue and one of the approaches that somebody else had done was to essentially override Malik, right, and handle that inside of Malik by making sure that it had a cap, right, which is basically the same kind of thing as what I'm talking about, and I actually, we're actually working on developing a patch for, which has been discussed on the hacker's mailing list also for tracking how much memory each backend is actually currently consumed and then having that in shared memory where you can then say, okay, well, once we get to a certain point, we're gonna be like, no, we're gonna start failing, user-oriented, or user-facing backend allocations, and that works just fine in Postgres, always has, right, in the event that we have a memory allocation that fails during a hash join or something, we'll just happily free up all the memory and fail the transaction and off you go and everything's fine, right, and so it's just a matter of getting something like that into core to address the issue that the kernel isn't doing that for us, unfortunately. And it's funny because the kernel patch is like only a few lines to make it work, which is, it's odd that the kernel is that much pushback. So if anybody happens to know any memory-oriented kernel developers who are around and want to talk about this, that would be really cool. But yeah, we're aware of that as a concern, so that's something. But there are lots and lots and lots and lots of people running Postgres in containers, so Mark keeps, you know, sliding in, I mean, I guess, you know, one of the challenges to Postgres adoption that I would see is exactly the kinds of issues I was just talking about around the server-side configuration pieces that you have to think about, things like making sure that your server respects everything, making sure that your server will fail a malloc allocation or having control over the system enough to make sure that you avoid that risk of running out of memory on a system that doesn't have a way for the kernel to fail the allocation for you. I feel like there's not, a lot of people end up just deploying Postgres without thinking about these things and then discovering that, oh, F-Sync doesn't actually work, so everything breaks, right? In the event of a crash or they end up having the Oomkiller come along and kill the Postgres system and they end up with a bad experience from that, right? So I think one of the challenges is working with the kernel folks and working with the storage folks to make sure that we have a way of telling them, like, here's what we need, right? So in the Kubernetes world, things like the storage engines that exist there, we need to be able to tell it, like, we actually care about F-Sync here. Please make sure that it's actually F-Sync works and that F-Sync's all the way down and is persistent storage. So there are some things like operators and whatnot that exist out there that try to help with this, but not all of those things exist today in the CUBE APIs and it would be nice if more of them did and there's some progress being made there, but I do think just making sure that people have properly configured systems underneath of Postgres so that Postgres can provide the guarantees that we try to provide, but we need to have those OS level things set up in a way that allows us to then make those guarantees, because otherwise, people get a bad taste in their mouth. The question was about running Postgres on Windows. I will say that it's not something that I would typically recommend. However, there are folks that are doing it and it's gotten better, right? We continue to make improvements to Postgres on Windows, just like we do to Postgres in other environments. I actually am, we're working on porting PG Backrest over to Windows, finally. I know that that's something that a lot of people have been asking after and we actually have someone actively working on that now, so that's something that will provide a solid backup tool for Windows, another one. I mean, there's other ones out there, but I think that'll be helpful. One of the arguments I've always had about Windows when people ask me that question about Postgres on Windows is that it's not, Postgres could certainly be improved on Windows itself, but there's a lack of a lot of tooling that goes around Postgres that doesn't exist for Windows and that ends up being a real problem when you're trying to deploy Postgres on a Windows environment. It's not the core server itself that's necessarily gonna have issues or break because we test it all the time and obvious things are tested and checked and will work, but you don't have the same ecosystem of tooling around Postgres that you do on a Linux platform today. Anybody else wanna comment on that? No, all right. I just wanted to add that I think it's good to run Postgres on Windows. When we started doing that, we found a lot of bugs because Windows doesn't respect any standards, so we started to find that the code doesn't protect about this and about that, but unless Windows actually improves itself, which I don't think it will happen, I mean, the blood screen has been since what, 95, 98, and okay, it's now black, but it's there. And I remember reading a paper saying that SQL Server doesn't use the memory API of Windows. It uses the primitives. So I don't feel that Windows is something we can actually run smoothly. It's something it can be done that I won't expect to be fantastic. It's a sad story. It's, in Latin, people, well, I think it's everywhere. People think about money first, and while open source is actually less expensive, yeah, well, its adoption is not zero cost. It will cost, and people doesn't want to invest on that because it's a two or three years investment until you actually see the money retired. So in Latin, you can't think about one or two or three years investments because government changes rules too quickly. So it's difficult. We need to learn to teach people, but with some companies, big companies, actually using PortraitNow, actually tomorrow I'm going to talk about our Latin-based company, which is of the financial system, and it moves money for lots of companies in Latin, the West, and Europe. And with those cases of a study, people start using Portrait, start considering it. Sadly, those companies doesn't want their names to be mentioned, so I could be inventing things. There is no way to confirm it. Yeah, so the question is, are there enough Postgres professionals to really keep Postgres moving forward? And I guess so many people, compared to Oracle, yeah, we're a tiny group in terms of availability. And that gets to the larger adoption question. I mean, I understand, Steven, to people who don't want to have a bad experience with Postgres, but there's a whole swat of people who are never going to experience Postgres for a variety of reasons, right? And they kind of fall into two camps, right? There's the one camp, which fortunately is getting smaller, which basically says that only relational databases from the big three are enterprise-ready, right? So it's IBM, Microsoft, and Oracle. Obviously, the ones like Sybase and Informix, they all have gone away, and Ingress is on life support, whatever. But they still see those, for some reason, the other big ones who have left, they understand they've left, but the fact that these other three are still around, they still think they're really the place to go, and Postgres is just something you use if you're gonna want to save money or whatever, right? The fact that IBM and Microsoft are supporting Postgres also doesn't register in their thinking, they're still thinking that those are still the better solutions. And it may be because they feel that they have better professional options, right? They may think, all right, I'm not gonna get involved with Postgres because that's gonna be a step down in my career.  It's a cost-cutting database, so therefore, we're gonna put it in low-level apps, and all the important apps are gonna stay. So this is a psychological problem with adoption to get people there. And when I talk to people, I basically say, listen, Oracle's not gonna be the gravy train forever. It isn't already. It's clear new people aren't really choosing Oracle. A startup would never choose Oracle, or almost never choose Oracle, is it? You know, and it's almost a legacy database, all three of them. And obviously, if anybody working in the legacy field, you end up like a cobalt programmer, right? They're not there yet, but the writing's on the wall, I think, in those cases. So when I talk to people, and you're absolutely right, we don't have enough people, so the only way we're gonna get enough people is to get those people who understand these other databases to learn Postgres. And we've tried to basically, I've pushed training for these organizations to bring in people and do significant training, a week-long training that is targeted between their old database and Postgres, can use the terms that are the same, and the concepts that are the same so they can basically transition from one relational, because that's really the only way we're gonna build that community quick enough. We can't build brand new people from scratch, probably. We're gonna probably have to pull from these other databases and get them kind of up to speed on Postgres. And I think it's been pretty successful if you see people coming from other relational systems. The other area where we've had a challenge in terms of adoption is people who think that relational is old, relational is not where technology's going, and that somehow no sequel is gonna solve all the world's problems. That actually is in decline as well. You see less people thinking that no sequel is easier long-term. It's probably easier short-term, sort of like putting together a go-kart is easier short-term, but don't take it on the highway. So I think people are seeing the problems with the no sequel, and I think Postgres is benefiting. So I think it's kind of over time, we're kind of moving there, but it's always slower than I want it to be. I just wanted to make a quick note about, I mean, if you look at DB Engines, I mean, yeah, I think we are in a situation where we really need more people getting involved in Postgres and helping to move Postgres forward, but I don't think it's really holding us back that much in terms of actual adoption. When you look at things like DB Engines and the huge markets that are out there for Postgres, I don't think it's really holding us back actually all that much. Sorry, somebody else wanted to add on something? I feel like I should give the mic to Dave because he's literally doing a series. So for those who don't know, like you've been posting against on YouTube, right? Like you're doing a series on like Postgres for MySQL DBAs. So there is a series of that for people that are trying to make that transition. Yeah, Dave Stokes are esteemed, I guess, person in the audience.


Good afternoon everyone. My name is Joshua Gioia. I'm a senior front-end engineer at a company based out of Minneapolis called Code 42 We developed a software called crash plan. I've been working there now for about two and a half years I started my career about 12 years ago as an action script developer So if you guys remember the days of flash that you know what I'm talking about if you don't you're probably better off for it So this talk today is SVG versus everybody and The reason I titled it that is because I think there's a lot of mixed conceptions around when we should be using SVGs and how we can be using SVGs so I just kind of want to pin it against the other HTML elements and Methods to get raster images in our browser and we can kind of take a look at the benefits using SVG over those other methods So we'll talk a little bit about the SVG a benefit about the SVG how I actually got introduced to SVGs was at work A coworker of mine said we need to use SVGs for this project and I was totally against it because of how complicated I thought they were but he said no, they're really simple Let me show you and ever since then I've been an SVG fanboy. So he he turned me on to that I'm gonna show you guys How to convert a PNG to SVG using illustrator We're gonna look at the anatomy of an SVG what's actually in those SVG files And then we'll look at a couple real-world use cases So jumping right in a brief history. It's been around for about 15 years now It was first introduced in 1999 and the first release candidate was in 2000 and Here's the kicker all current browsers currently support SVG So there's no reason why you shouldn't be or couldn't be using it So why would we want to use a SVG over a raster image like a PNG or JPEG? I think one of the biggest reasons is control Once you put that image in the browser, you no longer have control of it I mean you can make it responsive kind of but you can't really Move elements around inside the image. You're kind of stuck with that image moving forward So you can add styles in line in an SVG or you can control them from your style sheet, which is really powerful You could group elements inside of SVG, which is also really powerful Way better accessibility I have the ability to add Accessibility to individual elements or group of elements inside my SVG. So that's really really great Performance So let's just take the use case of Social share icons or social icons, right? If we have five of them and we use the PNG method We have to go and get five images from our server Not ideal. We can use another method, which is we can load up a sprite and then tell via CSS Where in that sprite that icon actually lives, but that's still one request If you use inline SVGs zero requests Reusable there's this really nifty feature in SVG code use Meaning if I already have an SVG element on the page I can just reference it inside of another SVG and get it for free. It actually Doesn't load any more code and what it actually does is creates that element within the shadow DOM It's totally responsive It's not this Cover contain situation where you kind of got it aside if you're gonna go full width with it or you know Condense it or stretch it out. You can actually move elements around the side of it You can target individual elements inside the SVG or groups, which is really powerful You can use media queries to target those individual elements or groups So this is kind of an example of that well, I guess not but So basically if you have a Walt Disney logo, let's just say and you want to do a little down as the page gets smaller You can kind of target each one of these elements and I must show you what that looks like in Illustrator So this is kind of what that looks like in Illustrator You can layer it and group it out and name it and when you save it out Illustrator actually saves out the groups with your naming conventions from your Illustrator file Accessibility again, we can we can target different elements or group of elements inside of SVG and give screen readers information about those individual elements filters This is a really powerful feature in SVG. It allows you to define in line filters for your SVG and It's reusable No need to do complex CSS when you're using these filters. It automatically does things like blur For you so you don't have to write some convoluted CSS to achieve that Animations this is For me it harkens back to my flash days right like when we lived in the world of flash We had all these things flying all around sometimes these Super long intros that you didn't want to watch what they just gave them to you anyways um But this gives you the power again to animate certain elements um, they have a built-in feature of animations and you can do things like Within the svg target an element and move it to a different part of that viewport And again, this is like I think one of the Most powerful features I can target individual or groups of elements inside the svg So it's not just making the entire image responsive. It's making every element inside that svg responsive Using raster images like png's and jpegs for things like customer logos I think we got to do away with that um For so many reasons one. It's not future proof.  Logo look like on that tv. We don't even know right? We don't and we don't know how many k's they're going to go up to They could go up to a hundred k's so I mean Let's imagine a situation where Our name is christine And we're newly single and we're getting on this data app thing called twitter Or sorry tender We're getting on this data app thing called tender now would we if we're christine Put up a blurry or pixelized image of ourself in our dating profile I don't think we would I don't think we'd go with this Right, we wouldn't say this works for me and if you wouldn't put yourself Or your image in this light you probably shouldn't do it for clients either because their logo is very dear to them Their brand is very dear to them Okay, so how do we get from this pixelated png? To this krisby clear svg And now i'm going to do a live demo which I hope goes well We're going to find out Um just give me one second to set it up here Yes Okay, cool. So I'm an illustrator and I have a wordpress logo png i'm going to load it up And here it is So actually illustrator makes this super easy for you Right here, um at this top navigation bar. You can do a thing called trace image trace image Needs a little bit information from you as a user It just kind of wants to know how complex is this image before I convert it So this image is not very complex at all um Sometimes I'll just go with three colors even if it's one Just because that means that they're going to optimize it a little better. So let's do that It's gonna do its thing Okay Now as soon as we click expand We're done We got it. It's an svg And they've already grouped it for us and they've already broke it down in the past for us And we can go in here and group them differently and name them differently if we want So when we save out the svg we have the naming conventions we want um So If the customer gives you a logo and it's not an svg you can convert it in a matter of seconds, right? I mean that was super painless Sometimes it gets a little more tricky when the logos are a little bit more complex Or the images are a little smaller But you know as you kind of go along you'll learn different Tricks and tactics to mitigate that Yeah Yeah, I think if there is uh, okay, so here it is right here. I think you can So I don't this already has a transparent background. I think I think it's just white because the artboard is white So it's already transparent But if yes, if that were to happen and there was a white background on it, um, you could just click into that layer and delete it That's fine um So then we can just save this out here We can just save it as an svg and While out we're done. We can just take a look at the code right in here Um, and you know illustrator does a really good job of grouping things and then automatically Appending classes to the different paths And you see those classes represented up there in a style tag if you're familiar with html and css That should be something that you're pretty much used to Um, is there any other questions about how to convert a png to svg before we move on What's that? I know no no with the photo um No, I mean, I think you kind of got to delineate between is this a good candidate for an svg or not to me Most good candidates for an svg are things like icons and logos Images although you can do it and you can do it well Most images they just don't work. They're too complex Yeah What do you mean optimizing for readability of code or optimizing for performance Yep Yeah, yep, there's a there's a plug-in. I think it's called svg go I think so Okay Sure. Yeah, we use svg go and we we just built that into our gulp task. So that just happens for us automatically when we run our build Um, another thing you can do is get rid of Unneeded layers, right? You can kind of optimize it yourself in this interface if you like I like to go in and group layers based on the colors. They may or may not be All right, so now we know how to create an svg. How do we actually use it? So there's three different types of svgs or three different ways that you can basically Use an svg in your code to get it to display in a browser. That's object mode Object mode is kind of like an iframe or video embed Um, there's image mode image mode is just like any image tag or background image in your css Where you would load an image in and then there's inline Inline is going to give you the most flexibility and benefits and that's pretty much exclusively really what we use at code 42 So let's take a look at each one of those If you're familiar with html, I mean this is pretty basic Um, and you can load it in via image tag or background in your styles And then this is just an svg tag. This is just a basic svg tag Just like any other html element like div or Yep, just just right there in your html. You can just define it and that's the easy part What are the advantages of using an inline svg? We've already covered a lot of them, but one of the big advantages is it solves an agile problem Which is make the logo bigger Right everyone wants you to make the logo bigger Well in the past if I was going to make the logo bigger, I would have to open up photoshop Recrop my canvas recrop my image save it back out load it back up to the server Well, it's bigger. You owe me for one hour of work, sir. Just kidding Now you could just apply css classes and make it bigger Right there right then you can do it in the browser form or just using css. You can make it bigger All right So we've already talked about some of these but let's go over it again. What are the advantages? All right, we got chris fun any screen resolution. They come out with a 10k tv You're sure it's going to look good less htp requests to no htp requests, which is just amazing Easy to animate it is extremely easy to animate svgs. You can yes Are you creating animation by an illustrator? No But I am going to talk about how the different various ways you can animate svg Easy to make accessible Well supported yep So when it comes to accessibility I do accessibility Yep, I'm going to get into the how In a little bit Controlled with styles Now how many of you currently use svgs? Cool How many of you guys currently use svgs, but have never opened up svg file and actually looked at What the output is? Okay, we got a couple cool. Well, this is what the inside of an svg file looks like I'm just kidding, but it is it is kind of scary So this is typically what the inside of our svg files at code 42 looks like So we define our styles up top and we give it A class definition And then we just define our classes in our two paths Can anyone by looking at this example code tell me what this is going to render? You got it. So that code renders this And the reason why we've kind of broken them up into two classes and to find them up there is one of the Paths needs to be red and one of them needs to be almost black cool All right, we know how to convert an svg We know what an svg looks like we know how to apply styles in svg But that doesn't really get us all the way there, right? We're all here for word camp. We're all here for wordpress So how do we use svgs in wordpress? Is anybody in the room currently using svgs in their theme production? How do you typically do it? Okay Okay, okay cool. Yep, so that's typically Typically the way people do it just in line right there in their template or Or just upload it to the media gallery and then you can use image mode to pull it in We use this nifty feature called get file contents So we want our svgs to be in line But we want to tell our template which svd the load Um when it gets the request from the server and the reason why we want to do that is we might have a template in which the svg and the markup They're all the same, but the difference is The svg logo that we want to bring back. So I'll give you an example. I have a client that sells trade show booths And they have all these different product pages and all these different product templates are the same Right, there's a slide show to the left information and then you know the product line logo And so I want to reuse that template, but I need to grab a different Logo for that template to represent their product line. So that's why we would do something like this Um, there's also a plugin that you can use svg support I haven't used this plugin, but they do support in line svg, which I think is pretty cool Code 42 case study. So this is that Moment in time where my co-worker came to me and said we got to use svg for this product We cannot use png's. I'm like, why Why can't we use it? I know how to use png's Is because we love our logos We love to show off our clients at code 42 We have a lot of clients. In fact, our meeting rooms are named after our clients. So we're really invested in client relationship Some of our clients are boston university national geographic Okay, panagonia So the problem We need to give content editors the ability to add logos without any developer intervention Right, they don't they can't call on us every time they win a new client And they want to put it on the website or they want the ability to access that logo on the website We need to change colors programmatically based on different modules and themes we have So that was another really big issue and a big reason why we couldn't use raster images for this particular problem We have to make the Solution reusable across multiple websites and we have about six of them. We maintain Okay The real problem we have adobe as a client We have to represent that logo in four different colors We have to then do it in six different sizes For every code 42 customer So that right there to me equals Not going to happen. We're not going to save out a thousand different png's to represent these various clients against these various modules At various times. It's just not It's not going to work So what we did is we built a plugin and that plugin allows us to upload svgs Optimize them and make them available globally for consumption of our modules And i'm going to demo that for you right now So this is what our plugin looks like So as you can see they need access to a lot of different logos And they need to be represented in all these different colors So we allow them to kind of look at the different themes and decide is this you know The way we want to portray our client on the website for this Incense Yeah, so it's just a nifty little plugin works really well Um, but I mean you can see how like crisp these logos are right? They just look good It's not available to the public no, um if it was up to me If I had my druthers, I would make a lot more of our stuff open source, but And you kind of know how that goes so Okay, cool. So you're asking about how do we use this better accessibility? How do we make these svgs accessible? And here we go right here We have an svg element and we give it a rl label labeled by and we equal that to title and then we ID our title with the same attribute that we fed to the aria And there you go Then you can define what it is and a screen reader is going to get to that element and say oh, I know what to Read here. It's what you told me to because you referenced it here in this aria label So as you can see that that works a lot better than an alt tag Right, especially if I have an svg like the adobe one That's like the red adobe a and then the word adobe, right? I can separate those two things out and say the screen reader read adobe a And spell out the word adobe if I want So again, I mean, it's just pretty simple. It's not very complex to use this element I'm sorry Um inherently it's going to be hidden. Do you mean is it going to show is it going to render in the browser? No animation effects so svg has this built-in animation element that again you can just link using ids And this animation element has things like move to start from So you can create an svg element with an animation Built into it load it up to the browser and it's good to go no javascript. No css So that's pretty powerful Um, I prefer to use green sock Um, but again, how you would do that is just import green sock into your project and call it out the id So you can do some pretty powerful stuff with green socks and tweens So this to me is like one of the coolest features of svg this filter function, right? I've got an svg and I want to do something different with it or maybe when I roll over it I want it to blur and when I roll off of it. I want it to unblur Well, I can define that right here using Using this filter and again, it's just simple I feed it an id and it knows what to do Yeah, you can You can yep Yeah, it's really cool. It's really powerful and I think there's 16 filters right now Sarah sudan has a really Really good article on different filters and how to use them on uh, core drops. So I would I would definitely check that out And this is pretty well supported as well. So unless you have to do something in ie 10 Well, you think that's funny, but when I would start it it was ie 5.5 That was difficult um Like I said, it's just a really powerful Really cool feature. Um And it can do things like this right, so that's just a little bit of JavaScript mixed with a svg filter svg use This is super cool If I define a svg somewhere I can reuse it elsewhere again without Any more code or having the browser interpret any more code. It's going to load This it's going to clone this element and load it in the shadow DOM So in this example, we define one circle and then we reuse it twice, but we gave it different styles so Really powerful as well All right the anatomy of an svg This is that scary part Like all this element stuff on the top level It's pretty cool, you know It's pretty I'm pretty used to it And you don't really got to get into the nitty gritty about what's going on Past defining your styles and putting ideas on path and group, but we're just going to walk through it And uh, you know, it might get you out of a pinch when you hit an edge case at some point So we have built-in elements. Um, those elements are rec circle polygon line Uh, this is what a rec looks like So I have svg element And um, I define a width and a height and it gives me a rectangle. I can pass additional parameters Rx and that's going to curve the um the rectangle We got circle similar you know, we we feed it a radius and um X position in a Y position and it just draws a circle for us right there polygon, this is powerful when you want to create An svg element that basically starts where it stops. So this is a good example of that You know wherever it starts it's going to stop so it So this works well Line um, this draws a line from a starting point to a finishing point Um, and then you can pass it Um Yeah, it's basically just a starting point to a finishing point That's what the x1 x2 is on the y1 y2 path this is um What you're going to see most often and when you do that illustrator Conversion that I showed you they normally create paths whenever they can One thing I like to do with paths is group them based on color or animation preferences but so you define a path and within the um D you equal what that path is going to look like And the z at the end closes the path So you have to have the d equals then you have to fill it in with the parameters and then you have to close it So uppercase is for absolute Lowercase is for relative um m is for move to Uh l is for line so you can define a bunch of lines in a path Um h is for horizontal v is for vertical and z is to end the path um So again, you know, because we have these paths because we have these groups We can actually make things responsive, you know, we can base on the user's browser with condense remove elements from our svg logo And this is what that looks like in code, right? So I've wrapped it in uh svg called disney logo I've named them appropriately. So magic castle walt Disney and then d Um And I group the things that I need multiple paths in if you don't need multiple paths that you can not group them I I like to group everything Just so they're on the same hierarchy And this is an example of, you know, what you could do with media queries And uh responsive logo So I think this is a lot better than what we currently have Which like I said is just stretch contain cover And this is how you do that with media queries. I mean Pretty basic stuff. You guys have done media queries if you've done any type of responsive development And you just call it out the same way you would call out any css class in your markup okay What else is cool about paths is you can add uh beziers to them So we have c that's a cubic bezier self-reflecting cubic bezier That's kind of if you wanted to make like a s shape All right, it's going to give it's going to get where the line curves. It's going to give a reflected similar but opposite curve to it uh quadratic bezier uh elliptical arch And this is a really fun cool tool um It's basically you can go in here And play with these different things on a path And then it will tell you exactly what Uh bezier code you need to achieve that Um, which is really powerful and cool viewbox, um, this is what you wrap your inner elements for your svg in And you can define a width and height I tend to take out the width and height because most of the time I want my svg is to be responsive um, but viewbox is basically you can think of it as cropping the canvas in which your svg is going to live Right, so it's going to need to be the width and height that you want it to be to display all your elements um Preserve aspect ratio The default is going to be x mid y mid that smack dab in the center of that view box that we just talked about These are the options x has mid mid mid and max y the same thing mid mid and max Um meat slice or none you can think of that as cropping slice is going to crop the svg elements If they're larger than the viewport meat is going to confine them to the viewport This is kind of uh image that represents that And then this is an image that's going to represent the difference between Slicing and not slicing. Um, this is a cool example of um using responsive text so It just kind of keeps its Keeps its weight on the page no matter how wide or narrow you have the page with this clicker doesn't want to work Um, there's a list of resources I don't know So sarah drasner and um the two saras they um they are kind of The oracles of the svg landscape. They have a ton of stuff about Um animating svgs filtering svgs and they've kind of been singing svg praise for years now So I would I would definitely suggest following them and I'm going to open it up for questions Yep Um, yeah, I mean, I think you would kind of treat it You'd kind of treat it just like you would any layout like, you know If you're going to do mobile first if it's here then show them what that looks like in that width But in the actual illustrator you're going to want to group those things and name them appropriately That way you and your developer can have a conversation and say hey on group Walt disney or on group magic castle. I want that to disappear on um, you know on ipads or something like that Yep, yep Selectable and copy and pasteable. Huh? Yeah, yeah, no, I hear you. Um, you know, I I don't know. I'm assuming there's a way I'm thinking there's probably some type of element or trick you could do to get that to happen Yeah, yeah Cool Yeah Or that kind of like point based animation on spgs Yeah, so the smil animation was that animation tag that I showed earlier That I think that's adopted from that spec And I okay go ahead Right, um You know, I I think you can get pretty far with that animate element and css But you know, I mean sometimes just You know basic css and html won't get the job done. Do you have like a specific use case that you're thinking of? Okay, um You um, so you're asking if if I have like um A software and I want to create an svg animation And I just want I just want to be able to do it in the software and then export it I think adobe has a product that's pretty good for that I can't remember the name off the top of my head. I'm more on the development side though, so I I wouldn't I really wouldn't know is there any designers in the room that are aware. Okay, cool. Thank you. Yeah Um, yeah, there is a free svg animator. I'm sorry Yeah inkscape Yep, it's called inkscape It's um, it's a free svg editor. Um I find it kind of hard to use but maybe that's just me So Yeah, um, so tip number one, I'd say get a large transparent image And then kind of okay, so when I actually Um, I could show you guys that so there's more features of illustrator But in that trace feature you can do a custom trace Sorry computer died But in that in that trace there's if you go all the way down to the bottom of the drop down There's a custom trace feature and then you can kind of play with the different nuances of it just to get it just right Right Yep, yep Yep, and that like I said, that's that that's setting when you pick like two colors three colors 16 colors Or if you do a custom you just kind of got to play with it and start with a large image Okay Right right, what are oh, yeah Yep Yeah, um, I prefer grouping. I guess I don't know if there's a compelling reason Oh, yeah, okay. Okay. Yeah, so if I have multiple paths and I know that they're going to be the same color Then yeah, you should compound them Yeah Yep Yep Um, okay, so you you have a okay So you have you have a problem in where the editor wants to grab an svg from a list of svgs And then have an inline on the page Right Yeah, um, so you could Well, if you want it to be inline You could use that plugin and they have an inline option and allow you to select from the media query What we did is we created a custom post type And that post type has a reference to the file that we're going to get the content from And then they pick which logo they want to use from a drop down list in the in the template We parse that so it knows what to grab when Right Inline svg if you do it right Yeah, right Right, yep, and and you get all that control And a small number Well, I'm right. I mean you don't even have to use a file if it's inline It's just it's just rendering html at that point. So Yeah, yeah, thank you


If this doesn't happen, life will torture you in so many ways.  Insured relationships are always tortured anyway.  So, this idea we have to remove from the world that spirituality is for the dying, it's for the living.


Disruptive innovation. In business, a disruptive innovation is an innovation that creates a new market and value network and eventually disrupts an existing market and value network. Display single-stablished market leading firms, products, and appliances. The term was defined and first analyzed by the American scholar Clay Annem Christensen and his collaborators beginning in 1995 and has been called the most influential business idea of the early 21st century. Not all innovations are disruptive even if they are revolutionary. For example, the first automobiles in the late 19th century were not a disruptive innovation because early automobiles were expensive luxury items that did not disrupt the market for horse-drawn vehicles. The market for transportation essentially remained intact until the debut of the lower price Ford Model T in 1908. The mass-produced automobile was a disruptive innovation because it changed the transportation market whereas the first 30 years of automobiles did not. Disruptive innovations tend to be produced by outsiders and entrepreneurs rather than existing market leading companies. The business environment of market leaders does not allow them to pursue disruptive innovations then they first arise because they are not profitable enough at first and because their development can't take scarce resources away from sustaining innovations which are needed to compete against current competition. A disruptive process can't take longer to develop than by the conventional approach and the risk associated to it is higher than the other more incremental or evolutionary forms of innovations, but once it is deployed in the market, it achieves a much faster penetration and higher degree of impact on the established markets. Beyond business and economics disruptive innovations can also be considered to disrupt complex systems, including economic and business-related aspects.


If we go to our horse and our seats in balance and we're quiet as a rider, the easier it is for our horse to understand our aides because when we use them, they're very clear. We haven't been busy making a lot of noise. We've been a quiet rider. So now when we say something quietly, our horse goes, oh, they're saying something. We're going to be working on the us part first and the feel part. I think people get a little intimidated sometimes because you've got riders out there that seem like they've got a ton of feel and they're natural and it's very easy for them to do things and you think, well, boy, I don't quite have that and I would really like to get it. And it seems like it's an elusive thing but it's actually something that we can be working on in our everyday life and we can make huge gains away from our horse. So then when we get on our horse, we're not thinking, oh, my poor horse or I'm not doing this right but we're always having to question ourselves because we've already organized our body and our emotions and our feel in a way that's going to be advantageous in our ride. And the cool thing about horses is they are, and as I'm sure you all know, they are the most forgiving animals and they're so cool because if you get like one to 5% of it, they're really good at filling in. So that takes the pressure off. We don't have to have perfect feel. We don't have to be perfect riders but we just have to get a little bit better, offer our horses a little more and they will start to fill in and pick up the pieces that we maybe are not bringing to the ride. So let's have everybody on your feet.  So like 1001, 1002, 1003, and so on and so forth. And you can do it with eyes closed, eyes open. I don't really care but we're going to stand on one foot, figure out how many seconds we can stand on that foot and then we're gonna stand on our other foot and figure out how many seconds we can stand on that foot. So it'll just look something like this and you're gonna also notice when you stand on your foot, where the weight is, you're counting the seconds as well, you're gonna notice if you grip with your toes, just try to feel what's going on in your whole entire body and see how long and then you're gonna switch feet and then you're going to see how long on the other foot. So let's go ahead and let's just do that to begin with.  What we're working on developing here as we move forward is we're gonna work on our posture position, stability, balance, that sort of thing. And it always is very useful to be able to make observations and make comparisons so that then as we experiment and try new things, we can figure out is it helping, is it hindering, what is showing up different? And because we are all different and we've had different injuries and we have different biomechanics in our body due to maybe having different lengths of femurs or the way everything's set in our body, we're all different. So we need to through this be able to become kind of our own trainer in a way so that we're able to reflect internally on what's going on in our body because what works for you may not work for you. Maybe someday it will though. So we need to, as we progress in our riding different things are going to work more effectively as other pieces come together. Let's go ahead, let's have you all sit in a chair and we're gonna talk about the pelvis because really this area in our pelvis is where much of our stability comes from and especially when we're riding, that's our point of contact, it's our place where we communicate. So as you're sitting, I want you to just kind of be aware of where your weight is at and actually everybody's sitting pretty good. When I did this weekend, we had some people sitting like this and I had done this on the second day and so people were kind of relaxed but just feel where your seat is at. If that's home base, so what's our home base? And this is something that we do, I would say a large portion of our day, especially those of us that work on like a computer or do a lot of driving, we end up sitting down a lot. So what if we could take that seated position and actually do something with it where we're creating some awareness, some feel and we're developing the patterns and habits in our own bodies that are gonna be useful and beneficial to us when we're riding our horse. And the more time we spend in good patterns, the easier it is then for us to be on our horse. If we go to our horse and our seats in balance and we're quiet as a rider, the easier it is for our horse to understand our aids because when we use them, they're very clear. We haven't been busy making a lot of noise. We've been a quiet rider. So now when we say something quietly, our horse goes, oh, they're saying something. Whereas if we're coming to the ride and we're slouchy and sloppy and we don't have a lot of balance, then we're gonna be busy kind of trying to stay with our horse and then our communication doesn't come through nearly as well as it would if we were a quiet rider. So I want you to now sit at the edge of your chair. And when we sit at the edge of our chair, what it does is it puts us in a place where we have to actually use ourself. And when we're using ourself, we need to find center so that we can stack up our skeleton on top of our centered pelvis so that our muscles can have some tone in carrying us, but they don't actually have to physically hold us. So we're going to do an exercise that I'm gonna call rock the chair. So we're gonna pretend like we're in a rocking chair and our pelvis is going to have the rockers and you're going to feel your seat bones and we're going to go from a rock forward where we rock onto the front of our seat bones and then we're going to roll back and rock back. And I want you to be able to go from one extreme to the other and as you're doing this, you can pause places and notice what the different position causes you to do. Now, when you're in the saddle, and you guys can continue doing this, when you're in the saddle, I'm going to be talking about having flashlights on our seat bones. And we want our flashlights on our seat bones to be approximately pointing straight down. When we're rocking the chair here and we go into this position where I'm kind of back and my lower back kind of has a hunch in it and I'm rolling my shoulders a little here, that would be my flashlight pointing straight in front of me or towards the horse's front feet. When I roll into this position, now my flashlights are pointing behind me. And what I want you to do as you're working this exercise and you can close your eyes if you'd like to because I think that does help us feel even more. But as you're doing it, I want you to notice what it does to your back, to your spine, to your breathing, to your head and neck, how your muscles are working. And we're going to all now go together and we're going to go into that flashlight's pointing out behind us position.  What are you going to do?  And now try breathing and feel what it feels like as you breathe.  You can breathe into your chest, right? Upper chest maybe, but can you breathe into your lower back? Not really, right? So this would be a hollow backed perky position. So our back is hollow or perky, we're trying to sit up, but our horse is going to feel like we're very, very tight. And like maybe we're nervous because our breathing has become very, very shallow. It's just up in our lungs and that type of breathing is more of like a nervous type of breath. Our goal is to be able to fill the entirety of our lung as we're breathing. Okay, so now let's try the opposites. We're going to rock onto the back of our chair. Flashlights are going to point straightforward and we're going to get kind of slouchy and you're going to think about dropping your sternum and almost looking at your belly button with your head. This is a posture that I see guys ride in a lot.   And horses, again, they feel these things. And so in this position, if I were to have to use my legs, they're going to be way out in front of me, right? Whereas in the other position, my legs are probably going to swing back a little ways. So the clarity of our aids is not going to be there. Now we're going to find our own center and we're going to be doing this in the saddle but I prefer to do this without the feedback of the horse because I think it makes it just easier for us to really focus in and work on developing our feel. This is something I would recommend you do when you're sitting.  Then you're going to slowly roll through the middle. I want you to feel the sensations of your seat bones rolling and then you're going to go back and forth like a buoy in the water until you can find that very middle position. And as you find the middle position, I want you to start thinking about lengthening through your spine and growing tall and then you're going to start thinking about breathing into the entirety of your lungs. So not only your lower back, the middle part of your lung but also your chest as well. That'll lift your sternum a little bit. But we want to keep our spine growing out of our pelvis in a very neutral manner. And then we're going to stretch up through the top of our head and then I want you to notice how this feels. So this would feel maybe a little more stacked. Like we have arranged our body and our skeleton in a way where it's carrying itself, it's in a balanced position and therefore it's easy.