DNS Caching Causing Trouble

Link. November 29, 2007. Comments [1]. Posted in: Vista

Lately, I've been having quite a bit of problems at home with DNS and my Internet connection. The problem started manifesting by pages simply refusing to open in Firefox, constantly getting the "this page cannot be displayed" dialog as soon as I tried to open the page.

Hitting F5 to refresh usually didn't work, and closing and reopening Firefox didn't work either. Sometimes (but not always), if I switched to IE7 and tried the exact same URL, it would open, and if I switched right away to Firefox, it would load there as well. Annoying, but most importantly, it didn't work always either. Sometimes the site refused to load in IE7 as well.

I was really stumped about this issue, but it was starting to be obvious by now that this was some sort of DNS problem. I have my router configured to use the OpenDNS servers instead of my ISP ones (as those are pretty flaky), so I would switched them temporarily to pick the servers from DHCP instead. It worked, but only for a little while; soon the error would start manifesting itself again.

What was even more puzzling was that my other laptop, running Ubuntu doesn't seem to be much affected by the problem, and my sister's WinXP machine hasn't had much trouble, either.

I still don't know exactly what the problem is, but it appears the problem is that my old Microsoft MN-700 wireless router is starting to get flaky and rejects a lot of DNS requests, but only momentarily. For example, if a page refused to open, sometimes I could go into the console and try to do a TRACERT command on the server and get a DNS error back, but if I ran it right away through NSLOOKUP, it would correctly resolve the host name.

So, if the DNS errors are only short-lived flukes, why is it giving me so much trouble and seems so persisting (even surviving process restarts)? It would appear that the problem is Windows Vista itself.

As far as I can see, it appears that the DNS Client Cache on Vista is way too aggressive, and tends to cache the "results" of failed DNS queries a bit too much (or at least more than previous windows versions). So what would happen is that when I tried to open a web page, and the DNS query failed, it would get inserted into the DNS cache and keep failing until the entry expired and was removed from the cache.

This became pretty obvious when I started dumping the contents of the DNS Client Cache using the "ipconfig /displaydns" command and could see entries like this on the cache:

www.winterdom.com
----------------------------------------
Server failure of type A

Running the "ipconfig /flushdns" command would remove the entry from the cache and let Vista retry it, so that was one possible option to deal with the issue until I get a new router (pretty soon, hopefully). However, that's too annoying, so for now I've simply disabled the DNS cache in vista by shutting down the "DNS Client" (aka "dnscache") service. The problem still happens, but now pressing hitting refresh (F5) usually manages to open the page successfully. You can find more information about the DNS Cache on this KB entry (though it talks about WinXP and WinServer2K3).

Why DNS server failures are cached by Vista makes absolutely no sense to me. I can understand caching negative DNS responses, but not server failures! On the other hand, I haven't sat down with a protocol analyzer to see what exactly DNS response the router is sending out.

Functional Programming

Link. November 27, 2007. Comments [0]. Posted in: .NET | Development

I've been trying to learn more about functional programming in general lately, and there's a lot of good stuff around to read on it. Unfortunately for me, a lot of the content on the web on the topic uses Haskell to explain the concepts, and I find the Haskell syntax to be somewhat intrusive when trying to get a grip on the core concepts. Still, I probably should make a bigger effort in understanding Haskell :-).

While reading up on this topic, I ran across the Functional Javascript library, which I think is pretty cool. I'm constantly surprised just by how flexible and powerful JS is, and it's a real pity that such a great programming language has been so closely associated with the browser throughout its history. I still suck at JS programming, but that doesn't mean I can't appreciate the elegance and power some of the libraries and constructs for the language have to offer.

By the way, I've also become a great fan of programming.reddit.com; it's been a very valuable source of interesting links, blogs and articles focusing on dynamic and functional programming, among other topics.

