Is your Sitecore Application running slow? Lets speed it up then

Leave a comment

Hello Sitecore Enthusiasts!

We all love Developing and extending Sitecore CMS not just for the enterprise use that we do in our company, but even to know what sitecore is, how it works, use various Shared Source Module ,to know what some great developers have put up and trying to make some things of your own. Also, there are many reasons for a Sitecore instance to restart, some code change and building it to apply changes, config change, change in some file present in webroot and so on. But while doing this, we all at some point of time face one difficulty.  A Slow running application in Local Development Environment rite?

Challenge:

My Local Development Sitecore Application is running very slow!! And its hindering me from getting to explore Sitecore More!! :(

Ok then lets solve this one.

Solution

Some things that I found to be very useful while working with Sitecore in Local Environment are as follows:

1. Tweak Cache Sizes 

Generally, speaking of the Caches, they are actually used in a production environment, where there is a huge amount of data moving to and fro. But as far as a development instance is concerned, its better we keep them small — specially the Prefetch cache.

Also, make sure that the MemoryMonitor Hook is not too high a value.

Choose your cache sizes appropriately. Best way would be hit and trial method, wherein you may need 2-3 trials to know what is the best optimal cache size, but once you get it, they will work wonders for you.

But remember, that in live its better that you provide a very good amount of cache size — the more the cache, the better the performance, — as it will surely reduce the database hits and inturn reduce the response time of your application.

There is a shared source module called the Cache Tuner which you can use to do this for your live Sitecore Instances.

2. Disable Performance Counters for the development instance

This can prove to be very helpful. In a development instance, this is not required, its for the live production environment application, wherein you need to know the bottleneck of your application and hence you enable them.

While, in a development machine, it can prove to be not just futile but even an hinderance, as the Sitecore instance will check for them and log them in the log files. Better stop them.

This can be done using a config change in Web.Config. Change this setting value to false.

<setting name="Counters.Enabled" value="false" />

3. Disable unrequired agents 

Now actually, you don’t require the various scheduling agents running as background processes to run in your local environment. They are actually meant to run on the Live environment, and have their specific purpose, say the  CleanupPublishQueue – cleaning up items from th Publish Queue Table and so on.

The various agents are:

  • Sitecore.Tasks.CleanupHistory – for cleaning up your History Table
  • Sitecore.Tasks.CleanupPublishQueue – for cleaning up your PublishQueue Table
  • Sitecore.Tasks.CleanupEventQueue – for cleaning up your EventQueue Table.
  • Sitecore.Tasks.CleanupAgent – for cleaning up your Website Media Cache.
and some others..
You yourself decide which ones to remove — and in case its difficult to you, I think Sitecore Support Guys can help you to disable them.
But remember, this is only in case of your Development Machine Instance, and not in your Live Env.

For more understanding on Agents and Scheduled tasks, please refer to the following posts:

http://www.sitecore.net/deutsch/Community/Technical-Blogs/John-West-Sitecore-Blog/Posts/2010/11/All-About-Sitecore-Scheduling-Agents-and-Tasks.aspx

http://sitecorebasics.wordpress.com/2011/04/23/description-of-sitecore-jobs/

http://varunvns.wordpress.com/2011/08/10/agents-or-jobs-in-sitecore/

4. Try Cleanup Databases and Rebuild Indexes

Well, its better not done, but in case tweaking caches doesn’t work for you, better you try this step.

It may happen, that you haven’t done any database maintenance and there are a lot of items in your database, making it bulky and difficult to manage. This step can help cleaning up the tables and rebuild of indexes help the application to come up fast as the items are found faster.

Also, along with this, you can truncate some of your Database Tables — like PublishQueue (in case you don’t use Incremental Publish), History Table, EventQueue Table — but before you do so, please consult Sitecore Support, as it is a very imp step that you might be taking.

Friends, the four steps that I have mentioned above, are the ones that I have tried on my Local Development Instance, and Man! Its very fast now.

Generally, you actually won’t require the 4th Step, by the end of 3rd step itself, you will find your instance to be superfast! Still, please post your experiences in comments in case any of these 4 steps don’t help you accelerating your instance. I will try my best to help you out!

So my dear Sitecore Lovers, Happy Accelerating Sitecore Instance!

Sitecore 6.4 Functionality – Layout Deltas

Leave a comment

Hello Sitecore Lovers,

We recently upgraded our Sitecore Solution from 6.3.1 to 6.4.1 Update – 6. And man! Must say Sitecore 6.4.1 is Superb!

Page Editor looks truly professional and some very nice overall improvements to the instance.

Here we are to talk about one of those — called the Layout Deltas.

So what is Layout Deltas?

In brief, Layout Deltas is a way of storing the delta (change) in the values of an item in comparison to its template.

Concept:

1. Setting Layout and Renderings in the Presentation Details of the Standard Values of a Template.

2. Creating Items from that template.

Everytime, an item is called/rendered on page, its presentation details will be referred to from its Template.

  • Now, in case we make some changes in presentation details of the items, then they are stored as changes from the original templates — as Deltas — and not as all the presentation details for the item.
  • So now, whenever that item is called/rendered on page, presentation details of the template standard values are referred to, and then what is called is the Delta Section — thus making the complete item and its Layouts and Renderings available.
  • Again, you make any changes to the Standard values of the template, and those changes are reflected in the items made from these templates. — Cool Yea?

Well, this is what Layout Deltas is all about!

  • Referring to the Layout and Renderings placed in the Standard values of Templates (instead of the items which was the case in previous versions of Sitecore) — so that if any changes are made to the templates, they are
  • In case specific changes made to specific items, not all details of Layouts and Renderings are stored there — but only the changes, the Delta is stored!

So what was the case in Sitecore versions before 6.4 was introduced or before Layout Deltas came into Existence?

[Updated]The inheritance of those items that were updated — some changes made in presentation details — was broken from the standard values of its templates. So further, if you made any changes to the standard values of those templates, you had two cases.[/Updated]

Lets understand with an example what those two cases were.

In case you made a template say A, and made some N items from them, now you need to make some change to the templates — say additional fields or removal of some fields on change of requirement — then you had two ways of dealing with it:

  1. Making changes to all those items one after the other where in you made a specific change or RESET the layout details from the Presentation Tab for all these items– A very tedious job! :( [Updated]>> RESET : which will set the layout details of standard value you will not find rederings which you have added explicitly on item[/Updated]
  2. Making a new template B with those changes in comparison to the previous template A, and change template of all those N items from A to B. — a bit less tedious in comparison to the previous one, but obviously introduces redundancy in your instance! [Updated] OR the best way is to update standard value of item instead of changing item layout.. which will keep you item sync with template[/Updated]
[Updated]In the above cases considered, one thing was very sure, that it happens only with those items whose presentation details you have specifically changed![/Updated]

So we can say that Layout Deltas is a pretty much required functionality for our Sitecore Instances.

Sincere thanks to my Friend NIMIT PATEL to let me know that previously, it was giving some wrong meaning, and help me correct those things, you find in the Updated Sections

References:

http://www.sitecore.net/en/Community/Technical-Blogs/Getting-to-Know-Sitecore/Posts/2010/10/Layout-Deltas-What-Ifs.aspx

Hope you all enjoyed the post!

Happy Sitecoring and Happy Layout Deltaing!

Reading and Writing in Text Files with multiple programs accessing it simultaneously

Leave a comment

Challenge: Have you ever faced a problem wherein two processes are accessing the same file, one is reading it and the other one is writing in it and one of them (mostly the reader process) gives error that the file is in use by another process? Well, I faced it multiple times in some small tools that I made, and I faced it even in a writer process, when say the status file between multiple processes was kept open, then I found this error in the Application User Logs Concept:Well, first of all,  we need to understand some basic concepts, when dealing with Files. To read and write files, we make use of the FileStream Class. Next, there are Enumerators defined that contain specific flags, which we need to select appropriately in the constructor of FileStream Class, so that the FileStream Object will act accordingly. The Enumerators are: 1. FileAccess

  • Read – Gives read access to the file.
  • ReadWrite – Gives both Read as well as Write access to the file.
  • Write – Gives Write access to the file.

2. FileMode

  • Append – If the file exists, opens it, moves to the end of it and adds there, else creates a file.
  • Create – Creates a new file. In case such a file already exists, then overwrites it.
  • CreateNew - Creates a new file. In case such a file already exists, throws in IO Exception.
  • Open – Opens the file, throws exception if the specified file does not exist.
  • OpenOrCreate – Opens the file if it already exists, else creates a new one.
  • Truncate – Opens the specified file, and once it is opened, specifies to the OS to remove all the contents of that file so that its size is zero.

3. FileShare

  • None – File Cannot be Shared
  • Write – Allow opening File for Writing
  • Read – Allow opening File for Reading
  • ReadWrite - Allow opening File for Reading or Writing

Now, what to do in case you have two processes doing the write and read operations concurrently?? First of all, FileMode doesn’t matter at all! Next, what matters is the FileShare given to both the processes, you should give ReadWrite Share to both — The reader as well as the writer process — so that they are at the same level. And last, is the FileAccess — the reader should be given Read Access while the writer be given either Write Access or ReadWrite Access(in case you use something to append in a file, better use ReadWrite Access.) — For me, FileAccess ReadWrite worked the best.. you can try in your case and find you best  suitable solution. Ok, enough of concept now, Lets look at some code. Sample Code:

static void Main(string[] args)
 {
 ThreadStart jobwrite = new ThreadStart(Writer);

Thread threadWrite = new Thread(jobwrite);

threadWrite = new Thread(jobwrite);
 threadWrite.Name = "Write";
 threadWrite.Start();

/////////

ThreadStart jobread = new ThreadStart(Reader);

Thread threadread = new Thread(jobread);

threadread = new Thread(jobread);
 threadread.Name = "read";
 threadread.Start();

threadWrite.Join();
 threadread.Join();
 Console.Read();

}

– The Reader Process


private static void Reader()
 {
 try
 {
 for (int i = 0; i < 1000; i++)
 {
 using (FileStream fs = File.Open("F:\\111.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
 {
 StreamReader sr = new StreamReader(fs);
 string str = sr.ReadToEnd();

sr.Close();
 fs.Close();

Console.Write("Read: " + str + Environment.NewLine);
 }
 System.Threading.Thread.Sleep(10);
 }
 }
 catch (Exception ex)
 {
 Console.Write("read" + ex.ToString());
 Console.Read();
 }
 }

– The Writer Process


private static void Writer()
 {
 try
 {
 for (int i = 0; i < 1000; i++)
 {
 string status = i.ToString();
 using (FileStream fs = File.Open("F:\\111.txt", FileMode.Create, FileAccess.Write, FileShare.ReadWrite))
 {
 byte[] bytes = Encoding.ASCII.GetBytes(status);
 fs.Write(bytes, 0, bytes.Length);
 fs.Close();
 Console.Write("Write:" + status + Environment.NewLine);
 }
 System.Threading.Thread.Sleep(10);
 }
 }
 catch (Exception ex)
 {
 Console.Write("write" + ex.ToString());
 Console.Read();
 }
 }

Credit: If you liked this article and got the solution for the problem that you were facing, then you must thank my friend and collegue YOGESH PATEL. I was thinking of writing this article since a long time, but did not write it because didnt want to make it a theoritical article. And this guy gave me a superb piece of code that you see above. Well, I gotto say one thing for Yogesh that he is the fastest developer I have ever seen. Once he sits with his headphones/easrphones on, some miracles — solutions to some weirdest problems — come out of his development machine. Happy Concurrent File Accessing!

Log Parser Lizard giving error while parsing query – Unable to Parse a query in Log Parser Lizard

Leave a comment

Challenge:

We installed Log Parser Lizard on a machine, but we were unable to parse any log file. After checking everything over and over again, we just found one error while executing the query.

The error is as follows:

CLogQueryClass: Error 80004002: The specified Input Object does not implement an IComInputContext interface [ Unknown Error]

Solution:

My Friend Kiran Patil and I found a solution for this error after searching a lot for it on internet..

The solution was that we needed to Register the LogParser.dll 

Well, generally this does not happen, but in case it happens with you too, please do this step.

Go to Command Prompt (as an administrator if you are using Windows Server 2008 or Windows 7)

Go to your system drive, (or the drive in which you have installed LogParser.

write regsvr32 LogParser.dll and press enter.

References:

To know more about Log Parser and Log Parser Lizard, click on them.

The links that we referred for the solution.

http://forums.iis.net/t/1145267.aspx

http://forums.iis.net/t/1144794.aspx

Happy Problem Solving and Happy Log Parser Lizard Querying! :)

Querying the IIS Logs Series

1 Comment

Concept:

We all know how much important are IIS logs for any web application. Right from getting the info of the client IP Address,  to understanding the  normal time taken between requests and various other things based on our requirement. There is much more we can know from them if we can filter out the required information out of them, and that’s where the problem occurs. How to find out or extract the information out of our IIS Logs…? :(

Well you will feel it simple at the end of this series of articles of Querying the IIS Logs. :)

The complete series is based on the type of queries — Logically, Output-wise and Query Complexity.

Again, in each post, the article will be divided into three sub categories — Query, Understanding and Example

The complete series will soon be published in coming weeks!

For details on IIS Log fields, please refer to the following link.

For the various examples, lets make use of the Log Parser Lizard.

Again, the above set of articles is based upon purely my study of the IIS Logs, my seniors’ guidance and understanding currently, and I will surely update/add more to this series as and when I discover/study more. I have tried to cover almost all the important queries, but in case I miss it, I apologize for the same and request the readers to add them in comments.

Happy IIS Log Querying! :)

Out Parameters in C#

Leave a comment

Ever thought of using an out parameter in a method?

Lets see what it means and how much can it be useful..

Concept:

Basically, out parameter is a parameter used in a method that is even available after the method returns back to the one that called it.

In simple terms, its the way of using the “pass by reference”.

And yes, this is used whenever you wanna return multiple values from a function (we will see this how in a few mins!)

Understanding:

Whenever we mention a keyword called “out” for a method parameter, in the declaration of that method, it causes the method to refer to the same variable that was passed into the method, instead of making a new copy of that variable, i.e. the parameter that is passed as an output parameter does not create a new storage location, instead uses the same location as the variable given in the argument. — Thus, what is referred to when such a method is called is the address of that out parameter rather than its value. :)

Hence, any changes made to that variable that was passed in that method, are available even after the program control returns back to the calling method.

Also, there is no restriction on the number of parameters to be declared as out parameters… :)

Wow! This is cool yea..? So we can have multiple return values..

Enough of theory guys! Now lets jump into some code! :)

