2013-04-29

Как я футболку печатал

Розовые глюки сползают по стенам
В честь переезда в новый офис решил я себе запилить тематическую футболку. Со скептичным Лениным, который пришелся очень кстати. Вырезал, пол часа наяривал кривые в гимпе, чтобы вычленить ровный передний план.

Скептичный Ленин
Прихожу я значит в полиграфическую контору. Выбираю нанесение и отдаю картинку. Оказалось, что просто прозрачной картинки недостаточно, нужно было превратить в вектор. Ну и 400 рублей за обтравку: я ей фигасе, там ровная граница - контур обведется в одно нажатие. Девочка попробовала, герб обтравился, а голова - нет. Мне уже было пофиг - сошлись на пол цены.

Я, в предвкушении завтрашнего дня, ушел домой. На следующий день раздался звонок: дизайнер по личным причинам взяла отгул, могу ли я подождать. Выбора у меня впринципе не было (услуга уже оплачена) и я согласился.

Прозрачный контур
Прошли выходные, раздается звонок за час до того, как я собираюсь идти забирать заказ: не могли бы вы нам скинуть на почту картинку, мы вашу потеряли. О-ок, по смс получаю почту, скидываю. Осторожно интересуюсь: а вы успеете? На что мне отвечают: конечно. В шесть раздается звонок, я уж было подумал конец, но нет: приходите забирать заказ через 10 минут. Пронесло.

В общем, на футболке Ленин получился не таким скептичным, как на исходнике. Но я удовлетворен. По приезду надо будет нафигачить футболок с Кошем. Благо макетов они выложили уйму.

2013-04-28

Концентрируйся свободно

Лео Бабаута. Концентрируйся
свободно! Манифест простоты в «Век Разрушения сфокусированности». Долгая книга, все никак не мог сфокусироваться на её прочтении. Если вы не можете сосредоточиться на важных делах, вас постоянно отвлекают, вы постоянно забываете про важные дела и встречи, постоянно тянет проверить сообщения в любимой социальной сети, давит груз ответственности и обязательств. Если при этом вы чувствуете что это неправильно и хочется с этим что-то сделать - то книга для вас. Причем, книга находится в паблик домейне, а значит можно скачивать совершенно безвоздмезно. Итог - рекомендую к прочтению.

2013-04-27

Нетерпеливый кольцехвост

Заобновился вчера на новую убунту. Для этого пришлось выкачать больше гига обновлений. Когда уже все скачалось, примерно на середине обновления, я забыл, что  обновляюсь и закрыл крышку. Пришлось восстанавливать установку через sudo dpkg --configure -a, потому что стандартное средство обновления ругалось, но никакого эффекта от нажатия кнопок не было. Вроде всё прошло гладко.

2013-04-26

Юбилей

Разработчика повышают до менеджера
Сегодня испонилось ровно пять лет, как я начал восхождение по профессиональному пути. Надеюсь, что согласно товарищу Платову, меня уже можно считать овладевшим профессией. Еще столько же до профессионала.

2013-04-24

Бизнес-логика в базе


Типичный опердень
Выборка 41.5%
Фильтрация 5.8%
Обработка 13.4%
Аналитика 17.7%
Пост-обработка 21.6%
Комментарии 0%

Или почему это зло

Если бизнес-логика в базе

Первая по важности - это богатые возможности СУБД: умный оптимизатор, который может работать с индексами и собирать статистику, что драматически сокращает объем считываемых данных и памяти; под рукой дешевые джойны по внешним ключам; агрегатные и аналитические функции; группировка и сортировка; фильтрация.

Второе - возможность легко и непринужденно использовать результат такого запроса в качестве источника данных.

Если бизнес-логика в приложении