(While on the topic of functional programming, it's good to know I wasn't the only one confused by wikipedia's entry on currying).

Functional Programming on .NET

Now that .NET 3.5 has RTM, some of the constructs in C# 3.0 make it possible to adopt a more functional style of programming on C#. Some of it was possible in C# 2.0, but the anonymous delegate syntax was still a bit too cumbersome. The new lambda syntax makes it a lot nicer, easier to read and easier to code (though because of the static typed nature of the language it can still be a bit cumbersome at times). Eric white has a lot of interesting tutorials on functional programming with C# 3.5 and LINQ on his blog, in case you haven't yet run across them.

Obviously F# is the functional programming on .NET for now, and it has tons of really good stuff, though personally I'm still trying to wrap my head around it.

I think that, overall, there's ton of good things to learn from other programming paradigms that can helpo make you a better developer even if you're writing your code in a language favoring a more traditional approach. It's certainly very valuable to understand and learn different approaches to problem-solving and incorporate them into your arsenal.

Port VS2005 Color Schemes to VS2008

Link. November 22, 2007. Comments [1]. Posted in: VS Color Scheme

Visual Studio 2008 (Orcas) handles some of the Font and Colors settings differently from VS2005. While Orcas can import .vssettings files generated its predecessor, there are a couple of problems:

  1. Custom colors for User Types and C# @"" strings don't get imported. This is because the name of the settings in the exported files changed between versions. For example, the setting for Delegates was named "User Types (Delegates)", but it is now called "User Types(Delegates)" (notice the missing space!).
  2. Visual Studio 2008 introduces a whole new set of settings for XAML. This seems like a pretty needless thing to me, because all but three of the new XAML settings have direct counterparts in the XML color settings (only those dealings with XAML markup extensions are really new).

As I had spent quite a bit of time creating the several Visual Studio 2005 Color Schemes that I've made available here, I had no desire to spent a lot of time porting them and fixing the problems mentioned above.

Instead, I spent half an hour creating a simple XSLT that you can run on a .vssettings file exported by VS2005 and generate a new one with the above problems fixed. For the XAML settings, the XSLT will copy the corresponding XML options and for the three new settings (XAML Markup Extension Class, XAML Markup Extension Parameter Name, and XAML Markup Extension Parameter Value) it gives them "reasonable" values from other options.

Download PortVSSettings.xslt.

Update: To run the XSLT without writing any code, you can open it up in Visual Studio and use the XML -> Debug XSLT option. Then, choose your .vssettings file as the input and you're done! (thanks to Brad Wilson for reminding me about it!)

Note: The template will only likely work with fairly complete customizations. This is because of the way the Visual Studio Import/Exports Settings tool works: It won't export any color options that have the "default" color.

Because of this, if have customized Visual Studio but some of the colors the XSLT looks for are missing because you left in the default value, it will not do the trick.

VS2008 Color Schemes

Link. November 22, 2007. Comments [5]. Posted in: VS Color Scheme

Now that Visual Studio 2008 has been released and I've installed RTM, I spend a little bit of time porting all my different Visual Studio 2005 Color Schemes so that they work correctly with 2008 (importing the original VS2005 .vssettings files worked, but didn't quite import schemes completely).

I've now added to each color scheme post a new download link to the 2008 version of the scheme. Here's the complete list:

DLR Hosting Changes

Link. November 19, 2007. Comments [0]. Posted in: .NET

Ending last week, my friend John Lam pushed a big set of IronRuby and DLR changes into the public IronRuby SVN repository (announcement). These include some of the initial changes in the Dynamic Language Runtime Infrastructure.

I'm still going through the new bits, but from what I can see so far, most of what I wrote on my previous article on Hosting the DLR is still essentially OK.

One change I did notice was that the CompileFile() method of the ScriptEngine class now return an object implementing IScriptScope. Seems IScriptModule/ScriptModule were mostly renamed to IScriptScope/ScriptScope, though some vestiges of the old Module concept seem to remain yet around.

Obviously there are a lot more changes in the internal implementation of Microsoft.Scripting, but that was the only one that I noticed that impacted my previous article.

I'll keep posting as new changes are committed, and I'll post a complete, more detailed article on DLR hosting once the code is more stable.

Array Segments

Link. November 15, 2007. Comments [0]. Posted in: .NET

The ArraySegment<T> struct in .NET 2.0 was a very smart idea. But has anyone else wondered just why the heck it doesn't implement a zero-based indexer itself and an enumerator that returns just the elements in the array segment?

I mean, honestly, without those, all ArraySegment does is saving you from passing a couple of parameters around, but doesn't make the code any simpler at all.

dasBlog, RSS and Whitespace

Link. November 14, 2007. Comments [4]. Posted in: Blogging

