Perseguindo a Testabilidade

Imagine que estejamos desenvolvendo uma solução que, dentre as suas funcionalidades, tenha a possibilidade de logar determinadas informações em um arquivo ou outro meio persistente. Imagine também que tenhamos uma história que diga mais ou menos o seguinte:

Como administrador, terei a possibilidade de configurar um tamanho máximo para o log da aplicação, em bytes.
 
 
Perfeito! Muito simples!
 
 
 
Para estabelecermos um ponto de partida, imagine que já tenhamos uma implementação simples para o nosso Logger e, como não somos bobos, temos também um teste unitário para a nossa versão atual do Logger (que ainda não está contemplando a história acima):
 
 
[TestFixture]
public class LoggerTests
{
    Logger _logger;
 
    [SetUp]
    public void Given()
    {
        _logger = new Logger("Log.txt");
    }
 
    [Test]
    public void should_be_able_to_register_space_consumption_when_log_enties_are_added()
    {
        long initialLogLines = _logger.LogLines;
 
        _logger.Info("New log entry");
 
        Assert.That(initialLogLines, Is.EqualTo(0));
        Assert.That(_logger.LogLines, Is.GreaterThan(initialLogLines));
    }
}
 
public class Logger
{
    private long _maxLogSizeInBytes = long.MaxValue;
    private long _sizeInBytes;
    private string _fileName;
    private long _logLines;
 
    public Logger(string fileName)
    {
        _fileName = fileName;
    }
 
    private long GetLogFileSizeInBytes()
    {
        return (new FileInfo(_fileName).Length);
    }
 
    public long MaxLogSizeInBytes
    {
        get { return _maxLogSizeInBytes; }
        set { _maxLogSizeInBytes = value; }
    }
 
    public long SizeInBytes
    {
        get { return _sizeInBytes; }
    }
 
    public long LogLines
    {
        get { return _logLines; }
    }
 
    public void Info(string text)
    {
        File.WriteAllText(_fileName, text);
        _sizeInBytes += GetLogFileSizeInBytes();
        _logLines++ ;
    }
}
Tudo está funcionando e estamos no verde. Agora, vamos implementar um teste para contemplar a história em questão (permitir a definição de um limite máximo, em bytes, para o tamanho do log). Veja como seria um teste para isso:
[Test]
public void should_stop_logging_when_space_consumption_hits_threshold()
{
    _logger.MaxLogSizeInBytes = 1000;
    while (_logger.SizeInBytes < _logger.MaxLogSizeInBytes)
    {
        _logger.Info("Dumb Message");
   }
    long logLinesWhenStopped = _logger.LogLines;
 
    _logger.Info("This message should not be logged");
 
    Assert.That(_logger.LogLines, Is.EqualTo(logLinesWhenStopped));
}
 
Com as alterações necessárias para atender ao novo requisito, a nossa classe Logger ficaria assim:
public class Logger
{
    private long _maxLogSizeInBytes = long.MaxValue;
    private long _sizeInBytes;
    private string _fileName;
    private long _logLines;
 
    public Logger(string fileName)
    {
        _fileName = fileName;
    }
 
    private long GetLogFileSizeInBytes()
    {
        return (new FileInfo(_fileName).Length);
    }
 
    private bool CanProceedWithLog()
    {
        return SizeInBytes < MaxLogSizeInBytes;
    }
 
    public long MaxLogSizeInBytes
    {
        get { return _maxLogSizeInBytes; }
        set { _maxLogSizeInBytes = value; }
    }
 
    public long SizeInBytes
    {
        get { return _sizeInBytes; }
    }
 
    public long LogLines
    {
        get { return _logLines; }
    }
 
