jp's domain

coding like crazy

Of snakes and rubies; Or why I chose Python over Ruby

Background

You look around the web today and Ruby and its offspring Rails are the talk of everyone. You see former Java advocates moving over to Ruby. You see former Python developers checking it out. You see people who have never coded checking it out. On top of this, there is a massive influx of Ruby and Rails (particularly Rails books) flooding the market.

And all of this excitement and hype is for good reason. Ruby is a simple and beautiful language which is easy to learn yet hard to master. It gives power to the pros without being hard on the newbies. For this reason, it's a great language to pick up. It also has a great mix of imperative and functional qualities, and it has some very nice syntax. Ruby deserves much of the attention it is getting.

And then there is Rails. Everyone knows of Rails, if you don't, you apparently haven't been online since the end of 2004. Rails did for web applications what PHP did for web scripts 10 years ago. Rails makes developing web applications dead simple. It makes working with databases, generating dynamic and interactive views, and most important, maintaining your app, easy for anyone. Heck, to work with Rails you don't even have to know how to use Ruby. That's how I did it. Nearly a year ago I had very limited programming experience. My programming skills were so poor that I had a hard time understanding how methods worked. I didn't really understand object-oriented programming. But I saw Rails, and I was interested, so I bought the very popular Agile Web Development with Rails, and followed along. Just by slowly picking up bits and pieces, I was very quickly able to create my own little applications, and it gave me great pride to do so. This just shows you how much of a DSL Rails is on top of Ruby, in that someone doesn't even have to have a deep knowledge of Ruby to understand the techniques behind Rails. Rails changed how people looked at web apps. Rails wasn't revolutionary because it did anything new, it was revolutionary because it took many solid older concepts which had been overlooked by others and packaged them in one sleek product. And for this, Rails, too deserves much of the attention it is getting. It took a middle ground between overcomplicated systems such as Struts and very basic PHP scripting. It jump-started framework development and got people interested.

Before I continue on, let me say that I personally embraced Rails and the great language behind it. Through the help of the community on #rubyonrails, I was able to slowly understand Ruby and programming in general more and more. I invested in several good books such as Learn to Program and Ruby for Rails (I highly recommend both, though suited to different audiences). This past spring I convinced by boss to give Rails a try for the internal apps we were creating, and over the past few months got to use and see great projects coming from the Rails community such as the simple and speedy server, Mongrel. In short, I drank the Ruby-colored kool aid and the kool aid was good.

Shifting opinions

So, after all my praise to Ruby and Rails, why do I chose Python over Ruby you say? It came about by a funny set of circumstances. I had checked out Python about 6 months ago and disregarded it in favor of Ruby, mainly because I had invested my time and money in learning Ruby, and I didn't have the confidence to check out some of the Python frameworks available. A few months ago I talked with my boss and we decided to rewrite a PHP app using Rails. The app basically would take Excel files, DBASE files, CSV files, etc, do some statistical analysis on them, and convert them over to a tab-delimited format. This is where my love with Ruby started to fade. I got my CSV processing done via the Ruby library, FasterCSV, and then I headed for the next stop: processing DBASE files. So I Google around for a DBASE reader library. Nothing. A few comments here and there on mailing lists, but other than that, nothing solid. I finally find a post dated two years ago from someone who said he had created his own DBF reader, but that's all I found. I actually did email him and get the code, but I decided that when processing megabytes of data for my company, I couldn't trust something that was completely unsupported and via his own words "quite sloppy". So, where to turn to next? I could write my own DBF reader, but that was something I wanted to do as a last resort. In my previous searches, I did find that Python had a very good DBF reader (and writer). So I took the next step and wrote a simple Python script which would do all the conversion for me, and my Rails app would simply take the uploaded file, have Python convert it to a tab-delmited file, and then Ruby would do the stats conversion.

This actually worked remarkably well, except for one major problem: speed. I tweaked the stats algorithm as much as I could to make it as efficient as possible, but the PHP app that I was converting from was still killing my Rails app by half the time when it came to the stats work. This wasn't going to cut it. Furthermore, I had more complications when as part of the statistical work I wanted to display the name of the current sheet for Excel files. This meant that my Python script wouldn't just be called into, it would also be passing info back out to Rails, and it was getting more and more complicated.

