All right, so I'm going to give some details on the current status of FuseBPF and some of the things where we are still sort of debating where we want to go. So FuseBPF is kind of taking, when you have a FuseFile system, oftentimes what you are doing is you're making some modifications and then dealing with a lower file system in some way. And this is one of the efforts to try to kind of formalize that behavior. So we want to perform similarly to the native file system, at least as close as we can get to it, and still keeping all of the nice ease of use of Fuse. So we have nice defined entry points. And we're trying to keep the interface similar to what you would see from the FuseDemon. So just a brief overview. When you are using classic Fuse as a stacked file system, you end up transitioning to and from user space several times, calling out to the FuseDemon and then back in through the VFS layer. And within FuseBPF, we try to stay inside of the kernel as much as possible. So this is our kind of general flow. You have a call come in. You optionally filter some of the inputs to whatever command you're running. For instance, if you're doing a look up maybe on the lower file system, you have some different named file you want to look up. And we have an optional call out to do the same from user space if for whatever reason what you're doing can't be done in BPF. So you're reading from a database somewhere. Then we will handle the backing call directly within the file system as a stacked file system. And then afterwards, there is another hook where the BPF can alter what has been returned. So in the case of a read when you've got your data back, if there's some sections you wanted to change there. Or one of our use cases for this is during certain sorts of accesses, we want to hide the existence of a directory. So in that case, we might alter the error code that's been returned to not seeing that it's there at all as opposed to a permission error. So we switched over to using a BPF struct op call. In our V1 of the patch, we were adding our own program type and had a awful lot of void stars, which was kind of unpleasant to deal with. So we have more or less two op codes per fuse call. We have our prefilters and post filters. For the most part, these are just giving access to generic structs. Some things are being handled within a special fuse buffer, which I'll go into more details in the next slide. But that's mostly for fields that have variable length, like strings and data buffers. And we also have the option from this BPF program to say, actually, we want to just use normal views. So you can fall back to that path. And one of the nice parts about the struct op implementation is you only need to implement what you need. So let's say to give a very dumb example, you would never actually want to do. If your stacked file system was just adding a character at the end of every file name, then you would just do an adjustment and look up. You would have to do some things for reader. And that would, I think, basically be it. But if you're doing minimum changes, then you only have to worry about the specific sections that you care about changing. So more on what fuse buffers are. Ideally, we would just expose these as dying pointers. But we're trying to avoid unnecessary copies. For instance, when we're handling a lookup, we have an existing string inside of the dentry, the dentry name. And naturally, we aren't going to randomly overwrite that. That would be bad. So instead, we create a copy from a helper call from these fuse buffers. I had some nice suggestions on the mailing list on changing the names of these functions. But this maintains information, like whether we had to reallocate the buffer that we're using, which then fuse would clean up after the fact once we no longer need it. And that reallocation is why we can't just use dying pointers as is, although all of the interaction with the data is done through the dying pointer helpers. So this is how you interface with using fuse BPF. So you write your struct-off program. And either at mount time or at lookup time, you create a linkage between a given dentry I know and the struct-off program that you want to be running with it and what the backing file is. Currently, we're just passing the FD number, which we're then interpreting when we're dealing with the fuse response, that we're open to changing that. In our use case, it didn't matter that we would have to have an additional FD to pass in since we're doing that at one level and then inheriting the same directory structure underneath. If you were, say, needing to do a different mapping for every file, that would not be a very nice approach. So just an example of two of the op codes we have. As you can see for open dir and open, they're pretty similar. So there would be the possibility of combining things like this, although at least from your struct-off implementation, you could always just use the same program for both of these when you are defining the structure. So Paul has run some basic performance tests on this. This is using a RAM disk. So it's very much exaggerating the differences that we see. So we're seeing a lot closer to native performance than a real system. The difference would be a lot smaller. I don't know if Paul wants to make any comments on. Yeah, this is a RAM disk. So as Daniel says, it's a fairly slow processor by modern standards and a fairly fast RAM disk. So it's really probably a worst-case scenario for IO versus CPU. But this is what we've got. I mean, basically, we're seeing significant slowdowns with views. I mean, we see far less, far smaller slowdowns when we actually use views in real life. I mean, it's like typically 10%, 20%. But in these exaggerated tests, we're seeing bigger slowdowns. But the views BPF gap is much smaller, even slightly faster with the first one. That's probably never. So we still have a lot of things that we're still working on. We've been focusing on the use cases that we have within Android. So one of the big things on our list is there's currently a difference in the context that you're accessing things through. So naturally, if you're going through the Fuse daemon, you're running everything from the Fuse daemon's credentials. And we haven't done the correct credential mapping yet for doing that in a similar way from our stacked file system. It's on the to-do list, but I was rewriting everything to use struct op. So I haven't quite gotten around to that. We plan to probably something like grab the daemon credentials in the init response or something like that. There's still some op codes we're not dealing with, like iOctyls. iOctyls are very fun. I'm not quite sure how to deal with various things there. There are some cases where our pre and post filters are not fully hooked up. I haven't done that, since if we are going to change any of the formatting there, we'd prefer to do some of that work only once. Sorry, I was going to say for the daemon credentials thing, what I would say is iOeuring had the exact same problem. And my understanding is the solution for this is that they fork off a thread from the actual process because it's too complicated to deal with all the credential stuff. I don't know if that is practical for the BBF thing, but I just want to say that since that is a problem that iOeuring very painfully already went through, I would say if you can talk to see how they did it. No, I mean I merged a generic API for this for 6.4. So it's called user workers, which is a generalization of this concept. I am all for using preexisting stuff there. One thing we found in Android is any form of thread switching and worker queues really messes up latency. And basically we can't ship it. We've had a huge trouble even with deamverity because of its worker threads. And I think it's really pretty simple. We just need to do all the iOe from in the context of the fused daemon. As far as I can tell, every time I think this through, that actually seems like a great security model and the correct security model. I'm actually very open to discussing that because it seems too easy. But every time I think about it, that seems to be correct. Because the fused daemon will then return, of course, whatever it wants to the user space. So we'll get a double level. The fused daemon has to be able to do it, and the user space app has to be able to do it. And I think that's the right model. I mean it's the model fused company has. And it's the model we should reflect in fused BPF. We shouldn't be changing that because it's tried and tested. Different question. I'm wondering about the pre and post filters in user space. Do you really need them? Like my thinking is, if you are already in user space with pre-filter, haven't you already paid the performance penalty? And you may just as well do all the processing in user space? So we still save one transition there. So if we go back to the, that was the wrong direction. So going back to here, yeah. So once we've gone out to user space, we still have the extra call-in through, you're likely going to call back into the VFS layer through various syscalls. So we do save that. There's a lot less of a benefit. Right, right, but don't you probably have multiple syscalls there anyway? Because otherwise you wouldn't have put your pre-filter into user space in the first place. And then you're saying, if you've got your user space, then you're probably doing expensive stuff and then you may just as well stay there. One example we have is hiding information in files. What you'd probably do is use some sort of BPF map to say which bits of the file has to go. Say after a read, you do a read from the file that gets the data into a buffer. And then you use a map to say, these are the areas we have to send to user space, hopefully very small areas. Like in our case, it's taking the location information out of a picture. So user space is going to actually do the finding where it needs to, what it needs to modify and how. But only when you do a read from the exit header of the picture. So yes, for that particular read and that particular small part of the file, there's a high price to pay. But it's a picture, it's megabytes in size. For all the rest of the reads, you stay in the kernel completely. If you stay in the kernel completely, I have no objections, but then you also have the BPF pre and post filters, right? What I'm saying is the case where you do not use your BPF pre-filter, but you use your Fuse pre-filter, like your user space one. Well, I mean, in this particular use case, you only go to the Fuse pre-filter, the user mode pre-filter, when the BPF pre-filter has decided it's a good idea, which is a very small amount of the time. Yeah, exactly. And you've already read the data. And you're not really trying to optimize that path, that's the bare path. Why in that case bother with a user space pre-filter? Why not just say, okay, this one, rare request is handled completely in user space, not as a pre-filter going back to the kernel and then somewhere? Actually, the answer for that is, possibly it's a better idea, but mostly I think that you quite often don't set up the necessary node IDs and so on to actually be able to quality user space through the normal Fuse stuff. So it's a very different, we've found it useful so far. And particularly in that situation, I just described, it works. Another situation is, actually, no, that one doesn't work. It's only the permission thing that Daniel was talking about. In the case that we can't decide whether, in some cases we can't decide whether we should show or hide the file from the BPF. It's rare, but it happens. It's to do with multiple groups. In that case, you go to user space. And user space, that's a bit more processing. But it happens at the same point in the flow after everything else has happened. It actually makes the coding easier, if I'm trying to say. But yes, but you don't get much performance. If every time you're doing a call, you're ending up in user space, then this is pointless. I don't disagree. All right, so I think this is where I was confused yesterday. So I just want to make sure that I'm on the right track. Your thing does two things. One is sets it up with a mapping where you can attach a backing file for an existing open files. When you look up in Fuse, you say, okay, here's a file descriptor that I want to associate it with it, and now all operations are going to go to the backing file system. And then you also did all this pre-filter, post-filter stuff for every single operation. So we've got two different concepts here. The actual pass-through part, which is the association. And then that's pre-filter, post-filter thing. Yeah, so those are the kind of two things that it's doing. We personally, I guess there are some cases where we're just using pass-through itself. And I guess there's some limited use for that. Like I guess, as opposed to a bind mount, if you're doing a move across this and you have two different backings on the same file system, then we end up not having the xdev issue moving across the bind mount, but. Right, so for me what I'm thinking of is like lazy loading, right?  I just want to use the backing thing, and then the filtering stuff is just kind of extraneous. Yeah, so in that case you would just set the backing file, and you wouldn't set any BPF program, and it would just skip that entirely. Okay, so then this, so in that case there is no BPF. Yeah, in that case there is no BPF. Okay. During lookup you can change the BPF, you can add one, you can change it, or you can remove it. And the same thing with the backing file. So in your case during the lookup you see that the file you want is there, so you just say no BPF, associate with this file done. And then it will be very neonated performance. Is lookup the only way I can attach something? I was thinking about it for the ComposeFS, and that would basically attach something to everything, and I would rather do it unopened than a lookup. So we have already had a complaint from Facebook about this, sorry, Meta, and we've realized that yes, we probably shouldn't be actually opening the file and if we lookup what we should be doing is associating the path. So we're going to change the lookup. Currently we require an FD at lookup if you want to change it. Meta has requested that we make it so that you actually can just pass in a path, and I suggested a relative path to an existing FD with Pollyery. The usual FD plus path, either one of which can be null, would be a nice solution to that. So basically you can just pass in the FD of the current directory, and the thing you're looking up, the name of the thing you're looking up. That should, we haven't done that yet, but that's what we're going to do. When do you actually get to lookup because we are working on atomic open? We had to do some dirty stuff for atomic open, didn't we? Yeah, so currently our like, we have to have like an existing object when we're connecting. So we're generally doing that in like the backing, like we already have like the folder that we want to have set up existing. We had like some like things where we were looking into setting up the linkage at like say make your time if you're like creating. The question was specifically about atomic open, and I think the best, the honest answer there was we haven't thought about it too much, but I think it can be done. I just don't think, I mean, where's your lookup? If it's a lookup from an open coming in or if it's a lookup from a state coming in. So where you attach it? It's the lookup, it's the first lookup. And when the dentary is created, and actually one interesting point was when if the dentary is even a negative dentary, we do it at that point. And we didn't do that at first and it works so much better when we changed it so we actually do it. We actually attached the BPF at negative dentary lookup time and that worked so much nicer. It was weird how big an improvement that was. I'm just wondering, when did they ask if it's possible to allow attaching during lookup and during open or changing and that should solve the problem? So given that one of the requests when people have used pass through was for changing the backing file, where this question is coming and what we've done is we've got a large bucket of sand and just shove it in. We're kind of avoiding that question because we just, there's obviously a lot of questions about locks, how would we protect stuff? What happens to stuff in the cache? There's just a whole slurry of questions that we are not ready to answer quite simply and we probably need the help of the experts in this room to answer them frankly. If we're going to start allowing things to change, what does that do? And the answer is I don't actually know. So at the moment I'm just saying you can't change it because I can at least tell you what's going to happen if I say that and there's no, and we don't have any use cases that we thought of yet we're changing it would be that useful. If you don't change it at open, but if you set something at open for the first time, would that have the same problems? So that's, I mean, don't forget the dentry and the iron that are created at lookup time. What if at lookup time you don't yet put any BPF or any backing FD and then later at open could you do it at that point or would that still be hard? That would be impossible because at open time all we have is the new I node. We don't have, well, I mean, I suppose we could go and dig about in the parents I node, but that seems, the way we've engineered it is that the thing, the object you're looking at, the I node of dentry, whatever it is, we look into that and see whether it's got an associated backing I node or backing dentry. And so at open time there must be the BPF in the I node at that point in our current design. Can't you have a backing file for an open file and a backing dentry for a lookup to the entry? Two different things. It's different operations. You have IO operations for a backup file like Alessio's patches patches and you have the entry directory operations for a backing dentry. Why mix the two? I don't necessarily know the answer, but I mean, the simple logic I was going for was we're gonna have backing dentries for the dentry, we're gonna have backing I nodes for the I nodes, we're gonna have backing files for the files. When they're created, we're gonna put those things in. Again, other things could be done, but that is simple. It's understandable and you can work out what's gonna happen. That's not saying we can't be, well, maybe we can't be clever. That's not saying people in this room can't be clever and do better things, but that's what we came up with. And it is at least a simple model. It will probably be more complicated if you do it at open time, for sure. And I think, yes. And keeping the implementation simple, especially at the beginning is probably a good idea. So let's not get too creative. Just very quickly, we don't have to discuss it, but basically if we're gonna be doing a thing where the internal thing or whatever we'll be doing path resolutions and stuff like that, you definitely wanna make sure you can do resolve flags for it, because if you allow, so because the issue is that, okay, so if it composes as it doesn't really matter because it's all a blob store, but if you imagine the classic trivial example of like, oh, I want to have this thing where I'm opening the files with the same file path that user space has given me, I just want to mess around with these other little things. If you don't support resolve flags, you're gonna be looking at, oh, and now I have managed to escape the outside of the slash that is controlled. I'm just saying make sure that that's taken into consideration. I think how I can say that, I mean, I'm kind of aware that we've skirted around the whole namespace problem because Android doesn't use them in this way, so we haven't really addressed that. I'm saying like even if you ignore the namespace problem, like imagine if you have an unprivileged process that cannot access slash data or an Android or whatever. I, yeah, whatever. So for instance in that case, but the fuse daemon, I don't know what the security policy is, but let's imagine you can access slash data without any restrictions, for instance, and you're like, okay, well I have slash data slash blah, which is where I'm storing some magical thing that I give access to user space, to the user space program that I have access to fuse, but now I'm like, oh, okay, well like as user space, I trick through various tricky means to get you to do dot dot slash, dot slash, dot slash, and then that gets passed into the BPF thing and the BPF thing doesn't know that this is meant to be, that this is like the classic like extract a tar archive inside a thing problem or like a container image problem or like things we've dealt with other things. So open add to hasresolve flags, which handle this in the lookup path. If you just have the resolve flags and you just pass them, that in theory would be enough. I mean, there are probably other things we might want, but at least to me it seems that resolve flags at least would be, yeah. I mean, it's probably not complicated at, it's like one extra field. Yeah, definitely will want to add that. At the moment, we just have the FDs because that is very straightforward and all the resolution has been done already, so. Yeah, so there are some kind of general issues that we have run through doing this. One of them, which falls more on like the fuse end, is that when we're doing direct pass through, we're defaulting to like a node ID of zero. And if for whatever reason you've done this and now you've decided way down the line that you want to call out to the user space DMN, you're in this situation where you're like, ah, yes, we have user ID zero, oh, that's node ID zero. We want to do something with that and libfuse will rightfully be like no, we don't know what that is. So currently you could in BPF assign a node ID and have some communication layer there, but it would be probably better if we can come up with some standard way of doing this or giving some block of IDs that BPF would be able to assign and provide some means for user space security more about them in this case. So that's something that we haven't run in too much, but other people might. Another minor thing, when I was setting up the Distruct Ops program, there isn't any existing module support there. So to get the patches I have working, I kind of have a hacky moving a lot of Fuse-specific stuff into BPF and then having a registration call out when you register the Fuse module. But that's something that I'm going to look into having more of a ability to register a StructOp type from a module. I don't know if there are any objections to that. I think it's probably okay from other talks. There's also an issue where at the moment we have a whole lot of StructOp callbacks. When I was initially coding it up, I think I ended up at 63. The limit was 64 and the actual limit was 37. So at the moment I have a hacky patch that is just allocating two pages instead of one page so we don't jump off of our trampoline. So that's a patch that needs to get cleaned up. And occasionally you've been running into some limitations with Dine Pointers. Although every time I run Fetch, a lot of those seem to go away. And there's had some adjustments I made to it a few days ago that went in. So over time that part is getting nicer and nicer. And that'll probably make it particularly nice when we're dealing with Reader and we want to iterate over the file descriptor type. Things. Yeah, and then we have plans for upstreaming. Like it's a very big patch that currently it's like 30 something patches and I'm trying to arrange it in a way to make it as easy as possible to review. And currently I have mostly pass through patches up front and then bringing in the BPF changes later. And I don't know if anyone has any thoughts on I ask good partial steps there. So this was a suggestion I was gonna make is to make it essentially two separate patch sets as the backing stuff first and then the BPF next.  Cause like it's 37 patches and like I'm looking at it kind of confused about and this is why I'd asked the question because I got confused about like these are two very separate concepts. And like I recognize that as a project it's one thing but like it was hard for me to grasp that initially. And so like seeing it as like two different things would help at least me kind of like approach both of them and with the right frame of mind. Yeah, I guess part of our all hang up with that is just that we see, we don't see as much like use for the pure pass through version of it. But like it is a good intermediate point I do agree with. Right, I think that's the thing is like I agree that it's probably not as useful but is for like a merging and like it's not to say that they both can't be merged at the same time but just like from a review standpoint it's easier for me. But I mean of course now I know so like whatever. So very naive question. Why is it useful to pass through alone? I don't understand it's so useful. I don't I just maybe we'll take it offline. It's so useful. Currently if you ever use a few server then you get a request for say look up, say open and you handle everything, you get read, you get write. I'm talking about the old patch it. So now you can do for open for a specific file and reply with pass through all the IO on this file and it's done. You can do the same answer look up of file or a directory that's more useful and then pass through every look up, read, deal operation. So it's very useful. I mean we have a use case for it, it's very useful. And you need to follow the fuse objects model. The fuse protocol has I nodes, right, nodes and it has file handles, files and the operations are file operations or I node operations. So you need to have two different objects that you pass through. I don't see another way but. I guess my feeling is slightly different. Not that I'm disagreeing with I am slightly. When we were asked to do, when people were proposing to extend file pass through to directory pass through, I was kind of like without some sort of ability to filter that, that's, and actually, I mean let's get some credit here. There was a guy who presented few ex views at Plumbers in 2019, I think. And his talk, although we didn't use any of his codes, inspired us to think about this. When we heard that talk, we heard, we were asked for directory pass through. I put the two ideas together and N years later and one pandemic later, this is what you get. Yes, I agree that maybe directory pass through is not, so that's the part that's, I can't imagine why it would be useful without some sort of filtering. But file pass through is very useful. So maybe you should start with merging that. Just file pass through and then adding directory pass through and then BPF. I don't see why directory pass through is not useful. I mean, some directories are accessed natively, read, deal, create operations natively, and others are not. You need to go to a server. I don't see why that's wronged. Yeah, so I mean, no, it doesn't, just the, yes. The fused lookup, not the fused BPF lookup can also set the thing. I mean, the only problem is what you end up with is a tiny little requirement in one file and a deep directory makes the whole directory, you get the performance penalty of staying in fused. And that's, well, it's not okay. We're actually, that's exactly the reason why we started down this path. Yeah, so I'm not arguing that none of, like I think all of this together is very useful, right? And I'm mostly just saying that like for my tiny brain, I had a hard time separating the two concepts. So it's not an issue, because now I understand and now I'll know, but like other than that, like I think there's a logical split there that might be helpful for the maintainer, but otherwise, like I think it's fine the way it is. There is one other fringe benefit of, with just the two, like the pass-through part. If you were to have, I guess, two different pass-through directories to the same file system. When we do the move, like they're actually the same file system, so we don't run into xdev trying to move between them, which I guess you would with like a bind mount. Let's go have a break. Oh, I guess one other thing I was going to throw out, if we have a moment, just one thing we have been considering changing. So currently we have a pre-filter, post-filter in our backing call. It would be kind of nice to just have like one BPF program here, which would then call some K-Funk-like thing to do the backing call in between, so you could handle it all at once. That's something that we are thinking about, but I'm a little scared of verifying that and like not allowing people to do the wrong thing within that, so. All right, thank you very much. So now we have a 20 minute coffee break, and afterwards there's still some follow-up on the BPF site. So see you in a bit.