Нет размазывание бизнес-логики между приложением, и базой. Что же такого на стороне приложения?
1. Не нужно вырезать и вставлять куски кода, чтобы их прогнать в изолированном окружении
2. Легкая отладка - можно остановиться в любом месте обрабоки и посмотреть на данные
3. Версионирование - кто вообще версионирует код, в базе?
4. Легковесность базы - нет логики, достаточно простого SQL, нет требований к базе, можно на коленке разворачивать схему любой версии на любой пользовательской машине. Когда база всего-лишь тупое хранилище данных, нам для работы достаточно командной строки, в идеале поля для выполнения кода с подсветкой синтаксиса. Сам билд становится переносимым, позволяя развернуть рабочее приложение на чистой машине.
5. Декларативный подход против императивно-функционального - СУБД сама выбирает оптимальный порадок выборки данных, зато во втором варианте процесс обработки можно "читать"
6. Комментарии - их нет. Ноль целых ноль десятых процента. Какой смысл их писать, если один кусочек логики размазывается по всему запросу? В случае пошаговой обработки можно пояснять что мы делаем на каждом этапе и почему.
7. Пошаговость процесса и функциональный стиль написания - позволяет писать тесты. Тестирование кода, работающего с базой - это уже джедайские практики. Я ни разу не видел тестов внутри базы, покрывающих пакеты, хотя инструменты имеются.
8. Возможность написать высокоуровневый DSL, который будет адаптирован к бизнес-домену, что позволит транслировать код в SQL с жутким мультипликатором. На эту тему у ребе metaclass можно прочитать много интересного.

Минусы хранения логики в приложении

1. ORM, которые строят сложные и, порой, неоптимальные запросы. А еще, многие из них не умею работать с курсорами, что усложнает написание кода в функциональном стиле с минимумом побочных эффектов. Претензий много.
2. Резко вырастает объем данных, которые нужно загрузить для выборки, одна из причин, по которой аппликейшен сервер держат поближе к базе данных (в сравнении с расстоянием до клиента).

Итог

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

P.S. Пояснения к легенде

Выборка - это Select и Join,
Фильтрация - Where и Having,
Обработка - различные функции, рассчеты, кейсы,
Аналитика - агрегатные и аналитические функции,
Пост-обработка - захардкоженные константы, сортировка и группировка.

2013-04-21

Версионирование схемы БД

1 часть. Ораклява

Как-то меня перекинули на мой первый серьезный проект. Главная проблема была в том, что из проекта ушел основной разработчик, проект оказался в середине большого переписывания, а мне знания передавались неспециалистом в формате вуду-практик. Этих плясок было достаточно, чтобы поддерживать хоть какое-то подобие жизни.

2013-04-20

Липосакция репозитория

Сборка HelloWorld на Maven

Предыстория

До того, как мы переехали на maven, мы жили в счастливом неведении: проект собирал нам eclipse, бинарные зависимости хранились рядом и коммитились в репозиторий. Двух книг оказалось достаточно, чтобы понять как низко мы пали. После этого мир изменился и уже никогда не будет прежним, а непортируемая сборка, которую нельзя запустить из консоли без IDE, будет восприниматься как нечто, о чем лучше забыть и не вспоминать.

Мы успешно выпилили все старые артефакты и всё бы ничего, но наш репозиторий перевалил за гиг и клонирование занимало какое-то совсем неприличное время. Посему, между возможностью собрать любую старую версию (на тот момент мы еще не стабилизировали версии) и маленьким репозиторием, мы выбрали последний вариант. Похерив все хэши, мы удалили все бинарники сократив размер репозитория в 7 раз до 150 мегабайт. Все стало просто летать.

Хирургическое вмешательство

1 Этап. Определение кандидатов на отстрел

Такие файлы должны удовлетворять двум простым правилам:
  • это должен быть бинарный файл
  • он должен быть удален на момент поиска
Бинарный файл можно опредлить по расширению и отсутствию изменений в этом файле.

2. Этап. Составление расстрельного списка

Используем стиль для вывода списка файлов:

#Для списка измененных
#changeset = "{file_mods}"
#Для списка удаленных
changeset = "{file_dels}"

file_mod  = "{file_mod}\n"
file_del  = "{file_del}\n"

