Архив

Архив раздела ‘Программирование’

Python: Как сделать progress-bar в консоле?

11 сентября 2013 2 комментария

Давненько у меня возникал вопрос как сделаны прогресс-бары в консольных приложениях и как сделать нечто подобное самому. Но, вопрос никогда не стоял серъёзно, поэтому, максимум - я просто выводил проценты прогресса без каких-либо баров.

Читать далее...

MySQL: Как проверить целостность внешних ключей в InnoDB.

Для ускорения вставки большого объёма данных в InnoDB одна из рекомендаций - отключить проверку целостности ключей. Более того, это ещё позволит и решить проблему с порядком вставки этих данных: если ваша сущность имеет ссылку на какую-либо другую сущность, которая ещё не была создана, то вы имеете все шансы словить ошибку foerign-key constraint'ов, выглядит это примерно так:

Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (`foreign_key_0022`.`table`, CONSTRAINT `item_id` FOREIGN KEY (`item_id`) REFERENCES `child_table` (`item_id`))

Читать далее...

Ghost.py: Реализация sleep с обработкой событий.

Вообще мне Ghost.py не очень пока нравится. Судя по его версии (у меня Ghost.py 0.1b2) - достаточно сырой продукт. Нет некоторыз полезных shortcut'ов, некоторые фичи работают не очень хорошо (например, click - генерирует только JS-событие click, а для ExtJS надо бы mouseDown, для полной эмуляции клика мышкой - ещё и mouseUp). Называть пакет ghost и добавлять в него модуль ghost - тоже не лучшая идея, на мой взгляд (ну их, эти name collisions). Нет функции sleep, может это и плохо использовать именно sleep, но иногда так гораздо удобней, а в случае, если это будет работать плохо, - можно и переделать.

Читать далее...

Django: Не проходит аутентификация в LiveServerTestCase.

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

Читать далее...

HTTP: Список кодов ответов и их описание.

27 апреля 2013 Нет комментариев

Код состояния ответа на HTTP запрос содержится в его заголовке и информирует о результате запрошенного действия и о том, что клиент должен предпринять далее. Возможно, не все знают как выглядит заголовок ответа сервера, но наверняка каждый, кто пользуется интернетом, встречался со страницей 404 Not Found или 403 Forbidden. Впрочем, далеко не обязательно, что эти страницы имеют соответствующий HTTP заголовок, но, если строго следовать стандартам, - должны.

Читать далее...

WordPress: На пути к валидному html5 или как пофиксить «rel=”category tag”» у тегов.

15 апреля 2013 Нет комментариев

Решил подчистить ошибки в html-коде этого бложика. Половина ошибок ушла с помощью перехода с XHTML на html5, но, как обычно это бывает, появилось и кое-что новое. Так, ссылки на теги имеют атрибут:

rel="category tag"

Который заботливо генерит WordPress и который не является валидным для html5.

Читать далее...

Django: Решение проблемы с кириллицей при использовании slugify.

14 апреля 2013 1 комментарий

Далее следует более-менее подробное описание проблемы и фикса. Если о проблеме вы в курсе и вас интересует только решение - смело листайте в конец поста.

TL/DR;

В django есть функция для генерации т.н. slug'ов. Перевести одним словом этот термин достаточно сложно, но, кто имеет хоть какой-то опыт работы с django должен знать что это такое. Если раскрыть суть - часть ЧПУ (человеко-понятного URL), которая относится к заголовку сущности. Например, slug для этого поста в терминах django было бы таким: "django-fix-non-latin-slugify" (если я не поменял URL записи после написания этих строк).

Читать далее...

Flask: Создание root-пользователя в flask-security и установка хешированного пароля.

10 апреля 2013 Нет комментариев

Вкратце:
Flask - micro web framework. По сути, тонкая обёртка вокруг wsgi-сервера werkzeug.

Flask-Security - расширение (extension) для flask, которое реализует возможность аутентификации и авторизации ("входа на сайт", другими словами - логина), регистрации пользователей. Flask-Security сам по себе использует другие сторонние расширения для реализации нужного функционала (например: flask-login для логина, flask-wtf для обработки форм).

Задача: во время инициализации БД создать пользователя с паролем. Примерно как это делает Django при первом syncdb с подключенным приложением django.contrib.auth.

Читать далее...

Python: Объяснение работы yield, итераторов и генераторов.

9 апреля 2013 8 комментариев

Основной источник для этого поста - вопросы и ответы на stackoverflow.

Для понимания что делает "yield", вы должны понимать что такое генераторы. Для понимания что такое генераторы - должны знать об итераторах и итерируемых объектах.

Читать далее...

Python: Виртуальное окружение для разработки с помощью virtualenv.

15 марта 2013 2 комментария

Для Python существует отличный инструмент - virtualenv. Если вы являетесь разработчиком, то для вас он должен быть незаменимым. Как вы могли догадаться, он создаёт виртуальное окружения для Python’а. Наверное, вы сталкивались с проблемой когда разные проекты используют разный набор пакетов, но это ещё пол беды, всё гораздо хуже, когда эти множества пересекаются, но требуются разные версии одних и тех же пакетов, которые, к тому же, не полностью совместимы друг с другом. Virtualenv позволяет решить эту проблему достаточно легко. Читать далее...

Три вещи, которые вы никогда не должны хранить в БД.

Данная статья является переводом другой, в целом, лично я согласен с автором и некоторые советы были бы полезны для меня в своё время. Стоит заметить, что под базами данных тут имеются ввиду реляционные базы данных, если не оговорено другое. Ссылка на оригинал в конце.

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

Django: Настраиваем STATIC_ROOT, STATICFILES_DIRS и MEDIA_ROOT правильно.

5 марта 2013 4 комментария

Для начала определимся с разницей между статикой и медиа-файлами в терминах Django. Первое - это все ваши файлы, которые вы сами создавали: css-стили, js-скрипты, картинки для дизайна и т.п. Медиа-файлы - всё, что загружает пользователь на ваш сервер (автарки, фотки), т.е. пользовательский контент. С пользовательским контентом всё более-менее просто и поэтому мы рассмотрим настройку только в конце поста. Читать далее...