31 мар. 2011 г.

Phpstorm настройка подключения к Mysql

Follow this steps to active a MySQL connection (I used this for my local MAMP setup)

1) Install DB navigator plugin: Settings >> plugins >> "available" tab
2) Download MySQL jdbc connector >> http://www.mysql.com/downloads/connector/j/
3) Unpack MySQL jdbc connector to a directory (ex: /home/documents/mysql_connector)
4) Add a DB connection: Settings >> DB Connection

Example for MySQL
Name: personal connection name (ex: MAMP MySQL)
Description: some more information (ex: local mamp mysql server)
Driver Library: location of the MySQL jdbc connector (/home/documents/mysql_connector/mysql-connector-xxxx-bin.jar)
Driver: the perfered driver
URL: the connection URL with jdbc reference (ex: "jdbc:mysql://localhost:8889/")

user: the password for the mysql connection (ex MAMP: root)
password: the password for the mysql connection (ex MAMP: root)

30 мар. 2011 г.

Шаблон делегирования


[показать]

[показать]


[показать]

Исходный текст на языке PHP5

<?php


class A {

    public function f() {
        print "А: Вызываем метод f()<br />";

    }

    public function g() {
        print "А: Вызываем метод g()<br />";

    }
}

class C {

    private $_a;


    public function __construct() {
        $this->_a = new A;

    }

    public function f() {
        $this->_a->f();

    }

    public function g() {
        $this->_a->g();

    }

    public function y() {
        print "C: вызываем метод y()<br />";

    }
}

$obj = new C;
$obj->f();

$obj->g();
$obj->y();

?>

Сложный пример


[показать]

[показать]


[показать]

Исходный текст на языке PHP5

<?php


// используем интерфейс для безопасности типа
interface I {
    public function f();

    public function g();
}

class A implements I {

    public function f() {
        print "А: Вызываем метод f()<br />";

    }

    public function g() {
        print "А: Вызываем метод g()<br />";

    }
}

class B implements I {
    public function f() {

        print "B: Вызываем метод f()<br />";
    }

    public function g() {

        print "B: Вызываем метод g()<br />";
    }
}

class C implements I {

    private $_i;

    // создаём объект, методы которого будем делегировать
    public function __construct() {

        $this->_i = new A;
    }

    // этими методами меняем поле-объект, чьи методы будем делегировать

    public function toA() {
        $this->_i = new A;

    }

    public function toB() {
        $this->_i = new B;

    }


    // делегированые методы
    public function f() {

        $this->_i->f();
    }

    public function g() {

        $this->_i->g();
    }
}

$obj = new C;

$obj->f();
$obj->g();
$obj->toB();

$obj->f();
$obj->g();

?>

Нетривиальный пример

Этот пример — это версия на PHP нетривиального примера, приведённого выше.


[показать]

[показать]


[показать]

Исходный текст на языке PHP5

<?php

// класс для хранения данных о сотруднике

class TEmployee {

    private $_name;
    private $_departament;


    public function __construct($name, $departament) {
        $this->_name = $name;

        $this->_departament = $departament;
    }

    public function getName() {

        return $this->_name;
    }

    public function getDepartament() {

        return $this->_departament;
    }
}

// имитация стандартного класса Delphi для хранения списка объектов
class TObjectList {


    private $_objList;

    public function __construct() {

        $this->free();
    }
    /**
     *чтобы не скучать!
     */
    public function free() {

        $this->_objList = array();
    }

    public function count() {

        return count($this->_objList);
    }

    public function add($obj) {

        array_push($this->_objList, $obj);
    }

    public function remove($obj) {

        $k = array_search( $obj, $this->_objList, true );

        if ( $k ) {
            unset( $this->_objList[$k] );

        }
    }

    public function get($index) {

        return $this->_objList[$index];
    }

    public function set($index, $obj) {

        $this->_objList[$index] = $obj;
    }
}


// класс для хранения сотрудников
class TEmployeeList {

    // объект класса "список объектов"
    private $_employeersList;


    public function __construct(){
        // создаём объект методы которого будем делегировать
        $this->_employeersList = new TObjectList;

    }