Дальше составляем два списка командами hg log --style style_del | sort -u и hg log --style style_mod | sort -u. В первом приближении нам нужно из списка удаленных исключить все элменты которые встречаются в списке измененных. Вычесть файлы можно несколькими способами. Дальше вычитаем при помощи пайпов:
comm -2 -3 \
<(hg log --style ~/path/to/style_del | sort -u) \
<(hg log --style ~/path/to/style_mod | sort -u).
Для экспериментов можно передавать диапазон ревизий -r 0:100 чтобы оптимизировать время.

Полученный список нужно будет просмотреть глазами и составить список расширений для удаления. Список расширений можно посмотреть прогнав через | grep -oE "\.\w*$" | sort -u. В нашем случае он получился таким: deb, gz, jar, mp3, so, wav.

Прогоняем через sed, выводя только файлы, совпавшие по расширению, формируя filemap для hg convert. Итоговая строка фильтрации выглядит так:
comm -2 -3 \
<(hg log --style ~/path/to/style_del | sort -u) \

<(hg log --style ~/path/to/style_mod | sort -u) \
| sed -n 's/\(.*\)\(deb\|gz\|jar\|mp3\|so\|wav\)/exclude "&"/p' \
> filemap

3 Этап. Зачистка

Получившийся filemap скармливаем в hg convert --filemap ~/path/to/filemap ~/repo ~/repo_clean. На выходе получаем переродившийся репозиторий без шлака и мусора.

Дисклеймер

Здесь описана операция, успешно проведенная нами год назад. За это вресмя ни разу не понадобилось доступиться к удаленным файлам. На данный момент при 5к коммитах, репозиторий занимает 500Мб. При этом часть бинарных ресурсов всё еще жива и используется.

Фильтрация идет в основном средствами линуксовых команд. Хотя mercurial предоставляет прекрасный API для доступа к репозиториям, которым сам же и пользуется, на котором можно было бы написать понятную фильтрацию без подобных майндфаков: /\(.*\)\( и приседания с ключами команд, на тот момент с этим API я был незнаком, а сейчас просто воспроизвожу свои записки для сохранения в назидание потомкам.

2013-04-15

Дао версионности

Предыстория

На третьем курсе зав.каф. Захаров Ю.Н. отправил меня помогать старшекурснику в написании визуализатора треков частиц. С меня было программирование, со старшекурсника математическое обеспечение. В тот момент у меня откуда-то появилось знание (возможно с хабра), что Ъ-пацаны в командной работе юзают контроль версий. State-of-the-art на тот момент был subversion, mercurial с git, хоть и родились но пугали кучей проблем (возможно отталкивало отсутствие опыта). Я заинитил репозиторий, выдернул из меркуриала консольные утилиты и начал его юзать. Использовал в одиночку, хоть и не долго.

2013-04-09

Код с привидениями

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

2013-04-07

Психбольница в руках пациентов

Алан Купер. Психбольница в руках пациентов. Очень “долгая” книга, многословная, в первой половине очень уныло обрисовывается state of art в проектировании взаимодействия на момент написания книги, во второй половине рассказывается как должно быть. На шестиста страницах автор пытается донести нехитрую мысль, что программирование взаимодействия нужно забрать у программистов. Они всё равно делать этого не хотят и не умеют (в силу профессиональной деформации), отчего получается только хуже. Тем не менее несколько интересных вещей я вынес (чуть было не дропнул на трети пути), отдельного внимания заслуживают примеры, идущие после каждого раздела. Итог 3 из 5, тем не менее, стоит прочитать всем, кто связан с проектированием интерфейсов.

2013-04-05

WiFi роутер с 3G


Unboxing
Постоянное перетыкивание свистка меня окончательно доконало и я стал искать девайс, который бы смог раздавать мобильные интернеты по вайфаю. Во всех брендовых магазинах их махом сметали с полок. Такое устройство есть только у Huawei, он же и снабжает ими операторов. Внезапно он обнаружился в ДНСе.

2013-04-02

Codefest 2013

КДПВ. Девчонки приставали ко всем
и требовали с ними сфотаться

Некоторые квартирники популярнее докладов

Зависаем в чиллауте
Большая часть народу сказали, что codefest уже не торт, тем более за такие деньги. Тем не менее, это не помешало поехать потусить в Новосиб.