• Первый официальный релиз Webpack 2. Что нового по сравнению с Webpack 1?

    • Перевод

    Webpack 2 Release


    Предупреждение: проверьте, как установлена версия Webpack в package.json. Возможно скоро ваш continuous integration сломается.


    Наконец-то Webpack 2 преодолел рубеж beta и release candidate. Это значит, что всё работает стабильно, и можно без опаски использовать его в production.


    Список изменений/улучшений:


    • Нативная поддержка ES6-модулей;
    • Разбиение кода на чанки — Code Splitting with ES6;
    • Поддержка динамических выражений при загрузке модулей — Dynamic expressions;
    • Изменения при работе с Babel;
    • ES6-специфичные оптимизации;
    • Breaking Changes;
    • Новый сайт с документацией.

    Подробности под катом.

    Читать дальше →
  • Создание архитектуры программы или как проектировать табуретку

    Взявшись за написание небольшого, но реального и растущего проекта, мы «на собственной шкуре» убедились, насколько важно то, чтобы программа не только хорошо работала, но и была хорошо организована. Не верьте, что продуманная архитектура нужна только большим проектам (просто для больших проектов «смертельность» отсутствия архитектуры очевидна). Сложность, как правило, растет гораздо быстрее размеров программы. И если не позаботиться об этом заранее, то довольно быстро наступает момент, когда ты перестаешь ее контролировать. Правильная архитектура экономит очень много сил, времени и денег. А нередко вообще определяет то, выживет ваш проект или нет. И даже если речь идет всего лишь о «построении табуретки» все равно вначале очень полезно ее спроектировать.

    К моему удивлению оказалось, что на вроде бы актуальный вопрос: «Как построить хорошую/красивую архитектуру ПО?» — не так легко найти ответ. Не смотря на то, что есть много книг и статей, посвященных и шаблонам проектирования и принципам проектирования, например, принципам SOLID (кратко описаны тут, подробно и с примерами можно посмотреть тут, тут и тут) и тому, как правильно оформлять код, все равно оставалось чувство, что чего-то важного не хватает. Это было похоже на то, как если бы вам дали множество замечательных и полезных инструментов, но забыли главное — объяснить, а как же «проектировать табуретку».

    Хотелось разобраться, что вообще в себя включает процесс создания архитектуры программы, какие задачи при этом решаются, какие критерии используются (чтобы правила и принципы перестали быть всего лишь догмами, а стали бы понятны их логика и назначение). Тогда будет понятнее и какие инструменты лучше использовать в том или ином случае.

    Данная статья является попыткой ответить на эти вопросы хотя бы в первом приближении.
    Читать дальше →
  • Чем PostgreSQL лучше других SQL баз данных с открытым исходным кодом. Часть 1

    • Перевод
    Сегодня давайте поговорим о преимуществах Postgres перед другими системами с открытым кодом. Эту тему мы обязательно раскроем более подробно на PG Day'16 Russia, до которой осталось всего два месяца.

    Возможно, вы спрашиваете себя: «Почему PostgreSQL?» Ведь есть и другие варианты реляционных баз данных с открытым исходным кодом (в рамках этой статьи мы рассматривали MySQL, MariaDB и Firebird), так что же Постгрес может предложить такого, чего нет у них? В слогане PostgreSQL заявляется, что это «Самая продвинутая база данных с открытым исходным кодом в мире». Мы приведем несколько причин, почему Постгрес делает такие заявления.

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


    Читать дальше →
  • Все, что хотел

      Hotel – приют для localhost.


      Запуск и управление всех ваших веб-проектов с одного адреса.


      Больше, разных портов костылей.


      Можно держать зоопарк портов для каждого проекта: 9000, 8000, 8080, 3000, 3001…
      Или настраивать веб-сервер, править /etc/hosts файл или DNS для каждого проекта.
      А еще помнить, как запускать девелоперский веб-сервер для каждого проекта:


      • gulp
      • gulp serve
      • gulp watch
      • ionic serve
      • browser-sync start --server --no-open --directory --files
      • http-server -p 9000
      • python -m http.server 8000
      • php -S localhost:8000
      • и так далее...

      Сделать жизнь проще поможет hotel.


      Читать дальше →
    • Микросервисная архитектура, Spring Cloud и Docker

      • Tutorial

      Привет, Хабр. В этой статье я кратко расскажу о деталях реализации микросервисной архитектуры с использованием инструментов, которые предоставляет Spring Cloud на примере простого концепт-пруф приложения.



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

      Читать дальше →
    • Спутник — это очень просто — 2

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

        И хотя космические корабли бороздят просторы большого театра спутники успешно выводятся на орбиту и передают информацию о проводимых экспериментах, но «услышать» их собственники могут всего несколько минут. Потому собственники различных CubeSat публикуют инструкции и софт для приема своих спутников, надеясь получить как можно больше телеметрической информации от энтузиастов. Например для Manfred Memorial Moon Mission (4M) был проведен конкурс среди энтузиастов приславших наибольшее количество принятой телеметрии.

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

        image


        Читать дальше →
      • Как работает yield

        • Перевод
        На StackOverflow часто задают вопросы, подробно освещённые в документации. Ценность их в том, что на некоторые из них кто-нибудь даёт ответ, обладающий гораздо большей степенью ясности и наглядности, чем может себе позволить документация. Этот — один из них.

        Вот исходный вопрос:
        Как используется ключевое слово yield в Python? Что оно делает?

        Например, я пытаюсь понять этот код (**):
        def _get_child_candidates(self, distance, min_dist, max_dist):
            if self._leftchild and distance - max_dist < self._median:
                yield self._leftchild
            if self._rightchild and distance + max_dist >= self._median:
                yield self._rightchild
        

        Вызывается он так:
        result, candidates = list(), [self]
        while candidates:
            node = candidates.pop()
            distance = node._get_dist(obj)
            if distance <= max_dist and distance >= min_dist:
                result.extend(node._values)
                candidates.extend(node._get_child_candidates(distance, min_dist, max_dist))
                return result
        


        Что происходит при вызове метода _get_child_candidates? Возвращается список, какой-то элемент? Вызывается ли он снова? Когда последующие вызовы прекращаются?

        ** Код принадлежит Jochen Schulz (jrschulz), который написал отличную Python-библиотеку для метрических пространств. Вот ссылка на исходники: http://well-adjusted.de/~jrschulz/mspace/

        Подробный и обстоятельный ответ
      • Учимся писать многопоточные и многопроцессные приложения на Python

        Эта статья не для матёрых укротителей Python’а, для которых распутать этот клубок змей — детская забава, а скорее поверхностный обзор многопоточных возможностей для недавно подсевших на питон.

        К сожалению по теме многопоточности в Python не так уж много материала на русском языке, а питонеры, которые ничего не слышали, например, про GIL, мне стали попадаться с завидной регулярностью. В этой статье я постараюсь описать самые основные возможности многопоточного питона, расскажу что же такое GIL и как с ним (или без него) жить и многое другое.
        Читать дальше →
      • Тестирование проектов Django

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

          Краткое содержание поста:
          1. тестирование веб-сайтов — это сложно и непонятно
          2. юнит-тесты в django
          3. тестовая БД и как с ней бороться
          4. smoke testing
          5. покрытие кода (code coverage)
          Читать дальше →
        • Лучшие инструменты для JavaScript-разработчика



            Регулярно появляется какая-нибудь JS-библиотека, которую начинают шумно обсуждать на всевозможных форумах. Сначала постепенно нарастает энтузиазм, а затем сообщество быстро делится на противоборствующие лагери, по-разному относящиеся к новинке. Было бы просто невероятным подвигом рассмотреть все распространённые JS-фреймворки и библиотеки, поэтому хотим предложить вам список самых популярных и оказавших наибольшее влияние инструментов для фронтенд-разработки. А заодно дадим некоторые рекомендации по их использованию.

            Но прежде чем перейти к делу, хотим уточнить:

            • Не нужно ломать копий, если в этот список не попали какие-то из ваших любимых фреймворков или библиотек.
            • Следите за обновлениями используемых вами инструментов. В последнее время начала активно внедряться кроссбраузерная и кроссаппаратная (cross-device) поддержка. Например, можно воспользоваться сканером, который подскажет, совместимы ли более старые версии с большинством устройств.

            Читать дальше →
          • WebSocket-чат на Tornado для вашего Django-проекта

            • Tutorial
            TornadoНедавно я запустил сайт backgrounddating.com и написал об этом здесь, на Хабрахабре. Разумеется, я уже тогда рассказал о некоторых технических деталях реализации этого проекта, но об одной из возможностей сайта я бы хотел написать отдельно, тем более, что документации (как на русском, так и на английском) на эту тему в Интернете пока что довольно мало. Итак, речь пойдёт о чате в реальном времени между двумя пользователями. Задача состоит в том, чтобы любой пользователь мог отправлять другим пользователям сообщения, и, если у получателя сообщения открыт чат с этим пользователям, то он сразу же видел входящие сообщения (а в ином случае он мог прочитать сообщения позже: то есть при открытии чата загружается история последних сообщений).

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

            Сразу уточню, что это не единственный способ реализовать подобное. Вы можете использовать другой асинхронный веб-сервер (например node.js), можете использовать другую очередь сообщений (или вообще её не использовать, если вам подходят особенности такого варианта: с пользователями одного канала обязательно общается один и тот же worker веб-сервера). Я даже не утверждаю, что этот вариант самый лучший (но в данном случае он подошёл лучше всех). В конце концов, мы здесь вообще не будем рассматривать костыли (long polling, Flash) для старых браузеров (а это почти все версии IE, например), не поддерживающих веб-сокеты, и даже не будем рассматривать возможность подключаться из тех браузеров, которые уже поддерживают протокол WebSocket, но не стандартизированную версию (RFC 6455), а одну из устаревших. О том, как можно включить поддержку устаревшей версии «draft 76» (она же «hixie-76»), смотрите в документации Tornado.
            Читать дальше →
          • Архитектура Stack Overflow

            • Перевод
            image

            Чтобы понять, как все это работает, давайте начнем с показателей Stack Overflow. Итак, ниже приводится статистика за 12 ноября 2013 и 9 февраля 2016 года:

            статистика
            • 209,420,973 (+61,336,090) HTTP-запросов к нашему балансировщику нагрузки;
            • 66,294,789 (+30,199,477) страниц было загружено;
            • 1,240,266,346,053 (+406,273,363,426) битов (1.24 TБ) отосланного HTTP-трафика;
            • 569,449,470,023 (+282,874,825,991) битов (569 ГБ) всего получено;
            • 3,084,303,599,266 (+1,958,311,041,954) битов (3.08 ТБ) всего отослано;
            • 504,816,843 (+170,244,740) SQL-запросов (только из HTTP-запросов);
            • 5,831,683,114 (+5,418,818,063) обращений к Redis;
            • 17,158,874 (not tracked in 2013) поисков в Elastic;
            • 3,661,134 (+57,716) запросов Tag Engine;
            • 607,073,066 (+48,848,481) мс (168 часов) выполнения SQL-запросов;
            • 10,396,073 (-88,950,843) мс (2.8 часов) затрачено на обращение к Redis;
            • 147,018,571 (+14,634,512) мс (40.8 часов) затрачено на запросы к Tag Engine;
            • 1,609,944,301 (-1,118,232,744) мс (447 часов) затрачено на обработку в ASP.Net;
            • 22.71 (-5.29) мс в среднем (19.12 мс в ASP.Net) на формирование каждой из 49,180,275 запрошенных страниц;
            • 11.80 (-53.2) мс в среднем (8.81 мс в ASP.Net) на формирование каждой из 6,370,076 домашних страниц.


            Вы можете спросить, почему существенно сократилась продолжительность обработки в ASP.Net по сравнению с 2013 годом (когда было 757 часов) несмотря на прибавление 61 миллиона запросов в день. Это произошло как и из-за модернизации оборудования в начале 2015 года, так и из-за некоторого изменения параметров в самих приложениях. Пожалуйста, не забывайте, что производительность – это наша отличительная особенность. Если Вы хотите, чтобы я более подробно рассказал о характеристиках оборудования – без проблем. В следующем посте будут подробные спецификации железа всех серверов, которые обеспечивают работу сайта.

            Итак, что изменилось за прошедшие 2 года? Кроме замены некоторых серверов и сетевого оборудования, не очень многое. Вот укрупненный список хардварной части, которая обеспечивает работу ресурса (выделены различия по сравнению с 2013 годом):

            • 4 Microsoft SQL Servers (новое железо для 2-х из них);
            • 11 Web-серверов IIS (новое оборудование);
            • 2 сервера Redis (новое оборудование);
            • 3 сервера Tag Engine (новое оборудование для 2-х из 3-х);
            • 3 сервера Elasticsearch (те же, старые);
            • 4 балансировщика нагрузки HAProxy (добавлено 2 для поддержки CloudFlare);
            • 2 брандмауэра Fortinet 800C (вместо Cisco 5525-X ASAs);
            • 2 маршрутизатора Cisco ASR-1001 (вместо маршрутизаторов Cisco 3945);
            • 2 маршрутизатора Cisco ASR-1001-x (новые!).

            Что нам необходимо, чтобы запустить Stack Overflow? Этот процесс не сильно изменился с 2013 года, но из-за оптимизации и нового железа, нам необходим только один web-сервер. Мы этого не хотели, но несколько раз успешно проверили. Вношу ясность: я заявляю, что это работает. Я не утверждаю, что это (запуск SO на единственном web-сервере) — хорошая затея, хотя каждый раз выглядит весьма забавно.
            Читать дальше →
          • ATmega16 + DS18B20 + LED + Matlab/Simulink = AR

              Задумал я как-то поиграться с датчиками DS18B20. Да не просто получить значения температуры (что умеет каждый), но и как-то ее визуализировать. Возникла простая идея. Ставим вебкамеру. Зажигаем светик на четном кадре, на не четном — тушим. Вычитаем картинку — остается только вспышка. По ней и ищем местоположение датчика, который физически привязан к светодиоду в пространстве. А дальше математическая обработка. Ну и все это в симулинке. Под катом описано как получить красивые картиночки. А для тех кто разбираться не желает — предлагаю посмотреть эксперименты в конце статьи.
              Подробности
            • Руководство по магическим методам в Питоне

              • Перевод
              • Tutorial
              Это перевод 1.17 версии руководства от Rafe Kettler.


              Содержание


              1. Вступление
              2. Конструирование и инициализация
              3. Переопределение операторов на произвольных классах
              4. Представление своих классов
              5. Контроль доступа к атрибутам
              6. Создание произвольных последовательностей
              7. Отражение
              8. Вызываемые объекты
              9. Менеджеры контекста
              10. Абстрактные базовые классы
              11. Построение дескрипторов
              12. Копирование
              13. Использование модуля pickle на своих объектах
              14. Заключение
              15. Приложение 1: Как вызывать магические методы
              16. Приложение 2: Изменения в Питоне 3


              Вступление


              Что такое магические методы? Они всё в объектно-ориентированном Питоне. Это специальные методы, с помощью которых вы можете добавить в ваши классы «магию». Они всегда обрамлены двумя нижними подчеркиваниями (например, __init__ или __lt__). Ещё, они не так хорошо документированны, как хотелось бы. Все магические методы описаны в документации, но весьма беспорядочно и почти безо всякой организации. Поэтому, чтобы исправить то, что я воспринимаю как недостаток документации Питона, я собираюсь предоставить больше информации о магических методах, написанной на понятном языке и обильно снабжённой примерами. Надеюсь, это руководство вам понравится. Используйте его как обучающий материал, памятку или полное описание. Я просто постарался как можно понятнее описать магические методы.
              Читать дальше
            • Мой подход к Class Based Views

              • Перевод
              Люк Плант (Luke Plant) — программист-фрилансер с многолетним стажем, один из ключевых разработчиков Django.

              Когда-то я писал о своей неприязни к Class Based Views (CBV) в Django. Их использование заметно усложняет код и увеличивает его объём, при этом CBV мешают применять некоторые достаточно распространённые шаблоны (скажем, когда две формы представлены в одном view). И судя по всему, я не единственный из разработчиков Django, придерживающийся такой точки зрения.

              Но в этом посте я хочу рассказать об ином подходе, который я применил в одном из проектов. Этот подход можно охарактеризовать одной фразой: «Создавайте свой собственный базовый класс».
              Читать дальше →
            • Собираем простое MariontteJS+ES6 приложение с помощью Brunch

                Здравствуйте. Я хотел бы рассказать как с помощью Brunch можно собрать MariontteJS+ES6 приложение.



                Сегодня уже 2016-й год и способов собирать приложения очень много. Ниже я предлагаю рассмотреть Brunch
                Читать далее
              • Что такое RESTful на самом деле

                • Перевод
                А ваше приложение — RESTful? Чтобы ответить на этот вопрос нужно сначала разобраться что такое RESTful. Бытует мнение, что отдавать правильные коды ответов в HTTP — это уже RESTful. Или делать правильные идемпотентные HTTP-запросы — это вообще очень RESTful. Мы в Хекслете сделали практический курс по протоколу HTTP (отличия версий, отправка форм, аутентификация, куки и пр.), и в нем мы стараемся рассказать о правильном использовании запросов, но нужно понимать, что RESTful это не про HTTP, это вообще не про протоколы интернета. Современный веб и взаимодействие между браузером и сервером с помощью HTTP и URI могут удовлетворять принципам RESTful, а могут и не удовлетворять.

                В сегодняшнем переводе — простое и понятное описание RESTful, и какой должна быть система, чтобы ее можно было так называть.

                Читать дальше →
              • Простой блог с комментариями на Django: разработка и развертывание для самых маленьких

                • Tutorial
                Данная статья предназначена для новичков в web-программировании и освещает вопросы разработки блога на Django с использованием Twitter Bootstrap и его развертывания на бесплатном хостинге PythonAnywhere. Я старался написать как можно более проще и понятнее. Более опытным пользователям данное чтиво не расскажет ничего нового, да и некоторые приемы возможно покажутся неэффективными.


                Читать дальше →
              • Цена использования фреймворков

                • Перевод
                Не так давно мне довелось выступать на конференции FFConf с докладом «Вам следует использовать <впишите нужную библиотеку/фреймворк>, это самое лучшее!». И основные мысли я решил изложить в публикации, в надежде, что это спровоцирует в профессиональной среде более широкую дискуссию о «стоимости» современных фреймворков на мобильных устройствах.

                Для желающих обратиться к оригиналу моего выступления вот видео:



                и слайды презентации: speakerdeck.com/paullewis/framework-here-its-the-bestestest.
                Читать дальше →
              • Использование comet сервера для реализации простого чата

                • Tutorial
                Comet — любая модель работы веб-приложения, при которой постоянное HTTP-соединение позволяет веб-серверу отправлять (push) данные браузеру без дополнительного запроса со стороны браузера.

                На схеме изображено место комет сервера в процессе работы.

                На схеме изображено место комет сервера в процессе работы.

                Читать дальше →