blog.morf.cz

Tag: PHP

Drupal 7 – return of the king?

by morf on Jan.03, 2010, under Blog, News

It’s been a while since i heard rumors about upcomming release of Drupal – Drupal 7. Lately i decided to make some research about this new version, and surprisingly i was pleased from what i saw. It looks like they did lot of work on Drupal for next release. We check some of them now.

First of all its eyecandy new GUI, which is really tasty, i hope all of you will enjoy the new admin theme with toolbar and cool overlay. I just hope Drupal developers know what they are doing, and Drupal will not slow down on the client (browser) side because of lot of javascript animations and stuff. But it looks pretty light so far.

Also Drupal 7 will bring lot of top modules into the core, like: cck, views, pathauto, and enhanced image support, or administration Toolbar (formerly known as admin menu, which is one of most popular modules at all).

You can setup and try Drupal 7 yourself by visiting Drupal 7.x-dev page, and download Drupal 7 development package. Using this package in production Environment is strongly not recommended. For those who don’t wanna install, but just try, i found Drupal 7 sandbox, where you can play, but play nice…

Here is set of installation screenshots which you can use as installation guide. Anyway installation is pretty user friendly. The requirements for installation changed a bit, you have to create directories: sites/default/files sites/default/private/files sites/default/private/temp , then copy sites/default/default.settings.php to sites/default/settings.php and set all of them to be writable by web server.

Another important thing is Drupal 7 will require PHP 5.2+ only, according this post. This will bring better performance and better funcionality based on sqlite, date, simlexml and other php 5 funcions. Drupal community giving their best into UI improvements and because of that, they started Drupal 7 User Experience Project, IMHO nice example of really openning development to public.

VN:F [1.8.7_1070]
Rating: 0.0/10 (0 votes cast)
VN:F [1.8.7_1070]
Rating: 0 (from 0 votes)
Leave a Comment :, , , , , more...

Zend Framework Custom Dojo (Dijit) Helpers

by morf on Dec.26, 2009, under Blog

Implementing custom Dojo or Dijit into the Zend Framework View Helper is pretty simple. Lately i need this feature for Menu and MenuItem Dijits. I will provide you an example how to do it yourself for another Dijits. This example should work with other Dijits as well (i tried Dialog, DropDownButton, Menu, MenuBar, MenuItem, TitlePane, ToolBar, Tooltip Dialog, and Tree so far).

Ok let’s show the code. You have to create custom Dijit Zend_View_Helper by extending Zend_Dojo_View_Helper_DijitContainer class. Don’t forget to alter: DocBlock, $_dijit, $_module, and direct function (eg. menu() or menuItem() ) and function DocBlock.

Implementace vlastních Dojo nebo Dijit pomocí Zend Framework View Helper je pěkně jednoduché. Nedávo jsem potřeboval tuto vlastnost pro Dijit Menu a MenuItem. Poskytnu vám příklad jak to můžete udělat sami pro jiné Dijit. Tento příklad by měl fungovat pro ostatní Dijity bez problémů (zkoušel jsem Dialog, DropDownButton, Menu, MenuBar, MenuItem, TitlePane, ToolBar, Tooltip Dialog, a Tree zatím).

Ok následuje ukázka kódu. Budete muset vytvořit vlastní Zend_View_Helper rozšířením (extend) třídy Zend_Dojo_View_Helper_DijitContainer. Nezapomeňte změnit: DocBlock, $_dijit, $_module, a funkci pro přímé voláním (např. menu() nebo menuItem()) a DocBlock funkce.


