суббота, 8 декабря 2012 г.

Очистка memcache

Очистить memcache можно двумя способами: варварским и нормальным. "Варварский" это перезапуск сервиса memcached. "Человеческий" это присоединиться по telnet к memcache и выполнить команду flush_all.

Например,
telnet 127.0.0.1 11211 // присоединяемся
flush_all // чистим
quit // разрываем соединение

Читать далее

суббота, 10 ноября 2012 г.

Magento: обновление отдельного атрибута продукта

При работе с Magento часто возникают ситуации, когда нужно обновить значение какого-то одного атрибута + его значение во flat-таблице. Такая ситуация может возникнуть в cron-скриптах, которые обрабатывают данные от третьего ресурса. Например, мы используем комментарии от Disqus и хотим раз в день забирать от них кол-во комментариев для каждого продукта. Сохранять модель в цикле это самоубийство, потому на помощь приходит Mage_Eav_Model_Entity_Abstract::saveAttribute().

Предположим, у нас есть атрибут продукта 'disqus_comment_count' и мы как-то (например, с помощью API) получаем от Disqus новые значения комментариев.
/** @var $productFlatIndexer Mage_Catalog_Model_Product_Flat_Indexer */
$productFlatIndexer = Mage::getModel('catalog/product_flat_indexer'); // модель для обновления значения атрибута во flat-таблице
$storeId = 1; // необходимый store id

/** @var $productCollection Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection */
$productCollection = Mage::getResourceModel('appstore_extension/product_collection');

/** @var $product AppStore_Extension_Model_Product */
foreach ($productCollection as $product) {
    $product->setDiscusCommentCount($newCommentValue);
    $product->getResource()
        ->saveAttribute($product, 'disqus_comment_count');

    // Обновляем значение атрибута во flat-таблице стора
    $productFlatIndexer->updateAttribute('disqus_comment_count', $storeId, $product->getId());
}
Вот и все. Стоит сказать, что Mage_Catalog_Model_Product_Flat_Indexer::updateAttribute() в цикле это не лучшее решение. Если логика приложения позволяет вынести вызов этого метода из цикла и обновить значение атрибута для пачки продуктов - смело делайте это.
Читать далее

Установка и настройка Pure-FTPd на FreeBSD

На днях понадобилось устанавливать Pure-FTPd на FreeBSD. Вот небольшой мануал:
sudo portsnap fetch update
cd /usr/ports/ftp/pure-ftpd
sudo make config install clean (убедитесь что включена опция "Support for TLS")
sudo ee /usr/local/etc/pure-ftpd.conf
sudo echo pureftpd_enable="YES" >> /etc/rc.conf (см. конфиг ниже)
sudo /usr/local/etc/rc.d/pure-ftpd start
rehash
sudo pure-pw useradd LOGIN -u UID -g GID -d /home/igor/ftp -m (введите ваш LOGIN, UID и GID. UID можно найти в /etc/group, GID такой же как UID)