    public void Info(string text)
    {
        if (!CanProceedWithLog())
            return;
 
        File.WriteAllText(_fileName, text);
        _sizeInBytes += GetLogFileSizeInBytes();
        _logLines++ ;
    }
}
Sente algum cheiro???
Sim, parece que temos um code smell aqui. O novo método de teste está tendo de fazer um loop “while” para conseguir o objetivo de consumir o espaço máximo em disco para depois, finalmente, testar se novas entradas no log serão permitidas. Mas o objetivo do nosso método de teste não é preencher o espaço físico, mas verificar se, quando observada a situação de espaço máximo alcançado, o logger irá parar de acrescentar mais dados ao arquivo de log. Imagine se, em vez de 1000 bytes, precisássemos criar um teste com um arquivo de log de alguns Gigabytes de tamanho. Nosso teste iria demorar muito mais do que o necessário. Além disso, estaríamos violando um dos princípios básicos dos testes unitários , ou seja, estaríamos acessando diretamente o sistema de arquivos. Bad!!!
Como resolver o problema?
Como na maioria das vezes, temos mais do que uma forma de resolver o problema. Como o objetivo aqui é conseguir testabilidade, vamos verificar qual parte do nosso design está restringindo a testabilidade de nosso código. O problema que observamos é que devemos forçar o consumo de espaço em disco através da interface pública da classe Logger para que consigamos reproduzir a condição que interessa para no nosso teste. Mas note que o nosso teste foi criado para atender a um requisito funcional que não tem absolutamente nada a ver com a criação do arquivo físico nem tampouco com a forma que a classe usará para controlar o tamanho desse arquivo. O código de produção acrescentado à classe Logger simplesmente testa uma condição (tamanho do arquivo excedido) e, então, decide se continua logando ou não. O problema é que não conseguimos, com o design atual, abstrair o sistema de arquivos, visto que a classe Logger está intimamente ligada às classes “FileSystem” e “File”, do .NET Framework, que são implementações concretas. Hmmm... Implementações concretas! Alguém um dia disse: dependa de interfaces (abstrações); não de implementações. Muito bem, acabamos de violar um dos princípios da OOP no nosso código. Vamos arrumar isso então:
Primeiramente, vejamos como as nossas classes relacionam-se na versão atual:
O nosso código de teste acessa a implementação de Logger, a qual, por sua vez, acessa diretamente as clases de acesso ao sistema de arquivos existentes no namespace System.IO. Precisamos refatorar o nosso design para criar uma independência da classe Logger em relação às classes de acesso ao sistema de arquivos. Para isso, vamos fazer com que a classe Logger enxergue uma abstração do sistema de arquivos, que representaremos através de uma interface (ILogFile).
Tal interface poderá ser implementada por uma classe que faça exatamente o que é feito hoje: acesse as classes do System.IO (representada no diagrama pela classe LogFile).
Podemos criar também uma implementação específica para a finalidade de testes, que “finge” fazer alguma coisa, mas,  na realidade, está somente realizando a parte do contrato definido pela interface ILogFile e evitando que o código de acesso à infraestrutura do sistema de arquivos seja executado durante os testes (classe FakeLogFile no diagrama – que veremos em instantes). Vejamos agora como a classe Logger ficaria após esta refatoração:
 
public class Logger
{
    private long _maxLogSizeInBytes = long.MaxValue;
    private long _logLines;
    private ILogFile _logFile;
 
    private bool CanProceedWithLog()
    {
        return SizeInBytes < MaxLogSizeInBytes;
    }
 
    private long GetLogFileSizeInBytes()
    {
        return _logFile.LogFileSize;
    }
 
    public long SizeInBytes
    {
        get { return GetLogFileSizeInBytes(); }
    }
 
    public long MaxLogSizeInBytes
    {
        get { return _maxLogSizeInBytes; }
        set { _maxLogSizeInBytes = value; }
    }
 
    public long LogLines
    {
        get { return _logLines; }
    }
 
    public void SetLogFile(ILogFile logFile)
    {
        _logFile = logFile;
    }
 
    public void Info(string text)
    {
        if (!CanProceedWithLog())
            return;
       
        _logFile.Write(text);
        _logLines++;
    }
}
 
Note que agora não temos dependência alguma das classes FileInfo e File do .Net Framework. Estamos dependendo de uma interface chamada ILogFile:
public interface ILogFile
{
    long LogFileSize { get; }
    void Write(string text);
}
 
Veja como o nosso método de teste pode ser escrito agora que temos a possibilidade de implementar diferentes versões de IlogFile:
 
[Test]
public void should_stop_logging_when_space_consumption_hits_threshold()
{
    _logger.SetLogFile(new FakeLogFile());
    _logger.MaxLogSizeInBytes = 10;
    long logSizeWhenStopped = _logger.SizeInBytes;
 
    _logger.Info("This message should not be logged");
 
    Assert.That(_logger.SizeInBytes, Is.EqualTo(logSizeWhenStopped));
}
 