    public function getEmployer($index) {
        return $this->_employeersList->get($index);

    }

    public function setEmployer($index, TEmployee $objEmployer) {

        $this->_employeersList->set($index, $objEmployer);
    }


    public function __destruct() {
        $this->_employeersList->free();

    }

    public function add(TEmployee $objEmployer) {
        $this->_employeersList->add($objEmployer);

    }

    public function remove(TEmployee $objEmployer) {
        $this->_employeersList->remove($objEmployer);

    }

    // последовательный поиск сотрудника по имени
    // через аргумент $offset можно задавать позицию с которой вести поиск.
    // если сотрудник не найден вернёт значение меньше ноля (-1)
    public function getIndexByName($name, $offset=0) {

        $result = -1; // предполагаем, что его нету в списке
        $cnt = $this->_employeersList->count();

        for ($i = $offset; $i < $cnt; $i++) {

            if ( !strcmp( $name, $this->_employeersList->get($i)->getName() ) ) {

                $result = $i;
                break;
            }
        }

        return $result;
    }
}

$obj1 = new TEmployee("Шлёнский Дмитрий", "web студия");

$obj2 = new TEmployee("Кусый Назар", "web студия");
$obj3 = new TEmployee("Сорока Орест", "web студия");


$objList = new TEmployeeList();
$objList->add($obj1);

$objList->add($obj2);
$objList->add($obj3);


echo "<pre>";
print_r($objList);

echo "<hr>";


$index = $objList->getIndexByName("Кусый Назар");
$obj4 = $objList->getEmployer($index);

print_r($obj4);

echo "<hr>";

$objList->setEmployer(2, $obj4);

print_r($objList);
echo "</pre>";
?>



* This source code was highlighted with Source Code Highlighter.

Шаблон проектирования

Типы шаблонов проектирования

 