FTP сервер настроен. Если вам нужна поддержка SSL/TLS, выполните следующее:
sudo mkdir -p /etc/ssl/private
sudo openssl req -x509 -nodes -newkey rsa:1024 -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem You should skip all questions pressing Enter or enter any appropriate values
sudo chmod 600 /etc/ssl/private/*.pem
sudo ee /usr/local/etc/pure-ftpd.conf Add "TLS 1" at the end of file and save
sudo /usr/local/etc/rc.d/pure-ftpd restart

Содержимое конфига pure-ftpd.conf:
ChrootEveryone              yes
TrustedGID                  1004
BrokenClientsCompatibility  no
MaxClientsNumber            20
Daemonize                   yes
MaxClientsPerIP             8
VerboseLog                  no
DisplayDotFiles             yes
AnonymousOnly               no
NoAnonymous                 yes
SyslogFacility              none
# FortunesFile              /usr/share/fortune/zippy
DontResolve                 yes
# MaxIdleTime               15
PureDB                      /usr/local/etc/pureftpd.pdb
UnixAuthentication          yes
LimitRecursion              10000 8
AnonymousCanCreateDirs      no
MaxLoad                     4
#AntiWarez                  yes
Umask                       133:022
MinUID                      1000
ProhibitDotFilesWrite       no
ProhibitDotFilesRead        no
AnonymousCantUpload         yes
AltLog                      clf:/var/log/pureftpd.log
#Quota                      100000000:1200
MaxDiskUsage                95
CustomerProof               yes
NoTruncate                  yes
IPV4Only                    yes

Эти шаги помогут вам установить и запустить ftp-сервер. Для кастомизации читаем "man pure-pw" или отправляемся сюда.
Читать далее

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

Magento: создаем кастомный JS валидатор

Год назад я уже писал о плагине Validation для Prototype, который используется в Magento. Стандартные валидаторы это хорошо. Но что делать, если нужно создать кастомный? Например, очень часто необходимо комбинировать существующими или изменить текст ошибки валидатора.

Делается это очень просто. Допустим, у нас есть поле, которое мы валидируем стандартными классами:


Для создания кастомного валидатора необходимо убрать валидационный класс "validate-length", но параметры оставить. Они нам еще пригодятся.

Добавляем валидатор




Мы убрали стандартный валидационный класс "validate-length" и заменили его на кастомный "required-title", в котором использовали логику стандартного валидатора.

Можно добавить сразу несколько валидаторов





Читать далее

воскресенье, 19 августа 2012 г.

Magento: открываем в нужную табу после редиректа

Очень часто при работе с бекендом в Magento требуется сделать редирект на страницу и открыть определенную табу. Например, представим что у нас в табе находится грид, в котором мы производим delete mass action. После выполнения этого действия необходимо вернуться на эту же страницу и открыть табу с гридом. Делается это очень просто.

Сначала необходимо взять имя табы из хендла, в котором она описана:

    sms_reply_tab
    navoq_magicsms/adminhtml_sms_tab_reply

Названием добавленной табы является содержимое тега .

Теперь можно выполнять редирект:
$this->_redirect("*/navoq_magicsms/edit", array(
    'id'         => $sms->getId(),
    'active_tab' => 'sms_reply_tab',
));

Таба откроется благодаря параметру active_tab, в который мы передаем имя табы.
Читать далее

MageConf 2012


15го сентября состоится главное PHP события года в Украине - MageConf. Будет очень много интересных докладов и воркшопов. Еще можно будет выиграть бесплатный купон для прохождения Magento сертификации. В прошлом году я выиграл лицензию на PhpStorm :)

Программа конференции - http://mageconf.com/home/program
Регистрация - http://mageconf.com/registration
Читать далее

пятница, 17 августа 2012 г.

Фигурные кавычки в JavaScript

Существуют два С-подобных стиля фигурных кавычек
// Первый
Foo() 
{

}

// Второй
Foo() {

}

Оба очень активно используются в PHP и JavaScript, но меня всегда интересовал вопрос: почему последний вариант наиболее популярен в JavaScript, а первый в PHP/С++/С#. Теперь я знаю ответ: размещение скобки на той же линии после оператора помогает избежать глупых ошибок, возможно благодаря стандарту ECMASrcipt.

В нем говорится следующее:
Certain ECMAScript statements (empty statement, variable statement, expression statement, do-while statement, continue statement, break statement, return statement, and throw statement) must be terminated with semicolons. Such semicolons may always appear explicitly in the source text. For convenience, however, such semicolons may be omitted from the source text in certain situations. These situations are described by saying that semicolons are automatically inserted into the source code token stream in those situations.

Приведу небольшой пример для понимания того, что они имеют ввиду:
function FooA() {  
    return  
    {  
        x: 8  
    };  
};  
  
function FooB() {  
    return {  
        x: 8  
    };  
};  
  
function Bar() {  
    console.log(FooA().x);  
    console.log(FooB().x);  
}  

