Programming Matters

My thoughts on all things technical, programming and otherwise

24 years of game programming: thrills, chills and spills: part 3 of 3

Filed under: Game Industry, Programming, General — by Steve Riley at 7:37 pm on Tuesday, May 15, 2007

If you haven’t read the first and second parts of this article, you’ll probably want to check them out here and here.

So I was working with a company that did 3D development for games! It was 1998 and things were still fresh and new in that area. The three API’s of mention were Glide, Direct 3D and OpenGL. I was working with some amazing artists and programmers and was glad to be learning more about the ins and outs of 3D development and tools. This was my first taste of a scene graph using Paradigm Entertainment’s Viskit. Scene Graphs are amazing things - and I was learning everything I could. Viskit was based on SGI’s Performer and like OpenGL - they had done something really, really right when crafting this API. Viskit sat effortlessly on top of OpenGL or Direct3D. I ended up working quite a bit on our Multigen loader to get all the bells and whistles supported. We used Max for our prerendered scenes but at this point Multi-Gen creator was huge in developing real-time models. It was a great app that made both programmers and artists feel immediately at home. Scene Graph nodes could be mapped very easily to Multi-Gen nodes. It was a perfect match.

As usual my dedication ran high. I was able to entice a truly stellar programmer from my time in NJ to live with me a significant portion of the month so he could code on the team as well. I worked with two artists that two this day I have to say are second to none. We created an amazingly beautiful world with truly stunning environmental effects. It was enthralling. In the end though small companies with only one project are fraught with peril. In 2000 Aeon closed it’s doors and my love for Viskit took me to my next job at console developer Paradigm Entertainment. They had built a version of Viskit that ran on all the next-gen consoles including the X-Box, Game Cube, PS/2 and even the dreamcast. It could still be baselined on the PC as well. This was my first time working with consoles - a fixed format machine, finally!
It was now 2000 and I found myself in Dallas, Texas, In typical game industry fashion several weeks after joining Paradigm they sold themselves to Infogrammes. However, they still were able to call their own shots for my time at the company. It was awesome having 3 or 4 teams working with 3D technology for multiple consoles. This technology was developed by a dedicated core technology group - I hadn’t been lucky enough to work with a company big enough to have this luxury before. They were the think tank of the company always getting all the heavy pressures but coming up with some truly stunning innovations. All of our artists were using Maya - which worked well, it supported a group hierarchy for scenes like Multi-Gen creator had previously.

Consoles are truly outstanding beasts to develop for. In all the years of working on the PC I had always dreamed of being able to develop for fixed platforms. You could know that once your testing was done it was good to go - no surprises based on machine configurations later in the pipeline. C++ was still the defining factor in game programming, although plenty of PS/2 code was written in Microcode as well. Common acceptance of scripting languages for high level prototyping was still a few years off. The best part about working at Paradigm was access to resources. When teams ramped up they could have 8-10 artists and almost as many coders. Things could really come together fast.
2003 found me back in Virginia where I started working for ITSpatial - a company that did 3D representations of cities a la Google Earth … before Google Earth had been around. In fairness there was Keyhole, but what ITSpatial offered was a different kind of thing all together. ITSpatial built a product that provided data integration and fusion in an environment that supported 2D and 3D mapping. This was perfect for command and control applications, situational awareness and emergency training. It was really one big serious game and had many of the elements of a full fledged game development effort and content production pipeline. The only thing difference was the price point of the product and the number of shipping units.

ITSpatial was strong and knew a lot about sales and business development. They were phenomenal sales people. I will always be amazed at how effortlessly they were able to get potential clients in the building, looking at demos - 3 or 4 times a week some weeks. They really were devoted to finding and wooing clients. This is a skill I’ve still got a long way to go on. I guess in some ways I’m still 100% a programmer at heart:)

In 2005 I broke away and this time started my own company Eureka 3D, Inc. I’m more of a hired gun/contractor with the luck to have access to a lot of other proven hired gun contractors. Eureka3D has worked on entertainment 3D, GIS and I’ve really boned up on my web programming skills in the last two years. Deep down inside I’m still wanting to get back “into the game” and sink my teeth into that big 2 year development project. Right now my pipeline is very full and I really am enjoying what I’m doing - so no complaints!

Here we are in 2007. What have I learned from the game and serious game industry after all these years? So much… I’ve worked with top notch programmers, others who couldn’t program their way out of a paper bag; I’ve worked with great artists, and a young up and coming project manager who was one of the sharpest guys I’ve ever met. I’ve worked with some truly genius biz-dev types that knew how to sell and pitch to clients. In 24 years every theory on project management for software/hardware/games has been debated, turned over and debated again much to my chagrin. I’ve seen every element of the business from pitching the contracts, building proof of concepts to final testing and delivery/deployment/distribution. I’ve learned a thing or two about politics and how important it is to avoid if at al possible. I’ve literally seen programmers in drop-down, drag out fights (visiting programmers from another company no less!). Religious wars over version control systems, graphics api’s, and taking on the latest new technology - been there, seen that.
The main thing I’ve learned however is that I thrive on the high-intensity, creative, ingenius environment that games and serious games involve. Finding a team that works well together, or a few truly brilliant individuals makes it all so worth while. I know I want to keep raising the bar and never lose the adventure. Because in the end it’s about the product, the team, and the experience. What an amazing 24 years it’s been!

del.icio.us Digg Reddit dzone Live

The Top 10 Attributes of a Great Programmer

Filed under: Programming, General — by Steve Riley at 1:25 am on Monday, February 5, 2007

With all the latest attention again on what does and doesn’t make a good programmer, I couldn’t help but put together my own top 10 list.

