Home
...and the road becomes my bride

> Recent Entries
> Archive
> Friends
> User Info
> My Website
> previous 20 entries

Advertisement

November 22nd, 2009


08:01 pm - Интересный затык при работе с моделями в Django

К примеру, хочется иметь в объекте модели поле, дата которого будет задаваться при сохранении объекта.

Казалось бы, вот такой код будет логичным:

class MyModel(models.Model):
    time = models.DateTimeField(default = datetime.now())

Однако,  в приведенном выше примере - все создаваемые объекты будут иметь дату создания в памяти класса MyModel.

Правильным будет указать в качестве значения по-молчанию функцию, которая будет вызываться каждый раз, при сохранении объекта:

class MyModel(models.Model):
     time = models.DateTimeField(default = datetime.now)

upd:
Как подсказывает товарищ overplumbum, можно добавить в конструктор models.DateTimeField() auto_now=True - http://ff.im/bQyQO

--
Этот, а также другие мои посты по it-тематике вы можете прочитать здесь
Tags:

(Leave a comment)

October 17th, 2009


08:22 pm - Ошибка при работе с pycurl

Сегодня мне окончательно надоело пользоваться кривейшим сайтом локальной сети моего провайдера. Основное назначение сайта - публикация ftp-ссылок на фильмы, которые заливаются на несколько локальных серверов. Я задумал написать небольшой индексатор, который обойдет папки у ftp и соберет мне имена файлов.

Для решения этой задачи наиболее адекватным инструментом мне показался CURL. За двадцать минут я написал 70 строк кода на питоне, и отправил сканер гулять по серверам. Информация начала литься в индекс, но счастья не случилось.  Сканер начал намертво зависать после нескольких минут работы.

Ошибка оказалась дурацкой и слегка неожиданной. В цикле обхода я для каждого запроса создавал новый объект PyCURL, и потом чистил его. Конечно,  это все накладные расходы, но в моей задаче мне на них был наплевать. Но не тут то было.  После создания многих экземпляров, при их чистке CURL вешает процесс.

Решение простое - создает один объект PyCURL, и работаем только с ним, через pycurl.setopt меняя параметры и много раз вызывая метод perform().

--
Этот, а также другие мои посты по it-тематике вы можете прочитать здесь
Tags: ,

(Leave a comment)

January 5th, 2009


07:56 pm - Упрощение сравнений с помощью двоичной арифметики

Пусть у нас есть несколько условий, которые могут выполнятся одновременно. И есть несколько ветвей алгоритма, которые нужно выполнить в зависимости от результатов проверок.

Для примера рассмотрим такую задачу. Мы разрабатываем веб-приложение с графическим интерфейсом, в котором можно рисовать прямоугольники. Размер прямоугольника можно менять “потянув” за край или угол. Нужно, в зависимости от положения мыши относительно прямоугольника, изменить курсор мыши так, чтобы пользователю было понятно, как можно изменить размер прямоугольника.

Читать запись полностью »

--
Этот, а также другие мои посты по it-тематике вы можете прочитать здесь

(Leave a comment)

December 24th, 2008


02:35 pm - Борьба с порно-спамом

За последние несколько месяцев поток порно-спама перешел все мыслимые и не мыслимые границы. Akismet с ним не плохо справляется, но количество комментариев так велико, что мне уже лень очищать от них очередь спама.

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

--
Этот, а также другие мои посты по it-тематике вы можете прочитать здесь

(Leave a comment)

October 22nd, 2008


11:20 am - Дополнение для firefox - печать тикетов из JIRA

Сделал небольшое дополнение для firefox, которое форматирует rss + дополнительные поля из jira в виде небольших карточек, удобных для печати.

Буду рад предложениям и замечаниям.

--
Этот, а также другие мои посты по it-тематике вы можете прочитать здесь

(Leave a comment)

October 17th, 2008


09:25 am - Задачка для собеседования программиста, 2

Задачка про базы данных, старая и не моя.

Имеется таблица, один из столбцов которой - уникальный целочисленный идентификатор. Каждый новый идентификатор получается инкрементом предыдущего значения (проще говоря - auto_increment в MySQL).

Иногда строки из этой таблицы удаляются и в последовательности идентификаторов возникает пробел. Требуется найти идентификатор, находящийся до или после первого пробела.

Небольшая иллюстрация:

| id | ...
| 1 | ...
| 2 | ...
| 3 | ...
| 5 | ...
| 7 | ...
--
Этот, а также другие мои посты по it-тематике вы можете прочитать здесь

(3 comments | Leave a comment)

October 10th, 2008


07:23 am - phpUnit 3.3.1. Что нового?

PhpUnit Вчера потратил изрядно времени на восстановление работоспособности тестов, после перехода на новую версию PHPUnit - фреймворка для написания unit-тестов на php.

Изменение, которое попортило немало крови - смена интерфейса у мок-объектов, которые генерируются классом PHPUnit_Framework_MockObject_Mock. Если раньше им можно было пользоваться для генерации моков (например во вспомогагательных классах, для упрощения создания однотипных мок-объектов), то теперь наиболее корректным способом видится использование метода getMock() у TestCase. Разработчики изменили имя метода, проверяющего корректность мока с verify() на __phpunit_verify() (видимо verify() популярное название, и может пересекаться с методом тестируемого класса), тем самым поставив ручную проверку мока вне закона.

Другое изменение, доставившое много хлопот, связанно с backup / restore глобальных переменных между тестами. Разработчики PHPUnit внесли правки, чтобы обойти баг php, связанный с десериализацией объектов. К сожалению, новый код не рассматривает возможность, что суперглобальные массивы могут содержать скалярные величины. Конечно, в реальности такого быть не должно, но в нескольких тестах, проверяющих работу с POST и GET тестовые значения были скалярными.

--
Этот, а также другие мои посты по it-тематике вы можете прочитать здесь

(Leave a comment)

September 7th, 2008


06:51 pm - Задачка для собеседования программиста

Недавно начал читать SICP (Structure and Interpretation of Computer Programs) в русском переводе. Надо сказать весьма приятная книга, заставляет шевелиться мозги, что уже само по себе полезно. Найти pdf с русским переводом sicp можно здесь, а в блоге Сергея Хенкина - обсуждение решений задач из книги и множество полезных сопутсвующих материалов.

Первые главы навели меня на мысли о простой задачке на собеседовании:

В чем разница между:


// выполняем логическую операцию
function mOr($a, $b) {
    return $a || $b;
}

mOr([Операнд1], [Операнд2])

и


// и тут тоже выполняем логическую операцию
[Операнд1] || [Операнд2];

UPD: немного поправил условие задачи

--
Этот, а также другие мои посты по it-тематике вы можете прочитать здесь

(Leave a comment)

August 14th, 2008


11:22 pm - Странная идея об отладке php-кода

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

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

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

У меня же появилась такая мысль: а почему в строке вызова дампера не указать фильтр в виде ["ИмяКласса", "ИмяМетода"]. В этом случае дампер вида vardump($myData, “MyClass”, “myMethod”) сработает только в случае, если в стеке вызовов присутствовал вызов метода myMethod класса MyClass.

Для удобства все параметры можно сделать необязательными.

28739772.f593f649324e0343eae5ab1d4bfc97b3.1219314470.c11be174e47aae771558c16571a1174f
--
Этот, а также другие мои посты по it-тематике вы можете прочитать здесь

(Leave a comment)

June 5th, 2008


12:27 am - Компоненты в системах управления задачами

Практически в каждой системе управления проектными задачами есть возможность задавать задаче компонент системы к которой она относится (во всяком случае в jira и trac точно есть :)). Недавно столкнулся с вопросом: а как правильно выбрать набор таких компонентов?

Решение, которое я сейчас использую может показаться очевидным и не оригинальным - в качестве компонентов выделяются большие куски функциональности, связанные по смыслу. Хорошим примером подобного разделения является устройство jira в Zend Framework. Как видно по ссылке - в ZF более 70 компонентов! И такое разделение на компоненты действительно удобно.

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

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

И наконец, компонентов можно сделать много! Если группа разработчиков большая, или количество задач очень велико - чем меньше “кучки”, в которые можно объединить все открытые задачи, тем проще этими задачами управлять. Представим, что у вас 300 открытых багов - если разбить систему на 20 компонентов - задач в каждом будет около 15 - их очень легко расставить по приоритетам и включать в итерацию разработки единым блоком.

--
Этот, а также другие мои посты по it-тематике вы можете прочитать здесь

(Leave a comment)