После вызова функции Bar() мы увидим "undefined" и "8". Это произошло благодаря тому, что JavaScript очень умен и поставил точку с запятой после оператора return. То есть интерпретатор никогда не дойдет до нашего анонимного объекта. Почему? "Для удобства", - говорит нам ECMAScript. Наслаждайтесь полученной информацией и пусть программирование на JavaScript приносит вам только удовольствие. Как мне ;)

Читать далее

понедельник, 13 августа 2012 г.

Navicat Premium Essentials за $9.99

Обнаружил что, Navicat Premium Essentials продается в Apple App Store за $9.99 вместо $49.99. Очень рекомендую купить эту программу, если вы часто работаете с MySQL/SQLite/Oracle/PostgreSQL. Я знаю что настоящие джедаи используют консоль, но хороший GUI клиент в жизни веб-разработчика просто необходим. Эта программа стоит своих денег.
Читать далее

Установка SVN на Mac OS X 10.8 – Mountain Lion

Вчера обновился на Mac OS X 10.8 – Mountain Lion и был неприятно удивлен отсутствием SVN (Subversion).

Установить его можно как минимум двумя способами. Если у вас есть последняя версия Xcode, установленная через Mac App Store, то просто инсталим Xcode > Preferences > Downloads > Command Line Tools > Install.

Command Line Tools содержит последнюю версию SVN. Но если вы не используете Xcode, то довольно глупо качать Xcode, который весит 1.5GB, ради одного SVN.

К счастью, есть простой путь установки SVN без Xcode. Пакет Command Line Tools доступен как отдельный пакет (116MB) через Apple Developer site. Для этого вам понадобится Apple Developer ID, но его можно получить очень просто и бесплатно на основе существующего AppleID.

После загрузки и установки пакета, вы можете проверить наличие SVN в системе с помощью Terminal, просто откройте его и введите svn --version. Ответ будет приблизительно таким:
$ svn --version

svn, version 1.6.18 (r1303927)
   compiled Jun 15 2012, 19:07:58