Sorry Code Highlight is broken … :-(


Omlouvám se ale zvýraznění kódu je mimo provoz … :-(

/**
 * Dijit Menu Implementation
 * @author morf
 * @version
 */

/**
 * Menu helper
 *
 * @uses viewHelper Zend_View_Helper
 */
class Zend_View_Helper_Menu extends Zend_Dojo_View_Helper_DijitContainer
{
 /**
 * Dijit being used
 * @var string
 */
 protected $_dijit  = 'dijit.Menu';

 /**
 * Dojo module to use
 * @var string
 */
 protected $_module = 'dijit.Menu';

 /**
 * dijit.Menu
 *
 * @param  string $id
 * @param  string $content
 * @param  array $params  Parameters to use for dijit creation
 * @param  array $attribs HTML attributes
 * @return string
 */
 public function menu($id = null, $content = '', array $params = array(), array $attribs = array()) {
 if (0 === func_num_args()) {
 return $this;
 }

 return $this->_createLayoutContainer($id, $content, $params, $attribs);
 }
}
/**
 * Dijit MenuItem Implementation
 * @author morf
 * @version
 */

/**
 * MenuItem helper
 *
 * @uses viewHelper Zend_View_Helper
 */
class Zend_View_Helper_MenuItem extends Zend_Dojo_View_Helper_DijitContainer
{
 /**
 * Dijit being used
 * @var string
 */
 protected $_dijit  = 'dijit.MenuItem';

 /**
 * Dojo module to use
 * @var string
 */
 protected $_module = 'dijit.MenuItem';

 /**
 * dijit.MenuItem
 *
 * @param  string $id
 * @param  string $content
 * @param  array $params  Parameters to use for dijit creation
 * @param  array $attribs HTML attributes
 * @return string
 */
 public function menuItem($id = null, $content = '', array $params = array(), array $attribs = array()) {
 if (0 === func_num_args()) {
 return $this;
 }

 return $this->_createLayoutContainer($id, $content, $params, $attribs);
 }
}
/**
 * Usecase:
 */
 $this->menu()->captureStart(
 'hosting-nav-menu',
 array(),
 array(
 'style' => 'width: 100%',
 )
 );

 echo $this->menuItem(
 'hosting-nav-menu-programm',
 'Programms',
 array(),
 array()
 );

 echo $this->menuItem(
 'hosting-nav-menu-service',
 'Services',
 array(),
 array()
 );

 echo $this->menuItem(
 'hosting-nav-menu-ad',
 'Ads',
 array(),
 array()
 );

 echo $this->menu()->captureEnd('hosting-nav-menu');

Now you can download working example application here.

VN:F [1.8.7_1070]
Rating: 7.0/10 (2 votes cast)
VN:F [1.8.7_1070]
Rating: 0 (from 0 votes)
2 Comments :, , , , more...

Post Affiliate Pro 4 and eAccelerator

by morf on Dec.08, 2009, under Blog

Před několika dny jsem instaloval PAP 4 pro jednoho z mých klientů, všechno šlo jako po másle, ale to pouze do okamžiku než jsem zapnul trackování. V ten okamžik se PAP skripty zacyklily a to tak, že apache tread se neukončil a žral 100% CPU, a tot se opakovalo při každém dalším trackovaném kliku. Po chvíli jsem se rozhodl vyzkoušet vypínat PHP moduly jeden po druhém, nejdřív APC Cache, potom eAccelerator… a bingo, byl to eAccelerator.

Podle toho support postu – nemůže používat eAccelerator s Post Affiliate Pro. Dobrá, prostě jsem vypnul eAccelerator modul. Ale dnes jsem chtěl odladit tuto chybu na svojí pracovní stanici, ale byl jsem ještě víc překvapený, když všechno fungovalo bez chybičky… Nejsem si ještě jistý co si o tom myslet, ale vypadá to že jenom něketeré systémy nebo verze jsou ovlivněné – eAccelerator 0.9.5.2 @ x64 CentOS – Fail, eAccelerator 0.9.6-rc1 Ubuntu i386 OK… (oba stroje PHP 5.x, MySQL 5.x, Apache 2.x).

Few days ago i installed PAP 4 for one of my clients, everything works just fine, since i enabled click tracking. Then one of PAP scripts cycled out and keep Apache process running eating almost 100% CPU, another click tracked, another zombie eating my processor spawned. After while i tried disable php modules one by one, first APC cache, then eAccelerator… and bingo, eAccelerator it was.

According this support post – you can’t use eAccelerator with Post Affiliate Pro, OK. I just shut the module off. But today i want debug this error on my workstation, but i was even more suprised when everything works like a charm… I really don’t know what to thing about this yet, but it looks like only some systems are affected – eAccelerator 0.9.5.2 @ x64 CentOs – Fail , eAccelerator 0.9.6-rc1 Ubuntu i386 Ok… (PHP5.x , MySQL 5.x, Apache 2.x).

VN:F [1.8.7_1070]
Rating: 0.0/10 (0 votes cast)
VN:F [1.8.7_1070]
Rating: 0 (from 0 votes)
Leave a Comment :, , , more...

Magento Performance Enhancement

by morf on Dec.08, 2009, under Blog, Magento

Omlouvám se, ale článek ještě není dostupný v české mutaci.

Magento Commerce is very robust system which make me happy with its complexness, but on the other hand this robustness implied bad performance. There are few but reliable tips for Magento Performance Enhancements before you should upgrade your server. You can tune Apache web server, PHP engine configuration and modules, MySQL server configuration, and at last you have to setup Magneto to use this tunes.

  1. Apache tuning
  2. PHP tuning
  3. MySQL tuning
  4. Magento configuration

1. Apache tuning

There is few tips how to speed up Apache quickly. You need edit your apache.conf or httpd.conf file, or your virtual named host configuration file. First of all you should read official Apache Performance Tuning, or Configuring Apache for Maximum Performance at Linux Gazette. Before you start experimenting with this you want backup your apache.conf or httpd.conf especialy if you dont know what you are doing :-)

Few simple advices noted in articles above – setup apache to worker if you can, disable unused apache modules, use mod_deflate and mod_expires. Documentations: Apache 2.0 mod_deflate, Apache 2.0 mod_expires. After making changes to Apache you 100% sure wanna test the server performance in load. Last tip – if you disabled AllowerOverride Magento .htaccess file will not work, so you have to copy the content to your Apache Virtual named Host configuration.

2. PHP tuning

As above the basic tip is – you should disable all unused PHP modules wasting useful resource. Then you could enable few good modules to enhance performance.

2.1.1. eAccelerator

eAccelerator is must have extension of PHP which can help your Magento performance a lot, because it can do few tricks to speed up Magento Scripts and what is even better – “eAccelerator typically reduces server load and increases the speed of your PHP code by 1-10 times.” You can find informations at official site. Example configuration for eAccelerator is:

zend_extension                  = "/usr/lib/php5/20060613+lfs/eaccelerator.so"
eaccelerator.shm_size           = "128"
eaccelerator.cache_dir          = "/var/cache/eaccelerator"
eaccelerator.enable             = "1"
eaccelerator.optimizer          = "1"
eaccelerator.check_mtime        = "1"
eaccelerator.debug              = "0"
eaccelerator.filter             = ""
eaccelerator.shm_max            = "0"
eaccelerator.shm_ttl            = "0"
eaccelerator.shm_prune_period   = "0"
eaccelerator.shm_only           = "0"
eaccelerator.compress           = "1"
eaccelerator.compress_level     = "9"
eaccelerator.allowed_admin_path = "/var/www/eaccelerator"

More informations on eAccelerator configuration you can find at official site eAccelerator settings.

2.1.2. APC (Alternative PHP Cache)

APC have some code accelerating features like eAccelerator above, but my personal experience said when you have APC and enable eAccelerator above, you can got anoteher 30% speed enhancements. But combination of eAccelerator and APC cache isnt recommended. But APC is supported as cache engine by Magento Commerce. So its very simle to configure Magneto to use APC Cache. Example configuration of local.xml with enabled APC cache:

<config>
 <global>
 <cache>
 <prefix>apc</prefix>
 <backend>apc</backend>
 </cache>
 <install>
 <date><![CDATA[Thu, 16 Oct 2008 10:14:54 +0000]]></date>
 </install>
… rest of your local.xml file

But remember to setup different prefixes per Magento installation, otherwise you can get funky results.

2.1.3.  Memcache

Its almost the same like APC cache. It cache data into RAM and create very fast cache backend. You can enable it in local.xml like APC above, just change backend to “memcache” (without quotes).

2.2. Configuration enhancements

There is few significant PHP configuration attributes to setup with Magento. If your installation have thousands of products, few store views, and per view product attributes Magento require to setup bigger memory_limit. Another case is when you write your own long running / memory consuming script which need setup longer running time. In some cases i needed more than 384 MB RAM handling data in Magento with custom script. Ideal way of changing this values is in .htaccess file of your Magento installation (backup before change anything). Another way to enhance speed of your scripts is to enable zlib output compression for your scripts. This is definitively wrong idea, when you using mod_deflate in Apache or another alike zlib.

<IfModule mod_php5.c>
php_value memory_limit 128M
php_flag zlib.output_compression on
</IfModule>
; memory limit for PHP
memory_limit = 128M
; max script running time
max_execution_time = 60
; enable zlib output compression
zlib.output_compression = on

If you cant setup this values in php.ini, then you can try set them in .htaccess (look in .htacces of Magento php4 or php5 section), you can hopefully set them in index.php like that:

ini_set(‘memory_limit’, ‘128M’);

3. MySQL tuning

You can enhance Magento script very well with proper MySQL tunning. This pay double, when you are using Dataflow import / export features for thousands of products etc. Anyway Magento accelerate pretty when you enhance MySQL buffers and caches. Magento use Innodb engine, so you have to enhance innodb settings as well. Before using this tunes be sure backup your my.ini or my.cnf files.

This section is inspired by Performance is Key! – Notes on Magento’s Performance article at Magento Blog.

[mysqld]

# innodb tuning
innodb_buffer_pool_size = 64M
innodb_additional_mem_pool_size = 8M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 2

# key buffer
key_buffer = 96M

# query cache size and limit
query_cache_size = 128M
query_cache_type = 1
query_cache_limit = 16M

# max opened tables
table_cache = 1024

# sort buffers
myisam_sort_buffer_size = 64M

# temporary table size
tmp_table_size = 128M

thread_cache = 16

max_allowed_packet = 64M
sort_buffer_size = 4M
read_buffer_size = 4M
read_rnd_buffer_size = 4M
thread_cache_size = 8

max_connections = 128
wait_timeout = 200

4. Magento configuration

Some another tips cover Magento configuration, and they are short:

1. let Magento put session data in database instead of files. Part of configuration to do that in local.xml

</resources>
 <session_save><![CDATA[db]]></session_save>
 </global>

2. use global attributes for products if you dont need per view attribute values (admin -> attributes)

3. enable APC or Memcache cache backend and of course enable caching in admin -> cache management

4. enable Mage_Compiler module and disable unneeded modules in admin -> system -> configuration -> advanced

5. Other useful tips

If you dont have fast connection enough or you want speed up user connections to your Magento you should do few optimalization. You can batch resize product images, or merge and compress CSS files.

5.1. Image size optimalization

You can simply follow tips for resizing images from this How to Article – Resizing images that are too big or too small for the product pages, en-masse. (Tips from this article need linux compatible OS with some basic programms installed.)

5.2. CSS files compression

Open your Magento layout definition XML in your view. And copy all CSS files contents to one css file, and include it instead of multiple files. Then use CSS Compressor to compress CSS files by removing unnecessary space and definitions. There is possibility all files in one will not work together, then you will have to experiment with right combination (eg. reset + menu + clears , boxes , your own … ).

5.3. Javascript files compression

Is used by Magento by default i think, otherwise you should enable it in your Magento administration.

5.4. Gzip / Deflate  compression

As written above, you can use PHP gzip output filter, or Apache module mod_deflate. Be noticed, than you can use just one of them :)