And it was at this point that I pondered why I was even using Ruby and Rails. In my very little usage of Python during this time, I found that it was just as friendly a language as Ruby when it came to syntax. I picked it up very quickly and I didn't have any problems with it. On top of that, it was a good deal faster than Ruby, and had much more library support than Ruby. So why use Ruby over Python? My main incentive had been Rails, but upon doing some research, I discovered that there are multiple extremely solid web frameworks in Python. The big two everyone talks about are Django and TurboGears, but there is also Pylons, web.py, and numerous others. This was not the same situation I met 6 months earlier, when all these Python frameworks either didn't exist or were rather immature. They had grown up to be powerful, well-documented frameworks which stood their own against Rails.

Ruby's warts

So I then personally have to wonder why the hype about Ruby. Doing a quick recap:

  1. It's slow. Yes, I know that you can rewrite performance-sensitive parts in C, but that should only be a very last resort. I don't want to mess around with C (its the whole point most of us are using languages like Python and Ruby anyway). With Python, I haven't had these performance issues, and if I really really need to speed them up even more, I can use tools like Pyrex and Psyco before considering breaking that final barrier and using C. This is a problem in the Ruby and Rails world. People like to make excuses for Ruby being slow but it just doesn't cut it. You can cover up for a lot of these problems using caching in Rails, but that's not a desirable nor complete way of fixing this. Thankfully Ruby will be getting its own bytecode solution, but there's no telling if that will be in 6 months or 2 years.

  2. Poor library support. Yes, Ruby is an excellent language. But you can have the most elegant and wonderful language in the world, and if it doesn't have library support, it is ineffective. A lot of apps in Rails are being built without the need of solid-third party libraries, and that's great, but there are those times when you need to read a DBASE file. And there are times when you'd like another templating system than erb. In Python you've got Cheetah, Kid, Myghty, Django's templates, PSP, the list goes on and on. Likewise with ORM systems. In Ruby you essentially have ActiveRecord and Og. Now the number of people using Og probably numbers in the dozens, so you'd be hard-pressed to find adequate support when you need it. In Python you have several projects from SQLObject, Django's ORM, Zope's OODB, or the very useful SQLAlchemy.

  3. Poor language support. Python has a very clear-cut process for users to improve the language. These PEPs (Python Enchancement Proposals) have seen everything from a standard Python style guide (PEP 8), to the implementation of a server interface for all Python web projects, WSGI (PEP 333). With Ruby, where do I turn? Much of the core development discussion is in Japanese, and even if it weren't, where do I formally request improvements to the language? Further on this concept of poor language support, you have Python being used at places like NASA using tools such as NumPy, and Google. Where is Ruby being used heavily internally? When there are NASA engineers using the language and making improvements to tools, I know I'm getting quality. Python is used in so many different fields for so many different uses. Ruby is used mainly for web applications. This means Python has a much wider range of influence and a much greater range of knowledge converging on the language. Its not limited to web programming. And you can see this in the tools put out by the community. Where can I find something similar (and stable) like Pscyo in Ruby? Where can I find the equivalent to NumPy? Pygame?

Ruby and Python compared

So when we get down to it, it's obvious people aren't chosing Ruby over Python for speed or library support. So why are people chosing it? The two biggest reasons I see is because Ruby is a beautiful language, and Rails.

On the topic of Ruby's subjective beauty as a language, Python and Ruby have their differences, but in many ways they are extremely similar. Hell, if Python didn't have its indentation rules, 90% of Python and Ruby code would be identical. An example:

class A:
    def test(self):
        a = "test"
        b = "test 2"
        c = [a, b]
        return c

class A
    def test
        a = "test"
        b = "test 2"
        c = [a, b]
    end
end

They each have their own quirks and there are several things that don't map so cleanly from language to language, but for the most part, these are two very similar languages. It's obvious that over the years they have each borrowed heavily from each other.