Copyright (C) 2000-2009 CollabNet.
Subversion is open source software, see http://subversion.apache.org/
This product includes software developed by CollabNet (http://www.Collab.Net/).

The following repository access (RA) modules are available:

* ra_neon : Module for accessing a repository via WebDAV protocol using Neon.
  - handles 'http' scheme
  - handles 'https' scheme
* ra_svn : Module for accessing a repository using the svn network protocol.
  - handles 'svn' scheme
* ra_local : Module for accessing a repository on local disk.
  - handles 'file' scheme

Хочу заметить, что данные 2 способа не являются единственными. Вы можете поставить SVN с помощью различных менеджеров пакетов. Например, Mac Ports, Homebrew, etc.
Читать далее

понедельник, 6 августа 2012 г.

Magento: Добавление атрибута во flat-таблицу

Пару месяцев назад я описал один из способов добавления EAV атрибута во flat-таблицу. Честно говоря, тот вариант мне не нравился из-за своей неочевидности. Есть другой, как по мне, более правильный: описать необходимые атрибуты в config.xml:

    
         
              
                   
                      
                      
                      
                   
              
          
    


Читать далее

среда, 6 июня 2012 г.

PhpStorm: обрамляем выделенный текст в теги

Сегодня научимся обрамлять выделенный текст в теги.

Предположим, у нас есть текст "Text", который нужно обернуть тегом h1.


1. Выделяем текст



2. Нажимаем Cmd + Alt + J в Mac OS (Ctrl + Alt + J в Windows) и выбираем первый пункт выпадающего меню




3. Пишем необходимый тег и нажимаем Enter


Читать далее

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

Magento: Не работает addAttributeToFilter()?

Если вы удивляетесь почему код
$collection->addAttributeToFilter('color', '24');
не фильтрует коллекцию, это означает что в бекенде у данного атрибута не включен параметр "Used in product listing?". Как это ни странно, Magento добавляет атрибут в таблицу catalog_product_flat только если этот параметр включен. Если же он выключен, ни о какой фильтрации не может быть и речи. После включения "Used in product listing?" не забудьте сделать реиндекс.
Читать далее

вторник, 3 апреля 2012 г.

Magento: Добавление нового атрибута для кастомера

В Magento Community Edition присутствует возможность управления атрибутами продуктов. Но что если нам нужно создать атрибут для кастомера? В таком случае нам на помощь приходит mysql upgrade.

Допустим, я хочу создать атрибут "navoq_textmagic_phone", в котором будет храниться телефон кастомера для моего модуля. Пример кода:
/* @var $installer Navoq_TextMagic_Model_Resource_Setup */
$installer = $this;

$installer->startSetup();

$installer->addAttribute('customer', 'navoq_textmagic_phone', array(
    'label'    => 'Phone',
    'visible'  => true,
    'required' => false,
    'type'     => 'text',
    'input'    => 'text'
));

/** @var $eavConfig Mage_Eav_Model_Config */
$eavConfig = Mage::getSingleton('eav/config');

/** @var $attribute Mage_Customer_Model_Attribute */
$attribute = $eavConfig->getAttribute('customer', 'navoq_textmagic_phone');
$attribute->addData(array(
    'is_used_for_customer_segment' => true,
    'used_in_forms'   => array('customer_account_edit', 'adminhtml_customer'),
    'is_user_defined' => true,
    'backend_type'    => 'varchar',
    'is_system'       => false,
    'is_visible'      => true,
    'is_unique'       => false,
    'sort_order'      => 250
))->save();

$installer->endSetup();

Результатом выполнения апгрейда будет новый атрибут кастомера. Таким способом можно создавать атрибуты для разных сущностей: customer, customer_address, etc. Их полный список можно посмотреть в таблице "eav_entity_type".
Читать далее

Настройка деплоймента в PhpStorm

Деплоймент (deployment) - очень важный момент в работе разработчика. Я напомню, что локальную разработку я веду на FreeBSD VM, на которой настроены все необходимые веб-сервисы. Данный способ разработки позволяет эмулировать реальную среду продакшена, где будет работать мой код. Раньше я просто расшаривал свои проекты по Samba, сканировал необходимую папку и работал с ней удаленно. У данного способа есть большой минус - скорость работы. PhpStorm индексит по Samba очень медленно, иногда может надолго подвисать.

Потому сейчас я работаю с локальной папкой, а PhpStorm все автоматически аплоадит (деплоит) по SFTP на виртуальную машину. Так IDE работает быстрее, индексация проекта теперь занимает намного меньше времени.

Перейдем от слов в делу. Допустим, у меня есть локальная папка "community" с Magento CE и такая же папка на VM.

1. Открываем настройки деплоймента Project Settings => Deployment:


2. Добавляем новый сервер. Для этого нужно нажать на плюсик, дать ему имя и выбрать тип соединения. В моем случае это SFTP:


3. Заполняем табу "Connection":


Стоит заметить, что в поле "Root path" лучше указывать директорию VM, в которой лежат все ваши проекты, чтобы можно было использовать данный сервер и для их деплоя.

4. Заполняем табу "Mappings":


- "Local path": локальная папка с проектом
- "Deployment path on server '%YOUR_SERVER_NAME%'": удаленная папка с проектом

5. Заполняем табу "Excluded Paths":


Здесь можно настроить папки, которые мы не ходим деплоить на VM и наоборот. В данном случае я указал что не хочу получать с удаленного сервера содержимое папки "var", в которой хранится кеш, репорты, логи и прочая служебная информация о проекте.

6. Настраиваем автоматический аплоад на удаленный сервер, чтобы после каждого сохранения файла, он PhpStorm отправлял его на сервер. Для этого нужно зайти в Project Settings => Deployment => Options и выставить чекбоксы вот так:


Поздравляю, все настроено. Открываем любой файл, делаем в нем изменение, сохраняем и видим что PhpStorm автоматически загрузил этот файл на сервер:


Как вы видите, все просто. Данный способ еще можно использовать для деплоя небольших сайтов на продакшен-сервер.

Читать далее

пятница, 24 февраля 2012 г.

О сравнениях в PHP

Поговорим немного о code style. В частности, о сравнениях. Я рекомендую всегда первым ставить то значение, с которым вы сравниваете. Например:
define('MY_AUTO', 'KIA');

if (MY_AUTO == $_GET['auto']) {
    echo "it's my auto!";
}

О красоте говорить не будем, так как это очень растяжимое понятие. Преимущество данной записи состоит в том, что вы не сможете случайно забыть одно равно и обезопасите себя от такой маленькой и досадной ошибки:
define('MY_AUTO', 'KIA');

if ($_GET['auto'] = MY_AUTO) {
    echo "it's my auto!";
}

Данная проверка всегда будет проходить. С первого раза и не поймешь в чем дело. При первом варианте такое не прокатит. Программируйте внимательно ;)
Читать далее