O novo método SetLogFile está injetando outra implementação de IlogFile na instância de Logger que estamos usando no teste (FakeLogFile). Vamos ver como esta classe se parece?
public class FakeLogFile : ILogFile
{
    private int _logSize = 0;
 
    public long LogFileSize
    {
        get { return _logSize; }
    }
 
    public void Write(string text)
    {
        _logSize += text.Length;
    }
}
 
Isso mesmo! Ela não faz quase nada. Somente conta a quantidade de caracteres de cada string logada e mantém esta contagem como sendo o tamanho do log. Com este artifício, evitamos o acesso ao sistema de arquivos e, como benefício colateral gerado pela perseguição à testabilidade, conseguimos um melhor design sob o ponto de vista da orientação a objetos - mais desacoplado e de manutenção mais fácil.
O artifício que usamos neste caso chama-se “Fake”. Um “Fake” é um tipo de test double. Test doubles são implementações alternativas de uma interface que servem exclusivamente ao propósito de teste. Ou seja, deve-se ter claro que a classe FakeLogFile é uma classe que pertence ao nosso código de teste, e não ao código de produção! Existem outros tipos de test doubles, como os Stubs e os Mocks, dos quais pretendo falar em posts futuros.
Obs.: para quem já está acostumado ao uso de Mock Objects, pode parecer que no exemplo em questão temos um perfeito candidado para o seu uso. De fato temos, mas preferi trabalhar com o conceito de Fakes por serem mais simples, o que é o meu objetivo com este post.
Para completer, veja como ficaria a implementação da versão de produção de IlogFile, que denominamos LogFile:
public class LogFile : ILogFile
{
    private string _fileName;
 
    public LogFile(string fileName)
    {
        _fileName = fileName;
        if (File.Exists(_fileName)) File.Delete(_fileName);
    }
 
    public long LogFileSize
    {
        get
        {
            if (File.Exists(_fileName))
                return new FileInfo(_fileName).Length;
            else
                return 0;
        }
    }
 
    public void Write(string text)
    {
        File.AppendAllText(_fileName, text);
    }
}
 
 
 

#1 Daniel on 4.07.2010 at 12:42 PM

Olá, Fábio.

Tenho algumas dúvidas e considerações. Se possível, gostaria que você comentasse.

No primeiro código da classe Logger, o trecho abaixo está correto? A intenção é adicionar o tamanho do arquivo ao valor que já está armazenado na variável?

_sizeInBytes += GetLogFileSizeInBytes();

Pelo que entendi, a verificação inserida para verificar se um novo texto pode ser inserido no log permite que o tamanho máximo seja ultrapassado. A função apenas testa se o limite já foi atingido, não verifica se a adição do novo texto ultrapassará o limite definido. Isso pode ser importante se estivermos considerando limites de sistemas de arquivos, como os 2GB da FAT32.

O último código para a função de teste utiliza o Fake e elimina o while que existia na versão original. Os mais desatentos podem entender que o novo design elimina a necessidade do while. Isso não é necessariamente verdade. Apesar de não ser preciso testar valores altos de limite para checar o funcionamento da classe, o while pode ser usado para, por exemplo, testar o que ocorre no limite, ou seja, quando o tamanho máximo definido se aproxima do valor máximo do tipo long.

Abraços.

#2 computer freezes on 8.15.2010 at 4:58 AM

Great stuff here. Thanks for the writing.

#3 Houston Rodeo Tickets on 11.02.2010 at 3:25 AM

Substantially, the article is really the best on this laudable topic. I concur with your conclusions and will eagerly look forward to your future updates. Just saying thank you will not just be enough, for the wonderful lucidity in your writing. I will instantly grab your rss feed to stay abreast of any updates. Gratifying work and much success in your business endeavors!

#4 Rodeo Tickets on 11.02.2010 at 3:26 AM

I'm glad I found this web site, I couldn't find any knowledge on this matter prior to. Also operate a site and if you are ever interested in doing some visitor writing for me if possible feel free to let me know, im always look for people to check out my web site. Please stop by and leave a comment sometime!...

#5 Packaging Machinery on 11.04.2010 at 3:03 AM

Useful information like this one must be kept and maintained so I will put this one on my bookmark list! Thanks for this wonderful post and hoping to post more of this!

#6 Airline Booking on 11.04.2010 at 3:05 AM