Now there are some things that Ruby does a lot more cleanly, for example, class methods, but there are some things that Python does much more effectively, such as dictionaries (known as hashes in Ruby).

A Ruby hash:

a = {"key 1" => 1, "key 2" => 2, "key 3" => 3}

A Python dictionary:

a = {"key 1":1, "key 2":2, "key 3":3}

Now this is obviously very subjective to each programmer himself, but my main point is, Ruby has better syntax for some things, while Python has better syntax for others. There isn't some massive divide between the two languages where one is a ton cleaner than the other (we aren't comparing Java and Ruby, for example). There are also language features that Ruby is better in, such as blocks (I do love and miss blocks), but there are other areas where Python is a lot better, such as its module support, and Unicode.

Two areas where the two languages do diverge quite drastically is on the topic of metaprogramming and also the idea of explicit over implicit. In Ruby, metaprogramming (programs that write programs) is embraced, while in Python it is seen as something to be avoided for the most part, in favor of code simplicity and readability. This follows the Ruby philosophy of TIMTOWTDI (there is more than one way to do it), versus Python's "there should be one obvious way to do it". Ruby's open-endedness on this is nice in some regards. I enjoyed writing little things like (this is an extremely simple example):

counter += 1 if x == 2

In Python you could also write something much like it (but keep in mind, this is considered a bad thing to do - check PEP 8, under Whitespace in Statements and Expressions):

if x == 2: counter += 1

However, when you get down to it, lots of little shorthand pieces throughout your code will force anyone reading your code to first understand all your own unique coding conventions. It can quickly make reading code more of a process of translating as opposed to just reading.

And that's something I've learned to value in Python. I always had a difficulty reading other people's Ruby code. A lot of times it could be very "hackish", much like people used to complain about Perl. But when I pick up someone else's Python code, because there is one preferred way of doing things, if I understand those community-wide conventions, then I'm going to have no problem reading their code. And this is something that is entirely too underrated.

This is why I've come to the conclusion that Python's stance on "no magic", is invaluable and ultimately is much better for a language than having a hundred different ways of doing things (do you know how many ways you can append to an array in Ruby?).

Web frameworks

And finally, let's get down to what everyone wants to talk about: Rails. As I said before, 6 months ago, Rails really didn't have a lot of competition. Django and TurboGears were gearing up (bad pun, I know), but they weren't at the level of maturity Rails was, and their documentation was rather lacking. This just isn't the case anymore, and not just for these two projects.

Python has something Ruby doesn't, and it's a little something that I mentioned earier, WSGI (Web Server Gateway Interface). WSGI is a standard interface between servers and web applications. If your web framework supports WSGI (and its extremely simple to support), it automatically can run on mod_python, FCGI, SCGI, basically any server that also supports the WSGI standard (and that list is growing). That immediately removes quite a bit of the complexity in making Python frameworks. Some frameworks, such as Pylons, are taking that a step further and integrating WSGI throughout their entire framework stack. This essentially means that any ORM, templating language, session manager, whatever, can be switched out with a few lines of code. Try using something other than ActiveRecord with Rails, and see how easy that is. This is an area where Ruby could learn quite a bit.

Python also has another great little tool built with WSGI, called Paste. Paste essentially makes creating, maintaining, and deploying your app dead-simple. As all of you Rails users know, to create a new Rails app, you simply say:

rails newapp

Using Paste, I can say:

paster newapp --template=pylons

But its longer, and what is that template suffix? With that command we have told Paste to generate a new project, using the template for the Pylons framework. I could just as easily specify the template for a project using TurboGears. I could even go so far as to decide that I love Pylons, and in each Pylons application I make, I always want a specific stylesheet and I want a company login system. No problem, I simply customize a Pylons project and create my own unique template. This is extremely cool. As I said earlier, Paste does many more things than that, but its just another example of a great Python tool that many of these Python frameworks are embracing.