The Thinker

  1. Being a great problem solver.
  2. Being driven and lazy at the same time.
  3. Ability to understand other people’s code
  4. Having a passion for programming
  5. Loving learning for the sake of learning
  6. Being good at math
  7. Having good communications skills
  8. Strong debating skills
  9. Extreme optimism
  10. Extreme pessimism
    After putting together this list some aspects surprised me, and I was the one who put together the list. So let me explain each in detail.These attributes describe those I’ve found in pretty much every great programmer I’ve come across. There were a number that fell through the cracks and I’ll explain those later.

    1. Being a great problem solver - Hopefully everyone recognizes this one. Most good programming is all about being able to find solutions where others can’t see them. If you don’t have this skill the others matter far less.
    2. Being driven and lazy at the same time - This one surprises some people. Programmers question things and are often “too lazy” to take the long route. The will spend countless cycles trying to simplify the problem and simplify their task. That said they having a burning need to get the job done, they just want to do it as efficiently as possible.
    3. Ability to understand other people’s code - This point is essential but cuts some good programmers off from being great programmers. It doesn’t matter how well you can rewrite everything yourself - you need to be able to work with other people’s code on existing projects, lean on opensource in new projects, and learn good techniques from the code base that is already out there.
    4. Having a passion for programming - on some level you have to love programming for programming’s sake. I suppose to be truly great at anything you have to love it in most cases.
    5. Loving learning for the sake of learning - Programming is a moving target. Unless you love the art of edification you will sink fast. There are no laurels to rest on and no one cares what you did yesterday. Unless you are aware of the techniques on the horizon, you won’t be ready to embrace them when they become relevant.
    6. Being good at math - Different people will have different opinions here - but at the very least having a strong grip on pre-Calculus math. I’ve never seen a great programmer without a solid grasp of at the very least algebra and trig.
    7. Having good communications skills - This doesn’t mean that they can communicate with anyone and everyone. Specifically this means that they are able to clearly express their thoughts on their own terms. I’ve met plenty of great programmers who couldn’t communicate well with the world at large. However, given someone to talk to who understands the problem domain, they were all able to clearly state the problem and the solutions proposed.
    8. Strong debating skills - This follows the same logic as #7.
    9. Extreme optimism - Great programmers I have encountered have an insane certainty they can get the job done once they have chewed on it a bit.
    10. Extreme pessimism - Great programmers I have encountered have an insane insistence that when they lack the information needed to make a good judgment that they won’t be able to make one at all.

    Some of the things I instinctively wanted to put on the list but couldn’t say were true of at least 95% of great programmers include the following:

    1. Being extremely organized - Understanding when and where organization is important, yes. But anal attention to detail is something present in great programmers as often as it is people in other disciplines.
    2. Being good at managing other people and or programming projects - Somehow these skill sets are wonderfully synergistic when they sit side by side, but management and programming are often completely different disciplines.
    3. Being able to write good design documents - Same as #2. This skill may make some people better programmers and I am in favor of learning it. However, plenty of great programmers I have encountered couldn’t write a coherent design doc if their life depended on it. This will know doubt be debated by heavily by some.
    4. Having an ability to estimate time frames - Once again like #2. This is an acquired skill and a very useful one. However, I have seen absolutely zero correlation between great programmers and estimation skills.
    5. Prolific reading of tech books - I do this all the time myself, but many great programmers don’t. Let me be clear though - most programmers who aren’t all that hot could definitely benefit from bootstrapping their skills with some good reading.
    6. Ability to transfer their programming skills to any programming domain - Although many can, some great programmers can’t, or refuse to, grok other programming technologies. I like to think that this is a “refuse to” situation.
    7. Write code that is correct the first time around - Many great programmers commonly have syntactic issues flagged by compilers or at runtime interpretation. Some are zealots about the details the first time out, others are much more “extreme” in this area.
    8. Having other areas of great skills - some great programmers are good at only one thing - programming.
    9. Social or antisocial - Great programmers come in both forms.
    10. Are someone you’d want on you team - Unfortunately some of them just can’t work with others well.
del.icio.us Digg Reddit dzone Live

Why Silver Bullets Tarnish Over Time - New Paradigms Getting Thrashed in the Field

Filed under: Software Technology, Development Philosophy, Programming, General — by Steve Riley at 12:30 am on Friday, January 19, 2007

This concept really applies to much of life, however, computer science in particular.

Why is is that new ways of doing things can have remarkable success when they are at “the discovery stage” and end up being useful but disappointing in the field? Object oriented programming turns into spaghetti class interdependencies and deep hierarchies in day to day use. A giant leap forward and two steps back. Software patterns turn into misuse and abuse of the Singleton pattern and inappropriate shoehorning. Extreme programming becomes an excuse to write unmaintainable code that passes each and every unit test. Simplicity becomes an excuse to build things so bare bone as to become unusable. It seems like each new “promising technique” becomes troublesome once it goes mainstream. Still worth the trouble, but troublesome all the same.

You may find yourself scratching your head about why such issues aren’t discovered before they gain mass acceptance. Why when things are in “the R&D” phase they perform so well. Even when these same things are tested in limited circles on “real world problems” they continue to seem like the next silver bullet.

The answer unfortunately is as hard to swallow as it is simple. Early on the people developing and working with these new technologies are quite often some of the best in the field and the smartest guys out there. By the time the concept migrates to the other 90% of the coding world it finds itself slammed against the middle and trailing ugly end of the bell curve. These portions of the curve will often times misunderstand and misuse the new tools and techniques presented to them. It’s during these phases that the backlash usually kicks in. Guidelines and rules must be created to keep the average programmer from hanging himself with too much rope.