Took me time to read all the comments, but I really enjoyed the article. It proved to be Very helpful to me and I am sure to all the commenter here! It's always nice when you can not only be informed, but also entertained! I'm sure you had fun writing this article.....

#7 Cheapest Hotels on 11.04.2010 at 3:05 AM

You really make it seem so easy with your presentation but I find this topic to be really something which I think I would never understand. It seems too complicated and very broad for me. I am looking forward for your next post, I will try to get the hang of it!

#8 Internal Quality Auditor on 11.04.2010 at 3:06 AM

You got a really useful blog I have been here reading for about an hour. I am a newbie and your success is very much an inspiration for me.

#9 Custom Generators on 11.04.2010 at 3:07 AM

Pretty good post. I just stumbled upon your blog and wanted to say that I have really enjoyed reading your blog posts. Any way I'll be subscribing to your feed and I hope you post again soon.

#10 Commercial Construction Austin on 11.04.2010 at 3:08 AM

Thanks for taking the time to discuss this, I feel strongly about it and love learning more on this topic. If possible, as you gain expertise, would you mind updating your blog with more information? It is extremely helpful for me.

#11 Industrial Property Cape Town on 11.04.2010 at 3:09 AM

Really i am impressed from this post....the person who create this post he is a great human..thanks for shared this with us.i found this informative and interesting blog so i think so its very useful and knowledge able.I would like to thank you for the efforts you have made in writing this article

#12 Carpet Cleaning San Francisco on 11.04.2010 at 3:09 AM

This is a really good read for me, Must admit that you are one of the best bloggers I ever saw.Thanks for posting this informative article

#13 Orthodontist Pembroke Pines on 11.04.2010 at 3:10 AM

I would like to thank you for the efforts you have made in writing this article. I am hoping the same best work from you in the future as well. In fact your creative writing abilities has inspired me to start my own Blog Engine blog now. Really the blogging is spreading its wings rapidly. Your write up is a fine example of it.....

#14 swarovski elements on 11.04.2010 at 4:10 AM

Awesome information. Thank you for posting and keep up the good work. I'll be following your blog closely from now on!

#15 Diamond Earrings on 11.04.2010 at 4:10 AM

Nice post. This is a great blog and I have to congratulate you on the content.

#16 Loose Leaf Tea on 11.04.2010 at 4:17 AM

Pretty good post. I just stumbled upon your blog and wanted to say that I have really enjoyed reading your blog posts. Any way I will be subscribing to your feed and I hope you post again soon.

#17 Stock Images on 11.04.2010 at 4:29 AM

I havent any word to appreciate this post.....Really i am impressed from this post....the person who create this post it was a great human..thanks for shared this with us.

#18 Muslim Friends on 11.04.2010 at 4:59 AM

I wanted to thank you for this great read!! I definitely enjoying every little bit of it I have you bookmarked to check out new stuff you post.

#19 Discounts on 11.04.2010 at 5:08 AM

I was just thinking about That Auction and you've really helped out. Thanks!

#20 Cufflinks on 11.04.2010 at 5:13 AM

These are one of the few posts that I actually care to comment on. I find this blogger an inspiration and is definitley worth following. I've became a subscriber too, so please keep me updated.

#21 Gold Eagle Coins on 11.04.2010 at 5:21 AM

I havent any word to appreciate this post.....Really i am impressed from this post....the person who create this post it was a great human..thanks for shared this with us.

#22 Personalized Letter From Santa on 11.04.2010 at 5:24 AM

I must say that overall I am really impressed with this blog.It is easy to see that you are impassioned about your writing. I wish I had got your ability to write. I look forward to more updates and will be returning.

#23 Overstock Reebok Shoes on 11.04.2010 at 5:29 AM

You made some good points there.I did a search on the topic and found most people will agree with your blog.Thanks

#24 Designer Wallets on 11.04.2010 at 5:35 AM

Really appreciate this post. It’s hard to sort the good from the bad sometimes, but I think you’ve nailed it!

#25 Power Generation Plants on 11.04.2010 at 6:29 AM

Nice to be visiting your blog again, it has been months for me. I need this article to complete my assignment in college. Thanks.

#26 Van Hire Directory on 11.05.2010 at 12:09 PM

Hi,

I have Van Hire directory and looking for link partners.Please send me your link detials and I will be glad to add your website in my Van Hire Directory immediately.