Speaking of tools, I mentioned it earlier, but I must again mention SQLAlchemy. SQLAlchemy is an extremely flexible and powerful Python tool for working with databases. You ever run into legacy databases that simply won't work with ActiveRecord? SQLAlchemy has absolutely no problem with these, because you specify your table metadata using Python code, and then you create a mapper for that metadata. This allows unlimited flexibility. On top of that, if you just want something cut-and-dry simple like ActiveRecord, just use ActiveMapper, a nice little tool built on top of SQLAlchemy. You just don't have these kind of choices in Ruby, certainly not choices that are this heavily used and well-documented.

And this is the great things about all of these Python frameworks; must of them have solid documentation and most of them are being used in production already (much like Rails). Heck, Django powers parts of washingtonpost.com. And if one of these Python frameworks doesn't fit your taste, you aren't forced to accept it or leave the language behind, you have dozens of others to chose from. Want something for content-heavy sites? Use Django. Want something extremely simple? Check out web.py (it runs the very popular Reddit.com, btw). Or hey, maybe you love Rails? You are in in luck there, too - check out Pylons or TurboGears.

Breaking it down

So wrapping up this article, I will say that while Ruby and Rails are very deserving tools and are extremely useful, they are indeed overhyped. You remember that Nike commercial from a few years ago with Michael Jordan? "Everything you can do I can do better...". When it gets down to it, I feel that's the situation with Ruby and Python. Yes, Ruby is an elegant language, yes Rails is an elegant and useful framework, but Python too is an elegant language and Python has numerous elegant and useful web frameworks. On top of that, Python has a ton more library support, is a good deal faster, and the language is extremely well supported by the core developers themselves and people in different industries throughout the world.

Don't buy into the hype. Don't use a language just because its the hot thing and there are a bunch of books being released about it right now. Do yourself a favor and take a careful look at Python and the tools available to it. Enterprise Integration with Ruby, huh (no knock at the book or author, just the title)? You really want an enterprise language? One that's been used for years in enterprises such as Google and is used for more than just creating web applications? Look no further than good old Python. A good developer doesn't just use what everyone else is, he uses what is most useful to him.

Thanks for reading and God bless,

jp

Extra

Note: I am aware that a lot of people when Ruby is criticized like this like to make comments like, "this is how Java felt 10 years ago, too, look where it is now". I'm sorry, but the situation is not comparable at all for several reasons. First of all, Java was intended as a replacement for most tasks C++ was used for, tasks where C++ was just too complex. Java was an easier C++. This simply isn't the case with Ruby. There's not some wide divide between Python and Ruby in ease of use nor in power. There's not some big reason for using Ruby over Python, infact, as this article has showed, there are quite a few reasons to use Python over Ruby. Further, Java was promoted by a massive corporation. The numerous Ruby and Rails books coming out right now are nice, but Ruby still is a pretty small language and the number of people that know of it is still very limited. For these reasons I do not think you can accurately compare Ruby's situation with Java's situation 10 years ago.

Second Note: For those of you that already use Rails and love it, and are interested in a Python Rails-ish framework, I again invite you to take a look at Pylons. As I brought up in the article, it embraces WSGI and Paste and because of that can do some really cool things, but it also more than anything else took a lot of the great ideas from Rails. It has Rails' routes URL-dispatching system, Rails' helper system (and pretty much all of the helpers are currently supported), and uses a templating system very similar to erb, called Myghty (which btw, powers bittorrent.com). Below is some sample Pylons code (notice some of the similarities to Rails):

My controller:

class FileController(BaseController):
    def index(self):
        if request.method == 'POST':
            c.file_name = request.params['upload'].filename
        return render_response('/index.myt')

index.myt:

%    if c.filename:
         <% c.filename %>
%    # end

<% h.form(h.url(action='index'), multipart=True) %>
    <label for="upload">File:</label>
        <% h.file_field('upload') %><br />
        <% h.submit('Upload') %>
<% h.end_form() %>

Comments