Example:

Just wrote a simple console application for the same. Code is as follows:

static void Main(string[] args)
 {
 string normalstring = "Normal String";
 string outstring = "Normal String";
 Console.WriteLine("Before the Function Scenario: ");
 Console.WriteLine("This is the normal string before the NormalMethod: " + normalstring);
 Console.WriteLine("This is the out string before the OutMethod: " + outstring +"\n\n");

Console.WriteLine("In the Function Scenario: ");
 NormalMethod(normalstring);
 OutMethod(out outstring);

Console.WriteLine("After the Function Scenario: ");
 Console.WriteLine("This is the normal string after the NormalMethod: " + normalstring);
 Console.WriteLine("This is the out string after the OutMethod: " + outstring);

Console.Read();
 }

static void NormalMethod(string normalstring)
 {
 normalstring="NORMAL STRING in Capitals";
 Console.WriteLine("Normal String printed in the NormalMethod: " + normalstring);
 }

static void OutMethod(out string outstring)
 {
 outstring = "Out String";
 Console.WriteLine("Out String printed in OutMethod: " + outstring + "\n\n");
 }
And the screen shot on executing this program is as follows:

Screen-shot

Something Important:

Hey but I can do the same using one more keyword called ref. Then why do I use out keyword instead of ref.

Well, there is a small reason for it. When using the ref keyword, you got to initialize the variable before you pass it on to a method. While, there is no such requirement in case of out keyword, i.e. it need not be initialize before passed to the method. (Hey this one is an advantage of out keyword over the ref keyword! :) )