#27 Thomas Kinkade Gallery on 11.08.2010 at 8:34 AM

This is just the information I am finding everywhere. Thanks for your blog, I just subscribe your blog. This is a nice blog.

#28 Freelance SEO India on 11.11.2010 at 10:58 AM

Great information dude thanks for sharing about Transforming TXT Files into XML Using Linq to Xml (XLinq)

#29 Chicago Dentist on 11.17.2010 at 4:17 AM

Awesome!! It’s just what I need!! Thanks!..............

#30 Natural therapies on 11.17.2010 at 4:18 AM

People as Hitler and Mussolini are a black spot on history and humanity.

#31 emr software on 11.17.2010 at 4:19 AM

Looks like a very nice and interesting idea, but the problem is, it will cost a lot to the homeowner to take services of a professional interior decorator.

#32 Alcohol Treatment  on 11.17.2010 at 4:19 AM

I am quite interested in this topic. Hope you will elaborate more on it in future posts.....

#33 Hotel Los Molinos Ibiza on 11.22.2010 at 2:12 PM

I really appreciate the kind of topics you post here. Thanks for sharing us a great information that is actually helpful. Good day!

#34 Reuben Collins, DDS on 11.26.2010 at 10:24 AM

Howdy, i read your blog occasionally and i own a similar one and i was just wondering if you get a lot of spam comments? If so how do you prevent it, any plugin or anything you can advise? I get so much lately it's driving me mad so any assistance is very much appreciated.

#35 Generic Viagra on 12.13.2010 at 10:34 AM

Hey,

Great post, please continue sharing to us !!

Thanks

#36 Hyundai Tucson on 12.14.2010 at 5:13 AM

This is a excellent posting, I located your website browsing aol for a related topic and arrived to this. I couldn't get to much other details on this piece, so it was great to find this one. I will probably end up being back to check out some other posts that you have another time....

#37 Piano restoration los angeles on 12.14.2010 at 11:53 AM

Nicely presented information in this post, I prefer to read this kind of stuff. The quality of content is fine and the conclusion is good. Thanks for the post.

#38 papa johns printable coupons on 12.18.2010 at 10:29 PM

é perfeito para você, mas confuso para mim

#39 Windows 7 Key on 12.24.2010 at 4:44 AM

Fine information, many thanks to the author. It is puzzling to me now, but in general, the usefulness and importance is overwhelming. Very much thanks again and best of luck!

#40 short films on 1.01.2011 at 7:28 AM

I am very enjoyed for this blog. Its an informative topic. It help me very much to solve some problems. Its opportunity are so fantastic and working style so speedy. I think it may be help all of you. Thanks a lot for enjoying this beauty blog with me. I am appreciating it very much! Looking forward to another great blog. Good luck to the author! all the best!

#41 coach factory outlet on 1.16.2011 at 11:38 PM

you are the bets blogger so far i feel awesome,following just keep the good work up Smile

#42 250cc atv on 1.25.2011 at 7:16 AM

I do check this site often as it is very good and informative and will look out for an answer!

#43 gucci handbags sale on 3.03.2011 at 5:56 AM

This blog site has a lot of very useful stuff on it! Cheers for sharing it with me.

#44 Tory Burch wallets on 3.07.2011 at 11:54 PM

thanks for your shairng!!

cool!!

#45 Tory burch outlet on 3.10.2011 at 5:00 AM

You got a really useful blog I have been here reading for about an hour. I am a newbie and your success is very much an inspiration for me.

#46 Ceramic Straightening Iron on 3.17.2011 at 5:32 AM

Really valuable written content. the information that you shown is amazing and many prominently i liked the way you provided things here.

#47 ゾフラン on 3.17.2011 at 7:14 AM

Hey, Great post **

#48 Mohegan Sun Arena on 3.18.2011 at 12:57 AM

Hi, I must say that you have made some good points in the post. I performed searches on the topic and found most people will agree with your blog. Thanks for sharing this information.

#49 true religion cheap on 3.24.2011 at 11:45 PM