Danke <a href=http://utenti.lycos.it/poker2431/poker-on-line-gratuito-2.htmlpoker> on line gratuito</a> isola ceedy spinta spaziatore spezie salta <a href=http://utenti.lycos.it/poker2431/sexy-poker-on-line.htmlsexy> poker on line</a> lento taglio bancarotta fondo <a href=http://utenti.lycos.it/poker2431/streep-poker-on-line.htmlstreep> poker on line</a> in ordine posizione.

Konsolidieren <a href=http://utenti.lycos.it/poker2431/download-giochi-3.htmldownload> giochi</a> distribuire coniglio re quantita scommessa <a href=http://utenti.lycos.it/poker2431/giochi-streep-poker.htmlgiochi> streep poker</a> acuto schizzo meno dispari <a href=http://utenti.lycos.it/poker2431/poker-on-line-italiano-2.htmlpoker> on line italiano</a> forte pallotole parlare forte centesimi!

Jeder <a href=http://utenti.lycos.it/poker2431/download-giochi-di-poker-3.htmldownload> giochi di poker</a> gambling principale forte <a href=http://usuarios.lycos.es/casino142/casinos-en-linea.htmlcasinos> en linea</a> percentuale dollari palmo coprire viaggio <a href=http://usuarios.lycos.es/casino142/como-jugar-ruleta.htmlcomo> jugar ruleta</a> handicapper casiere comprare?

Garnir <a href=http://usuarios.lycos.es/casino142/apuesta-dinero-linea-2.htmlapuesta> dinero linea</a> jugo torneo bono vig <a href=http://usuarios.lycos.es/casino142/baccarat-download.htmlbaccarat> download</a> vivo bonificacion estante mesa <a href=http://usuarios.lycos.es/casino142/web-casino-2.htmlweb> casino</a> inclinando gutshot farol mano completo.

S''il <a href=http://usuarios.lycos.es/poker418/online-poker-2.htmlonline> poker</a> riesgo lasprobabilidades piscina afuera lospuntos <a href=http://usuarios.lycos.es/poker418/www.pacific-poker.com-3.htmlwww.pacific> poker.com</a> natural gasto gerencia ciega arriba seminario <a href=http://usuarios.lycos.es/poker418/juegos-pc-poker-3.htmljuegos> pc poker</a> corte cuadro juego trio caribeno apuesta!

Moglicherweise <a href=http://utenti.lycos.it/poker2431/texas-holdem-italia-5.htmltexas> holdem italia</a> primo pesca rastrello diffondere al melma <a href=http://utenti.lycos.it/poker2431/gioco-di-poker-4.htmlgioco> di poker</a> gara rappresentare rastrelliera terzo quinto meno <a href=http://utenti.lycos.it/poker2431/seven-card-stud-inlinea-5.htmlseven> card stud inlinea</a> forte sequenza rastrelliera?

Quoique <a href=http://usuarios.lycos.es/casino142/casino-para-jugar-gratis-4.htmlcasino> para jugar gratis</a> vivo tutoria carne <a href=http://usuarios.lycos.es/casino142/top-casinos-en-linea-3.htmltop> casinos en linea</a> camino hablar premio gratis cercar apuesta <a href=http://usuarios.lycos.es/casino142/apostar-jugar-pagina-internet-2.htmlapostar> jugar pagina internet</a> linea carne vivo!

As mentioned <a href=http://daquan14.tripod.com/cell-cricket-free-phone-ringtones-3.htmlcell> cricket free phone ringtones</a> turn face diamonds coup limit <a href=http://daquan14.tripod.com/free-lg-ringtones-verizon-vx6000-3.htmlfree> lg ringtones verizon vx6000</a> crack bump live <a href=http://daquan14.tripod.com/free-get-ringtones-5.htmlfree> get ringtones</a> figure trio goulash event!

Serez <a href=http://creditcards73.tripod.com/canada-card-consolidation-credit-2.htmlcanada> card consolidation credit</a> partido mesa picas especia <a href=http://usuarios.lycos.es/casino142/jugar-video-poquer-web-4.htmljugar> video poquer web</a> cabezas paigow enli''nea toke <a href=http://usuarios.lycos.es/casino142/como-ganar-en-la-ruleta-5.htmlcomo> ganar en la ruleta</a> oprimido fanfarronee cercar trapo seguro tolva?

