8.27.2010

FrOSCon 2010

Итак, пора уже представить миру мой отчет о том как проходила конференция FrOSCon 2010 (Free and Open Source Software Conference). Состоялась она 21-22 августа, в Германии, в "городке" Sankt-Augustin, в здании местного IT-технического университета.


почему "в городке" - насколько я понял, из объяснений друзей, участников конфы, и карты метро-трамваев - Санкт-Агустин это не совсем город, не совсем деревня, не совсем район города, но официально город. Изначально я приехал в Бонн (население около 300 тыс), но этого города не было в объявлении поезда, так как в 30 км от него находится Кельн где проживает около 3 млн. Бонн состоит из районов - давным давно они были деревнями, потом срослись и сохранили свои названия в названиях районов. Совсем рядом к Бону, ну полностью прилегают, без какой-то границы, еще штук 7-8 аналогичных городов, в числе которых и Санкт-Агустин, и Кельн.

Нужно сказать что конференция проходила пятый раз и выросла с маленькой тусовки в 10-20 человек в конференцию, объединяющую более одной тысячи человек. Организаторы, в бывшем студенты сего местного университета в один день сказали что-то типа "we will go build our own conference, with blackjack and hookers", договорились и сделали. Полный опен-сурс, полный кайф. Что у них получилось? Не маленькая локальная тусовка гиков, а действительно международная тусовка гиков. Хотя на конференции сильно чувствуется преобладание немецкого языка (большинство народу все-таки местные), но как водится в it-community "да че этот английский язык?! там все слова взяты из си-плюс-плюса!" - большинство нормально говорят по английски, и могу свободно изъясняться на двух языках. Как говорят, в этом году было предложение провести полностью конференцию (все доклады) на английском языке, но встала проблема, не все докладчики могли полностью свободно изъясняться на английском, такие дела. Но радует (как для человека без знания немецкого) что около 25% докладов были на английском. Этого вполне достаточно. Если есть вопросы - на них докладчик может ответить и на ломаном английском, но без микрофона.


Где это было. В августе в университетах не проводятся занятия, но все равно там находится туча народу, кто-то делает свой проект, кто-то просто тусуется. И понятно почему. Здание универа просто восхитительное, все очень и очень модерновое, все укомплектовано под завязку, в аудиториях очень сильно приятно находиться. Все семинарные комнаты оборудованы компами, за каждым местом студента. Вокруг универа какие-то архитектурные сооружения (типа гигантского магнита). Внутри куча работающих кафе. Пусть наши универы (вроде триждыпроклятого и родного НГУ) поперхнуться слюной. Организаторы полностью снимают это здание на выходные. Фойе и коридоры отводятся под стенды контор, лекционные аудитории - под доклады, семинарские аудитории - под проекты, столовая - под столовую, внутренний двор - под опен-эйр-пати.


Как организовывалось. Как и весь опен-сурс: силами людей и бесплатно. Организационный коммитет - это вышеобозначенные студенты универа и их единомышленники. Все остальное делается силами волонтеров, то есть очень простых людей, которые расставят столы и стенды, протянут провода, разгрузят грузовики с пивом, нальют его в стаканы, пожарят мясо и т.п. Надо сказать что мало таких людей не было. Я и сам занимался там растаскиванием столов и т.д., то есть стал волонтером. Могу сказать - ни капли ни жалею, так как это опен-сурс, это круто.


Как проводилось. Достаточно скромно, вход для обычных людей на 2 дня - 5 евро, для коммерческих контор - 100 евро, для волонтеров - бесплатно. Вот вам и сила опен-сурса. Сколько нужно мозгоебаний и затрат для того что бы попасть на конфу мсфт? во-во. Стендов было много. bsd, debian, ubuntu, gentoo, centos - и все им смежные... gnome, kde, qt... postgresql, firebird, mysql... openoffice... zope, и че-то там еще для python-а... xen и че-то еще для виртуальщиков... куча прессы типа open-source-press где можно было в тридешево купить книжки (только на немецком)... какие-то проекты типа linux для школы, ноутбук каждому, космическая программа германии... был и гугль, и был (мне не известный) tarent... Всего не упомнил, но большинство охватил.


Кстати что не понравилось - стенд гугля - натянули на стенде три майки с лого, поставили на стол пару макбуков, посадили за стол 3-4 невменяемых человека, и дали им пару занимательных головоломок - стремно это как-то выглядело, но очереди к их стенду были всегда. А вот tarent зажег, действительно было на что посмотреть, загончик с радиоуправляемыми роботами, у которого постоянно крутились дети, куча-куча маленьких стендов, куча-куча людей, какие-то конкурсы.

