• Flipper Zero — как выйти на Кикстартер сидя на карантине на даче

      Flipper Zero крупным планом

      Flipper Zero — проект карманного мультитула для хакеров в формфакторе тамагочи, который я разрабатываю с друзьями. Предыдущие посты [1],[2],[3]

      Я до сих пор не могу в это поверить. Это самая волнительная статья, которую я когда-либо писал. Мы прошли огромный путь: два раза полностью меняли электронику Флиппера, выживали при блекауте и закрытых границах из-за коронавируса, переносили компанию из Гонконга в США, с трудом прошли все проверки и верификации и НАКОНЕЦ ГОТОВЫ К ЗАПУСКУ ФЛИППЕРА НА КИКСТАРТЕРЕ! Сейчас мне осталось только нажать кнопку «Старт».

      Внутри я расскажу: через что нам пришлось пройти, что нужно для выхода на Кикстартер, как мы за две недели зарегистрировали компанию в США и открыли банковский счет, как Stripe отказывался подтверждать нашу компанию и что будет дальше.
      Читать дальше →
    • МЭМС акселерометры, магнитометры и углы ориентации



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

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

      TL;DR: Описан небольшой скрипт для Octave/MATLAB, позволяющий оценить ошибки расчёта углов ориентации по измерениям МЭМС акселерометров и магнитометров. На входе скрипта — параметры датчиков из даташитов (и/или погрешности калибровки). Статья может быть полезна тем, кто начинает использовать инерциальные датчики в своих устройствах. Небольшой ликбез по датчикам прилагается. Ссылка на гитхаб тоже.
      Вот как мы решили эту задачу:
    • Заметки о жизни в США

      image


      Недавно в корпоративном блоге Parallels выходила статья, где приводились размеры оплаты труда разработчиков на западе со словами "в любом случае российские зарплаты пока не дотягивают до европейских". Частое столкновение с тем, как люди очень выборочно сравнивают условия жизни поросенка Петра и тех, кто не уехал, побудили поделиться некоторыми наблюдениями о жизни в США изнутри. Цель данного поста — подтолкнуть подходить к вопросу комплексно и делать сравнение яблок с яблоками, а не точечно сравнивать то, что выгодно, и закрывать глаза на остальные важные аспекты. Если вам покажется, что в данной статье есть иные подтексты — прошу списать это на то, что "чукча — не писатель" и по возможности игнорировать их.

      Читать дальше →
    • Arend – язык с зависимыми типами, основанный на HoTT (часть 1)

        В данном посте мы поговорим о только что выпущенном JetBrains языке с зависимыми типами Arend (язык назван в честь Аренда Гейтинга). Этот язык разрабатывался JetBrains Research на протяжении последних нескольких лет. И хотя репозитории уже год назад были выложены в открытый доступ на github.com/JetBrains, полноценный релиз Arend случился лишь в июле этого года.

        Мы попробуем рассказать, чем Arend отличается от существующих систем формализованной математики, основанных на зависимых типах, и о том, какая функциональность уже сейчас доступна его пользователям. Мы предполагаем, что читатель настоящей статьи в целом знаком с зависимыми типами и слышал хотя бы про один из языков, основанных на зависимых типах: Agda, Idris, Coq или Lean. При этом мы не рассчитываем, что читатель владеет зависимыми типами на продвинутом уровне.

        Для простоты и конкретности наш рассказ об Arend и гомотопических типах будет сопровождаться реализацией на Arend простейшего алгоритма сортировки списков — даже на этом примере можно почувствовать отличие Arend от Agda и Coq. На Хабре уже есть ряд статей, посвященных зависимым типам. Скажем, про реализацию сортировки списков методом QuickSort на Agda есть вот такая статья. Мы будем реализовывать более простой алгоритм сортировки вставками. При этом основное внимание уделим конструкциям языка Arend, а не самому алгоритму сортировки.
        Читать дальше →
      • 9 советов по использованию библиотеки Cats в Scala

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

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


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

          Разработка программ высокого качества подразумевает, что программа и её части подвергаются тестированию. Классическое модульное (unit) тестирование подразумевает разбиение большой программы на маленькие блоки, удобные для тестов. Либо, если разработка тестов происходит параллельно с разработкой кода или тесты разрабатываются до программы (TDD — test driven development), то программа изначально разрабатыватся небольшими блоками, подходящими под требования тестов.


          Одной из разновидностей модульного тестирования можно считать propery-based testing (такой подход реализован, например, в библиотеках QuickCheck, ScalaCheck). Этот подход основан на нахождении универсальных свойств, которые должны быть справедливы для любых входных данных. Например, сериализация с последующей десериализацией должна давать такой же объект. Или, повторная сортировка не должна менять порядок элементов в списке. Для проверки таких универсальных свойств в вышеупомянутых библиотеках поддерживается механизм генерации случайных входных данных. Особенно хорошо такой подход работает для программ, основанных на математических законах, которые служат универсальными свойствами, справедливыми для широкого класса программ. Есть даже библиотека готовых математических свойств — discipline — позволяющая проверить выполнение этих свойств в новых программах (хороший пример повторного использования тестов).


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


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

          Читать дальше →
        • Виртуальная студия и захват движения используя Htc Vive

          Привет всем! Как то раз, я загорелся одной идеей: Что будет, если попробовать совместить создание видео и Виртуальную реальность, а именно, передавать движения, на виртуального персонажа и в дальнейшем иметь возможность записывать ролики. В итоге, вот уже третий месяц, длится разработка данного концепта. Я программист-самоучка, начинал все не имея какого-либо опыта в этой сфере, но благо, в интернете полно информации на все случаи жизни. Делается все на Unity, с использованием C#.

          Вот небольшой шоукейс из того, что уже получилось:

          image

          Ваши движения передаются на виртуального персонажа.
          Читать дальше →
        • Обратная сторона Agile

          imageХочу поделиться историей, ну и заодно услышать мнения других участников хабрасообщества. Это небольшая история о том, как агрессивное внедрение методологии разработки Agile (Scrum) в отдельно взятой российской IT компании послужило началом исхода из компании лучших разработчиков. Обычно в статьях про Agile рассказывают, какая это классная и полезная методология, и вообще — это лучшее, что было придумано в этом направлении. Возможно, эта статья поможет взглянуть на Agile с другой стороны, ведь у любой монеты, как оказалось, есть две стороны.

          В общем, в 2010-м году была основана одна российская компания (что-за компания конкретизировать смысла нет), работала она в сфере IT-разработки (ПО для банковских продуктов).
          Читать дальше →
        • Про ScalaCheck

          • Tutorial

          Про ScalaCheck


          Часть 1. Введение.


          ScalaCheck — это комбинáторная библиотека, значительно облегчающая написание модульных тестов на Scala. В ней используется подход property-based тестирования, впервые реализованный в библиотеке QuickCheck для языка Haskell. Существует множество реализаций QuickCheck: как для Java, C, а так же других языков и платформ. Использование данного подхода позволяет значительно сократить время на разработку тестов.


          Эта серия статей во многом похожа на мою предыдущую, посвященную Parboiled, поэтому и структура повествования будет похожей. Я расскажу вам, для чего всё это нужно, затем мы научимся смотреть на мир сквозь призму свойств и генераторов, а потом перейдём к более сложным вещам. Заинтересовало? Прошу под кат.

          Читать дальше →
          • +11
          • 6,8k
          • 7
        • Классы типов в Scala (с небольшим обзором библиотеки cats)

            При слове "полиморфизм" сразу вспоминается объектно-ориентированное программирование, в котором полиморфизм является одним из столпов (Полиморфизм для начинающих). (Причём, по-видимому, более важным, чем другие столпы.) Оказывается, что можно достичь сходного эффекта и другим путём, который в ряде случаев оказывается более предпочтительным. Например, с помощью классов типов можно приписать новые возможности уже существующим типам, у которых нельзя изменить предка, или, используя тип данных с несовместимыми классами, "решить" проблему множественного наследования.

            Читать дальше →
          • Про Parboiled

            Часть 1. Почему Parboiled?


            Сегодня, в свете бурного роста популярности функциональных языков программирования, всё чаще находят себе применение комбинаторы парсеров — инструменты, облегчающие разбор текста простым смертным. Такие библиотеки, как Parsec (Haskell) и Planck (OCaml) уже успели хорошо себя зарекомендовать в своих экосистемах. Их удобство и возможности в своё время подтолкнули создателя языка Scala, Мартина Одерски, внести в стандартную библиотеку их аналог — Scala Parser Combinators (ныне вынесены в scala-modules), а знание и умение пользоваться подобными инструментами — отнести к обязательным требованиям к Scala-разработчикам уровня A3.

            Эта серия статей посвящена библиотеке Parboiled — мощной альтернативе и возможной замене для Scala Parser Combinators. В ней мы подробно рассмотрим работу с текущей версией библиотеки — Parboiled2, а также уделим внимание Parboiled1, так как большая часть существующего кода всё ещё использует именно её.

            Структура цикла:


            Читать дальше →
            • +20
            • 9,6k
            • 5
          • Строго типизированные комбинаторы для построения парсера и синтезатора естественного языка

              Известные ParserCombinator'ы и Parboiled предназначены исключительно для разбора формальных языков. Мы же решаем задачу разбора естественного языка и при этом хотим, чтобы с помощью той же грамматики можно было осуществлять синтез фраз на естественном языке, отражающих требуемую нам семантику. Было бы удобно иметь возможность описывать языковые конструкции вместе с правилами абстрагирования/конкретизации.

              Например,

              1. Преобразование числительных в число («десять» -> 10:Int)
              2. и обратно (10:Int -> «десять» («десятый», «десяток» ...))
              3. Преобразование числительных вместе с единицей измерения («десять рублей» <-> NumberWithMeasurement(10, RUB))
              4. Неполный адрес («ул. Яблочная» <-> Address(street=«Яблочная»))
              5. Адрес в пределах города («улица Яблочная дом сто двадцать три квартира сорок пять» <-> Address(street=«Яблочная», building=123, flat=45))
              6. Телефон (256-00-21 («двести пятьдесят шесть ноль ноль двадцать один») <-> NumericalSequence(256,0,0,21))

              Причём хотелось бы иметь следующие системные свойства:

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

              Под катом — описание подхода, реализованного в библиотеке synapse-typed-expressions. Рассмотрены только числительные, но подход естественным образом распространяется на другие вышеупомянутые формальные языковые конструкции.
              Читать дальше →
              • +12
              • 6,7k
              • 2
            • День свободы программного обеспечения



                Сегодня особенный день для всех поклонников идей Ричарда Столлмана. Этот человек уже с 1983 года является главным идеологом движения за свободное программное обеспечение. И сегодня отмечается юбилейный, десятый ежегодный день этой самой свободы.

                Несмотря на то, что критерии свободного программного обеспечения выглядят довольно дико в условиях повсеместного капитализма, это не помешало появлению и успешному развитию таких всем известных проектов, как GNU/Linux, веб-сервер Apache и движок MediaWiki, на котором работает Wikipedia. И это лишь малая часть, а в целом программ, распространяющихся как свободные, просто несметное количество. Сам я в прошлом являлся ярым сторонником открытого ПО, в частности, все началось c Mandrake Linux, а закончилось Arch Linux и безудержным допиливанием конфигов тайлового оконного менеджера Awesome. В то время даже обратил в оную религию некоторых своих друзей и поставил Линуксы на ноутбуки родителям. Сейчас же ярость поутихла, и я спокойно чувствую себя, сидя за свежей версией Ubuntu. :)

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

                У нас в Mail.Ru Group тоже есть немало программистов, участвующих в создании и улучшении свободного программного обеспечения. Буквально в прошлом посте в нашем блоге Александр Емелин рассказал про свой открытый проект Centrifuge. Специально к празднику мы попросили рассказать и других сотрудников о том, как СПО помогает им в работе, и о некоторых своих работах, так что слово авторам.
                Читать дальше →
              • Строго типизированное представление неполных данных

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

                  В обновлённом варианте библиотеки synapse-frames исключительно просто описываются иерархические структуры данных и представляются любые подмножества таких структур.

                  Читать дальше →
                  • +17
                  • 7,2k
                  • 2
                • Конструирование типов в Scala

                    При построении многослойных («enterprise») систем часто оказывается, что создаются ValueObject'ы (или case class'ы), в которых хранится информация о каком-либо экземпляре сущности, обрабатываемом системой. Например, класс

                    case class Person(name: String, address: Address)
                    


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


                    так и некоторыми недостатками:
                    • если сущностей много, то таких классов также становится довольно много, а их обработка требует много однотипного кода (copy-paste);
                    • потребности отдельных слоёв системы в метаинформации могут быть представлены аннотациями к свойствам этого объекта, но возможности аннотаций ограничены и требуют использования reflection'а;
                    • если требуется представить данные не обо всех свойствах объекта сразу, то созданные классы использовать затруднительно;
                    • затруднительно также представить изменение значения свойства (delta).


                    Мы хотим реализовать фреймворк, позволяющий создавать новые «классы» (типы, конструкторы этих типов, объекты новых типов) инкрементно, используя наши собственные «кирпичики». Попутно, пользуясь тем, что мы сами изготавливаем «кирпичики», мы можем достичь таких полезных свойств:
                    • возможность описывать отдельные свойства сущностей (с указанием типа данных в этом свойстве и любой метаинформации, необходимой приложению, в форме, подходящей именно для этого приложения);
                    • возможность оперировать со свойствами экземпляров строго типизированным образом (с проверкой типов на этапе компиляции);
                    • представлять частичную/неполную информацию о значениях свойств экземпляра сущности, пользуясь объявленными свойствами;
                    • создавать тип объекта, содержащего частичную информацию о свойствах экземпляра сущности. И использовать этот тип наравне с другими типами (классами, примитивными типами и др.).

                    Читать дальше →
                    • +12
                    • 8,2k
                    • 8
                  • Обработка событий в реальном масштабе времени с помощью SynapseGrid

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

                      Всё хозяйство должно было работать в рамках одного экземпляра приложения, но при этом должно было быть несколько вложенных почти независимых очень похожих контейнеров для клиентского кода (типа Bean'ов).

                      С самого начала мы не ставили задачу всеобщей унификации, и решали в каждой части системы по своему. Где-то использовали потоки для длительных задач, где-то создавали цепочки вызовов, где-то — модель подписки. Так как система была довольно большой, то практически все известные способы декомпозиции и обработки были задействованы в той или иной степени. Потом мы обнаруживали общность и реализовывали похожие решения в разных частях системы. А потом изобрели первую версию того, что сейчас мы называем система контактов или SynapseGrid.
                      Как мы изобрели систему контактов SynapseGrid
                      • +11
                      • 3,8k
                      • 2
                    • Предвзятость выжившего

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

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

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

                      Следы от пуль


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

                      Желая увеличить вероятность возвращения экипажей домой, британские инженеры изучали расположение следов от пуль. Инженеры считали, что в тех местах, где больше всего попаданий, нужно дополнительно бронировать корпус самолета. Разумеется, была найдена закономерность: много следов располагалось на крыльях, хвосте и в районе хвостового пулемета. На кабине пилота и топливных баках следов было мало.

                      Логично заключить, что нужно добавить брони в тех местах, где больше всего следов. Но это неверно.
                      Читать дальше →
                    • Полет квадрокоптера на высоте 1км

                        Всегда было интересно как мир выглядит с высоты. Что видят птицы, чего не видно на картах googleEarth. Так пришло увлечение мультикоптерами, летать под облаками, фотографировать, снимать видео.


                        Подробности полета