Does anyone know why the heck dasBlog insists on screwing up whitespace in a post when generating the RSS Feed? It preserves it correctly when it writes out the feed's HTML, but generates RSS that simply removes it at random places, and it's usually the reason why code samples get screwed up so badly. Is there any workaround for this? Anyone else considers this a problem?

Frankly, I'm starting to seriously consider moving to a new blog engine; though I haven't done any tests to see which one would be a good replacement (any recommendations?). I'm not looking forward to a migration, though, and not sure yet that I can provide a way to keep existing URLs intact...

BAM EventStream in PipelineTesting

Link. November 14, 2007. Comments [0]. Posted in: BizTalk

Last night someone brought to my attention that the current versions of PipelineTesting always return null from the IPipelineContext.GetEventStream() method. This is expected to return an EventStream object so that pipeline components can write to BAM, but I never had bothered looking it up before.

I've now fixed this so that the property returns an EventStream-derived class that simply swallows all calls to it silently, to avoid tying the library to having any specific BAM infrastructure in place, and this will be included in the next version of the library.

Is this good enough? Is there anyone who would prefer to have a way to override this behavior so that a real, connected BAM EventStream object is provided? Does someone need a way to check as part of the test assertions that specific events were indeed written to the EventStream? If so, I may look into a way to support this nicely, otherwise, I'll leave it as is for now.

BasicHttpBinding with Transport Security

Link. November 14, 2007. Comments [0]. Posted in: WCF | Web Services

This is just something to remind myself next time I need to implement a WCF service using the BasicHttpBinding with transport-only security (SSL + client certificates)':

  • WCF expects that the "Require SSL" option in IIS is enabled.
  • If Metadata Exchange is needed, configure the MEX endpoint with a custom binding with the right settings; otherwise the service won't start.
  • Remember to set httpsGetEnabled="true" option in the <serviceMetadata> service behavior instead of the usual httpGetEnabled attribute.
  • WCF does not understand the "Accept Client Certificates" option in IIS. It treats it the same as "Ignore Client Certificates" option.

To use client certificates:

    • Enable the "Require Client Certificates" option in IIS
    • On the service side, use a custom binding to set the requireClientCertificate option of the httpsTransport binding element:

      <bindings>

         <customBinding>

            <binding name="sslBasicHttp">

               <textMessageEncoding messageVersion="Soap11" />

               <httpsTransport requireClientCertificate="true"/>

            </binding>

         </customBinding>

      </bindings>

    • On the client side, use basicHttpBinding with the security mode set to "Transport" and the option clientCredentialType set to "Certificate" on the <transport/> element.

Silverlight Xunit.net Test Runner

Link. November 13, 2007. Comments [0]. Posted in: .NET

A couple of people have asked if I could share the code for my experimental Xunit.net silverlight v1.1 test runner. Actually, the stuff I did was fairly simple and not very polished, but I'll should get someone else started on building a real runner out of it :-)

You can download the code here.

Some things to keep in mind:

  1. The zip doesn't contain all the code. Only the silverlight specific parts:
    • The sample test HTML page and its JS scripts
    • The silverlight control XAML
    • The TestRunnerView, a Canvas derived class that implements the actual silverlight control
  2. This means you still need to go and grab the XUnit distribution and get it to compile with Silverlight on your own. Here are some tips, though:
    • If you're using VS2005 to build it, you need to build against the silverlight assemblies. Here's a good starting point.
    • On the Xunit.net solution, I got rid of everything except the core xunit.dll assembly code. It's easier to get started that way.
    • Get rid of the xunit\Sdk\XmlVisitor.cs file, as it uses XmlDocument and friends and won't compile on silverlight. You don't need it right away, but I'm sure someone will rewrite it to use an XmlReader/Writer instead.
    • There are other changes here and there you need to make to get the code to compile, just follow the compiler errors :-).

Enjoy!

Yet a New Blog Theme

Link. November 12, 2007. Comments [2]. Posted in: Blogging

I had redesigned my weblog looks back in July, but got bored with it now. It looked fine, but the colors were a bit too strong and the design a bit too complex. I really wanted something a lot more straightforward, that used space more effectively and with softer colors. Here's the result:

Weblog

It's a very simple, minimalist theme, and I'm rather liking it for now. Still some tweaking it a bit, but it seems to do the trick!

Desert Nights: A VS2005 Color Scheme