Название Оригинальное название Описание Описан в Design Patterns
Основные шаблоны (Fundamental)
Шаблон делегирования Delegation pattern Объект внешне выражает некоторое поведение, но в реальности передаёт ответственность за выполнение этого поведения связанному объекту Н/Д
Шаблон функционального дизайна Functional design Гарантирует, что каждый модуль компьютерной программы имеет только одну обязанность и исполняет её с минимумом побочных эффектов на другие части программы Н/Д
Неизменяемый объект Immutable Объект, который не может быть изменён после своего создания Н/Д
Интерфейс Interface Общий метод для структурирования компьютерных программ для того, чтобы их было проще понять Н/Д
Marker interface Marker interface Н/Д
Property Container Property Container Н/Д
Event Channel Event Channel Н/Д
Порождающие шаблоны (Creational) — шаблоны проектирования, которые абстрагируют процесс инстанцирования. Они позволяют сделать систему независимой от способа создания, композиции и представления объектов. Шаблон, порождающий классы, использует наследование, чтобы изменять инстанцируемый класс, а шаблон, порождающий объекты, делегирует инстанцирование другому объекту.
Абстрактная фабрика Abstract factory Класс, который представляет собой интерфейс для создания компонентов системы. Да
Строитель Builder Класс, который представляет собой интерфейс для создания сложного объекта Да
Фабричный метод Factory method Определяет интерфейс для создания объекта, но оставляет подклассам решение о том, какой класс инстанциировать Да
Отложенная инициализация Lazy initialization Объект, инициализируемый во время первого обращения к нему Нет
Пул одиночек Multiton Гарантирует, что класс имеет поименованные экземпляры объекта и обеспечивает глобальную точку доступа к ним Нет
Объектный пул Object pool Класс, который представляет собой интерфейс для работы с набором инициализированных и готовых к использованию объектов Нет
Прототип Prototype Определяет интерфейс создания объекта через клонирование другого объекта вместо создания через конструктор Да
Получение ресурса есть инициализация Resource acquisition is initialization (RAII) Получение некоторого ресурса совмещается с инициализацией, а освобождение — с уничтожением объекта Нет
Одиночка Singleton Класс, который может иметь только один экземпляр. Да
Структурные шаблоны (Structural) определяют различные сложные структуры, которые изменяют интерфейс уже существующих объектов или его реализацию, позволяя облегчить разработку и оптимизировать программу.
Адаптер Adapter / Wrapper Объект, обеспечивающий взаимодействие двух других объектов, один из которых использует, а другой предоставляет несовместимый с первым интерфейс Да
Мост Bridge Структура, позволяющая изменять интерфейс обращения и интерфейс реализации класса независимо Да
Компоновщик Composite Объект, который объединяет в себе объекты, подобные ему самому Да
Декоратор или Wrapper/Обёртка Decorator Класс, расширяющий функционал другого класса, без использования наследования Да
Фасад Facade Объект, который абстрагирует работу с несколькими классами, объединяя их в единое целое Да
Единая точка входа Front Controller Обеспечивает унифицированный интерфейс для интерфейсов в подсистеме. Front Controller определяет высокоуровневый интерфейс, упрощающий использование подсистемы Нет
Приспособленец Flyweight Это объект, представляющий себя как уникальный экземпляр в разных местах программы, но по факту не являющийся таковым Да
Заместитель Proxy Объект, который является посредником между двумя другими объектами, и который реализовывает/ограничивает доступ к объекту, к которому обращаются через него Да
Поведенческие шаблоны (Behavioral) определяют взаимодействие между объектами, увеличивая таким образом его гибкость.
Цепочка ответственности Chain of responsibility Предназначен для организации в системе уровней ответственности Да
Команда, Action, Transaction Command Представляет действие. Объект команды заключает в себе само действие и его параметры Да
Интерпретатор Interpreter Решает часто встречающуюся, но подверженную изменениям, задачу Да
Итератор, Cursor Iterator Представляет собой объект, позволяющий получить последовательный доступ к элементам объекта-агрегата без использования описаний каждого из объектов, входящий в состав агрегации Да
Посредник Mediator Обеспечивает взаимодействие множества объектов, формируя при этом слабую связанность и избавляя объекты от необходимости явно ссылаться друг на друга Да
Хранитель, Token Memento Позволяет не нарушая инкапсуляцию зафиксировать и сохранить внутреннее состояния объекта так, чтобы позднее восстановить его в этом состоянии Да
Null object Предотвращает нулевые указатели, предоставляя объект «по умолчанию» Нет
Наблюдатель, Dependents, Publish-Subscribe, Listener Observer или Publish/subscribe Определяет зависимость типа «один ко многим» между объектами таким образом, что при изменении состояния одного объекта все зависящие от него оповещаются об этом событии Да
Слуга Servant Используется для обеспечения общей функциональности группе классов Нет
Specification Служит для связывания биснес-логики Нет
Состояние, Objects for States State Используется в тех случаях, когда во время выполнения программы объект должен менять свое поведение в зависимости от своего состояния Да
Стратегия Strategy Предназначен для определения семейства алгоритмов, инкапсуляции каждого из них и обеспечения их взаимозаменяемости Да
Шаблонный метод Template method Определяюет основу алгоритма и позволяет наследникам переопределять некоторые шаги алгоритма, не изменяя его структуру в целом. Да
Посетитель Visitor Описывает операцию, которая выполняется над объектами других классов. При изменении класса Visitor нет необходимости изменять обслуживаемые классы. Да
Simple Policy Нет
Event listener Нет
Single-serving visitor Single-serving visitor Оптимизирует реализацию шаблона посетитель, который инициализируется, единожды используется, и затем удаляется Нет
Hierarchical visitor Hierarchical visitor Предоставляет способ обхода всех вершин иерархической структуры данных (напр. древовидной) Нет

 

Частные

Шаблоны параллельного программирования (Concurrency)