Also, the out keyword and the ref keyword are treated differently at Runtime rather than at Compile time. And hence, you cannot have overloaded methods wherein one takes out parameters while the other one the same takes them as ref parameters.

Conclusion:

So I think the article tells us about some very important things that may be required in programming and that can be completely fulfilled by the use of out keyword.

1. Availability of the updated value of a variable in the calling method.

2. Return multiple values from a method.

3.  No need of initializing the value of a parameter before passing it to the method.

3.  Pass by Reference Concept!

Happy Out Parameterizing! :)

Sitecore Users Virtual Group – An initiative to help Sitecore Users

2 Comments

Hello Friends!

You guys know about Sitecore Users Virtual Group?

Basically its an initiative to educate the Sitecore Community and help Sitecore Enthusiasts and Sitecore Developers to know more about Sitecore.

Each month, there is a meeting organized wherein some Sitecore Expert(s) come(s) up and impart knowledge — Believe me its superb!

I follow this group right from May 19th 2011, from when I found its existence while surfing for Sitecore related stuff.

The group is sponsored by the Sitecore Technology Partner: Hedgehog Development.

To know more about the group please follow this link : http://sitecoreug.org/

Also, recently got to know from one of my colleague Maulik Darji who is also following the group,  that they even have a

Youtube channel : http://www.youtube.com/user/hedgehogdevelopment

