Jump to Navigation

Web Design

Virtual spring cleaning

You may be looking for the Nation of Earth, the Ghostly World, or possibly some other sites that no longer exist - and you have ended up here.  Here's a bit more info on why that is the case.

My server (affectionately named Lillith) froze up yesterday while handling various website requests, resulting in some undue panicking on my part as I tried to imagine having to rebuild everything from scratch.  Even though I keep daily backups and such, I'm terrible at documenting everything I set up on the server, consequently it's about 3 years of random configurations, installations, etc. that would probably take me a few weeks to replicate.  I mean - if the server should suddenly die I would probably be able to get the websites back up within a day or so, but other functionality such as email and so forth would be a bit more painful.

But as it turns out the server was fine.  MySQL had recently been upgraded when I was doing security updates over the weekend, however, so I personally believe that this upgrade was the culprit (or more accurately, my failure to properly configure the upgraded version was the culprit).  This was not an immediate conclusion that I reached however.

My server is in an isolated part of our home and does not have a monitor, keyboard or any other connections aside from a power cord and network cable.  I access it remotely via SSH and pretty much handle all changes that way.  Starting at about 9:30am yesterday it was impossible to open a web page, and I could not get SSH to complete a connection.  I also have VNC configured for remote access to my desktop computer so I quickly realized it was not an issue with my internet provider when I was able to sign into that system.  I was concerned that the server might be experiencing a DoS (denial of service) attack of some kind so I cut all access to it at my firewall, and attempted to sign in via SSH from my desktop computer without success.

I tried calling the house but we screen our calls and someone (one of the cats perhaps?) had accidentally disabled the answer machine and Brig was busy tending to our youngest so I wasn't able to get through.  I then decided that I would rather leave the server running in its current state so I could hook up a monitor and keyboard to it when I got home and get a better idea of what was going on.  Of course, life kicked in at that point and after a trip to our CPA to get our yearly taxes squared followed by dinner at our favorite Mexican restaurant, El Azteca, we finally got home and I was able to take a look at the server at around 9:30pm.

Upon getting the monitor and keyboard attached I immediately saw low memory errors as Apache was trying to kill tasks in order to process others.  The hard drive light was solid red and the drive was very noisy as it was obviously chewing through swap in an attempt to mitigate the low memory problem.  It took three minutes to reach a login prompt, and then I waited another five minutes to get to a command prompt with the idea that I could stop Apache from running and figure out the issue from there, but I finally gave up and reset the server.

While I was waiting I looked up the error messages I was seeing on my Droid and came across a Drupal comment that seemed to tie into what I was experiencing, and was also dated March 4th, which was close enough to the date of when I performed the MySQL upgrade that it seemed likely to tie into my problems.  I'm not using a virtual server, but this information still seems to apply to my configuration.

When I first hooked up the monitor I was seeing error messages similar to this one:

Killed process 18762 (apache2) vsz:187372kB, anon-rss:20172kB, file-rss:380kB
Out of memory: kill process 18740 (apache2) score 46907 or a child

Not an exact error but I had searched for "killed process apache2 out memory" and found several articles, the one linked above being the most pertinent.  So as per the comment author's suggestions I followed these steps below.

I first edited /etc/mysql/my.cnf to include the following settings:

key_buffer = 16K
max_allowed_packet = 1M
thread_stack = 64K
table_cache = 4
sort_buffer = 64K
net_buffer_length = 2K (I had to add this line as it was not already there)

The article also suggested adding the line "skip-innodb" to my.cnf if you don't use InnoDB tables.  I am using Roundcube webmail, however, which uses InnoDB tables, consequently I did not add this line.

I next ran this command to find out what type of MPM is used in my Apache so I could edit the correct section of the config file:

apache2 -V | grep 'MPM'

My installation uses "prefork" so I edited that section of /etc/apache2/apache2.conf with the following:

StartServers 1
MinSpareServers 3
MaxSpareServers 6
ServerLimit 24
MaxClients 24
MaxRequestsPerChild 3000

I then restarted both apache2 and mysql with the following commands:

sudo /etc/init.d/apache2 restart
sudo service mysql restart

The comment also suggests updating your Spamassassin configuration if you have one - but mine is currently inactive.  I also need to reduce the size of my swap partition to something a bit more manageable - it's currently a bit too large for a typical server.