May 13th, 2008


12:48 pm - PHPUnit, code coverage report и большие проекты

PhpUnit Code coverage report - инструмент для изучения покрытия кода тестами, предоставляемый фреймворком phpUnit 3.x. phpUnit умеет предоставлять отчет в множестве форматов, таких как xml, html, и даже складывать полученные данные в БД. Таким образом эту информацию можно обрабатывать собственными силами или передавать в различные средства визуализации для построения графиков.

Инструмент, которым можно воспользоваться, что называется, из коробки - html-отчет о покрытии кода. Данные в отчете сгруппированы в дерево, повторяющее файловую систему, и рядом с каждым файлом и папкой указывается процент покрытия. Кроме цифр, показывающих процент протестированного кода, в отчете по файлу выводится полный листинг, где зеленым помечаются строки, которые вызывались в процессе выполнения теста, и красным ни разу не выполнявшиеся. Рядом с выполненными строками также указывается число вызовов. Такое представление данных черезвычайно удобно. С его помощью отлично видно, какие ветки условных операторов не выполнялись и какие дополнительные проверки можно встроить в тест.

Однако, в моем случае использование code coverage report омрачилось тем, что в процесс генерации отчета постоянно прерывался ошибкой превышения допустимой памяти. Использование свежей версии 3.3, накатывание патчей, оптимизирующих работу phpUnit с памятью проблему не решили. После трассировки с выводом memory_usage проблему удалось локализовать: при построении отчета по конкретному файлу, phpUnit генерирует html-код прямо в памяти, после чего записывает весь файл целиком, а в проекте, отчет для которого я хотел построить, оказалось несколько файлов с 5-10 тысячами строк (конфигурация, константы и пр.).

Читать запись полностью »

--
Этот, а также другие мои посты по it-тематике вы можете прочитать здесь

(3 comments | Leave a comment)

February 23rd, 2008


08:32 pm - Кое-что об организации версий при разработке ПО

Логотип JiraВ пятницу утром мой хороший знакомый прислал мне ссылку на занимательную статью The only 3 Milestones you will ever need, в которой изложена достаточно простая и, в тоже время, очень полезная идея об организации версий при agile-разработке.
«Разделите все задачи на 3 кучи:

  1. Задачи, которые нужно выполнить к текущему релизу
  2. Задачи, которые можно отложить до следующего релиза
  3. Задачи, про которые не известно, когда их следует выполнять»

В проекте, над которым я сейчас работаю, принята именно такая организация задач в JIRA. Похожим образом устроена разработка Zend Framework.
Пока команда была небольшой острой необходимости в строгом соблюдении версий не было — задачи закрывались и объединялись в релизы постфактум. Однако последняя неделя стала для меня в этом вопросе переломной. Группа качества, занимающаяся проектом, удвоилась и просто затопила разработчиков сообщениями об ошибках. Число задач на моем JIRA dashboard перевалило за 50, и не было решительно никакой возможности понять, что же нужно сделать к надвигающемуся релизу. Статья о 3х вехах пришлась как нельзя кстати. Я разбросал задачи по версиям и реорганизовал свой рабочий стол.

Читать запись полностью »

--
Этот, а также другие мои посты по it-тематике вы можете прочитать здесь

(Leave a comment)

December 3rd, 2007


01:17 am - Плюсы и минусы использования хранимых процедур и триггеров

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

Читать запись полностью »

--
Этот, а также другие мои посты по it-тематике вы можете прочитать здесь

(Leave a comment)

November 17th, 2007


03:17 am - Об управлении веб-проектами, jira vs trac

Управление проектами, project management… Наверное каждому разработчику однажды приходят такие мысли, когда за плечами горсть технологий, некоторый опыт разработки коммерческих проектов и работы в команде.

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

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

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

Читать запись полностью »

--
Этот, а также другие мои посты по it-тематике вы можете прочитать здесь

(Leave a comment)

November 7th, 2007


12:33 am - Отладка php-приложений

Одной из типовых проблем при разработке приложений на php является отладка. Существует не мало отладчиков, в том числе неплохо интегрирующихся с IDE (к примеру Zend Debug). Работая в разных компаниях, делая freelance-проекты я несколько раз пытался ими воспользоваться, и каждый раз возвращался к знакомому каждому php-разработчику способу отладки - выводу отладочной информации прямо из скрипта.

