List of all Symfony2 Exceptions (symfony)

Source: http:\\www.forouzani.com\list-of-all-symfony2-exceptions-symfony.html

I regularly want a list of all the symfony2 exceptions to see if there are any that I can reuse, instead of creating my own.
Unfortunately, I have found no way to find a list of all the exceptions, so I took it upon myself to create an Exception list.
The list below shows all the exceptions with their full namespace as of Symfony 2.1.2


\Symfony\Component\OptionsResolver\Exception\MissingOptionsException
\Symfony\Component\OptionsResolver\Exception\OptionDefinitionException
\Symfony\Component\OptionsResolver\Exception\InvalidOptionsException
\Symfony\Component\Serializer\Exception\InvalidArgumentException
\Symfony\Component\Serializer\Exception\UnsupportedException
\Symfony\Component\Serializer\Exception\UnexpectedValueException
\Symfony\Component\Serializer\Exception\LogicException
\Symfony\Component\Serializer\Exception\Exception
\Symfony\Component\Serializer\Exception\RuntimeException
\Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException
\Symfony\Component\HttpKernel\Exception\NotFoundHttpException
\Symfony\Component\HttpKernel\Exception\HttpException
\Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException
\Symfony\Component\HttpKernel\Exception\FlattenException
\Symfony\Component\Form\Exception\InvalidConfigurationException
\Symfony\Component\Form\Exception\TransformationFailedException
\Symfony\Component\Form\Exception\PropertyAccessDeniedException
\Symfony\Component\Form\Exception\TypeLoaderException
\Symfony\Component\Form\Exception\NotInitializedException
\Symfony\Component\Form\Exception\NotValidException
\Symfony\Component\Form\Exception\AlreadyBoundException
\Symfony\Component\Form\Exception\InvalidPropertyPathException
\Symfony\Component\Form\Exception\CreationException
\Symfony\Component\Form\Exception\StringCastException
\Symfony\Component\Form\Exception\FormException
\Symfony\Component\Form\Exception\TypeDefinitionException
\Symfony\Component\Form\Exception\UnexpectedTypeException
\Symfony\Component\Form\Exception\ErrorMappingException
\Symfony\Component\Form\Exception\InvalidPropertyException
\Symfony\Component\Process\Exception\ProcessFailedException
\Symfony\Component\Process\Exception\RuntimeException
\Symfony\Component\Yaml\Exception\DumpException
\Symfony\Component\Yaml\Exception\ParseException
\Symfony\Component\Filesystem\Exception\IOException
\Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException
\Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException
\Symfony\Component\HttpFoundation\File\Exception\UnexpectedTypeException
\Symfony\Component\HttpFoundation\File\Exception\UploadException
\Symfony\Component\HttpFoundation\File\Exception\FileException
\Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
\Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException
\Symfony\Component\DependencyInjection\Exception\LogicException
\Symfony\Component\DependencyInjection\Exception\OutOfBoundsException
\Symfony\Component\DependencyInjection\Exception\BadMethodCallException
\Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException
\Symfony\Component\DependencyInjection\Exception\RuntimeException
\Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException
\Symfony\Component\DependencyInjection\Exception\InactiveScopeException
\Symfony\Component\DependencyInjection\Exception\ParameterCircularReferenceException
\Symfony\Component\DependencyInjection\Exception\ScopeCrossingInjectionException
\Symfony\Component\DependencyInjection\Exception\ScopeWideningInjectionException
\Symfony\Component\Config\Exception\FileLoaderImportCircularReferenceException
\Symfony\Component\Config\Exception\FileLoaderLoadException
\Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
\Symfony\Component\Config\Definition\Exception\ForbiddenOverwriteException
\Symfony\Component\Config\Definition\Exception\UnsetKeyException
\Symfony\Component\Config\Definition\Exception\Exception
\Symfony\Component\Config\Definition\Exception\InvalidDefinitionException
\Symfony\Component\Config\Definition\Exception\InvalidTypeException
\Symfony\Component\Config\Definition\Exception\DuplicateKeyException
\Symfony\Component\Routing\Exception\InvalidParameterException
\Symfony\Component\Routing\Exception\ResourceNotFoundException
\Symfony\Component\Routing\Exception\MissingMandatoryParametersException
\Symfony\Component\Routing\Exception\RouteNotFoundException
\Symfony\Component\Routing\Exception\MethodNotAllowedException
\Symfony\Component\Validator\Exception\MappingException
\Symfony\Component\Validator\Exception\MissingOptionsException
\Symfony\Component\Validator\Exception\GroupDefinitionException
\Symfony\Component\Validator\Exception\ConstraintDefinitionException
\Symfony\Component\Validator\Exception\UnexpectedTypeException
\Symfony\Component\Validator\Exception\InvalidOptionsException
\Symfony\Component\Validator\Exception\ValidatorException
\Symfony\Component\Locale\Exception\MethodArgumentValueNotImplementedException
\Symfony\Component\Locale\Exception\MethodArgumentNotImplementedException
\Symfony\Component\Locale\Exception\MethodNotImplementedException
\Symfony\Component\Locale\Exception\NotImplementedException
\Symfony\Component\CssSelector\Exception\ParseException
\Symfony\Component\Security\Core\Exception\SessionUnavailableException
\Symfony\Component\Security\Core\Exception\AuthenticationException
\Symfony\Component\Security\Core\Exception\UnsupportedUserException
\Symfony\Component\Security\Core\Exception\AccessDeniedException
\Symfony\Component\Security\Core\Exception\CredentialsExpiredException
\Symfony\Component\Security\Core\Exception\UsernameNotFoundException
\Symfony\Component\Security\Core\Exception\LogoutException
\Symfony\Component\Security\Core\Exception\CookieTheftException
\Symfony\Component\Security\Core\Exception\InsufficientAuthenticationException
\Symfony\Component\Security\Core\Exception\DisabledException
\Symfony\Component\Security\Core\Exception\InvalidCsrfTokenException
\Symfony\Component\Security\Core\Exception\LockedException
\Symfony\Component\Security\Core\Exception\AuthenticationServiceException
\Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException
\Symfony\Component\Security\Core\Exception\TokenNotFoundException
\Symfony\Component\Security\Core\Exception\AccountExpiredException
\Symfony\Component\Security\Core\Exception\NonceExpiredException
\Symfony\Component\Security\Core\Exception\AccountStatusException
\Symfony\Component\Security\Core\Exception\ProviderNotFoundException
\Symfony\Component\Security\Core\Exception\BadCredentialsException
\Symfony\Component\Security\Acl\Exception\SidNotLoadedException
\Symfony\Component\Security\Acl\Exception\AclNotFoundException
\Symfony\Component\Security\Acl\Exception\NotAllAclsFoundException
\Symfony\Component\Security\Acl\Exception\InvalidDomainObjectException
\Symfony\Component\Security\Acl\Exception\NoAceFoundException
\Symfony\Component\Security\Acl\Exception\Exception
\Symfony\Component\Security\Acl\Exception\ConcurrentModificationException
\Symfony\Component\Security\Acl\Exception\AclAlreadyExistsException