I hope you liked this post, and find it useful.

VN:F [1.8.7_1070]
Rating: 7.0/10 (2 votes cast)
VN:F [1.8.7_1070]
Rating: 0 (from 0 votes)
Leave a Comment :, , , , , , , , , , more...

How to install Magento Commerce

by morf on Oct.27, 2009, under Blog, Magento

This Post is step by step generic tutorial how to install Magento Commerce.

First of all you should setup your Environment, but if you are installing Magento first time you should check if you fit Magento Commerce System Requirements. In short you need: any os running Apache, PHP, and MySQL. Required PHP modules are: PDO_MySQL, Simplexml, mcrypt, hash, GD, DOM, iconv, SOAP (optional).

Now you need to get Magento Commerce Full Release stable package, and optionaly you could download one of Magento Translations. I suppose you have knowledge to prepare hosting for you, this problematic is not part of tutorial at all. You need one apache virtual host, eg. server, or hosted domain, and one MySQL database (optionaly due to table prefix Magento can share one database with other projects without any harm).

Next step is extracting full package to temporary directory or right to the server root directory. If you download custom translation, extract localization package to app/locale. Example path for cs_CZ localization (eg. Czech language) is app/locale/cs_CZ. Then if you using Linux or Unix OS (almost all hosting providers), you need for some basic Magento functions (images, logging, sessions, temporary files etc.) set up few directories writable for Web Server – app/etc media/ (media/catalog/product) var/ (var/session var/tmp var/log). You dont have to do this in 99% on your Windows OS.