Очистка неактивной оперативной памяти в Mac OS X

В Mac App Store существует очень много программ для очистки неактивной оперативной памяти в вашей системе. Я, например, долгое время пользовался Memory Sweeper Pro. Но, оказывается, можно легко обойтись без всего этого шлака. Для этого заходим в Терминал и вводим команду:
purge

Ждем несколько секунд (система может немного подвиснуть) и все - вся неактивная память стала свободной ;)
Читать далее

четверг, 23 февраля 2012 г.

Изолируем тесты в PHPUnit

Вчера столкнулся с ситуацией, когда из-за неправильного кода (в темплейте инициализировалась функция) падали тесты. Например, есть файл index.phtml с таким содержанием:
...
function showMenu()
{
    echo '
  • item1
  • item2
  • item3
'; } ...

Функция showMenu() выводит меню на странице. Программист по каким-то своим соображениям не захотел ее выносить в php-файл. Если мы заходим покрыть данный файл тестами, то уже на втором тесте получим фатал:
PHP Fatal Error: Cannot redeclare showMenu() (previously declared in /home/test/index.phtml) 

Самым лучшим выходом из данной ситуации будет рефакторинг кода: вынести функцию в php-файл или обернуть ее проверкой function_exist():
...
if (!function_exist('showMenu')) {
    function showMenu()
    {
        echo '
  • item1
  • item2
  • item3
'; } } ...

Но что делать когда мы не имеем права редактировать существующий код (в моей практике такое бывает очень часто)? Тогда нам на помощь приходят аннотации PHPUnit @runInSeparateProcess и @runTestsInSeparateProcesses. Они помогают изолировать тест-кейсы, запуская их в отдельных процессах.

@runTestsInSeparateProcesses позволяет изолировать все тест-кейсы:
/**
 * @runTestsInSeparateProcesses
 **/
class MyTest extends PHPUnit_Framework_TestCase
{
    public function testTest1()
    {
        // ...
    }

    public function testTest2()
    {
        // ...
    }
}

@runTestsInSeparateProcesses позволяет изолировать определенные тест-кейсы:
class MyTest extends PHPUnit_Framework_TestCase
{
    public function testTest1()
    {
        // ...
    }

    /**
     * @runInSeparateProcess
     **/
    public function testTest2()
    {
        // ...
    }
}

Надеюсь, эти аннотации помогут вам так же сильно, как помогли сегодня мне. Программируйте правильно о_О
Читать далее

воскресенье, 19 февраля 2012 г.

Полезные команды Git

Я начал использовать git совсем недавно и не могу назвать себя git экспертом. Но каждый день я сталкиваюсь с ситуациями и командами, описание которых, думаю, будет полезным для вас. Описание даю на английском, так как это будет понятнее.

Create and Checkout a New Branch
#branches from currently checked out directory
git checkout -b 

Checkout a Remote Branch
git checkout -b  origin/

Abort Changes of a File
git checkout -- 

Modify the Previous Commit’s Message
git commit --amend

Partial Change Checkin
git add --edit

Undo the Previous Commit
git revert HEAD^

Temporarily Stash Changes, Restore Later
# After changes have been made...
git stash

# Do some other stuff here, like switch branches, merge other changes, etc.

#Re-apply the changes
git stash pop

Delete a Remote Branch
git push origin :

Pull in the Latest from a Shared Repository
# Add a remote branch
git remote add  
 # For example:  git remote add lightfaceOfficial git://github.com/darkwing/LightFace.git

# Get changes from that branch
git fetch 

Tagging, Deleting, and Pushing Tags
# Create a Tag
git tag 

# Delete the tag
git tag -d 

# Push Tags
git push --tags

Who F’d it All Up?
git blame 

Читать далее

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

Посещаемость

Продолжаю развивать сайт http://videobzor.com и писать отчеты о его нагрузке/посещаемости. С момента последнего поста посещаемость возросла почти в 2 раза и составляет ~300 хостов/день. Вчера было 407. Исходящий трафик составляет ~700-900 МБ/день. Так что движение есть и это очень радует.
Читать далее

Используем Emoji в iOS 5 и Mac OS X Lion

Открыл для меня красивенные смайлики Emoji. Купил за 0.99$ апликейшен для iOS и такое же приложение для Mac OS X Lion. Оказалось, эти покупки были бесполезными , так как Emoji уже встроен в iOS 5/Mac OS X Lion.

Для влючения Emoji в iOS 5, нужно выполнить следующие действия:

1. Открываем Settings -> Keyboard:

2. Жмакаем на International Keyboards:

3. Добавляем новую раскладку Emoji:


4. Теперь у нас есть новая раскладка со смайлами:

Для использования Emoji в Mac OS X Lion выполняем следующее:

1. Открываем любое текстовое поле:

2. В верхнем меню приложения выбираем пунктПравка -> Специальные символы...:

3. И находим в отдельной категории Emoji смайлы:

4. Использовать смайлы можно простым перетаскиванием:

Надеюсь, хоть вы теперь не купите встроенный функционал iOS 5 и Mac OS X Lion Apple ;)

Читать далее

суббота, 4 февраля 2012 г.

Создание колонки VARCHAR с фиксированным размером в Magento mysql-upgrade

Вчера пытался с помощью mysql-upgrade добавить колонку VARCHAR (20) в существующую таблицу и получил exception при отработке апгрейда. Чтобы было представление о чем я говорю, в файле было примерно следующее:
/** @var $installer Navoq_Backup_Model_Resource_Setup */
$installer = $this;
/** @var $adapter Varien_Db_Adapter_Pdo_Mysql */
$adapter = $installer->getConnection();

// Add 'file_name' column
$adapter->addColumn($installer->getTable('navoq_backup/file'), 'file_name', array(
    'comment'     => 'Name of file',
    'nullable'    => true,
    'column_type' => Varien_Db_Ddl_Table::TYPE_VARCHAR,
    'length'      => 100
));

Это при том, что при добавлении таблицы колонка с такими же параметрами создается:
/** @var $installer Navoq_Backup_Model_Resource_Setup */
$installer = $this;
/** @var $adapter Varien_Db_Adapter_Pdo_Mysql */
$adapter = $installer->getConnection();

/**
 * Create table 'navoq_backup/backup_list'
 */
$table = $adapter->newTable($installer->getTable('navoq_backup/file'))
    ->addColumn('file_name', Varien_Db_Ddl_Table::TYPE_VARCHAR,
        100, array('nullable'  => true), 'Name of file')
    ->setComment('Navoq Backup File List');
$adapter->createTable($table);

Мистика, не так ли? Но выход есть. Вернемся к первоначальному коду. Если добавить колонку таким образом:
/** @var $installer Navoq_Backup_Model_Resource_Setup */
$installer = $this;
/** @var $adapter Varien_Db_Adapter_Pdo_Mysql */
$adapter = $installer->getConnection();

// Add 'file_name' column
$adapter->addColumn($installer->getTable('navoq_backup/backup_list'), 'file_name', array(
    'comment'     => 'Name of file',
    'nullable'    => true,
    'column_type' => Varien_Db_Ddl_Table::TYPE_TEXT
));

У нас выполнится апгрейд и в таблице `navoq_backup_file` появится поле `file_name` типа TEXT. Но стоит нам добавить в предыдущий код параметр length:
/** @var $installer Navoq_Backup_Model_Resource_Setup */
$installer = $this;
/** @var $adapter Varien_Db_Adapter_Pdo_Mysql */
$adapter = $installer->getConnection();

// Add 'file_name' column
$adapter->addColumn($installer->getTable('navoq_backup/backup_list'), 'file_name', array(
    'comment'     => 'Name of file',
    'nullable'    => true,
    'column_type' => Varien_Db_Ddl_Table::TYPE_TEXT,
    'length'      => 100
));

И у нас создается то же поле `file_name` но типа VARCHAR и длинной в 100 символов. Enjoy ;)
Читать далее

пятница, 3 февраля 2012 г.

github

На работе постепенно переводят проекты с SVN на Git. Причины разные, но основная причина в количестве людей и способе взаимодействия между нами (читай, проектами).

Лично я работаю с новой VCS уже 3ю неделю и переход мне напоминал стандартный порядок понимания новой технологии:
1. Че это такое? Уберите! Дайте мне сделать комит в SVN? Pull, push, stash? Что это такое? Мама, я хочу к тебе.
2. А чо если сделать тааак... А вот так? Ой.
3. Начинает нравиться (как и все, что ты понимаешь).

Радует, что все сотрудники понимали, что поймут полезность сего инструмента и в будущем мучения окупятся. Я считаю что работник, который знает SVN + Git это более ценный и универсальный член команды.

Теперь мне наконец-то пригодился мой аккаунт на github - https://github.com/sidorenko. Буду выкладывать в него свои сорцы модулей для Magento, которые я по чуть-чуть делаю в свободное время. Ну и еще что-то.
Читать далее

четверг, 2 февраля 2012 г.

Отличия Mac OS X 10.7.3 от 10.7.2


Сегодня вышло долгожданное обновление Mac OS X 10.7.3, но что-то я не слышу положительных возгласов. Видать, не очень все хорошо. Пожалуй, еще подожду.
Читать далее

вторник, 31 января 2012 г.

Git: подключаем новый удаленный репозиторий

Сегодня будем учиться подключать удаленный репозиторий к уже существующему. Для чего это нужно? Есть много вариантов. Например, мне это понадобилось для выполнения git cherry-pick из бранча одного репо в бранч другого. Итак, предположим, что вы сделали git clone и у вас есть 'origin' remote репозиторий. Если все так, то команда git remote покажет на экран следующую информацию:
$ git remote
origin

Сошлось? Прекрасно. Далее добавляем новый репозиторий с именем new_repo:
$ git remote add new_repo http://git.site.com/project/new_repo

Проверяем, что он добавился:
$ git remote
origin
new_repo

Получаем изменения из новой ветки:
$ git fetch new_repo

Удаленный репозиторий подключен. Список бранчей можно просмотреть с помощью команды:
$ git branch -r

Читать далее

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

PhpStorm: работа с разными CVS (SVN + Git) в одном проекте

На прошлой неделе возникла необходимость работы с SVN и Git на одном проекте. По-умолчанию, PhpStorm работает только с одной CVS. Например, если вы сделали git clone, а потом внутри проекта создали папку tests и сделали туда svn checkout, то IDE будет видеть только Git. То есть, выполнить какие-либо действия (up, commit, etc.) в папке с тестами будет невозможно. Но это можно легко исправить.

1. Открываем настройки:

2. Заходим в Project Settings -> Version Control. Если у вас проект на Git, то картинка будет примерно следующей:

3. Нажимаем Add и добавляем папочку tests:

После этого в списке меню Project Settings -> Version Control появится наша новая запись:

4. Сохраняем настройки. Теперь можно выполнять SVN-команды над папкой tests прямо из IDE.
Читать далее

суббота, 28 января 2012 г.

PhpStorm: изменяем количество выделяемой оперативной памяти в Mac OS X

После установки PhpStorm установил верхнюю планку выделяемой оперативной памяти в 795 Mb. Как я уже писал для меня каждый мегабайт на вес золота. Если у вас есть желания исправить такую наглость программы, я помогу.

Для начала нужно открыть файл "/Applications/PhpStorm *.*.app/Contents/Info.plist". Сделать это можно через Finder или Терминал.

В конце файла будет подобный тест:

  

      ....

      VMOptions.i386
      -Xms128m -Xmx512m -XX:MaxPermSize=250m -XX:ReservedCodeCacheSize=64m

      VMOptions.x86_64
      -Xms128m -Xmx800m -XX:MaxPermSize=250m -XX:ReservedCodeCacheSize=64m -XX:+UseCompressedOops

      ...

    
  

В зависимости от вашей платформы нужно изменить "-Xmx512m" или "-Xmx800m". Изменяем, число, сохраняем, перезапускаем программу. Все ;)
Читать далее