The Essential Psychedelic Guide by D. M. Turner Page 41 Ecstasy, the Heart-opening Psychedelic, Intensity 2 to 4 Material. Ecstasy is a synthetic compound developed in 1914 as a potential dietary aid However, its psychoactive effects were not discovered until the mid-70s It was used wisely, widely in therapy from this time until 1985 when it was made illegal Its chemical name is 3-4 Meth-ly Methyl-ly-oxy-meth-a Meth-a-m Phantamine. Meth-a-phantamine. M-D-M-A Commonly known as X-E or Atom, it usually comes as a white crystalline powder or made into tablets Dosage 125 milligrams, 1 eighth of a gram is generally considered a single dose of ecstasy This amount will produce an experience lasting about 4 hours total with the intensity dropping off a couple hours into the high Many recreational X users do what's called double dosing taking additional 125 milligrams As soon as the first dose starts wearing off My personal preference is to take one large dose of 150 to 170 milligrams Which produces an intense but short-lasting experience I prefer this method because it reduces the side effects in double dose of X can produce Ecstasy should be taken on an empty stomach If one ingests it on a full stomach, they might not get high at all or may have a delayed trip The high When ecstasy is coming on it feels fantastically exhilarating users report feeling Blist out energetic and emotionally open and loving The ride up usually lasts 30 minutes to an hour One then reaches a plateau where they they'll be for the next one to two hours Followed by a slow drift back to baseline Taking multiple doses will change the timing of this Of these periods Most X users report that their first couple experiences are like being in heaven and leave a strong impression Experiences after this are still enjoyable, but can't match the initial ride After numerous X trips I've concluded that lasting and beneficial experiences are derived primarily from deep bonding with other people while one is high Nearly all of my better X experiences happened when I was with either one other person or a small group of close friends This framework for using ecstasy closely parallels how it was used in therapeutic settings Ecstasy's ability to allow emotions to flow more easily and naturally And to create an atmosphere of non judgment and acceptance is conductive to deep bonding and healing I find that the more general feeling of Connectedness which use users report feeling with large groups of people are even Events such as raves tends to dissipate leaving one feeling hollow by the time the drug wears off Ecstasy is not really psychedelic in the same way as other substances in this journal It does not have the potential to produce the fine Level of detail and hallucinations that is possible with substances like lsd or mushrooms Indeed many users experience no visual phenomenon At all with ecstasy ecstasy also does not heighten one's Senses to the level of infinite sharpness that is common with the traditional psychedelics ecstasy is sometimes called an Empathogen because of its ability to facilitate emotional empathy and communication I've also heard it referred to as a selective psychedelic I think this describes it the best ecstasy opens one's mind in a psychedelic way But much of the personality and Perceptual structures are left intact that would be diminished on other non selective psychedelics This makes ecstasy usable by many many people who would not handle the effects of something like lsd With ecstasy one does not go through the the solution of identity and cannot get into the multitude of weird head spaces that can be experienced during an lsd trip More than any other psychedelic ecstasy seems to produce very similar experiences in different people Generally described as loving and emotionally open while adventurous to the novice psychedelic user ecstasy's limited limited experience producing range provides a low ceiling to the more adventurous psychonaut Ecstasy rarely produces a bad experience, but there are some negative Aspects to ecstasy's signature. I find ecstasy can be one of the Hardest psychedelics to come down from particularly if I've doubled dose I tend to feel depressed as the blissful ecstasy feeling Feeling slip away my previous personality feels sticky at this point and I feel I have less options Choosing my return personality than I would returning from the traditional psychedelics ecstasy also produces some side effects a speedy feeling throughout the experience Some accompanied by jaw clenching it is in the Amphetamine family a loss of appetite and sometimes a hangover the next day Safety factors ecstasy is the only psychedelic I've used which leaves me feeling any less than Perfect the next day and this experience seems to be common among Most users of ecstasy based on this I suspect that ecstasy is not the most benign substance to take into one's body and have reduced my consumption to an infrequent basis There have been a few cases of people who died from heat stroke following the use of ecstasy in dance clubs They become dehydrated after dancing for hours without drinking any fluids Although this is rare It's a reminder for one to pay attention to their body's basic needs while using ecstasy or any other substance I've read numerous clinical articles on ecstasy there does not appear to be conclusive evidence one way or the other as to whether it causes any type of damage to humans Or whether any potential damage caused is permanent or reversible However, many who are concerned with safe use have gleamed suggestions from these articles Although large doses of ecstasy produce some neurotoxicity in lab animals Damage was significantly less to non-existent Less to non-existent with a smaller dose equivalent to 100 to 150 grams for most humans Other experiments showed that a single dose of Prozac Prozac a prescription antidepressant drug will completely block the neurotoxic effects Ecstasy can produce in lab animals The Prozac can be taken up to six hours after the ecstasy I've taken prozac towards the end of about 20 time trips 20 x trips 20 ecstasy trips and in most cases I've felt better the next day than I normally do after taking ecstasy alone Prozac is considered a controversial drug some of the people to whom it was prescribed On a regular basis claim it gave them suicidal tendencies Apparently a small percentage of the people who try prozac have some type of negative mental reaction Several people I know have first tried at first tried prozac by itself to seem See what their reaction to it is before taking it at the end of an ecstasy trip As I mentioned above taking ecstasy with prozac especially multiple doses Has a tendency to give one a hangover the next day This can leave one feeling physically drained and mentally fizzled Once changes a feeling feeling bad then One's chances of feeling bad the next day can be greatly reduced by taking just a single dose of ecstasy Another method of reducing or eliminating this hangover is to take amino acids such as DL Fenta Fenta Lending DLPA or other neurotransmitter precursors prior to and after ingesting the ecstasy These nutrient nutrients are available from health food and vitamin stores And are frequently included in smart smart drinks I've also read that all the Fenta Menin Drugs produce free radicals and that taking antioxidant formulas Also available at most health food stores can help prevent damage from their use Combination LSD ecstasy is frequently taken with LSD a combination commonly known as candy flip I find the feelings produced by this combination can be much deeper and more visual than on ecstasy alone But since the ecstasy has a much heavier signature than the acid I tend to experience more of a more of an intensified ecstasy high And lose the depth to depth I would experience on acid alone If taken around the same time the ecstasy will wear off first while the residual high from the acid provides Provides for a smooth recovery nitrous oxide using nitrous and x ecstasy is Growing in popularity particularly particularly in the rave scene See the LSD chapter for information on nitrous oxide Ecstasy may be significantly intensified and possibly dangerous if combined with MAO inhibitors See the 2cb chapter And the next chapter goes into 2cb the erotic Empathogen Cool nice little write-up on ecstasy The Essential Psychedelic Guide by D. M. Turner 1996