Since most symfony2 installations also include doctrine2, below is a list of all the Doctrine 2 Exceptions.


\Doctrine\Common\DataFixtures\Exception\CircularReferenceException
\Doctrine\Common\Annotations\AnnotationException
\Doctrine\Common\CommonException
\Doctrine\Common\Persistence\Mapping\MappingException
\Doctrine\ORM\TransactionRequiredException
\Doctrine\ORM\Query\QueryException
\Doctrine\ORM\Query\AST\ASTException
\Doctrine\ORM\Mapping\MappingException
\Doctrine\ORM\UnexpectedResultException
\Doctrine\ORM\PessimisticLockException
\Doctrine\ORM\OptimisticLockException
\Doctrine\ORM\Internal\Hydration\HydrationException
\Doctrine\ORM\ORMException
\Doctrine\ORM\NonUniqueResultException
\Doctrine\ORM\EntityNotFoundException
\Doctrine\ORM\Tools\ToolsException
\Doctrine\ORM\Tools\Export\ExportException
\Doctrine\ORM\Proxy\ProxyException
\Doctrine\ORM\NoResultException
\Doctrine\ORM\ORMInvalidArgumentException
\Doctrine\DBAL\Query\QueryException
\Doctrine\DBAL\Types\ConversionException
\Doctrine\DBAL\Schema\SchemaException
\Doctrine\DBAL\Sharding\ShardingException
\Doctrine\DBAL\ConnectionException
\Doctrine\DBAL\Cache\CacheException
\Doctrine\DBAL\Driver\OCI8\OCI8Exception
\Doctrine\DBAL\Driver\SQLSrv\SQLSrvException
\Doctrine\DBAL\Driver\Mysqli\MysqliException
\Doctrine\DBAL\Driver\IBMDB2\DB2Exception
\Doctrine\DBAL\DBALException

