• Пишем тестопригодный javascript

    • Translation
    [Прим. перев.]: предлагаю вашему вниманию перевод статьи Бена Черри, в прошлом разработчика Twitter. В этой статье он приводит несколько советов по написанию javascript кода, пригодного для тестирования.

    Культура разработки в Twitter требует написания тестов. У меня не было опыта тестирования Javascript до работы в Twitter, поэтому мне пришлось многому научиться. В частности, некоторые шаблоны программирования, которые я привык применять, о которых я писал и призывал к их использованию, оказались непригодными для тестирования. Поэтому я подумал, что стоит поделиться некоторыми наиболее важными принципами, которые я разработал для написания тестопригодного Javascript кода. Примеры, которые я привожу, основаны на QUnit, но могут быть применены к любому фреймворку для тестирования Javascript'а.

    Избегайте синглтонов


    Один из моих наиболее популярных постов был о том, как использовать javascript шаблон «Модуль» для создания синглтонов в вашем приложении. Этот подход может быть простым и полезным, но он создает проблемы для тестирования по одной простой причине: синглтон загрязняет состояние объекта между тестами. Вместо синглтона в виде модуля, следует создавать его как конструируемый объект и присваивать его экземпляру глобального уровня во время инициализации вашего приложения.
    Читать дальше →
  • Использование SQLite в Windows и Windows Phone приложениях на JavaScript

    • Translation


    Новым для Windows Phone 8.1 является возможность создавать и запускать приложения, написанные на JavaScript также, как на Windows 8.1. Тем не менее, есть некоторые отличия в специфике API, доступных для приложений на Windows Phone 8.1. Одним из таких отличий является отсутствие IndexedDB на телефоне. Это представляет трудности для JavaScript разработчиков универсальных приложений, которым требуется структурированное хранилище. В этой статье мы посмотрим, как создать компонент WinRT, позволяющий использовать SQLite из JavaScript. Также мы подготовили для вас пример приложения.
    Читать дальше →
  • Власти требуют у студентов исходный код js-майнера Tidbit


      Авторы программы Tidbit

      Через несколько часов начнутся слушания, где четверо студентов Массачусетского технологического института попытаются опротестовать судебную повестку с требованием раскрыть исходный код биткоин-майнера, созданного ими. Интересы 19-летнего Джереми Рубина (Jeremy Rubin) представляет адвокат Фонда электронных рубежей (EFF).

      Автор статьи в Wired считает, что всё это напоминает печальную историю Аарона Шварца. Его арестовали за взлом компьютерной системы и «кражу» 4 млн бесплатных научных статей, после чего MIT вместе с властями активно «прессовали» активиста.
      Читать дальше →
    • Почему вам не нужен sshd в Docker-контейнере

      • Translation
      • Tutorial
      Когда люди запускают своей первый Docker-контейнер, они часто спрашивают: «А как мне попасть внуть контейнера?» и ответ «в лоб» на этот вопрос, конечно: «Так запустите в нём SSH-сервер и приконнектитесь!». Цель этого топика — показать, что на самом деле вам не нужен sshd внутри вашего контейнера (ну, конечно, кроме случая, когда ваш контейнер собственно и предназначен для инкапсуляции SSH-сервера).

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

      Но давайте подумаем ещё.
      Читать дальше →
    • Локализация с AngularJS

      imageДобрый день, уважаемые Хабражители.

      AngularJS — отличный Framework для создания ваших сайтов. На Хабре уже достаточно много про него написано, но почему то ни разу не затрагивалась тема локализации приложений. Тем не менее, поддержка локализации в нем есть и сегодня мы попробуем с ней разобраться.

      Существует несколько способов локализации и мы рассмотрим несколько из них.
      Рассмотрим...
    • Трансдьюсеры в JavaScript. Часть вторая

        В первой части мы остановились на следующей спецификации: Трансдьюсер — это функция принимающая функцию step, и возвращающая новую функцию step.

        step⁰ → step¹
        

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

        result⁰, item → result¹
        

        Чтобы получить новый текущий результат в функции step¹, нужно вызвать функцию step⁰, передав в нее старый текущий результат и новое значение, которое мы хотим добавить. Если мы не хотим добавлять значение, то просто возвращем старый результат. Если хотим добавить одно значение, то вызываем step⁰, и то что он вернет возвращаем как новый результат. Если хотим добавить несколько значений, то вызываем step⁰ несколько раз по цепочке, это проще показать на примере реализации трансдьюсера flatten:

        function flatten() {
          return function(step) {
            return function(result, item) {
              for (var i = 0; i < item.length; i++) {
                result = step(result, item[i]);
              }
              return result;
            }
          }
        }
        
        var flattenT = flatten();
        
        _.reduce([[1, 2], [], [3]], flattenT(append), []); // => [1, 2, 3]
        

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

        В итоге получается, что при обработке каждого элемента, одна функция step, вызывает другую, а та следующую, и так до последней служебной функции step, которая уже сохраняет результат в коллекцию (append из первой части).

        Итак, сейчас мы можем:
        1. Изменять элементы (прим. map)
        2. Пропускать элементы (прим. filter)
        3. Выдавать для одного элемента несколько новых (прим. flatten)

        Читать дальше →
      • Реанимация серверов Ubuntu на Hetzner или немного полезных команд

        • Tutorial


        Этот небольшой пост-шпаргалка предназначен для тех у кого внезапно в ходе неудачного эксперимента или обновления перестал пинговаться сервер, отвалился ssh и прочее. Проще говоря он о восстановлении сервера после обновлений, взломов и тому подобного. По моим ощущениям последнее бывает гораздо реже.
        Так что кому интересна эта тема прошу под кат.
      • [Перевод] Проблема конструкторов JavaScript и три способа её решения

        Введение


        Как известно, создать новый объект в JavaScript можно используя функцию-конструктор следующего вида:

        function Fubar (foo, bar) {
          this._foo = foo;
          this._bar = bar;
        }
        
        var snafu = new Fubar("Situation Normal", "All Fsked Up");
        


        Когда мы вызываем функцию-конструктор при помощи ключевого слова new , то получаем новый объект, а контекст его конструктора устанавливается на сам объект. Если мы явно не возвращаем ничего из конструктора, то получаем сам объект в качестве результата. Таким образом, тело функции конструктора используется для инициализации вновь созданного объекта, прототипом которого будет содержимое свойства prototype конструктора, так что можно писать следующим образом:

        Fubar.prototype.concatenated = function () {
          return this._foo + " " + this._bar;
        }
        
        snafu.concatenated()
          //=> 'Situation Normal All Fsked Up'
        


        Используя оператор instanceof можно убедиться в том, что объект был создан при помощи определенного конструктора:

        snafu instanceof Fubar
          //=> true
        


        (Заставить работать instanceof «неправильно» возможно при в случаях с более продвинутыми идиомами, или же если вы — вредный тролль, собирающий исключения языка программирования и получающий наслаждение, истязая ими соискателей на собеседованиях. Однако, для наших целей instanceof работает достаточно хорошо.)
        Читать дальше →
      • Django + API Вконтакте: постим записи с вложениями, получение списка групп и записей

        image


        Доброго времени суток, Хабр!

        Недавно разрабатывала сайт на python/django и нужна была возможность использования API Вконтакте. А именно:

        • Постинг статей с сайта на страницу во Вконтакте, а также в выбранные группы (в которых состоял администратор);
        • Возможность прикрепления документов и картинок к записям;
        • Получение списка групп и записей с помощью обновляющегося скрипта и загрузка всего этого в админку django.

        Собственно, для администратора управление этим функционалом осуществляется через админку.

        Расскажу по шагам реализацию этого функционала.
        Читать дальше →
      • Отладка и оптимизация скриптов gstreamer на примере онлайн трансляции (live streaming)

        Gstreamer — самая популярная *nix библиотека для работы с видео, которая является основой для большинства популярных приложений (основной список можно найти здесь).

        image

        Однако, столь гибкий инструмент требует тонкого подхода для стабильной и эффективной работы.
        Все действия будут рассмотрены на примере онлайн HD трансляции с HDMI входа по RTMP с помощью blackmagic intensity pro, Debian Linux, gstreamer и Nginx.
        Читать дальше →
      • Календарь событий PHP + Javascript

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

        Задача вроде бы не сложная, но среди немногочисленных решений в интернете я не нашел подходящего по следующим причинам: слишком сложный и непонятный код, медленные запросы к БД (это особенно ощущается, если в базе много записей), использование библиотеки jQuery, к которой я отношусь не очень хорошо.

        Итак, к плюсам моего календаря можно отнесли следующее:

        1. Весь код помещается в 200 строчек и состоит из одного файла, который подключается через include
        2. Скрипт состоит из чистого php + javascript без использования библиотеки jQuery
        3. Используются простые и оптимизированные запросы к БД
        4. Подгрузка следующего (предыдущего) месяца происходит через AJAX

        Теперь обо всем по-порядку.
        Читать дальше →
      • HTML-формы. Взгляд бэкенд-разработчика

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

        Вводная часть несколько растянулась и в итоге вылилась в отдельную небольшую статью, которая, по моему мнению, может быть интересна и другим бэкенд-разработчикам (не только PHP или Symfony).
        Читать дальше →
      • Объектно-ориентированная охота на мамонта (записки делопроизводителя)

          Объектно-ориентированная охота на мамонта (записки делопроизводителя).

          При написании статьи ни один мамонт не пострадал.

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

          Как бы описал бизнес-аналитик охоту на мамонта, если бы мудрые предки его вовремя не съели?
          Читать дальше →
          • –6
          • 2.6k
          • 7
        • Дайджест интересных материалов для мобильного разработчика #70 (8-14 сентября)

            Конечно же, новости этой недели связаны по большей части с Apple. Компания презентовала два новых iPhone, мобильный кошелек Pay и часы Watch, обновила свой портал для разработчиков, начала принимать приложения для iOS 8, запустила TestFlight и новую мобильную аналитику. Но и кроме этого есть интересная история открытия студии мобильной разработки в Питере, новый кейс от PapaBubaDiop, слухи о покупке Mojang и продаже Unity.

            Читать дальше →
          • Букмарклет: разбор существенных моментов, часть третья, резервная

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

            Напомним, вкратце логику работы «навороченного» букмарклета:
            1. Кликом по сохраненной в закладках браузера ссылке, вызывается на выполнение небольшой (до 2000 символов) javscript-код, основная задача которого организовать загрузку javascript-кода выполняющего основную работу букмарклета
            2. Основная часть букмарклета после загрузки выполнят всю работу.
            3. Если основную часть букмарклета невозможно подгрузить – основную часть работы, выполняет резервная часть букмарклета, как правило, в урезанном виде.

            Читать дальше →
          • Дайджест интересных материалов из мира веб-разработки и IT за последнюю неделю №125 (8 — 14 сентября 2014)

              Предлагаем вашему вниманию подборку с ссылками на полезные ресурсы, интересные материалы и IT-новости


              Читать дальше →
              • +42
              • 34.2k
              • 5
            • Вывод видео с нескольких web-камер на одной странице

              • Tutorial
              Как-то раз я приуныл, делать ничего не хотелось, и тут я вспомнил, что в детстве мне сильно хотелось иметь пульт видео наблюдения, как у какого-то злодея из кино, который сидит в темной комнате и хохочет, наблюдая за беспомощными людишками, которые пытаются найти выход. Ну и освежив свои детские воспоминания, я решил воплотить их в жизнь, ну ту часть с пультом наблюдения, без людишек. И тут моим другом стал шагающий семимильными шагами HTML5, а если точнее Stream API.
              Так как я раньше уже использовал getUserMedia для захвата звука с микрофона, я подумал, что с видео тоже не будет никаких проблем, но они все же вылезли на свет. Т.е. проблем с самим захватом видео-потока не было, а вот с одновременным выводом данных с нескольких источников на одной странице оказалось не все так просто, как хотелось.

              Итак, начнем с самого начала, а именно с захвата и вывода видео с одного источника. Для этого мы будем использовать ф-ю getUserMedia, которая поддерживается во всех нормальных браузерах старших версий (Stream API), ну разумеется кроме IE.
              Читать дальше →
            • Сюрреализм на JavaScript. Советы по разработке на NodeJS

                Привет, Хабра!

                Пол года назад я подумал: «А может книгу написать?», и таки написал.



                Все документы оформлены, страницы сверстаны, а тираж — отпечатан. Я не буду клянчить у вас деньги на кикстартере или предлагать что-либо купить, а вместо этого попытаюсь заинтриговать советами по разработке на NodeJS в целях пиара и привлечения внимания к книге.
                Читать дальше →
              • Yii + WordPress = <3, или Увлекательный эксперимент получения Франкенштейна

                • Tutorial
                Всем привет. Я — Денис Мельский. Работаю PHP Developer в DataArt. Область моих профессиональных интересов — Web Development и Linux. Сегодня я хотел бы поговорить с вами о «скрещивании ежа с ужом».

                image

                Intro


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

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

                Один из вариантов, который я нашел проводя исследование, на эту тему— скрещивание WordPress и Yii.

                Читать дальше →
              • Готовое решение доступного видеоплеера на HTML5

                  Видеоконтент уже прочно вошёл в мир Интернета и без него уже трудно представить глобальную сеть. Тем не менее, технологии встраивания видео в гипертекстовые документы за прошедшее время прошли определённую эволюцию: от RealPlayer к QuickTime и Flash, а в настоящий момент до встроенной поддержки видео в HTML5. Тем не менее, всё это время различные реализации видеоплееров страдали как от проблем кроссплатформенности и кроссбраузерности, так и от низкого или вообще нулевого уровня accessibility. И если способы борьбы с первой группой проблем в целом понятны и существуют в форме готовых решений, то вот проблемы доступности для подавляющего большинства web-разработчиков и без того, как правило, сложны для понимания, а в отношении видео совсем оставались загадкой. Однако, к счастью, появилось готовое решение и второй проблемы, так что все желающие смогут обеспечить своим пользователям полностью доступный видеоплеер и без глубоких компетенций в web accessibility.
                  Читать дальше →