However, at this point everything seems stable, and has continued been so since last night.  But while I checking things out I decided it was time to tidy some other things up.

My friend fil had asked me to take his website, the Nation of Earth, offline.  I had been hosting it for him as part of my Drupal installation, and while it gathered some interesting people and resulted in some cool discussions, it was also a maintenance headache as the site was continuously attacked by spammers trying to insert dangerous hyperlinks into comments across the site.  Even with troll, bad behavior and recaptcha modules installed, along with restrictive comment support and limited access provided to new user accounts, the site continued to require periodic maintenance to remove unwanted content and block offending users and IP addresses.  This sort of activity is like trying to prevent the tide from destroying your sand castle - it never ends.

So as per his request I exported his user contacts and nodes into readable format and sent him copies.  I also backed up the site files and SQL database and sent him copies, then removed them.

My other site, The Ghostly World, had been registered to ghostlyworld.com but I had opted to not renew the domain name registration last year due to lack of free time to work on the project.  I had migrated the site to ghostly.fatedtoend.com and had promptly forgotten about it.  Based on this I decided to pull the trigger and take it completely offline in the same fashion.

There were some other lingering SQL databases that were still getting backed up nightly even though they were not tied to any sites, so I archived those and dropped them.  I am now only managing three Drupal sites including this one - the other two are my wife's blog Dakini Hikwsi and my MUD site, Meat MUD Classic - which is soon going to get similar treatment as it is replaced by the new site for Havens MUD (when I get around to it).  I also have registered my last name as a domain and plan to build a personal portfolio/resume site around it in Joomla (which is probably overkill for such a project but I've been meaning to check it out and get more familiar with that CMS - it's about as popular as Drupal for a reason).

So there we are - virtual spring cleaning on my server.  The size of my total Drupal installation is now much smaller, which means less needs to get backed up nightly.  This will also mean my backups don't need to be purged as frequently.  In addition, less sites are active, so there is less load on the server, which means everything should be hunky dorey (for now).  Heh (crossing my fingers).

How to get Drupal to post updates to Twitter again (or How to Fix the Twitter module in Drupal)

Recently Twitter changed its app policy to require the use of something called Oauth to connect to its servers.  This is actually a good thing because instead of using someone's Twitter username and password to gain access to applications, it instead asks for an OAuth key and OAuth secret to connect to the Twitter service.  This system should be far more difficult to circumvent for any applications that may be trying to steal your Twitter credentials.

The downside to this is that it caused many sites using the Twitter module for Drupal to lose their ability to submit updates to their Twitter account.  I use this module to automatically update my Twitter profile with a link back to my new blog posts.  After the OAuth changes occurred, I had been forced to manually post updates to Twitter.  Thanks to the Drupal community, however, I was able to get it working again.  This is how (these directions are for Drupal version 6):

First you need to get an updated version of the Twitter module, if you have not already done so.  The version I obtained was 6.x-3.0-beta2 which can be downloaded from here:  http://drupal.org/project/twitter (Warning:  many security-minded Drupal developers strongly discourage the use of Beta modules on production websites for security reasons - this is probably a good idea if your site allows users to freely sign up and create their own accounts without approval - proceed at your own risk).

You also need to get and install the OAuth module from here: http://drupal.org/project/oauth - but make sure you do not install the 3.0 version - Drupal's Twitter module will only work with OAuth version 2.0 (or more specifically I obtained version 2.02).

If you accidentally get version 3.0 (like I did), you will need to uninstall the OAuth 3.0 module and delete it from your modules folder before installing the correct version.

Go to Administer > Site Building > Modules and enable OAuth and Twitter signin (if you are setting up Twitter for the first time you should also enable Twitter, Twitter actions and Twitter post, Twitter actions is only necessary if you intend to create rules regarding Twitter).

Once both modules are installed, access the Twitter configuration page (Administer > Site configuration > Twitter setup) and click on the "register your application" link to take you to Twitter to in order to register your website as a browser application.  Note the Callback URL - it should look like "http://<your site address>/twitter/oauth - you will need this for the application registration.

You will need to sign in with your Twitter user name and password, and you will be taken to the registration page.  On this page make sure you fill out the appropriate information for your website.  Select Browser under Application type.  Enter the Callback URL you noted in the previous step, set access to Read and Write, and select Yes use Twitter for Login.

