• Как мы готовили Crystal к production

      К версии 0.23 язык представлял собой весьма наивный концепт быстрого и простого языка.

      И это было очень удобно при разработке микросервисов, таких же простых, как на Ruby, но более быстрых, чем на Go (в большинстве применений).

      К сожалению, в языке (вернее, в его стандартной библиотеке) нашлось несколько проблем, мешающих использовать его в современном мире. Основная проблема — HashDoS.

      Я подошёл к этому с одной стороны, реализовав нормализацию чисел, например, но тут свыше пришел ангел по имени @funny-falcon, и уютный мирок Crystal офигел. Один pull request, учитывающий особенности LLVM, генерации хэшей, сами хэши, JSON и кучу иного — стал предметом обсуждений более чем на 200 комментариев, что для маленького проекта вообще нонсенс.

      В итоге pull request закрыт (дикая нагрузка).

      Но почти все его идеи уже реализованы и находятся в Crystal master.

      Теперь на нем уже можно писать код, который можно отдавать наружу.
    • Высокопроизводительные сервисы на Crystal, введение от новичка

        Введение


        DISCLAIMER

        мнение автора может не совпадать с вашим мнением, добро пожаловать в комментарии.


        В доисторические времена высокопроизводительные Web-приложения можно было писать, в основном, на C или C++. Поддерживать такие приложения было не просто дорого, а очень дорого.


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


        В первую очередь термины "производительность" и "надежность" относятся к Erlang. В своей нише он великолепен, но синтаксис заставляет желать лучшего. Собственно, именно поэтому появился Elixir, но речь сейчас не об этой экосистеме.


        Если же немного снизить планку надежности, то здесь перед нами широкий выбор, включая Node, Go, Nim и Crystal. Можно взглянуть на типичные сравнительные данные по производительности, включая более обширные.


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


        При это Node предлагает всем понятный язык программирования (и вариации на тему), но динамическая типизация снижает производительность в несколько раз относительно других претендентов.


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


        Так почему же Crystal?

        Читать дальше →
      • Отправка электронной почты в формате HTML

          Введение


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


          Основные нюансы при формировании таких писем:


          • Все стили должны встраиваться (inline) в виде атрибута style для конкретного HTML-элемента.
          • Все изображения должны встраиваться, либо как отдельные вложения в в письме, либо в виде base64-кодированных данных (второе банально удобнее).
          • Письмо должно поддерживать DKIM (настройка мэйлера), а домен отправителя — содержать SPF-запись.
          Читать дальше →
        • BabelFish — полиглот в мире JavaScript

            BabelFish


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

            Например, в REG.RU на сегодня в словарях более 15000 фраз, из которых порядка 200 используют склонение, и более 2000 используют подстановку переменных. Каждый день добавляется не менее 10 фраз. И это при том, что мы пока только начали локализацию сайта и впереди планы на новые языки.

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

            DON'T PANIC.

            Недавно был опубликован пакет BabelFish 1.0, предназначенный для интернационализации JavaScript-приложений.

            Идеи, лежащие в его основе, настолько пришлись нам по душе, что мы даже перенесли их на Perl в виде CPAN-модуля Locale::Babelfish, и используем это для Perl-приложений. Но вернёмся к JavaScript-реализации.
            Читать дальше →
          • Watir WebDriver как средство автоматизации тестирования

              Недавняя статья про WebDriver напомнила мне немного рассказать об используемом нами комплексе для автоматизации тестирования Web-приложений.

              Итак, в основе тестов лежит лежит связка RSpec + Watir WebDriver (для Rails-приложений более уместно будет взглянуть в сторону Capybara). При поддержке Bundler и локальных WebDrivers осуществляется лёгкая инсталляция на рабочем месте тестировщика (установить Ruby 1.9, Rubygems, Bundler, и выполнить bundle install). Исходник Gemfile:

              source :rubygems
              
              gem "watir-webdriver", "~>0.6.1"
              gem "rspec-core", "~> 2.0"
              gem "rspec-expectations", "~> 2.0"
              gem "rr", "~> 1.0"
              gem "ci_reporter", "~> 1.7"
              


              За счет гема ci_reporter осуществляется интеграция с Jenkins CI, а за счёт гема parallel_tests и Selenium Grid распараллеливание тестов (на сегодня parallel tests пока не используются в production).

              Вот пример теста:

              describe "FirstSite" do
                before(:all) do
                  site! "first"
                end
              
                # returns true on success; otherwise false.
                def login_as(data)
                  browser.rel_goto "/"
                  browser.title.should include 'example.com'
                  browser.text_field(:id => 'login').set data[:login]
                  browser.text_field(:id => 'password').set data[:password]
                  submit_button = browser.button(:id => 'submit')
                  submit_button.click
                  browser.url =~ %r{/welcome$}
                end
              
                def logout
                  browser.rel_goto "/"
                  browser.button(:id => 'logout').click
                end
              
                describe :login do
                  auth = fixture :auth
              
                  describe :successful do
                    after(:each) do
                      logout
                    end
              
                    auth.keys.select { |key| key.kind_of?(Symbol) }.each do |key|
                      next  if key == :wrong
              
                      it "Logging in as #{key} should be OK" do
                        login_as(auth[key]).should be_true
                      end
                    end
                  end
              
                  describe :wrong do
                    it "Logging in with wrong credentials should fail" do
                      login_as(auth[:wrong]).should_not be_true
                    end
                  end
                end
              end
              
              


              Тестируемые сайты и способ тестирования определяются в настройках.
              Читать дальше →
            • Строим биндинги из Ruby к C-библиотеке

                На днях нужно было построить биндинги к библиотеке libftdi, которая обеспечивает взаимодействие с чипами FTDI (чипы для преобразования последовательной передачи данных по RS-232 или уровней TTL в сигналы шины USB, для того чтобы дать возможность современным компьютерам использовать устаревшие устройства © Wikipedia).

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

                У FFI есть несколько достоинств, которые сыграли в его пользу:
                • Поддержка интерпретаторов MRI Ruby 1.9, MRI Ruby 1.8, JRuby, ограниченная поддержка Rubinius;
                • Поддержка платформы Windows (наряду с другими);
                • Отсутствие необходимости компиляции биндингов;
                • Удобный язык описания биндингов.

                Репозиторий биндингов для Ruby.
                Читать дальше →
                • +13
                • 2,1k
                • 3
              • Инструментирование Google Chrome через WebSocket API

                • Перевод
                image Взаимодействие с браузерами никогда не было работой для слабонервных: около полудюжины различных API, различные механизмы IPC, и разные возможности у разных поставщиков. Такие проекты, как WebDriver, пытаются абстрагироваться от этой сложности, к тому же в Сети можно найти десятки других «безголовых» драйверов, использующих WebKit или иные движки. В настоящее время в работе даже находится спецификация W3C на WebDriver.

                Инструментирование Google Chrome


                Тем не менее, в то время, как создание общего решения является сложной задачей, оказалось, что инструментирование Chrome очень просто, — как я недавно обнаружил при исследовании некоторых вопросов, связанных с сетевыми задержками. Начиная с 18 версии, Chrome теперь поддерживает протокол удалённой отладки v1.0, который предоставляет все возможности браузера с помощью обычного WebSocket!
                /Applications/Path To/Google Chrome --remote-debugging-port=9222 # OSX
                $> curl localhost:9222/json
                

                [ {
                   "devtoolsFrontendUrl": "/devtools/devtools.html?host=localhost:9222&page=1",
                   "faviconUrl": "",
                   "thumbnailUrl": "/thumb/chrome://newtab/",
                   "title": "New Tab",
                   "url": "chrome://newtab/",
                   "webSocketDebuggerUrl": "ws://localhost:9222/devtools/page/1"
                } ]
                
                Читать дальше →
                • +33
                • 7,1k
                • 8
              • WebSockets в Windows 8 Consumer Preview

                • Перевод
                В Windows 8 CP и Server Beta все клиенты и сервера Microsoft WebSocket, включая IE10, сейчас поддерживают финальную версию протокола IETF WebSocket. Кроме того, IE10 реализует предварительную рекомендацию W3C WebSockets API.

                WebSockets стабильны и готовы к тому, чтобы разработчики начали создавать инновационные приложения и сервисы. Эта статья представляет собой простое введение в W3C WebSockets API и ниже расположенный протокол WebSocket. Обновленная демонстрация Flipbook использует последние версии API и протокола.

                В моей предыдущей статье я описал сценарии использования WebSockets:
                WebSockets позволяют Web-приложениям выполнять доставку нотификаций и обновлений в реальном времени, прямо в браузер. Разработчики столкнулись с проблемами, связанными с необходимостью обходить ограничения персоначальной модели взаимодействия HTTP вида запрос-ответ, чей дизайн не предназначен для сценариев реального времени. WebSockets позволяют браузерам открывать двухсторонний, полнодуплексный канал коммуникаций с сервисами на стороне сервера. Каждая из сторон может использовать этот канал для немедленной доставки данных другой стороне. Сегодня сайты, начиная с социальных сетей и игр, заканчивая финансовыми сайтами, могут предоставить лучшие сценарии реального времени, чем ранее, в идеале используя одну и ту же разметку в различных браузерах.

                Со времени публикации той статьи в сентябре 2011 года рабочие группы достигли важного прогресса. Протокол WebSocket теперь стал стандартным протоколом, предложенным IETF. К тому же W3C WebSockets API теперь является кандидатом-рекомендацией W3C.
                Читать дальше →
              • Быстрое развертывание среды разработки

                  Чтобы избежать больших затрат на развертывание сред разработки и тестирования, приближенных к среде эксплуатации (development stage vs production stage parity), всё большую популярность приобретает виртуализация сред.

                  В этой статье я расскажу, как создавал соответствующую репродуцируемую среду разработки на примере своего проекта runit-man с использованием Vagrant.
                  Читать дальше →
                  • +21
                  • 71,4k
                  • 7
                • Создание гемов — Руководство

                    Хотя на Хабре уже проскакивали статьи о создании гемов, они либо содержат устаревшую, либо неполную информацию.

                    Как же на самом деле надо создавать, развивать и публиковать свои гемы?

                    Современный подход заключается в использовании Bundler совместно с другими инструментами, такими, как Git, YARD и RSpec-2.
                    Читать дальше →