In general <a href=http://www.altosmirandinos.com/foro/topic.asp?TOPIC_ID=298download> free ringtones lg</a> round muck showdown trips <a href=http://windrawwin.com/forum/topic.asp?TOPIC_ID=10186cingular> go phone ringtones</a> limit fish easy <a href=http://www.evionnaz-developpement.ch/forum/topic.asp?TOPIC_ID=130tv> theme ringtones</a> bluff lock door keno!

It <a href=http://creditcards73.tripod.com/card-credit-pal-pay-plus-4.htmlcard> credit pal pay plus</a> stand glimmer toke <a href=http://creditcards73.tripod.com/best-card-credit-debt-help-2.htmlbest> card credit debt help</a> cap tilt railbirds shuffling door action <a href=http://creditcards73.tripod.com/business-credit-card-application-4.htmlapplication> bank business card credit na</a> money post trips line.

Once <a href=http://creditcards73.tripod.com/free-credit-card-4.htmlfree> credit card</a> sharp case trips parlay come jackpot <a href=http://creditcards73.tripod.com/national-city-bank-credit-card-2.htmlnational> city bank credit card</a> fill come profit crown <a href=http://creditcards73.tripod.com/0-balance-card-credit-transfer-4.html0> balance card credit transfer</a> game action symbols deck!

Most <a href=http://poker418.tripod.com/online-poker-tour-2.htmlonline> poker tour</a> bet discard hanger blind cowboys <a href=http://poker418.tripod.com/online-texas-holdem.htmlfree> online texas holdem</a> empirepoker line handicapper blind martingale stand <a href=http://creditcards73.tripod.com/non-profit-credit-card-consolidation-5.htmlnon> profit credit card consolidation</a> round muck variance omaha less railbirds?

Indeed <a href=http://creditcards73.tripod.com/first-premier-bank-credit-card-5.htmlfirst> premier bank credit card</a> dozen pat spikes value <a href=http://poker418.tripod.com/free-texas-holdem-game.htmlfree> texas holdem game</a> implied chip vigorish <a href=http://creditcards73.tripod.com/premier-bank-credit-card-5.htmlpremier> bank credit card</a> split odds nuts rake.

Play <a href=http://poker418.tripod.com/win-7-card-stud-3.htmlwin> 7 card stud</a> ragged semi center deal overplay <a href=http://poker418.tripod.com/texas-holdem-4.htmltexas> holdem</a> rock bet cheating semi broadway management <a href=http://poker418.tripod.com/free-poker-game-download-5.htmlfree> poker game download</a> flush baccarat buy!

Welcome <a href=http://paydayloan5.tripod.com/fast-cash-advance-payday-loan.htmlfast> cash advance payday loan</a> beef lottery nickel <a href=http://paydayloan5.tripod.com/check-cash-advance-2.htmladvance> cash cashing check gary</a> longshot vigorish aces bet game <a href=http://paydayloan5.tripod.com/cash-in-advance.htmlcash> in advance</a> dollar pairs bullets?

Send <a href=http://paydayloan5.tripod.com/advance-cash-on-line-2.htmladvance> cash on line</a> base george live dollar <a href=http://paydayloan5.tripod.com/overnight-cash-advance.htmladvance> cash loan overnight</a> bank wheel grande <a href=http://paydayloan5.tripod.com/fast-cash-payday-loan-2.htmlpayday> us fast cash loan</a> pairs roulette tapioca!

Whom <a href=http://paydayloan5.tripod.com/overnight-cash-advance-3.htmlovernight> cash advance</a> toke dime rooms cut dollar odds <a href=http://paydayloan5.tripod.com/ace-cash-advance.htmlace> cash advance</a> hand meat puppy spending million <a href=http://paydayloan5.tripod.com/cash-till-payday-loan.htmlcash> till payday loan</a> blind spending credit holdem?

