воскресенье, 18 ноября 2012 г.

REST vs SOAP. Почувствуйте разницу

Некоторое время назад я гуглил интернет по поводу “REST vs SOAP”, прочитал пару статей и вроде бы все понял, но не почувствовал от этого никакого удовлетворения. Что-то было не так, то ли я не почувствовал основную идею, то ли просто читал, одновременно слушая новый музон и думая о новой фиче в проекте. Как появилось время, решил восполнить этот пробел, заодно написав полезную статью по этому поводу.


Битовые операции в PHP на примерах

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

Статьи по MongoDB

Коллеги, при разработке приложений, мы каждый день сталкиваемся с потребностью в гибком хранении информации (обновлении, поиске по ней, и т.д.). Класс продуктов, которые решают этот круг задач, как все мы знаем — Базы данных. Но что это такое в нашем понимании? У многих «база данных» твердо ассоциируется с MySQL, таблицами и SQL-запросами. И это устраивает до определенного момента. Действительно, реляционные базы данных дают массу преимуществ в работе: поскольку данные имеют сильную связанность, не нужно контролировать целостность базы данных. Используя простой под-запрос можно выбрать количество комментариев к каждому посту в блоге. Используя JOIN нетрудно делать сложные связанные выборки и получать данные сразу о нескольких сущностях.

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: легкая работа с датами

Moment.js это отличная библиотека для работы с датами в JavaScript.

Не все базы одинаково полезны

Сергей Аверин, Руководитель проекта десктопных приложений компании Badoo, выступил на High Performance Conference 9 августа с докладом: «Не все базы одинаково полезны».

Некоторые тезисы:

  • оставайтесь на MySQL, не поддавайтесь моде на NoSQL;
  • железо — дешевле людей. На старте масштабируйтесь железом и типовым открытым софтом (и его настройками);
  • заурядному стартапу нужно минимум полгода, чтоб вылезти из ресурсов одного сервера;
  • думайте про консистентность заранее, на уровне архитектуры, а то потом сами её выпилите;
  • для веб-сервисов, не являющихся биллингами или процессингами, не нужна высокая связность и синхронность;
  • поиск на MySQL FULLTEXT — обречён. Используйте Sphinx или иные специализированные движки;
  • главное в надёжности — железо и резервирование по нему. Badoo использует Percona, а NoSQL — сильно распиарен.

воскресенье, 28 октября 2012 г.

Мини cheatsheet PostgreSQL комманд


Ссылки:

Создание легкого REST API средствами ZF2

Данный доклад представляет собой набор практик по проектированию, созданию и тестированию легковесных API, построенных на базе компонентов ZF2.

Проектирование:
  • Определение проблемы
  • Принципы и руководства по построению API
  • Выбор протокола: SOAP vs REST
  • Выбор формата: XML vs JSON/JSONP
  • Выбор каркаса: ZF2 vs микро-фреймворки

Создание:
  • Создание серверных компонентов
  • Создание клиентов (JS, PHP)
  • Вопросы безопасности и авторизации
  • Версионность API

Тестирование:
  • Модульное тестирование веб-сервисов
  • Функциональное тестирование веб-сервисов
  • Нагрузочное и стресс тестирование веб-сервисов

четверг, 25 октября 2012 г.

Слова, которые никогда не скажет хороший инженер

Я работаю в качестве вербовщика инженеров программного обеспечения и мои 12 лет в качестве лидера группы предоставили мне возможность поговорить со многими талантливыми инженерами начиная с 1998 года, благодаря этому мне удалось определить несколько моделей общего поведения, которые я считаю самыми показательными. Разрабатывая анкету кандидата, я задаю много вопросов, которые ведут к различным ответам, и я обращаю особое внимание на ответы. Помимо поведения, есть вещи, которые вы услышите на собеседованиях с менее квалифицированными инженерами, и не услышите в ответах лучших кандидатов. Вот список цитат, которые я никогда не услышу от луших инженеров.

Установка Pinba на Ubuntu

Pinba - это утилита мониторинга PHP, использующая MySQL для хранения результатов. Она позволит вам в реальном времени получать статистику по работающему приложению, при этом не замедляя само приложение.

воскресенье, 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 - автозапуск программ

Посмотреть список всех программ автозапуска Ubuntu
# 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

Размер папки из консоли

du -hsx /usr/home/natan
du -h /* --max-depth=0

Создание ссылок на файлы

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
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
Скрипт сохраняем в папку /usr/bin под любым угодным вам именем и делаем исполняемым (sudo chmod +x). Я использовал fake_sendmail.sh.
Теперь все исходящие письма будут складываться в /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