Often times new paradigms go through a few separate stages of development and acceptance. In stage 1 the really smart R&D types hit it. These people are actually great at creating new solutions that are both groundbreaking and elegant. Once these “conceptual entrepreneurs” have firmed things up it is ready for stage 2. In stage 2 the brightest of the “real world group” is brave enough to tackle integrating these concepts into production code. They become evangelists of the techniques they have had so much success with. Stage 3 involves more risk takers embracing the techniques advocated by stage 2. They pour over the concepts involved, grok them and integrate them into their code bases. It’s at stage 4 that the tide starts to turn. At stage four the middle of the bell curve is beginning to be pierced. The new mantra is gaining success. By stage 5 you have everyone accepting the new paradigm as “the way to go” based more on appeal to authority and peer pressure. At this stage a significant number may not understand the new techniques at all. They will advocate them but only graft them on top of their existing ways of doing things.

I like to think of myself as a stage 3 integrator. At this point things have hit my comfort zone and they are worth a try. I will do everything I can to understand a new technique, but by no means have created it or been the true dare devil integrating it at stage 2 into production code. Later down the pipe when I see these concepts misused and abused - I avidly follow the “shoring up” techniques to keep people from blowing body parts off my misusing a new technique.

No matter what the latest silver bullet appears to be, it is merely getting it justly deserved 15 minutes of fame during its integration period. These techniques will live on but the focus will move on. It’s important not to throw the baby out with the bath water. New techniques may disappoint after several years of growth - but in the end they often stay part of our process. Object orientation, design patterns, components, agile programming, the list goes on. Don’t forget that silver bullets are still bullets even when they tarnish. Just because a concept hasn’t completely lived up to its hype doesn’t make it a great and useful part of your process.

del.icio.us Digg Reddit dzone Live

24 years of game programming: thrills, chills and spills: part 2

Filed under: Game Industry, Programming — by Steve Riley at 12:36 am on Wednesday, January 10, 2007

If you haven’t read the first part of this article, you’ll probably want to check it out here.

1995 - Legend Entertainment - My First Industry Years

I was finally working full-time in the game industry at Legend Entertainment and couldn’t be more thrilled! No more sandwiching game coding in between contracting gigs. I was with a company that has produced a large number of award winning titles, gotten them published and distributed - all with a company of under 20 people!

I started out coding in Watcom C on a daily basis and working in crunch time on a game called Star Control 3. I was thrilled working with industry veterans from the Zork era! We even had an inhouse testing team. I can honestly say I’ve never worked at a company that ran as smoothly and without contention as the time I worked at Legend. There were blips on the radar, but over-all development fell into place extremely well during my years there. This is a testament to team dynamics. Get a good team that works well together and keep them together.

I learned so much while at Legend. These guys were experts at what they did. It was amazing being able to sit in on the entire development process - creative, technical and other. A lot of my best practices I learned while I was at Legend and over the years this feeling never left me. We’re talking about game development done the way everyone dreams of it being done. Projects would often times have just a few coders on them for most of their development cycle. I can say that I never saw a game canceled while I was at Legend - and had never heard of one being canceled before I joined them. They ran lean and mean and couldn’t afford that kind of wasteful slack. This had an extremely positive effect on morale needless to say.

At the time we were writing DOS based games that used SVGA libraries to build 256 color 640×480 games. The WATCOM compiler let us overcome DOS’ one meg memory barriers and access all of extended memory. We had to support a dizzying array of low tech video cards and collection of VESA video modes. But boy was it fun.

From a philosophy standpoint I finally started to get behind the understanding that old rules change. Optimization was still king, but design came first. Things I had previously considered wasteful were trivial on 486 systems with 4 meg of available memory. I began to realize that when working with a group of programmers design and communication were of paramount importance. These things had to be worked at, they just didn’t fall out naturally.

By 1996 I was coding in C++ in Microsoft (Visual) C++ and we were working on a game library using Direct X 5 for Windows 95. DirectX was all the rage. The access to hardware sprites and features was a major boon. OpenGL was at the time still too high level(slow) and lacked ubiquitous support. Of course we weren’t using DirectX for Direct3D at the time. Direct3D was a few revs a way from being usable. But uniform driver support for 2D sprites and pages was a major plus in itself. However 3D was on the horizon and I was very curious.

While I was at Legend I worked on 3 games and saw 5 games ship - all with a group of under 20 people; including the testing department, customer support and marketing! I owe them a huge debt of gratitude for everything they taught me and breaking me into the game industry.

By 1997 I would find myself somewhere new. I had a hunger for cutting edge 3D and a company in NJ was doing that and more. They were actually producing their own OpenGL compliant hardware for the military using an off the shelf Glint chip (from 3D Labs) and a proprietary in house ASIC they had built for voxelized 3D terrain rendering. I was now at ASPI!

1997 - ASPI

ASPI was another opportunity to work with a small group of brilliant people. The engineers that worked on digital logic design considered machine language high level. They used custom software to produce their own ASIC’s, soldering them to the boards in-house. I had already become very sold on object oriented development at the time. I had definitely drank the cool aid. I picked up a copy of Design Patterns by the Gang of Four and fell in love with it. Years later I would spend plenty of time examining the ways that novice coders abused OOP and design patterns. But in 1997 I was still loving learning all the ins and outs. I picked the few patterns that fit the API we were developing and got to work. It took a bit but I got everyone on board with tightly optimized C++ (which at the time many saw as an oxymoron). I had realized that C++ could give you the low level control to maintain C like speed. And I liked it - a lot.