Используются для более эффективного написания многопоточных программ, и предоставляет готовые решения проблем синхронизации.
Название Оригинальное название Описание
Active Object Active object Служит для отделения потока выполнения метода от потока, в котором он был вызван. Использует шаблоны асинхронный вызов методов и планировщик
Balking Balking Служит для выполнения для действия над объектом только в тогда, когда тот находится в корректном состоянии
Binding Properties Комбинирует несколько наблюдателей для обеспечения синхронизации свойств в различных объектах[1]
Messaging design pattern (MDP) Позволяет компонентам и приложениям обмениваться информацией (сообщениями)
Блокировка с двойной проверкой Double-checked locking Предназначен для уменьшения накладных расходов, связанных с получением блокировки
Event-based asynchronous Addresses problems with the Asynchronous pattern that occur in multithreaded programs.[2]
Guarded suspension Guarded suspension Используется для блокировки выполнения действия над объектом только когда тот находится в корректном состоянии
Half-Sync/Half-Async
Leaders/followers
Lock Один поток блокирует ресурс для предотвращения доступа или изменения его другими потоками[3]
Monitor Object Monitor object Объект, предназначенный для безопасного использования более чем одним потоком
Reactor Reactor Предназначен для синхронной передачи запросов сервису от одного или нескольких источников,
Read write lock Read-write lock Позволяет нескольким потокам одновременно считывать информацию из общего хранилища, но позволяя только одному потоку в момент времени изменять её
Планировщик Scheduler Обеспечивает механизм реализации политики планирования, но при этом не зависящих ни от одной конкретной политики
Thread pool Thread pool Предоставляет пул потоков для обработки заданий, представленных обычно в виде очереди
Thread-Specific Storage Thread-specific storage Служит для предоставления различных глобальных переменных для разных потоков
Однопоточное выполнение Single Thread Execution Препятствует конкурентному вызову метода, тем самым запрещая параллельное выполнение этого метода
Кооперативный паттерн Cooperative pattern

MVC

 Enterprise


 Другие типы шаблонов

Также на сегодняшний день существует ряд других шаблонов:
  • Carrier Rider Mapper описывают предоставление доступа к хранимой информации
  • Аналитические шаблоны описывают основной подход для составления требований для программного обеспечения (requirement analysis) до начала самого процесса программной разработки
  • Коммуникационные шаблоны описывают процесс общения между отдельными участниками/сотрудниками организации
  • Организационные шаблоны описывают организационную иерархию предприятия/фирмы
  • Анти-паттерны (Anti-Design-Patterns) описывают, как не следует поступать при разработке программ, показывая характерные ошибки в дизайне и в реализации

См. также

Ссылки
src:
Шаблон проектирования

23 мар. 2011 г.

Утилита mysqldump

Утилита mysqldump позволяет получить дамп содержимого базы данных или совокупности баз для создания резервной копии или пересылки данных на другой SQL-сервер (не обязательно MySQL-сервер). Дамп будет содержать набор команд SQL для создания и/или заполнения таблиц.
Так же mysqldump имеет возможность развертывания баз данных из созданного sql-файла.

Создание дампа

Разберем пример простейшее использования, задампим базу данных «database» при помощи перенаправления потока в файл «database.sql»:

mysqldump -uroot -h82.82.82.82 -p database > database.sql
где:
  • -u или -–user=... — имя пользователя
  • -h или --host=... — удаленный хост (для локального хоста можно опустить этот параметр)
  • -p или --password — запросить пароль
  • database — имя базы данных
  • database.sql — файл для дампа


Для того чтобы сделать дамп несколько баз данных, необходимо использовать параметр --databases (или сокращенно -B), пример:
mysqldump -uroot -h82.82.82.82 -p -B database1 database2 database3 > databases.sql

А для того чтобы сделать дамп всех баз данных, необходимо использовать параметр --all-databases (или сокращенно -A), пример:
mysqldump -uroot -h82.82.82.82 -p -A > all-databases.sql

Развертывание дампа

Перенаправляем поток в обратную сторону и развертываем базу данных:
mysql -uroot -h82.82.82.82 -p database < database.sql
Или через mysql-console:
mysql> use database;


mysql> source database.sql

Пример использование некоторых параметров

Например, нам нужны данные с «продакшен версии базы» для «версии разработчика», то есть нам нужна «песочница». Выбираем не более 100 записей:
mysqldump -uroot -h82.82.82.82 -p --where="true limit 100" database > database.sql
Или нам нужна только структура, без данных:
mysqldump -uroot -h82.82.82.82 -p --no-data database > database.sql