Hey guys, Shaber1000 here. Today we're gonna be checking this out. This is my monitor for our security cams. They're not recording. I'll show you what I mean. Okay guys, I can tell it's not recording because down here in the corners, there should be record buttons. Excuse me, this should tell me I'm recording and I'm not. So, let me see if I'm bringing in a little bit. Excuse me, I'll show you what happens. I'm gonna log out of this. I'm gonna reboot. Gotta get my password in here. All right, now I'm gonna speed you up while that's rebooting and then I'll show you what it's doing or not doing. Okay, so right here it says working HDD is not available. Now I know I've got a hard drive in here because I put one in here when it was brand new. That's been three to four years ago. So I think the hard drive's bad. But even if the system is bad and I gotta buy another system, they don't come with hard drives. So I figure I'll try the hard drive first. If that doesn't do it and then I'll get another system and I will already have the hard drive because either way I was gonna have to buy a hard drive. So there's a problem there. So you can see everything's working. There's somebody walking. There's cars going past. So, what are they doing? Okay, so I don't know what that was about. But anyway, as you can see, HDD is not available. So what I'm gonna do is I'm gonna go ahead and unhook that. I'm gonna get you out here in the light and we're gonna put a new hard drive in this system and we're gonna check it out and see if we can get it working. Okay guys, so there's screwdrivers we're gonna use. My knife to open this up. Doing this out here in the kitchen because all my garage is really a mess on the sides. Anytime you're messing with hard drives, whether it be a DVR or a computer or whatever, you wanna try to keep it as clean as possible, okay? So we're gonna go ahead and open this up and then I'm gonna put something down here. And they usually come like this. If it's open, send it back. So let's go ahead and open this up. Here's our warranty card. And here's our hard drive. Like I said, in my last video, I can't remember if I got a two terabyte or one terabyte. It is a one terabyte. I don't know what's in the other one. I think I just got the cheapest one that they had. And here's, this is a card they want your opinion. It matters to them, I guess. So here's some, you can also run this in a Windows, this terabyte hard drive. I should put this in my old computer and put the hard drive out of my old computer in here, which I may make that happen. But this is for desktop computers and this tells you how to hook all this up. So, but this was like $37 for one terabyte. I may get one for my old computer because we still use it. It just can't, it just can't handle the 4K editing stuff. So yeah, so you can put it in a laptop, HDD clone. That's optional. You can put it in a Mac desktop or a MacBook, CCTV, DVR, which that's what we're gonna be using it for external enclosure or HDD docking station. So you can use this for all kinds of stuff. But this is it here. So let me get something put down here. So we can try to be as clean as we can on this because I'm gonna have to clean this up and everything. But the first thing we're gonna do is we're gonna open this up. Now this is really dirty, nasty. It's been in the garage for like I said, three to four years. So I didn't wipe it off because I just wanted to show you now. I remember there was a screw missing there. It is right there. And it didn't give the screws to put inside. So it's kind of rattled around a little bit. But when it's just sitting still, it'll be fine. But I got something to take care of that with the other hard drive there. So let's go ahead and take this apart. So normally you'll have like on this one, yours may vary. Got a screw there, one there and then two on the back, which it's only got one on the back right now. But it may vary, but they're pretty much, they're all pretty much the same. There's really, you really can't mess it up. So I'm just gonna put that down in there. I'm gonna mess that up. Cause a lot of people will buy these. I may have to get a bigger screwdriver. Okay, I gotta get a better screwdriver. Hang on guys. Okay, so like I was saying, a lot of people will buy these things. They get them all hooked up. And, excuse me, they can't figure out why it's not recorded. Well, that's cause there's no hard drive in them. Very rarely do you get one with a hard drive. You can order them now. They'll give you an option of, you know, if you just want this, how many cameras do you want?  But some of them you just order this thing and you go, cool, you know, I get an eight channel DVR with four cameras and they, like I said, they get them hooked up and they're not recording. They can't figure it out. Well, that's cause it needs a hard drive. Now this one, when they say channels, what that means is how many cameras you can put in here. This is just a four channel.  And down in here, there's our hard drive right here. This is only a 500 gigabyte. So, hey, there must have been one screw. There is a screw on the bottom. Oh, that's what I did. Okay, I remember now. I used this screw to help hold this hard drive in. Now, at the time, we did take this somewhere with us once to a haunted hotel down around Tampa area. And I did use it there, but other than that, this thing just sat in there on the shelf. It was never moved. So I'll probably do this again. I'll put the one screw in and then I got some double-sided tape that'll hold it. There we go. On for force. And these screws, you gotta watch them because we got tile out here. And then this tile, that thing will bounce like you would not believe. Okay, so I'm gonna take this and we're gonna unplug this. We're gonna unplug this here. And I don't think this one was being used if I remember right. So I think this was the problem here. 16 MB cache, you know, or like this one, it's gonna be one terabyte. And it's got a 32 MB cache. Okay, so max digital data, what this one is here. So this is the old one. I don't know why that looks like that. I'm not sure. So what I'm gonna do now is I'm gonna blow this out. I'm gonna go blow this out with compressed air, wipe it down. This is the battery that keeps your settings. And one setting I noticed that never stuck was, it's supposed to be 1080 and you put it on 1080, it wouldn't save. It kept reverting back to 720. So I don't know what that was all about. I think maybe the cameras are only 720, I don't know. But you would think it'd still be 1080 in here. But, so like I said, I can't, I don't think this was in use. I can't remember now. But every once in a while, you know, I could unplug it and reset it and it would record for a couple of days and then stop. But it would only hold two weeks. You know, I could only go back two weeks because then it would start recording over again, so. But, so anyway, let me get this all cleaned up and then we'll be back and we're gonna put this new one in. And then we'll, they feel about the same. This one may be a little heavier. Like I said, this was just the cheapest one I could get at the time, just the cheapest. So I think this was only like 10 or 12 bucks. So what I wanna do is clean it up and we'll get back with this. We'll be back with this here in just a minute. Oh, I know what this is for. This goes over here. I think it's an IR for remote control, which we don't have. I think that's why I did not plug it in. I don't know, I will plug it in. But anyway, right now, let's go ahead and get it cleaned up. Okay, guys, I zoomed in a little bit more. See, just so you can see a little bit better, but let's go ahead and mess this up. You know, you don't want these around moisture if you gotta hang on to it for a couple of days before you use it, you don't want them around moisture or anything like that. Now we're gonna put the, we're gonna plug the big one in here. This is your power supply, this is your data cable and it's gonna go right there, just like that. So what it is is the yellow and black and red wires will plug into here, the long one, and then your data cable will plug into here. Real simple, if you have to take pictures, nothing wrong with that. So what I'm gonna do is, I am gonna put a screw back in there, but first, before I do, I'm gonna grab something real quick. Okay, so I got my double-sided sticky tape, it's 3M, it's pretty good stuff here. It's not gonna take a lot of it. But the problem I'm gonna have is to line these holes up and stick that on there without getting it too far off. So, yeah, they should come with screws, but they don't. So when you get one of these guys and you have to buy one of these, you know, you're gonna need screws. Or this stuff here will be fine, because like I said, this thing just sets on the shelf, it doesn't go anywhere. If we, when we go to the haunted jail, I may take it for that investigation, we'll have to see. So, the only bad thing about this tape is getting it started to come off, you know? There we go. All right, let me get this, there we go. All right. Now, let's say I'm going to, I don't wanna cover any of this up. So I think what I'm gonna do is just come over here in this corner. Just like that. I'm gonna turn this upside down, get it lined up, and then I'm gonna push it on there. I'm doing, I'm just looking for the screw holes, because I am gonna put one screw in it.  So let me get this tape on there. We'll come back. All right, so now that I've got this in, I've got this wire plugged back in. It may have came off when I took this out, but this is still not the best, but it's just gonna be sentin' on a shelf. So let's go ahead and put this back on here. Get it the right way here, there we go. These just usually slide right up in there. So like if you have a power outage, and you know you just gotta keep your set and your time and date on this thing, it's that right there, it's that little battery. So just like a little watch battery, or button cell battery, we call them. Get this up in here, just like that. So I'm gonna start this screw in. Well, I'm just gonna go ahead and put it in. So hopefully this will take care of the issue. If not, then I'll just buy an eight channel. I've already got four cameras. I'll buy an eight channel with four more cameras, and I'll really, cause I got two cameras in the house here, but they're both in this room. If I put one up there in the corner, which that's what I'm gonna do, it'll cover the whole room, then that'll, and I've got two out front, and three if you count the ring doorbell, and then I'll take one and I'll put it out back, out in the backyard, and then we'll pretty well be set up. Never be too careful, especially if we're all gone. And you know, her mom's elderly, so she doesn't know who to let in or anything like that. So we just tell her don't answer. And what we do is we answer the door through the ring doorbell. So, all right, so we're all set. Good to go. Everything's staying good. I might try to find another screw. My holes are still lined up there. I'll try to find another screw and put in it. But let's go back in.  All it is, is I'm just gonna hook my cameras up into here. And then I have a, then I got my power, and these are my USB slots. That's just for my mouse, and for when I take footage off of here. This is for my network cable. In case I wanna run internet through this. This is what I've got it running out from. This you can run like a regular monitor, VGA. This is output. Shoot, what's it called? Anyway, you guys know what that is. Gosh. But then I've got audio, but like I said before. So this just runs out into the TV and I forget what that is called.  It's real easy. This here is for an alarm if you have an alarm set up. So it's pretty simple. The bigger ones, they do look more complicated, but they all do about the same thing. So let's go in and let's get this hooked up and we'll see what we got. Okay guys, so I didn't have to do anything. All I did was plugged it in and it came on. So I mean, I didn't have to log in. I'll have to log in like if I wanna check over footage and all that stuff or change any settings. But let me show you what I'm talking about here. This, that little R down there, that's for record. That's record and movement. There's my microphone, which I do have a microphone on one of these and let me get you down here and I'll kick that on and we'll see if we can hear it. This is just a TV. It's not actually a monitor, just a little TV. So I can't remember which one of these has audio. I think it's this one. So, well, I guess I better plug my mouse in. Like I said, it just kicked on so I didn't have to do anything. So I didn't plug my mouse in yet. So I'm gonna go ahead and do that now. And I got the light turned off so you guys can see better. So now, there's my little mouse rolling around. Let's, I think it's this one that's got sound. Now I'm gonna have to turn the TV up and let me find my remote. Okay, I found my remote. It was right there where I was looking for it. So, I think it's, is it this one or maybe it's this one? These, one of these has audio and it should have been in one of these here. Okay, so let me see, let me see what I got going on here while the audio is not working. Okay, you might be able to hear me in that. So, anyway, that's, we got it. See that's the audio, it's gonna feedback because the mic is actually only about five feet from this thing, so it's gonna feedback. Okay, so, let's see, I'll go out here and I'll show you the recording. All right, so this one here should be the one with the mic. If I got them hooked up right, I actually had them hooked up the wrong way. I had, sorry about that, I had the, I don't know if you guys noticed, but yeah, I had them wrong because I did not label my camera leads. So yeah, all right, so let's check out some of the footage and make sure it's recording. So, what we're gonna do is I'm already logged in, I'm gonna go to playback and this is how long it's been recorded so far. And there it is. That is, that's our, let's turn the mic on, make sure it was recording. Yeah, it was recording. So, and then we'll know. What I wanna do is I'll throw that footage in and you can check the footage out. So, that seems to be working fine. Nice clarity. I can't hear that hard drive running so I think I might go ahead and get me one for my old computer for the price of it. And yeah, so that's pretty cool. All right, guys, there you go. Shea Barely Mythman Legend, gone for now. Hope you guys had a great weekend and stick around for more videos. And that's where I was switching them around the cameras. So, yeah, there we are. Monkey came in, asked if I was done yet. There are her and her moms outside so. Wow, let me see here. But, so I'm gonna throw these clips in here. A couple clips of these and the one with audio and see what you guys think. But I think it's working fine, it is recording now. So, that's good, well, that'll work good. That moved up there because I was tapping the microphone to see which one of these I had on mic. I think I ended up changing them. But there we go. So anyway, enjoy the clips. Thanks for watching, appreciate it. We'll see you guys soon. Bye bye and take care. Are you done? To burst my cell phone. The recording, right, so this one here should be the one with the mic. If I got them hooked up right, I actually had them hooked up the wrong way.


