• 03Jul

    Как поменять местами ключи и значения в дикте?

    1. d = {1:2,3:4,5:6}
    2. dict(zip(d.values(),d.keys()))
    Share and Enjoy:
    • Facebook
    • LinkedIn
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]
  • 01Jul

    при создании нового джанго проекта я всегда выделяю две папки apps – для моих апов и compat – для сторонних апов, к разработки которых я не имею никакого отношения. Идея в том, что эти апы всегда остаются неприкосновенными для меня, и единственной точкой расширения остаются сеттингсы и возможно доп параметры, при инклюде урлов.

    А представьте, что вы создаете апу с именем catalog, ее вы потом хотите выложить в общее пользования, и необходимо для нее сделать больше точек расширения. Структура такого апа может быть

    • catalog
      • urls.py
      • views.py
      • models.py
      • settings.py
      • tests.py

    для 4 первых файлов можно просто вконце файла добавить строку, которая станет универсальной точкой расширения. Например для views.py

    1. try:
    2.     from ex_catalog.views import *
    3. except ImportError:
    4.     pass

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

    А теперь главный вопрос этого поста. Почему так не делают?

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , , ,

  • 22Jun


    Чем меньше рутины мы привносим в свою работу, тем больше она может приносить удовольствия.

    Сегодня я расскажу про автоматизированный деплойтинг в python. Это значит одной командой я могу залить на все продакшен сервера файлы, обновить на нем необходимые компоненты и перегрузить веб сервер, и наблюдать за этим откинувшись на кресле и попивать кофеек.

    Я Вам расскажу про Fabric(На момент написания статьи 0.9.1 — бала последняя стабильная версия), наиболее подходящий для этого инструмент, который делает все описанное и даже больше через ssh.

    Про установку рассказывать особо нечего, pip отлично справляется с этим.

    В корень своего проекта я кладу fabfile.py, в этом файле и будут храниться все процедуры для работы с Fabric. Ниже приведу небольшой пример скрипта, который будет архивировать наш проект, заливать его на сервер и там разархивировать.

    1. from fabric.api import *
    2. env.hosts = ['oduvan@lyabah.com']
    3.  
    4. def deploy():
    5.     local('tar czf /tmp/my_project.tgz .')
    6.     put('/tmp/my_project.tgz', '/tmp/')
    7.     with cd('/home/oduvan/www/test_fab/'):
    8.         run('tar xzf /tmp/my_project.tgz')

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

    1. $ fab deploy
    2. [localhost] run: tar czf /tmp/my_project.tgz .
    3. Password for oduvan@lyabah.com:
    4. [oduvan@lyabah.com] put: /tmp/my_project.tgz -> /tmp/my_project.tgz
    5. [oduvan@lyabah.com] run: tar xzf /tmp/my_project.tgz
    6. [oduvan@lyabah.com] err: tar: ./fabfile.pyc: time stamp 2010-06-21 10:03:41 is 4.461083597 s in the future
    7. [oduvan@lyabah.com] err: tar: .: time stamp 2010-06-21 10:03:41 is 4.460804762 s in the future
    8.  
    9. Done.
    10. Disconnecting from lyabah.com… done.

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

    Кому лень вводить пароли могу добавить после второй сроки
    env.password = ‘oh_its_my_real_password’

    либо сгенерить себе файл с ссш ключом и путь к нему положить в
    env.key_filename — в отличие и пароля тут может быть передан массив ключей

    Но и этот код можно сократить. У Fabric есть contrib libs, одна из них project. Тут подробно каждую я описывать не буду, просто покажу пример с одной из них, дабы просто показать, что они есть

    1. from fabric.api import *
    2. from fabric.contrib.project import rsync_project
    3. env.hosts = ['oduvan@lyabah.com']
    4.  
    5. def deploy():
    6.     local('python manage.py test', capture=False)
    7.     rsync_project('/home/oduvan/www/test_fab/','.')

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

    Вот основные команды, которые Вам необходимо знать, чтоб свободно пользоваться Fabric

    put — копировать файл с локальной машины на удаленную. Доп параметр mode — устанавливает права на файл, см chmod
    get — копировать файл с удаленной на локальную
    local — выполнить команду на локальной машине. Доп параметр capture — скрывать выходные данные, по умолчанию False
    run — выполнить команду на удаленной машине
    sudo — выполнить команду на удаленной машине через судо. Доп параметр user — указываем имя пользователя, под которым необходимо запустить команду

    Обратите внимание, что у нас есть команда sudo, а значит при необходимости, мы можем и сервак зарелоадить и вообще сделать любые админ вещи, главное, чтоб пользователь был в судоерсах.

    Для деплойтинга на несколько серверов, причем различной конфигурации, и роли – у Fabric тоже кое-что припасено.

    1. from fabric.api import *
    2. from fabric.contrib.project import rsync_project
    3. env.roledefs =  {'web':['oduvan@lyabah.com','oduvan@dev.lyabah.com'],
    4.         'db':['oduvan@db1.lyabah.com','oduvan@db2.lyabah.com'],
    5.         'media':['oduvan@media@lyabah.com'],
    6.         }
    7.  
    8. @roles('web')
    9. def deploy():
    10.     rsync_project('/home/oduvan/www/test_fab/','.')

    в этом примере заливка файлов будет идти сразу на 2 вебовых сервака. Как видите вы можете запланировать у себя роли отдельных серверов под БД, под медиа файл и т.д.

    кроме как декоратаром роль можно указывать и при запуске процедуры

    1. $ fab deploy -R web

    Иногда в момент или во время запуска необходимо передать данные скрипту.

    В момент запуска это делается через аргументы самой функции

    к примеру если у вас

    1. def deploy(arg1,arg2):
    2.     pass

    то эти 2 аргумента можно передать как

    1. $fab deploy:'HI','HO'
    2. $ fab deploy:'HI',arg2='HO'
    3. $ fab deploy:arg1='HI',arg2='HO'

    Либо спросить что-то во время работы функции у пользователя функцией
    prompt(text, key=None, default=”, validate=None)

    Задает вопрос пользователю с текстом text, если пользователь не вводит данные, то возвращает значение из default, предварительно отчищая его функцией validate, и возвращает как результат этой функции, если не передан key, иначе кладет значение в env[key]

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

    bounce_wsgi_procs — зарелоадить wsgi через touch в него
    deploy_media — загружаем только медиа файлы
    migrate — запускаем скрипт миграции через South
    update_repositories – обновляем репозитарии
    update_dependencies — устанавливаем зависимости
    reload_nginx — перегружаем nginx
    deploy — полная установка, последовательный запуск всех этих функций.

    Подводя итоги могу сказать, что Fabric должна стать musthave tool в разработке.

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , , , ,

  • 04Jun

    Сложные выборки. Например, какая-то страница результатов. Там где много-много фильтров, + еще какие-то сортировки появились + все это надо прогнать через пейджирование. Выглядит страшно, но тем не менее задача банальная. Меня в этой задаче больше всего расстраивает шаманство с урлами. Ведь по факту Вам все эти параметры выборки надо уместить в урл, и каждой функции, например, смены страницы или смены направления сортировки — надо переформировать ссылку.

    Через несколько минут у меня появился тег, который как всегда выношу на Ваш суд. Перед просмотром исходников, покажу, как он работает:

    1. <html>
    2.     {% load djoutils_tags_url %}
    3.     <head></head>
    4.     <body>
    5.         <div > Ordering:
    6.         <a href="?{% urlupget request.GET order="name",up=1%}">Name UP</a>
    7.         <a href="?{% urlupget request.GET order="name",up=0%}">Name Down</a>
    8.  
    9.         <a href="?{% urlupget order="lastname",up=1%}">Last Name UP</a>
    10.         <a href="?{% urlupget order="lastname",up=0%}">Lase Name  Down</a>
    11.     </div>
    12.     <div>
    13.         Paging:
    14.        <a href="?{% urlupget page=1 %}">1</a>
    15.        <a href="?{% urlupget page=2 %}">2</a>
    16.        <a href="?{% urlupget page=3 %}">3</a>
    17.  
    18.     </body>
    19. </html>

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

    Исходники чуда тега можно увидеть тут.

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

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]
  • 09May

    Думаю съездить на DevConf, который пройдет в Москве 17ого числа.

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

    Интервью Ивана Салагаева о конфе о питоне и не только.

    А вы что думаете? Стоит слетать в Россию?

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , ,

  • 05May

    Мда. Экономней надо кодить. Мой эклипс с pydev и аптаной на борту не кисло оперотивочки съедает, а это, с появлением в моей семье нового нетбучного малыша – стало большой проблемой. И начал я посматривать в сторону VIMа. Не очень хочется прощаться с приятными IDE-шными фичами.

    Вот то, что у меня получилось, после того, как я досмерти замучал глупыми вопросами весь pythonua@conference.jabber.ru

    Тут у нас слева по F5 мы видим все функции и классы открытого файла, а по F6 файловый менеджер.

    Вот архив с моими настройками и плагиными vim.zip. Тем, у кого вим вообще никак не настроен – можно просто взять и распоказать это в свой хоум.

    Так что начинаю потихоньку прывыкать к виму. Думаю по мере развития этого моего нового пристрастия – буду вам писать.

    Ну и на последок несколько ссылок в тему.

    Статья на тему интеграции питона и вима. Хоть и старая но еще вполне актуальна. Да и вообще этот блог про вим очень хорош. На нем же наткнулся на подборочку команд для работы с вимом. Ну а кому показалось, что это банальная и маленькая подборочка – вот эта вам разорвет мозг.

    Спасибо deepwalker за помощь и пояснения и за львиную часть его конфига вима :)

    PS: А еще есть GVIM тоже, только в окошке и с менюшками.

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , ,

  • 27Apr

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

    В Джанго есть MultiWidget, при инициализации которого можно указывать массив виджетов, которые будут принадлежать одному полю и выведены в ряд. При этом значение, возвращаемое этим виджетом – очевидно будет массив.

    Правда просто так он почему-то не захотел работать. Разработчики почему-то захотели, чтоб его использовали всегда только как базовый класс, а не как конечный, и требуют переопределения decompress. Поэтому переопределив его мы сделали конечный и многоразового использования.

    Ниже пример поля с датой из 3х выпадающих списков:

    1. from datetime import date
    2.  
    3. from django import forms
    4. from django.utils.translation import ugettext_lazy as _
    5.  
    6. class ListMultiWidget(forms.MultiWidget):
    7.     def decompress(self,values):
    8.         if values:
    9.             return values
    10.         return [None]*(len(self.widgets))
    11.  
    12. YEARS_CHOICES = map(lambda a: (a,a), range(1950,2011))
    13. MONTH_CHOICES = map(lambda a: (a,a), range(1,13))
    14. DAY_CHOICES = map(lambda a: (a,a), range(1,32))
    15.  
    16. SplitDates = ListMultiWidget((forms.Select(choices=YEARS_CHOICES),
    17.                                 forms.Select(choices =MONTH_CHOICES),
    18.                                 forms.Select(choices =DAY_CHOICES )))
    19.  
    20. class SplitDatesField(forms.Field):
    21.     widget = SplitDates
    22.     def to_python(self,value):
    23.         try:
    24.             return date(int(value[0]),int(value[1]),int(value[2]))
    25.         except ValueError:
    26.             raise forms.ValidationError(_(u'Wrong Date'))
    Share and Enjoy:
    • Facebook
    • LinkedIn
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , , ,

  • 31Jan

    pycamp-logo-newСегодня рано утром вернулся с pycamp, который прошел в Киеве 30ого января в учебном центре i-klass.

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

    Доклады мне понравились не все, но негатив я высказывать свой не буду, поэтому просто небольшой обзорчик того, что понравилось и запомнилось.

    Александр Шигин (гость из солнечного Рамблера) «Почему Python — тормоз и как заставить его меньше тормозить». Были небольшие обзорчики кода, со сравнениями производительности. Сравнение результатов работы алгоритмов, реализованные разными способами — картежи, дикты, классы. Первые быстрее, но мы и так это знали. Хотя местами были довольно интересные результаты. Был упомянут Cython, но только вскользь, хотя мне бы тема была куда интереснее. Так что после в кулуарах мы написали небольшой хелло ворлд на cython, получили сошник и заюзали в самом питоне.

    Кратко выглядит примерно так

    ваш скрипт

    1. print "Hello World"

    скрипт setup.py:

    1. from distutils.core import setup
    2. from distutils.extension import Extension
    3. from Cython.Distutils import build_ext
    4.  
    5. setup(
    6.     cmdclass = {'build_ext': build_ext},
    7.     ext_modules = [Extension("helloworld", ["helloworld.pyx"])]
    8. )

    получаем сошник

    1. $ python setup.py build_ext –inplace

    и дальше его используем в ваших скриптах.

    1. >>> import helloworld
    2. Hello World

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

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

    Юрий Юревич «Рецепты декораторов». Лично для себя ничего нового не увидел, кроме того, что довольно грамотно все разложено по полочкам и что несомненно помогло упорядочить в голове знания.

    Михаил Кашкин (замляк из Днепра) «Работа с хранилищами данных в Google App Engine, отличия от реляционной модели». Я Апсы еще не юзал вообще. Но в скором времени мне таки придется уткнуть свой нос у туда. И пока то, что я узнал — мне не очень понравилось. Реляционных БД там нет вообще. Только их не реляционная БД и мемкеш.

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

    В кулуарах мне рассказали немного больше о самом App Engine. Он не совсем на шару, а в нем есть лимиты, я пологаю, что лимиты на все. Причем при приодалении этих лимитов вам просто закрывают доступ к сайту, хотя по совести их просто надо не давать использовать больше. И хотя питон с джангой были первыми в арсенале App Engine – они там со своими ограничениями. Так что 40 минут доклада оставило для меня много вопросов.

    Александр Соловьев. «Redis: Дикий Запад баз данных». Если коротко — то Redis — этот мемкешед, который сторит данные на винте с промежуточным хранилищем в памяти. С типами данными не только строки но и инты, листы, сеты. И с довольно обширным функционалом для их применения. Мастер-Слейв репликация, кстати только в этом наверно редис проигрывает мемкешу, т.к. мемкеш может использовать несколько серверов и данные между ними отлично распределять ( но редис держит данные на винте а не в памяти ). Ну и конечно же, Александр, как авторитетный велосипедист не мог не написать к редису чего-то своего pyredis ( питонячий клиент для редиса )

    Не мог не оценить подачу материала Александром. Очень живо, я даже подумал что презентация получилась в стиле теле-магазина: «Вы хитите это — пожалуйсто — редис отлично с этим справляется, это – и это вы можете сделать как 2 пальца об асфальт и то и то…». Но я бы на его месте такой продукт подавал как Стив Джобс — Макбук Аир. «Представте систему, которая быстрее мемкеша но данные сторит на винте, с типизацией ячеек и т.д. и т.п. И в конце Редис» Ну что-то в этом стиле.

    В любом случае, Александру спасибо. Будем смотреть, будем пробовать. Интересно, он кешовый бекенд для редиса на джанге уже написал?

    Владимир Пузанов и Владимир Кирилов «Расширения и встраивание Python». Эти два молодых хакера рассказали о том где можно применять питон, с чем и как его можно связывать. Jython, IronPython и многое другое, что я еще не запомнил. Надеюсь где нить раздобыть их презентацию. Но для себя отложил Stackless Python — у него очень «крутые» треды, на сколько крутые — я уже буду пробовать ручками сам. И когда я говорю о Stackless мне уже какой раз предлогают глянуть на greenlet. Общее впечатление о докладе осталось очень хорошее – хороший обзор, живая подача материал и оставило много вопросов (как и должно быть в подобных докладах). В конце парни показали прикольный примерчик как они питоном хачат сафари и меняют в нем титл через его жсный движок. Хотелось бы ответить всем бегающим по залу участникам с вопросам «Нафига надо было хачить софари». Объясняю — просто так!!! Просто точка ( довольно прикольная ) в докладе о расширениях и встраиваниях питона, обидно, что многие из всего доклада запомнили только эту точку.

    Андрей Мишковски «Использование Python в ГИС» . Проблематика Гиографические Информационные Системы для меня была нова, но подача информации была доступна и понятна даже слушателю не знакомым с темой. Так что если кто хочет может просмотреть презентацию, и дождаться выхода видео.

    Сергей Кирилов. «WebSockets в twisted». WebSockets — это новое расширение протокола HTTP в сторону двухстороннего взаимодействия клиент-сервер с одним коннектом, которая описана в стандарте HTML5. Поддерживается пока не всеми ( поэтому пользуемся библиотечкой, которая подменяет стандарт для тех, кто его еще не поддерживает ). Я мог пропустить, но по моему twisted-у был отведен один слайд, на котором выведено 42 строчки кода и сказано, что их 42 :) Кстати нагугли и хабровскую статью на эту тему.

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

    Сергей, если у вас сохранилась копия этой болтавни в чате — выложите куда-то, было прикольно :)

    И последний из понравившихся мне докладов был у Ивана Моргуна, сразу после нее я и убежал, т.к. надо было успеть на поезд обратно. Доклад был о «Работа с платежными системами в Django (PayPal, WebMoney)». Из джанго я ничего интересно для себя не вынес, но некоторые интересные моменты для PayPal подчеркнул.

    Организаторам, спонсорам и докладчикам мероприятия огромное спасибо. У вас все отлично получилось. Давайте как нить повторим. :)

    Еще о pycamp:
    curvedbrain.org “Мысли по мотивам PyCamp Kyiv”
    Макс Ищенко “мысли к вчерашнему pycamp”
    Vladimir PyCamp впечатления
    Дмитрий Гайворонский “PyCamp @ Kiev, 30 Jan 2010″
    … пишите в комментах ссылки на свои посты о кемпе …

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , ,

  • 20Jan

    c81822b789f2Так что через неделю собираюсь в Киев на PyCamp Kyiv. Все об этом мироприятии можно почтить у них на сайте.

    Кто не сможет там быть – обещаю выложить небольшую статейку о том, что вы пропустили ( и углубляясь в те моменты, которые мне были интересны )

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , ,

  • 18Jan

    error-flash1После 2 недель мучений. Я таки не выдержал и запостил на форум вопросец. Реально все оказалось довольно просто, но я и сам мог до этого догодатся, наверно просто не выдержали нервы. Сам пост смотреть здесь.

    Но вообще давно я так не мучался над какой либо задачей. Да и вообще, для меня программирование, как процесс разработки кода – стал довольно скучноват блогодаря С. Макконнеллу и pdb. Блогодаря первому я стал совершеть меньше ошибок, а блогодаря второму стал их быстрее отскивать. Даже иногда скучаеш за теми старыми – добрыми временами, когда на поиск одной ошибки в перле (никаких притензий к языку) можешь потратить целый день.

    Так что АС3 – позволил вспомнить молодость :)

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

« Previous Entries   

Recent Posts

Recent Comments

  • Я просто оставлю это тут: ...
  • спасибо...
  • Если вдуматься в каждое слово, то время беСконечно в русском...
  • Спасибо, Евгений, исправленно.P.S.: перехал на диску...
  • за опечатку - спасибо...