Реактивные рюкзаки
Название “реактивный рюкзак” (англ. jet pack) прочно закрепилось за летательными аппаратами, закрепляемыми на спине пилота, вне зависимости от типа двигателя. Идея создания такого рюкзака возникла еще в 1919 году у советского изобретателя Александра Андреева, а в 1928 году он получил патент на это изобретение. Однако дальше чертежей этот проект не продвинулся, так как средств для создания аппарата выделено не было.
Одновременно с этим джетпаки появились на страницах американских научно-фантастических комиксов. На обложке одного из номеров “Удивительных историй” 1928 года был изображен человек, летящий с помощью специального ранца за спиной.
20 апреля 1961 года реактивный ранец перестал быть фантастикой. В этот день был совершен первый в истории свободный полет на джетпаке. Пилот Гарольд Грэм поднялся на высоту примерно 1,2 метра и плавно стал двигаться вперед со скоростью около 10 км/ч. Он переместился по прямой на расстояние, равное 35 метрам, и приземлился. Полет продолжался всего 13 секунд.
Джетпак Martin Aircraft
Сегодня стоимость реактивного ранца составляет порядка $300 тысяч. Высокая цена и непродолжительное время полета (до 10 минут) пока делают непрактичным использование этих аппаратов в качестве личного транспорта. Однако на них уже летают пожарные и спасатели: в 2015 году власти Дубая закупили 20 джетпаков производства новозеландской компании Martin Aircraft. Их предполагалось использовать для борьбы с пожарами на верхних этажах небоскребов.
Увеличение времени пребывания аппарата в воздухе с момента взлета до момента посадки и крупносерийное производство, которое снизит стоимость в несколько раз, могут сделать реактивные рюкзаки массовым явлением.
У джетпаков есть хорошие перспективы стать если не личным, то коммерческим транспортом — например, транспортом для экспресс-доставки. Для управления ими не требуется лицензия пилота, а для взлета подходит любая площадка площадью в 1 квадратный метр.
Скорость принятия
Некоторые читатели отметят, что у Apple чрезвычайно высокие показатели внедрения новых версий iOS по сравнению с Android. И это совершенно верно. Но это также не совсем актуально для нашего обсуждения.
Давайте возьмем для примера одно из наших клиентских приложений. Конечно, со временем все эти пользователи перейдут на последнюю версию iOS. Но если сегодняшние показатели сохранятся, к этому времени в следующем году около 85% этой пользовательской базы будет на iOS 15.
Таким образом, остается 10% или около того на iOS 14. И 3–4% на iOS 13. И 1-2% на iOS 12.
В процентном отношении эти цифры не кажутся такими уж высокими. Но если у вас есть крупное приложение с, скажем, 10 миллионами пользователей, то 5% от этого числа составляют 500,000. И вы сможете убедить руководство, что нужно отказаться от полумиллиона клиентов, чтобы мы могли поиграть с некоторыми классными новыми языковыми функциями?
Вперед. Я подожду.
Разработка с открытым исходным кодом
Как уже упоминалось, Jetpack Compose — это проект Android с открытым исходным кодом, поддерживаемый большим и активным сообществом разработчиков.
SwiftUI, с другой стороны, разработан Apple собственными силами, практически без прозрачности или обратной связи.
Jetpack Compose — это непривязанный набор инструментов, который является частью общего набора программных компонентов Android Jetpack от Google для разработчиков Android, но при этом не требуется использовать какие-либо другие компоненты Jetpack или чтобы у ваших клиентов была самая последняя и лучшая версия Android.
SwiftUI, опять же, привязан к определенной версии iOS.
Jetpack Compose был выпущен как общедоступная бета-версия на Google I/O в 2019 году, и с тех пор было опубликовано много релизов Compose и его компонентов.
Было три официальных выпуска SwiftUI, каждый из которых привязан к iOS 13, 14 и 15 соответственно.
У Compose есть блог в Android Jetpack, плейлист для разработчиков Android Jetpack на YouTube и группа на сайте Stack Overflow.
Вы даже можете зайти в Twitter и напрямую поговорить с разработчиками из команды разработчиков Compose!
Apple? Что ж, у них есть форум разработчиков, где вы можете задавать вопросы.
Конечно, в большинстве случаев их будут игнорировать, но, по крайней мере, вы можете их задавать.
Перекомпоновка (перерисовка компонентов)
Это способ сказать, что любую Composable-функцию можно повторно вызвать в любое время. Если у вас очень большая Composable-иерархия, когда часть вашей иерархии изменяется, вам не нужно пересчитывать всю иерархию. Т. к. Composable-функции можно вызывать повторно, вы можете использовать эту особенность для некоторых полезных вещей.
Например, вот функция , которую вы можете встретить сегодня в разработке для Android.
У нас есть , на которую мы хотим подписаться для обновления View. Для этого мы вызываем метод в классе, имеющем жизненный цикл (LifecycleOwner — Activity или Fragment), а затем передаем лямбду. Лямбда вызывается каждый раз при обновлении LiveData, и когда это происходит, мы хотим обновлять и View.
С помощью Compose мы можем изменить этот способ взаимодействия с LiveData:
Это аналогичный Composable-компонент , который получает и вызывает compose-метод . Метод преобразует в . Это означает, что вы можете использовать полученное значение в теле функции. Экземпляр подписан на экземпляр LiveData, что означает, что он будет обновляться при каждом обновлении LiveData. Это также означает, что где бы ни читался экземпляр , окружающая compose-функция, в которой он читается, будет автоматически подписываться на эти изменения. Конечным результатом является то, что больше нет необходимости указывать LifecycleOwner или коллбэк для обновления, поскольку Composable может неявно выполнять функцию их обоих.
Джетпак JB-11
На данный момент единственным военным подразделением, которое заказало поставку реактивных ранцев, являются Силы специальных операций. В 2016 году командование заключило контракт с производителем летательных аппаратов JetPack Aviation на поставку джетпаков модели JB-11. Они оснащены шестью реактивными двигателями и могут находиться в воздухе около 10 минут — этого хватает на преодоление примерно 30 километров. Скорость движения этого джетпака достигает 320 километров в час, а максимальная высота полета достигает 4,5 километров. Этот джетпак был представлен на технологической выставке CES 2018 и о нем рассказывало издание BBC.
Полет на реактивном ранце JB-11
Пожалуй, на данный момент реактивный ранец JB-11 от JetPack Aviation является единственным, кто пригоден для использования в военных целях. Выше я уже отметил, что большинство джетпаков изготавливаются инженерами-любителями. Взять, к примеру, реактивный ранец от американского изобретателя Ричарда Браунинга. В 2018 году он стоил 340 тысяч фунтов стерлингов, что по текущему курсу равно около 35 миллионам (!) рублям. Разработанный «костюм железного человека» выглядит эффектно и изобретатель много раз удивлял своими полетами. Вот небольшая статья об удивительном проекте Ричарда Браунинга.
Еще одним известным летчиком-испытателем является Фрэнки Запата. Он является изобретателем летающего скейтборда Flyboard Air, который работает почти по такому же принципу, что и реактивные ранцы. В 2019 году летчик решил использовать этот аппарат, чтобы перебраться из Франции в Великобританию через пролив Ла-Манш. Я рассказывал о его затее в этом материале. Приятного чтения!
List of Jetpacks available from The Stash
Following Jetpacks are available to purchase with in-game currency, with the exception of the Machine Gun Jetpack, which is available from the start.
In early versions, the game would cycle through available jetpacks, with available items depending on the current date, and the game cycles through all of them on an approximate 22 week basis. On the iPhone/iPod version, the set of available items could be manipulated by changing the system date and entering the game with no internet connection. In current versions, however, all of the outfits bellow are available to buy with no such restrictions.
Machine Gun Jetpack «Original and the best. The machine gun jetpack.» |
Bubble Gun Jetpack: «What happens when engineers get their hands on children’s toys? You get the bubble gun jetpack, that’s what.» |
DIY Jetpack: «Thanks to advancements in duct tape and party supply technology, Do-It-Yourself jetpacks are finally a reality!» |
Traditional Jetpack: «Sometimes you have to get back to your roots: the traditional jetpack will please the old schoolers.» |
Teddy Jetpack «Sometimes even the most hardend and experienced heroes need a hug from their teddy bear. Powered by love.» |
Steam Powered Jetpack: «Created with parts salvaged from a retired steam train, industrial age technology finally gets airborne!» |
Leaf Blower Jetpack: «Who has the time for yard work anyway? With the leaf blower jetpack you can kill two birds with one stone.» |
Fruit Jetpack: «Unleash your inner zen, and harness the power of fruit! This jetpack was carefully carved into life by a mysterious ninja.» |
Blast Off Jetpack: «When you think about it, a jetpack is really just a tiny little rocket that you wear on your back.» |
Deck the Halls Jetpack: «Christmas tree jetpack that shoots baubles and tinsel. Grab this festive jetpack and spread good tidings and mayhem all over the place.» |
Laser Jetpack: «Strapping a harness to a stolen laser was surprisingly easy. Not burning your pants while flying is the tricky part.”» |
Red Barry: «An old war relic which shrunk after accidentally being put in the wash. All the other planes turned pink.» |
Beehive Jetpack: «BEEEEEEEEEEEEEEEEEEEEEEEEES!» |
Snow Machine Jetpack: «Punk kids throwing snowballs at you and laughing? Strap in and rain down freezing revenge in this especially cool jetpack.» |
Party Jetpack: «New breakthroughs in party-ology meant we could condense an entire party into a jetpack sized package.» |
Water Jetpack: «A misgided attempt to build a high speed gardening machine led to creation of the water jetpack. Great for watering your rose garden. |
Angel Wings: «Ascend gracefully with these mechanised wings. The halo just completes the look.» |
Chrome Plated Afterburner: «Salvaged from decomissioned F-111, this afterburner jet engine puts on one crazy show.» |
Helicopter Jetpack: «Barry had his eye on this one since he was just a kid.» |
Big Bertha: «The cause of the lab’s never-ending milkshake supply» |
Cloud Machine: «Powered by light, strawberry flavoured clouds of vapour.» |
Flying V Jetpack: «6 strings. 2 humbuckers. 22 frets. Goes to 11.» |
Twister Jetpack: «Rated at F3 on the fujita scale, this jetpack is capable of relocating an entire house over the rainbow.» |
Shark Head Jetpack: «Converted from a classic warplane, the shark head jetpack proves you cannot have too many sharks in your life.» |
Rainbow Jetpack: «The latest in rainbow harnessing technology, the rainbow jetpack defies physics with style.» |
Gold Plated Shark Head Jetpack: «The shark head jetpack just got a whole lot shinier. And heavier. And less practical.» |
Golden Piggy Pack: «Powered by firing 1928 issue $1,000 bills, this jetpack is probably the most wasteful machine ever created.» |
Gold Platinum MGJP: «The original is still the best. Unless, of course, it’s an even better version of the original.» |
Random Jetpack: «Randomly picks one of the jetpacks you already own every game.» |
Декларативный UI
Декларативный — это модное, но важное слово. Когда мы говорим о декларативном программировании, мы говорим об его отличии от императивного программирования
Давайте рассмотрим пример.
Рассмотрим почтовое приложение со значком непрочитанных сообщений. Если сообщений нет, приложение отображает пустой конверт. Если есть какие-то сообщения, мы визуализируем бумагу в конверте, а если есть 100 сообщений, мы визуализируем значок, как будто он горит.
С императивным интерфейсом нам, возможно, придется написать такую функцию подсчета обновлений:
В этом коде мы получаем новое количество сообщений и должны выяснить, как обновить текущий пользовательский интерфейс, чтобы отразить это состояние. Здесь много корнер-кейсов, и эта логика непроста, хотя это относительно простой пример.
Если мы перепишем эту логику в декларативном стиле, мы получим нечто подобное:
Здесь мы говорим:
-
Если счет больше 99, покажи огонь ?.
-
Если счет больше 0, покажи бумагу
-
Если счетчик больше 0, отобрази значок счетчика
Это то, что подразумевается под декларативным API. Код, который мы пишем, описывает нужный нам пользовательский интерфейс, но не описывает, как перейти в это состояние. Важным здесь является то, что при написании декларативного кода, подобного этому, вам больше не нужно беспокоиться о том, в каком предыдущем состоянии был ваш пользовательский интерфейс, вам нужно только указать, каким должно быть ваше текущее состояние. Фреймворк контролирует, как перейти из одного состояния в другое, поэтому нам больше не нужно об этом думать.
Какие проблемы решает Compose?
Разделение ответственности (Separation of concerns) — это хорошо известный принцип разработки программного обеспечения. Это одна из фундаментальных вещей, которую мы, как разработчики приложений, узнаем. Несмотря на то, что этот принцип хорошо известен, часто трудно понять, соблюдается ли этот принцип на практике. Может быть полезно думать об этом принципе как о термине типа «сцепление» или «связанность».
Когда мы пишем код, мы создаем модули, которые состоят из нескольких сущностей (unit-тов). Связанность (Coupling) — это зависимость между сущностями в разных модулях, которая отражает то, ка части одного модуля влияют на части других модулей. Целостность (Cohesion)- это, наоборот, взаимосвязь между сущностями (юнитами) в модуле и показывает, насколько хорошо сгруппированы юниты в модуле.
При написании поддерживаемого программного обеспечения наша цель — минимизировать связанность и максимизировать целостность.
Когда у нас есть сильно связанные модули, внесение изменений в код в одном месте означает необходимость внесения множества изменений в другие модули. Что еще хуже, связь часто может быть неявной, так что вещи ломаются в неожиданных местах из-за изменения, которое кажется совершенно не связанным.
Разделение ответственности заключается в том, чтобы сгруппировать как можно больше связанного кода, чтобы наш код можно было легко поддерживать и масштабировать по мере роста приложения.
Давайте перейдем к практике, и рассмотрим современные подходы решения этого вопроса в мире Android-разработки. Возьмем для примера ViewModel и XML-лейаут.
ViewModel предоставляет данные лейауту. Оказывается, здесь может быть спрятано много зависимостей: большая взаимосвязь между ViewModel и лейаутом. Один из наиболее частых и х хорошо знакомых нам случаев сильной взаимосвязи — это использование API (от Android или сторонних библиотек — прим. переводчика), в которых требуется знание о внутренностях самого XML-макета, например метод .
Использование таких API требует знания того, как устроен XML-макет, и создает взаимосвязь между ними. Поскольку наше приложение со временем растет, мы должны следить за тем, чтобы ни одна из этих зависимостей не устарела.
Большинство современных приложений отображают пользовательский интерфейс динамически и меняются в процессе выполнения. В результате необходимо не только проверить, что эти зависимости (т. е. View-элементы) предоставляются XML-макетом, но также и то, что они будут предоставляться во время работы программы. Если элемент покидает иерархию View во время выполнения, некоторые из этих зависимостей могут быть нарушены и могут привести к таким проблемам, как .
Обычно ViewModel определяется языке программирования Kotlin, а макет — в XML. Из-за этой разницы в языке существует принудительное разделение, хотя ViewModel и XML-макет иногда могут быть тесно связаны. Другими словами, они очень тесно связаны.
Возникает вопрос: что, если бы мы начали определять лейаут, т. е. структуру нашего пользовательского интерфейса на одном языке? Что, если мы выберем Kotlin?
Поскольку в этом случае мы будем работать на одном языке, некоторые из зависимостей, которые ранее были неявными, могут стать более явными. Мы также можем провести рефакторинг кода и переместить вещи туда, где они уменьшат взаимосвязь и увеличат согласованность.
Теперь вы можете подумать, что вы смешиваете логику с пользовательским интерфейсом. Реальность такова, что у вас будет логика, связанная с пользовательским интерфейсом, в вашем приложении, независимо от того, как оно структурировано. Сама структура не может этого изменить.
Но то, что может сделать фреймворк, — это предоставить вам инструменты, упрощающие разделение: этим инструментом является функция Composable. Функции — это то, что вы, вероятно, использовали в течение долгого времени для разделения задач в других местах вашего кода. Навыки, которые вы приобрели для такого рода рефакторинга и написания надежного, поддерживаемого, чистого кода, — те же навыки применимы и к Composable -функциям.
Композиция vs Наследование
В разработке программного обеспечения композиция — это то, как несколько частей более простого кода могут объединяться в более сложный блок кода. В объектно-ориентированной модели программирования одной из наиболее распространенных форм композиции является наследование на основе классов. В мире Jetpack Compose, поскольку мы работаем только с функциями, а не с классами, метод композиции сильно отличается, но имеет много преимуществ перед наследованием. Давайте посмотрим на пример.
Допустим, у нас есть View и мы хотим создать поле ввода. В случае с наследованием наш код может выглядеть так:
View — это базовый класс. является подклассом . Для проверки даты наследуется от . Но тогда возникает проблема: мы хотим создать компонент с вводом диапазона дат, следовательно, нам нужно осуществлять проверку по двум датам — дате начала и дате окончания. Вы можете создать подкласс , но вам нужно сделать это дважды, а вы не можете этого сделать. Это ограничение наследования: у нас должен быть единственный родитель, от которого мы наследуем.
В Compose это не так сложно. Допустим, мы начинаем с базового composable-компонента :
Когда мы создаем наш , мы просто вызываем в теле нашей функции. Затем мы можем дополнить его чем-нибудь для проверки.
Затем для DataInput мы можем напрямую вызвать .
Теперь, когда мы сталкиваемся с вводом диапазона дат, у нас больше нет проблемы: это всего лишь два вызова вместо одного.
При создании UI-компонентов при помощи Compose, у них нет единственного родителя, и это решает проблему, которая возникла с в случае с использованием наследования.
Другой тип проблемы композиции — это абстрагирование от типа декотратора. Для примера рассмотрим следующий пример наследования:
— это View, которое украшает другие View, в данном случае и . Мы хотим создать и , но как? Мы наследуем от FancyBox или мы наследуем от ? Это неясно, потому что, опять же, у нас может быть только один родитель в цепочке наследования.
Compose же справляется с этим очень хорошо.
У Composamble-функции есть лямбда, в которой мы описываем дочерние View, т. е. мы определяем View, которая обертывает другие View. Итак, теперь, когда мы хотим создать , мы вызываем внутри и можем сделать то же самое с . Это способ композиции в Compose.
Движущиеся тротуары
Одно из решений проблемы предложили швейцарские ученые. По мнению исследователей из Федеральной политехнической школы Лозанны (EPFL), автомобилям на замену в больших городах могут прийти движущиеся дорожки (или траволаторы).
Идея таких дорожек появлялась в разных научно-фантастических сюжетах: у Герберта Джорджа Уэллса, Роберта Хайнлайна и Айзека Азимова. В 1893 году такую конструкцию впервые установили на Всемирной выставке, проходившей в Чикаго, следом ее же показали на Всемирной выставке в Париже в 1900 году.
Траволаторы уже давно перемещают посетителей крупных аэропортов, торговых центров и выставочных площадок во всем мире.
Траволаторный тоннель в Санкт-Петербургском метро
Однако инженеры EPFL пошли дальше. Оно предлагают использовать движущиеся дорожки, скорость которых может составлять до 15 км в час, в качестве крупномасштабной системы для перемещения людей внутри городов. Предполагается, что мобильные тротуары будут объединены в одну сеть, чтобы пассажиры могли переходить с одного траволатора на другой.
По словам специалистов EPFL, использование движущихся тротуаров поможет сэкономить пространство, поскольку они будут занимать меньше места, чем автомобильные дороги. Их ширина составляет всего 1,2 метра, в то время как для автомобильной дороги требуется не менее 2,5 метров.
Такая система сможет перемещать до семи тысяч пассажиров в час на каждую движущуюся дорожку. Для сравнения — автомобили за это время перевозят от 750 до 1800 человек по обычной дороге.
Инкапсуляция
Еще одна вещь, которую хорошо выполняет Compose — это инкапсуляция. Это то, о чем вы должны думать, когда делаете общедоступные API-интерфейсы Composable-функций: публичный API-интерфейс Composable-функций — это набор параметров, которые она получает, поэтому он не может их контролировать. С другой стороны, Composable-компонент может управлять состоянием и создавать его, а затем передавать это состояние вместе с любыми данными, которые он получил, в другие Composable-компонентыв качестве параметров.
Теперь, поскольку он управляет этим состоянием, если вы хотите изменить состояние, вы можете разрешить дочерним компонентам передавать сигнал об этом изменении с помощью коллбека.
Swift Evolution
Печально то, что этого не должно было быть
У Apple уже была проверенная модель того, как вовлечь сообщество разработчиков в руководство и формирование технологии, критически важной для ее будущего успеха
Я говорю о Swift и Swift Evolution.
Хотите расширить Swift, чтобы сделать что-то новое? Напишите питч Swift Evolution и позвольте сообществу обсудить это.
Хотите исправить ошибку в компиляторе? Что ж, если вы понимаете как, то вы можете это сделать.
Хотите узнать, что нас ждет? Следите за Swift Evolution и узнайте, что будет принято в языке.
У Apple была возможность сделать то же самое со SwiftUI.
Но они этого не сделали.
Apple могла вовлечь сообщество в разработку SwiftUI.
Но они этого не сделали.
Apple могла бы сделать SwiftUI пакетом, который можно было бы объединить и загрузить с вашим приложением, что позволило бы поддерживать многие из последних и лучших функций SwiftUI в iOS 14, 13 или 12.
Они точно этого не сделали.
List of Jetpacks available from Events and Bundles
Following jetpacks available only from events. Some of them are can only be obtained by buying a specific bundle, while others can be recieved for free by collecting tokens in the events.
Amped Up ’85 Guitar Jetpack: «With this guitar and 1.21 gigawatts of electricity you can too invent rock and roll!» |
Firecracker Jetpack: «Strap yourself in, hold on tight, and start the year with a bang. Evil spirits be gone!» |
Flamethrower Jetpack: «Salvaged from the remains of a great chinese dragon. Fireproof pants sold separately.» |
Dumpling Jetpack: «A repurposed dumpling steamer, originally designed to feed 20 people per second.» |
Fan Jetpack: «Meet Barry’s biggest fan.» |
Golden Rainbow Jetpack: «No unicorns were harmed during the making of this jetpack. At least we hope so anyway.» |
Pot O’ Gold Jetpack: «They say you can’t have a rainbow without a little rain. Better make it rain then!» |
Sir Einhorn: «A once noble unicorn… Until Barry discovered he farted rainbows.» |
Faerie Wings: «Made from reconstituted pixie dust.» |
Carrot Blender: «Contains Barry’s secret detox blend. Also highly volatile.» |
Eggceptional Jetpack: «Designed to pelt out delicious chocolate eggs at maximum velocity.» |
Carrot Launcher Jetpack: «A rocket propelled carrot launcher reappropriated from the easter bunny’s arsenal.» |
4th of July Jetpack: «What better way to celebrate independence than with a rocket filled with fireworks strapped to your back?» |
Monty the Macaw: «It’s a bird! It’s a plane! Wait…. We were right the first time!» |
Kraken Jetpack: «What’s kraken-a-lackin?» |
Jack O Lantern Jetpack: «Firing candy at ground is sure to slow the scientists down. And make the floor sticky.» |
Bleeding Heart: «The result of cutting edge research in cornstarch and red dye technology.» |
Demon Wings: «Escape the lab like a bat out of hell!» |
Roasted Turkey Jetpack: «Powered by roast vegetables and a never-ending supply of gravy.» |
Snowglobe Jetpack: «Because ‘blizzard in a bottle’ was too cliché» |
Christmas Bell Jetpack: «What’s more festive than the sweet, sweet clanging of a giant brass bell?» |
Sanitizer Jetpack: «Wash your hands for 20 seconds or blast them once with this high pressure foam dispenser, the choice is yours!» |
Heavy Machine Gun Jetpack: «How do you improve on the classic machine gun jetpack? Add more bullets!» |
Flame Shot Jetpack: «Apply to affected area, and watch your problems melt away!» |
Rocket Launcher Jetpack: «Sit back in your lawn chair and relax while these rockets do all the work for you.» |
Laser Cannon Jetpack: «Salvaged from the wreckage of the fearsome Tetsuyuki, this cannon is still fully operational and capable of wrecking destruction.» |
Borg Cube Jetpack «Use this device to assimilate all scientists and create your very own Borg collective. Aim away from face.» |
Starship Jetpack «Ever seen a warp drive strapped to someone’s back? B.Y.O. change of underpants.» |
Phaser Jetpack «Vaporise your foes with this standart issue starfleet phaser rifle.» |
Поддельное видео полета на джетпаке
Видеоролик с полетом настоящий и человек действительно поднимался в воздух. Однако, чтобы все выглядело более впечатляюще, мужчина явно был прикреплен к вертолету (или крану, никто не знает точно) при помощи тросов. Впоследствии страховка была удалена при помощи видеоредактора и это практически незаметно для обычных людей. Но острое зрение американского режиссера Ника Адамса (Nick Adams) быстро нашел обман
По данным издания New Atlas, его друзья обратили внимание на несколько странностей. Во-первых, почему при взлете не поднимается пыль? Во-вторых, почему движения во время полета выглядят так, как будто человек болтается на веревке?
Разоблачение видео про Copterpack
Ник Адамс увеличил резкость и насыщенность видео, после чего быстро заметил, что веревки были замаскированы. При воспроизведении ничего не видно, но если поставить видео на стоп и рассмотреть его покадрово, можно заметить искажения. Они есть как раз в тех местах, где к человеку могли быть прикреплены тросы. Это довольно сложный процесс редактирования видео и до конца не ясно, для чего компания ею воспользовалась. Журналисты пытались связаться с авторами видео, но не получили ответа. Поэтому остается предполагать, что страховка была необходима для обеспечения безопасности. Но также есть предположение, что аппарат просто не может самостоятельно поднять взрослого человека. По расчетам пользователей, в текущем виде он может осилить только поднятие человека весом менее 53 килограмм.
Кадр из видео
После публикации разоблачения на сайте Copterpack изменился текст. Производитель упомянул, что созданный ими аппарат находится на стадии разработки. В чем бы ни заключалась причина обработки видео, репутация компании подпортилась, но журналисты все равно хотят связаться с ее представителями. Возможно, если устройство когда-нибудь сможет поднимать в воздух взрослых людей, данную оплошность ей простят.
Как я и отмечал выше, на нашем сайте много статей про джетпаки. В 2019 году я писал про первый смертельный случай падения с такого рода устройств. Не стоит забывать, что реактивные ранцы выглядят очень впечатляюще, но при этом они очень опасны.
Независимость от версии платформы
Добавить Jetpack Compose в проект очень просто. Просто внесите несколько изменений в файл Gradle вашего приложения, и необходимые зависимости будут связаны с вашим проектом.
Конечно, пользоваться SwiftUI стало еще проще. Просто используйте правильную версию XCode и импортируйте заголовок SwiftUI, и все готово. Ну… я имею ввиду… нужно еще настроить минимально поддерживаемую версию iOS для вашего приложения.
Вы можете настроить таргетинг только на iOS 15, верно?
Я писал об этом снова и снова, но суть проста. Все фичи, функции и исправления SwiftUI привязаны к конкретной версии iOS. Точка. Полная остановка.
Так что, если, например, вы хотите использовать некоторые из инновационных новых функций SwiftUI 3.0, такие как табуляция текстовых полей или pull-to-refresh, то вам придется настроить таргетинг на iOS 15 как на единственную поддерживаемую версию iOS, на которой ваше приложение запустится.
Или, если вам нужны списки с отложенной загрузкой или управление состоянием, которое действительно работает должным образом (@StateObject), вы можете спуститься до iOS 14.
Не проблема, правда? Я имею в виду, что ваши нынешние клиенты на iOS 14 и 13, 12 и 11 будут рады обновиться или отказаться от своих старых телефонов и устройств, верно?
Jetpack Compose, с другой стороны, поддерживает Android до SDK 21. Это Android 5 (Lollipop), выпущенный еще в 2014 году!
Это означает, что разработчики Android могут начать использовать Jetpack Compose в своих существующих приложениях уже сегодня. И могут это сделать, никого не оставляя позади.
С другой стороны, большинство разработчиков iOS могут рассчитывать на использование текущей версии SwiftUI… в каком? в 2023?
Трискутеры
Средство передвижения нового поколения может быть больше похоже на электрический трехколесный велосипед, чем на привычный автомобиль.
Трискутеры спасут города от пробок и выхлопных газов
Triscooter — электромобиль, который можно купить уже сегодня. Максимальная скорость, которую он может развивать, 50 км в час — этого вполне достаточно для города. Заряжается трискутер от обычной розетки за 6–8 часов. Запас хода — до 45 км. Полной зарядки аккумулятора хватает на 12 часов работы.
Разработка идеально подходит для городской среды: за счет компактного размера (1х2х1,6 м) трискутер легко объезжает пробки и находит место для парковки. При этом вмещает до 3-х пассажиров. Управляется он достаточно легко: как мотоцикл.
Прямо сейчас можно отправиться на экономичную и экологически чистую прогулку по городу, запрыгнув в одно из этих транспортных средств. Их производство и продажу запустил предприниматель из Санкт-Петербурга Дмитрий Макеев. Ниша легкого электротранспорта в нашей стране пока не занята, и Дмитрий видит в этом хорошие возможности. Трискутер стоит значительно дешевле автомобиля с бензиновым двигателем (от 249 000 руб.). А один километр пути на нем обходится всего в 20 коп. (на бензиновом автомобиле — от 4 руб.).