Link. November 12, 2007. Comments [6]. Posted in: VS Color Scheme

This is my latest Visual Studio 2005 Color Scheme: Desert Nights. This one features a dark background that isn't quite black (it has a slight hint towards brownish/greenish), and colors that stand from the background but without being too bright (most of them, at least).

Code:

Desert Nights - Code

XML:

Desert Nights - Xml

I've been using this one for the past three or four weeks and I'm liking it quite a bit so far, and it is certainly different from the ones I've made before. Download.

Update: Download Visual Studio 2008 version here.

Recently Acquired Music

Link. November 11, 2007. Comments [1]. Posted in: Personal

A few months ago I signed up again for emusic. The plans are not as good as they used to be, but they are still fairly cheap, and there was tons of new music I wanted to try out. Also helped that finding good music here, particularly if you like Metal, is no easy task.

Here are some of the albums I've recently bought:

  • Amorphis: Eclipse
  • Axel Rudy Pell: Nasty Reputation
  • Iron Savior: Megatropolis
  • Metal Church: A Light in the Dark
  • Russell Allen / Jorn Lande: The Battle
  • Serenity: Worlds Untold & Dreams Unlived
  • Sonata Arctica: Unia
  • Sunterra: Graceful Tunes
  • Therion: Gothic Kabala
  • Thought Chamber: Angular Perceptions
  • Throes of Dawn: Quicksilver Clouds
  • Tiesto: Parade of the Athletes
  • TNT: Transistor

Hosting IronRuby with the DLR

Link. November 8, 2007. Comments [2]. Posted in: .NET

I've been playing with the Dynamic Language Runtime (DLR) and IronRuby lately, and one of the things I've found particularly interesting is the DLR Hosting API, which allows you to bring up the DLR and execute and evaluate scripts inside any .NET 2.0 application.

If you haven't played with the DLR before, it might be worth mentioning that the DLR is the Microsoft.Scripting.dll assembly you'll find in the one of the projects shipping with it (it may sound stupid to actually mention it, but it actually took me some time to find out that was it).

Several versions of the DLR are around, given that it is still in in heavy development, including some early builds in the Silverlight 1.1 alpha, IronPython and IronRuby. For now, I've been playing with the version that's in the IronRuby SVN repository.

The core, low-level hosting interfaces in the DLR are in the Microsoft.Scripting.Hosting namespace, but there are several classes you can use in Microsoft.Scripting  that make the whole process a lot easier.

Keep in mind that I'm writing this as I learn more of the DLR and IronRuby, so there's a chance I make some mistakes along the way :-). Also, the whole hosting API (and IronRuby itself) is in full development, and will likely change a lot in the following months.

The "long" way around

There are actually several ways you can use the DLR hosting interfaces, depending on the level of control and flexibility you need, as well as whether you want to host it locally (inside the same Appdomain) or remotely. Let's start with the long way of doing it (I will only discuss local hosting for now).

The first thing to look at is the ScriptDomainManager class. When hosting the DLR locally, this works as a singleton instance through the CurrentManager property. The ScriptDomainManager gives you a way to get access to the language providers supported by the DLR, like those of IronRuby or IronPythong. In fact, you can register new language providers if needed using the RegisterLanguageProvider() method.

Once you have the ScriptDomainManager, you can use the LanguageProvider for the language you want to; the easiest way is by looking it up using the file extension used for the language, like ".py" for Python, ".rb" for IronRuby and so on, or by using it's name. Each of the currently supported languages are recognized by several names; for example the language provider for IronRuby can be retrieved using "rb", "ruby" or "ironruby".

ScriptDomainManager manager = ScriptDomainManager.CurrentManager;
LanguageProvider ruby =
   manager.GetLanguageProvider("ruby");
   // could also be
   // manager.GetLanguageProviderByFileExtension(".rb");

Now we can ask for the ScriptEngine for our language and ask it to execute a script directly from a file:

ScriptEngine eng = ruby.GetEngine();
eng.ExecuteFile(@"e:\Tests\DlrHost\SampleScript.rb");

We could also first compile the script into a module, manipulate it, and then execute it:

IScriptModule mod = 
   eng.CompileFile(@"e:\Tests\DlrHost\SampleScript.rb""Sample");
// manipulate module
mod.Execute();

Or perhaps you have some piece of script in a string somewhere and you want to execute it directly instead of writing it to a file first:

string script = "puts \"Hello World!\"";
ICompiledCode code = eng.CompileCode(script);
code.Execute();

The engine also allows you to evaluate an expression instead of simply executing the code, which can be useful as well. As you can see, there are many ways you can load and execute code in the DLR.

The short way

Even though "the long way" isn't really lengthy or complex at all, the DLR does provide an easier way: the Microsoft.Scripting.Script class. Script has a bunch of static methods that allow you to compile, evaluate and execute code on the local ScriptDomainManager.

Executing a script file is as easy as:

Script.ExecuteFile(@"e:\Tests\DlrHost\SampleScript.rb");

You can also evaluate a simple expression directly:

int result = (int)Script.Evaluate("ruby""1+8-4");

Notice that if you're not executing/compiling a script from a file, you need to explicitly state what language the expression to execute is written in.

Changing Options

The ScriptDomainManager class has an Options property (an instance of the ScriptDomainOptions class), which contains some interesting switches you can change to diagnose and debug stuff within the DLR and the language provider. (This may go away or change in the feature, at least according to the comments on the source code)

One such option is the ShowASTs property: when set to true, the state abstract syntax tree for the expression/script being evaluated will be dumped to the console. For example, here's the AST output for the last example.

//
// AST unknown_ast
//

.codeblock Object main ( global,)() {
    .var RuntimeFlowControl #rfc (Local,InParameterArray)
    .var Object #self (Local,InParameterArray)

    {
        (.bound #rfc) = (RubyOps.GetRfc)(
            .context,
        );
        (.bound #self) = (RubyOps.GetSelf)(
            .context,
        );
        {
            .return .action InvokeMember -(
                .action InvokeMember +(
                    1
                    8
                )
                4
            );
        }
    }
}

Passing data to Ruby

You can pass data/variables to a script from your host application using the Script.SetVariable() method (if using the script class) or one of the other ways to set values of variables into scopes as necessary.

For IronRuby, however, I believe the only way to do this available is to define a global variable from your DLR hosting application. Doing it, however, isn't very intuitive at this time.

To do this, you need to go "the long way", and explicitly use ScriptDomainManager to get a reference to the Ruby LanguageProvider and its ScriptEngine. Then you need to downcast the ScriptEngine to a variable of type Ruby.Hosting.RubyEngine, and get the execution context to set a global variable there.

A lot of the scope and global variables, once you dig below the Script class, work using symbol IDs instead of names. You can get a symbol ID for the global variable you're about to define using the SymbolTable.StringToId() method.

Let's build an example. First, we'll define a simple class called OurHost:

public class OurHost
{
   public void Callback(string text)
   {
      Console.WriteLine("ruby says: {0}", text);
   }
}

This class will be used by our Ruby script to call back into our C# hosting application.

Now, create the scripting engine and get a reference to the RubyEngine class:

ScriptDomainManager manager = ScriptDomainManager.CurrentManager;
LanguageProvider ruby =
   manager.GetLanguageProvider("ruby");
ScriptEngine eng = ruby.GetEngine();
RubyEngine rubyEng = ((RubyEngine)eng);

Now we can add a global variable called $host into the engine execution context and execute our script:

// Add a global variable called $host
SymbolId var = SymbolTable.StringToId("host");
rubyEng.ExecutionContext.GlobalVariables.Add(var, new OurHost());

eng.ExecuteFile(@"e:\Tests\DlrHost\SampleScript.rb");

Our Ruby script, SampleScript.rb would now be able to use the $host variable to call the DLR hosting application:

$host.Callback "calling home!"

Natural Ergonomic Keyboard 4000

Link. November 8, 2007. Comments [1]. Posted in: Personal

A couple of weeks ago I got myself a new MS Natural Ergonomic Keyboard 4000, that is, the black one with the split keys, and I'm loving it! I'm using it with my laptop, which I've now got on my desk in a simple stand so that the screen is raised at eye level and it works very nicely.

Before this, I used to use one of the older original Microsoft Natural Keyboards (the split one with the cursor keys in the right position) and I really liked it. It was working perfectly still after several years,  but it was a lot dirtier and the keys made a lot of noise. The new keyboard makes a lot less noise, except for the space key which is usually pretty noisy anyway.

Jeff Atwood posted a review of this keyboard a couple of years ago, so I won't repeat it here; he does a better job of it.

