21 дек. 2013 г.

Пушной - Идите нахер! Я вас не знаю! (Официальная версия) (+плейлист)

Хочется согласится с Пушным, но получается, что лучше жить по отрицаемой им модели ;)

24 нояб. 2013 г.

.hgrc



Используем в новом большом проекте Jenkins. Он очень хорош, для того чтобы дать тебе вовремя понять, что ты спорол какую-то чушь, и теперь тесты закосячены, а сними и код. Но как быть, если самодисциплины не всегда хватает на выполнение тестов перед коммитом и проверку кода на соответствие стандартам? Хуки! Мы используем mercurial, для него уже есть https://pypi.python.org/pypi/hghooks/.
[hooks]
pretxncommit.pep8 = python:hghooks.code.pep8hook
pretxncommit.pyflakes = python:hghooks.code.pyflakeshook
pretxncommit.pdb = python:hghooks.code.pdbhook
pretxncommit.jslint = python:hghooks.code.jslinthook

[hghooks]
strict_checking = true

[pep8]
ignore = E501
Осталось написать собственный хук, который будет откатывать коммиты с запоротыми тестами.
UPD:
preoutgoing.confirm = hg summary; read -p 'Are you sure you want to push to remote? (y/n): '; echo $REPLY | grep -q 'y'

13 нояб. 2013 г.

Разработчики Python VS Django

Во многих компаниях давно использующих python недолюбливают django. Раньше мне было не вполне понятно почему. Я считал это снобизмом. Теперь уверился, что джуниоры, начинающие свой практический путь с использования только фреймворков теряют потенцию искать решение самостоятельно. Первое, что они делают, когда сталкиваются с проблемой - гуглят готовое решение или желательно сразу батарейку. Если удалось найти решение сразу на стэковерфлоу - это победа. Скорей всего, люди писавшие ответ уже подумали, а значит нам думать и вовсе не нужно.Если ошибочное мнение повторено еще и в чьем-нибудь бложике, так вообще здорово. Ты на верном пути, будущий Лайнус Торвальдс. Проблемы начинаются потом. Решение нужно масштабировать/поддерживать/развивать, а понимания того, как оно работает нет.

Порой доходит до совсем смешного. Предположим некое API, в одном из методов принимает два POST параметра, для которых по сути не нужны ни валидаторы диапазона, ни проверка ввода. Как это правильно делать с точки зрения Django? Надо написать форму!

class DjangoForm(forms.Form):
    param1 = forms.CharField(required=False)
    param2 = forms.CharField(required=False)


def testFormView(request):
    form = DjangoForm(request.POST)
    if form.is_valid():
        param1 = form.cleaned_data['param1']
        param2 = form.cleaned_data['param2'] 

Но в рамках того же проекта на django можно просто обработать POST-параметры:
def testPOSTView(request):
    if request.method == 'POST':
        param1 = request.POST.get('param1')
        param2 = request.POST.get('param2') 

Возьмем для простоты улучшенный RequestFactory из https://djangosnippets.org/snippets/2231/ и напишем простяцкий тест:
request = RequestFactory().post('/submit/', {'param1': 'value1', 'param2': 'value2'})


def timeit(func, times):
    start = time.time()
    for i in range(0, times):
        func(request)
    return time.time() - start


def main():
    print timeit(testFormView, 10000)
    print timeit(testPOSTView, 10000)

Результат этого теста 1.77991509438 против 0.0828511714935.

13 окт. 2013 г.

5ый день, полет нормальный.

Anews открыт для регистраций с 8.10.2013. Пока не падал - uptime 100%. Число регистраций неуклонно растет. Хочется написать: "мы строили, строили и наконец построили", но, на самом деле, это только начало. Дальше задач, идеи и интересных решений будет все больше.

15 сент. 2013 г.

Postgresql на ubuntu серверах