Now the fun begins – you can install Magento. Start up your browser and direct it to your magento url, you should see installation screen now. Confirm agreement, next select localization, time zone and currency, next fill up db connection details, setup session (for high traffic site use db as storage), and as last step setup administrator’s account and pass. Optional you could generate your own Shop Key – use for data encryption. Store it well and secure, on last installation step.

If you did well, you could go now to your Magento Frontend or Backend. Good Luck, and have fun.

Sreenshot images of installation with example values filled:

1. Licence Agreement

magento-1

2. Localization

magento-2

3. Configuration

magento-3

4. Create Admin Account

magento-4

5. You’re All Set!

magento-5

Tento článek je obecný návod jak nainstalovat Magento Commerce krok za krokem.

Nejdříve by jste měli nastavit prostředí, jestli ale Magento instalujete poprvé měli by jste zkontrolovat, zda odpovídáte Magento Commerce Systémové požadavky. V krátkosti budete potřebovat: jakýkoliv operační systém na kterém běží Apache, PHP, MySQL Vyžadované PHP moduly jsou: PDO_MySQL, Simplexml, mcrypt, hash, GD, DOM, iconv, SOAP (volitelné).

Nyní budete potřebovat stáhnout Magento Commerce Full Release stable package, a volitelně můžete stáhnout jeden z lokalizačních balíčků Magento Translations. Předpokládám, že máte dostatek znalostí k přípravě vašeho hostingu, tato problematika není vůbec součástí tohoto návodu. Budete potřebovat jeden apache virtual host, nebo server, nebo hostovanou doménu, a jednu MySQL databázi (volitelně díky databázovým přefixům Magento může sdílet jednu databázi s jinými projekty aniž by došlo k nějakému poškození).

