четверг, 6 декабря 2012 г.
Декабрьский'12 must read
Семь хороших объектно-ориентированных привычек при программировании на PHP
воскресенье, 18 ноября 2012 г.
REST vs SOAP. Почувствуйте разницу
Битовые операции в PHP на примерах
Статьи по MongoDB
Software People 2012: Кросс-функциональная команда — это хорошо... или плохо
Доклад Максима Дорофеева
О вреде кросс-функциональности:
- О пользе специализации
- Экономика теории ограничений
- ТОС Burn-Down chart
- Эффект семи нянек
- Эффект выпрямления сроков
- Эффект вечных очередей
суббота, 10 ноября 2012 г.
jquery.cookie - простой, легкий jQuery плагин для работы с cookies.
jquery.cookie
A simple, lightweight jQuery plugin for reading, writing and deleting cookies.Moment.js: легкая работа с датами
Не все базы одинаково полезны
Некоторые тезисы:
- оставайтесь на MySQL, не поддавайтесь моде на NoSQL;
- железо — дешевле людей. На старте масштабируйтесь железом и типовым открытым софтом (и его настройками);
- заурядному стартапу нужно минимум полгода, чтоб вылезти из ресурсов одного сервера;
- думайте про консистентность заранее, на уровне архитектуры, а то потом сами её выпилите;
- для веб-сервисов, не являющихся биллингами или процессингами, не нужна высокая связность и синхронность;
- поиск на MySQL FULLTEXT — обречён. Используйте Sphinx или иные специализированные движки;
- главное в надёжности — железо и резервирование по нему. Badoo использует Percona, а NoSQL — сильно распиарен.
воскресенье, 4 ноября 2012 г.
воскресенье, 28 октября 2012 г.
Создание легкого REST API средствами ZF2
Проектирование:
- Определение проблемы
- Принципы и руководства по построению API
- Выбор протокола: SOAP vs REST
- Выбор формата: XML vs JSON/JSONP
- Выбор каркаса: ZF2 vs микро-фреймворки
Создание:
- Создание серверных компонентов
- Создание клиентов (JS, PHP)
- Вопросы безопасности и авторизации
- Версионность API
Тестирование:
- Модульное тестирование веб-сервисов
- Функциональное тестирование веб-сервисов
- Нагрузочное и стресс тестирование веб-сервисов
четверг, 25 октября 2012 г.
Слова, которые никогда не скажет хороший инженер
Я работаю в качестве вербовщика инженеров программного обеспечения и мои 12 лет в качестве лидера группы предоставили мне возможность поговорить со многими талантливыми инженерами начиная с 1998 года, благодаря этому мне удалось определить несколько моделей общего поведения, которые я считаю самыми показательными. Разрабатывая анкету кандидата, я задаю много вопросов, которые ведут к различным ответам, и я обращаю особое внимание на ответы. Помимо поведения, есть вещи, которые вы услышите на собеседованиях с менее квалифицированными инженерами, и не услышите в ответах лучших кандидатов. Вот список цитат, которые я никогда не услышу от луших инженеров.
Установка Pinba на Ubuntu
воскресенье, 14 октября 2012 г.
Разработка консольных приложений с ZendFramework 2.0
Доклад Алексея Качаева на Zend Faramework Day 2011.
- Что такое и зачем нужны веб-разработчику консольные приложения.
- Разбор типичных кейсов.
- Консольное приложение в разрезе:
- stdin, stdout, stderr;
- входящие параметры и их обработка с Zend\Console\Getopt;
- форматирование вывода с использованием Zend\Text и ResponseDecorator;
- интерактивные (диалоговые) интерфейсы.
- Встраиваем консольные приложения в инфраструктуру проекта:
- архитектура и возможности Zend\Tool\Framework;
- "единая точка входа" и роутинг команд;
- Manifest, Provider, Metadata;
- Request\Response;
- HelpSystem.
- Продвинуты подходы и приемы:
- немного unix way: работа с pipe-ами и перенаправлением вывода;
- динамический output на примере progress bar;
- нативная и внешняя демонизация процессов;
суббота, 13 октября 2012 г.
Ubuntu startup - автозапуск программ
# ls /etc/rc?.dПосмотреть список всех программ автозапуска CentOS
# chkconfig --list programNameДобавить в автозапуск Ubuntu
# update-rc.d programName defaultsДобавить в автозапуск CentOS
# chkconfig --add programNameУдалить из автозапуска Ubuntu
# update-rc.d -f programName removeУдалить из автозапуска CentOS
# chkconfig --del programName
Кирилл Мокевнин: Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социальной сети starlook.ru
Доклад Кирилла Мокевнина на ZFConf2010.
Кирилл рассматривает разные возможности отдачи медиа на сайте. Озвучивает решения загрузки, хранении, ресайза, конфигурирования, взаимодействия серверов обработки, кеширования медиа.
четверг, 20 сентября 2012 г.
Непрерывная интергация на Jenkins c PHP + PHPUnit
На сегодняшний день инструментов непрерывной интерграции (Continuous Integration) PHP проектов много. Все они много чего умеют, и чем больше функционала предлагает то, или иное решение, тем трудней заставить его работать. Мне, почему-то нормальная документация попалась только по phpUnderControl на CruiseControl и Jenkins.
C CruiseControl как-то не заладилось, примеры устарели и почти не работают, поэтому Jenkins со своей работой из коробки победил. Итак, Jenkins
понедельник, 10 сентября 2012 г.
Архивы из командной строки
сжать в .tar
# tar -cvf folder.tar /path/to/folder
сжать в .tar.gz
# tar -cvzf folder.tar.gz /path/to/folder
распаковать:
# tar -zxvf archive.tgz
разбить любой файл на части:
# split -a 1 -b 400m ./film.tar.gz ./splitted_archive.tar.gz.
где:
"-a 1" - использовать один символя для суффикса (a, b, c)
"-b 400m" - бить на части по 400 мегабайт.
"./film.tar.gz" - источник
"./splitted_archive.tar.gz." - название новых файлов (в конце будут прибавляться суфиксы: splitted_archive.tar.gz.a, splitted_archive.tar.gz.b, splitted_archive.tar.gz.c)
склеить файл из частей:
# cat ./splitted_archive.tar.gz.* > ./film.tar.gz
где:
"./splitted_archive.tar.gz.*" - маска для файлов с частями
"./film.tar.gz" - результрующий файл
История команд терминала в Ubuntu
покажет на экране список ВСЕХ выполненных команд
history
выведет их в файл
history > /tmp/terminal_commands.txt
Создание ссылок на файлы
ln -s /etc/nginx/sites-avaliable/advice.loc /etc/nginx/sites-enabled/advice.loc
Рекурсивное удаление .svn папок
Заходим в папку и в ней выполняем. Удаляются все вложенные относительно текущей
rm -rf `find . -type d -name .svn`
Список процессов mysql
Список процессов можно посмотреть из коммандной строки или через phpmyadmin.
mysqladmin -u root --password=2442591 -v processlist
Создание и развертывание дампа PostgreSQL
Создание дампа
Разберем пример использования, задампим базу данных «database» при помощи перенаправления потока в файл «database.sql»:
sudo -u postgres pg_dump database > database.sql
где:
-u — имя пользователя (в данном примере "postgres")
pg_dump — команда для экспорта
database — имя базы данных
database.sql — файл для дампа
Для того чтобы сделать дамп только одной таблицы, необходимо использовать параметр -t, пример:
sudo -u postgres pg_dump -t sd_notifications socdate > socdate_notifications.sql
где:
-t sd_notifications — таблица которую будем экспортировать
Подробнее: http://www.postgresql.org/docs/8.4/static/app-pgdump.html
Развертывание дампа
Перенаправляем поток в обратную сторону и используем команду psql (если в скрипте нет очистки - необходимо вручную перед импортом очистить базу/таблицу):
sudo -u postgres psql socdate < socdate_notifications.sql
где:
-u postgres — имя пользователя
psql — команда для выполнения SQL скрипта
socdate — база данных в которую выполнятся команды скрипта
socdate_notifications.sql — файл дампа базы/таблицы откуда выполнятся команды скрипта
Подробнее: http://www.postgresql.org/docs/8.4/static/app-psql.html
Создание и развертывание дампа MySQL
Создание дампа
Разберем пример простейшее использования, задампим базу данных «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
Web-server ubuntu
sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/site1
Команда создает новую запись виртуального хостинга копируя стандартную запись апача.
sudo gedit /etc/apache2/sites-available/site1
и в этом файле:
1) заменить все /var/www/ на /home/user/www/site1/
2) перед строкой "DocumentRoot /home/user/www/site1/" добавить строку "ServerName site1"
То есть должно быть так:
ServerName site1
DocumentRoot /home/user/www/site1/
sudo a2ensite site1
sudo gedit /etc/hosts
и в этом файле добавить строку
127.0.1.2 site1
sudo /etc/init.d/apache2 reload
Заглушка mail
#!/bin/shСкрипт сохраняем в папку /usr/bin под любым угодным вам именем и делаем исполняемым (sudo chmod +x). Я использовал fake_sendmail.sh.
prefix="/var/mail/sendmail/new"
numPath="/var/mail/sendmail"
if [ ! -f $numPath/num ]; then
echo "0" > $numPath/num
fi
num=`cat $numPath/num`
num=$(($num + 1))
echo $num > $numPath/num
name="$prefix/letter_$num.html"
while read line
do
echo $line >> $name
done
chmod 777 $name
/bin/true
Теперь все исходящие письма будут складываться в /var/mail/sendmail. Так же необходимо выставить для папки права на запись. (chmod 777 -R /var/mail/sendmail).
Примечание: Для сбора писем почтовиком (о чем ниже), нужно в этой папке создать следующую структуру папок: /var/mail/sendmail/ — new И дать права на запись.
Настройка PHP. У меня стоит Кубунта, так что все пути относительно нее. Итак, находим в папке /etc/php5/apache2 файл php.ini и меняем в нем путь к sendmail на:
sendmail_path = /usr/bin/fake_sendmail.sh