Twitter will provide you with an OAuth consumer key and a consumer secret code after you submit your registration form.  Return to Administer > Site configuration > Twitter setup on your website and place the key and the secret code in the appropriate fields. You may also want to make changes to the setup under the Post and Sign-In tabs to suit your preferences.

Finally, you will want to sign into the user account you wish to be able to post to Twitter on your Drupal site.  Edit your account, and select Twitter accounts.  If you still have a Twitter account listed here, place a check mark into the Delete box and then click Save changes to remove it.  Then click Add account, and you should be prompted to connect to your Twitter profile.  Once you have completed authorizing your website Twitter application, you should be returned back to your account page and you should see your Twitter name and avatar.

Once this is done, you will be able to update your Twitter account automagically from Drupal.  Sweet!

Revitalization

So I started this Drupal site many moons ago, and in the process I made the mistake of not tagging my posts with some sort of filtering system.  Now that there are well over 300 posts it's gotten a bit difficult to navigate.

On top of that with the periodic changes of how the site handles images due to broken modules or developers with a severe attitude problem/superiority complex, resulting in my switching from Wysiwyg + Img_Asisst to OpenWysiwyg, then to FCKEditor + ImageBrowser and finally CKEditor + IMCE, there's a bit of a mess to clean up.  I'm pretty content with my current CKEditor + IMCE setup - it's not user intuitive to add photos to posts but it's not impossible either.

To explain in a bit more detail, Wysiwyg, FCKEditor and CKEditor are all modules designed to support Java based WYSIWYG editors in Drupal (what you see is what you get).  It makes creating new posts on a web site much easier, sort of like the difference between typing a specially formatted letter out in Microsoft Word, compared to trying to do the same thing with Notepad.  Due to licensing restrictions the editors themselves are not included in the module and need to be downloaded and installed separately - which is not recommended for the Drupal novice.  This kind of editor is built into Wordpress, which is one of the reasons why Wordpress is excellent for someone who does not want to spend a large amount of time messing with nuts and bolts.

But I digress.

The Image Assist, ImageBrowser and IMCE modules are image helper modules, each designed to be used in conjunction with your preferred WYSIWYG editor.  Getting them to play nice with your preferred WYSIWYG editor can be a bit of a challenge as well.  They come in handy, however, if you want to add images to your post without having to FTP them to your server, figure out where they are located and add the hypertext code to the post manually to get them to appear the way you want - this entire process is streamlined with just a few clicks using one of these modules.

My original reason for dropping the modules Wysiwyg and Image Assist was because the developer of both projects decided he would mark any versions that were no longer being actively developed as a severe security problem.  His reason for doing this was to ensure people would use the latest versions of the project to assist him in finding and correcting bugs.  I have a two-fold problem with this - first, it took a rather long time to get Wysiwyg and Image Assist working properly, and an upgrade could break them, requiring additional hours of work to get them functional again.  Second, I don't like a software developer forcing me to use a specific version of their software by sending security warnings to my website that are not, in fact, security warnings.

My third issue was with the Image Assist module, which was supposedly designed to make it easy to transition a site to a new location, lost all of its connections to images after I relocated the folder on the FatedtoEnd server during the upgrade to Drupal 6.0, and at the time my skills in MySQL were not up to the task of repairing the damage.  What is most annoying is that Image Assist was used heavily on other sites hosted here, and disabling the module also breaks those images, leaving non-standard tags in the post that make it difficult to track down the images they are supposed to display.  We've had broken image links ever since the upgrade - and I'm only now going through the site and fixing them because there are even MORE broken image links after I stopped using ImageBrowser.  Some images just can't be found, or the post was created so long ago I can't remember what picture I used.  I'm simply stripping the image tag out of these posts.

I briefly tried OpenWYSIWYG but I did not like the interface necessary to upload and add images to the page.  After just a few days of trying it, I removed it and installed FCKEditor and ImageBrowser.  It is worth noting, however, that the images loaded into posts created by OpenWYSIWYG were not affected by its removal.

ImageBrowser shares the same guilt as Image Assist in that it uses a non-standard method of displaying images on posts.  I know this because if there was standard html being used none of the images would have been affected by the removal of it.  It was nice in that it allowed a visible preview of a certain number of images on the site, and does not show every individual file, which can be a bit of a pain to wade through.  But the non-standard thing is a problem to me.