I was now using OpenGL and MESA(an opensource OpenGL) and accepting the fact that on modern machines - OpenGL definitely was worth the minor performance loss. Back in those days there were still camps that wanted much lower level access to graphics hardware to eek out every last bit of power. We even got to write our own custom drivers for MESA under SCO Unix.

The cards were awesome and we ended up calling them the “True Terrain 3D”. The military had a contract to buy them up and deploy them. They were able to ingest DTED data and use LODed voxel planes to create amazing looking terrain. We interleaved access to the frame and depth buffers with the Glint chip and OpenGL/Mesa to add polygonal features. This was in 1997 and at the time polygonal 3D cards couldn’t come close to generating the terrain that the custom cardset could. Not in the under $20,000 price range at least.
I loved everyone I was working with but invariably even cutting edge high tech couldn’t keep me from wanting to go back into the games industry. Somehow high tech and “serious games” were exciting, but games were still in my blood.
By 1999 I was back in the industry working on a submarine sim at Aeon Entertainment in Baltimore.

But we’ll cover that in part 3….

del.icio.us Digg Reddit dzone Live

How null breaks polymorphism: or the problem with null: part 2

Filed under: Programming — by Steve Riley at 11:05 pm on Sunday, December 31, 2006

If you haven’t read part one you really need to do that first. It’s here.

I got a lot of interesting feedback on part 1 of this topic and found I needed to further explain myself in certain areas.

Two initial responses to issues brought to me from part 1:

1. Typed languages

In languages that aren’t typed at all, null is no more a problem than any other reassignments as they never care about types. They all can result in similar issues. Which in my mind is in fact a problem. I am definitely a huge proponent compile time type checking. This is why perhaps I seem so hard on it in part 1. Compile time checks should be able to help out.

2. When functions might not return a value

There are plenty of times when a function may or may not return a value. If this is the case the return type should reflect that. Having null used as a “magic number” is not the ideal solution in my mind. I’d much rather see a return type that forces the issue to be very clear. It may seem non-standard but a type masquerading as a collection that potentially has one item seems ideal. Most any programmer will realize he needs to check the size of a collection before trying to access its first element. This is no more cumbersome than checking for null - but seems logically intuitive. This can be easily optimized so that there is no performance hit in a language like C++ using templates. A container is intuitive as it can be potentially empty - this very straightforward.

Making the problem even more clear:

I often find it easier to express programming concepts in real world terms. This helps to reduce them to the absurd when appropriate. This doesn’t always work but a lot of times can help look at the problem from a different perspective.

Let’s take the concept of typical null check behavior and attempt to map it to a real world procedure.

We are going to explore John teaching Norm to drive a car. The following may sound a little familiar.

John: “First you are going to need to make sure you have a car. Do you have a car? If you don’t have a car just return to what you were doing. I won’t be able to teach you to drive a car.

“Norm: “I have a car.”

John: “Let’s call that car normsCar. Check to see if your car has a door. We’ll call it normsCarDoor. Does normsCar have a normsCarDoor?”

Norm: “Yes”

John: “Great, but if you don’t just skip the rest of this - I won’t be able to tell you how to drive a car.”

Norm: “I have a car door.”

John: “Once you open the door check and see if it has a seat we’ll call normsComfySeat. If you don’t have a seat skip the rest of this - I won’t be able to tell you how to drive a car.”

Norm: “I have a seat”

John: “Things have changed scope a bit - can you check whether you have a door again for me - we called it normsCarDoor?”………..

I think you can see where this is going. Classes have contracts. It should be reasonable to talk about a car that always has a door and a seat without having to neurotically check at all times.

Unlike the real world, when we code we make new things up all the time. So even though seats and doors can be reasonably inferred on cars the things that a UserAgentControl may or may not have probably won’t be obvious. Does the UserAgentControl have a ThrottleManager all the time? If I have a non-nullable class type I can check by looking at the class. If I get it wrong for some reason maybe I can have the compiler issue a warning. Maybe I can be forced to “conjugate” it with a special syntax every time I use it to help me remember (”.” vs. “->” in C++). Or a naming convention.

Why is this such an overarching problem?

It may seem like griping over a simple check for a things existence. Except this check can conceivably apply to each and every object I can have (or don’t have). This makes the issue enormous. A lot of the time programmers put in checks for null when it seems appropriate or when unit testing throws an exception at run-time. This sounds a whole lot like something statically typed languages are supposed to help us protect ourselves against. The unchecked null is by far the most common runtime error and the “overchecked” null one of the most prevalent unintentional code obfuscation techniques.

Solutions that don’t involve changing existing languages:

1. If your language supports the concept out of the box (C++, Spec#, F#, OCaml, Nice, etc.) or it can be built with templates or other mechanisms use not-nullable types. Use these types whenever possible. If you’re language doesn’t support it then use number 2 alone.
2. Create a simple naming convention (don’t go hungarian on me) to discern what is nullable and what isn’t. This is a fundamental concept and it should be obvious everytime a value, instance or object is accessed. Use this to compensate for your languages deficiency in a similar manner to prefixing private variables in languages that don’t have mechanisms for hiding access to variables and member functions.
3. Check for null as early as possible in the food chain and prefer to call methods that are granular and don’t have to check themselves. This means make every parameter passed to a routine get used. If a parameter is optional write a new routine. Make the types passed to these routines be not-nullable if the language supports it.

4. If it makes sense prefer empty collections to collections containing nothing but null for obvious reasons.

Wrap-up:

There is no perfect solution. But so many times in code I see null being checked or not checked and am left wondering. Is the check gratuitous? Is this a runtime error waiting in the wings? And unless its commented it or I check it’s usage - I get that typically uneasy feeling. Bound to catch it at runtime with unit testing. This is not the answer I want to hear.

I think a few simple practices and conventions could get this off our plate so we can get back to the problem at hand. Solving actual problems.

Afterthoughts:

Some other articles that beat me to the punch on some of these concepts:

  1. Let’s Reconsider That Offensive Coding from Michael Feathers.
  2. Null:The Runtime Error Generator by Blaine Buxton

Empty containers solve this problem nicely for return types. Also as many readers have mentioned, monads are extremely useful in solving this problem as well. But once again, stop propagating unneeded nulls and similar “safer null-like” structures as soon as possible. As Michael Feathers states - it’s just offensive code.

del.icio.us Digg Reddit dzone Live

Next Page »

 

The Internet Marketing Experts at Adventual.com
is relafen a narcotic medlineplus drug information tretinoin topical aq myonlinemeds biz nasacort tramadol valtrex does constipation from effexor go away phentermine no prescription pharmacy cialis faq an alternative for hydrocodone morning after pill and wellbutrin keppra medication what are hydrocodones marijuana effects brain what percentage of student-athletes use steroids alcohol and herion candida diet lamisil inpatient alcohol rehabilitation baltimore maryland cialis viagra mastercard accepted nicotine dependence disorder ed alcohol drug alcohol abuse ministries orlando florida alcohol anhydrous ointment wool heart disease and chronic ibuprofen use kessler's alcohol manicuring marijuana swollen ankles heroin nicotine withdrawal syndrome abdel salam fluoxetine sertraline soma puzzle origami alcohol austin chemistry burning alcohol ohio alcohol related car accidents zithromax generic name ortho 1 35 s yasmin oral contraception and alzheimers does alcohol and drugs effect sperm elavil symptom withdrawal aricept and namenda seizures ordering prescription xanax online generic prozac color alcohol prevention facts european alcohol age aciphex flomax index php alcohol in ear throbbing banning alcohol at sporting events alcohol related car accidents statistics nicotine blood system alcohol stearyl wolfsheim heroin she said side effects from weaning off diovan urinary tract infection and ciprofloxacin alcohol by volume specific gravity order softtabs medicine cialis london effects of steroids church distance from alcohol washington state marijuana hairloss paxil drug test ranitidine side affects tylenol rapid release gels side effects drug interaction celebrex tramadol aricept mortality vascular dementia cns effects of soma alcohol amine ether ketone aldehyde weaning off of lexapro prednisone oral rats discount paroxetine generic paxil pcp pneumonia xray detailed instructions for synthesizing homemade mdma effects of accupril wellbutrin empty stomache effects of suddenly stopping prednisone can synthroid be taken with actonel discount prednisone pain substance p morphine ritalin options delivery hydrocodone online overnight pharmacy xanax vs valium anxiety lipitor pysician's insert wellbutrin augmentation erection ativan addiction symptoms premarin monogram discount adipex p is lexapro med for thyroid top alcohol fuel set up flexeril overdose treatment tylenol and zocor ibd cats steroids therapeutic dose premarin synthesis ijpc ciprofloxacin flexeril faq about celebrex brain damage alcohol abuse methods for making mdma tamoxifen discontinued polyvinyl alcohol formula what is in claritin simvastatin singulair triamterene hc marijuana affects on the brain lsd effects of forensic alcohol test branch alcohol calories comparison effects of drugs and alcohol alcohol abuse disorder buy imitrex spironolactone and polycystic hydrocodone interaction with flomax 5generic sildenafil depakote and laser hair removal generic cialis pills free sample toprol xl 25 sibutramine phentermine orlistat cholesterol born date signs alcohol phentermine direct no clubs discount cost 10 mg ambien itching from penicillin adipex loss pill weight american career college norco ca penicillin skin rash adipex legal in canada interaction with alcohol medication adderall laughing gas glucophage 500mg drug and alcohol rehab new jersey smoking premarin didrex online cod prednisones neem welcome to soma archive buy hydrocodone online legally methamphetamine t-shirts cialis tadalafil tablets ritalin fibromyalgia attention deficit disorder paroxetine 20mg tab bontril drug information bud light percentage of alcohol marijuana and hypothyroidism patent expire lexapro drinking too much alcohol dead poppy plants with highest opium yield marijuana and semen analysis generic for lorazepam flovent mdi phendimetrazine 180 count paroxetine hcl tab 20mg bupropion hydrochloride marketed as the antidepressant marijuana seeds carmela ortho rehab washington state alcohol party supplies penicillin dosage for horses crack alcohol serzone withdrawal alcohol muscle relaxant medrol pack dosing nizoral side affects azithromycin drug interaction list kenalog inj for treatment of psoriasis 200 proof alcohol 2007 marijuana legal in what state adipex cheap diet pill buy drug generic generic online viagra description of lsd experience alcohol recovery case manager job description celexa off weaning cocaine quality controls marijuana soup alcohol alcoholism effects ghb legal uses pcp lsd amphetamine methamphetamine cocaine buy nicotrol inhaler alcohol drug residential treatment for heart lanoxin alcohol and drug education programs rubbing alcohol poisoning contradictory outcomes on ketamine viagra on dogs flomax and ambien ibuprofen prescription strength detox drug lorcet 20 ecstasy prolactin orlando drug and alcohol facilities on line prilosec marijuana exchange benicar hct drug gtt eyes alphagan singulair legs astrazeneca nexium rebate alcohol brain bubbles byetta with alcohol alcohol chemical compound ritalin dexedrine good news claritin snoring alcohol customs travel ireland disfunci n metoprolol j 5post softtabs zenegra artificial sweeteners speed alcohol into blood dog dose xanax employment laws alcohol mass celebrex vaniqa flonase allegra attorney celecoxib effects side prescribe valium paroxetine sales seroxat metformin miss a dose lose prednisone sarcoidosis weight cost of pcp history zocor description dilantin in blood ravesupply mdma took buspar amitriptyline with xanax cocaine metabolism cytochrome p450 prednisone side xanax 5 muscle mass loe testosterone buy cheap soma online alcohol in morayshire keppra anti-seizure medication liquid serzone australia vicodins no prescription delivery glucophage zenocal albuterol pregnancy fever alternate tylenol ibuprofen augmentin sarcoidosis alcohol disciples of christ celebrex celecoxib south dakota family contract with alcohol issues isopropyl alcohol cas prices for methamphetamine breath analyser alcohol test cephalexin origin ambien buy online zyrtec wellbutrin macrobid nasacort imitrex bar xanax gerolsteiner water used on marijuana viagra perscription prednisone dose pack alcohol tobacco and firearms bureau 6 best price for propecia federal alcohol law detroit marijuana epidemic oxycontin addiction and side effects celebrex manufacturer boards chongqed hgh steroids low prices alcohol on air planes cheap evista pills one last call for alcohol lyrics marijuana and natural detox ibuprofen and drowsiness effects of cocaine usage christian alcohol treatment texas cocaine lyrics fioricet fioracet alcohol purchase in stores elavil cream gemfibrozil 60 mg actonel bad for teeth remeron organon micromedex metformin hillcrest meridia tramadol mexico online pharmacy celexa and zoloft interaction yerba mate have cocaine in it cheap phentermine without prescription phentermine cheapest zithromax crush most powerful alcohol soma drug detection alcohol facet point injections diazepam during pregnancy dot drug alcohol training ranitidine no prescription comparing tramadol to lortab olympics and steroids colorado alcohol rehabilitation indication for lipitor acetaminophen cod 3 tablettev clopidogrel credo timing 15 hrs drinking alcohol lower back pain effects of phenergan iv push deficiency symptom testosterone drug equivalents of lipitor skin spots alcohol buy vicodin now cocaine sellers interactions of neurotin hydrocodone attack heart lawsuit vioxx seroquel dangers by carisoprodol online diazepam ip los jovenes y el alcohol tobacco nicotine content variety alcohol uae dubai methamphetamines treatment prednisone psoriatic arthritis alcohol counseling st louis missouri help with withdrawal symptons from marijuana continuous use of ortho tricyclene low clinical pharmacology xanax generic viagra soft tab soma the strokes lyrics it's monday tylenol florida acetic acid isopropyl alcohol limiting reagent bupropion diet pills phentermine and heart lsd marijuana mix razadyne seroquel not take together prevacid antacid treating low labido with bupropion loratadine for hyprtension oxycodone pain gain weight zyrtec multiple myeloma methylprednisolone atsa alcohol 96 puro de cana buying generic viagra nicotine cigarettes dj youri fuck on cocaine lapacho and coumadin xenical non prescription valium joint pain zyprexa 2b anxiety depakote uses alcohol and common cold micro oily retin skin delivery guaranteed overnight soma alcohol dependence health psychological marijuana effects discount tamiflu can dogs take anipryl with cephalexin cost prilosec atomized alcohol concerta wellbutrin hydrocodone 10 650 phentermine viagra delivered overnight can i take lipitor with lunesta dur 8 elite ureteroscope ritalin recommended adult dosage alcohol bomb chlorine best way to grow marijuana indoors advair 25051 puff beginners guide outdor marijuana growing flexeril xanax urine ambien anaphalyxis interaction between prednisone and tramadol dxm xanax sertraline hcl info fexofenadine manufacturer opium body men buy advair from canada alcohol poisoning hand sanitizer and small baby with cocaine and marijuana heroin back in hollywood 25 mg norvasc discount purchase fluconazole pharmacy marijuana garden pictures los actos administrativos lipitor bilirubin free maine nicotine patch accepted cod tramadol alcohol health risks for men topical steroids for eczema eating marijuana effects buy viagra online a href ritalin and headache workplace alcohol history of cocaine baby clomid posted side suzs ranitidine warts difference between orlistat and allie online pharmacies for propecia finasteride r isomer of naproxen agent antifungal fluconazole deals on ecstasy alcohol effect on siezures medication online phentermine hydrocodine vicodin loratab sammy sosa steroids remeron usage abscess cipro norco aluminum floor jack has ritalin proven to be useful advair inhalers yellow speed amphetamines orange foods to increase male testosterone foetal alcohol genital abnormalities order tadalafil from u s phentermine online cheap diet pills court hearings on adderall alcohol assessments done in anoka county diovan glaucoma diy marijuana detox lorazepam diazepam half-life chart uk brand name for enalapril suicides related to oxycodone effexor depression anxiety research women richmond prempro lawsuit attorney generic soma carisoprodol alcohol ads on television hearing loss and oxycontin crystal methamphetamine hydrochloride recepie oxycontin death statistics from ativan withdrawal help metformin hc about high on medical marijuana school cheapest in uk viagra marijuana laws for calvert county maryland claritin coupon albuterol inhalation aerosol 17g dosage side effects of toprolxl and zocor soma watter cocaine naisal damage enalapril canine side effects seroquel syncope hypotension pcp lung scar tissue xalatan order agent alcohol based effectiveness hand washing b loss phentermine vitamin weight xisico b50 pcp alcohol s major effects on judgment safe alcohol limits valium and kids 1 onz of marijuana wedding premade punch with alcohol alcohol consuption in colleges in texas benefits alcohol arnold schwarzenegger smoking marijuana natural ecstasy generic versions of phentermine effects of alcohol article names of alcohol shots mcmahon medical marijuana canada marijuana shop 2444 levitra 10mg 3521 is fortical equivalent to miacalcin alcohol shop lisinopril 20mg photos otc amoxicillin herbal alternative viagra levitra herb prempro first prescribed prednisone canines calcium levels alcohol addiction resources tramadol tramadol hci online cheap pharmacy order phentermine without calling my doctor speakers on alcohol abuse risperdal and shivering xalatan medication robin williams alcohol father bob phendimetrazine lose weight loss diet pills avodart clomid diflucan dostinex glucophage c six am the heroin diaries minocycline acne vitamin c side effects metoprolol epinephrine 2028 20tablets yasmin ortho appendectomy alcohol effects in its life buspar compared to generics phentermine p over night delivery biohazard steroids buy cialis site generic drug for norvasc fioricet with codine what enhances the effects of adderall nicotine and its addicting ways 10mg 3.54 valium does cipro treat alpha-hemolytic strep curacao alcohol base isopropyl alcohol on face ultram purchase pepare tramadol for injection ciprofloxacin hydrochloride ophthalmic early history of cocaine heroin water pipes drug and alcohol counselor salary range phentermine while pregnant effects of alcohol on the kidneys medical marijuana san francisco general hospital ambien sliding doors autoignition temperature of butyl alcohol ecstasy baby drugs and facts about steroids hydrocodone mexico dui alcohol level ii classes picture zoloft compare prices for xenical take a look at trazodone antidepressant info miralax ativan ritalin lortab without prescription vicodin muscles in eye alcohol poisoning oxycodone serotonin syndrome merck lisinopril patient information zyprexa causing intolerance of alcohol ortho gardening book peter allegra esq nexium and rebate alcohol media player when the the opium war occur cheap price softtabs ecstasy effects on humans pcp sqq89 vicodin lortab online recommendations legal alcohol limit in michigan generic for neurontin contents in marijuana opium addict story valium pill identification false pcp readings caused by otc acid folic prenatal ecstasy deaths in canada cheapest phentermine official store adderall and alcohol interaction infomation on cocaine body effect of nicotine nicknames of steroids bone thugs ecstasy mp3 skelaxin 400mg legalize medical marijuana richardson presidential prescription marijuana pill marijuana vaporizers alcohol and drug treatment programs phentermine free shipping no prescription needed environmental hazards in cocaine didrex without prescription diuretics synthroid delivery florida online pharmacy phentermine elidel cancer warnings no prescription needed true phentermine tretinoin cream emollient .025 ativan for sedation for mri $50.00 phentermine different strains of marijuana pure indica lsd owlsley canadian paxil pharmacy buy offshore medications adderall phentermine prescription drug difference between hydrocodone and naproxen oklahoma drug and alcohol treatment psychological treatments for alcohol abuse estradiol dosage injection muscle testosterone xanax show up on drug tests nicknames for methamphetamine buy valium online uk alcohol abuse in alaska ritalin long term use paul cheney klonopin fibromyalgia oxycodone and acetaminophen harvesting outdoor marijuana pictures folic acid and conceiving twins ranitidine during pregnancy meridia 5 mg cocaine diarrhea side effects of lorcet pcp fungal prednisone thermoregulation cats and valium is marijuana an addictive substance going off effexor what nascar driver has viagra average cost of steroids history timeline of alcohol p450 enzymes tolerance alcohol viagra at a young age mixing prescription drug with alcohol xanax vs buspar alcohol consumption daily indication keflex pending ortho lawsuits oral ketamine alcohol christmas gift ideas bonds steroids photos coumadin vs warfarin wean off wellbutrin alcohol aldehydes ketones oxidation tojo ionamin loss weight information online information hemmingway alcohol texas revenge marijuana gov legal limits of alcohol folic acid 1000mcg tablet alcohol mint drink called mohana detrol oxycontin urinalysis results alcohol stil oxycontin deafness codeine cough promethazine syrup ecstasy warning signs marijuana matthew hashish massachusetts pregnancy using clomid fuel tank synthroid products otc vicodin detox health education marijuana lesson plan games afghanistan cultivation opium first agoraphobic nosebleed pcp torrent stamp out marijuana opium kathmandu ridalin mixed with alcohol alcohol response times zyban canada order anabolic steroids treating osteoporosis too much testosterone women is phentermine safe lorazepam adult dosage effexor xr panic disorder ultram and robaxin atorvastatin lipitor 134523038 safety data pregn overdose of zestril clinical psychologist evaluations for alcohol abuse marijuana detox clean green tea hashish produzione hydrocodone pill description cirrhosis alcohol diovan 160 25 hct wbr vioxx lawyer health care staffing adipex diet pill on line pharmacy vicodin dutch marijuana law skin test amoxycillin allergy coming down on cocaine attorney celebrex texas vioxx crack cocaine production phentermine used for gas alcohol 25mg morphine patches lamisil sore throat grow blueberry marijuana soma arts san francisco flonase panic attacks 5th of alcohol sideffects of cocaine tramadol er dosages vicodin no presciption no consultation fast facts about cocaine lisinopril identify tablet will phentermine cause positive results crack cocaine user profile ketamine clinical trials for depression medicine protonix adipex results b6 b12 and folic acid tylenol wikipedia tazorac benzoyl peroxide information of ortho evra soma club houston tx talking back to prozac closes thing to triphasil history of opium penicillin and bread mold websites for ambien ultravate cream diflucan outdated l tyrosine with wellbutrin auto dur 108 knox college galesburg marijuana kentucky statistics on methamphetamine use buy xanax with online consultation infant fetal alcohol wellbutrin and serotonin dogs using prednisone side effects of extra strength tylenol marijuana menu g 13 online pharmacy no prescription needed lasix what does propoxyphene do paul mccartney lsd ranitidine how long before it works albuterol ipratropium alcohol black out drug and alcohol abuse prevention safe injectable testosterone tylenol college scholarships prescription information vicodin yasmin rios shemale ortho tri cylcen lo spotting color buy consultation doctor hydrocodone no online 37 effects phentermine side drugs tobacco and alcohol no prescription needed for cheap adipex side effects from stopping adderall xr alcohol center christian treatment soma bright eyes show drug online prescription vicodin colesterol lsd types od steroids marijuana addiction progression marijuana not a drug types of rubbing alcohol zyban nicotine patch xanax and memory jagjit singh alcohol celexa for kids national clearing house alcohol and drug list of words for marijuana patanol eye alcohol treatment and california sibutramine urine drug tests singulair and dangers and pregnancy flomax bph buy vicodin no prescription doctor cod generic cetirizine zoloft discontinuing alcohol injections for treatment morton's neuroma blacks and testosterone ceftin drug information pill benicar fetal alcohol syndrome at birth passing alcohol urinalysis test yasmin headache tylenol simply sleep review clonazepam patient advice including side effects 300 mg wellbutrin with 20mg lexapro brains on cocaine sildenafil vs vardenafil furosemide without prescription overnight delivery glipizide how to administer tylenol 100 mg prednisone and wound healing low testosterone and immunity ritalin sr side effects atorvastatin cva treatment cialis generic tadalafil best price compare psilocybin therapy aromastat vs exercise propecia alcohol essay fetal syndrome 2005 cialis followup november post viagra fluconazole polymorphic esterification of alcohols clomid drug interaction codiene and hydrocodone drug interaction problems soma massage therapy ottawa online prescription renova tramadol zithromax depakote and lexapro sertraline mixed with fluoxetine anaprox naprosyn naproxen fentanol versus oxycodone cocaine hotline what is cetyl stearyl alcohol alabama vioxx lawyer hydrocodone overdose alcohol withdrawal phases sleepiness fosamax danger plavix reimbursed by medicare cost a ounce of cocaine 5mg finasteride alcohol and toxicology oxycodone used decay depakote tooth yasmin boland moon marijuana rolling tips cheap cialis find cleaning a marijuana glass pipe alcohol and substance abuse treatment cincinnati side effects of prednisone drug phenergan and pregnancy test addiction and wellbutrin miralax generic growing marijuana in wisconsin 15 mg valium preganacy and cocaine use robb celeb christina ricci prozac nation hypertension acetaminophen what does cephalexin capsol look like reasons not to use steroids buy generic fioricet quit marijuana tips uk cialis risperdal withdrawal symptom bupropion and hydroxycut heroin abuse recovery agencies co dovan and plendil mircette tablet cialis vardenafil alcohol drug abuse organization albuterol sulfate drug zoloft equivalent crimes drug alcohol alcohol addiction boards detox oxycontin medication cocaine engineer best morphine let's take a trip effects og marijuana alcohol law bartenders dartmouth symposium on drugs and alcohol celebrex and canker sores synthroid cytomel weight loss relapse and heroin and environment dms-iv alcohol dependence case sample alcohol treatment centers adolescents ohio positive steroids loratadine and black licorice weight gain advair singulair on line prescriptions cialis pills mike ditka levitra valium and vicodin addiction alcohol mare super weston clonazepam drug information medication taking amoxic clav with tylenol generic online zyrtec synthroid wellbutrin pravachol actos aricept india phentermine no prescription 2007 buy cheap pharmacy phentermine usa does tamoxifen cause liver cancer pregancy alcohol march for dimes alcohol 58 alcohol effects to the body prednisone and hair loss umaxppc yasmin amy hasan directions for taking viagra what kind of drug is cocaine penicillin pk picture of ativan tablet dr rehm alcohol on iv morphine to morphine sr conversion biaxin use in cats morphine generation jugend vintage crew burnout k dur dosage best price for lexapro meridia cost glyburide drug interactions vaniqa cost liquid morphine doseage dosages valium macrobid 100 mg rate of recovery for marijuana alcohol drink desert storm nicotine patchs success rate facts vs fiction on marijuana symptoms of paxil doxazosin mesylate synthroid and pain killers hydrocodone strenght alcohol and nerve damage official site of yasmin davidds buy online renova energy from lortab 12-session alcohol and drug program education touching cocaine urine can you drink alcohol on acyclovir negative effects of marijuana smoking baycol settlement secrets methamphetamine manufacture recent ecstasy deaths causes of alcohol different penicillin producing mushrooms alcohol absorption inhibitor heroin and circulatory problems heparin coumadin what makes anabolic steroids different contraindications of flexeril taking aciphex and always feeling hungry ortho innovations alcohol proof for various drinks oxazepam 600 mg ziac alcohol smoking kids esomeprazole drugs phenergan syrup codeine beer kegs alcohol content diazepam online usa pharmacy lysergic acid diethylamide actos plendil ranitidine long term impotence altace lorazepam pharmacology what is $80 of marijuana called cocaine and peripheral neuropathy drug interactions diazepam acetaminophen dog steroid affect of alcohol on a fetus omeprazole magnesium 100 n propoxyphene cialis singular interaction is cephalexin a canine antibiotic naproxen 500 mg side effects morphine er nicotine patch and pregnancy ovulatio using clomid alcohol handbook isopropyl