Архив за [undefined]

Вначале надо всех переучить

Прежде чем "всё переписать", надо рассказать людям - а что это вообще такое! Многие не понимают ни как правильно писать в асинхронном стиле, а вообще всей этой парадигмы.

Уже достаточно давно мой способ знакомства с новой технологией это подписка на список рассылки и внимательное изучение вопросов, ответов и вообще общего духа сообщества. Так случилось что на рассылку node.js я подписался до знаменитого поста Саймона и смог увидеть резко возросший интерес к теме.

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

Люди не понимают сути. Совсем. Причем им как бы интересна технология. Встает вопрос почему? Да модно просто. Такое происходит уже не в первой рассылке которую я наблюдаю. Так же было с CouchDB например.

Кстати, что я заметил -- эти люди в основном пишут на... ruby. Ну не важно:-)

Не понимают они, что новые технологии это не только модный buzzword но и ещё ...

NoSQL: No SQL! No!

Слабаки! Слабаки, всё-таки, авторы термина NoSQL -- Eric Evans и Johan Oskarsson.

Ну зачем теперь всеми миру говорить что NoSQL это "Not Only SQL". Ну все же понимают, что изначально это было "No SQL". Да, это многим не нравится, это многих раздражает и даже пугает негативностью посыла. SQL - символ старого подхода, это и концепция, и конкретные реализации, и "L" как таковой.

Так в этом же и суть. Если вы хотите сделать мир лучше и продвинуть индустрию, нельзя быть мягким и угодить всем. Конечно реляционные базы хороши там где хороши, а нереляционные плохи там где плохи. Но надо обратить на себя внимание и заявить свою позицию всему миру, а значит надо быть плохим, лезть на рожен и многих раздражать. Надо говорить, что всё остальное хуже и только вы знаете путь к свету. Согласитесь, что это работает.

Так что я говорю - No SQL!

Год второй

365 дней → 27 постов → 265 комментариев.

Спасибо вам!

Бойтесь lxml, html парсящий

Недавно на форуме случился топик посвященный извечной проблеме всех питонистов -- кодировкам. Человек жаловался на то, что у него в программе получаются строчки вида:

u'\xd0\x9a\xd1\x83\xd1\x80\xd1\x83\xd0\xbc\xd0\xbe\xd1\x87'

Вы заметили что что-то не так? И я вот. Строчки как бы уникодные, но внутри них закодированные utf-8 байты. Что-то pдесь не так. Разбираясь дальше и потребовав скрипт, которые такое генерирует, становится понятно, что данные берутся из веба. Вполне обычным способом через urllib и потом скармливаются в lxml.html для разбора. Поскольку urllib оперирует только байтовыми строками, то он не мог их так превратить в уникод, а значит во всем виноват lxml.

Вообще lxml очень крутая библиотека - и быстрая, и функциональная, и умеет мимикрировать интерфейсом под ElementTree, и взаимодействовать с BeatifulSoup. Она давно уже пользуется популярностью у питонистов, когда надо как-то удобно работать с xml.

Но тут немного другой случай. Тут используется парсер html. И именно в нем происходят эти неприятные метаморфозы со строками.

Я решил понять в чем же всё-таки и дело и как побороть такое поведение.

Для начала, я сходил на http://yandex.ru/ и посмотрел что за html там отдается. Кодировка контента utf8. Сразу что бросилось в глаза -- это ...

Гринлеты

Примерно год назад, во время массовой истерии по поводу питонячих и не очень асинхронных серверов, я, пытаясь составить своё мнение обо всем об этом, набрел на интересную библиотеку - greenlet. На которой базируется сетевая библиотека eventlet, а на ней всю очередь WSGI веб-сервер spawning.

Как видно из названия, она позволяет делать легкие треды - гринлеты в обычном не stackless питоне. Я написал небольшой скрипт "на попробовать":

#!/usr/bin/env python
from greenlet import greenlet

def dispatch():
   while True:
       for w in workers:
           w.switch()
           print 'dispatch'

       if not all(workers):
           break

d = greenlet(dispatch)

def worker(name):
   for i in range(5):
      print name, i
      if i % 2 == 0:
         print 'switch'
         d.switch()

workers = [
   greenlet(lambda: worker('foo')),
   greenlet(lambda: worker('bar'))
]

print 'start'

d.switch()

print 'done'

вывод:

start
foo 0
switch
dispatch
bar 0
switch
dispatch
foo 1
foo 2
switch
dispatch
bar 1
bar 2
switch
dispatch
foo 3
foo 4
switch
dispatch 
bar 3
bar 4
switch
dispatch
done

и вот недавно набрел на него. Правда прекрасно? Такой простор для творчества - передача контекста выполнения в произвольное место с сохранением состояния. Некий намек на потусторонний call/cc из "других" языков.

Ещё тогда у меня родилась идея где это можно ...