The problem is not all Drupal modules receive continuous development - the popular ones will typically attract new developers of the old ones get burned out, but sometimes modules are discontinued in favor of newer ones that do the same thing, but better.

Therefore, I was looking at the potential problem down the road of needing to either a) find a new method of displaying this content or b) the faint possibility of needing to port this content to another CMS system such as Joomla, in which case I would be looking at all of this work all over again.  This is why I went with IMCE, which seems to be popular enough that there will probably always be a developer, and because it uses standard html to insert images, which I prefer.

CKEditor is just the latest version of FCKEditor, and has a (in my opinion) nicer interface than older versions.  I've also finally been able to use the site's CSS code within the CKEditor, which means as I type what I see is really what I will get when I am finished, with maybe just some line reformatting.

Last but not least, I managed to get Lightbox2 working again, which is the nice animation popup you get when clicking on an image to see a larger version.  The method used to do this is to assign a "lightbox" class to each image I want this function to work on.  I prefer this to the old way of making Lightbox open up any image you click on, some images I either want people to view the old fashioned way by going straight to the image in the browser away from the rest of the page, and some images I don't want to pop up with a larger view.  All in all it works out well.

To assist the navigation of the site I've started using categories.  There is a list on the left side - currently clicking "Categories" does not help but clicking the + to the left of it will reveal the entire list, and it is then possible to chop through sections of the site.  I would like to make navigation a little easier than that, but most likely that will require some additional work.  I've still got over 100 posts to work through - only half of Fated to End has been categorized so far.

What's next?  Hopefully some creative writing will soon be added to that column on the left as well.

Why CSS can be utterly evil

Dr. EvilI like CSS - I've been using it ever since I was first introduced to CSS by blogger.com when I decided I wanted to create my own blogger themes.  However, there are things about CSS that are ... to be desired.