Каждый час в лекционных были доклады. Об докладах читать ниже. Каждый час одновременно 5 докладов, кроме keynotes раз в день (который для всех). Далее я опишу те доклады на которых мне посчастливилось присутствовать и мое резюме по ним.

  1. Free and Open Source Software in the Developing World Jon "maddog" Hall это было в качестве keynotes, человек-директор Linux International, такой тихинький свиду дедушка, отжег по полной. Полная ненависть к Windows, много умных вещей про развитие стран третьего мира, про коммерческий и опен-сурсный код. Очень профессиональный доклад. Куча инфы, перемешка шуток, очень хорошие ораторские способности. Основные идеи: странам третьего мира навязывается использование проприетарного софта, в большинстве случаев которому имеются полностью свободные аналоги, все происходит от удалености и незнания, на это тратится уйма денег.
  2. Agile in a Year Thomas Ferris Nicolaisen - доклад не про опен-сурс, а про технолигии которые доступны всем, про очень удобные методы разработки, про то как одна компания из Бонна внедряла Agile процессы на практике. Замечательный доклад, как мне показалось, очень много практических вещей было освещено, что было сложно что было легко, зачем и почему. Тема конечно же очень общирная, но тут все было представлено на одном конкретном примере. Допустим "... таким образом для выполнения основных фитч нашей программы мы выбрали систему канбан, и использовали ее напротяжении месяца". Говорилось про то, как в данной конторе пришли к идее ежедневных stand-up meetting, про переселения девелоперов, про функции менеджеров, про то что agile-master бесполезный человек и тп. Очень интересно. Многим компаниям хотя бы до таких мыслей расти и расти, а тут люди не боятся и экспериментируют. Не понравилось то что пример очень уж узкий вышел - компания состоит около 10-15 человек. Что понравилось: графическое представление презинтации, сразу же на все изображение выводятся все слайды, логические переходы между ними обозначены стрелочками, когда разговор переходит на какой-то слайд - тогда камера "приближается"/"перемещается" к нужному участку карты. Очень удобно понимать логику всего доклада, да и запоминается намного лучше, что и отокуда.
  3. Inside the Cassandra distributed database Jonathan Ellis - доклад про не-реляционную БД cassandra. Я все время знал про существование таких бд, про то как их применять, и зачем они нужны, но у меня никогда не было причины задействовать такую БД. Это используется в facebook, в amazon s3, в twitter, в digg и т.д. Там где очень много данных, где данные однотипные и всегда растут в колличестве. После прослушивания доклада я наконец-то проникся идеей, это круто. Любое возможное представление, любые масштабы. Да сложно проектировать и программировать. Но если рассматривать такой тип БД как средство оптимизации - то есть уже полностью есть модель sql обычной базы, все отлажено, выставлены все нужные индексы и тп., но падает производительность на простых запросах, базу нужно перетаскивать на несколько машин и т.д. - тогда вполне реально перетащить базу на cassandra, переделать все sql запросы - и будет простое чудо. Докладчик рассказывал про внутреннее устройство, как происходит запись и чтение, что такое "ключ" в данной бд, как строится дата-кластер, какие возможности есть. Все очень понятно. Не понравилось то что в зале возникло много откровенно тупых вопросов по устройствам дата-кластеров, возможно это сложно для обычных людей. Мне очень понравилось.
  4. Be lazy, make automation Fabrizio Manfredi - говорилось про то как построить свой собственный "умный" дом. Идея в основном такая: существуют девайсы которые можно купить (типа розетка с lan/wlan интерфейсом), поставить их в свой дом для освещения и т.п., потом настроить домашний софт на влючение/выключение по рассписанию (по cron-у), или на показания других датчиков (типа датчиков движения). Входишь в комнату - свет включается, выходишь - выключается. Нужно разогреть баню пока едешь в общественном транспорте? - подключаешься к домашнему серверу или отправляешь смс-ку. Кондиционер сам выключается когда открыты окна. Согласитесь, это круто. Докладчик объяснял как это все делается, на каких протоколах базируется система, как лучше строить архитектуру (от базового - провода или wifi, до сложного - распределенной системы), какие опен-сурсные проекты реализуют доступ к протоколам. Да это очень прикольно, но дорого, одна розетка стоит 10-20 евро, так как в ней стоит как минимум один чип. Плюс, вопрос секурити вообще не ставится (тупо твой сосед может выключить тебе свет). В общем я сильно проникся, но пока это мне не по карману, да и строить такое нужно только в собственном жилье.
  5. Antifeatures, Benjamin Mako Hill - тоже keynotes, тоже очень знаменитая персона (бог debian-а и gnu, как-никак), тоже очень интересно. Что сразу заметилось - очень быстрый и очень понятный английский. Человек тоже замечательный оратор, где нужно вставит конфузную шутку на предмет Windows и тп. Основные идеи: каким образом строится стоимость софта, за что реально приходится платить, какие минусы (не баги) может приносить использование софта, ну и собственно идеи GNU. Один из первых примеров - Windows NT Workstation и Windows NT Server - отличались в цене на 800 баксов, а фактически - одной записью в реестре. За что платится разница? во-во, наводит на мысли.
  6. MySQL Plugins - what are they? Sergei Golubchik - рассказ про еще один форк mysql, про то как в достаточно большой проект была впилена сисмета плагинов и расширений. Вообще говоря - ничего особенного по части проги я не услышал, все очень привычно. Ничего не скажу как это смотрится со стороны знатоков mysql, к коим я не отношусь. Запомнилось одно - английский от русского человека слышно за версту, это точно.
  7. HiPHoP for PHP - докладчик - человек из комманды facebook, у них сейчас много опен-сурсных проектов. Что такое php я сам себе слабо представляю, попал на доклад случайно, но он мне понравился, я достаточно хорошо туда попал. Есть какая-то магия в том что делает facebook, во-первых если им не нравится php - они его исправляют и не стесняются, во-вторых - у них очень даже рационализаторский подход. Так как пхп - интерпретируемый язык и на фейсбуке сидят миллионы, то давайте перенесем код пхп на цпп. Все, на. Другими словами - сделаем свой интерпритатор пхп который будет рождать бинарный код. Вот и вся суть проекта. Да, есть проблемы со скоростью работы, удобством и т.п. Но это работает в разы быстрее и стабильнее! Я проникся.
    Интересно заметить когда в зале возникла куча вопросов по поводу скорости, и компиляции докладчик просто свернул презинтацию, открыл консоль и показал что и как делается. Да реально, вся аудитория засекала ~20 секунд. Вот еще одна фишка it-конференций, можно продемострировать все за пару секунд.
  8. GNOME 3 Hendrik Richter - тут мало чего сказать, так как доклад был на немецком, да и решают только картинки. Могу сказать три вещи: это будет скоро, много добавится графических наворотов, они уже думают об GnomeOS.
  9. 1, Qt, Profit! Daniel Molkentin - честно говоря этот доклад был расчитан на людей которые скажут "ой, а что такой qt?", по-этому особых эмоций у меня не возникло. В большей части было показано как обычное десктоп приложение портируется на symbian, "то что можно его отлаживать" ну и все. Жидко как-то, не уровень qt, это всяко.