Ubuntu хороша тем, что её можно просто взять и начать использовать. Однако, в последних версиях Postgresql сервера есть то, чего нет в отстающей версии из репозитория ubuntu. У меня есть такой опыт с repmgr, которого нет в собранном виде в репозиториях по-умолчанию. Repmgr можно собирать и для версии 9.1, но для версии 9.2 есть уже собранный пакет Собственно, решение - никакая не сакральная тайна, оно описано на сайта postgresql http://www.postgresql.org/download/linux/ubuntu/.
Все что нужно, это создать конфиг /etc/apt/sources.list.d/pgdg.list со строкой (возьмите по ссылке, с вашей версией ubuntu):
deb http://apt.postgresql.org/pub/repos/apt/ YOUR_UBUNTU_VERSION_HERE-pgdg main
Добавить сигнатуру для этого репозитория:
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | \
  sudo apt-key add -
sudo apt-get update
Теперь можно установить 9.2 версию postgresql сервера и repmgr.

apt-get install postgresql-9.2 postgresql-server-dev-9.2 postgresql-9.2-repmgr

22 мая 2013 г.

А вы ассоциируете себя со своей работой?

Вот я, например, - сын, брат, муж, отец, работник, начальник, фрилансер, лентяй, водитель, эмигрант. Впереди у меня еще много разных слов. Путешественник, предприниматель, дедушка…
Мы все себя не осознаем ("О сын, ты такой большой уже? Я и не замечал…"). Осознавать - значит понимать кто ты есть, а это можно определить только с помощью вот такого набора слов, которые указывают направление, в лучшем случае, но конечно не раскрывают суть. Значит, осознавать себя - понимать куда ты идешь? Довольно странно отправится куда-нибудь в дальний путь, не понимая при этом, куда именно ты идешь. Однако, мы все так делаем.
Человек идущий по жизни - самый странный путник. Этот путник, например, проходя мимо чужих домов и заглядывая в окна может решить пойти в совсем другом направлении. Причем, он может даже осознавать при этом, что конечная точка его маршрута находится в десятках лет пути…
Мне кажется, что завтрашний я - это совсем другой человек. У этого человека найдется много времени на воспитание детей, любовь, работу, самосовершенствование, переезд, путешествия, предпринимательство. Но правда в том, что завтра на месте меня, в моем теле, буду снова я. Такой же. И так каждый день. Я могу сколь угодно долго верить в чудо, и думать, что завтра все получится. Но ресурс времени и мои собственные ресурсы ограничены. Нужно выбирать. Непременно нужно.
А вы ассоциируете себя со своей работой? Я - да. Просто, если нет, то на кой черт вам сдалась такая работа?

10 мая 2013 г.

Eugene Grachev: Ставим все основные dev пакеты для python

Eugene Grachev: Ставим все основные dev пакеты для python: Все время приходится искать название этих пакетов, напишем их раз и навсегда: sudo apt-get --yes install build-essential libpng-dev libjp...

markeyev.ru

Мой Омский однофамилец протерял домен markeyev.ru, на котором он продавал межкомнатные двери, несколько месяец назад. Я не упустил возможности воспользоваться его оплошностью и перекупил домен. Мой новый блог: http://markeyev.ru/.

Заходите, будет интересно!

28 мар. 2013 г.

6-го декабря 2012 года без объявления войны...

Google отменил бесплатные подписки на почту для своего домена (Google Apps for your domain). Как было хорошо и удобно. Теперь всё.
Хак позволяющий обойти это новшество (cам не пробовал).
Есть мнение, что таким образом Google собирает деньги на гугло-очки ).

Сваки месеца

Каждый месяц я забываю заплатить за...

  1. Интернет telenor'у 30 евро до 20го числа. И каждый месяц мне отключают Интернет, а я удивляюсь этому, как Собянин снегу.
  2. Логолу за vps и vps в облаке (да-да, у них есть свой скалакси).
В этом месяце еще порадовал ВТБ24. Оплата по кредиту производится с "текущего рублевого счета", но текущий рублевый счет в телебанке и текущий рублевый счет клиента вообще - это, как говорят у нас в Одессе, две большие разницы. Счет кредита вообще не доступен в телебанке без дополнительного заявления (о, как! А все остальные счета доступны без заявления. Где логика?). Заплатил как обяснили, и еще и должен остался пени за просрочку платежа. Потом конечно разобрались, но осадок остался ).
Сижу жду Интернета с Интернетом суши-бара Wasabi в Баре.