Symfony2 Sonata Admin sonata_type_collection inline editing hidden field

Here I've found the answer to my simple question: How to inline edit a dependend one to many field without showing the parent as select box.

http://www.obverse.com/2013/05/working-with-the-sonata-admin-bundle-and-sonata_type_collection/


Here is a brief answer: Use prePersist / preUpdate methods in ParentAdmin.php class.
// in the ParentAdmin class


public function prePersist($promotion)
{
foreach ($promotion->getRules() as $rule) {
$rule->setPromotion($promotion);
}
}

public function preUpdate($promotion)
{
foreach ($promotion->getRules() as $rule) {
$rule->setPromotion($promotion);
}
$promotion->setRules($promotion->getRules());
}

Yes indeed, the sonata admin class allows for prePersist and preUpdate calls that allows us to set the promotion for the rule before persisting. Of course don’t forget to declare your admin classes as services in your configs. Other than that, I hope that this helps somebody out there.

Symfony2: 3d to 2d. Display tree navigation menu in a select dropdown in SonataAdmin

Keys: SonataAdmin, Gedmo Tree nested type, Select Dropdown, use EntityManager in configureFormFields Admin page

I've lost 2 days bumping my head on a simple task - I needed to display simple dropdown combo box that will display Nested Gedmo Tree in a Sonata Admin form.

I've installed and get working http://knpbundles.com/roomthirteen/Room13NavigationBundle - It's simple implementation of Gedmo\Tree type="nested" - exactly what I need for a simple menu navigation + it has ready Sonataadmin page to edit nodes.
The nice thing about this exact bundle is that it uses @Translatable, @Blameable, @Timestampable and this is all what I need - to be able to translate my menu, to see when and who updated the records.

After installing it I've noticed that 'path' is missing/empty event getting undefined notice.
I've dug around and found that I have to implement getpath() myself.
I did and created custom repository. I wasn't able to use childrenHierarchy directly in the Entity.


namespace Room13\NavigationBundle\Entity\Repository;
class NavigationNodeRepository extends \Gedmo\Tree\Entity\Repository\NestedTreeRepository{
function getFlatNodes($startNode = null, $options = null) {
if (is_null($options)) {
$options = array(
'decorate' => false,
'rootOpen' => '
    ',
    'rootClose' => '
',
'childOpen' => '
  • ',
    'childClose' => '
  • ',
    'nodeDecorator' => function($node) {
    return ''.$node['title'].'';
    }
    );
    }
    $htmlTree = $this->childrenHierarchy(
    $startNode, / starting from root nodes /
    false, / load all children, not only direct /
    $options
    );
    return $this->ToFlat($htmlTree, ' » ');
    }