2, Why quality of fabrics is essential to the impact of a pair of jeans? Jeans are a very special kind clothing, <strong><a href="http://www.cheaptruereligionjeans.cc/true-religion-flare-store-jeans-p-469">true religion jeans cheap</a></strong>its main feature is a very long life, and the value of products with the increase in life expectancy is continually increasing, which means that the more the old jeans, in fact, should be more valuable, but also More beautiful. Wash more prettier, the older the more enjoyable is different from the general clothing jeans, a distinctive feature.<strong><a href="http://www.cheaptruereligionjeans.cc/true-religion-flare-store-women-jeans-p-470">true religions discounted</a></strong> To achieve this, the texture of fabric is no doubt becomes essential. Jeans fabric is not good, not just the product life is short, wear no personal uncomfortable and variable type, fade, <strong><a href="http://www.cheaptruereligionjeans.cc/true-religion-flare-store-womens-jeans-p-471">true religion womens jeans</a></strong>in the process can not be achieved wearing the older the more valuable results.<strong><a href="http://www.cheaptruereligionjeans.cc/true-religion-flare-women-jeans-p-472">true religion usa sale omline</a></strong> 3, Why walk on the wholesale market prices of goods the product of 30 yuan, basically fake substandard?Mainly by the cost of a pair of jeans fabric, 5, the version (pants) is a concept? Popularly speaking, is a pair of jeans in the release pattern, <strong><a href="http://www.cheaptruereligionjeans.cc/true-religion-womens-flare-jeans-p-481>true religion jeans america</a></strong>all pieces of the data and parameters. Version of the style and quality design, a direct impact on a pair of jeans to wear comfortable degree of reliability and aesthetic appearance. Many consumers are usually confused version of type with style.<strong><a href="http://www.cheaptruereligionjeans.cc/true-religion-womens-jeans-flare-p-482">true religion jean sale</a></strong> 6, when consumers buy jeans, what principles should be followed to select? First of all have to pick the type version, the version sub-yourself, no matter how well other aspects of the jeans should not be to buy. <strong><a href="http://www.cheaptruereligionjeans.cc/women-true-religion-flare-jeans-p-483">true religion cheap </a></strong>Good for their own version of type, should be put on, the general personal comfort, there is no feeling of Le, girls hips and legs curve can reflect the perfection,

#50 Thomas Sabo on 4.03.2011 at 3:51 AM

Thanks for that marvelous blog posting! I really enjoyed reading it, you are a great writer. I actually added your blog to my favorites and come back soon. Keep up the exciting work, I hope you will have a nice daytime!

#51 Thomas Sabo on 4.08.2011 at 4:17 AM

Amazing post! I've bookmarked your website as well mainly because I realized it is honestly educational and I enjoyed reading your posts.

#52 Thomas Sabo on 4.12.2011 at 4:45 AM

I totally agree with you on the point of Thomas Sabo. This is a nice article for sure.

#53 mulberry bags on 5.03.2011 at 8:14 AM

Thanks for that marvelous blog posting! I really enjoyed reading it, you are a great writer. I actually added your blog to my favorites and come back soon. Keep up the exciting work, I hope you will have a nice daytime!

#54 yiwu fair on 5.10.2011 at 6:45 AM

Abbottabad has so far been spared the terrorist bombingshttp://www.amandaiec.com/ that have scarred much of Pakistan over the last four years.

#55 coogi jeans on 5.25.2011 at 5:51 AM

Thank you very much, thanks for your nice share.nice

#56 jersey wholesale on 5.30.2011 at 6:42 AM

http://www.usa-nflshop.com

#57 Thomas Sabo jewellery on 6.02.2011 at 10:57 PM

I understand that the big G can penalize your pagerank as an indirect result but I really dont think that that alone should cause such opposition to them. You have good articles here, so ill check back from time to time.

#58 wholesale cheap jerseys on 6.21.2011 at 5:06 AM

Wholesale Cheap Jerseys - Replica NFL/NHL/MLB/NBA/NCAA Jerseys

#59 Office 2007 Product Key on 6.28.2011 at 5:19 AM

These information helps me consider some useful things, keep up the good work.

#60 Office 2007 Product Key on 6.28.2011 at 5:20 AM

This can result in higher thermal efficiency or higher heat values; also, carbon dioxide emissions can be substantially reduced.

#61 whiplash symptoms on 7.20.2011 at 12:24 AM

Any way I'll be subscribing to your feed and I hope you post again soon. Big thanks for the useful info.

#62 rca ieftin on 7.20.2011 at 8:08 AM

The stability of the system can be effected by the differences between the two poles of the problem.