And they are keeping it updated with all the meetings! :)

So friends! Incase you missed any of the meetings previously organized, you don’t need to worry! Just go to this youtube channel and enjoy! ;)

Happy Learning and Happy Sitecoring! :)

Visual Studio 2010 Features and Enhancements – what a dotnet developer wants!

1 Comment

Well Visual Studio as we all know is a super tool that we Dotnet guys use. I just got to know it more when we migrated all our solutions from Visual Studio 2008 to Visual Studio 2010(Well, the credit for migrating successfully goes to Kiran Patil who did it so smoothly!) And that’s how I got to know VS2010 in depth, and during this week, when I was on my small vacation, I tried to learn some very useful things about Visual Studio 2010 s that I can use it more smartly. VS 2010 has surely brought about a type of revolution in the world and taken Dotnet Development to the next generation. For putting in my experience and findings on VS2010 as compared to VS2008, Let me divide into two main things,

  • Performance Improvements (as compared to previous versions of visual studio)
  • Features

1. Performance Improvements

Well, here we will discuss in rather the following way… What we had in Visual Studio 2008 and What we have in Visual Studio 2010. Basically the problems that were faced in VS 2008 and that now have been taken care in VS 2010.

  • When you had “Show All Files” checked in Visual Studi0 2008 in an open solution which contained of hundreds of files or rather thousands (including various Class Library projects and a web app or a windows app), and you started BUILD Solution, it may seem as if VS had gone off to a sleep ;) . Hello! Anybody Home? You may not be able to work on VS at that particular time and sometimes, it may even result in a white screen just as if VS was telling us Hey Man! Take a chill pill..! :D  But  now, this is no more the case in Visual Studio 2010.
  • When you wanted help from Visual Studio 2008, and you selected Help (Search or Index or anything), the Microsoft Document Viewer may take ages to load. Sometimes you start feeling, Oh God… will this load by tomorrow? And obviously, the better option was to search on MSDN or directly in Google, then to search in the VS 2008 Help. Searching in it took a real long time.  Also, many a times, while loading the help, it may not allow you to work with Visual Studio :( . Now that was so annoying! It would give you the following screen!
Annoying Screen

But Now, in Visual Studio 2010, a Help Viewer is started in seconds than in rather minutes.  And even searching is faster. :)