Hey everybody, I'm Lance Coyke, and welcome to another installment of Limber Up with Lance. Today, we're going to focus on shoulder mobility, so my shoulder's a little creaky right now. I want to walk through what it is that I like to do to keep it nice and loose, you know, feeling good, feeling strong, too. This is great to use before a workout, or it's great to use if you're just, you know, you're sitting around and you need a break from your workday or whatever or do this 20-minute routine, and you feel a lot better after. Really quickly, I want to go through the goals of this. So shoulder mobility tends to get limited when more tension happens. So the shoulder is just this joint over here, but it's determined, its mobility is determined by the joints that are next to it.  Okay, so we're going to try to loosen all three of those things up during our exercises here. The first one we're going to do, and if you've seen my other videos, you probably know, we're going to do a rock back. We're going to tweak it a little bit, depending on if you've seen me do it before. First one, we're going to do three sets of five breaths. First one, you're going to start hands and knees.   We're just going to hold there, hold that belly up for five breaths. In through the nose, out through the mouth, keep the belly up as you exhale. Don't, you know, there's this urge to sink. We don't want to sink. And I feel really good because I can tell when I breathe in, my back is expanding. That's a good sign, good first step for us. If you can't pause as long as I pause, that's okay, but you're going to want to work on it. Make sure your head's not falling down toward the ground, and make sure you're not looking forward ahead of you. You want your neck to be just like an extension of the rest of your torso. Good, and we're going to relax. Okay, so that's the first one. Now, if the shoulders are limited, we kind of want to introduce some asymmetry into the torso to help it start moving, help it start loosening up. So we're going to do the same thing. We're going to set up the same way. Exhale, belly comes up slightly. Remember, not crunching down like this. It's just belly comes up slightly. Rock the hips back. We're going to bring both elbows down, and then we're going to reach the left hand away from the body. Okay, when you reach away, I don't want you to push yourself to the right. I want you to let your left shoulder come up towards the ceiling, and your right shoulder come down toward the ground, just like a twist. Okay, I'm going to do the same thing, five breaths. You should notice more air go into your left side, and less going into the right, and rest. Okay, cool. So that's two sets. Last set, you may have guessed this. I don't know. I don't know. Yeah, but last set, we're going to flip the arms. So same thing. Ready, hands and knees, belly up. Rock the hips back, elbow down, right arm away. Remember, I'm not leaning over. I'm just twisting in place. And get a sense for how easy it is relative to the other arm. I generally find it a lot harder to breathe in this position, and that's actually really normal, because of the natural asymmetry of our bodies. One last one. All right, so that's number one. Exercise number two is going to be a clamshell variation, but we're going to throw in some rotation as well.  Knees start stacked, and then the right knee pushes ahead of the left. I'm just looking down at it, and I can see my kneecap, my right kneecap is ahead of my left knee. That's about how much you want there. From there, I'm going to bring the right knee up just slightly, so I know it's supporting itself. I'm trying to shut off this right inner thigh. So if you only feel that, see if you can feel more of the right glute. Now the legs are done. We're just going to hold there. We're going to take the right hand, reach it out, and then we're going to make an arc and reach back. I'm just going to go back, not all the way, because if I go all the way, I've got to lose my hips, right? We want to make sure the right knee stays ahead of the left one, and we're just going to hold right here for five breaths. Remember what I said earlier? We're trying to loosen the pecs, so you should feel a little stretch in your right back here. And we're trying to get some thoracic rotation. That's what we're doing. Twisted. I think that was four. I'm always losing count on these. Beautiful. Okay. Quick break. Give that glute just a second of rest, and then we're going to go again. Same thing. Right knee comes forward. I've just got my belly pulled back slightly. I don't want it sticking out like this. I need to keep my ribs tucked in. Okay. Right knee ahead, right knee up, right hand back. And I want you to try on your exhales to sink back even further without moving that knee. You might feel some left groin muscle as well. That's good too. Last one here. Beautiful. I'm really feeling like I'm loosening up, and hopefully you feel the same way. Let's just go one more. Three is usually the magic number here. If your neck doesn't feel quite right, you might want to try a pillow. With the pecs and the lats tightening up, sometimes the neck tightens up as well. So we want to focus on keeping that relaxed as well. Last one. That's three. And yes, we only do this on this side because the torso is asymmetrical. Our organs, our hearts, only on the left side. So we tend to shut down the right side of the chest more than we shut down the left side of the chest. So we're really trying to reverse that, open up this right chest wall. All right. Exercise number three is the rock back with rotation. So you've maybe seen a rotation on your hands and knees before. I like to throw in the rock back because I want to position the spine as well. So belly comes up, hips rock back, not all the way, just part of the way. And then I take, let's do left hand first. I take fingertips behind the head. I'm going to bring my left elbow down to my right knee. And then I'm going to reverse it, twisted. Okay. Make sure I'm not swaying side to side to get my rotation. It's just a pure twist. We're going to do 10 on each side. Really try to get that last little millimeter of motion when he gets to the top. If you feel super stiff as well, try to exhale as you're coming up. That gets the air out of the way and allows you to twist. Okay. And then we're going to switch sides. I kind of like to reset and then back and then 10 more. And then next one, we're going to stay hands and knees. And we're just going to do a quadruped row. So I like to pull the belly up as well. We got to remember, we don't want the spine to be arching because that reduces our thoracic mobility and therefore our shoulder mobility. So start hands and knees, pull the belly up. And then we're just going to alternate body weight rows. I like to like put my hand on my chest like this. That rotation tends to feel a little bit better. 10 on each side. Like that was four. Nice. All right. Next one's going to be a plank to downward dog. We're going to start loading the pushing muscles a little bit more. So we're going to start and we got to talk about a nice plank first. So body is straight. Again, belly is pulled up. If my back is arched or my hips are sagging or my head is sagging, now this is going to work. So make sure you don't do those. Make sure the hips aren't sagging. The back is an arched and the head's not falling down. Okay. So we're going to come back that with pulling the belly up and even pushing the base of the neck towards the ceiling the whole time. And that's how we're going to hold our plank. And then from there, we're just going to push back to get our heels to the ground and then we come back to the plank. And that's one. We're going to do 10. Try best to keep your knees straight. This can work for a calf inhibition as well. Don't get crazy on the stretch. And the big thing is, especially if you're looking for shoulder mobility, when you push back, you don't want to shrug. You want to push with your armpits, not with your neck. I'm going to say that. Six, seven, eight, nine, cool. All right. Next one's going to look a lot like the downward dog, but we're going to, it's called the bare walk. It's going to be a little bit more movement here. So we're going to set up in kind of a downward dog position. I'm going to be pretty scrunched up. I'm trying to get both heels to the ground if I can. I take a step with one leg. Legs stay straight. And then I take a step with the opposite arm. Okay. It doesn't have to be crazy steps. Just go nice and slow. Make sure we get good twist. You don't want a whole lot of shifting, but a little bit is okay. Not a lot of side to side. And we'll just go back and forth. You don't need a whole lot of room for this one. I usually do about 10 steps on each side, but I haven't counted it all. So we'll see how many we end up doing. I'm just going to go down and back one more time before my shirt falls on. Geez. Again, make sure you're not using the neck, pushing with the armpits the whole time. Nice. All right. Our second to last exercise is going to be the get up to hand. If you're familiar with the Turkish get up, it's like an abbreviated version of that. You're going to land it back, one leg bent, one leg straight, or one arm straight, other leg straight, and then the other arm is about parallel.  See my shoulder come off the ground, turns me over onto this side, and then I pull up to the elbow. This is the get up to elbow. We're going to go to the hand though. Just straighten that arm out. Okay. This really drives the shoulder flexion. And we challenge the mobility on the straight arm. If you don't have that mobility, or you feel yourself shrugging, just stop at the elbow part. Okay. But we're going to try to do five reps up to the hand. Nice and slow. I'm going to scoot a little. I'll switch. I'll give you a back side view here. And then our last exercise is going to be the offset push-up. So push-ups tend to be friendlier than bench presses for their shoulders, because they don't tighten the pecs quite as much as long as you do them correctly. We got to make sure that when we finish, start hands and knees here. When we finish, we want to make the arms nice and long, so the upper back gets kind of stretched out. The shoulder blades come apart and wrap around your body. Now, the offset refers to your stance. So I'm going to put one hand further ahead of the other one. And I'm going to let my body kind of follow that motion. I want a little bit of twist in this. If this, if you don't have the strength to do it from the ground without, you know, really, you know, I need you to be able to get the arms long. So if you can't get them on the, can't get them long when you're on the ground, you've got to elevate your hands, maybe in a rack, maybe on a bench, maybe on a couch, something like that. Okay, we're starting in that good plank position with the hands offset. I come on down. Notice my chest is kind of turning towards the camera here, because my left hand is further towards my feet. And we're just going to do 10. This is hard. You can just stop at five. Cool. And then we're just going to switch. Other side. Very good. And that's our shoulder mobility warm-up thing. Hopefully you're not getting stiff after the push-up. You might need to do this warm-up a few times, not just, you know, it can feel like magic to some people sometimes. But sometimes you need a little repetitive treatment, we'll say, for the stiffness that you have. If you've got major shoulder problems, you're probably not going to get too much out of stuff that you find on the internet. I'm trying to help as many people as I can with this program. That's why I wrote it the way that I did. But it can still be, there can still be nuances that are important. Like if you have frozen shoulder or something like that, you're probably not going to do very well with a lot of the downward dog stuff. So just take all this with a grain of salt. I hope it helps modify things if you need to, if you know how to. And if not, feel free to hire me for coaching. Thanks for watching. If you learned something, hit the like button and subscribe to be notified when I release new videos. If you need something else to watch, you can watch my other videos in the Limber Up series, or I have some. You might be interested in my Buttwink video where we talk about hip mobility when squatting. It's long, there's a lot of detail in there, but that's the idea. It's comprehensive, right? I feel like I didn't leave anything out. So if you're looking to take a deep dive into hip mobility, that might be where you want to go next.