#63 mayweather vs ortiz on 7.25.2011 at 9:05 AM

Thanks for sharing the information dude. I found the information very helpful.

#64 dublin this weekend on 8.01.2011 at 8:23 AM

James C he has never played for Spain and the rules state when a foreigner has lived in another country more than 5 years like Arteta then he is able to represent that country he lives in.

#65 jordan basketball shoes on 8.02.2011 at 11:59 PM

good psot

#66 professional tattoo equipment on 8.03.2011 at 11:22 PM

I literally knew about the majority of this, but with that in mind, I still thought it was useful. Very good post!

#67 personalized wine labels on 8.21.2011 at 11:10 PM

Were the coding for these features difficult to come up in terms of making compatible with a website.

#68 rentals Cannes on 8.30.2011 at 2:14 PM

You have good articles here, so ill check back from time to time.

#69 Goose Quilt on 8.31.2011 at 4:27 AM

The blog was absolutely fantastic! Lot of great information which can be helpful in some or the other way. Keep updating the blog,looking forward for more contents...Great job, keep it up..

#70 portrait von fotos on 9.15.2011 at 11:27 AM

Hi!

Very cute blog with lots of interesting thoughts that fully complement my own need to push in this direction!

#71 Ontario mortgage broker on 9.29.2011 at 11:58 AM

Looks like a very nice and interesting idea, but the problem is, it will cost a lot to the homeowner to take services of a professional interior decorator.

#72 EAS System on 10.10.2011 at 5:25 AM

I'm glad I found this web, it is very good.

#73 K Span Machine on 10.10.2011 at 5:26 AM

The blog was absolutely fantastic! Lot of great information which can be helpful in some or the other way.

#74 Ride On Sweeper on 10.10.2011 at 5:27 AM

Very useful, good topic, thank you,

#75 seo on 10.27.2011 at 2:22 AM

I guess that most of you don’t know that I struggle with this instrument called The Guitar since I was very young (not much time ago, rsrsrs). Recently I managed to set up my home studio with a very basic but functional set of equipment. Now it is time to play around with that apparatus and start recording something. Today I took some time to create a complete loop over which I recorded a simple improvisation

#76 seo on 10.27.2011 at 2:23 AM

I have never read such a lovely post and I am coming back tomorrow to continue reading.

#77 Sydney restaurant on 10.30.2011 at 2:19 AM

I think you spend numerous effort and time updating your blog.

#78 ugg outlets on 10.31.2011 at 5:26 AM

ugg outlets

#79 ugg outlets on 10.31.2011 at 5:26 AM

RTJH

#80 gmat preparation on 11.03.2011 at 9:40 AM

a very good beginning. It must be difficult to start, because the "start" is a difficult thing to do. May you succeed and successfully develop your music studio

#81 gmat preparation on 11.03.2011 at 9:40 AM

a very good beginning. It must be difficult to start, because the "start" is a difficult thing to do. May you succeed and successfully develop your music studio

#82 personal statement writers on 11.04.2011 at 2:46 AM

The example of the last post, we created a class called fake, whose implementation simply pretend that the component was actually consuming storage space in bytes so that our class being tested believed that this was the scenario in progress.

#83 salvatoreferragamo on 11.08.2011 at 4:11 AM

Clothes quality can, anyway I bought their house clothes

haven't appear quality problem. The scope for clothes is

wider, the price is high, but the sale also play badly,

in addition, can not deny the fact that some clothes do

has a characteristic very much, some style is very

common, for example some t-shirts. There is a big size

clothes.oooliuyingpl1108 www.brand-shoesmall.com/.../UGG-Australia-W

#84 card machines on 11.11.2011 at 10:33 AM

This was such an amazing interview. They really did an amazing job with it. There is so much that we can get and learn from this.

#85 jkider on 11.24.2011 at 12:28 AM

<strong><a href="http://www.louisvuittonoutlettoy.com/">louis vuitton outlet</a></strong> Since its inception in 1854, <strong><a href="http://www.louisvuittonoutlettoy.com/">louis vuitton sale</a></strong>,from generation to generation since Louis Vuitton, with its excellent quality, <strong><a href="http://www.louisvuittonoutlettoy.com/">louis vuitton bags</a></strong>,outstanding creativity and craftsmanship to become a symbol of fashion art of travel.<strong><a href="http://www.louisvuittonoutlettoy.com/louis-vuitton-wallets-c-222.html">louis vuitton wallets</a></strong>,Louis Vuitton believe in traditional cultural and creative for the future development of the country.<a href="http://www.louisvuittonoutlettoy.com/louis-vuitton-shoes-c-228.html"><strong>louis vuitton shoes</strong></a>.

