среда, 4 мая 2011 г.

Успех! Введение в питон для женщин. [Перевод]


Вчера вечером первые в истории состоялось чрезвычайно успешное событие в мире
питона "Montreal Python event" эксклюзивно для женщин, дающее участникам 3-х
часовое введение в мир программирования.





Посетило мероприятие более 70 человек, как мужчин, так и женщин. "Правила"
участия были просты: ты женщина и если нет, то ты должен быть приглашён.
Пришедшие на мероприятие были разными: от тех кто не написал ни строчки кода, до
тех кто был знаком с программированием; из разных слоев общества и языков.

Класс обучала Janina Szkut в то время как помощники из общины Монтреаля по
программированию помогали участникам с установкой Питона на ноутбуки и помогали
решать проблемы в ходе выполнения упражнений.

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

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

В конце энтузиазм участников был на пике; кто уже программировал был
вдохновлён элигантностью и простотой Питона, а те кто делает первые шаги был
заинтригован новым миром возможностей. И конечно по традиции "Montréal Python"
мы все вместе завершили вечер выпивкой местного винокурнного завода, сетевыми
посиделками, разговорами и вдохновляли друг друга в продолжении изучения
сложного мира программирования.

Оригинал http://montrealpython.org/2011/05/a-success-introduction-to-python-for-women/trackback/

ЗЫ. интересно у нас в России кто-нибудь устраивал подобное мероприятие для женщин?

понедельник, 25 апреля 2011 г.

Snapshot опыта


  1. использовать django fixtures в формате yaml одно удовольствие, можно вставить свой тег, который вернёт определённый результат. Например:
    ### Image
    
    -
        model: shop.image
        pk: 1
        fields:
            src: static/shop/test/product/borsh.jpg
            description: Наваристый супец!
            content_type: !!python/object/apply:resty.utils.content_type_pk [shop, product]
            object_id: 1
    
    
    нужно передать первичный ключ объекта ContentType для модели Product, для этого применяем свой тег (
    content_type: !!python/object/apply:resty.utils.content_type_pk [shop, product]
    ), который вызывает простую функцию:
    def content_type_pk(app_label, model):
        return ContentType.objects.get(app_label=app_label, model=model).pk
    
    попробуйте сделать такое в json или xml не получится =)
  2. IE7 (ужасный и бессмертный для некоторых юзеров) коверкает форму и посылает данные в формате multipart/form-data хотя по умолчанию должны придти данные в формате application/x-www-form-urlencoded для фикса данного бага написал javascript код, который прописывает атрибут enctype="application/x-www-form-urlencoded" в каждую форму, где нет данного атрибута.
  3. Postgresql при сортировке значение null (None) ставит выше чем числовое значение, а Sqlite приравнивает значение null к нулю. Поэтому приходится исключать строки с полями значения которых равны null  в выборке данных, по которым будет происходить сортировка.
  4. Используйте lesscss для упрощения и облегчения своего труда при верстке страниц! По синтаксису lesscss понравился больше, чем sass\scss.

пятница, 19 ноября 2010 г.

Safy - расширение для Google Chrome

Safy - это расширение для Google Chrome, которое открывает ссылки в iframe-песочнице, тем самым предотвращает запуск javascript и плагинов. Т.е. получается безопасный серфинг, без баннеров, всплывающих окон, флеша и других плагинов. Пользуйтесь на здоровье! :)

понедельник, 4 октября 2010 г.

swap мыслей или обо всём понемногу

Давно ничего не писал, нарушаю молчание. Очень трудно начать писать заметку, вроде есть о чём сказать, но начать писать трудно. Ну, ладно сразу о главном. Продолжаю поддерживать проект pylibcurl исправил баги, которые возникали в 64 битной версии ОС Ubuntu на тестах программа просто падала, выдавая в конце неприятную ошибку "Segmentation fault". А происходило это из-за того, что было неправильное обращение к указателю. В 32-битной ОС можно было обращаться к указателю таким образом:

curl_easy_init.restype = ctypes.c_void_p
и всё происходило без ошибок, а 64-битной версии данная конструкция не прокатывала, а нужно делать так:

curl_easy_init.restype = ctypes.POINTER(ctypes.c_void_p)

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

Недавно завел себе аккаунт на github и сделал форк django-native-tags, очень удобная библиотека для написания тегов, хотя и не без багов, которые я у себя профиксил и выложил в свой репозиторий.

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

четверг, 1 апреля 2010 г.

Ищу удаленную работу

Пишу на python, javascript
использую фреймворки django, jquery

по вопросам сотрудничества пишите devex.soft@gmail.com

четверг, 11 февраля 2010 г.

Python sax парсинг, осторожно грабли!

Столкнулся с такой проблемой использую SAX парсер для парсинга XHTML файла и прикаждом вызове функции xml.sax.parse скрипт подвисает на несколько секунд. В начале думал что файл слишком тяжёлый для парсинга, посмотрел загрузку процессора, процессор не грузится! Забил, через несколько дней сижу с вырубленым интернетом, запускаю скрипт и вот тут выскакивает ошибка мол время соединения истекло т.е. таймаут!!! И ошибка указывает на строку 298


f = urllib.urlopen(source.getSystemId())
модуля saxutils. Вот тут я выпал в осадок :))))

Оказалось что в XHTML файле есть доктип:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">


и каждый раз при парсинге скрипт рубится в интернет!!!
Погуглив, решения не нашёл как это дело закешировать, не стал рефакторить фукцию prepare_input_source, которая как раз отвечает за выборку доктипа, а просто регепсом
_pat_dtd = re.compile(r'<!doctype [^>]+>' re.I)
убиваю доктип и парсю через parseString, всё!

суббота, 31 октября 2009 г.

Допиливаем "красивую композицию"

Недавно наткнулся на заметку Красивая композиция от Александра Кошелева (репка) всё было замечательно до момента, когда есть зависимая модель, но определена она ниже по коду. То тут возникает трудность пока модель не подхвачена джангой к модели нельзя подключить обработчик/триггер. Собственно, я немного покопавшись в коде написал небольшой хак, который устраняет данную проблему:
  1. так как указать модель можно sender_model='app_label.Model', то при поиске данной модели функция models.get_model вернет None, т.к. модель не была найдена.
  2. для устранения проблемы нужно все триггеры, которые не нашли модель для подключения внести в список ожидания.
  3. а для того чтобы присоединить ожидающие триггеры нужно подключится к сигналу class_prepared и ждать когда искомая модель будет найдена.
выкладываю код для trigger.py:


from django.db import models
from django.db.models.signals import class_prepared
from django.utils.itercompat import is_iterable

_wait_triggers = []

def _connect_trigger(sender, **kwargs):
connected = []
for trigger in _wait_triggers:
model = models.get_model(*trigger.sender_model.split('.', 1))
if model:
trigger.sender = model
trigger.sender_model = model
trigger.wait_connect = False
trigger.connect()
connected.append(trigger)

for trigger in connected:
_wait_triggers.remove(trigger)

class_prepared.connect(_connect_trigger)

class Trigger(object):
def __init__(self, do, on, field_name, sender, sender_model, commit,\
field_holder_getter):
self.freeze = False
self.field_name = field_name
self.commit = commit
self.wait_connect = False

if sender_model and not sender:
if isinstance(sender_model, basestring):
model = models.get_model(*sender_model.split(".", 1))

if model is None:
self.wait_connect = True
_wait_triggers.append(self)
else:
sender = sender_model = model

self.sender = sender
self.sender_model = sender_model
else:
self.sender = sender
self.sender_model = sender_model

if not do:
raise ValueError("`do` action not defined for trigger")
self.do = do

if not is_iterable(on):
on = [on]
self.on = on

self.field_holder_getter = field_holder_getter

def connect(self):
"""
Connects trigger's handler to all of its signals
"""
if not self.wait_connect:
for signal in self.on:
signal.connect(self.handler, sender=self.sender)

def handler(self, signal, instance=None, **kwargs):
"""
Signal handler
"""
if self.freeze:
return

objects = self.field_holder_getter(instance)
if not is_iterable(objects):
objects = [objects]

for obj in objects:
setattr(obj, self.field_name, self.do(obj, instance, signal))

if self.commit:
obj.save()