20 февр. 2013 г.

Бизнес по-русски. Видео-реклама в метро иногда не работает.

Москвичи частенько видят такую картинку на мониторах станций метро.

В один из дней я наблюдал эту картинку несколько раз в течении нескольких часов подряд.
Каково же было мое удивление, когда я узнал стоимость размещения этой рекламы. В соответствии с прайсом на странице http://www.new-tone.ru/transit/services/moscow/metro/, день размещения рекламы стоит 500000 рублей. Это за 10 минут в блоке в день.
На этом фоне рекламные бюджеты в Интернет выглядят приятной мелочью.
Сколько интересно стоит день простоя такого рекламного щита для рекламного агентства "Нью-тон"? Или выплачиваются ли какие-либо компенсации за простой рекламодателям? Думаю, нет. Хоть площадку и видят миллионы людей, ежедневно пользующихся услугами метрополитена, настучать рекламодателям некому...

7 февр. 2013 г.

Лучше поздно, чем никогда - redis и python!

Redis — документо-ориентированное сетевое журналируемое хранилище данных типа «ключ-значение» с открытым исходным кодом.
Python обертку над командной консолью redis лучше познавать по исходным кодам (спасибо, кэп! :) ), иначе вы рискуете так и не узнать, что можно запросто журналировать данные на диск по требованию, а не по рекгламенту.

# coding: utf-8

import redis


r = redis.StrictRedis(host='localhost', port=6379, db=0)

r.set('key', 'val')
r.bgsave()


bgsave() - это сохранение в фоне, можно и просто save().

Обертка транслирует метод в комманду: BGSAVE и SAVE соответственно.
Методом lastsave() можно уточнить дату и время последнего сохранения.

Советую прочесть http://codemehanika.org/blog/2011-07-15-redis-types-usage.html. Надеюсь в комментариях вы, дорогие читатели, посоветуете мне еще что-нибудь?

28 янв. 2013 г.

Генерируем QR код в python

В посте не будет описания алгоритмов генерации QR-кодов. Это муторно и не интеренсо. В конце концов, вам скорее всего нужно просто один раз сгенерировать код для сайта или визитки. Но если вам всеже очень интересно, как это делается, читайте по ссылкам из kcoding.net.
Конечно, можно воспользоваться Google Charts:
<img src="https://chart.googleapis.com/chart?chs=250x250&amp;cht=qr&amp;chl=кодируемаяфраза&amp;choe=UTF-8">
Вместо "кодируемаяфраза" вы можете подставить свой кодируемый текст или ссылку.
Однако, в pypi есть библиотека qrcode, с помощью которой можно сгенерировать QR код картинку у себя на сервере. Google в большинстве случае проще, но во втором подходе можно "зашить" в QR код например логин с паролем, которые будут сгенерированы под браузерную суссию и "прочитаны" на телефоне, например. По сети будет минимум хождения приватных данных, так что вариант безусловно полезный.

1. Ставим билиотеку себе:
easy_install qrcode
# OR 
pip install qrcode
Еще нам понадобится PIL:
easy_install PIL
# OR
pip install PIL
Код генерации файла с QR кодом может выглядеть например так:
# coding: utf-8

import qrcode


qr = qrcode.QRCode(
    version=1,
    error_correction=qrcode.constants.ERROR_CORRECT_L,
    box_size=10,
    border=4,
)
qr.add_data('http://adinch.com')
qr.make(fit=True)

img = qr.make_image()
img.save('qr.png')

22 янв. 2013 г.

Костюм АйТишнику

Знакомые друзей открыли магазин мужских костюмов http://www.fe-style.ru/. Тема эта - новая и полезная. Я вам скажу, очень удобно сидя у себя в офисе, дождаться курьера, отдать ему 300 рублей, и примерить десяток размеров понравившеся тебе товарной позиции или позиций.
На вроде, выбрал себе костюм тройку, сорочку и плащ. Сделал заказ через интернет, померял все по приезду курьера, и профит. Необходимость ходить по магазином с грустным лицом отпадает. И это хоршо! Ту-бу-ду-ба-ду-ба-дууум!