Еще был Social Event - огромная пьянка на открытом воздухе, я там был и мне понравилось. Особо нужно сказать как она проводилась. Есть собственная валюта конференции "Bon" - 1 Bon = 1 euro, пиво и еду можно покупать только за Bon-ы. Маленький стаканчик пива - 1 Bon, Большой стакан - 2 Bon + 1 Bon (fant), Мясо (ааа!) - 3 Bon. Вот там монжно было бухнуть много пива и заобщаться с любым человеком. Были награждения проектов (которые я собственно даже не видел), было файер-шоу, был большой торт... у, там было круто!!


Это все что я смог написать про это событие, многое еще крутится в голове, но изложить будет сложно. Выводы - таких конференций очень не хватает в России, очень не хватает конференций такого уровня (типа тут ставятся вопросы - что делать если у тебя дата-кластер на 1000 машин, а не банальное - как установить линукс новичку), просто не хватает аналогичных по духу событий. А организаторам FrOSCon - отдельное спасибо, все было просто круто!!

8.07.2010

хроники django или homebudget part 6

Давно не писал в хроники, а проект уже ушел далеко, так что сначала догоню версию блога до версии репозитория :) Сегодня будет html-css-javascript, делаем календарик для просмотра месяца.

  1. Итак, у нас есть master page следующего содержания. Из отличий с предыдущим его описанием - добавил блок head, через который дочерние страницы могут добавлять скрипты и стили в html код страницы.
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
        <link rel="stylesheet" href="content/css/main.css" />
        <title>Homebudget site: {% block title %} manage yourself {% endblock %}</title>
    {% block head %}{% endblock %}
    </head>
    <body>
    <div id="content">
    {% block content %}
    {% endblock %}
    </div>
    </body>
    </html>
    
  2. Еще есть убогий month view который выводит обычный список день-сумма.
    {% extends "purchases/master.html" %}
    
    {% block title %} monthly view {% endblock %}
    
    {% block content %}
    <p>Date: {{view_date}} </p>
    {% if day_price_dict %}
        <ul>
            {% for key,value in day_price_dict.items|dictsort:"0" %}
                <li>
                    {{key}} 
                    <b>{{value}}</b> 
                    <a href='/purchases/view/{{key.year}}/{{key.month}}/{{key.day}}/'> Edit </a>
                </li>
            {% endfor %}
        </ul>
    {% else %}
        <p>No purchases yet</p>
    {% endif %}
    <p>
        Total: <b>{{month_total}}</b>
    </p>
    
    <a href='/purchases/add/'>Add</a>
    {% endblock %}
    
  3. Я хочу отобразить календарик. Самое простое решение - тупо таблица, ряды - недели, столбцы - дни недели. Но как сказал знакомый верстальщик "деревня, таблицы - это прошлый век, нужно использовать div-ную верстку". В чем она заключается, как я понял для себя, это выделение всех элементов в блоки, и задание их относительного расположения через стили. В итоге было подсмотрено решение в одном проекте.
  4. В темплейте month-view заключаем список день-сумма в div с id-шником dashboard
    <div id="dashboard">
    <ul>
    ...
    </ul>
    </div>
    
  5. Создаем файлик dashboard.css в content/css, добавляем его в monthview темплейт.
    {% block head %}
    <link rel="stylesheet" href="content/css/dashboard.css" />
    {% endblock %}
    
  6. Теперь все происходит в dashboard.css, сначала выставим фиксированную ширину для контейнера dashboard и уберем дефолтные стили списка с ul.
    #dashboard {
        width: 900px;
        display: inline;
        position: relative;
        float: left;
    }
    #dashboard ul {
        list-style: none outside none;
    }
    
  7. Элементу списка (можно сказать элементу календаря) выставляем фиксированный размер - высоту и ширину. Размер вычисляем по формуле "ширина dashboard-а" разделить на 7, минус пара пикселей. Логика простая - в неделе 7 дней, по этому в контейнер должно помещаться не более 7 элементов. А плюс-минус пиксели, это нужно для учета бордеров элементов. А так же выставим float: left, этот магический параметр определяет с какой стороны будут располагаться соседние элементы. То есть для left следующий элемент выстроится слева от текущего. Если располагать некоторым абстрактным мышлением то можно понять к чему все это приведет. Правильно, к календарю.
    #dashboard li {
        float: left;
        position: relative;
        width: 120px;
        height: 120px;
        text-align: center;
    }
    
  8. Можно посмотреть, да выглядит похоже, но не айс, так как дни не располагаются в соответствии с днями недели. Потому что в возвращаемом списке из вьюхи нет дней соседних месяцов, которые довершали недели. Не проблема добавить ;) Нужно в цикл обхода дат начинать от начала недели (не важно текущего или предыдущего месяца), ну и завершать аналогично. Дополнительно в возвращаемый словарь добавим значение что это за день: день текущего месяца, неактивного месяца, выходной, сегодня.
    def month_view(request, year, month):
        """
        List all day in month, with daily sum
        """
        try:
            view_date = datetime.date(year=int(year), month=int(month), day=1)
        except:
            raise Http404
        from django.db.models import Q
        plist = Purchase.objects.filter(Q(purchase_date__year=view_date.year) & Q(purchase_date__month=view_date.month)).order_by('purchase_date')
    
        y, m, d = view_date.timetuple()[:3]
        dt_next = datetime.date(year=y+((m+1)/12), month=(m+1)%12, day=d)
        day_price_dict = {}
    
        first_calend = view_date
        while first_calend.weekday() != 0:
            first_calend -= datetime.timedelta(days=1)
        dt = first_calend
        while dt < view_date:
            day_price_dict[dt] = (Decimal('0.0'), 'prev_month')
            dt += datetime.timedelta(days=1)
    
        month_total = Decimal('0.0')
        while (dt < dt_next):
            purchases_day = plist.filter(purchase_date__day=dt.day)
            day_total = Decimal('0.0')
            for it in purchases_day:
                day_total += it.price_total
            month_total += day_total
            weekend = dt == datetime.date.today() and 'today' or dt.weekday() >= 5 and 'weekend' or 'day'
            day_price_dict[dt] = (day_total, weekend)
            dt += datetime.timedelta(days=1)
    
        last_calend = dt
        while last_calend.weekday() != 0:
            day_price_dict[last_calend] = (Decimal('0.0'), 'prev_month')
            last_calend += datetime.timedelta(days=1)
    
        return render_to_response('purchases/month_view.html', locals())
    
  9. Теперь сделаем нормальное отображение дня (ячейки календаря). Для этого сначала выставим классы для элементов. sum для суммы дня, edit для линки перехода на день, date для числа календаря. Для самой ячейки нужно добавить класс дня, полученный в предыдущем пункте.
    <div id="dashboard">
        <ul>
            {% for key,value in day_price_dict.items|dictsort:"0" %}
                <li class="{{value.1}}">
                    <span class="date">{{key.day|stringformat:"02i"}}</span>
                    {% ifnotequal value.1 'other_month' %}
                    <span class="sum">{{value.0}}</span> 
                    {% endifnotequal %}
                    <a class="edit" href='/purchases/view/{{key.year}}/{{key.month}}/{{key.day}}/'>Edit</a>
                </li>
            {% endfor %}
        </ul>
    </div>
    
    Потом обозначим для них стили отображения внутри ячейки. Выставим top-left-right-bottom, для этого понадобится position:absolute.
    #dashboard .date {
        font-size: 60px;
        position: absolute;
        left: 10px;
        top: 10px;
    }
    #dashboard .sum {
        font-weight: bold;
        bottom: 5px;
        right: 5px;
        position: absolute;
        font-size: 20px;
    }
    #dashboard .edit {
        position: absolute;
        right: 5px;
        top: 5px;
    }
    
  10. Теперь мы займемся дизигнерством. То есть разукрасим календарь. Так как необходимые навыки отсутствуют напрочь, и вообще мы дальтоники, то спиздим. Открыл для себе клевый сайт на котором можно выбрать комбинацию сочетающихся цветов. Мой выбор такой. В соотвествии этому выставим цвета для всех элементов.
    #dashboard li {
        background: none repeat scroll 0 0 #D5E1DD;
        border: 1px solid white;
        font-color: white;
        cursor: pointer;
    }
    #dashboard .prev_month {
        background: none repeat scroll 0 0 #747e80;
    }
    #dashboard .weekend {
        background: none repeat scroll 0 0 #F7F3E8;
    }
    #dashboard .today {
        background: none repeat scroll 0 0 #F2583E;
    }
    #dashboard .hover {
        background: none repeat scroll 0 0 #77BED2;
    }
    #dashboard .date {
        color: white;
    }
    #dashboard .sum {
        color: #2B3E42;
    }
    
  11. Ну и последние штрихи. При наведении на день курсора будем менять цвет ячейки. Для этого понадобится клиентский javascript. Будем использовать мега рулезную библиотеку jQuery. Есть несколько способов ее подключить.
    • Самый простой и стандартный. Скачать себе jquery, и добавить в статические ресурсы сайта. Использовать можно следующим образом (добавляем в head):
      <script src="content/common/js/jquery-1.4.2.js"></script>
      
    • Использовать гугл-апи. Способ матер и говорят для оптимизации кеширования само оно, но для себя я отметил следующий минус - для локальной разработки он тормозит сильно. Да и кол-во запросов увеличивается. В общем я от него отказался в пользу первого. Использовать можно следующим образом (добавляем в head):
      <script src="http://www.google.com/jsapi" type="text/javascript"></script>
      <script type="text/javascript">
          google.load("jquery", "1.4.2");
      </script>
      
    • Что-нить еще, типа подключить с какого-нить хостинга.
  12. Заполучив jQuery можно решить задачу с изменением цвета под курсором.
    <script type="text/javascript">
    $(document).ready(function(){
        $('#dashboard li').bind("mouseenter", function() {
            var pthis = $(this)
            pthis.addClass('hover')
        });
        $('#dashboard li').bind("mouseleave", function() {
            var pthis = $(this)
            pthis.removeClass('hover')
        });
    });
    </script>
    

Посты по теме: