• Обзор кросс-платформенных решений для разработки мобильных приложений

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

      Кросс-платформенные фреймворки PhoneGap, Xamarin, Unity, Qt и Appcelerator Titanium, Telerik Platform на сегодняшний день занимают 80% рынка кросс-платформенной разработки для мобильных устройств.


      Читать дальше →
    • Руководство по работе с Redux

      • Translation
      • Tutorial
      Сегодня Redux — это одно из наиболее интересных явлений мира JavaScript. Он выделяется из сотни библиотек и фреймворков тем, что грамотно решает множество разных вопросов путем введения простой и предсказуемой модели состояний, уклоне на функциональное программирование и неизменяемые данные, предоставления компактного API. Что ещё нужно для счастья? Redux — библиотека очень маленькая, и выучить её API не сложно. Но у многих людей происходит своеобразный разрыв шаблона — небольшое количество компонентов и добровольные ограничения чистых функций и неизменяемых данных могут показаться неоправданным принуждением. Каким именно образом работать в таких условиях?

      В этом руководстве мы рассмотрим создание с нуля full-stack приложения с использованием Redux и Immutable-js. Применив подход TDD, пройдём все этапы конструирования Node+Redux бэкенда и React+Redux фронтенда приложения. Помимо этого мы будем использовать такие инструменты, как ES6, Babel, Socket.io, Webpack и Mocha. Набор весьма любопытный, и вы мигом его освоите!
      Читать дальше →
    • Reinforced.Typings — больше деталей

      • Tutorial
      И снова здравствуйте.
      Кто о чем, а я снова о Reinforced.Typings — своей библиотеке для генерации TypeScript-ового glue-кода из C#-сборок, краткое введение в которую я сделал в предыдущем посте. После чего немедленно получил ряд вопросов и комментариев (не только на Хабрахабре, к слову — многие из заинтересовавшихся просто на нем не зарегистрированы). За это, конечно, всем огромное спасибо, но исходя из проанализированной информации, я понял что одного краткого поста не достаточно, чтобы описать как и что реализуется. Получается что люди задают вопросы «а вот это вот поддерживается?» и каждому приходится объяснять раз за разом, одно и то же. Так что в этой статье я сделаю небольшой cheatsheet по атрибутам, fluent-конфигурации и расскажу про дополнительные возможности. В общем, милости просим. Осторожно, лонгрид и справочная информация!
      Читать дальше →
      • +16
      • 7.9k
      • 2
    • Как я перестал беспокоиться и полюбил React

      Предлагаю читателям «Хабрахабра» перевод статьи «How I learned to stop worrying and love React».

      Если вы спросите меня, что я думал о React два месяца назад, я бы сказал…
      Где мои шаблоны? Что этот сумасшедший HTML делает в моем JavaScript? JSX выглядит странно! Скорее! Сжечь это!



      Это потому, что я его не понял.

      Но я уверяю, React — это определенно правильный путь. Пожалуйста, выслушайте меня.
      Читать дальше →
    • Забудьте САР теорему как более не актуальную

      • Translation
      или «Прекратите характеризовать хранилища данных как CP или AP»

      capДжеф Ходжес в своем прекрасном посте «Заметки о распределенных системах для новичков» рекомендует использовать САР теорему для критики найденных решений. Многие, похоже, восприняли этот совет слишком близко к сердцу, описывая свои системы как «СР» (согласованность данных, но без постоянной доступности при сетевой распределенности), «АР» (доступность без согласованного состояния при сетевой распределенности), или иногда «СА» (означает «Я всё ещё не читал статью Коды (Coda Hale) почти 5-летней давности»).

      Я согласен со всеми пунктами статьи кроме того, что касается САР теоремы. Она слишком всё упрощает и слишком многие понимают её неверно для того, чтобы использовать для определения характеристик системы. Так что я прошу перестать ссылаться на САР теорему, говорить о ней и дать ей уже спокойно уйти на покой. Вместо неё мы должны использовать более точную терминологию для обсуждения различных компромиссов.

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

      САР использует слишком узкое определение


      Если вы хотите ссылаться на САР как на теорему (а не на расплывчатый концепт в маркетинговых материалах к вашей базе данных), вы должны быть точны. Математика требует точности. Доказательство сохраняется только если вы вкладывается в слова, то же самое значение, что было использовано при доказательстве. И оно опирается на очень точные определения:
      Еще 3000 слов увлекательного чтива
    • Прототип. От идеи до опытной партии. Литье в силикон

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


        Читать дальше →
      • Когда this == null: невыдуманная история из мира CLR

          Довелось как-то раз отлаживать вот такой код на C#, который «на ровном месте» падал с NullReferenceException:

          	public class Tester {
          		public string Property { get; set; }
          		public void Foo() {
          			this.Property = "Some string"; // NullReferenceException
          		}
          	}
          

          Да, вот на этой самой строчке с присвоением свойства падал NullReferenceException. Что за дела, думаю — неужели рантайм перестал проверять наличие экземпляра перед вызовом экземплярных методов?

          Как оказалось — в некотором роде да, перестал. Правда, и компилятор оказался не тем, за кого себя выдаёт, да и проверки вовсе не гарантированы рантаймом… Подробнее — под катом.
          Читать дальше →
        • ECMAScript 6

          • Translation
          Границы моего языка олицетворяют границы моего мира.
          — Людвиг Витгенштейн

          Последние несколько месяцев я пишу только ECMAScript 6 код, воспользовавшись трансформацией [1] в поддерживаемые в настоящее время версии JavaScript.
          Читать дальше
        • Краткая история освоения космоса



            За последние пол года на хабре появилось заметное количесво первоклассных постов о космосе, начал пожалуй Zelenyikot нашедший на марсе станцию Марс-3, продолжили Kamalesh, jeston, Sulentium и @DaryaZ. Некоторый итог подвелlozga, но мне кажется все эти посты несколько поверхностны и не отражают того уровня, который достигла наша космонавтика. По этому я собрался духом и написал очень длинный пост о подлинной истории освоения космоса — думаю приведенные мной факты позволят многим по-новому взглянуть на саму тему космоса. Писал сжато, по этому за пояснениями прошу в каменты.

            Существует известный парадокс – если вы находитесь внутри космического корабля летящего почти со скоростью света, время для вас замедляется. Такому кораблю нужно всего 25 лет, чтобы достигнуть видимого края вселенной, правда для оставшихся на земле эти два десятилетия растянутся в 14 миллиардов лет.

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

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

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



            Читать дальше →
          • Текущая картина образования

              Всё больше и больше встречаю в Сети и в СМИ оценки современного образования. Каждое мнение отрицает предыдущее и претендует на истину последней инстанции. И всё больше и больше запутываешься в новых терминах и определениях… Но определённо становится очевидным, что наступает смена парадигмы образования в целом… И тут как никогда кстати на помощь приходит Сеть с её безграничными возможностями — почему не использовать имеющийся инструмент?!!! Вот я и предлагаю провести первый этап исследования, направленный на выявление положительных и отрицательных образов наших университетов, а также образов университетов будущего. Не задумывайтесь глубоко над вопросами — пишите сразу то, что приходит в голову — для чего вы идёте в университет, что вам больше всего не нравится в университете и что нравится.
              До 30 ноября я буду собирать ваши мнения, а потом в течении 2х дней подытожу их и выложу на всеобщее обозрение (3 декабря, пятница). Картинка обещает быть интересной :)
              Прошу разослать анкету своему окружению. Заранее спасибо.
              университет
              Анкета
              Результаты работы будут обобщены при помощи сервиса wordle
            • HTC Desire: Беспроблемный «OTA-апдейт» до Froyo без WiFi/3G соединений

                В последнее время HTC, Motorola и другие производители с подачи Google начали практиковать OTA-апдейты прошивок. Теоретически подобный метод обновлений прошивки обязан облегчить жизнь пользователям, так как для обновления смартфона больше не нужно участие компьютера, после обновления сохраняются все настройки, приложения и многое другое. Однако на практике зачастую возникают затруднения.

                Итак, если у вас по какой-либо причине не выходит обновить свой смартфон Over The Air существует второй, вполне легальный способ прошить своего карманного друга. Метод прошивки телефона посредством SD-карты используют СЦ для восстановления окирпиченных телефонов.

                Для начала вам необходимо скачать подписанный zip-файл с серверов HTC:
                • Для тех, кто в августе успел обновится до версии 2.09.405.8 необходимо скачать следующую заплатку, которая обновит ваш смартфон до версии 2.10.405.2 — OTA_Bravo_HTC_EU_2.10.405.2-2.09.405.825 Мб
                • Если ваш смартфон работает под управлением стокового Eclair (1.21.405.2) для обновления на 2.10.405.2 необходимо скачать OTA_Bravo_HTC_EU_2.10.405.2-1.21.405.291.82 Мб
                Читать дальше →
              • Улучшаем производительность: boxing в .NET, которого можно избежать

                Мы в своем проекте занимаемся разработкой сервера на C#. Этот сервер должен выдерживать очень высокие нагрузки, по этой причине мы стараемся написать код как можно оптимальней. C# редко ассоциируют с высокой производительностью, но если с умом подходить к разработке, то можно достичь очень даже неплохого уровня.

                Одним из недешевых процессов с точки зрения производительности является boxing и unboxing. Напоминалку о том, что это такое, можно найти тут. Недавно я решил посмотреть весь IL код наших проектов и поискать инструкции box и unbox. Нашлось достаточно много участков, boxing'а в которых можно избежать легким движением руки. Все случаи, приводящие к ненужному boxing'у, очевидны, и допускаются по невнимательности в моменты концентрации на функциональности, а не на оптимизации. Я решил выписать наиболее часто встречающиеся случаи, чтобы не забывать о них, а затем автоматизировать их исправление. В данной статье и перечислены эти случаи.
                Читать дальше →
              • C#. Сортировка членов типа с помощью ReSharper


                Существуют некоторые соглашения касаемые структуры класса, и того, в каком порядке должны располагаться его члены.
                Вот, например, правила которые использует StyleCop, возможно, в вашей компании есть свои собственные.
                Поддерживать структуру вручную довольно тяжело, скучно и отнимает много времени, особенно когда в классе довольно большое количество свойств, полей, методов и.т.д.
                В этом посте речь пойдет о том, как с помощью ReSharper автоматизировать этот процесс.
                Читать дальше →
              • Моноиды и их приложения: моноидальные вычисления в деревьях

                  Приветствую, Хабрахабр. Сегодня я хочу, в своём обычном стиле, устроить сообществу небольшой ликбез по структурам данных. Только на этот раз он будет гораздо более всеобъемлющ, а его применения и практичность — простираться далеко в самые разнообразные области программирования. Самые красивые применения, я, конечно же, покажу и опишу непосредственно в статье.

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

                  Итак, на повестке сегодняшнего дня — моноиды и их основное применение для кеширования вычислений в деревьях.

                  Моноид как концепция


                  Представьте себе множество чего угодно, множество, состоящее из объектов, которыми мы собираемся манипулировать. Назовём его M. На этом множестве мы вводим бинарную операцию, то есть функцию, которая паре элементов множества ставит в соответствие новый элемент. Здесь и далее эту абстрактную операцию мы будем обозначать "⊗", и записывать выражения в инфиксной форме: если a и b — элементы множества, то c = ab — тоже какой-то элемент этого множества.

                  Например, рассмотрим все строки, существующие на свете. И рассмотрим операцию конкатенации строк, традиционно обозначаемую в математике "◦", а в большинстве языков программирования "+": "John""Doe" = "JohnDoe". Здесь множество M — строки, а "◦" выступает в качестве операции "⊗".
                  Или другой пример — функция fst, известная в функциональных языках при манипуляции с кортежами. Из двух своих аргументов она возвращает в качестве результата первый по порядку. Так, fst(5, 2) = 5; fst("foo", "bar") = "foo". Безразлично, на каком множестве рассматривать эту бинарную операцию, так что в вашей воле выбрать любое.

                  Далее мы на нашу операцию "⊗" накладываем ограничение ассоциативности. Это значит, что от неё требуется следующее: если с помощью "⊗" комбинируют последовательность объектов, то результат должен оставаться одинаковым вне зависимости от порядка применения "⊗". Более строго, для любых трёх объектов a, b и c должно иметь место:
                  (ab) ⊗ c = a ⊗ (bc)
                  Легко увидеть, что конкатенация строк ассоциативна: не важно, какое склеивание в последовательности строк выполнять раньше, а какое позже, в итоге все равно получится общая склейка всех строк в последовательности. То же касается и функции fst, ибо:
                  fst(fst(a, b), c) = a
                  fst(a, fst(b, c)) = a
                  Цепочка применений fst к последовательности в любом порядке всё равно выдаст её головной элемент.

                  И последнее, что мы потребуем: в множестве M по отношению к операции должен существовать нейтральный элемент, или единица операции. Это такой объект, который можно комбинировать с любым элементом множества, и это не изменит последний. Формально выражаясь, если e — нейтральный элемент, то для любого a из множества имеет место:
                  ae = ea = a
                  В примере со строками нейтральным элементом выступает пустая строка "": с какой стороны к какой строке её ни приклеивай, строка не поменяется. А вот fst в этом отношении нам устроит подлянку: нейтральный элемент для неё придумать невозможно. Ведь fst(e, a) = e всегда, и если ae, то свойство нейтральности мы теряем. Можно, конечно, рассмотреть fst на множестве из одного элемента, но кому такая скука нужна? :)

                  Каждую такую тройку <M, ⊗, e> мы и будем торжественно называть моноидом. Зафиксируем это знание в коде:
                  public interface IMonoid<T> {
                      T Zero { get; }
                      T Append(T a, T b);
                  }
                  

                  Больше примеров моноидов, а также где мы их, собственно, применять будем, лежит под катом.
                  Читать дальше →
                • Под капотом у Dictionary и ConcurrentDictionary

                  Некоторое время назад, я решил, что хочу знать больше подробностей о работе многопоточности в .NET и что я уделял этому незаслуженно мало внимания в прошлом. Информации на эту тему великое множество (отправной точкой я для себя выбрал этот раздел книги «C# in a nutshell»), но, как оказалось, только малая часть ресурсов пытаются объяснить что-то в деталях.

                  Каждый мастер должен знать свои инструменты, а что может использоваться чаще коллекций? Поэтому я решил сделать небольшой обзор многопоточных коллекций и начать с ConcurrentDictionary (беглый обзор уже встречался здесь, но его там совсем мало). Вообще, я несколько удивился, что такой статьи для .NET еще нет (зато хватает по Java).

                  Итак, поехали.
                  Читать дальше →
                • Построение масштабируемых приложений на TypeScript. Часть 1 — Асинхронная загрузка модулей

                  Идея данной статьи родилась после тяжелого рабочего дня при 30 градусах в офисе и тяжких раздумий и холиваров на тему: «А как должно строиться современное веб-приложение?»

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

                  О чем пойдет речь в данной статье? Я напишу (не)большое приложение на TypeScript, которое будет реализовывать модульную архитектуру, асинхронную загрузку модулей, абстрактную событийную модель и обновление состояния модулей по наступлению определенных событий. Эта статья будет выступать как бы дневником и журналом моих действий и размышлений. Моя личная цель — создать некоторый рабочий прототип, опыт создания которого я потом мог бы использовать в рамках реального проекта. Код будет писаться максимально аккуратно и близко к требованиям реальной разработки. Пояснения будут даваться так, будто это потом будут читать работающий под моим руководством джуниоры, которые вообще до этого никогда такие системы не писали.

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

                  Итак, дав себе и сообществу эти обещания, включив AC/DC и собравшись с мыслями я приступаю.
                  Читать дальше →
                • Автоматизация тестирования Web-приложений

                  • Tutorial


                  Автоматизация тестирования – место встречи двух дисциплин: разработки и тестирования. Наверное поэтому, я отношу эту практику к сложным, но интересным.

                  Путем проб и ошибок мы пришли к следующему технологическому стеку:
                  1. SpecFlow (опционально): DSL
                  2. NUnit: тестовый фреймворк
                  3. PageObject + PageElements: UI-абстракиця
                  4. Контекст тестирования (информация о целевом окружении, пользователях системы)
                  5. Selenium.WebDriver

                  Для запуска тестов по расписанию мы используем TFS 2012 и TeamCity.
                  В статье я опишу, как мы к этому пришли, типовые ошибки и пути их решения.
                  Читать дальше →
                • #FailOverConf — как это было, презентации и видео



                    4 апреля мы провели первую FailOver Conference — конференцию, целиком и полностью посвященную отказоустойчивости сайтов и их бесперебойной работе.

                    Целый день, более 7 часов, мы слушали доклады от разработчиков и архитекторов облачных сервисов, системных администраторов хостинг-провайдеров, опытных DBA, обсуждали их, спорили…

                    Тема оказалась очень важной и востребованной — более 1200 человек зарегистрировались на онлайн-трансляцию.

                    Конечно, сложно сразу «переварить» такой большой объем информации. К чему-то хочется вернуться позже, попробовать применить к конкретному проекту. Именно поэтому один из самых часто звучащих вопросов как из зала, так и в онлайне (в твиттере): «А будут ли опубликованы материалы?»

                    Да, конечно! Мы публикуем и презентации, и видео докладов, и с удовольствием делимся ими с вами!
                    Читать дальше →
                    • +22
                    • 11.6k
                    • 8
                  • Обзор JS-фреймворков. Путешествие через джунгли JavaScript MVC. Ч. 2

                    • Translation
                    (Окончание перевода статьи Эдди Османи о сравнении и выборе библиотеки для проекта со значительной ролью JS на клиенте.)
                    Содержание первой части:

                    ■ Что такое MVC или, лучше сказать, MV*?
                    ■ Когда нам нужен MV*-фреймворк JS?
                    ■ Где же мы будем нуждаться в MV*, а где нет?
                    ■ Проблема выбора: слишком много вариантов?
                    ■ TodoMVC: общее приложение для обучения и сравнения
                    ■ Предложенные нами критерии выбора фреймворка
                    ■ Dojo и усложнение фреймворков на JavaScript
                    ■ Коллекция TodoMVC (фреймворки, на которых сделаны реализации тестового приложения Todo)
                    Читать дальше →
                  • .NET Частичка правды о размещении объектов на Run-time

                    Как известно, в .NET память делится на две категории: стек (Stack) и управляемая куча (managed heap, далее просто куча). На стеке располагается ссылка(ObjectRef) на объект (ObjectInstance), который, в свою очередь, располагается в куче.

                    В данной статье речь пойдет о расположении объекта в куче.

                    Предполагается, что у читателя имеются знания о:
                    1. stack
                    2. managed heap
                    3. GC
                    4. Слабые ссылки (weak references)
                    Читать дальше →