I did use the IntelliType software to change the behavior of a few of the special keys:

  • Changed the Web/home key to open Firefox instead of IE.
  • I was missing the Suspend key in the old natural keyboard, so I changed the Calculator key to run the following command: "rundll32" powrprof.dll,SetSuspendState. I found this trick somewhere, but I can't seem to remember where now! Unfortunately, it causes my machine to go into hibernate instead of sleep, but I don't mind it too much.
  • Remapped the Back and Forward keys to Previous/Next Track instead of controlling the browser.

One thing I did found pretty useless on the keyboard is the zoom thingie. Seems like it only really does something useful with the zoom capabilities in IE7, but since I rarely use IE it's not very useful. Also, it seems to work on most other programs by simulating the some Ctrl+Key combo, which is extremely annoying if you have the "Show location of pointer when I press the CTRL key" option enabled in the mouse settings, like I do.

Running Tests on Silverlight

Link. November 5, 2007. Comments [1]. Posted in: .NET

Just something I spent a bit of time getting up and running this afternoon:

AgXunit

Just a slightly modified build of Xunit.net running inside the Silverlight v1.1 alpha on the browser on a very simple test runner I wrote. Nothing fancy, but might prove useful as I experiment a bit with some silverlight stuff.

Bandwidth Usage

Link. November 1, 2007. Comments [2]. Posted in: Blogging | Personal

My website usually has fairly low traffic, given that much of it (or this weblog, for that matter) isn't all that well known and I host few big files. Normally, the monthly bandwidth usage for winterdom.com is between 4.5 and 6 GB.

However, bandwidth usage during october jumped to 16.28 GB! That was a surprise, so I started looking at what might have caused it. From my adsense stats and my usage of Google Analytics, I knew that traffic had increased a bit during this last month on the weblog, but not on the rest of the site, which is normal given that I don't update it often and it is mostly used to host the downloads for my samples.

Also, the RSS subscriber base hasn't changed much in the past few months, and is usually pretty stable, right now between 900-980 subscribers.

A few interesting things I noticed:

  • Pageviews The number of people visiting the site certainly increased, a bit more than I had thought, actually. Usually my weblog didn't got more than 500 pageviews a day, but since October 16 I could see that going a bit above 1000 pageviews.
  • As far as I can see, the increase in the number of visitors has not translated into more RSS subscribers, or at least not to the main RSS feed hosted by feedburner.
  • The largest usage of bandwidth during october was, apparently PNG image files, accounting for well over 12GB of traffic this month.
  • A significant amount of traffic driven to my site during october came from the Visual Studio Express site on MSDN; apparently someone over there liked my Visual Studio Color Schemes :-).
    The rest of the traffic sources are pretty much the usual ones, like the Windows Workflow Foundation community site, Scott Hanselman's weblog (always a good source of visitors), a few pages scattered around blogs.msdn.com, and  Damien Guard's site.

It's pretty obvious at this point to me, that the most popular entries on this weblog are, by a large margin, my various posts on Visual Studio Color Schemes and my old post about Inconsolata. I'm not sure whether that's a good think or simply means that the "serious" posts I write on technical topics aren't nearly as interesting as I thought they could be ;-).

Anyway, looks like I may want to start considering hosting a few of the screenshots I post on my various posts on a separate site (like flickr) or at least stop posting them as large PNG files. Might as well go over Jeff Atwood's Reducing Your Website's Bandwidth Usage post and see what else might be useful there.

No rush, though, I would still need to serve about 4GB more a month to go over my hosting plan's monthly quota, and I doubt that's going to happen anytime soon! And even so, I suspect the current spike in traffic won't last too long.

About

Tomas Restrepo is co-founder of devdeo. His interests include .NET, Connected Systems, PowerShell and, lately, dynamic programming languages. More...

email: tomas@winterdom.com
msn: tomasr@passport.com
twitter: tomas_restrepo

Technorati Profile

devdeo logo

View my profile on LinkedIn

MVP logo

Syndicate

Ads


Links

Categories

Statistics

Total Posts: 999
This Year: 69
This Month: 0
This Week: 1
Comments: 766

Blogroll

Post Archive

Other

Copyright © 2002-2008, Tomas Restrepo.

Powered by: newtelligence dasBlog 1.9.7174.0

Sign In