    function ToFlat($node, $sep = ' > ', $path = '') {
    $els = array();
    foreach ($node as $id => $opts) {
    $els[$opts['id']] = $path . $opts['title'];
    if (isset($opts['__children']) && is_array($opts['__children']) && sizeof($opts['__children'])) {
    $r = $this->ToFlat($opts['__children'], $sep, ($path . $opts['title'] . $sep));
    foreach($r as $id => $title) {
    $els[$id] = $title;
    }
    }
    }
    return $els;
    }
    }


    After implementing it I've had to find a way so I can display result of this for root node in a flat select box in SonataAdminPage so user can select from a dropdown where the content should show.
    Well.. it turned out that entity type is impossible to be used because it can't call the method from CustomRepo, just the native Entity methods.
    I ended up using simple 'select' type like this:


    $em = $this->modelManager->getEntityManager('Room13NavigationBundle:NavigationNode');
    $tree = $em->getRepository('Room13NavigationBundle:NavigationNode')->getFlatNodes();
    $formMapper
    ->add('name')
    ->add('menu', 'choice', array(
    'label' => 'Place in menu',
    'empty_value' => 'Select menu',
    'choices' => $tree,
    )
    )
    ......
    ;

    DomPDF with UNICODE UTF-8 Support! At last!

    A colleague of mine spent some time and was able to make DomPDF library to run with almost ALL UTF-8 alphabets displayed.
    Until now I was using TCPDF. It supports UTF-8 from a lot of time, but has crappy way of generating documents - VERY simple HTML support and A LOT of calls to internal methods so you can documents looks like the HTML page.

    As far he explained to me the problem was generating proper fonts.

    DomPDF with UTF-8 Support

    UPDATE: Because DomPDF is "the memory MONSTER" (30pages table eat up about 1.5Gigs! GEE!!!) we are now using wkhtmltopdf. It's AMAZINGLY fast and keeps the memory footprint low (same page that took about 2-3min and 1.5Gigs ram for dompdf wkthml uses about 100-200mb and 20-40sec.)
    The funny thing is that it's webkit based and renders PERFECTLY everything on each page I've tested with.
    It's simply SWEET!

    Roundcube with plugins support!!! WOW! Writing a plugin - display custom template has bogus docs.

    Today I've noticed Roundcube has released a new version that finally has plugins support!
    Grrrreaaat!

    As expected in there is a change password plugin (with drivers supports) and some other that are pretty cool!
    A list of plugins here: http://trac.roundcube.net/wiki/Plugin_Repository

    Of course I've had some custom patching for my hosting users and now it's not working.
    I've configured my change password plugin (which was the main showstopper for not upgrating to new roundcube) and the the little tiny hack for domain notification left.
    I've decided to write a plugin that will do the job for me, so I can easily upgade after that.

    Writing plugin isn't that hard at all. Here you can read more:
    http://trac.roundcube.net/wiki/Doc_Plugins

    also you can read plugins directory for more.

    While creating my plugin I hit a problem and I've lost about 40 minutes searching for description and resolution.
    The Resolutions was 5mins reading the class for temapltes but I thought I was wrong - no this is a mis-explanation in docs.
    When you want to create a custom template you mkdir skins/default/templates and create/copy-modify html in it (I've copied login.html template).
    Well all was fine while I've tried to show it.
    Documentation is wrong.
    When you call:

    $rcmail->output->send('mytemplate');

    you must actually call:

    $rcmail->output->send('myplugin.mytemplate');
    so the tpl class can understand this is a plugin and show your template and not search for default tpl.

    Hope that helps someone.
    Going to change/report this in docs now.
    Oh. Symptoms are:

    [12.Nov.2009 17:57:27 +0200]: PHP Error: Error loading template for logininfo in /var/www/roundcube/program/include/rcube_template.php on line 372 (GET /)

    in your error log.

    Fun with JavaScript... I don't recommend this in your code! :-)

    Facebook, FB.Connect - write nice js code and reuse code call...

    I'm writing a poc code that calls some FB.Connect methods.
    As a quick and nasty code reuse I've come up with this code:

    A method that inits and makes the actual code:
    function fbCall(code) {
        FB_RequireFeatures(["XFBML"], function(){
            FB.Facebook.init('ApiKey', '/xd_receiver.htm', null);
            FB.ensureInit(function () {
                eval(code);
            });
        });
    }
    
    so far so good - it all seems ok.
    Here comes the tricky part. I wanted to be able to call multiline variable with comments in it - a normal js code but encapsulated in somethind...
    If you don't know in JS you can't have multiline variable, and if you have something like:
        var mycall = 'FB.Connect.showFeedDialog(
    \'249955020144'\, 
    //here we put some data...
    comment_data, '', "Awesome", null, 
    FB.RequireConnect.promptConnect, function(){alert("Callback");}, fortune, user_message);';
    
    you'll get error while parsing because of the new lines.
    If you replace the new lines with ' ' you'll get the whole code after a comment - commented exept you don't use / /

    The solution is this:
    function fbCall(code) {
        FB_RequireFeatures(["XFBML"], function(){
            FB.Facebook.init('ApiKey', '/xd_receiver.htm', null);
            FB.ensureInit(function () {
                code();
            });
        });
    }
    function askPerms() {
        var c = function() {
            "FB.Connect.showPermissionDialog('perms');";
        }
        fbCall(c);
    }
    
    Notice the difference between two fbCall functions - the second one calls code as a function - it do not evals it.
    This way you can write up your code inside the c 'function' variable and call it after that.
    It's a bit tricky while you get it how it works but the code looks more readable after that.

    Serendipity and dpSyntaxHighlighter plugin with bash support.

    I wanted a syntax highlighter for the previous post.
    I've installed dpsyntaxhighlighter from serendipity plugins list. I wanted a JS code highlighter - not a php one (like GeSHi), so I've chosen this one. (it uses google syntaxhighlighter)
    I've noticed that this nice lib don't have a bash syntax support which I needed now.
    In the wiki of the project I've found this link to a script a guy wrote for bash syntax.
    Great!
    I've placed the js file in ROOT/plugins/serendipity_event_dpsyntaxhighlighter/dp.SyntaxHighlighter/Scripts/ and expected it to work.
    No, it didn't.

    It turned out that you have to add each language highliter js script file in ROOT/serendipity_event_dpsyntaxhighlighter.php

    Around:
    switch($event)
                    case 'frontend_header':
                        echo '    <link rel="stylesheet" type="text/css" href="' . $pluginDir.  '/SyntaxHighlighter.css" />' . "\n";
                        return true;
                        break;
                    case 'frontend_footer':
    


    there is a list with all js files.
    Simply add the new language (on both frontend_footer and backend_preview cases) and there you go!

    How to highlight your text?
    It is used very simple.
    You add code like this in your post:
    
        ... some code here ...
    

    and you have nice formatted code.
    More usage tips here.

    That's all folks.
    Hope that helps you.

    PureEdit (rocking ultra light CMS system) and utf8 / unicode support. Pagination.

    I've found PureEdit today and decided to use it as my CMS backend for some of my simpler projects!
    This is a GREAT and FAST way to setup a backend content editing.
    Take a look at the videos on their site! I was fascinated!

    I've had old database filled with correct Unicode (UTF-8) data (in Cyrillic).
    I've installed and loaded pe-admin, updated my db accortind to PureEdit specs, added some fields type like (status 1||0).
    When opened pe-admin I've come up with few Unicode problems.
    (as described here: http://www.pureedit.com/community/comments.php?DiscussionID=149&page=1 )
    I've solved my problem exactly by putting: mysql_query('SET NAMES UTF8');

    I've had to modify the connect function in pe-admin/databases/mysql.db.php like this:
    function connect($host, $username, $password, $database)
    {
    $dbh = mysql_connect($host, $username, $password);
    mysql_query('SET NAMES UTF8');
    mysql_select_db($database, $dbh);
    }
    (it used to connect/select db in one line, but you MUST make SET NAMES BEFORE selecting db!)

    The second problem that I've had as with utf8 again.
    Utils class is not UTF-8 ready.
    I've had to add to set utf8 encoding
    public function __construct() {
    mb_internal_encoding('UTF-8');
    }
    and replace all str functions with mb_str.

    After that I wanted to have pagination.
    Here it's described how to set it up.

    http://www.pureedit.com/community/comments.php?DiscussionID=221&page=1#Item_0

    Now I have to setup host type filed (that will be automatically filled with $_SERVER['REMOTE_ADDR']) and some othe fancy stuff, but in about 40 minutes I've setup a GREAT and easy to use backend posting solution for my website!

    Thanks PureEdit :-)

    The PureEdit code is not from the greatest ones but when it works and if .htaccess protected - it simply works! :-)

    php mail function overloading or why we shouldn't use mb_send_mail as sending mail function.

    As a programmer I have a nice cool helpers - classes I've written to help me do my daily work.
    Such class is my Mailer class which I use almost daily.
    It has all kind of fancy options and can do all kind of stuff - from sending simple mail to just setting an array with files which should be attached in the mail.
    It used to work very good until today.
    I was very surprised when I saw a broken email coming from it.
    I've investigated a few minutes what has changed and I've found that the problem
    I've set
    mbstring.func_overload = 7
    according to the description in file:
    ; For example, 7 for overload everything.
    ; 0: No overload
    ; 1: Overload mail() function
    ; 2: Overload str*() functions
    ; 4: Overload ereg*() functions
    it turned out that when set to 7 instead of using mail() function, php starts using mb_send_mail.
    mb_send_mail works only with base64 emails.
    It automatically encodes the body and subject (but not the sender wtf?) and it breaks mail ugly!
    If you manually add/set headers do not put \r\n at the very end of the string, mb_send_mail adds two headers after yours:
    Mime-Version: 1.0
    Content-Transfer-Encoding: BASE64
    and if you put one new line(\r\n) to separate the headers from body then you get the email totally messed up, because the base64 transfer won't apply and you'll get encoded string as plain text or html or whatever content-type you set previously.
    After I've lost another 20 minutes figuring out this, I've finally achieved receiving my email as it should be... well... almost.
    When the mail contained only ASCII symbols everything was ok, but when I tried to send email in utf8 Bulgarian... omfg?!
    The encoding was broke and for some reason the UTF8 symbols looked like you have page in UTF8 but your browser is set to WINDOWS-1251....
    WTF?!!! I've read few posts that said they never got it successfully working fine with mb_send_mail.
    It took me some time to find something very useful - there is an undocumented php function: mb_orig_mail (http://osdir.com/ml/php.internationalization/2003-01/msg00054.html).
    When you use overloaded function you can fall back to the standart mail function by calling this one.
    So here is what I did to solve my problem - I use exactly the same class that used to work until the overload get active.
    But when it comes to sending I simply check if the mail function is overloaded and if yes, then call the mb_orig_mail.
    Here is the actual code:

    $mailFunct = 'mail';
    if (ini_get('mbstring.func_overload') == 1 || ini_get('mbstring.func_overload') > 4) {
    $mailFunct = 'mb_orig_mail';
    }
    if(! $mailFunct($tostr, $subject, $tmpBody, $tmpHeaders) ) {
    echo 'sent';
    } else {
    echo 'error sending';
    }

    It's as simple as that.
    Hope that helps to anyone.
    Comments are welcome.

    Test your sites with more than one browser or what web developers use for testing their websites...

    In my daily work, I need to test sites I work on with a lot of browsers.


    Another common problem is testing a website as a different users - anon users, registered users, admins etc.


    This is the list of browsers I use in Linux and Windows.



    in my Linux (Debian stable or Ubuntu depends on which machine):



    1. Firefox (www.getfirefox.com) - my favorite! I use it on hourly basis :-). It's a lot of features, plugins and of course something that's a must for a web dev - firebug.

    2. Opera (www.opera.com) - my second choice - Awesome browser!!! Feature rich, perfect for casual user. It has integrated mail client, torrent client. Also has a developer toolbar, but It was hard for me to get used with.

    3. Galeon (galeon.sourceforge.net)- advanced gnome web browser. uses gecko engine. pretty thin and quick.

    4. Epiphany (projects.gnome.org/epiphany) - the default gnome web browser. Light, solid, gecko based, won't eat up your memory as firefox does. :-) Of course it misses some features.

    5. Konqueror (www.konqueror.org) - Default KDE3 web (and file) browser (as all KDE apps - qt based). If you have KDE (and all qt as dependent) libs installed, you can use/install it, otherwise - no point installing so much bloat for nothing. This one uses khtml engine but I've faced a lot of
      annoying problems while using it. It was removed from kde4 [maybe I'm wrong?but it's not default filebrowser anymore? correct me if I'm wrong].


    in Windows (XP Pro, yes I have a license coming with my laptop):



    1. Firefox

    2. Opera

    3. Chrome - very light. very fast. uses khtml engine for html/css representation. pretty cool, but not for me. I prefer opera if want a light experience. :-)

    4. Safari - apple browser, but for windows. Uses khtml engine. I don't like it very much, but it's pretty slick (as all mac programs). Used only for testing :-)

    5. Internet explorer7 (and 6, 8 in different VirtualBox machines. DUMB MicroS!!! They don't provide descent way of installing all three on one windows!!!) - maybe I shall keep silence :-) the link below describes it better.



    more funny reading: If browsers were women.


    I hope this article is helpfull. Please share your experience with me.


    Thanks!