#86 Energy management on 12.18.2011 at 3:06 AM

I have been bookmarking them for a while now and just decided to create a post to provide them to others… I really love to read articles that have good information and ideas to share to each reader.

#87 chilliwack real estate agent on 12.22.2011 at 4:08 AM

systems are used to alter the inside environment more comfortable compared to the outside. Heating systems warm the indoor air temperature by burning a fuel source.Cooling systems chill the indoor air by using chemical refrigerants such as ammonia, sulfur dioxide and hydrocarbons. While the average person only notices temperature,

#88 Toronto RV on 12.22.2011 at 8:18 AM

. Heating systems warm the indoor air temperature by burning a fuel source.Cooling systems chill the indoor air by using chemical r

#89 cambodia holiday on 1.07.2012 at 11:07 AM

 Your blog is important; the matter is something that not a lot of people are talking intelligently about. I’m really happy that I stumbled across this in my search for something relating to it.

#90 khaosan inn on 1.18.2012 at 10:31 AM

You should start by gaining some self confidence and by being your own man.

However you look at it, it is your life to live and no one can do it for you.

#91 graduation cap and gown on 1.25.2012 at 3:47 AM

While many readers have contended that nothing in this bill applies to U.S. citizens, Senator Carl Levin, the bill's sponsor, explicitly disagrees.

#92 graduation gowns on 1.25.2012 at 6:06 AM

I don't think anything will prevent them altogether, a lot of it is down to genetics and stuff, but if you use a good moisturiser everyday your skin will be soft and well hydrated, and not so uncomfortable when it does stretch.

#93 academic regalia on 1.25.2012 at 9:01 AM

You can come across various recommendations in the pages of the internet and choose one, which will be most suitable to you, by customizing it to a great extent.

#94 graduation gown on 1.25.2012 at 10:24 AM

But there are more immediate challenges. Korea’s manufacturing is being squeezed by cheap labor from China and its electronics giant, Samsung, has been floundering of late. Increased competition is everywhere. For example, the Koreans once dominated the computer game market in China, but are now feeling stiff competition from the Chinese themselves.

#95 graduation gown on 1.25.2012 at 10:25 AM

while Rolls engaged in small wholesale. One day, Rolls wanted to purchase a number of soy sauce from Rice, which were arrived by three times. When Rolls pulled the cargo from Rice at first time, Rice had already calculated the accurate time, and first poured half of a bucket of water into the barrel, and then poured into the soy sauce. But Rolls was careless, and did not check the soy sauce of the bucket.

#96 graduation gown on 1.25.2012 at 10:27 AM

This is my first opportunity to visit this website. I found some interesting things and I will apply to the development of my blog. Thanks for sharing useful information.

#97 Sandwich a Domicilio on 1.26.2012 at 4:44 AM

I don't think anything will prevent them altogether, a lot of it is down to genetics and stuff, but if you use a good moisturiser everyday your skin will be soft and well hydrated, and not so uncomfortable when it does stretch.

#98 Sandwich a Domicilio on 1.26.2012 at 4:44 AM

This is my first opportunity to visit this website. I found some interesting things and I will apply to the development of my blog. Thanks for sharing useful information.

#99 apartments for rent toronto on 2.01.2012 at 3:29 AM

You can't predict people's exact stats, or its really hard. But your choices for the awards are pretty reasonable but only time will tell. And you have some of your divisions messed up, the Phillies are in the NL East and the Giants are in the West

#100 auto insurance quotes michigan on 2.02.2012 at 4:27 AM

Thise type of competition somehow assures that time would come that rescue organizations like 911 would likely be less needed when there are many knowledgeable youngsters around to save the public. That should be a great moment for everyone. Boost your small business and download free SEO ebook here!

#101 how to build muscle fast for men on 2.06.2012 at 10:07 AM

Great stuff here. The information and the detail were just perfect. I think that your perspective is deep, its just well thought out and really fantastic to see someone who knows how to put these thoughts down so well. Great job on this.

Leave a Comment