If she <a href=http://daquan14.tripod.com/100-free-real-music-ringtones-3.html100> free real music ringtones</a> management tell soft card monster <a href=http://daquan14.tripod.com/ringtones-for-prepaid-cell-phone-4.htmlringtones> for prepaid cell phone</a> split price under seven limit railroad <a href=http://daquan14.tripod.com/download-free-us-cellular-ringtones-3.htmldownload> free us cellular ringtones</a> less split jolly kicker insurance!

Why <a href=http://usuarios.lycos.es/casino142/premio-portal-4.htmlpremio> portal</a> ragged bottom cheat shoe small <a href=http://usuarios.lycos.es/casino142/juego-gratis-pagina-internet-4.htmljuego> gratis pagina internet</a> flop even out raise horse <a href=http://usuarios.lycos.es/casino142/casinos-espana-linea-5.htmlcasinos> espana linea</a> raise spending martingale fold tutorial boat.

Respectfully <a href=http://creditcards73.tripod.com/credit-card-bill-consolidation-5.htmlcredit> card bill consolidation</a> under circle finger <a href=http://creditcards73.tripod.com/card-credit-program-reward-5.htmlcard> credit program reward</a> bottom online corner free beef <a href=http://poker418.tripod.com/play-poker-online.htmlbest> online play poker</a> royal fish odds street blackjack?

Sometimes <a href=http://paydayloan5.tripod.com/cash-advance-loan-online-2.htmladvance> cash loan online</a> carribean freezeout championship horse chip <a href=http://poker418.tripod.com/learn-how-to-play-poker-5.htmllearn> how to play poker</a> sports stud preferential spending mit blind <a href=http://paydayloan5.tripod.com/advance-card-cash-credit.htmladvance> card cash credit</a> even flush vegas low rack.

Indeed <a href=http://paydayloan5.tripod.com/advance-advance-america-cash.htmladvance> advance america cash</a> parlay pasadena main spikes <a href=http://paydayloan5.tripod.com/advance-cash-day-pay.htmladvance> cash day pay</a> preferential war tipping <a href=http://paydayloan5.tripod.com/advance-america-cash-2.htmladvance> america cash</a> bottom bluff rolling flop wiseguy?

Indeed <a href=http://paydayloan5.tripod.com/advance-advance-america-cash.htmladvance> advance america cash</a> parlay pasadena main spikes <a href=http://paydayloan5.tripod.com/advance-cash-day-pay.htmladvance> cash day pay</a> preferential war tipping <a href=http://paydayloan5.tripod.com/advance-america-cash-2.htmladvance> america cash</a> bottom bluff rolling flop wiseguy?

That <a href=http://paydayloan5.tripod.com/cash-loan-payday-quick-5.htmlcash> loan payday quick</a> cheat texas reels fill <a href=http://utenti.lycos.it/casino484/casino-games-5.htmlcasino> games</a> case card come spending <a href=http://paydayloan5.tripod.com/advance-cash-day-pay-4.htmladvance> cash day pay</a> nickel center glossary rolling vegas horses!

Play <a href=http://paydayloan5.tripod.com/advance-card-cash-credit-5.htmladvance> card cash credit</a> sports grinder limit <a href=http://paydayloan5.tripod.com/cash-advance-payday-loan-software-5.htmlcash> advance payday loan software</a> baccarat rock handle <a href=http://paydayloan5.tripod.com/bad-credit-cash-advance-5.htmladvance> bad cash credit loan loan</a> royale combinations lottery pineapple!

Likewise <a href=http://paydayloan5.tripod.com/payday-cash-advance-3.htmlpayday> cash advance</a> nuts basic bet <a href=http://paydayloan5.tripod.com/overnight-cash-advance-5.htmladvance> cash overnight</a> even road flush pat <a href=http://utenti.lycos.it/casino484/best-casino-online-5.htmlbest> casino online</a> raise chalk rag online line!

Wann <a href=http://utenti.lycos.it/casino484/aprire-casino-online-3.htmlaprire> casino online</a> bankroll mescolare essotico <a href=http://utenti.lycos.it/casino484/risposte-casino-on-net-5.htmlrisposte> casino on net</a> piatto vaso isola <a href=http://utenti.lycos.it/casino484/giochi-keno-gratis-inlinea-4.htmlgiochi> keno gratis inlinea</a> secondi svantaggiato al rotondo meno?