These were few that I had experienced a lot. There are some others too, but I would like to concentrate on Features rather!

2. Features

  • Extension Manager
Visual Studio 2010 includes an Extension Manager within the IDE itself. This extension manager makes it very easy for various Developers to search, download and use extensions online.
Extension Manager is opened using the Menu option Tools>Extensions Manager
But again, as the features increase, so does the complexity. Try not to add many extensions to your Visual Studio as it will end up making your working with Visual Studio very slow.. (this is from my personal experience ;) ) Add only those extensions that are really useful to you! Always apply the KISS Rule(Keep it Simple and Silly)!
For more details on Extension Manager, refer to the following links:
  • Multi-monitor Support
This is I think the best part in case you have multiple monitors attached to your system. Microsoft has made Visual Studio 2010 such that we can take advantage of them. Now, the tabbed documents (the files of our Solution that we open as tabbed docs) are not attached to the VS Frame i.e.  they can be moved outside the main VS Frame and taken on to the next screen.  Isn’t it cool?? :)
For more details on Multi-Monitor Support, refer to the following links:
  • Call Hierarchy
Previously, when searching for use of any particular method or function, we used to right click on the methodname and click  ”Find All References”. It would take ages to reflect them and then finally some results would appear in the results window. But now, a cool new feature. Goto the methodname, right-click and select “View Call Hierarchy” and bingo! It appears just as you click it. And gives you both the types of details — Calls to Methodname and Calls from Methodname. Just as below.
For more details, refer to the following links
There are many more performance improvements and features just highlighting a few here.

