четверг, 20 декабря 2012 г.

How to use Zend Debugger as debug tool and XDebug as code coverage tool ?

I like Zend Debugger more than Xdebug. Because Zend Debugger does fall never when you add some expressions to watch window.

But I use PHPUnit and PHP Code Coverage tools And PHP Code Coverage requires Xdebug. So I need to have some way to use Zend Debugger and Xdebug together.
And I know this way.

You need to load Xdebug before loading Zend Debugger.
See example of php.ini file:

zend_extension=/usr/lib/php5/20090626/xdebug.so
zend_extension=/opt/ZendDebugger/debugger/php-5.3.x/ZendDebugger.so

If you change these two lines you won't get a possibility to use Zend Debugger as debug tool.



пятница, 30 ноября 2012 г.

Interesting facts about Full Page Cache in Magento.

1.
File: 'app/code/core/Enterprise/PageCache/Model/Processor.php'

const XML_PATH_CACHE_MAX_SIZE       = 'system/page_cache/max_cache_size';

Method: public function processRequestResponse(Zend_Controller_Request_Http $request, Zend_Controller_Response_Http $response)

$maxSizeInBytes = Mage::getStoreConfig(self::XML_PATH_CACHE_MAX_SIZE) * 1024 * 1024;


if ($currentStorageSize >= $maxSizeInBytes) {
    Mage::app()->getCacheInstance()->invalidateType('full_page');
    return $this;
}


By default 'max_cache_size' = 1Gb.


2. Magento 1.7 CE and 1.12 EE has a bug.
'cache_lifetime' option in 'cache.xml' is not used by Magento. It means that if something was cached it won't be rendered whenever.

There is a way how to fix it.

Create your module.
Rewrite the class 'Enterprise_PageCache_Model_Config'.

This is an example of 'etc/config.xml' file for your module.


    <global>
        <models>
            <you_entpagecache>
                <class>YOU_EnterprisePageCache_Model</class>
            </you_entpagecache>
            <enterprise_pagecache>
                <rewrite>
                    <config>YOU_EnterprisePageCache_Model_Config</config>
                </rewrite>
            </enterprise_pagecache>
        </models>
    </global>


This is a new class 'YOU_EnterprisePageCache_Model_Config' without the bug.

class YOU_EnterprisePageCache_Model_Config  extends Enterprise_PageCache_Model_Config
{
    /**
     * Create placeholder object based on block information
     *
     * @param Mage_Core_Block_Abstract $block
     * @return Enterprise_PageCache_Model_Container_Placeholder
     */
    public function getBlockPlaceholder($block)
    {
        $this->_initPlaceholders();
        $type = $block->getType();

        if (isset($this->_placeholders[$type])) {
            $placeholderData = false;
            foreach ($this->_placeholders[$type] as $placeholderInfo) {
                if (!empty($placeholderInfo['name'])) {
                    if ($placeholderInfo['name'] == $block->getNameInLayout()) {
                        $placeholderData = $placeholderInfo;
                    }
                } else {
                    $placeholderData = $placeholderInfo;
                }
            }

            if (!$placeholderData) {
                return false;
            }

            $placeholder = $placeholderData['code']
                . ' container="' . $placeholderData['container'] . '"'
                . ' block="' . get_class($block) . '"';
            $placeholder.= ' cache_id="' . $block->getCacheKey() . '"';
            foreach ($block->getCacheKeyInfo() as $k => $v) {
                if (is_string($k) && !empty($k)) {
                    $placeholder .= ' ' . $k . '="' . $v . '"';
                }
            }
            // Fixed bug -- 'cache_lifetime' is not used for checking that block should be rendered because it is expired.
            $placeholder .= ' cache_lifetime="' . $placeholderData['cache_lifetime'] . '"';

            $placeholder = Mage::getModel('enterprise_pagecache/container_placeholder', $placeholder);
            return $placeholder;
        }
        return false;
    }
}

пятница, 28 сентября 2012 г.

Magento HowTo. Part1

How to

  • Enable/Disable Reviews
    • Manually in Backend
      • System->Configuration->Advanced:Advanced->Disable Modules Output->Mage_Review
        • Enable/Disable
    • In the code (code example):
      • $store = Mage::app()->getStore('davitamon');
      • Mage::getModel('core/config')->saveConfig('advanced/modules_disable_output/Mage_Review', '0' , 'stores', $store->getId());