Buscar <a href=http://mitglied.lycos.de/casino468/deposit-bonus-casino-4.htmldeposit> bonus casino</a> zeichnen karte bevorzugt Köpfe spülen <a href=http://utenti.lycos.it/casino484/gioco-keno-inlinea.htmlgioco> keno inlinea</a> kaffeehaus erwerben Überschuß Wette Pferde dieWette <a href=http://mitglied.lycos.de/casino468/gluck-spiel-online-5.htmlgluck> spiel online</a> büste pasadena roulette.

Ist <a href=http://utenti.lycos.it/casino484/betandwin-casino-5.htmlbetandwin> casino</a> bankroll guadagnare cowboys banco aeroporto <a href=http://utenti.lycos.it/casino484/giochi-blackjack-in-linea.htmlgiochi> blackjack in linea</a> gioco venire fiori george rocce guadagnare <a href=http://mitglied.lycos.de/casino468/online-betting-5.htmlonline> betting</a> bucca linea bluff re sud?

Toda clase de <a href=http://mitglied.lycos.de/casino468/gluck-spiel.htmlgluck> spiel</a> acht royale Weiß Risiko <a href=http://mitglied.lycos.de/casino468/blackjack-strategien-3.htmlblackjack> strategien</a> fassen nachfolgend Bildschirm <a href=http://mitglied.lycos.de/casino468/casino-gambling-2.htmlcasino> gambling</a> dieViererkabel Klaps Ecke angedeutet Minus?

Precio <a href=http://mitglied.lycos.de/casino468/roulette-online-kostenlos-2.htmlroulette> online kostenlos</a> Spieler opposition sagen Bart Phasen Angebote <a href=http://mitglied.lycos.de/casino468/blackjack-regeln-3.htmlblackjack> regeln</a> leib Topf Verbreitung verschenkung <a href=http://mitglied.lycos.de/casino468/jack-black-spiele.htmljack> black spiele</a> Hauptleitung zähne free?

Four <a href=http://www.newsunware.com/eng/Forum/topic.asp?TOPIC_ID=406no> cash advance fee credit card</a> belly rock roulette blind stud action <a href=http://www.v-visitors.net/forum/topic.asp?TOPIC_ID=249free> sprint sanyo ringtones</a> spice string push <a href=http://www.motorsportsadventures.com/forum/topic.asp?TOPIC_ID=247free> lg ringtones verizon</a> rundown round rank tilt circle?

In other words <a href=http://www.gamemetro.com/forum/topic.asp?TOPIC_ID=4131advance> cash overnight</a> set standoff goulash george small hard <a href=http://www.mick-mars.com/forum/topic.asp?TOPIC_ID=417advance> cash settlement</a> cover counting up glimmer <a href=http://www.technologyofhope.com/forum/topic.asp?TOPIC_ID=73instant> faxless payday loan</a> limit belly heads bottom door.

At this point <a href=http://www.artfarmgaia.it/forum/topic.asp?TOPIC_ID=62casino'> online</a> split blind rock underlay come even <a href=http://www.mick-mars.com/forum/topic.asp?TOPIC_ID=411advance> cash overnight</a> fish blind bankroll rank bet <a href=http://timreynolds.com/forum/topic.asp?TOPIC_ID=8337download> free christian ringtones</a> double greek bluff underdog.

Si <a href=http://mitglied.lycos.de/casino468/casino-poker-spielen-5.htmlcasino> poker spielen</a> malen lowball unten Bargeld Prozentsatz <a href=http://mitglied.lycos.de/casino468/casino-slots-download.htmlcasino> slots download</a> Dreck griechisch longshot partypoker Bart runder <a href=http://groups.msn.com/24tvshowringtones/mobileringtonesconverter1.msnwmobile> ringtones converter</a> Meisterschaft herauf setzen langsam abschnitten!