пятница, 27 января 2012 г.

PhpStorm: включаем обрамление выделенного текста в кавычки или скобки

Моя основная IDE на работе и дома это PhpStorm. Причем, в обоих местах она лицензионная ;)

Эта система очень большая, почти каждый день я узнаю что-то новое о ней. Потому решил писать об этом в блоге.

Начнем с обрамления выделенного текста в кавычки или скобки. Сначала это нужно включить.

1. Открываем настройки:

2. Заходим в IDE Settings -> Editor -> Smart Keys и ставим галочку напротив Surround selection on typing quote or brace:

3. Сохраняем настройки и радуемся жизни. Теперь вы можете выделить текст и нажать символ кавычки/скобки, после чего текст будет обрамлен введенным символом.
Читать далее

четверг, 26 января 2012 г.

Как установить PHPUnit для MAMP

На работе я привык работать в CentOS/FreeBSD VM, на которой установлен Apache, nginx, PHP, MySQL и прочие необходимые инструменты для веб-разработки. Это удобно тем, что эта система максимально приближена к реальной обстановке проекта,чем минимизируются основные проблемы, связанные с настройкой различных сервисов.
Ну и VM всегда можно забекапить ;) По-этому, всегда можно безопасно экспериментировать.

Дома у меня MacBook с 2.5 Гб ОЗУ. С виртуалкой все очень тормозит. По-этому до того момента, пока я не разживусь еще одной планкой ОЗУ, приходится юзать MAMP. Вчера появилась задача настройки и запуска PHPUnit для MAMP. Приступим.