четверг, 6 сентября 2012 г.

Using readline with Oracle SQL*Plus

This is repost of the following link:
http://blog.cachemiss.com/articles/Using%20readline%20with%20Oracle%20SQL*Plus.pod



By default, Oracle's SQL*Plus has no support for history, command line editing, etc.

This problem can be solved with the rlwrap utility. There is a Debian package, or you can easily compile it for any system.

Source is here: http://utopia.knoware.nl/~hlub/rlwrap/.

Once installed, add this alias to your .bashrc:

alias sqlplus="rlwrap -i -f ~/.sqlplus_history -H ~/.sqlplus_history -s 30000 sqlplus"

This defines a history file and uses it as your completion wordlist, and sets the history size to 30000 entries.

Before running it for the first time, do a:

touch ~/.sqlplus_history

That's all there is to it, and now you have readline support in your SQL*Plus!

How to create a new website/store/storeview in Magento (code snippet)

This is an example of install/upgrade script for creating a new website/store/storeview in Magento.
Also prefixes for order/invoice/shipment numbers are set.


<?php>
try {

    $websiteName = 'Website Name';
    $websiteCode = 'website_code';
    $storeName = 'Store Name';
    $storeViewName = 'Store View Name';
    //$rootCategoryName = 'Website Name Root Category';


    /** @var $installer Mage_Catalog_Model_Resource_Setup */
    $installer = $this;

    /** @var $write Zend_Db_Adapter_Abstract */
    $write = Mage::getSingleton('core/resource')->getConnection('core_write');

    $write->beginTransaction();

//    // Create root category
//    /**  @var Mage_Catalog_Model_Category $rootCategory */
//    $rootCategory = Mage::getModel('catalog/category');
//    $rootCategory->setName($rootCategoryName)
//        ->setDisplayMode('PRODUCTS')
//        ->setIsActive(1)
//        ->setPath('1')
//        ->setStoreId(0)
//    ;
//    //$rootCategory->setThumbnail(null);
//
//    $rootCategory->save();


    // Create website
    /** @var Mage_Core_Model_WebsiРte $website */
    $website = Mage::getModel('core/website');
    $website
        ->setName($websiteName)
        ->setCode($websiteCode)
        ->save();

    // Create Store
    /** @var Mage_Core_Model_Store_Group $store  */
    $store = Mage::getModel('core/store_group');
    $store
        ->setWebsiteId($website->getId())
        ->setName($storeName)
        // Error happened 'exception 'Exception' with message '$_FILES array is empty' in src/lib/Varien/File/Uploader.php:467' when this line is uncommented.
        //->setRootCategoryId($rootCategory->getId())
        ->save();

    // Set relations to Store in Website
    $website->setDefaultGroupId($store->getId());


    // Crate Store View
    /** @var Mage_Core_Model_Store $storeView  */
    $storeView = Mage::getModel('core/store');
    $storeView
        ->setName($storeViewName)
        ->setCode($websiteCode)
        ->setWebsiteId($website->getId())
        ->setGroupId($store->getId())
        ->setIsActive(1)
        ->save();

    // Set relations to StoreView in Store.
    $store->setDefaultStoreId($storeView->getId());
    /** @var $config Mage_Core_Model_Config */
    $config = Mage::getModel('core/config');

    // Set store name
    $config->saveConfig(Mage_Core_Model_Store::XML_PATH_STORE_STORE_NAME, $websiteName, 'stores', $storeView->getId());


    // Add prefix for orders (5), invoices(6), shipments(8)
    $write->query("
        insert into `eav_entity_store` (entity_type_id, store_id, increment_prefix, increment_last_id)
        values
        (5, {$storeView->getId()}, 3, 300000000),
        (6, {$storeView->getId()}, 3, 300000000),
        (8, {$storeView->getId()}, 3, 300000000)
    ");

    $write->commit();

} catch (Exception $e) {
    $write->rollback();
    Mage::throwException($e);
}


пятница, 18 мая 2012 г.

How to install readline for python ?

Some time ago I needed to run 'sudo easy_install readline' on my Ubuntu 11.04 machine.
But I had an error message.

For resolving that problem you should install the following packages:
- python2.7-dev (if python 2.7 is installed)
- libncurses5-dev

and try to run again the command:
sudo easy_install readline

пятница, 11 мая 2012 г.

Как узнать в git, на какой тег у вас сейчас переключена рабочая копия ?


На помощь приходит команда:
git log --decorate

Результатом будет что-то похожее на это:

commit a8662ef8bf021ea349dbf56970fd9f62f97093fb (HEAD, tag: test-live-0.0.2, tag: live-0.0.2)
Author: Vasya Pupkin <v.pupkin@gmail.com>
Date:   Fri May 11 09:25:15 2012 +0300

    Some message

commit 43a6228d4bf5839aa934b541c35d19b897b35056 (tag: live-0.0.1)
Author: Vasya Pupkin <v.pupkin@gmail.com>
Date:   Thu May 10 17:47:23 2012 +0300

    Some message



Если же вы сейчас свичнуты на один из коммитов ветки мастер, то вы увидите что-то такое:

commit ab39d94c48d4ef31bb2dbe16bce77c389c2c3c4d (HEAD, origin/master, origin/HEAD, master)
Author: Vasya Pupkin <v.pupkin@gmail.com>
Date:   Fri May 11 10:46:55 2012 +0300

    Some message

commit a8662ef8bf021ea349dbf56970fd9f62f97093fb (tag: test-live-0.0.2, tag: live-0.0.2)
Author: Vasya Pupkin <v.pupkin@gmail.com>
Date:   Fri May 11 09:25:15 2012 +0300

    Some message

commit 43a6228d4bf5839aa934b541c35d19b897b35056 (tag: live-0.0.1)
Author: Vasya Pupkin <v.pupkin@gmail.com>
Date:   Thu May 10 17:47:23 2012 +0300

    Some message

среда, 25 апреля 2012 г.

Как заархивировать файлы в Linux с сохранением прав доступа к файлам ?


Команда tar умеет архивировать файлы с сохранением прав доступа к файлам.


Нужно вместо
tar -czf archive.tar.gz directory
написать
tar -cpzf archive.tar.gz directory

А при распаковке тоже указать параметр "p":
tar -xzpf archive.tar.gz

http://www.aota.net/forums/showthread.php?t=21329

среда, 21 марта 2012 г.

Как скопировать группу файлов в определенном порядке ?

Я являюсь счастливым обладателем mp3-плеера iRiver T60.
А у него, как оказалось (несколько лет пользовался и не знал!) есть такая особенность, что он воспроизводит файлы в том порядке, в котором они были записаны, а не как-либо еще.
Это важно, если вы слушаете аудио-книги.

Решением проблема стала команда подобного типа:

find . -type f |sort|xargs -L 1 cp --parents --target-directory=/media/T60/Music/Books/ErikBern

В данном примере я копирую рекурсивно все файлы из текущей директории в директорию /media/T60/Music/Books/ErikBern строго в порядке, в котором файлы были отсортированы с помощью команды sort.

P.S.: I like Linux.

пятница, 9 марта 2012 г.

Very useful "core.sharedRepository" property in config file of Git repository for sharing repository with another users

The quote from 'git help config':


core.sharedRepository
When group (or true), the repository is made shareable between several users in a group (making sure all the files and objects are group-writable). When all (or world or everybody), the repository will be readable by all users, additionally to being group-shareable. When umask (or false), git will use permissions reported by umask(2). When 0xxx, where 0xxx is an octal number, files in the repository will have this mode value.  0xxx will override user’s umask value (whereas the other options will only override requested parts of the user’s umask value). Examples: 0660 will make the repo read/write-able for the owner and group, but inaccessible to others (equivalent to group unless umask is e.g.  0022). 0640 is a repository that is group-readable but not group-writable. See git-init(1). False by default.

понедельник, 27 февраля 2012 г.

сообщение №1

Решил, что пора начать писать посты, связанные с it в отдельный блог.
Постепенно я перенесу то, что заслуживает внимание сюда.
Ура, товарищи!

P.S.: все, что раньше этого сообщения -- это перенесенные посты с моего старого блога.