Примеры навеяны постом Александра Макарова — http://rmcreative.ru/blog/post/ljogkiy-damp-mysql

17 мар. 2011 г.

NetBeans - мой выбор!

После долгих исканий наконец я остановился на самой лучшей IDE для разработки

Как обновить дерево файлов и папок в NetBeans?

Предполагается, что NetBeans самостоятельно должен следить за изменениями в файловой системе в процессе работы, сделанными сторонними программами. Но это у него получается не особо хорошо… После копирования чего-нибудь в проект, скажем, из командной строки, NetBeans не видит изменений и папка остается пустой. При чем ни в контекстном меню ни в горячих клавишах ничего похожего на «Refresh» нет. После непродолжительного шатания по Сети нашел решение. После изменений надо всего навсего воспользоваться главным меню Source -> Scan for External Changes.

Autocomplite

Неотъемлемой частью IDE является авто-дополнение кода. В этом IDE не подхватывается автоматически автокомплит, для этого нужно дополнительно нажать на Ctrl+Space, что не совсем удобно. Но это все дело привычки.

TODO

Пишем «//TODO нужно доделать функцию» и задача появляется в поле (1). Очень удобно когда работаешь над разными проектами и постоянно приходиться переключаться между ними.
Написал TODO и будешь уверен, что ничего не забудешь доделать.

Что в файле?

Слева можно видеть дерево всех функций PHP, JavaScript, HTML. Удобно когда файл содержит более 2000 строк.

Local History

Хранит историю изменения файла за последние 3-и дня. Слева (1) — что было, справа (2) — что стало. Можно увидеть, добавленные или удаленные строки кода.


 ссылки на тему:
Mercurial ubuntu netbeans php ( http://mkifiles.ru/2010/06/15/mercurial-ubuntu-netbeans-php/ )

http://www.netbeans.com/kb/docs/php/editorguide_ru.html#CodeFolding

12 мар. 2011 г.

Notepad++, Denwer, Xdebug – полноценная среда разработки

src:
http://ajaxblog.ru/92

Submit формы на ExtJS

Ext.get() returns an Ext.Element, not the underlying DOM element.

The underlying element is in a property called .dom.

Try:

Ext.get('login-openid-form').dom.submit();

EDIT

If you want to get more Ext-y, you can start to leverage Ext.form.BasicForm:

var form = new Ext.form.BasicForm('login-openid-form', { standardSubmit : true });
form.submit();

That will expose a more robust form API, which is beyond the scope of this answer, but the docs (linked above) are pretty good.

8 мар. 2011 г.

Семь полезных техник JavaScript

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


Изучая примеры, следует помнить, что есть и другие способы, дающие тот же результат, цель статьи в том, чтобы пролить немного света на то, что многие вещи можно сделать лучшим способом. Преимущества каждого метода достаточно очевидны, но основная цель кратко показать распространенные ошибки программистов и авторов библиотек, выработать некоторые навыки в JavaScript и продемонстрировать гибкость языка.

Знакомство с Ext JS

Если вы только начинаете использовать Ext или хотите узнать побольше о этой библиотеке – значит вы попали туда, куда нужно. В этом руководстве мы рассмотрим основные понятия Ext и создадим работающую динамическую страницу. Предполагается, что читатель уже знаком с основами Javascript и имеет некоторый опыт работы с этим языком программирования, а также знает основы HTML и DOM (объектной модели документа).

2 мар. 2011 г.

Вставка или обновление записи в MySQL


MySQL
Иногда бывают такие случаи, когда нужно добавить данные о каком либо объекте в таблицу базы данных, но заранее не известно есть какие-либо сведения об объекте уже есть в таблице.

    Объясню попроще. Пусть у нас есть две таблицы: users – таблица с данными пользователей с полями id, login, password, где id – первичный ключ; есть таблица users_rating с рейтингом пользователей, поле – user_id – внешний ключ id в users, поле rating – сам рейтинг.

  Наша задача – обновить рейтинг пользователя, если он уже имеет какой-либо рейтинг, либо вставить запись о пользователе и его начальном рейтинге в таблицу.