Читать запись полностью »

--
Этот, а также другие мои посты по it-тематике вы можете прочитать здесь
Tags: ,

(2 comments | Leave a comment)

November 2nd, 2007


11:00 am - Смешной тест

Хоть я и не любитель всевозможных тестов и прочих сомнительных “мерилок”, все же и я заразился, охватившей ru_php эпидемии от mamba.ru, и вот результат: 364 бала

Тест, как заметили многие участники тестирования, сильно перегружен вопросами по unix, так что скорее это тест на php-разработчика юниксоида. В целом же вопросы составлены профессионально, с минимальным количеством разночтений и все подразумевают единственный верный набор “галочек”.

--
Этот, а также другие мои посты по it-тематике вы можете прочитать здесь
Tags: , ,

(Leave a comment)

October 28th, 2007


10:05 pm - OpenGL, проблемы с GL_DEPTH_TEST
Кончается октябрь, а это значит близится середина учебного семестра и пора начинать приводить учебные дела в порядок.
В связи с этим я решил закончить работу на заданием по OpenGL и потратил полдня на дописывание небольшой программки, рисующей трехмерный объект с освещением.
Основной проблемой, вызвавшей сегодняшние затруднения стало весьма интересное поведение  библиотеки  с включенным режимом  glEnable(GL_DEPTH_TEST) и параметром  gluPerspective (fov, aspect, near, far) near = 0.0. Модель не прорисовывается, изредка моргая сквозь черноту при вращении и тому подобной перерисовке с новыми координатами.
С так плотно с OpenGL я работаю впервые, поэтому мне не совсем понятны причины. Если у кого-то есть мысли на этот счет - поделитесь, очень интересно.

(Leave a comment)

October 23rd, 2007


11:35 pm - Глеб Архангельский, "Тайм-Драйв"
Последний месяц хороший кусок дня мне приходится проводить в дороге на работу и с работы. Чтобы не расходовать время впустую и поберечь зрение решил ознакомится с русскоязычным podcast-пространством. Аудио-книги давно стали надежными спутниками в долгих поездках, но мне давно хотелось послушать что-нибудь на бизнес-тематику.

И вот, наконец у меня дошли руки, а точнее уши ознакомится с этой книгой. Ожидания, возникшие после прочтения многочисленных отзывов, оправданны на 100%. Автор доступно и просто излагает на мой взгляд интересные идеи по организации жизни и мысли о времени вообще.

Путь к успеху, излагаемый многими авторами весьма таков: поставить цели, произвести их декомпозицию до нужной детальности и вперед, к победе коммунизма светлому будущему. Мне же всегда был интересен процес именно формирования этих целей. Методы, предложенные Архангельским, кажутся мне весьма жизненными и я постараюсь применить их на практике.

Кроме этой книги могу порекомендовать подкаст "Теория управления" (по этому подкасту у меня даже где-то есть ментальная карта, если будут желающие - выложу), а также краткое аудио-изложение книги Стивена Кови "7 привычек высокоэффективных людей" (к сожалению ссылки на нее нет, при желании можно нагуглить)

(2 comments | Leave a comment)

September 15th, 2007


12:34 pm - Планирование поездок
Недавно попробовал на мой взляд интересный способ планирования времени поездок на общественном транспорте.

На входе:
время встречи и точка назначения, точка отправления, промежуточные точки (пересадки, смена транспорта и т.п.)
На выходе: "маршрутный листок" с промежуточными точками и контрольным временем
Алгоритм:
  1. Возьмем две точки - время и место встречи (A0), и точку, ближайшую к месту назначения (A1) и определим время на преодоления расстояния между ними.
  2. Вычтем из времени встречи найденный временной промежуток
  3. Повторим шаги 1 и 2 для точки (A1) и следующей ближайшей к ней точки

Tags:

(4 comments | Leave a comment)

July 26th, 2007


08:13 pm - Интеграция 1Cv8.1 c soap-сервисом на php
Требования:
  1. Простота использования 1c-программистом
  2. Возможность использования массивов структур для повышения скорости обмена за счет отправки пакетов с группами объектов
  3. (Не особо важно, т.к использовалось мной только для тестов) Корректная работа сервиса с .NET-клиентами

Tags:

(Leave a comment)

> previous 20 entries
> Go to Top
LiveJournal.com