Dalším krokem je rozbalení archivu do dočasného adresáře nebo rovnou do adresáře server root. Pokud jste stáhli překlad, rozbalte lokalizační balíček do app/locale. Např. pro lokalizaci cs_CZ (čeština) je správná cesta app/locale/cs_CZ. Potom pokud používáte Linux nebo Unix (většina hostingů), tak je potřeba pro některé základní funkce Magento (obrázky, logování, session, dočasné soubory atd.) nastavit několik adresářů s právy pro zápis pro web server. Jsou to: app/etc media/ (media/catalog/product) var/ (var/session var/tmp var/log). Na 99% windows tento krok není potřeba.

Nyní začíná sranda – můžete nainstalovat Magento. Spusťte prohlížeč a nasměrujte ho na url Magento, nyní by jste měli vidět instalační obrazovku. Potvrďte licenci, dále vyberte lokalizaci, časové pásmo a výchozí měnu, v dalším kroku vyplňte připojení k databázi, nastavte session (pro stránky s velkou návštěvností použijte databázi jako úložiště), a v posledním kroku nastavte uživatelský účet a heslo. Volitelně můžete vygenerovat vlastní klíč obchodu – používá se k šifrování dat. Uložte si tento klíč na bezpečné místo v posledním kroku instalace.

Jestli jste si vedli dobře, tak by jste nyní měli možnost jít do Magento Frontend nebo Backend rozhraní. Hodně štěstí, a bavte se.

Screenshoty instalace s předvyplněnými příkladnými hodnotami:

1. Licence

magento-1

2. Lokalizace

magento-cs-2

3. Nastavení

magento-cs-3

4. Vytvořit účet správce

magento-cs-4

5. Hotovo

magento-cs-5

VN:F [1.8.7_1070]
Rating: 0.0/10 (0 votes cast)
VN:F [1.8.7_1070]
Rating: 0 (from 0 votes)
1 Comment :, , , , , more...

How to import images into Magento Commerce

by morf on Sep.27, 2009, under Blog, Magento