Для установки PHPUnit с помощью MAMP PEAR нам потребуется терминал с правами root-пользователя.

Сначала обноляем PEAR с помощью двух команд:
/Applications/MAMP/bin/php5/bin/pear channel-update pear.php.net
/Applications/MAMP/bin/php5/bin/pear upgrade pear

Теперь пришло время зарегистрировать соответствующий канал и установить PHPUnit:
/Applications/MAMP/bin/php5/bin/pear channel-discover pear.phpunit.de
/Applications/MAMP/bin/php5/bin/pear install phpunit/PHPUnit

PHPUnit теперь установлен, но чтобы запускаеть его с помощью терминала, нам нужно перенести его в $PATH:
mv /Applications/MAMP/bin/php5/bin/phpunit /usr/local/bin/phpunit

Для теста наберите:
phpunit --version

Вы увидите что-то вроде:
PHPUnit 3.6.9 by Sebastian Bergmann

Это все. Если есть вопросы, задавайте их в комментариях.
Читать далее

четверг, 19 января 2012 г.

Проверка наличия класса

Если вам нужно проверить наличие определенного класса, вы можете использовать функцию class_exists(). Ее важная особенность состоит в том, что class_exists() даже при отсутствии проверяемого класса автоматически вызывает автолоадер. Чтобы запретить такое поведение, необходимо передавать false в качестве второго параметра фунции class_exists().

Следующий код демонстрирует такое поведение:
    require_once('Zend/Loader.php');
 
    Zend_Loader::registerAutoload();
 
    if (!class_exists('MyTestClass')) {
       // class doesn't exist, but now the auto-loader will try and load it
    }
 
    if (!class_exists('MyOtherTestClass', false)) {
        // class doesn't exist, and the auto-loader will not be used
    }

Читать далее