I'd think it's the other way around. The "MSDN" camp would be much more likely to introduce security fixes that would break existing applications whereas the "Raymond Chen" camp would drag feet finding a kluge to let the existing applications continue to work while still enchancing the security. Which one of these options do you think would be easier, cheaper, and less risky?
One solution says "We block this port, fuck the consquences". The other says "Ok, let's add 5,000 registry entries mapped to existing software that uses this port and then write a layer of software to make exceptions based on said list".
Can you cast these structs? I guess not, so when you autobox (Say, you retrieve that struct from a Hashtable of some sort) then you have to assign it to a variable of the exact same struct, right?
Yes, that's true.
If you wanted to cast it to a different type you would need to do something like the following:
int y = 5;
object o = y;// Boxed
short x = (short)(int)o;
Definately a crappy solution. Thankfully generics are going to make this issue go away since value/primitive types are going to be stored natively in collections.
So tell me one thing. You have a bunch of stuff in your struct. How does it get into the stack if you don't store it into the stack or store a reference to it into the stack? That sounds kind of a mystery to me.
I never said they don't go into the stack. In fact, I have been saying that's where they (the value/primitive types) do go. The original point was that the GC does not manage the stack and that if you were creating lots and lots of small variables using the stack (thus bypassing the GC in entirety) would put less pressure on the GC. Less pressure on the GC generally leads to fewer collections and better performance.
You're not very clever are you?
Yeah, just one post is probably enough to judge my brain abilities.
I apologize for my general bitchiness, another poster in this thread has worn my patience down.
Maybe we are just having a terminology problem here. Class-level variables are called static variables in Java. They are attached to a class rather than to an instance of the class. How does this have anything to do with structs? I don't know a lot about C#, so I might be wrong here.
I think we are. When I say class level I am speaking of variables scoped to the class, which can be static or instance. The proper C# word for them is fields, but I didn't think that was a generic enough term. Guess the term I picked was already taken:/
a. Primitive types are stored as is. Hence they don't need any garbage collection. They are destroyed when popped from the stack or when an Object holding them is garbaged collected. Is that what you call "value type"?
Yes, exactly. In C# they are called value types and defined by using the struct keyword as opposed to the class keyword. Lots of the "built in types" are value. Int, Float, Double, etc.
Non-primitive types are Object subclass (Except for arrays, but still the rest stands). When no more reference are hold to them they are GCed. (Gets more complex than that with circular reference, but not much).
We refer to these as reference types. Same thing with garbage collection (circular reference not really an issue because a tree starting at root objects is walked, anything that is unreachable is GC'd. Does Java use a similar strategy?)
Static variables (class variables as opposed to instance variables) can be garbaged collected as well, when their class get GCed. Classes can get GCed when their ClassLoader gets garbaged collected. I'm not a specialist here, so there might be other conditions to that, but classes (not instances) can also get garbaged collected.
Not really sure how the CLR GC handles statics, guess that's something for me to add to the research list.
You're not very clever are you? How about storing class level value type variables along with the class, just not as a reference. This lets those get collected along with the class itself. Block level (local) value types can be placed on the stack where you don't have to collect them.
Now if you need to assign a value type to a declared type of "Object" (which is a reference type) it DOES get a little uglier. Something called "Boxing" happens. I avoid the ugliness of boxing by not doing it. Pretty simple solution there.
And exactly how does using the stop the 64 bit version of the CLR from performing? You've made another bad assumption.
Interesting note. There was an article on slashdot a while back which bemoaned the fact that modern programmers did not have enough of a low level understanding of computing these dayes. I poo poo'd that stating that "knowing a language should be enough". Wow, was I EVER wrong.
How about you just create a class with 10 double instance variables? This way it would look (and act) pretty much like your struct. Just a thought. When I moved from C to C++ I stopped using structs for that reason.
Or I could just write it in GWBASIC/BASICA if I'm willing to go that far to turn my code into shit. I'd really rather just keep my local variables local, thank you.
Oh the horror. Are you trying to say that C# treats structs outside the virtual machine or something and it thus can create them or access them faster than C# classes? Please elaborate.
They are within the VM, but the garbage collector does not allocate them nor does it deallocate them. You see, reference types are allocated on the threads stack. In addition to this reduced pressure on the GC value types are quicker to manipulate because they do not require a pointer dereference, and as an added bonus you can create them all day long and ever force a GC collection. These are all very simple and understood concepts, really. Pick up any halfway decent C (lack of # intentional) and it'll explain the rest.
Um, anywhere that a method gets called continuously that has a large number small local variables (int, double, etc) that are used in calculations. My choices are to either pass in a re-usable object (which sucks when you have a method with 10+ local doubles) or to make the thing class level (if the method happens to be in the calling class) or to stash it in some static class that both of my classes now need to know how to interact with. Pretty much every option sucks, save defining the thing where you need it. Hell, if I was programming Java performance would have to suffer and I would not think twice about it (unless I *had* to) simply to avoid the maintenance headeaches of the alternatives.
Also note that structs can be created, manipulated, and destroyed with Java with JNI and CNI.
The entire point of using structs in.NET is performance and your solution is to wrap them with JNI which has its own overhead? Maybe you're still stuck on the idea that the only reason they exist is to gived pinned memory which can be used to interoperate with older C API calls. False. If that were the case NONE of the native types would be value. The value type would be something esoteric that was only dragged out when you needed to P/Invoke.
Java 1.5 has auto unboxing. Same thing.NET has. This was added on top of JSR-14. You are probably looking at the original generics design for Java 1.5 on googled pages. Its been updated.
It's quite possible that my general ignorance about most things Java is showing. I'll dig into this and see how it compares to the (admitadly date) materials I have read.
Wow, you ARE clueless. Are you having the same conversation as anyone else here?
Most API's in both Java and.NET wrap native code that takes care of most hardware and memory intensive operations such as guis.
Which is not the point. These operations still take up memory in your address space that is managed by the garbage collector. And since a paint routine is not a usually a single line the chance that the GC could decide to collect in the middle exists.
For short lived objects where there is no API its best to reuse objects rather than create new ones since in both languages the allocation process hits performance much worse than the deallocation process.
I can't speak for Java, but for CLR apps you are dead wrong. Allocations are made linearly from a contiguous chunk of memory (managed heap) that the GC holds. You ask for MyClass and it gives you the next availible slot of memory in it's heap, and updates the startpoint to initial + sizeof(MyClass). Hell, its faster than a C runtime call to malloc because it doesn't have to go sniffing around for a large enough block.
The perf hit comes when it's time to deallocate. Remember, though that deallocations are non-deterministic and happen when the GC needs more memory. So although you will not see the performance hit when an object goes out of scope or when you call it's finalize method you still don't have a perf hit. Only when the GC cleans house. At this point (which should still be considered deallocation, even though it's usually an allocation that prompts the event) things slow down. All object trees have to be walked and those that are unreachable are collected and the managed heap compacted.
What value types do is bypass the garbage collection. Never adding items to it. Making it so that the collection phase does not need to happen nealy as often. They are also faster to allocate and take NO TIME to deallocate.
Not a clue on how the Java GC works, so instead of making assumptions I'll just leave it at that.
Java 1.5 (now at beta 2) generics are a part of the VM. It also supports auto unboxing like.NET.
*SIGH*. No, they are part of the COMPILER. Which generates a load of shit bytecode with tons of typecasts that ARE bad for performance. See, the VM RUNS the bytecode. The Compiler MAKES the bytecode. In.NET it is a change to the compiler AND the VM. The VM knows what they are. It really does hold the collection of objects as the native type. It is NOT ignorant of the fact that is dealing with a colletion of said native type, as the Java VM IS.
Structs? Have you heard of classes?.NET included structs which was nice but its only there for compatibility with older languages like C. You shouldnt use them for straight.NET development. Its up there with continueing to use pointers. If you have to have those sort of things why even use.NET?
Huh? Structs are there to give you stack based storage outside of the GC so that if you are creating and destroying thousands, hundreds of thousands, or millions of variables the GC doesn't have to constantly collect. Even though gen zero collections are fast it's still an issue.
Generics exist in Java. They existed as open source projects and are now part of the language (see version 1.5). Ive heard this argument in the past:.NET has this feature and Java doesnt. Apparently no one gave thought to the idea that Sun would just put out a new version with that feature included also.
You obviously don't understand the distinction he was making. Let me try harder for you. In Java generics generate the same old code as always and are really just a fancy way of letting you add type safety at compile time. In.NET they are actually part of the backend. The VM. In Java, in the VM they're all just boxed objects. And lots of typecasts. Shitty. Google around for better explainations.
A funny thing about Webster. Look up the word "nigger". Find the entry for "Term of endearment amongst African American friends". What, you don't see that entry?
Shit, you'd better go tell 10% of the United States population that they have been misusing the word for the last 20 years.
Dictionaries are not always up to date and its the language that defines the dictionary. NOT the other way around. Webster doesn't make up new words for people to start using. People make up new words and sooner or later Webster puts them in his little book.
With the exception of #6 (and a slight modification to #5) this sounds a bit like the open source development model to me.
And really, what's up with all of this bitching about MS bundling and eliminating the competition? If Linux had 90% of the market these same companies would STILL be out of business.
PS. Go ahead and mod this as flamebait, because given the fact that I know just how irritating it will be to the zealots IT IS. But its still the truth and no amount of teeth gnashing is going to change that.
I have to continue to disagree on that point. The GPL is quite restrictive, IMO. Perhaps lose the free and just start calling it "GPL'd software". That would at least force someone to find out what it meant before making an assumption about the license.
Unfotunately you can't. But since when is an IDE a "development tool" to the likes of you? You can get your free copy over every one of their compilers at www.microsoft.com, though. And a copy of nmake, for what it's worth.
I think you're right. It is impossible to distill the entire license down to one or two words. What will have to happen is that enough people know what is meant by "Open Source" that it, in effect, becomes its own word.
I know mechanics and carpenters that truly care about their fine tools and are dedicated to certain styles and brands. I know seamstresses who care deeply about their tools.
I'm sure you'll manage to dig something up on some message board to totally prove me wrong, but I've honestly never seen a DeWalt user and a Porter Cable user have a heated discussion, resorting to profanity over who makes the best plunge router (DeWalt does, by the way).
But I do take your point. I'd like to see you posting with an account, as you're eloquent and have something real to add to the conversation. Hate to miss it in the future on account of the 0 score.
Fun at work is important, and technical challanges can be a big part of that. And users of any operating system who are doing anything non-trivial can ALL get that in spades, I am quite certain. But then the best jobs I have had have never been those with the most interesting challanges. They've been those with the best people. It's not a line of reasoning, but a fact that a lot (a LOT) of people value social interaction. If you don't fall into that category and even the challanges that CAN be had whilst using (gasp) windows are not enough because you can't have the thrill of "sticking it to billy g", then I truely feel sorry for you.
Your operating system should not be your lover, mistress, religion, god, or even faithful companion. It's a tool and nothing more.
But even open source software (GPL and the like) is restricted. The restrictions might seem fair and right to you (hell, they might actually be fair and right, period), but they are still restrictions. Public domain is unrestricted. GPL is not.
At Georgia Tech everything in class is done in Linux after the first Scheme class. If the future coders don't know Microsoft stuff they won't use it or push it in their jobs.
I'm not a native, but I know five tech grads fairly well. One owns that really big company that has something to do with security. He's not a zealot by any stretch, runs windows on (at least the one he shows home movies on) his personal PC, has a phone with Pocket PC. Come to think of it, did he graduate?
One programs for windows exclusivly, but he does prefer OpenGL over DX, so I guess that does make him a little "unixy". But Linux? He had the chance when one of our server components went that way and sat tight in the windows group.
One is a java developer, but he does do that under windows. His application reads MS project files. Pretty platform agnostic fellow, but most of his work before the Java was C++ (windows).
Another is doing Java applications now, not sure of the platform, but when I lost contact with him he was coding VB6. With a doctorate. He used really big words in his documentation. Man that was annoying.
And finally one true unixite. After graduating a few years ago she moved up north to the frozen tundra to work for HP on Tru64. Hi, lemony!
By the way, my point is that ideals and what you like tend to go out of the window when it comes to getting real work done and/or a steady paycheck.
No, but you DID miss the releases for Solaris and HPUX.
I'd think it's the other way around. The "MSDN" camp would be much more likely to introduce security fixes that would break existing applications whereas the "Raymond Chen" camp would drag feet finding a kluge to let the existing applications continue to work while still enchancing the security. Which one of these options do you think would be easier, cheaper, and less risky?
One solution says "We block this port, fuck the consquences". The other says "Ok, let's add 5,000 registry entries mapped to existing software that uses this port and then write a layer of software to make exceptions based on said list".
Flamebait my ass. Try "dead on balls accurate".
Can you cast these structs? I guess not, so when you autobox (Say, you retrieve that struct from a Hashtable of some sort) then you have to assign it to a variable of the exact same struct, right?
// Boxed
Yes, that's true.
If you wanted to cast it to a different type you would need to do something like the following:
int y = 5;
object o = y;
short x = (short)(int)o;
Definately a crappy solution. Thankfully generics are going to make this issue go away since value/primitive types are going to be stored natively in collections.
So tell me one thing. You have a bunch of stuff in your struct. How does it get into the stack if you don't store it into the stack or store a reference to it into the stack? That sounds kind of a mystery to me.
:/
I never said they don't go into the stack. In fact, I have been saying that's where they (the value/primitive types) do go. The original point was that the GC does not manage the stack and that if you were creating lots and lots of small variables using the stack (thus bypassing the GC in entirety) would put less pressure on the GC. Less pressure on the GC generally leads to fewer collections and better performance.
You're not very clever are you?
Yeah, just one post is probably enough to judge my brain abilities.
I apologize for my general bitchiness, another poster in this thread has worn my patience down.
Maybe we are just having a terminology problem here. Class-level variables are called static variables in Java. They are attached to a class rather than to an instance of the class. How does this have anything to do with structs? I don't know a lot about C#, so I might be wrong here.
I think we are. When I say class level I am speaking of variables scoped to the class, which can be static or instance. The proper C# word for them is fields, but I didn't think that was a generic enough term. Guess the term I picked was already taken
a. Primitive types are stored as is. Hence they don't need any garbage collection. They are destroyed when popped from the stack or when an Object holding them is garbaged collected. Is that what you call "value type"?
Yes, exactly. In C# they are called value types and defined by using the struct keyword as opposed to the class keyword. Lots of the "built in types" are value. Int, Float, Double, etc.
Non-primitive types are Object subclass (Except for arrays, but still the rest stands). When no more reference are hold to them they are GCed. (Gets more complex than that with circular reference, but not much).
We refer to these as reference types. Same thing with garbage collection (circular reference not really an issue because a tree starting at root objects is walked, anything that is unreachable is GC'd. Does Java use a similar strategy?)
Static variables (class variables as opposed to instance variables) can be garbaged collected as well, when their class get GCed. Classes can get GCed when their ClassLoader gets garbaged collected. I'm not a specialist here, so there might be other conditions to that, but classes (not instances) can also get garbaged collected.
Not really sure how the CLR GC handles statics, guess that's something for me to add to the research list.
1. Wrong wrong wrong.
2. Wrong wrong wrong.
You're not very clever are you? How about storing class level value type variables along with the class, just not as a reference. This lets those get collected along with the class itself. Block level (local) value types can be placed on the stack where you don't have to collect them.
Now if you need to assign a value type to a declared type of "Object" (which is a reference type) it DOES get a little uglier. Something called "Boxing" happens. I avoid the ugliness of boxing by not doing it. Pretty simple solution there.
And exactly how does using the stop the 64 bit version of the CLR from performing? You've made another bad assumption.
Interesting note. There was an article on slashdot a while back which bemoaned the fact that modern programmers did not have enough of a low level understanding of computing these dayes. I poo poo'd that stating that "knowing a language should be enough". Wow, was I EVER wrong.
What sort of drugs are you on, and would you mind sending me some?
How about you just create a class with 10 double instance variables?
Oh, and BTW that WOULD be a class. The doubles are the structs here, not the entire class. The doubles.
How about you just create a class with 10 double instance variables? This way it would look (and act) pretty much like your struct. Just a thought. When I moved from C to C++ I stopped using structs for that reason.
Or I could just write it in GWBASIC/BASICA if I'm willing to go that far to turn my code into shit. I'd really rather just keep my local variables local, thank you.
Oh the horror. Are you trying to say that C# treats structs outside the virtual machine or something and it thus can create them or access them faster than C# classes? Please elaborate.
They are within the VM, but the garbage collector does not allocate them nor does it deallocate them. You see, reference types are allocated on the threads stack. In addition to this reduced pressure on the GC value types are quicker to manipulate because they do not require a pointer dereference, and as an added bonus you can create them all day long and ever force a GC collection. These are all very simple and understood concepts, really. Pick up any halfway decent C (lack of # intentional) and it'll explain the rest.
Give an example of where this is needed.
.NET is performance and your solution is to wrap them with JNI which has its own overhead? Maybe you're still stuck on the idea that the only reason they exist is to gived pinned memory which can be used to interoperate with older C API calls. False. If that were the case NONE of the native types would be value. The value type would be something esoteric that was only dragged out when you needed to P/Invoke.
.NET has. This was added on top of JSR-14. You are probably looking at the original generics design for Java 1.5 on googled pages. Its been updated.
Um, anywhere that a method gets called continuously that has a large number small local variables (int, double, etc) that are used in calculations. My choices are to either pass in a re-usable object (which sucks when you have a method with 10+ local doubles) or to make the thing class level (if the method happens to be in the calling class) or to stash it in some static class that both of my classes now need to know how to interact with. Pretty much every option sucks, save defining the thing where you need it. Hell, if I was programming Java performance would have to suffer and I would not think twice about it (unless I *had* to) simply to avoid the maintenance headeaches of the alternatives.
Also note that structs can be created, manipulated, and destroyed with Java with JNI and CNI.
The entire point of using structs in
Java 1.5 has auto unboxing. Same thing
It's quite possible that my general ignorance about most things Java is showing. I'll dig into this and see how it compares to the (admitadly date) materials I have read.
Wow, you ARE clueless. Are you having the same conversation as anyone else here?
.NET wrap native code that takes care of most hardware and memory intensive operations such as guis.
.NET.
.NET it is a change to the compiler AND the VM. The VM knows what they are. It really does hold the collection of objects as the native type. It is NOT ignorant of the fact that is dealing with a colletion of said native type, as the Java VM IS.
Most API's in both Java and
Which is not the point. These operations still take up memory in your address space that is managed by the garbage collector. And since a paint routine is not a usually a single line the chance that the GC could decide to collect in the middle exists.
For short lived objects where there is no API its best to reuse objects rather than create new ones since in both languages the allocation process hits performance much worse than the deallocation process.
I can't speak for Java, but for CLR apps you are dead wrong. Allocations are made linearly from a contiguous chunk of memory (managed heap) that the GC holds. You ask for MyClass and it gives you the next availible slot of memory in it's heap, and updates the startpoint to initial + sizeof(MyClass). Hell, its faster than a C runtime call to malloc because it doesn't have to go sniffing around for a large enough block.
The perf hit comes when it's time to deallocate. Remember, though that deallocations are non-deterministic and happen when the GC needs more memory. So although you will not see the performance hit when an object goes out of scope or when you call it's finalize method you still don't have a perf hit. Only when the GC cleans house. At this point (which should still be considered deallocation, even though it's usually an allocation that prompts the event) things slow down. All object trees have to be walked and those that are unreachable are collected and the managed heap compacted.
What value types do is bypass the garbage collection. Never adding items to it. Making it so that the collection phase does not need to happen nealy as often. They are also faster to allocate and take NO TIME to deallocate.
Not a clue on how the Java GC works, so instead of making assumptions I'll just leave it at that.
Java 1.5 (now at beta 2) generics are a part of the VM. It also supports auto unboxing like
*SIGH*. No, they are part of the COMPILER. Which generates a load of shit bytecode with tons of typecasts that ARE bad for performance. See, the VM RUNS the bytecode. The Compiler MAKES the bytecode. In
Structs? Have you heard of classes? .NET included structs which was nice but its only there for compatibility with older languages like C. You shouldnt use them for straight .NET development. Its up there with continueing to use pointers. If you have to have those sort of things why even use .NET?
.NET has this feature and Java doesnt. Apparently no one gave thought to the idea that Sun would just put out a new version with that feature included also.
.NET they are actually part of the backend. The VM. In Java, in the VM they're all just boxed objects. And lots of typecasts. Shitty. Google around for better explainations.
Huh? Structs are there to give you stack based storage outside of the GC so that if you are creating and destroying thousands, hundreds of thousands, or millions of variables the GC doesn't have to constantly collect. Even though gen zero collections are fast it's still an issue.
Generics exist in Java. They existed as open source projects and are now part of the language (see version 1.5). Ive heard this argument in the past:
You obviously don't understand the distinction he was making. Let me try harder for you. In Java generics generate the same old code as always and are really just a fancy way of letting you add type safety at compile time. In
Funny that a BSD user would not have at least heard about rotor since it was specifically released for BSD.
Oh, and here is your link.
Rotor
I believe that was Avis you are thinking about.
We Try Harder
A funny thing about Webster. Look up the word "nigger". Find the entry for "Term of endearment amongst African American friends". What, you don't see that entry?
Shit, you'd better go tell 10% of the United States population that they have been misusing the word for the last 20 years.
Dictionaries are not always up to date and its the language that defines the dictionary. NOT the other way around. Webster doesn't make up new words for people to start using. People make up new words and sooner or later Webster puts them in his little book.
Had a job a few years ago where build breakers had to bring in a box of donuts. Sadly, the build was only broken about once a quarter.
With the exception of #6 (and a slight modification to #5) this sounds a bit like the open source development model to me.
And really, what's up with all of this bitching about MS bundling and eliminating the competition? If Linux had 90% of the market these same companies would STILL be out of business.
PS. Go ahead and mod this as flamebait, because given the fact that I know just how irritating it will be to the zealots IT IS. But its still the truth and no amount of teeth gnashing is going to change that.
Not a requirement, as the herpes are DEFINATELY free as in beer (and freedom).
I have to continue to disagree on that point. The GPL is quite restrictive, IMO. Perhaps lose the free and just start calling it "GPL'd software". That would at least force someone to find out what it meant before making an assumption about the license.
1. Where can I get my free copy of Visual Studio?
Unfotunately you can't. But since when is an IDE a "development tool" to the likes of you? You can get your free copy over every one of their compilers at www.microsoft.com, though. And a copy of nmake, for what it's worth.
I think you're right. It is impossible to distill the entire license down to one or two words. What will have to happen is that enough people know what is meant by "Open Source" that it, in effect, becomes its own word.
I know mechanics and carpenters that truly care about their fine tools and are dedicated to certain styles and brands. I know seamstresses who care deeply about their tools.
I'm sure you'll manage to dig something up on some message board to totally prove me wrong, but I've honestly never seen a DeWalt user and a Porter Cable user have a heated discussion, resorting to profanity over who makes the best plunge router (DeWalt does, by the way).
But I do take your point. I'd like to see you posting with an account, as you're eloquent and have something real to add to the conversation. Hate to miss it in the future on account of the 0 score.
Fun at work is important, and technical challanges can be a big part of that. And users of any operating system who are doing anything non-trivial can ALL get that in spades, I am quite certain. But then the best jobs I have had have never been those with the most interesting challanges. They've been those with the best people. It's not a line of reasoning, but a fact that a lot (a LOT) of people value social interaction. If you don't fall into that category and even the challanges that CAN be had whilst using (gasp) windows are not enough because you can't have the thrill of "sticking it to billy g", then I truely feel sorry for you.
Your operating system should not be your lover, mistress, religion, god, or even faithful companion. It's a tool and nothing more.
But even open source software (GPL and the like) is restricted. The restrictions might seem fair and right to you (hell, they might actually be fair and right, period), but they are still restrictions. Public domain is unrestricted. GPL is not.
At Georgia Tech everything in class is done in Linux after the first Scheme class. If the future coders don't know Microsoft stuff they won't use it or push it in their jobs.
I'm not a native, but I know five tech grads fairly well. One owns that really big company that has something to do with security. He's not a zealot by any stretch, runs windows on (at least the one he shows home movies on) his personal PC, has a phone with Pocket PC. Come to think of it, did he graduate?
One programs for windows exclusivly, but he does prefer OpenGL over DX, so I guess that does make him a little "unixy". But Linux? He had the chance when one of our server components went that way and sat tight in the windows group.
One is a java developer, but he does do that under windows. His application reads MS project files. Pretty platform agnostic fellow, but most of his work before the Java was C++ (windows).
Another is doing Java applications now, not sure of the platform, but when I lost contact with him he was coding VB6. With a doctorate. He used really big words in his documentation. Man that was annoying.
And finally one true unixite. After graduating a few years ago she moved up north to the frozen tundra to work for HP on Tru64. Hi, lemony!
By the way, my point is that ideals and what you like tend to go out of the window when it comes to getting real work done and/or a steady paycheck.