If somebody told you, you can’t import images to Magento, he was definitively liar. Magento Dataflow can import images, but the trick is you have to upload or copy images you want to import into [installation_directory]/media/import/* . Then export (System -> Profiles -> Export All Products -> Start profile) your products if you have any, download (copy) and edit the file. Now you can fill columns small_image, image, thumbnail with absolute path from media/import directory – for example /my_image.jpg (note the / on the start). And sure you can use same image for all three columns.

Jestli Vám někdo říkal, že nemůžete nahrávat obrázky do Magenta, tak byl definitivně lhář. Magento Dataflow umožňuje importování obrázků, ale trik je v tom, že nejříve musíte uploadnout nebo zkopírovat obrázky, které chcete importovat do  [installation_directory]/media/import/* . Potom vyexportujte (Systém -> Profily -> Export All Products -> Spustit Profil.) Vaše produkty, jestli nějaké máte, stáhněte (zkopírujte) a editujte tento soubor. Nyní můžete vyplnit sloupečky small_image, image, thumbnail absolutní cestou z adresáře media/import – např. /muj_obrazek.jpg (všimněte si / na začátku). A samozřejmě – můžete použít stejný obrázek pro všechny tři obrázky.

VN:F [1.8.7_1070]
Rating: 10.0/10 (1 vote cast)
VN:F [1.8.7_1070]
Rating: 0 (from 0 votes)
Leave a Comment :, , , , more...

Zend Framework 1.8.4

by morf on Jun.28, 2009, under Blog

Before a while ZF 1.8 came out with a new feature called Zend Tool. I was excited, and tried to work with it, but i discovered few errors in module based application generating capabilities, so i submited two issues in bug tracking system ZF-6853, and ZF-6755. And now in new version 1.8.4 issues are fixed. Good work ZF Team.

Před nedávnem přišel ZF 1.8 s novou featurou nazvanou Zend Tool. Byl jsem nadšený a zkoušel s ní pracovat, ale objevil jsem několik chyb v možnostech generování modulární aplikací, takže jsem odeslal dvě issue do bug tracking systému ZF-6853, a ZF-6755. A nyní ve v nové verzi 1.8.4 jsou issue opraveny. Dobrá práce ZF Team.

VN:F [1.8.7_1070]
Rating: 0.0/10 (0 votes cast)
VN:F [1.8.7_1070]
Rating: 0 (from 0 votes)
Leave a Comment :, more...

Magento Dataflow Speed

by morf on Jun.22, 2009, under Blog, Magento

Many people have suffered a lot by Magento Commerce Dataflow speed. I had serious problem by myself, when i tried to import 10,000 items into Magento database. I wrote my own import script, one of possible solutions to Magento Dataflow speed problem. But my achieved results were about 30-60 seconds per item. That’s terrible.

So i did little bit of research on Varien_Profiler, and the major problem was called database queries. So little googling took me to Magento Blog Article about Performance – this is really good starting page if you do experience Magento Dataflow speed issues. Setup your MySQL configuration by example in the article, which will help a lot – i’ve got 10 times faster queries on my averange Windows Vista laptop.

But still 3 -  6 seconds * 10,000 items isn’t in fact a good result. So i dug deeper in Magento Forums about speed, and tried to run benchmarks of Magento Dataflow import / export profiles. Export was already fast enough, but Import was a real pain in the ass. Even original script from Magento (= Dataflow API) didn’t run faster than my own script.

I’ve found lot of people with the same issue on forums, so i didn’t give up. Another solution for improving performance of Magento, is installation of Memcache, or APC cache, but i haven’t got better results using them. Something was wrong, because script didn’t use 100% CPU or memory.

So after at least 100 times i red profile xmls created by Magento Admin, and finally i’ve found holy grail in getting speed Magento Dataflow import. 10,000 items in 20 minutes. The solution is very easy: setup Number of records in your import profile to 10, or 100, maybe even 1,000 items – this causes Magento doesn’t run one query per imported item, but cache 10, 100 or 1,000 rows and then run’em all at once (well not really, but that’s the point).

I hope you found this article useful. Don’t forget to setup enough memory_limit for your php script when using this method.

Edit:

I’m pretty sure you can enhance speed of import rapidly, when you setup your custom product attributes scope to GLOBAL instead of store view, because if you are using attributes per store, then all this data are duplicated per store, and then amount of data handled by Dataflow import/export will grow rapidly.

VN:F [1.8.7_1070]
Rating: 10.0/10 (1 vote cast)
VN:F [1.8.7_1070]
Rating: 0 (from 0 votes)
7 Comments :, , , , , more...

Looking for something?

Use the form below to search the site:

Still not finding what you're looking for? Drop a comment on a post or contact us so we can take care of it!