For a quick example - the title of this website, "Fated to End Sometime" has a nifty drop-shadow effect that is visible in Chrome and Firefox, but not Internet Explorer (if you use Safari or Opera I'm curious about how it renders for you - feel free to take advantage of the "Feedback" link up at the top-right).  The reason for this is that CSS does not have a defined standard that is adopted by all web browsers.

In short, what works great in one web browser may look terrible in another, or simply not work at all.  Yay for not adopting standards (sarcasm alert)!

For those of you not in the know, I am using Drupal again for Fated to End Sometime after a brief foray into the world of Wordpress.  Wordpress is great for most bloggers who don't want to get weighed down with the nitty-grittys of CMS maintenance - a lot of the functions that can be a pain for new users in Drupal have been significantly simplified for Wordpress and there is a lot less work involved in getting a site up and running (and ready to rock).

However, when it comes to theming, Wordpress is a pain.  It's a bit more of a pain for other things - such as adding on the fly functionality that hasn't been developed yet.  I also felt like I was installing nagware when I added in certain functionality to the Wordpress site - a lot of these add-ons have a built-in Donate button at the top, which on the one hand means the developer is more likely to see a return on his/her investment in time, but at the same time I felt like I was being dishonest by using their product without donating.

I hate being manipulated, especially into paying for something.  So I dropped Wordpress and reverted back to the Drupal version of Fated to End, after importing content posted on the Wordpress site.

I've been using basically the same theme for Drupal for the past four years or so, and since it's a stock theme (minus the logo and colors) I had grown rather tired of it.  Creating a new theme for Drupal is not a simple task, however - it's not like you can just create a CSS template file and be done.  There are a number of different sections of a drupal site, even on just one page, that are each handled separately in individual CSS files.

To make things significantly easier one can use the Zen theme to create what is called a Subtheme - Zen provides the core files necessary to create your own theme without having to write everything from scratch, and allows for multiple subthemes to be created (which comes in handy when hosting multiple websites on one Drupal installation).

The issue I ran into (which was not immediately evident) was the Search box at the top-right of the page could not be accessed in Firefox or Google Chrome.  It worked just fine in Internet Explorer, however, which added to the dilemma.  Typically it's the other way around - something that works in Google or Firefox does NOT work in IE.  So I had to do some thinking.

After digging around a bit I remembered that CSS allows for positioning elements on top of one another (similar to cutting shapes in construction paper and gluing them on top of one another), and so I started looking at the way I had moved the Search box to the right side of the page and how I had pushed the title down from the top to make it easier to read.  I had used a position: relative; statement to move the title, which had the undesired effect of placing the entire title field over the search box.  It could not be clicked because it was UNDER the title, even though it did not appear to be so.  To fix this, I had to change the title to a position: absolute; and provide coordinates from the top and left side of the page to place it in the same spot.  This also made the Search box jump to the top of the page, so it also needed a position: relative; statement to be placed back to its current spot.

So....like I said, while CSS is rather cool...when it comes to stuff like this it's a bit of a pain in my butt.  If anyone is familiar with a tool one could use to view the layers in CSS and how they interact with each other inside a browser, please do me a favor and let me know.

diaspora*

Oh hell yeah. This is one of those things I really want to succeed.  Badly.  This could potentially revolutionize the way we currently social network, especially what with the coming of Windows Home Server and other things that might make it easier for the everyman to set something like this up.

What the heck am I talking about?  diaspora* aims to become your very own Facebook-type website/portal/network that you have full control over.   A site where you never have to worry whether someone is going to make a confusing change to your privacy settings, or take them away.  A site where you never have to worry about someone changing the layout in confusing ways, or someone trying to trick you into downloading a virus on your computer, or someone stealing your personal information in various scam/con-artist ways.

The problem with Facebook is that for a lot of people (myself included) it is difficult to leave because everyone you want to keep in touch with is already there.  What would be better is if there were no central central hub that connected everyone's diaspora* site, but rather each site retains its own related function, giving everyone the same connection to their friends & family without the worry of their privacy being sold to the highest bidder.

I would go so far as to say that this is currently the best chance for the user to take back the internet from the hands of shady characters like Mark Zuckerberg.  Currently Facebook gets more traffic than Google.  I'd like to see that change with the advent of diaspora*. Hopefully as this project starts to get underway I will have the opportunity to start hosting early builds of the project - depending on the level of difficulty in doing so of course.  I plan to start keeping track of my progress here at the same time, and I plan on keeping it in terms that anyone could understand, with the hope that other people will be able to set up their own.

Fated to End Sometime...but not this June

I just renewed fatedtoend.com today, even though it doesn't expire for a couple more months.  I'm typically a procrastinator, but seeing as how there are currently 4 different websites that operate under the *.fatedtoend.com domain, I decided it would be wise to be proactive instead.

Simultaneously, I finally disabled the following addresses that were still pointing to this server:

fatedtoend.servehttp.com, meatmud.servegame.com, and dakini.servehttp.com

These were the original free domain names I used from no-ip.com when I was first getting started.

So what makes no-ip.com so special?

Well, it helps that they have showed no indication of behaving like certain other domain name registrars who have pulled some shady moves with their customers in the past.  So far no-ip.com has contacted me twice by e-mail, once to alert me that their software utility had been updated with a more secure version, and a second time to let me know that fatedtoend.com would be expiring soon.

What really makes them shine, however, is their free Dynamic DNS updating utility for all server platforms (including LINUX).

Dynamic DNS is a great way to avoid having to pay extra for a static IP address.  IP addresses are the number addresses assigned to every computer and server that connects to the internet.  Most computers are given IPv4 addresses, which consist of number groups that look like this:  192.168.1.100 - the downside to this type, however, is that the number of available IP addresses worldwide is finite.  And they are rapidly running out of these addresses.  Consequently, static IP addresses cost extra money on a monthly basis.  Most internet service providers do not assign static IP addresses to their customers, but rather randomly assign them a new IP address every time their high-speed modem makes a connection.  As long as the modem stays on and connected, the IP address remains the same.

But if the power should go out, or something else disrupt the service, that would cause the number to be different once everything reconnected.  For normal internet users this is not a problem.  But for people who are hosting servers to the internet, this could be a regular pain in the neck.

Without no-ip.com's free software utility, I would have to sign into no-ip.com every time my IP address changed to update the web address of fatedtoend.com with our new number.  However, their noip2 utility does this automatically.  Every 30 minutes or so it checks the server's IP address, and if it has changed since the last time it checked, it signs into no-ip.com for me and updates everything.  It does this for every domain name I have registered at no-ip.com (currently there are 3).

On top of that, I was able to renew fatedtoend.com for $10 instead of the usual $15 today because I found a coupon for no-ip.com on one of those various coupon websites out there.  Not a bad deal, all things considered.

So if you want to have your own server, or even if you want to simply give yourself easy access to your computer while you are away from home, no-ip.com makes this really easy to do, and will potentially save you a lot of money in the process.

Quick-post on Site Changes

Just in case anyone was wondering what's goin on 'round here since things look a little different, here's a quick sum-up.  I'll probably take this post down and do a more detailed explaination later - or maybe I won't.

  • New accounts need to be created by me - click the Feedback link at the top to request a username
  • I did away with the chatbox since I was the primary person using it - it didn't exactly work correctly nor fulfill my wishes and required me to use a 3-column layout instead of this simpler 2-column that I prefer
  • You can no longer see who is connected while they are connected - but that may come back if I figure out a good instant-communication option and a way to make yourself invisible
  • Obviously we are back to a 2-column layout - I also moved the sign-in from a block in the left column to a bar at the top - I like this appearance much better when you're not signed in
  • Videos and Photos are no longer visible until I get a chance to figure out why they are both broken

Upgrades & Broken Things

You may have noticed some differences since you were here last.  Let me sum up:

I installed the latest release of Drupal 6 on this server.

I then created test site to set up various modules and themes and make sure they are working (http://changeling.fatedtoend.com)

Then I upgraded Brigitte's site (http://dakini.fatedtoend.com) to Drupal 6, and transferred it from its old location to within the new Drupal 6 installation alongside the test site.

Tonight, I upgraded Fated to End Sometime to Drupal 6, and again transferred it from its old location to within the new Drupal 6 installation alongside the test site and Brigitte's site.

The downside is some images got broken in the process, and I'm not sure if I will be able to rebuild them or not.  The good news is the photo galleries are working.  You have probably already noticed there is now a working chatbox.  I rearranged the layout of this site to accomodate it and still make things easy to navigate.  There is more to do but I need to get up early tomorrow, so I'm calling it quits for now.

There is one more piece of good news - it is now very easy for anyone who wishes a site hosted on my server to be up and running with lots of additional functionality at their fingertips (cough cough Fil) - I just need to know details before I go throught the whole process of setting such a thing up.

If you run into problems or some critical things are missing please make sure you leave me a comment or send me a message with the "Contact webmaster" form.

Considering Upgrade

The fun thing about trying to keep up with the times in the world of computing is that you really need to update at least once every other year.  In the internet world, you should probably be updating more frequently, especially when you run a web-server.

We are currently operating at Drupal level 5.8, while the latest release in the Drupal 5 series is 5.10, which means we are technically two releases behind, and each release tends to correct known security flaws in the package.  Upgrading is not a small project for the faint of heart - it basically involves backing everything up, unpacking the latest version, transferring your backed up files into the new version, and overwriting the old version, and praying that you didn't accidentally overwrite something critical or forget to transfer back a critical chunk of data or module or theme set or...well I think you get the picture.

Drupal also currently offers another set of web packages at series 6 (currently at version 6.4), and is in development for series 7.  To a certain extent this makes me want to pull my hair out in frustration.

The downside of upgrading to 6 is that there will not be compatibility for the current set of 3rd party modules we are using for added functionality, and I will need to locate upgraded or alternative module sets during the upgrade process to give us that functionality back.  There is also no support for the additional optional themes offered here, but I personally don't feel as though that is a serious downside considering we are using a slightly modified stock theme as the default.  Also, there are less modules available because 6 has not been out as long, and let's not even consider jumping on board 7 yet okay?

The upside of upgrading to 6 is that we will have a better longevity of support from the Drupal development team (version 5 will eventually be discontinued at about the same time that version 7 is released).  We will also have the option of migrating all existing websites hosted on the Fated to End server (http://dakini.servehttp.com & http://meatmud.servegame.com) and adding additional sites if needed that all are based on the same Drupal core package, with all the same features and functions, but individual themes and styles and possibly special individual features as well.  It would be easier to maintain because they would all be part of the same core instead of individual packages.  But they would also retain their own individual SQL databases as well.  So I'm kindof leaning in that direction, while knowing it's going to take me a couple weeks altogether to get everything back the way I like it.

Of course, I'm curious to hear other people's thoughts on the subject, so leave a comment if you get a chance.

Syndicate content