For an in-depth knowledge on Visual Studio 2010 and Dotnet Framework 4.0 refer to this link: http://weblogs.asp.net/scottgu/archive/2009/08/25/vs-2010-and-net-4-series.aspx

Hope you enjoyed this post!

Happy Coding and Happy Visual Studioing! :)

1000 Blog Hits and Growing!

9 Comments

Hello Friends!

Recently my blog got 1000 hits. And it is all thanks to all of you who have been referring to it on a very regular basis.

Thank you for all your visits, sharing and support.

A couple of things that motivate me to write articles on my blog  are the various comments and other requests…. Believe me when you get appreciation, it feels so exciting! I mean I can’t explain in words the feeling; the happiness when something written is helpful to others.

I can’t run away without giving thanks to the two guys who motivated me so much for blogging… without whom my dream of blogging would still have been a dream… These two techies are Kiran Patil and Vishwas Shrikhande. Both of them are my colleagues, I had wished/tried blogging some time before, a rather unsuccessful attempt to do it… and had almost lost confidence. But both them inspired me and helped me start  blogging again. Both of them have their own blogs, you can refer to them as follows:

Vishwas a real all-rounder, has a blog called the BeginnersWeb.in - a blog which he is maintaining almost for 3 years now and  gives all the recent updates on the web. (He invited me as a blogger there and I write nontechnical articles there, well not as many as vishwas writes.. ;) )

Kiran a Technocrat, (and a Dotnet and Sitecore Architect according to me and many others with me) has  a couple of technical blogs — one on Dotnet and C# called kiranpatils and other on Sitecore called sitecorebasics.

Well, talking about my blog, it was a rather extremely surprising moment for me when I saw that I am to cross 1000 hits..

So, I took a screenshot, here it is…

Before 1000 Hits!

And then, after was the happy moment! :)

When it crossed 1000 hits!

Once again, Thanks to all those who got inspired and appreciated my work! Yes its to all my friends, readers, sharers and daily visitors!

Happy reading and Happy Sharing! :)

Does your Web Application on Production Servers Crash Unexpectedly?

Leave a comment

Hello Friends!

Have you ever faced a situation wherein your web application running on your production server undergoes a hard crash?

Lets say you haven’t  seen such an issue, still its better to know what to do in such cases.

Concept Understanding:

When any application crashes in the Development environment, its easy to understand where could the fault be. Yea yea… obviously because we have the Facility to Debug the Written Code! ;)

We can write code, fix code replace the code with altogether a new one and try out various ways and means to optimize the code as much as possible.

But think of a condition, where your Live Production Application crashes unexpectedly… (OMG!)

Oh Dear! You don’t have the slightest clue where to start from. Neither do you have the debugging environment to understand where the issue is…

What you feel is: Oops What’s this? and what do I do! :(

How and where to look for?

  • Application Logs

First and foremost you need to look into your application logs, for some Unhandled Exceptions (or recursive loops incase that info is available in logs).

  • Event Logs
In case of any Errors in ur application, they will surely be available in the Applications Tab of Windows Section in Event Logs
You can also take a look at the Systems Tab. It maybe the case that your application wasn’t the problem, but the environment — say IIS crashed or some config change or unknown IIS reset — was.
  • Create a Crash Dump of your application

This is a difficult yet the best option.

But please go ahead with this option in case you can’t find the solution of a problem anywhere on net and even you don’t have the slightest idea what could have led to this!

Lets say how can a crash dump help. Even if your application had crashed, the worker process may have stopped responding to the various requests, but still it will be available in the Memory.
There are various tools available that would help you create a crash dump of your application (Manual Dump).
IIS 7.5 has a facility of creating a Dump File in case your application undergoes a hard crash and yes, the location will be available from the Event Logs.

Now, on analyzing the crash dump, you would surely get the point in your application where the problem exists!

Hope this helps you solve your Application Crash!

A simple and great article written by Kiran Patil some time back: http://sitecorebasics.wordpress.com/2011/07/22/does-your-cd-servers-crash/

Happy Analyzing! :)

Older Entries

Follow

Get every new post delivered to your Inbox.

Join 960 other followers