• 20 библиотек для эффектного iOS-приложения

    • Translation


    Из огромного количества iOS-библиотек нет особого смысла составлять какие-то рейтинги. Поэтому просто представляем двадцатку эффектных/полезных инструментов для тех, кто пишет приложения под гаджеты Apple.

    Все анимации являются ссылками на свои полноразмерные версии.
    Большой траффик - много гиф-анимации
  • Современный код для выполнения HTTP запросов в Swift 5 с помощью Combine и применение их в SwiftUI. Часть 1



      Выполнение HTTP запросов — это один из самых важных навыков, которые необходимо получить при разработке iOS приложений. В более ранних версиях Swift (до версии 5) вне зависимости от того, формировали ли вы эти запросы «с нуля» или с использование известного фреймворка Alamofire,  вы в конечном итоге получали сложный и запутанный код с callback типа completionHandler: @escaping(Result<T, APIError>) -> Void.

      Появление в Swift 5 нового фреймворка функционального реактивного программирования Combine в сочетании с уже существующими URLSession и Codable предоставляет вам все необходимые инструменты для самостоятельного написания очень компактного кода для выборки данных из интернета.

      В этой статье в соответствии с концепцией Combine мы будем создавать «издателей» Publisher для выборки данных из интернета, на которые в дальнейшем сможем легко «подписаться» и использовать при проектировании UI как с помощью UIKit, так и с помощью SwiftUI.

      В SwiftUI это выглядит более лаконично и более эффектно, так как действие «издателей» Publisher не ограничивается просто выборкой данных, а простирается дальше, вплоть до управления пользовательским интерфейсом (UI). Дело в том, что в SwiftUI разделение данных и View осуществляется с помощью ObservableObject классов с @Published свойствами, изменения которых SwiftUI АВТОМАТИЧЕСКИ отслеживает и полностью «перерисовывает» свои View.

      В эти ObservableObject классы можно очень просто заложить определенную бизнес-логику приложения, если некоторые из этих @Published свойств являются результатом синхронных и/ или асинхронных преобразований других @Published  свойств, которые можно напрямую менять такими «активными» элементами пользовательского интерфейса (UI) как текстовые поля TextField, Picker, Stepper, Toggle и т.д.
      Читать дальше →
    • Современный код для выполнения HTTP запросов в Swift 5 с помощью Combine и применение их в SwiftUI. Часть 2. Hacker News



        Hacker News, чей API мы собираемся использовать в этой статье, является социальным сайтом, сфокусированным на компьютерах и предпринимательстве. Если вы с ним ещё не знакомы, вы найдёте там много интересного.



        В предыдущих статьях  на примере базы данных фильмов TMDb и агрегатора новостей NewsAPI.org была представлена стратегия применения Combine для формирования HTTP запросов и использования их во View Model для управления UI, спроектированного с помощью SwiftUI. В этой статье мы в точности воспроизведем ту же самую стратегию для разработки приложения, взаимодействующего с агрегатором новостей Hacker News, но добавим работу с «внешним» издателем Timer и для простоты исключим обработку ошибок.

        Надо сказать, что выборка статей на ресурсе Hacker News имеет совершенно другую логику, чем в новостном агрегаторе NewsAPI.org, но технология, основанная на выполнении HTTP запросов с помощью Combine, прекрасно показывает свою гибкость и в этой ситуации. Кроме того, информация на сайте Hacker News очень часто обновляется и использование внешнего «издателя» Timer позволит автоматически отслеживать поступающие на сайт новые истории (Story), именно так их называют на этом ресурсе.

        API агрегатора новостей Hacker News можно использовать совершенно свободно и не требуется никакой регистрации для аккаунта разработчика. Это здорово, потому что вы можете сразу начать работать над кодом без длительной регистрации, как мы делали это с другими public APIs.
        Читать дальше →
      • Ищем баги в PHP коде без статических анализаторов

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


          Пример гипотезы:


          Функции strpos легко передать аргументы в неправильном порядке. 

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


          Сегодня я покажу как выполнять простейший статический анализ с помощью утилиты phpgrep без написания кода.



          Под катом:


          • Поиск и разбор багов в open source проектах.
          • Quick start по phpgrep.
          • Принцип работы синтаксического поиска.



          Читать дальше →
        • ESP32-CAM Video Streaming Server Подключение I2C и SPI дисплеев

          • Tutorial
          ESP-32 CAM модуль с камерой от Diymore

          ESP32-CAM Video Streaming Server


          Пример использования находится тут.

          Предварительно надо установить библиотеки: Esp32 board in Arduino Ide Windows / Esp32 board in Arduino Ide Linux and Mac

          Подробные настройки есть в статье.

          В моем случае я использовал модуль AI-THINKER поэтому раскомментировал
          #define CAMERA_MODEL_AI_THINKER

          У меня не заработала функиональность распознования лиц. Коментарий в статье был полезен.
          Читать дальше →
        • Ссылки в Windows, символьные и не только

            Предыстория


            В своём топике "Впечатления от Яндекс.Субботника" хабрачеловек absolvo высказал удивление, что один из докладчиков не знал о том, что символьные ссылки есть и в Windows. Честно говоря, не знал этого и я, поэтому поинтересовался об этих ссылках в комментариях.

            Думаю, то, что удалось выяснить, может показаться кому-нибудь полезным.
            Читать дальше →
          • Резистор в цепи затвора или как делать правильно



              Всем доброго времени суток!

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

              Любому из этих случаев я буду очень рад.
              Читать дальше →
            • Максимальный постоянный ток через полевой транзистор

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

              В статье будет рассмотрен пример расчёта максимального тока через MOSFET SQM50P03-07 (взял первый попавшийся из своей схемы), работающий в ключевом режиме, или на участке насыщения.
              Читать дальше →
            • Как реализовать язык программирования на JavaScript. Часть 2: Интерпретатор

              • Translation
              • Tutorial

              Здравствуйте! Представляю вам вторую часть моего перевода руководства реализации своего языка программирования на JavaScript — PL Tutorial.


              От переводчика


              Мы создадим свой язык программирования — λзык (в оригинале — λanguage). В процессе создания мы будем использовать достаточно много интересных техник, таких как рекурсивный спуск, стиль передачи управления, базовые техники оптимизации. Будет создано две версии интерпретатора — обычный и CPS-интерпретатор, транс-компилятор в JavaScript.


              Автор оригинала — Mihai Bazon, автор известной библиотеки UglifyJS (инструмент для минимизации и форматирования JS-кода).

              Читать дальше →
              • +11
              • 4.3k
              • 8
            • Расширяем функционал штатной аудиосистемы

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

                1. Купить затычку в прикуриватель и не выпендриваться.

                Минусы:

                • Качество звука
                • Управление отсутствует
                • Вывод названия песен также отсутствует

                Плюсов нет.

                2. Купить на разборках за немалые деньги штатный блок Bluetooth + голову поновее.

                Минусы:

                • Проблемы с совместимостью разных блоков
                • Монофонический вывод звука (на некоторых блоках)
                • Цена с заменой головы и проводки практически равна нештатной магнитоле
                • Кроме латиницы поддержки нет

                Плюсы:

                • Штатное оборудование

                3. Сделать что-либо самому, но так, чтобы не урезать имеющийся функционал.

                Минусы:

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

                Плюсы:

                • Удовлетворение от проделанной работы
                • Поддержка lossless аудио
                • Поддержка кириллицы, хоть и транслитом, т.к. экран не умеет.

                Как вы поняли из названия, я выбрал путь номер 3.
                Читать дальше →
              • История советских кассетников: эволюция “Десны”, MK-60 made in USA и народные магнитофоны 70-х

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



                  Мне было интересно проанализировать насколько наши разработчики приблизились к коллегам из Японии, Западной Европы и США, удалось ли им догнать и перегнать, а также понять, почему советские разработки в этой области порой пользовались редким или т. н.”вынужденным” спросом, а большинство их современников стремились приобрести зарубежные образцы.

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

                    Прошло 4 года с тех пор, как я опубликовал статью «Концепт: самогонный аппарат — полный автомат». 4 года, Карл!

                    Идея не была заброшена. Мало того, она — как заноза в мозгу не давала покоя. И за 4 года было кое-что сделано. Методом проб и ошибок я постепенно вышел на реализацию этого проекта. По крайней мере — уже виден свет в конце тоннеля.

                    Красивый самогонный аппарат
                    КДПВ. Красивый рабочий аламбик. «Montanya distillers Co», Crested Butte, Colorado, USA.

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

                    2. Отказался от идеи индукционной плиты, как подсказывал vvzvlad по причине повышенной сложности управления индукционной плитой. Проверял на своей индукционной нагревательной поверхности — без ковыряния мозгов плиты управлять ей крайне сложно. Подцепиться к сенсорной панели плиты не инвазивно не удалось.

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

                    4. От жидкостного охлаждения холодильника в силу объективных причин (подводка, замерзание в случае двухконтурности и тому подобных проблем).

                    Я постараюсь рассказать обо всех решениях, к которым пришел в процессе реализации идеи.

                    Много тяжеловесных изображений и спойлеров.
                    Да, я же ждал эту статью!
                  • Вредные советы: как правильно писать техническую документацию?

                      Советы по грамотному написанию технической документации для пользователей.
                      Часть 1


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

                      На этот раз под катом – руководство нашего технического писателя Андрея Старовойтова, которое поможет сделать вашу документацию для пользователей проще и понятнее (описанные приемы применяют при документировании своих продуктов Apple, Microsoft и другие компании).
                      Читать дальше →
                      • +20
                      • 8.6k
                      • 4
                    • Конференция DEFCON 19. Взламываем MMORPG ради веселья и прибыли. Часть 1

                      • Translation
                      Меня зовут Джош Филлипс и я хочу представить вам особого гостя, которого нет в списках выступающих, его зовут Майк Доннелли. Позже я дам ему возможность представить себя. Обычно я выступаю на конференции последним, поэтому надеюсь, что наше выступление не сыграет для вас роль колыбельной. Если кто-то ещё собирается выступить после нас, я ему не завидую, но ничего не могу с этим поделать. Ну что же, давайте начнём.



                      Я слышал, что всем сегодняшним докладчикам не везло, потому что у них возникали проблемы с показом слайдов, но надеюсь, что у нас с всё получится. Итак, в реальной жизни я исследую вредоносное программное обеспечение в лаборатории Касперского. Я также работал аналитиком вредоносного ПО в компании Microsoft и вопреки расхожему мнению или тому, что можно найти в Википедии, название вируса Conficker не является немецким или датским эквивалентом английского слова «assfucker», это всего лишь придумана мной игра слов. Так что придумывание названия для этого компьютерного червя можно считать самым большим достижением в моей жизни. Я являюсь «золотым фармером» и в качестве хобби я написал несколько ботов для компьютерных игр, попробуйте догадаться, для каких именно. Теперь я предоставлю слово Майку, чтобы он рассказал о себе.

                      Майк Доннелли: я Майк Доннели, известный под ником Mercury, создавший интернет-бота Glider для игры World of Warcraft. Установлением прав собственности на этого бота, 100000 копий которого были распроданы третьей стороной за 4 миллиона долларов, занимался суд. Мне удалось обжаловать решение суда первой инстанции, и апелляционный суд постановил возместить мне, как истинному владельцу, ущерб в размере 6,5 миллионов долларов, однако в любом случае судебное дело не доставило мне особого удовольствия.

                      Читать дальше →
                      • +14
                      • 7.9k
                      • 9
                    • Introscope: ну очень ленивое unit-тестирование

                        Мы на работе пишем много часто меняющейся бизнес-логики на JS (стартап же). Даже слишком много. И всё это хочется по старой привычке тестировать, но как-нибудь побыстрее, чтобы тесты особо не мешали говнокодить, когда это нужно, и не подгонять под тесты особенно сильно структуру модулей. В какой-то момент пришла мысль, что можно это еще и автоматизировать как-то с помощью простенького babel-плагина, чтобы он для начала все приватные переменные и методы выворачивал в тестовой среде, а в продакшене не трогал. Это оказалось довольно просто и увлекательно. Так появился Introscope, которым мы теперь тестируем всё более-менее сложное.

                        Читать дальше →
                        • +16
                        • 2.8k
                        • 2
                      • Рендеринг шрифтов с помощью масок покрытия, часть 1

                        • Translation
                        image

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

                        1. Мы должны иметь возможность рендерить любой шрифт любого размера в реальном времени, чтобы адаптироваться к системным шрифтам и их размерам, выбранным пользователями Windows.
                        2. Рендеринг шрифтов должен быть очень быстрым, никаких торможений при рендеринге шрифтов не допускается.
                        3. В нашем UI куча плавных анимаций, поэтому текст должен иметь возможность плавно перемещаться по экрану.
                        4. Он должен быть читаемым при малых размерах шрифтов.

                        Не будучи в то время большим специалистом в этом вопросе, я поискал информацию в Интернете и нашёл множество техник, используемых для рендеринга шрифтов. Также я пообщался с техническим директором Guerrilla Games Михилем ван дер Леу. Эта компания экспериментировала со множеством способов рендеринга шрифтов и их движок рендеринга был одним из лучших в мире. Михиль вкратце изложил мне свою идею новой техники рендеринга шрифтов. Хотя нам вполне было бы достаточно уже имевшихся техник, меня эта идея заинтриговала и я приступил к её реализации, не обращая внимания на открывшийся мне чудесный мир рендеринга шрифтов.
                        Читать дальше →
                      • Как усилить защищенность веб-приложений при помощи HTTP заголовков

                        • Translation
                        image

                        Это третья часть серии по веб-безопасности: вторая часть была «Web Security: введение в HTTP», первая "Как работают браузеры — введение в безопасность веб-приложений".

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

                        В настоящее время браузеры внедрили очень широкий спектр заголовков, связанных с безопасностью, чтобы злоумышленникам было труднее использовать уязвимости. В этой статье мы попытаемся обсудить каждый из них, объясняя, как они используются, какие атаки они предотвращают, и немного истории по каждому заголовку.
                        Читать дальше →
                        • +33
                        • 24.1k
                        • 9
                      • Высокая доступность MySQL в GitHub

                        • Translation

                        GitHub использует MySQL в качестве основного хранилища данных для всего, что не связано с git, поэтому доступность MySQL имеет ключевое значение для нормальной работы GitHub. Сам сайт, интерфейс API на GitHub, система аутентификации и многие другие функции требуют доступа к базам данных. Мы используем несколько кластеров MySQL для обработки различных служб и задач. Они настроены по классической схеме с одним главным узлом, доступным для записи, и его репликами. Реплики (остальные узлы кластера) асинхронно воспроизводят изменения главного узла и обеспечивают доступ для чтения.


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


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


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


                        Читать дальше →
                        • +21
                        • 8.5k
                        • 4
                      • Запуск просмотрщика картинок из Windows XP на современных Windows

                          Есть у меня папка со старыми картинками, которые я собирал в нулевых. Переношу с компьютера на компьютер вместе со всеми моими файлами при каждом апгрейде, изредка захожу поностальгировать. Но каждый раз меня немного смущало то, что стандартный просмотрщик Windows 7 не показывал GIF-анимацию, хотя память мне подсказывала, что во времена XP анимация показывалась без проблем. При очередном приступе ностальгии я всё же решил запустить просмотрщик из XP на Windows 7. После преодоления ряда препятствий, я теперь уверен — GIF-анимация там действительно поддерживалась! А главное — теперь я могу смотреть свою старую папку с картинками в аутентичном интерфейсе просмотрщика картинок Windows XP, что создаёт более подходящую атмосферу =)


                          Скачать: shimgvw_xp32.7z (включает бинарник и исходный код лаунчера, плюс shimgvw.dll из англоязычной Windows XP SP3).

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