Рубрики
Без рубрики

Не читали часть 1? Прочтите это сначала! Написание бессерверного андроида… С тегами android, без сервера, java, appgallery. Написание бессерверного приложения для Android (ft. AppGallery Connect от Huawei) – Часть 2 – CloudDB Не читал часть 1? Прочтите это сначала! Написание бессерверного приложения для Android (ft. Приложение Huawei AppGallery Connect) – Часть 1 – Автор Захари Пауэлл ・ 7 июля ・ 8 минут назад в ближайшие пару месяцев я выпущу полное комплексное руководство по созданию приложения для Android с использованием бессерверных функций, чтобы полностью устранить необходимость в том, чтобы в нижней части этого поста вы найдете мой канал twitch, где мы транслируем каждый четверг в 2 часа дня по восточному времени, и запускается GitHarchifacts Happy coding Надеюсь, вам было так же весело читать это, как и мне, когда я это писал:) Мои следующие шаги – сделать все это доступным для моего ребенка, простой страницей, на которой он может щелкнуть по листу спрайтов, разнесите его и отправьте на принтер в бо

Не читали часть 1? Прочтите это сначала! Написание бессерверного андроида… С тегами android, без сервера, java, appgallery. Написание бессерверного приложения для Android (ft. AppGallery Connect от Huawei) – Часть 2 – CloudDB Не читал часть 1? Прочтите это сначала! Написание бессерверного приложения для Android (ft. AppGallery Connect от Huawei) – Часть 1 – Автор Захари Пауэлл ・ 7 ・ 8 июля в течение следующих нескольких месяцев я опубликую полное комплексное руководство по созданию приложения для Android с использованием бессерверных функций, чтобы полностью устранить необходимость в том, чтобы внизу этого поста вы найдете мой канал twitch, где мы транслируем каждый четверг в 2 часа дня по восточному времени, и запускается GitHarchifacts – библиотека для извлечения архитектурных концепций из кода вашего приложения. archifacts запускает Happy coding, надеюсь, вам было так же весело читать это, как и мне писать:) Мои следующие шаги – сделать все это доступным для моего ребенка, простой страницей, на которой о

Не читали часть 1? Прочтите это сначала! Написание бессерверного андроида… С тегами android, без сервера, java, appgallery. Написание бессерверного приложения для Android (ft. AppGallery Connect от Huawei) – Часть 2 – CloudDB Не читал часть 1? Прочтите это сначала! Написание бессерверного приложения для Android (ft. AppGallery от Huawei Connect) – Часть 1 – Автор Захари Пауэлл ・ 7 июля ・ 8 минут в течение следующих нескольких месяцев я выпущу полное комплексное руководство по созданию приложения для Android с использованием бессерверных функций, чтобы полностью устранить необходимость в том, чтобы внизу этого поста вы найдете мой канал twitch, где мы транслируем каждый четверг в 2 часа дня по восточному времени, и GitHI я очень рад объявить о запуске archifacts – библиотеки, которая поможет вам извлечь строительные блоки и взаимосвязи между ними из вашего Java или Kotlin байт-код приложения. archifacts запускается с тегами архитектура, документация, archunit, java. archifacts – библиотека для извлечения архитектурных концепций из кода вашего приложения – запущена. archifacts запускает Happy coding, надеюсь, вам было так же весело читать это, как и мне писать:) Мои следующие шаги – сделать все это доступным для моего ребенка, простой страницей, на которой он может щелкнуть по листу спрайтов, разорвать его и отправить на принтер в большом формате svg с некоторыми направляющими сетками (уверен, что если нет никакого инструмента, добавление этих строк будет легким) Легко увидеть разницу, верно? Все, что вам нужно сделать, это прочитать каждый пиксель, и если цвет этого пикселя непрозрачен, запишите его как

Не читали часть 1? Прочтите это сначала! Написание бессерверного андроида… С тегами android, без сервера, java, appgallery. Написание бессерверного приложения для Android (ft. AppGallery Connect от Huawei) – Часть 2 – CloudDB Не читал часть 1? Прочтите это сначала! Написание бессерверного приложения для Android (ft. AppGallery Connect от Huawei) – Часть 1 – Автор Захари Пауэлл ・ 7 ・ 8 июля в течение следующих нескольких месяцев я опубликую полное комплексное руководство по созданию приложения для Android с использованием бессерверных функций, чтобы полностью устранить необходимость в том, чтобы внизу этого поста вы найдете мой канал twitch, где мы транслируем каждый четверг в 2 часа дня по восточному времени, и в этом сообщении в блоге я хотел бы объяснить мотивацию создания этой библиотеки. Я очень рад объявить о запуске || archifacts|| – библиотеки, которая поможет вам извлечь строительные блоки и взаимосвязи между ними из байт-кода вашего приложения Java или Kotlin. archifacts запускается с тегами архитектура, документация, archunit, java. archifacts – библиотека для извлечения архитектурных концепций из кода вашего приложения – запущена. archifacts запускает Happy coding, надеюсь, вам было так же весело читать это, как и мне писать:) Мои следующие шаги – сделать все это доступным для моего ребенка, простой страницей, на которой он может щелкнуть по листу спрайтов, разорвать его и отправить на принтер в большом формате svg с некоторыми направляющими сетками (уверен, что если нет никакого инструмента, добавление этих строк будет легким) Легко увидеть разницу, верно? Все, что вам нужно сделать, это прочитать каждый пиксель, и если цвет этого пикселя непрозрачен, запишите его как |||| элемент документа SVG. Преобразовать изображение в SVG очень просто, для такой простой задачи не требуется инструмент или платформа. И это не что иное, как язык текстовой разметки. Для этого существует масштабируемая векторная графика || или SVG для короткометражек. Ну, оказывается || Опять же, цель состоит в том, чтобы избежать использования инструмента, я хотел создать веб-сайт, на котором мой ребенок мог бы щелкнуть по пикселю и получить его распечатку на всю страницу в высоком качестве. Теперь, когда у меня есть почти бесконечный запас крошечных изображений размером 32×32, мне нужно было найти способ их масштабирования. В результате создаются индексированные изображения, такие как || picture_<индекс>.<расширение>|| в папке с тем же именем, что и исходное изображение. Итак, вот фрагмент, который я написал, чтобы сохранить спрайты из входного изображения: Но я намерен создать небольшую страницу, чтобы мой ребенок мог выбрать каждый спрайт и распечатать его, мне было бы проще писать на Kotlin. Кроме того, я хотел, чтобы это было в Kotlin, код Python достаточно прост в использовании. Мне нужно было идеальное соответствие пикселей для изображений, используя что угодно, кроме как объединить некоторые спрайты со своими соседями в единый прямоугольник. Мне пришлось немного изменить параметры, например, размер моего структурирующего элемента был уменьшен до 1 пикселя в ширину. Это именно то, что я искал. Еще один поиск в Google, и я наткнулся на эту тему || Stackoverflow ||: БИНГО! Должен быть простой способ сделать это для простых спрайтов. Но я знаю, что это мощный инструментарий, который используется, например, для обнаружения объектов в кадрах. Я совсем не знаком с этим, не буду притворяться, что знаком. Моей первой мыслью было использовать OpenCV. Я хотел все это автоматизировать. Но опять же, я не хочу вырезать каждый из этих спрайтов (187 только на этой картинке). Еще один поиск в Google, и я нашел || Вселенную Марио || веб-сайт, полный Марио || Спрайтов ||. Моя цель состояла в том, чтобы избежать необходимости использовать такие инструменты, как Gimp или || TexturePacker || для управления пиксельной графикой. И вот однажды ваш ребенок просит у вас || Молоток Марио||, который было нелегко найти. Таких, как эта, довольно много, с высоким разрешением и направляющими линиями. Недавно мой 7-летний мальчик попросил меня найти для него пиксельную графику Марио, чтобы использовать ее в качестве шаблона для создания структур minecraft. Использование компьютерного зрения для извлечения пиксельных изображений спрайтов с тегами kotlin, java, opencv, pixelart. Как автоматизировать разделение листов спрайтов с помощью OpenCV. Используя компьютерное зрение для извлечения пиксельной графики спрайтов, мы вернемся со следующей частью на следующей неделе! Код каждого эпизода фиксируется как отдельный коммит, чтобы упростить работу с кодом, просто выберите конкретный коммит и следуйте дальше! Наконец, есть также письменная копия руководства, найденного на dev.to https://dev.to/devwithzachary Затем потоки редактируются в видео, которые вы можете посмотреть || https://www.youtube.com/channel/UC63PqG8ZnWC4JWYrNJKocMA Это приложение написано во время прямых трансляций по адресу || https://www.twitch.tv/devwithzachary || Barker – это простая социальная сеть в стиле Twitter, созданная для демонстрации бессерверных сервисов, предоставляемых платформой AppGallery Connect от Huawei. Проект инициализации devwithzachary/Barker Теперь у нас все готово, на следующей неделе мы рассмотрим, как мы могли бы на самом деле использовать эту функциональность, а также расширить возможности ObjectType и хранения более сложных данных в облаке! И это все! Установка этого в качестве класса приложения в вашем манифесте: Например: Лучший способ сделать это – сделать его частью метода onCreate класса приложения. Как я упоминал ранее, нам необходимо запустить CloudDB, прежде чем мы сможем использовать его в любом месте приложения. Нам осталось еще немного настроить, а затем мы готовы начать использовать CloudDB! Теперь у нас есть все основные методы, которые могут нам понадобиться для получения/установки/удаления объекта пользователя. Это тот момент, когда мы могли бы что-то сделать с этим списком, возможно, обновить пользовательский интерфейс, чтобы показать результат, или выполнить какую-то другую обработку. Для каждого объекта в результате мы обновляем максимальный идентификатор пользователя, а затем добавляем этого пользователя в список. || , здесь мы используем курсор для перемещения по результату, возвращаемому запросом. Последним методом в этом менеджере является || processResult, примеры которого мы рассмотрим на следующей неделе (кроме предоставленного || CloudDBZoneQuery.где(User.class ) Обратите внимание, что для переменной запроса мы можем создать нужный нам тип запроса. Затем метод || queryUsers||, который сгенерирует задачу запроса и запустит ее, в случае успеха мы передадим результат в || processResult||. И, наконец, у нас есть три метода, которые обрабатывают запросы данных, метод || getAllUsers || использует предопределенный запрос, который просто запрашивает все объекты типа User. Если у данного пользователя идентификатор больше текущего максимального, обновите максимальный идентификатор до этого идентификатора пользователя. Затем средство получения идентификатора maxUserID и метод обновления идентификатора maxUserID. Далее у нас есть простой метод, который удалит пользователя из базы данных Метод || executeTask|| устанавливает прослушиватели успеха/неудачи, в то время как два других метода просто настраивают задачу в зависимости от того, повышаем ли мы одного пользователя или список пользователей. Далее у нас есть три метода, которые обрабатывают обновление пользователя, то есть либо обновление, либо вставку, в зависимости от того, существует ли пользователь уже в базе данных. Поскольку у нас есть открытый метод, у нас также должен быть метод закрытия, чтобы закрыть доступ приложений к этой зоне. Полезно, если у вас несколько приложений, которым требуются одинаковые структуры данных. Однако у них не будет доступа к данным другой зоны. Обратите внимание ||, что у вас может быть несколько зон, которые используют один и тот же тип объекта. В методе ||openCloudDBZone || мы настраиваем настроенную облачную зону, в которую будут сохраняться и из которой будут получены данные. Следующий шаг со статическим методом инициализации, метод инициализации CloudDB должен быть вызван в начале вашего приложения, поэтому этот статический метод используется именно для этого! Далее у нас есть конструктор класса, в котором мы получим экземпляр интерфейса CloudDB, который будет использоваться другими методами этого класса. CloudDB в настоящее время не поддерживает автоматическое увеличение, поэтому нам нужно будет постоянно проверять, какой идентификатор использовался последним. Сначала мы определяем переменные, которые нам понадобятся, самое важное здесь – || maxUserID||. Давайте разберем это и посмотрим, что мы сможем сделать с этим классом. Ниже приведен мой класс || CloudDBManager ||, который будет выступать в качестве оболочки, обрабатывающей большую часть функций CloudDB. Чтобы упростить управление соединением между CloudDB и функциональностью приложения, я предлагаю написать для этого отдельный класс. Как только gradle синхронизируется, мы готовы к работе! Итак, ваш файл gradle теперь должен выглядеть следующим образом: Нам нужно добавить новую зависимость CloudDB в файл apps ||build.gradle || Вы заметите, что на этом этапе код не компилируется! Это вспомогательный класс, используемый платформой для определения того, какие классы объектов доступны, в данном случае только класс пользователя. || должно выглядеть так ObjectTypeInfoHelper.java Другой сгенерированный файл, который, как вы можете видеть, представляет собой довольно стандартный класс объектов с настройкой для всех полей, которые мы определили в ObjectType. Давайте теперь взглянем на эти файлы, если вы следовали моим схемам именования вашего User.java должно выглядеть так: Это загрузит два файла в архивированную папку, распакует и добавит эти файлы java в ваш проект Android. Затем введите имя вашего пакета Android. Вернитесь на вкладку ObjectTypes и нажмите кнопку “Экспорт”, выберите формат файла JAVA и android для типа файла. Затем перейдите на следующую вкладку “Зоны облачной базы данных” и создайте новую зону, в этом примере мы назовем ее “Зазывала”. Оставьте разрешение на данные таким, какое они есть, и сохраните свой новый объект данных. Наконец, создайте индекс с именем user_id с полем индекса, равным id. В сегодняшнем примере задайте для вашего имени типа объекта значение “Пользователь”, затем мы создадим три поля: идентификатор, идентификатор пользователя и имя пользователя, как показано ниже, нажмите “Добавить”, и вам будет представлен экран, подобный этому: Далее на вкладке “Типы объектов” позволяет создать первый объект данных. Отсюда включите сервис, и если вы еще этого не сделали, вам будет предложено настроить местоположение данных. Перейдите в область || AppGallery Connect || портала разработчика, выберите проект, который мы настроили на прошлой неделе, и в меню слева найдите CloudDB в подменю “Сборка”. Сегодня мы настроим все, что нам нужно, чтобы иметь возможность использовать сервис CloudDB и устанавливать/получать/удалять данные. Начиная с проекта, который мы завершили на прошлой неделе (на GitHub), теперь давайте настроим приложение для поддержки и использования функций CloudDB от Huawei.

Не читали часть 1? Прочтите это сначала! Написание бессерверного андроида… С тегами android, без сервера, java, appgallery. Написание бессерверного приложения для Android (ft. AppGallery Connect от Huawei) – Часть 2 – CloudDB Не читал часть 1? Прочтите это сначала! Написание бессерверного приложения для Android (ft. AppGallery Connect от Huawei) – Часть 1 – Автор Захари Пауэлл ・ 7 ・ 8 июля в течение следующих нескольких месяцев я опубликую полное комплексное руководство по созданию приложения для Android с использованием бессерверных функций, чтобы полностью устранить необходимость в том, чтобы внизу этого поста вы найдете мой канал twitch, где мы транслируем каждый четверг в 2 часа дня по восточному времени, и устаревшую документацию GitHTackling В этом сообщении в блоге я хотел бы объяснить мотивацию создания этой библиотеки. Я очень рад объявить о запуске || archifacts|| – библиотеки, которая поможет вам извлечь строительные блоки и взаимосвязи между ними из байт-кода вашего приложения Java или Kotlin. archifacts запускается с тегами архитектура, документация, archunit, java. archifacts – библиотека для извлечения архитектурных концепций из кода вашего приложения – запущена. archifacts запускает Happy coding, надеюсь, вам было так же весело читать это, как и мне писать:) Мои следующие шаги – сделать все это доступным для моего ребенка, простой страницей, на которой он может щелкнуть по листу спрайтов, разорвать его и отправить на принтер в большом формате svg с некоторыми направляющими сетками (уверен, что если нет никакого инструмента, добавление этих строк будет легким) Легко увидеть разницу, верно? Все, что вам нужно сделать, это прочитать каждый пиксель, и если цвет этого пикселя непрозрачен, запишите его как |||| элемент документа SVG. Преобразовать изображение в SVG очень просто, для такой простой задачи не требуется инструмент или платформа. И это не что иное, как язык текстовой разметки. Для этого существует масштабируемая векторная графика || или SVG для короткометражек. Ну, оказывается || Опять же, цель состоит в том, чтобы избежать использования инструмента, я хотел создать веб-сайт, на котором мой ребенок мог бы щелкнуть по пикселю и получить его распечатку на всю страницу в высоком качестве. Теперь, когда у меня есть почти бесконечный запас крошечных изображений размером 32×32, мне нужно было найти способ их масштабирования. В результате создаются индексированные изображения, такие как || picture_<индекс>.<расширение>|| в папке с тем же именем, что и исходное изображение. Итак, вот фрагмент, который я написал, чтобы сохранить спрайты из входного изображения: Но я намерен создать небольшую страницу, чтобы мой ребенок мог выбрать каждый спрайт и распечатать его, мне было бы проще писать на Kotlin. Кроме того, я хотел, чтобы это было в Kotlin, код Python достаточно прост в использовании. Мне нужно было идеальное соответствие пикселей для изображений, используя что угодно, кроме как объединить некоторые спрайты со своими соседями в единый прямоугольник. Мне пришлось немного изменить параметры, например, размер моего структурирующего элемента был уменьшен до 1 пикселя в ширину. Это именно то, что я искал. Еще один поиск в Google, и я наткнулся на эту тему || Stackoverflow ||: БИНГО! Должен быть простой способ сделать это для простых спрайтов. Но я знаю, что это мощный инструментарий, который используется, например, для обнаружения объектов в кадрах. Я совсем не знаком с этим, не буду притворяться, что знаком. Моей первой мыслью было использовать OpenCV. Я хотел все это автоматизировать. Но опять же, я не хочу вырезать каждый из этих спрайтов (187 только на этой картинке). Еще один поиск в Google, и я нашел || Вселенную Марио || веб-сайт, полный Марио || Спрайтов ||. Моя цель состояла в том, чтобы избежать необходимости использовать такие инструменты, как Gimp или || TexturePacker || для управления пиксельной графикой. И вот однажды ваш ребенок просит у вас || Молоток Марио||, который было нелегко найти. Таких, как эта, довольно много, с высоким разрешением и направляющими линиями. Недавно мой 7-летний мальчик попросил меня найти для него пиксельную графику Марио, чтобы использовать ее в качестве шаблона для создания структур minecraft. Использование компьютерного зрения для извлечения пиксельных изображений спрайтов с тегами kotlin, java, opencv, pixelart. Как автоматизировать разделение листов спрайтов с помощью OpenCV. Используя компьютерное зрение для извлечения пиксельной графики спрайтов, мы вернемся со следующей частью на следующей неделе! Код каждого эпизода фиксируется как отдельный коммит, чтобы упростить работу с кодом, просто выберите конкретный коммит и следуйте дальше! Наконец, есть также письменная копия руководства, найденного на dev.to https://dev.to/devwithzachary Затем потоки редактируются в видео, которые вы можете посмотреть || https://www.youtube.com/channel/UC63PqG8ZnWC4JWYrNJKocMA Это приложение написано во время прямых трансляций по адресу || https://www.twitch.tv/devwithzachary || Barker – это простая социальная сеть в стиле Twitter, созданная для демонстрации бессерверных сервисов, предоставляемых платформой AppGallery Connect от Huawei. Проект инициализации devwithzachary/Barker Теперь у нас все готово, на следующей неделе мы рассмотрим, как мы могли бы на самом деле использовать эту функциональность, а также расширить возможности ObjectType и хранения более сложных данных в облаке! И это все! Установка этого в качестве класса приложения в вашем манифесте: Например: Лучший способ сделать это – сделать его частью метода onCreate класса приложения. Как я упоминал ранее, нам необходимо запустить CloudDB, прежде чем мы сможем использовать его в любом месте приложения. Нам осталось еще немного настроить, а затем мы готовы начать использовать CloudDB! Теперь у нас есть все основные методы, которые могут нам понадобиться для получения/установки/удаления объекта пользователя. Это тот момент, когда мы могли бы что-то сделать с этим списком, возможно, обновить пользовательский интерфейс, чтобы показать результат, или выполнить какую-то другую обработку. Для каждого объекта в результате мы обновляем максимальный идентификатор пользователя, а затем добавляем этого пользователя в список. || , здесь мы используем курсор для перемещения по результату, возвращаемому запросом. Последним методом в этом менеджере является || processResult, примеры которого мы рассмотрим на следующей неделе (кроме предоставленного || CloudDBZoneQuery.где(User.class ) Обратите внимание, что для переменной запроса мы можем создать нужный нам тип запроса. Затем метод || queryUsers||, который сгенерирует задачу запроса и запустит ее, в случае успеха мы передадим результат в || processResult||. И, наконец, у нас есть три метода, которые обрабатывают запросы данных, метод || getAllUsers || использует предопределенный запрос, который просто запрашивает все объекты типа User. Если у данного пользователя идентификатор больше текущего максимального, обновите максимальный идентификатор до этого идентификатора пользователя. Затем средство получения идентификатора maxUserID и метод обновления идентификатора maxUserID. Далее у нас есть простой метод, который удалит пользователя из базы данных Метод || executeTask|| устанавливает прослушиватели успеха/неудачи, в то время как два других метода просто настраивают задачу в зависимости от того, повышаем ли мы одного пользователя или список пользователей. Далее у нас есть три метода, которые обрабатывают обновление пользователя, то есть либо обновление, либо вставку, в зависимости от того, существует ли пользователь уже в базе данных. Поскольку у нас есть открытый метод, у нас также должен быть метод закрытия, чтобы закрыть доступ приложений к этой зоне. Полезно, если у вас несколько приложений, которым требуются одинаковые структуры данных. Однако у них не будет доступа к данным другой зоны. Обратите внимание ||, что у вас может быть несколько зон, которые используют один и тот же тип объекта. В методе ||openCloudDBZone || мы настраиваем настроенную облачную зону, в которую будут сохраняться и из которой будут получены данные. Следующий шаг со статическим методом инициализации, метод инициализации CloudDB должен быть вызван в начале вашего приложения, поэтому этот статический метод используется именно для этого! Далее у нас есть конструктор класса, в котором мы получим экземпляр интерфейса CloudDB, который будет использоваться другими методами этого класса. CloudDB в настоящее время не поддерживает автоматическое увеличение, поэтому нам нужно будет постоянно проверять, какой идентификатор использовался последним. Сначала мы определяем переменные, которые нам понадобятся, самое важное здесь – || maxUserID||. Давайте разберем это и посмотрим, что мы сможем сделать с этим классом. Ниже приведен мой класс || CloudDBManager ||, который будет выступать в качестве оболочки, обрабатывающей большую часть функций CloudDB. Чтобы упростить управление соединением между CloudDB и функциональностью приложения, я предлагаю написать для этого отдельный класс. Как только gradle синхронизируется, мы готовы к работе! Итак, ваш файл gradle теперь должен выглядеть следующим образом: Нам нужно добавить новую зависимость CloudDB в файл apps ||build.gradle || Вы заметите, что на этом этапе код не компилируется! Это вспомогательный класс, используемый платформой для определения того, какие классы объектов доступны, в данном случае только класс пользователя. || должно выглядеть так ObjectTypeInfoHelper.java Другой сгенерированный файл, который, как вы можете видеть, представляет собой довольно стандартный класс объектов с настройкой для всех полей, которые мы определили в ObjectType. Давайте теперь взглянем на эти файлы, если вы следовали моим схемам именования вашего User.java должно выглядеть так: Это загрузит два файла в архивированную папку, распакует и добавит эти файлы java в ваш проект Android. Затем введите имя вашего пакета Android. Вернитесь на вкладку ObjectTypes и нажмите кнопку “Экспорт”, выберите формат файла JAVA и android для типа файла. Затем перейдите на следующую вкладку “Зоны облачной базы данных” и создайте новую зону, в этом примере мы назовем ее “Зазывала”. Оставьте разрешение на данные таким, какое они есть, и сохраните свой новый объект данных. Наконец, создайте индекс с именем user_id с полем индекса, равным id. В сегодняшнем примере задайте для вашего имени типа объекта значение “Пользователь”, затем мы создадим три поля: идентификатор, идентификатор пользователя и имя пользователя, как показано ниже, нажмите “Добавить”, и вам будет представлен экран, подобный этому: Далее на вкладке “Типы объектов” позволяет создать первый объект данных. Отсюда включите сервис, и если вы еще этого не сделали, вам будет предложено настроить местоположение данных. Перейдите в область || AppGallery Connect || портала разработчика, выберите проект, который мы настроили на прошлой неделе, и в меню слева найдите CloudDB в подменю “Сборка”. Сегодня мы настроим все, что нам нужно, чтобы иметь возможность использовать сервис CloudDB и устанавливать/получать/удалять данные.

Не читали часть 1? Прочтите это сначала! Написание бессерверного андроида… С тегами android, без сервера, java, appgallery. Написание бессерверного приложения для Android (ft. AppGallery Connect от Huawei) – Часть 2 – CloudDB Не читал часть 1? Прочтите это сначала! Написание бессерверного приложения для Android (ft. AppGallery от Huawei Connect) – Часть 1 – Автор Захари Пауэлл ・ 7 ・ 8 июля в течение следующих нескольких месяцев я опубликую полное комплексное руководство по созданию приложения для Android с использованием бессерверных функций, чтобы полностью устранить необходимость в том, чтобы внизу этого поста вы найдете мой канал twitch, где мы транслируем каждый четверг в 2 часа дня по восточному времени, и несколько недель назад я наткнулся на этот твит Тюдора Гирбы. Решение проблемы устаревшей документации В этом сообщении в блоге я хотел бы объяснить мотивацию создания этой библиотеки. Я очень рад объявить о запуске || archifacts|| – библиотеки, которая поможет вам извлечь строительные блоки и взаимосвязи между ними из байт-кода вашего приложения Java или Kotlin. archifacts запускается с тегами архитектура, документация, archunit, java. archifacts – библиотека для извлечения архитектурных концепций из кода вашего приложения – запущена. archifacts запускает Happy coding, надеюсь, вам было так же весело читать это, как и мне писать:) Мои следующие шаги – сделать все это доступным для моего ребенка, простой страницей, на которой он может щелкнуть по листу спрайтов, разорвать его и отправить на принтер в большом формате svg с некоторыми направляющими сетками (уверен, что если нет никакого инструмента, добавление этих строк будет легким) Легко увидеть разницу, верно? Все, что вам нужно сделать, это прочитать каждый пиксель, и если цвет этого пикселя непрозрачен, запишите его как |||| элемент документа SVG. Преобразовать изображение в SVG очень просто, для такой простой задачи не требуется инструмент или платформа. И это не что иное, как язык текстовой разметки. Для этого существует масштабируемая векторная графика || или SVG для короткометражек. Ну, оказывается || Опять же, цель состоит в том, чтобы избежать использования инструмента, я хотел создать веб-сайт, на котором мой ребенок мог бы щелкнуть по пикселю и получить его распечатку на всю страницу в высоком качестве. Теперь, когда у меня есть почти бесконечный запас крошечных изображений размером 32×32, мне нужно было найти способ их масштабирования. В результате создаются индексированные изображения, такие как || picture_<индекс>.<расширение>|| в папке с тем же именем, что и исходное изображение. Итак, вот фрагмент, который я написал, чтобы сохранить спрайты из входного изображения: Но я намерен создать небольшую страницу, чтобы мой ребенок мог выбрать каждый спрайт и распечатать его, мне было бы проще писать на Kotlin. Кроме того, я хотел, чтобы это было в Kotlin, код Python достаточно прост в использовании. Мне нужно было идеальное соответствие пикселей для изображений, используя что угодно, кроме как объединить некоторые спрайты со своими соседями в единый прямоугольник. Мне пришлось немного изменить параметры, например, размер моего структурирующего элемента был уменьшен до 1 пикселя в ширину. Это именно то, что я искал. Еще один поиск в Google, и я наткнулся на эту тему || Stackoverflow ||: БИНГО! Должен быть простой способ сделать это для простых спрайтов. Но я знаю, что это мощный инструментарий, который используется, например, для обнаружения объектов в кадрах. Я совсем не знаком с этим, не буду притворяться, что знаком. Моей первой мыслью было использовать OpenCV. Я хотел все это автоматизировать. Но опять же, я не хочу вырезать каждый из этих спрайтов (187 только на этой картинке). Еще один поиск в Google, и я нашел || Вселенную Марио || веб-сайт, полный Марио || Спрайтов ||. Моя цель состояла в том, чтобы избежать необходимости использовать такие инструменты, как Gimp или || TexturePacker || для управления пиксельной графикой. И вот однажды ваш ребенок просит у вас || Молоток Марио||, который было нелегко найти. Таких, как эта, довольно много, с высоким разрешением и направляющими линиями. Недавно мой 7-летний мальчик попросил меня найти для него пиксельную графику Марио, чтобы использовать ее в качестве шаблона для создания структур minecraft. Использование компьютерного зрения для извлечения пиксельных изображений спрайтов с тегами kotlin, java, opencv, pixelart. Как автоматизировать разделение листов спрайтов с помощью OpenCV. Используя компьютерное зрение для извлечения пиксельной графики спрайтов, мы вернемся со следующей частью на следующей неделе! Код каждого эпизода фиксируется как отдельный коммит, чтобы упростить работу с кодом, просто выберите конкретный коммит и следуйте дальше! Наконец, есть также письменная копия руководства, найденного на dev.to https://dev.to/devwithzachary Затем потоки редактируются в видео, которые вы можете посмотреть || https://www.youtube.com/channel/UC63PqG8ZnWC4JWYrNJKocMA Это приложение написано во время прямых трансляций по адресу || https://www.twitch.tv/devwithzachary || Barker – это простая социальная сеть в стиле Twitter, созданная для демонстрации бессерверных сервисов, предоставляемых платформой AppGallery Connect от Huawei. Проект инициализации devwithzachary/Barker Теперь у нас все готово, на следующей неделе мы рассмотрим, как мы могли бы на самом деле использовать эту функциональность, а также расширить возможности ObjectType и хранения более сложных данных в облаке! И это все! Установка этого в качестве класса приложения в вашем манифесте: Например: Лучший способ сделать это – сделать его частью метода onCreate класса приложения. Как я упоминал ранее, нам необходимо запустить CloudDB, прежде чем мы сможем использовать его в любом месте приложения. Нам осталось еще немного настроить, а затем мы готовы начать использовать CloudDB! Теперь у нас есть все основные методы, которые могут нам понадобиться для получения/установки/удаления объекта пользователя. Это тот момент, когда мы могли бы что-то сделать с этим списком, возможно, обновить пользовательский интерфейс, чтобы показать результат, или выполнить какую-то другую обработку. Для каждого объекта в результате мы обновляем максимальный идентификатор пользователя, а затем добавляем этого пользователя в список. || , здесь мы используем курсор для перемещения по результату, возвращаемому запросом. Последним методом в этом менеджере является || processResult, примеры которого мы рассмотрим на следующей неделе (кроме предоставленного || CloudDBZoneQuery.где(User.class ) Обратите внимание, что для переменной запроса мы можем создать нужный нам тип запроса. Затем метод || queryUsers||, который сгенерирует задачу запроса и запустит ее, в случае успеха мы передадим результат в || processResult||. И, наконец, у нас есть три метода, которые обрабатывают запросы данных, метод || getAllUsers || использует предопределенный запрос, который просто запрашивает все объекты типа User. Если у данного пользователя идентификатор больше текущего максимального, обновите максимальный идентификатор до этого идентификатора пользователя. Затем средство получения идентификатора maxUserID и метод обновления идентификатора maxUserID. Далее у нас есть простой метод, который удалит пользователя из базы данных Метод || executeTask|| устанавливает прослушиватели успеха/неудачи, в то время как два других метода просто настраивают задачу в зависимости от того, повышаем ли мы одного пользователя или список пользователей. Далее у нас есть три метода, которые обрабатывают обновление пользователя, то есть либо обновление, либо вставку, в зависимости от того, существует ли пользователь уже в базе данных. Поскольку у нас есть открытый метод, у нас также должен быть метод закрытия, чтобы закрыть доступ приложений к этой зоне. Полезно, если у вас несколько приложений, которым требуются одинаковые структуры данных. Однако у них не будет доступа к данным другой зоны. Обратите внимание ||, что у вас может быть несколько зон, которые используют один и тот же тип объекта. В методе ||openCloudDBZone || мы настраиваем настроенную облачную зону, в которую будут сохраняться и из которой будут получены данные. Следующий шаг со статическим методом инициализации, метод инициализации CloudDB должен быть вызван в начале вашего приложения, поэтому этот статический метод используется именно для этого! Далее у нас есть конструктор класса, в котором мы получим экземпляр интерфейса CloudDB, который будет использоваться другими методами этого класса. CloudDB в настоящее время не поддерживает автоматическое увеличение, поэтому нам нужно будет постоянно проверять, какой идентификатор использовался последним. Сначала мы определяем переменные, которые нам понадобятся, самое важное здесь – || maxUserID||. Давайте разберем это и посмотрим, что мы сможем сделать с этим классом. Ниже приведен мой класс || CloudDBManager ||, который будет выступать в качестве оболочки, обрабатывающей большую часть функций CloudDB. Чтобы упростить управление соединением между CloudDB и функциональностью приложения, я предлагаю написать для этого отдельный класс. Как только gradle синхронизируется, мы готовы к работе! Итак, ваш файл gradle теперь должен выглядеть следующим образом: Нам нужно добавить новую зависимость CloudDB в файл apps ||build.gradle || Вы заметите, что на этом этапе код не компилируется! Это вспомогательный класс, используемый платформой для определения того, какие классы объектов доступны, в данном случае только класс пользователя. || должно выглядеть так ObjectTypeInfoHelper.java Другой сгенерированный файл, который, как вы можете видеть, представляет собой довольно стандартный класс объектов с настройкой для всех полей, которые мы определили в ObjectType. Давайте теперь взглянем на эти файлы, если вы следовали моим схемам именования вашего User.java должно выглядеть так: Это загрузит два файла в архивированную папку, распакует и добавит эти файлы java в ваш проект Android. Затем введите имя вашего пакета Android. Вернитесь на вкладку ObjectTypes и нажмите кнопку “Экспорт”, выберите формат файла JAVA и android для типа файла. Затем перейдите на следующую вкладку “Зоны облачной базы данных” и создайте новую зону, в этом примере мы назовем ее “Зазывала”. Оставьте разрешение на данные таким, какое они есть, и сохраните свой новый объект данных. Наконец, создайте индекс с именем user_id с полем индекса, равным id. В сегодняшнем примере задайте для вашего имени типа объекта значение “Пользователь”, затем мы создадим три поля: идентификатор, идентификатор пользователя и имя пользователя, как показано ниже, нажмите “Добавить”, и вам будет представлен экран, подобный этому: Далее на вкладке “Типы объектов” позволяет создать первый объект данных. Отсюда включите сервис, и если вы еще этого не сделали, вам будет предложено настроить местоположение данных. Перейдите в область || AppGallery Connect || портала разработчика, выберите проект, который мы настроили на прошлой неделе, и в меню слева найдите CloudDB в подменю “Сборка”. Сегодня мы настроим все, что нам нужно, чтобы иметь возможность использовать сервис CloudDB и устанавливать/получать/удалять данные.

Не читали часть 1? Прочтите это сначала! Написание бессерверного андроида… С тегами android, без сервера, java, appgallery. Написание бессерверного приложения для Android (ft. AppGallery Connect от Huawei) – Часть 2 – CloudDB Не читал часть 1? Прочтите это сначала! Написание бессерверного приложения для Android (ft. AppGallery Connect от Huawei) – Часть 1 – Автор Захари Пауэлл ・ 7 ・ 8 июля в течение следующих нескольких месяцев я опубликую полное комплексное руководство по созданию приложения для Android с использованием бессерверных функций, чтобы полностью устранить необходимость в том, чтобы в нижней части этого поста вы найдете мой канал twitch, где мы транслируем каждый четверг в 2 часа дня по восточному времени, и githкогда вы просматриваете комментарии, вы быстро понимаете, что большинство дискуссий посвящено проблеме обновления документации. Несколько недель назад я наткнулся на этот твит Тюдора Гирбы. Решение проблемы устаревшей документации В этом сообщении в блоге я хотел бы объяснить мотивацию создания этой библиотеки. Я очень рад объявить о запуске || archifacts|| – библиотеки, которая поможет вам извлечь строительные блоки и взаимосвязи между ними из байт-кода вашего приложения Java или Kotlin. archifacts запускается с тегами архитектура, документация, archunit, java. archifacts – библиотека для извлечения архитектурных концепций из кода вашего приложения – запущена. archifacts запускает Happy coding, надеюсь, вам было так же весело читать это, как и мне писать:) Мои следующие шаги – сделать все это доступным для моего ребенка, простой страницей, на которой он может щелкнуть по листу спрайтов, разорвать его и отправить на принтер в большом формате svg с некоторыми направляющими сетками (уверен, что если нет никакого инструмента, добавление этих строк будет легким) Легко увидеть разницу, верно? Все, что вам нужно сделать, это прочитать каждый пиксель, и если цвет этого пикселя непрозрачен, запишите его как |||| элемент документа SVG. Преобразовать изображение в SVG очень просто, для такой простой задачи не требуется инструмент или платформа. И это не что иное, как язык текстовой разметки. Для этого существует масштабируемая векторная графика || или SVG для короткометражек. Ну, оказывается || Опять же, цель состоит в том, чтобы избежать использования инструмента, я хотел создать веб-сайт, на котором мой ребенок мог бы щелкнуть по пикселю и получить его распечатку на всю страницу в высоком качестве. Теперь, когда у меня есть почти бесконечный запас крошечных изображений размером 32×32, мне нужно было найти способ их масштабирования. В результате создаются индексированные изображения, такие как || picture_<индекс>.<расширение>|| в папке с тем же именем, что и исходное изображение. Итак, вот фрагмент, который я написал, чтобы сохранить спрайты из входного изображения: Но я намерен создать небольшую страницу, чтобы мой ребенок мог выбрать каждый спрайт и распечатать его, мне было бы проще писать на Kotlin. Кроме того, я хотел, чтобы это было в Kotlin, код Python достаточно прост в использовании. Мне нужно было идеальное соответствие пикселей для изображений, используя что угодно, кроме как объединить некоторые спрайты со своими соседями в единый прямоугольник. Мне пришлось немного изменить параметры, например, размер моего структурирующего элемента был уменьшен до 1 пикселя в ширину. Это именно то, что я искал. Еще один поиск в Google, и я наткнулся на эту тему || Stackoverflow ||: БИНГО! Должен быть простой способ сделать это для простых спрайтов. Но я знаю, что это мощный инструментарий, который используется, например, для обнаружения объектов в кадрах. Я совсем не знаком с этим, не буду притворяться, что знаком. Моей первой мыслью было использовать OpenCV. Я хотел все это автоматизировать. Но опять же, я не хочу вырезать каждый из этих спрайтов (187 только на этой картинке). Еще один поиск в Google, и я нашел || Вселенную Марио || веб-сайт, полный Марио || Спрайтов ||. Моя цель состояла в том, чтобы избежать необходимости использовать такие инструменты, как Gimp или || TexturePacker || для управления пиксельной графикой. И вот однажды ваш ребенок просит у вас || Молоток Марио||, который было нелегко найти. Таких, как эта, довольно много, с высоким разрешением и направляющими линиями. Недавно мой 7-летний мальчик попросил меня найти для него пиксельную графику Марио, чтобы использовать ее в качестве шаблона для создания структур minecraft. Использование компьютерного зрения для извлечения пиксельных изображений спрайтов с тегами kotlin, java, opencv, pixelart. Как автоматизировать разделение листов спрайтов с помощью OpenCV. Используя компьютерное зрение для извлечения пиксельной графики спрайтов, мы вернемся со следующей частью на следующей неделе! Код каждого эпизода фиксируется как отдельный коммит, чтобы упростить работу с кодом, просто выберите конкретный коммит и следуйте дальше! Наконец, есть также письменная копия руководства, найденного на dev.to https://dev.to/devwithzachary Затем потоки редактируются в видео, которые вы можете посмотреть || https://www.youtube.com/channel/UC63PqG8ZnWC4JWYrNJKocMA Это приложение написано во время прямых трансляций по адресу || https://www.twitch.tv/devwithzachary || Barker – это простая социальная сеть в стиле Twitter, созданная для демонстрации бессерверных сервисов, предоставляемых платформой AppGallery Connect от Huawei. Проект инициализации devwithzachary/Barker Теперь у нас все готово, на следующей неделе мы рассмотрим, как мы могли бы на самом деле использовать эту функциональность, а также расширить возможности ObjectType и хранения более сложных данных в облаке! И это все! Установка этого в качестве класса приложения в вашем манифесте: Например: Лучший способ сделать это – сделать его частью метода onCreate класса приложения. Как я упоминал ранее, нам необходимо запустить CloudDB, прежде чем мы сможем использовать его в любом месте приложения. Нам осталось еще немного настроить, а затем мы готовы начать использовать CloudDB! Теперь у нас есть все основные методы, которые могут нам понадобиться для получения/установки/удаления объекта пользователя. Это тот момент, когда мы могли бы что-то сделать с этим списком, возможно, обновить пользовательский интерфейс, чтобы показать результат, или выполнить какую-то другую обработку. Для каждого объекта в результате мы обновляем максимальный идентификатор пользователя, а затем добавляем этого пользователя в список. || , здесь мы используем курсор для перемещения по результату, возвращаемому запросом. Последним методом в этом менеджере является || processResult, примеры которого мы рассмотрим на следующей неделе (кроме предоставленного || CloudDBZoneQuery.где(User.class ) Обратите внимание, что для переменной запроса мы можем создать нужный нам тип запроса. Затем метод || queryUsers||, который сгенерирует задачу запроса и запустит ее, в случае успеха мы передадим результат в || processResult||. И, наконец, у нас есть три метода, которые обрабатывают запросы данных, метод || getAllUsers || использует предопределенный запрос, который просто запрашивает все объекты типа User. Если у данного пользователя идентификатор больше текущего максимального, обновите максимальный идентификатор до этого идентификатора пользователя. Затем средство получения идентификатора maxUserID и метод обновления идентификатора maxUserID. Далее у нас есть простой метод, который удалит пользователя из базы данных Метод || executeTask|| устанавливает прослушиватели успеха/неудачи, в то время как два других метода просто настраивают задачу в зависимости от того, повышаем ли мы одного пользователя или список пользователей. Далее у нас есть три метода, которые обрабатывают обновление пользователя, то есть либо обновление, либо вставку, в зависимости от того, существует ли пользователь уже в базе данных. Поскольку у нас есть открытый метод, у нас также должен быть метод закрытия, чтобы закрыть доступ приложений к этой зоне. Полезно, если у вас несколько приложений, которым требуются одинаковые структуры данных. Однако у них не будет доступа к данным другой зоны. Обратите внимание ||, что у вас может быть несколько зон, которые используют один и тот же тип объекта. В методе ||openCloudDBZone || мы настраиваем настроенную облачную зону, в которую будут сохраняться и из которой будут получены данные. Следующий шаг со статическим методом инициализации, метод инициализации CloudDB должен быть вызван в начале вашего приложения, поэтому этот статический метод используется именно для этого! Далее у нас есть конструктор класса, в котором мы получим экземпляр интерфейса CloudDB, который будет использоваться другими методами этого класса. CloudDB в настоящее время не поддерживает автоматическое увеличение, поэтому нам нужно будет постоянно проверять, какой идентификатор использовался последним. Сначала мы определяем переменные, которые нам понадобятся, самое важное здесь – || maxUserID||. Давайте разберем это и посмотрим, что мы сможем сделать с этим классом. Ниже приведен мой класс || CloudDBManager ||, который будет выступать в качестве оболочки, обрабатывающей большую часть функций CloudDB. Чтобы упростить управление соединением между CloudDB и функциональностью приложения, я предлагаю написать для этого отдельный класс. Как только gradle синхронизируется, мы готовы к работе! Итак, ваш файл gradle теперь должен выглядеть следующим образом: Нам нужно добавить новую зависимость CloudDB в файл apps ||build.gradle || Вы заметите, что на этом этапе код не компилируется! Это вспомогательный класс, используемый платформой для определения того, какие классы объектов доступны, в данном случае только класс пользователя. || должно выглядеть так ObjectTypeInfoHelper.java Другой сгенерированный файл, который, как вы можете видеть, представляет собой довольно стандартный класс объектов с настройкой для всех полей, которые мы определили в ObjectType. Давайте теперь взглянем на эти файлы, если вы следовали моим схемам именования вашего User.java должно выглядеть так: Это загрузит два файла в архивированную папку, распакует и добавит эти файлы java в ваш проект Android. Затем введите имя вашего пакета Android. Вернитесь на вкладку ObjectTypes и нажмите кнопку “Экспорт”, выберите формат файла JAVA и android для типа файла. Затем перейдите на следующую вкладку “Зоны облачной базы данных” и создайте новую зону, в этом примере мы назовем ее “Зазывала”. Оставьте разрешение на данные таким, какое они есть, и сохраните свой новый объект данных. Наконец, создайте индекс с именем user_id с полем индекса, равным id. В сегодняшнем примере задайте для вашего имени типа объекта значение “Пользователь”, затем мы создадим три поля: идентификатор, идентификатор пользователя и имя пользователя, как показано ниже, нажмите “Добавить”, и вам будет представлен экран, подобный этому: Далее на вкладке “Типы объектов” позволяет создать первый объект данных. Отсюда включите сервис, и если вы еще этого не сделали, вам будет предложено настроить местоположение данных. Перейдите в область || AppGallery Connect || портала разработчика, выберите проект, который мы настроили на прошлой неделе, и в меню слева найдите CloudDB в подменю “Сборка”. Не читали часть 1? Прочтите это сначала! Написание бессерверного андроида… С тегами android, без сервера, java, appgallery. Написание бессерверного приложения для Android (ft. AppGallery Connect от Huawei) – Часть 2 – CloudDB Не читал часть 1? Прочтите это сначала! Написание бессерверного приложения для Android (ft. AppGallery Connect от Huawei) – Часть 1 – Автор Захари Пауэлл ・ 7 ・ 8 июля в течение следующих нескольких месяцев я опубликую полное комплексное руководство по созданию приложения для Android с использованием бессерверных функций, чтобы полностью устранить необходимость в том, чтобы внизу этого поста вы найдете мой канал twitch, где мы транслируем каждый четверг в 2 часа дня по восточному времени, и в моем текущем проекте мы столкнулись с этой ловушкой, поскольку мы создали очень обширную документацию, которая не могла идти в ногу с прогрессом приложения. Просматривая комментарии, вы быстро понимаете, что большинство обсуждений посвящено проблеме обновления документации. Несколько недель назад я наткнулся на этот твит Тюдора Гирбы. Решение проблемы устаревшей документации В этом сообщении в блоге я хотел бы объяснить мотивацию создания этой библиотеки. Я очень рад объявить о запуске || archifacts|| – библиотеки, которая поможет вам извлечь строительные блоки и взаимосвязи между ними из байт-кода вашего приложения Java или Kotlin. archifacts запускается с тегами архитектура, документация, archunit, java. archifacts – библиотека для извлечения архитектурных концепций из кода вашего приложения – запущена. archifacts запускает Happy coding, надеюсь, вам было так же весело читать это, как и мне писать:) Мои следующие шаги – сделать все это доступным для моего ребенка, простой страницей, на которой он может щелкнуть по листу спрайтов, разорвать его и отправить на принтер в большом формате svg с некоторыми направляющими сетками (уверен, что если нет никакого инструмента, добавление этих строк будет легким) Легко увидеть разницу, верно? Все, что вам нужно сделать, это прочитать каждый пиксель, и если цвет этого пикселя непрозрачен, запишите его как |||| элемент документа SVG. Преобразовать изображение в SVG очень просто, для такой простой задачи не требуется инструмент или платформа. И это не что иное, как язык текстовой разметки. Для этого существует масштабируемая векторная графика || или SVG для короткометражек. Ну, оказывается || Опять же, цель состоит в том, чтобы избежать использования инструмента, я хотел создать веб-сайт, на котором мой ребенок мог бы щелкнуть по пикселю и получить его распечатку на всю страницу в высоком качестве. Теперь, когда у меня есть почти бесконечный запас крошечных изображений размером 32×32, мне нужно было найти способ их масштабирования. В результате создаются индексированные изображения, такие как || picture_<индекс>.<расширение>|| в папке с тем же именем, что и исходное изображение. Итак, вот фрагмент, который я написал, чтобы сохранить спрайты из входного изображения: Но я намерен создать небольшую страницу, чтобы мой ребенок мог выбрать каждый спрайт и распечатать его, мне было бы проще писать на Kotlin. Кроме того, я хотел, чтобы это было в Kotlin, код Python достаточно прост в использовании. Мне нужно было идеальное соответствие пикселей для изображений, используя что угодно, кроме как объединить некоторые спрайты со своими соседями в единый прямоугольник. Мне пришлось немного изменить параметры, например, размер моего структурирующего элемента был уменьшен до 1 пикселя в ширину. Это именно то, что я искал. Еще один поиск в Google, и я наткнулся на эту тему || Stackoverflow ||: БИНГО! Должен быть простой способ сделать это для простых спрайтов. Но я знаю, что это мощный инструментарий, который используется, например, для обнаружения объектов в кадрах. Я совсем не знаком с этим, не буду притворяться, что знаком. Моей первой мыслью было использовать OpenCV. Я хотел все это автоматизировать. Но опять же, я не хочу вырезать каждый из этих спрайтов (187 только на этой картинке). Еще один поиск в Google, и я нашел || Вселенную Марио || веб-сайт, полный Марио || Спрайтов ||. Моя цель состояла в том, чтобы избежать необходимости использовать такие инструменты, как Gimp или || TexturePacker || для управления пиксельной графикой. И вот однажды ваш ребенок просит у вас || Молоток Марио||, который было нелегко найти. Таких, как эта, довольно много, с высоким разрешением и направляющими линиями. Недавно мой 7-летний мальчик попросил меня найти для него пиксельную графику Марио, чтобы использовать ее в качестве шаблона для создания структур minecraft. Использование компьютерного зрения для извлечения пиксельных изображений спрайтов с тегами kotlin, java, opencv, pixelart. Как автоматизировать разделение листов спрайтов с помощью OpenCV. Используя компьютерное зрение для извлечения пиксельной графики спрайтов, мы вернемся со следующей частью на следующей неделе! Код каждого эпизода фиксируется как отдельный коммит, чтобы упростить работу с кодом, просто выберите конкретный коммит и следуйте дальше! Наконец, есть также письменная копия руководства, найденного на dev.to https://dev.to/devwithzachary Затем потоки редактируются в видео, которые вы можете посмотреть || https://www.youtube.com/channel/UC63PqG8ZnWC4JWYrNJKocMA Это приложение написано во время прямых трансляций по адресу || https://www.twitch.tv/devwithzachary || Barker – это простая социальная сеть в стиле Twitter, созданная для демонстрации бессерверных сервисов, предоставляемых платформой AppGallery Connect от Huawei. Проект инициализации devwithzachary/Barker Теперь у нас все готово, на следующей неделе мы рассмотрим, как мы могли бы на самом деле использовать эту функциональность, а также расширить возможности ObjectType и хранения более сложных данных в облаке! И это все! Установка этого в качестве класса приложения в вашем манифесте: Например: Лучший способ сделать это – сделать его частью метода onCreate класса приложения. Как я упоминал ранее, нам необходимо запустить CloudDB, прежде чем мы сможем использовать его в любом месте приложения. Нам осталось еще немного настроить, а затем мы готовы начать использовать CloudDB! Теперь у нас есть все основные методы, которые могут нам понадобиться для получения/установки/удаления объекта пользователя. Это тот момент, когда мы могли бы что-то сделать с этим списком, возможно, обновить пользовательский интерфейс, чтобы показать результат, или выполнить какую-то другую обработку. Для каждого объекта в результате мы обновляем максимальный идентификатор пользователя, а затем добавляем этого пользователя в список. || , здесь мы используем курсор для перемещения по результату, возвращаемому запросом. Последним методом в этом менеджере является || processResult, примеры которого мы рассмотрим на следующей неделе (кроме предоставленного || CloudDBZoneQuery.где(User.class ) Обратите внимание, что для переменной запроса мы можем создать нужный нам тип запроса. Затем метод || queryUsers||, который сгенерирует задачу запроса и запустит ее, в случае успеха мы передадим результат в || processResult||. И, наконец, у нас есть три метода, которые обрабатывают запросы данных, метод || getAllUsers || использует предопределенный запрос, который просто запрашивает все объекты типа User. Если у данного пользователя идентификатор больше текущего максимального, обновите максимальный идентификатор до этого идентификатора пользователя. Затем средство получения идентификатора maxUserID и метод обновления идентификатора maxUserID. Далее у нас есть простой метод, который удалит пользователя из базы данных Метод || executeTask|| устанавливает прослушиватели успеха/неудачи, в то время как два других метода просто настраивают задачу в зависимости от того, повышаем ли мы одного пользователя или список пользователей. Далее у нас есть три метода, которые обрабатывают обновление пользователя, то есть либо обновление, либо вставку, в зависимости от того, существует ли пользователь уже в базе данных. Поскольку у нас есть открытый метод, у нас также должен быть метод закрытия, чтобы закрыть доступ приложений к этой зоне. Полезно, если у вас несколько приложений, которым требуются одинаковые структуры данных. Однако у них не будет доступа к данным другой зоны. Обратите внимание ||, что у вас может быть несколько зон, которые используют один и тот же тип объекта. В методе ||openCloudDBZone || мы настраиваем настроенную облачную зону, в которую будут сохраняться и из которой будут получены данные. Следующий шаг со статическим методом инициализации, метод инициализации CloudDB должен быть вызван в начале вашего приложения, поэтому этот статический метод используется именно для этого! Далее у нас есть конструктор класса, в котором мы получим экземпляр интерфейса CloudDB, который будет использоваться другими методами этого класса. CloudDB в настоящее время не поддерживает автоматическое увеличение, поэтому нам нужно будет постоянно проверять, какой идентификатор использовался последним. Сначала мы определяем переменные, которые нам понадобятся, самое важное здесь – || maxUserID||. Давайте разберем это и посмотрим, что мы сможем сделать с этим классом. Ниже приведен мой класс || CloudDBManager ||, который будет выступать в качестве оболочки, обрабатывающей большую часть функций CloudDB. Чтобы упростить управление соединением между CloudDB и функциональностью приложения, я предлагаю написать для этого отдельный класс. Как только gradle синхронизируется, мы готовы к работе! Итак, ваш файл gradle теперь должен выглядеть следующим образом: Нам нужно добавить новую зависимость CloudDB в файл apps ||build.gradle || Вы заметите, что на этом этапе код не компилируется! Это вспомогательный класс, используемый платформой для определения того, какие классы объектов доступны, в данном случае только класс пользователя. || должно выглядеть так ObjectTypeInfoHelper.java Другой сгенерированный файл, который, как вы можете видеть, представляет собой довольно стандартный класс объектов с настройкой для всех полей, которые мы определили в ObjectType. Давайте теперь взглянем на эти файлы, если вы следовали моим схемам именования вашего User.java должно выглядеть так: Это загрузит два файла в архивированную папку, распакует и добавит эти файлы java в ваш проект Android. Затем введите имя вашего пакета Android. Вернитесь на вкладку ObjectTypes и нажмите кнопку “Экспорт”, выберите формат файла JAVA и android для типа файла. Затем перейдите на следующую вкладку “Зоны облачной базы данных” и создайте новую зону, в этом примере мы назовем ее “Зазывала”. Оставьте разрешение на данные таким, какое они есть, и сохраните свой новый объект данных. Наконец, создайте индекс с именем user_id с полем индекса, равным id. В сегодняшнем примере задайте для вашего имени типа объекта значение “Пользователь”, затем мы создадим три поля: идентификатор, идентификатор пользователя и имя пользователя, как показано ниже, нажмите “Добавить”, и вам будет представлен экран, подобный этому: Далее на вкладке “Типы объектов” позволяет создать первый объект данных. Отсюда включите сервис, и если вы еще этого не сделали, вам будет предложено настроить местоположение данных.

Не читали часть 1? Прочтите это сначала! Написание бессерверного андроида… С тегами android, без сервера, java, appgallery. Написание бессерверного приложения для Android (ft. AppGallery Connect от Huawei) – Часть 2 – CloudDB Не читал часть 1? Прочтите это сначала! Написание бессерверного приложения для Android (ft. AppGallery Connect от Huawei) – Часть 1 – Автор Захари Пауэлл ・ 7 ・ 8 июля в течение следующих нескольких месяцев я опубликую полное комплексное руководство по созданию приложения для Android с использованием бессерверных функций, чтобы полностью устранить необходимость в том, чтобы в нижней части этого поста вы найдете мой канал twitch, где мы транслируем каждый четверг в 2 часа дня по восточному времени, и в GitHI не говорится, что невозможно синхронизировать вашу программную систему и ее документацию, если они являются независимыми артефактами, но это требует большой дисциплины и усилий. В моем текущем проекте мы столкнулись с этой ловушкой, поскольку создали очень обширную документацию, которая не могла идти в ногу с прогрессом приложения. Просматривая комментарии, вы быстро понимаете, что большинство обсуждений посвящено проблеме обновления документации. Несколько недель назад я наткнулся на этот твит Тюдора Гирбы. Решение проблемы устаревшей документации В этом сообщении в блоге я хотел бы объяснить мотивацию создания этой библиотеки. Я очень рад объявить о запуске || archifacts|| – библиотеки, которая поможет вам извлечь строительные блоки и взаимосвязи между ними из байт-кода вашего приложения Java или Kotlin. archifacts запускается с тегами архитектура, документация, archunit, java. archifacts – библиотека для извлечения архитектурных концепций из кода вашего приложения – запущена. archifacts запускает Happy coding, надеюсь, вам было так же весело читать это, как и мне писать:) Мои следующие шаги – сделать все это доступным для моего ребенка, простой страницей, на которой он может щелкнуть по листу спрайтов, разорвать его и отправить на принтер в большом формате svg с некоторыми направляющими сетками (уверен, что если нет никакого инструмента, добавление этих строк будет легким) Легко увидеть разницу, верно? Все, что вам нужно сделать, это прочитать каждый пиксель, и если цвет этого пикселя непрозрачен, запишите его как |||| элемент документа SVG. Преобразовать изображение в SVG очень просто, для такой простой задачи не требуется инструмент или платформа. И это не что иное, как язык текстовой разметки. Для этого существует масштабируемая векторная графика || или SVG для короткометражек. Ну, оказывается || Опять же, цель состоит в том, чтобы избежать использования инструмента, я хотел создать веб-сайт, на котором мой ребенок мог бы щелкнуть по пикселю и получить его распечатку на всю страницу в высоком качестве. Теперь, когда у меня есть почти бесконечный запас крошечных изображений размером 32×32, мне нужно было найти способ их масштабирования. В результате создаются индексированные изображения, такие как || picture_<индекс>.<расширение>|| в папке с тем же именем, что и исходное изображение. Итак, вот фрагмент, который я написал, чтобы сохранить спрайты из входного изображения: Но я намерен создать небольшую страницу, чтобы мой ребенок мог выбрать каждый спрайт и распечатать его, мне было бы проще писать на Kotlin. Кроме того, я хотел, чтобы это было в Kotlin, код Python достаточно прост в использовании. Мне нужно было идеальное соответствие пикселей для изображений, используя что угодно, кроме как объединить некоторые спрайты со своими соседями в единый прямоугольник. Мне пришлось немного изменить параметры, например, размер моего структурирующего элемента был уменьшен до 1 пикселя в ширину. Это именно то, что я искал. Еще один поиск в Google, и я наткнулся на эту тему || Stackoverflow ||: БИНГО! Должен быть простой способ сделать это для простых спрайтов. Но я знаю, что это мощный инструментарий, который используется, например, для обнаружения объектов в кадрах. Я совсем не знаком с этим, не буду притворяться, что знаком. Моей первой мыслью было использовать OpenCV. Я хотел все это автоматизировать. Но опять же, я не хочу вырезать каждый из этих спрайтов (187 только на этой картинке). Еще один поиск в Google, и я нашел || Вселенную Марио || веб-сайт, полный Марио || Спрайтов ||. Моя цель состояла в том, чтобы избежать необходимости использовать такие инструменты, как Gimp или || TexturePacker || для управления пиксельной графикой. И вот однажды ваш ребенок просит у вас || Молоток Марио||, который было нелегко найти. Таких, как эта, довольно много, с высоким разрешением и направляющими линиями. Недавно мой 7-летний мальчик попросил меня найти для него пиксельную графику Марио, чтобы использовать ее в качестве шаблона для создания структур minecraft. Использование компьютерного зрения для извлечения пиксельных изображений спрайтов с тегами kotlin, java, opencv, pixelart. Как автоматизировать разделение листов спрайтов с помощью OpenCV. Используя компьютерное зрение для извлечения пиксельной графики спрайтов, мы вернемся со следующей частью на следующей неделе! Код каждого эпизода фиксируется как отдельный коммит, чтобы упростить работу с кодом, просто выберите конкретный коммит и следуйте дальше! Наконец, есть также письменная копия руководства, найденного на dev.to https://dev.to/devwithzachary Затем потоки редактируются в видео, которые вы можете посмотреть || https://www.youtube.com/channel/UC63PqG8ZnWC4JWYrNJKocMA Это приложение написано во время прямых трансляций по адресу || https://www.twitch.tv/devwithzachary || Barker – это простая социальная сеть в стиле Twitter, созданная для демонстрации бессерверных сервисов, предоставляемых платформой AppGallery Connect от Huawei. Проект инициализации devwithzachary/Barker Теперь у нас все готово, на следующей неделе мы рассмотрим, как мы могли бы на самом деле использовать эту функциональность, а также расширить возможности ObjectType и хранения более сложных данных в облаке! И это все! Установка этого в качестве класса приложения в вашем манифесте: Например: Лучший способ сделать это – сделать его частью метода onCreate класса приложения. Как я упоминал ранее, нам необходимо запустить CloudDB, прежде чем мы сможем использовать его в любом месте приложения. Нам осталось еще немного настроить, а затем мы готовы начать использовать CloudDB! Теперь у нас есть все основные методы, которые могут нам понадобиться для получения/установки/удаления объекта пользователя. Это тот момент, когда мы могли бы что-то сделать с этим списком, возможно, обновить пользовательский интерфейс, чтобы показать результат, или выполнить какую-то другую обработку. Для каждого объекта в результате мы обновляем максимальный идентификатор пользователя, а затем добавляем этого пользователя в список. || , здесь мы используем курсор для перемещения по результату, возвращаемому запросом. Последним методом в этом менеджере является || processResult, примеры которого мы рассмотрим на следующей неделе (кроме предоставленного || CloudDBZoneQuery.где(User.class ) Обратите внимание, что для переменной запроса мы можем создать нужный нам тип запроса. Затем метод || queryUsers||, который сгенерирует задачу запроса и запустит ее, в случае успеха мы передадим результат в || processResult||. И, наконец, у нас есть три метода, которые обрабатывают запросы данных, метод || getAllUsers || использует предопределенный запрос, который просто запрашивает все объекты типа User. Если у данного пользователя идентификатор больше текущего максимального, обновите максимальный идентификатор до этого идентификатора пользователя. Затем средство получения идентификатора maxUserID и метод обновления идентификатора maxUserID. Далее у нас есть простой метод, который удалит пользователя из базы данных Метод || executeTask|| устанавливает прослушиватели успеха/неудачи, в то время как два других метода просто настраивают задачу в зависимости от того, повышаем ли мы одного пользователя или список пользователей. Далее у нас есть три метода, которые обрабатывают обновление пользователя, то есть либо обновление, либо вставку, в зависимости от того, существует ли пользователь уже в базе данных. Поскольку у нас есть открытый метод, у нас также должен быть метод закрытия, чтобы закрыть доступ приложений к этой зоне. Полезно, если у вас несколько приложений, которым требуются одинаковые структуры данных. Однако у них не будет доступа к данным другой зоны. Обратите внимание ||, что у вас может быть несколько зон, которые используют один и тот же тип объекта. В методе ||openCloudDBZone || мы настраиваем настроенную облачную зону, в которую будут сохраняться и из которой будут получены данные. Следующий шаг со статическим методом инициализации, метод инициализации CloudDB должен быть вызван в начале вашего приложения, поэтому этот статический метод используется именно для этого! Далее у нас есть конструктор класса, в котором мы получим экземпляр интерфейса CloudDB, который будет использоваться другими методами этого класса. CloudDB в настоящее время не поддерживает автоматическое увеличение, поэтому нам нужно будет постоянно проверять, какой идентификатор использовался последним. Сначала мы определяем переменные, которые нам понадобятся, самое важное здесь – || maxUserID||. Давайте разберем это и посмотрим, что мы сможем сделать с этим классом. Ниже приведен мой класс || CloudDBManager ||, который будет выступать в качестве оболочки, обрабатывающей большую часть функций CloudDB. Чтобы упростить управление соединением между CloudDB и функциональностью приложения, я предлагаю написать для этого отдельный класс. Как только gradle синхронизируется, мы готовы к работе! Итак, ваш файл gradle теперь должен выглядеть следующим образом: Нам нужно добавить новую зависимость CloudDB в файл apps ||build.gradle || Вы заметите, что на этом этапе код не компилируется! Это вспомогательный класс, используемый платформой для определения того, какие классы объектов доступны, в данном случае только класс пользователя. || должно выглядеть так ObjectTypeInfoHelper.java Другой сгенерированный файл, который, как вы можете видеть, представляет собой довольно стандартный класс объектов с настройкой для всех полей, которые мы определили в ObjectType. Давайте теперь взглянем на эти файлы, если вы следовали моим схемам именования вашего User.java должно выглядеть так: Это загрузит два файла в архивированную папку, распакует и добавит эти файлы java в ваш проект Android. Затем введите имя вашего пакета Android. Вернитесь на вкладку ObjectTypes и нажмите кнопку “Экспорт”, выберите формат файла JAVA и android для типа файла. Затем перейдите на следующую вкладку “Зоны облачной базы данных” и создайте новую зону, в этом примере мы назовем ее “Зазывала”. Оставьте разрешение на данные таким, какое они есть, и сохраните свой новый объект данных. Наконец, создайте индекс с именем user_id с полем индекса, равным id.

Не читали часть 1? Прочтите это сначала! Написание бессерверного андроида… С тегами android, без сервера, java, appgallery. Написание бессерверного приложения для Android (ft. AppGallery Connect от Huawei) – Часть 2 – CloudDB Не читал часть 1? Прочтите это сначала! Написание бессерверного приложения для Android (ft. AppGallery Connect от Huawei) – Часть 1 – Автор Захари Пауэлл ・ 7 ・ 8 июля в течение следующих нескольких месяцев я опубликую полное комплексное руководство по созданию приложения для Android с использованием бессерверных функций, чтобы полностью устранить необходимость в том, чтобы внизу этого поста вы найдете мой канал twitch, где мы транслируем каждый четверг в 2 часа дня по восточному времени, и GitHI рекомендует документировать архитектурные концепции вручную и автоматически создавать конкретные строительные блоки приложения. Я не говорю, что невозможно синхронизировать вашу программную систему и ее документацию, если они являются независимыми артефактами, но это требует большой дисциплины и усилий. В моем текущем проекте мы столкнулись с этой ловушкой, поскольку создали очень обширную документацию, которая не могла идти в ногу с прогрессом приложения. Просматривая комментарии, вы быстро понимаете, что большинство обсуждений посвящено проблеме обновления документации. Несколько недель назад я наткнулся на этот твит Тюдора Гирбы. Решение проблемы устаревшей документации В этом сообщении в блоге я хотел бы объяснить мотивацию создания этой библиотеки. Я очень рад объявить о запуске || archifacts|| – библиотеки, которая поможет вам извлечь строительные блоки и взаимосвязи между ними из байт-кода вашего приложения Java или Kotlin. archifacts запускается с тегами архитектура, документация, archunit, java. archifacts – библиотека для извлечения архитектурных концепций из кода вашего приложения – запущена. archifacts запускает Happy coding, надеюсь, вам было так же весело читать это, как и мне писать:) Мои следующие шаги – сделать все это доступным для моего ребенка, простой страницей, на которой он может щелкнуть по листу спрайтов, разорвать его и отправить на принтер в большом формате svg с некоторыми направляющими сетками (уверен, что если нет никакого инструмента, добавление этих строк будет легким) Легко увидеть разницу, верно? Все, что вам нужно сделать, это прочитать каждый пиксель, и если цвет этого пикселя непрозрачен, запишите его как |||| элемент документа SVG. Преобразовать изображение в SVG очень просто, для такой простой задачи не требуется инструмент или платформа. И это не что иное, как язык текстовой разметки. Для этого существует масштабируемая векторная графика || или SVG для короткометражек. Ну, оказывается || Опять же, цель состоит в том, чтобы избежать использования инструмента, я хотел создать веб-сайт, на котором мой ребенок мог бы щелкнуть по пикселю и получить его распечатку на всю страницу в высоком качестве. Теперь, когда у меня есть почти бесконечный запас крошечных изображений размером 32×32, мне нужно было найти способ их масштабирования. В результате создаются индексированные изображения, такие как || picture_<индекс>.<расширение>|| в папке с тем же именем, что и исходное изображение. Итак, вот фрагмент, который я написал, чтобы сохранить спрайты из входного изображения: Но я намерен создать небольшую страницу, чтобы мой ребенок мог выбрать каждый спрайт и распечатать его, мне было бы проще писать на Kotlin. Кроме того, я хотел, чтобы это было в Kotlin, код Python достаточно прост в использовании. Мне нужно было идеальное соответствие пикселей для изображений, используя что угодно, кроме как объединить некоторые спрайты со своими соседями в единый прямоугольник. Мне пришлось немного изменить параметры, например, размер моего структурирующего элемента был уменьшен до 1 пикселя в ширину. Это именно то, что я искал. Еще один поиск в Google, и я наткнулся на эту тему || Stackoverflow ||: БИНГО! Должен быть простой способ сделать это для простых спрайтов. Но я знаю, что это мощный инструментарий, который используется, например, для обнаружения объектов в кадрах. Я совсем не знаком с этим, не буду притворяться, что знаком. Моей первой мыслью было использовать OpenCV. Я хотел все это автоматизировать. Но опять же, я не хочу вырезать каждый из этих спрайтов (187 только на этой картинке). Еще один поиск в Google, и я нашел || Вселенную Марио || веб-сайт, полный Марио || Спрайтов ||. Моя цель состояла в том, чтобы избежать необходимости использовать такие инструменты, как Gimp или || TexturePacker || для управления пиксельной графикой. И вот однажды ваш ребенок просит у вас || Молоток Марио||, который было нелегко найти. Таких, как эта, довольно много, с высоким разрешением и направляющими линиями. Недавно мой 7-летний мальчик попросил меня найти для него пиксельную графику Марио, чтобы использовать ее в качестве шаблона для создания структур minecraft. Использование компьютерного зрения для извлечения пиксельных изображений спрайтов с тегами kotlin, java, opencv, pixelart. Как автоматизировать разделение листов спрайтов с помощью OpenCV. Используя компьютерное зрение для извлечения пиксельной графики спрайтов, мы вернемся со следующей частью на следующей неделе! Код каждого эпизода фиксируется как отдельный коммит, чтобы упростить работу с кодом, просто выберите конкретный коммит и следуйте дальше! Наконец, есть также письменная копия руководства, найденного на dev.to https://dev.to/devwithzachary Затем потоки редактируются в видео, которые вы можете посмотреть || https://www.youtube.com/channel/UC63PqG8ZnWC4JWYrNJKocMA Это приложение написано во время прямых трансляций по адресу || https://www.twitch.tv/devwithzachary || Barker – это простая социальная сеть в стиле Twitter, созданная для демонстрации бессерверных сервисов, предоставляемых платформой AppGallery Connect от Huawei. Проект инициализации devwithzachary/Barker Теперь у нас все готово, на следующей неделе мы рассмотрим, как мы могли бы на самом деле использовать эту функциональность, а также расширить возможности ObjectType и хранения более сложных данных в облаке! И это все! Установка этого в качестве класса приложения в вашем манифесте: Например: Лучший способ сделать это – сделать его частью метода onCreate класса приложения. Как я упоминал ранее, нам необходимо запустить CloudDB, прежде чем мы сможем использовать его в любом месте приложения. Нам осталось еще немного настроить, а затем мы готовы начать использовать CloudDB! Теперь у нас есть все основные методы, которые могут нам понадобиться для получения/установки/удаления объекта пользователя. Это тот момент, когда мы могли бы что-то сделать с этим списком, возможно, обновить пользовательский интерфейс, чтобы показать результат, или выполнить какую-то другую обработку. Для каждого объекта в результате мы обновляем максимальный идентификатор пользователя, а затем добавляем этого пользователя в список. || , здесь мы используем курсор для перемещения по результату, возвращаемому запросом. Последним методом в этом менеджере является || processResult, примеры которого мы рассмотрим на следующей неделе (кроме предоставленного || CloudDBZoneQuery.где(User.class ) Обратите внимание, что для переменной запроса мы можем создать нужный нам тип запроса. Затем метод || queryUsers||, который сгенерирует задачу запроса и запустит ее, в случае успеха мы передадим результат в || processResult||. И, наконец, у нас есть три метода, которые обрабатывают запросы данных, метод || getAllUsers || использует предопределенный запрос, который просто запрашивает все объекты типа User. Если у данного пользователя идентификатор больше текущего максимального, обновите максимальный идентификатор до этого идентификатора пользователя. Затем средство получения идентификатора maxUserID и метод обновления идентификатора maxUserID. Далее у нас есть простой метод, который удалит пользователя из базы данных Метод || executeTask|| устанавливает прослушиватели успеха/неудачи, в то время как два других метода просто настраивают задачу в зависимости от того, повышаем ли мы одного пользователя или список пользователей. Далее у нас есть три метода, которые обрабатывают обновление пользователя, то есть либо обновление, либо вставку, в зависимости от того, существует ли пользователь уже в базе данных. Поскольку у нас есть открытый метод, у нас также должен быть метод закрытия, чтобы закрыть доступ приложений к этой зоне. Полезно, если у вас несколько приложений, которым требуются одинаковые структуры данных. Однако у них не будет доступа к данным другой зоны. Обратите внимание ||, что у вас может быть несколько зон, которые используют один и тот же тип объекта. В методе ||openCloudDBZone || мы настраиваем настроенную облачную зону, в которую будут сохраняться и из которой будут получены данные. Следующий шаг со статическим методом инициализации, метод инициализации CloudDB должен быть вызван в начале вашего приложения, поэтому этот статический метод используется именно для этого! Далее у нас есть конструктор класса, в котором мы получим экземпляр интерфейса CloudDB, который будет использоваться другими методами этого класса. CloudDB в настоящее время не поддерживает автоматическое увеличение, поэтому нам нужно будет постоянно проверять, какой идентификатор использовался последним. Сначала мы определяем переменные, которые нам понадобятся, самое важное здесь – || maxUserID||. Давайте разберем это и посмотрим, что мы сможем сделать с этим классом. Ниже приведен мой класс || CloudDBManager ||, который будет выступать в качестве оболочки, обрабатывающей большую часть функций CloudDB. Чтобы упростить управление соединением между CloudDB и функциональностью приложения, я предлагаю написать для этого отдельный класс. Как только gradle синхронизируется, мы готовы к работе! Итак, ваш файл gradle теперь должен выглядеть следующим образом: Нам нужно добавить новую зависимость CloudDB в файл apps ||build.gradle || Вы заметите, что на этом этапе код не компилируется! Это вспомогательный класс, используемый платформой для определения того, какие классы объектов доступны, в данном случае только класс пользователя. || должно выглядеть так ObjectTypeInfoHelper.java Другой сгенерированный файл, который, как вы можете видеть, представляет собой довольно стандартный класс объектов с настройкой для всех полей, которые мы определили в ObjectType. Давайте теперь взглянем на эти файлы, если вы следовали моим схемам именования вашего User.java должно выглядеть так: Это загрузит два файла в архивированную папку, распакует и добавит эти файлы java в ваш проект Android. Затем введите имя вашего пакета Android. Вернитесь на вкладку ObjectTypes и нажмите кнопку “Экспорт”, выберите формат файла JAVA и android для типа файла. Затем перейдите на следующую вкладку “Зоны облачной базы данных” и создайте новую зону, в этом примере мы назовем ее “Зазывала”. Оставьте разрешение на данные таким, какое они есть, и сохраните свой новый объект данных. Наконец, создайте индекс с именем user_id с полем индекса, равным id.

Не читали часть 1? Прочтите это сначала! Написание бессерверного андроида… С тегами android, без сервера, java, appgallery. Написание бессерверного приложения для Android (ft. AppGallery Connect от Huawei) – Часть 2 – CloudDB Не читал часть 1? Прочтите это сначала! Написание бессерверного приложения для Android (ft. AppGallery от Huawei Connect) – Часть 1 – Автор Захари Пауэлл ・ 7 июля ・ 8 минут в течение следующих нескольких месяцев я опубликую полное комплексное руководство по созданию приложения для Android с использованием бессерверных функций, чтобы полностью устранить необходимость в том, чтобы внизу этого поста вы найдете мой канал twitch, где мы транслируем каждый четверг в 2 часа дня по восточному времени, и в целом у вас есть два варианта: Вы можете смоделировать свое приложение на более высоком уровне абстракции и сгенерировать код и документацию на основе этой модели. Я рекомендую документировать архитектурные концепции вручную и автоматически создавать конкретные строительные блоки приложения. Я не говорю, что невозможно синхронизировать вашу программную систему и ее документацию, если они являются независимыми артефактами, но это требует большой дисциплины и усилий. В моем текущем проекте мы столкнулись с этой ловушкой, поскольку создали очень обширную документацию, которая не могла идти в ногу с прогрессом приложения. Просматривая комментарии, вы быстро понимаете, что большинство обсуждений посвящено проблеме обновления документации. Несколько недель назад я наткнулся на этот твит Тюдора Гирбы. Решение проблемы устаревшей документации В этом сообщении в блоге я хотел бы объяснить мотивацию создания этой библиотеки. Я очень рад объявить о запуске || archifacts|| – библиотеки, которая поможет вам извлечь строительные блоки и взаимосвязи между ними из байт-кода вашего приложения Java или Kotlin. archifacts запускается с тегами архитектура, документация, archunit, java. archifacts – библиотека для извлечения архитектурных концепций из кода вашего приложения – запущена. archifacts запускает Happy coding, надеюсь, вам было так же весело читать это, как и мне писать:) Мои следующие шаги – сделать все это доступным для моего ребенка, простой страницей, на которой он может щелкнуть по листу спрайтов, разорвать его и отправить на принтер в большом формате svg с некоторыми направляющими сетками (уверен, что если нет никакого инструмента, добавление этих строк будет легким) Легко увидеть разницу, верно? Все, что вам нужно сделать, это прочитать каждый пиксель, и если цвет этого пикселя непрозрачен, запишите его как |||| элемент документа SVG. Преобразовать изображение в SVG очень просто, для такой простой задачи не требуется инструмент или платформа. И это не что иное, как язык текстовой разметки. Для этого существует масштабируемая векторная графика || или SVG для короткометражек. Ну, оказывается || Опять же, цель состоит в том, чтобы избежать использования инструмента, я хотел создать веб-сайт, на котором мой ребенок мог бы щелкнуть по пикселю и получить его распечатку на всю страницу в высоком качестве. Теперь, когда у меня есть почти бесконечный запас крошечных изображений размером 32×32, мне нужно было найти способ их масштабирования. В результате создаются индексированные изображения, такие как || picture_<индекс>.<расширение>|| в папке с тем же именем, что и исходное изображение. Итак, вот фрагмент, который я написал, чтобы сохранить спрайты из входного изображения: Но я намерен создать небольшую страницу, чтобы мой ребенок мог выбрать каждый спрайт и распечатать его, мне было бы проще писать на Kotlin. Кроме того, я хотел, чтобы это было в Kotlin, код Python достаточно прост в использовании. Мне нужно было идеальное соответствие пикселей для изображений, используя что угодно, кроме как объединить некоторые спрайты со своими соседями в единый прямоугольник. Мне пришлось немного изменить параметры, например, размер моего структурирующего элемента был уменьшен до 1 пикселя в ширину. Это именно то, что я искал. Еще один поиск в Google, и я наткнулся на эту тему || Stackoverflow ||: БИНГО! Должен быть простой способ сделать это для простых спрайтов. Но я знаю, что это мощный инструментарий, который используется, например, для обнаружения объектов в кадрах. Я совсем не знаком с этим, не буду притворяться, что знаком. Моей первой мыслью было использовать OpenCV. Я хотел все это автоматизировать. Но опять же, я не хочу вырезать каждый из этих спрайтов (187 только на этой картинке). Еще один поиск в Google, и я нашел || Вселенную Марио || веб-сайт, полный Марио || Спрайтов ||. Моя цель состояла в том, чтобы избежать необходимости использовать такие инструменты, как Gimp или || TexturePacker || для управления пиксельной графикой. И вот однажды ваш ребенок просит у вас || Молоток Марио||, который было нелегко найти. Таких, как эта, довольно много, с высоким разрешением и направляющими линиями. Недавно мой 7-летний мальчик попросил меня найти для него пиксельную графику Марио, чтобы использовать ее в качестве шаблона для создания структур minecraft. Использование компьютерного зрения для извлечения пиксельных изображений спрайтов с тегами kotlin, java, opencv, pixelart. Как автоматизировать разделение листов спрайтов с помощью OpenCV. Используя компьютерное зрение для извлечения пиксельной графики спрайтов, мы вернемся со следующей частью на следующей неделе! Код каждого эпизода фиксируется как отдельный коммит, чтобы упростить работу с кодом, просто выберите конкретный коммит и следуйте дальше! Наконец, есть также письменная копия руководства, найденного на dev.to https://dev.to/devwithzachary Затем потоки редактируются в видео, которые вы можете посмотреть || https://www.youtube.com/channel/UC63PqG8ZnWC4JWYrNJKocMA Это приложение написано во время прямых трансляций по адресу || https://www.twitch.tv/devwithzachary || Barker – это простая социальная сеть в стиле Twitter, созданная для демонстрации бессерверных сервисов, предоставляемых платформой AppGallery Connect от Huawei. Проект инициализации devwithzachary/Barker Теперь у нас все готово, на следующей неделе мы рассмотрим, как мы могли бы на самом деле использовать эту функциональность, а также расширить возможности ObjectType и хранения более сложных данных в облаке! И это все! Установка этого в качестве класса приложения в вашем манифесте: Например: Лучший способ сделать это – сделать его частью метода onCreate класса приложения. Как я упоминал ранее, нам необходимо запустить CloudDB, прежде чем мы сможем использовать его в любом месте приложения. Нам осталось еще немного настроить, а затем мы готовы начать использовать CloudDB! Теперь у нас есть все основные методы, которые могут нам понадобиться для получения/установки/удаления объекта пользователя. Это тот момент, когда мы могли бы что-то сделать с этим списком, возможно, обновить пользовательский интерфейс, чтобы показать результат, или выполнить какую-то другую обработку. Для каждого объекта в результате мы обновляем максимальный идентификатор пользователя, а затем добавляем этого пользователя в список. || , здесь мы используем курсор для перемещения по результату, возвращаемому запросом. Последним методом в этом менеджере является || processResult, примеры которого мы рассмотрим на следующей неделе (кроме предоставленного || CloudDBZoneQuery.где(User.class ) Обратите внимание, что для переменной запроса мы можем создать нужный нам тип запроса. Затем метод || queryUsers||, который сгенерирует задачу запроса и запустит ее, в случае успеха мы передадим результат в || processResult||. И, наконец, у нас есть три метода, которые обрабатывают запросы данных, метод || getAllUsers || использует предопределенный запрос, который просто запрашивает все объекты типа User. Если у данного пользователя идентификатор больше текущего максимального, обновите максимальный идентификатор до этого идентификатора пользователя. Затем средство получения идентификатора maxUserID и метод обновления идентификатора maxUserID. Далее у нас есть простой метод, который удалит пользователя из базы данных Метод || executeTask|| устанавливает прослушиватели успеха/неудачи, в то время как два других метода просто настраивают задачу в зависимости от того, повышаем ли мы одного пользователя или список пользователей. Далее у нас есть три метода, которые обрабатывают обновление пользователя, то есть либо обновление, либо вставку, в зависимости от того, существует ли пользователь уже в базе данных. Поскольку у нас есть открытый метод, у нас также должен быть метод закрытия, чтобы закрыть доступ приложений к этой зоне. Полезно, если у вас несколько приложений, которым требуются одинаковые структуры данных. Однако у них не будет доступа к данным другой зоны. Обратите внимание ||, что у вас может быть несколько зон, которые используют один и тот же тип объекта. В методе ||openCloudDBZone || мы настраиваем настроенную облачную зону, в которую будут сохраняться и из которой будут получены данные. Следующий шаг со статическим методом инициализации, метод инициализации CloudDB должен быть вызван в начале вашего приложения, поэтому этот статический метод используется именно для этого! Далее у нас есть конструктор класса, в котором мы получим экземпляр интерфейса CloudDB, который будет использоваться другими методами этого класса. CloudDB в настоящее время не поддерживает автоматическое увеличение, поэтому нам нужно будет постоянно проверять, какой идентификатор использовался последним. Сначала мы определяем переменные, которые нам понадобятся, самое важное здесь – || maxUserID||. Давайте разберем это и посмотрим, что мы сможем сделать с этим классом. Ниже приведен мой класс || CloudDBManager ||, который будет выступать в качестве оболочки, обрабатывающей большую часть функций CloudDB. Чтобы упростить управление соединением между CloudDB и функциональностью приложения, я предлагаю написать для этого отдельный класс. Как только gradle синхронизируется, мы готовы к работе! Итак, ваш файл gradle теперь должен выглядеть следующим образом: Нам нужно добавить новую зависимость CloudDB в файл apps ||build.gradle || Вы заметите, что на этом этапе код не компилируется! Это вспомогательный класс, используемый платформой для определения того, какие классы объектов доступны, в данном случае только класс пользователя. || должно выглядеть так ObjectTypeInfoHelper.java Другой сгенерированный файл, который, как вы можете видеть, представляет собой довольно стандартный класс объектов с настройкой для всех полей, которые мы определили в ObjectType. Давайте теперь взглянем на эти файлы, если вы следовали моим схемам именования вашего User.java должно выглядеть так: Это загрузит два файла в архивированную папку, распакует и добавит эти файлы java в ваш проект Android. Затем введите имя вашего пакета Android. Вернитесь на вкладку ObjectTypes и нажмите кнопку “Экспорт”, выберите формат файла JAVA и android для типа файла. Затем перейдите на следующую вкладку “Зоны облачной базы данных” и создайте новую зону, в этом примере мы назовем ее “Зазывала”. Оставьте разрешение на данные таким, какое они есть, и сохраните свой новый объект данных. Не читали часть 1? Прочтите это сначала! Написание бессерверного андроида… С тегами android, без сервера, java, appgallery. Написание бессерверного приложения для Android (ft. AppGallery Connect от Huawei) – Часть 2 – CloudDB Не читал часть 1? Прочтите это сначала! Написание бессерверного приложения для Android (ft. AppGallery Connect от Huawei) – Часть 1 – Автор Захари Пауэлл ・ 7 ・ 8 июля в течение следующих нескольких месяцев я опубликую полное комплексное руководство по созданию приложения для Android с использованием бессерверных функций, чтобы полностью устранить необходимость в том, чтобы внизу этого поста вы найдете мой канал twitch, где мы транслируем каждый четверг в 2 часа дня по восточному времени, а разработка программного обеспечения на основе GitHModel (MDSE) и DSL являются многообещающим подходом для реализации этой стратегии. В общем, у вас есть два варианта: Вы можете смоделировать свое приложение на более высоком уровне абстракции и сгенерировать код и документацию на основе этой модели. Я рекомендую документировать архитектурные концепции вручную и автоматически создавать конкретные строительные блоки приложения. Я не говорю, что невозможно синхронизировать вашу программную систему и ее документацию, если они являются независимыми артефактами, но это требует большой дисциплины и усилий. В моем текущем проекте мы столкнулись с этой ловушкой, поскольку создали очень обширную документацию, которая не могла идти в ногу с прогрессом приложения. Просматривая комментарии, вы быстро понимаете, что большинство обсуждений посвящено проблеме обновления документации. Несколько недель назад я наткнулся на этот твит Тюдора Гирбы. Решение проблемы устаревшей документации В этом сообщении в блоге я хотел бы объяснить мотивацию создания этой библиотеки. Я очень рад объявить о запуске || archifacts|| – библиотеки, которая поможет вам извлечь строительные блоки и взаимосвязи между ними из байт-кода вашего приложения Java или Kotlin. archifacts запускается с тегами архитектура, документация, archunit, java. archifacts – библиотека для извлечения архитектурных концепций из кода вашего приложения – запущена. archifacts запускает Happy coding, надеюсь, вам было так же весело читать это, как и мне писать:) Мои следующие шаги – сделать все это доступным для моего ребенка, простой страницей, на которой он может щелкнуть по листу спрайтов, разорвать его и отправить на принтер в большом формате svg с некоторыми направляющими сетками (уверен, что если нет никакого инструмента, добавление этих строк будет легким) Легко увидеть разницу, верно? Все, что вам нужно сделать, это прочитать каждый пиксель, и если цвет этого пикселя непрозрачен, запишите его как |||| элемент документа SVG. Преобразовать изображение в SVG очень просто, для такой простой задачи не требуется инструмент или платформа. И это не что иное, как язык текстовой разметки. Для этого существует масштабируемая векторная графика || или SVG для короткометражек. Ну, оказывается || Опять же, цель состоит в том, чтобы избежать использования инструмента, я хотел создать веб-сайт, на котором мой ребенок мог бы щелкнуть по пикселю и получить его распечатку на всю страницу в высоком качестве. Теперь, когда у меня есть почти бесконечный запас крошечных изображений размером 32×32, мне нужно было найти способ их масштабирования. В результате создаются индексированные изображения, такие как || picture_<индекс>.<расширение>|| в папке с тем же именем, что и исходное изображение. Итак, вот фрагмент, который я написал, чтобы сохранить спрайты из входного изображения: Но я намерен создать небольшую страницу, чтобы мой ребенок мог выбрать каждый спрайт и распечатать его, мне было бы проще писать на Kotlin. Кроме того, я хотел, чтобы это было в Kotlin, код Python достаточно прост в использовании. Мне нужно было идеальное соответствие пикселей для изображений, используя что угодно, кроме как объединить некоторые спрайты со своими соседями в единый прямоугольник. Мне пришлось немного изменить параметры, например, размер моего структурирующего элемента был уменьшен до 1 пикселя в ширину. Это именно то, что я искал. Еще один поиск в Google, и я наткнулся на эту тему || Stackoverflow ||: БИНГО! Должен быть простой способ сделать это для простых спрайтов. Но я знаю, что это мощный инструментарий, который используется, например, для обнаружения объектов в кадрах. Я совсем не знаком с этим, не буду притворяться, что знаком. Моей первой мыслью было использовать OpenCV. Я хотел все это автоматизировать. Но опять же, я не хочу вырезать каждый из этих спрайтов (187 только на этой картинке). Еще один поиск в Google, и я нашел || Вселенную Марио || веб-сайт, полный Марио || Спрайтов ||. Моя цель состояла в том, чтобы избежать необходимости использовать такие инструменты, как Gimp или || TexturePacker || для управления пиксельной графикой. И вот однажды ваш ребенок просит у вас || Молоток Марио||, который было нелегко найти. Таких, как эта, довольно много, с высоким разрешением и направляющими линиями. Недавно мой 7-летний мальчик попросил меня найти для него пиксельную графику Марио, чтобы использовать ее в качестве шаблона для создания структур minecraft. Использование компьютерного зрения для извлечения пиксельных изображений спрайтов с тегами kotlin, java, opencv, pixelart. Как автоматизировать разделение листов спрайтов с помощью OpenCV. Используя компьютерное зрение для извлечения пиксельной графики спрайтов, мы вернемся со следующей частью на следующей неделе! Код каждого эпизода фиксируется как отдельный коммит, чтобы упростить работу с кодом, просто выберите конкретный коммит и следуйте дальше! Наконец, есть также письменная копия руководства, найденного на dev.to https://dev.to/devwithzachary Затем потоки редактируются в видео, которые вы можете посмотреть || https://www.youtube.com/channel/UC63PqG8ZnWC4JWYrNJKocMA Это приложение написано во время прямых трансляций по адресу || https://www.twitch.tv/devwithzachary || Barker – это простая социальная сеть в стиле Twitter, созданная для демонстрации бессерверных сервисов, предоставляемых платформой AppGallery Connect от Huawei. Проект инициализации devwithzachary/Barker Теперь у нас все готово, на следующей неделе мы рассмотрим, как мы могли бы на самом деле использовать эту функциональность, а также расширить возможности ObjectType и хранения более сложных данных в облаке! И это все! Установка этого в качестве класса приложения в вашем манифесте: Например: Лучший способ сделать это – сделать его частью метода onCreate класса приложения. Как я упоминал ранее, нам необходимо запустить CloudDB, прежде чем мы сможем использовать его в любом месте приложения. Нам осталось еще немного настроить, а затем мы готовы начать использовать CloudDB! Теперь у нас есть все основные методы, которые могут нам понадобиться для получения/установки/удаления объекта пользователя. Это тот момент, когда мы могли бы что-то сделать с этим списком, возможно, обновить пользовательский интерфейс, чтобы показать результат, или выполнить какую-то другую обработку. Для каждого объекта в результате мы обновляем максимальный идентификатор пользователя, а затем добавляем этого пользователя в список. || , здесь мы используем курсор для перемещения по результату, возвращаемому запросом. Последним методом в этом менеджере является || processResult, примеры которого мы рассмотрим на следующей неделе (кроме предоставленного || CloudDBZoneQuery.где(User.class ) Обратите внимание, что для переменной запроса мы можем создать нужный нам тип запроса. Затем метод || queryUsers||, который сгенерирует задачу запроса и запустит ее, в случае успеха мы передадим результат в || processResult||. И, наконец, у нас есть три метода, которые обрабатывают запросы данных, метод || getAllUsers || использует предопределенный запрос, который просто запрашивает все объекты типа User. Если у данного пользователя идентификатор больше текущего максимального, обновите максимальный идентификатор до этого идентификатора пользователя. Затем средство получения идентификатора maxUserID и метод обновления идентификатора maxUserID. Далее у нас есть простой метод, который удалит пользователя из базы данных Метод || executeTask|| устанавливает прослушиватели успеха/неудачи, в то время как два других метода просто настраивают задачу в зависимости от того, повышаем ли мы одного пользователя или список пользователей. Далее у нас есть три метода, которые обрабатывают обновление пользователя, то есть либо обновление, либо вставку, в зависимости от того, существует ли пользователь уже в базе данных. Поскольку у нас есть открытый метод, у нас также должен быть метод закрытия, чтобы закрыть доступ приложений к этой зоне. Полезно, если у вас несколько приложений, которым требуются одинаковые структуры данных. Однако у них не будет доступа к данным другой зоны. Обратите внимание ||, что у вас может быть несколько зон, которые используют один и тот же тип объекта. В методе ||openCloudDBZone || мы настраиваем настроенную облачную зону, в которую будут сохраняться и из которой будут получены данные. Следующий шаг со статическим методом инициализации, метод инициализации CloudDB должен быть вызван в начале вашего приложения, поэтому этот статический метод используется именно для этого! Далее у нас есть конструктор класса, в котором мы получим экземпляр интерфейса CloudDB, который будет использоваться другими методами этого класса. CloudDB в настоящее время не поддерживает автоматическое увеличение, поэтому нам нужно будет постоянно проверять, какой идентификатор использовался последним. Сначала мы определяем переменные, которые нам понадобятся, самое важное здесь – || maxUserID||. Давайте разберем это и посмотрим, что мы сможем сделать с этим классом. Ниже приведен мой класс || CloudDBManager ||, который будет выступать в качестве оболочки, обрабатывающей большую часть функций CloudDB. Чтобы упростить управление соединением между CloudDB и функциональностью приложения, я предлагаю написать для этого отдельный класс. Как только gradle синхронизируется, мы готовы к работе! Итак, ваш файл gradle теперь должен выглядеть следующим образом: Нам нужно добавить новую зависимость CloudDB в файл apps ||build.gradle || Вы заметите, что на этом этапе код не компилируется! Это вспомогательный класс, используемый платформой для определения того, какие классы объектов доступны, в данном случае только класс пользователя. || должно выглядеть так ObjectTypeInfoHelper.java Другой сгенерированный файл, который, как вы можете видеть, представляет собой довольно стандартный класс объектов с настройкой для всех полей, которые мы определили в ObjectType. Давайте теперь взглянем на эти файлы, если вы следовали моим схемам именования вашего User.java должно выглядеть так: Это загрузит два файла в архивированную папку, распакует и добавит эти файлы java в ваш проект Android. Затем введите имя вашего пакета Android. Вернитесь на вкладку ObjectTypes и нажмите кнопку “Экспорт”, выберите формат файла JAVA и android для типа файла.

Не читали часть 1? Прочтите это сначала! Написание бессерверного андроида… С тегами android, без сервера, java, appgallery. Написание бессерверного приложения для Android (ft. AppGallery Connect от Huawei) – Часть 2 – CloudDB Не читал часть 1? Прочтите это сначала! Написание бессерверного приложения для Android (ft. AppGallery Connect от Huawei) – Часть 1 – Автор Захари Пауэлл ・ 7 июля ・ 8 минут в течение следующих нескольких месяцев я опубликую полное комплексное руководство по созданию приложения для Android с использованием бессерверных функций, чтобы полностью устранить необходимость в том, чтобы внизу этого поста вы найдете мой канал twitch, где мы транслируем каждый четверг в 2 часа дня по восточному времени и GITH, Хотя это хорошая идея, во-первых, вы редко моделируете целое приложение. Разработка программного обеспечения на основе моделей (MDSE) и DSL являются перспективным подходом для реализации этой стратегии. В общем, у вас есть два варианта: Вы можете смоделировать свое приложение на более высоком уровне абстракции и сгенерировать код и документацию на основе этой модели. Я рекомендую документировать архитектурные концепции вручную и автоматически создавать конкретные строительные блоки приложения. Я не говорю, что невозможно синхронизировать вашу программную систему и ее документацию, если они являются независимыми артефактами, но это требует большой дисциплины и усилий. В моем текущем проекте мы столкнулись с этой ловушкой, поскольку создали очень обширную документацию, которая не могла идти в ногу с прогрессом приложения. Просматривая комментарии, вы быстро понимаете, что большинство обсуждений посвящено проблеме обновления документации. Несколько недель назад я наткнулся на этот твит Тюдора Гирбы. Решение проблемы устаревшей документации В этом сообщении в блоге я хотел бы объяснить мотивацию создания этой библиотеки. Я очень рад объявить о запуске || archifacts|| – библиотеки, которая поможет вам извлечь строительные блоки и взаимосвязи между ними из байт-кода вашего приложения Java или Kotlin. archifacts запускается с тегами архитектура, документация, archunit, java. archifacts – библиотека для извлечения архитектурных концепций из кода вашего приложения – запущена. archifacts запускает Happy coding, надеюсь, вам было так же весело читать это, как и мне писать:) Мои следующие шаги – сделать все это доступным для моего ребенка, простой страницей, на которой он может щелкнуть по листу спрайтов, разорвать его и отправить на принтер в большом формате svg с некоторыми направляющими сетками (уверен, что если нет никакого инструмента, добавление этих строк будет легким) Легко увидеть разницу, верно? Все, что вам нужно сделать, это прочитать каждый пиксель, и если цвет этого пикселя непрозрачен, запишите его как |||| элемент документа SVG. Преобразовать изображение в SVG очень просто, для такой простой задачи не требуется инструмент или платформа. И это не что иное, как язык текстовой разметки. Для этого существует масштабируемая векторная графика || или SVG для короткометражек. Ну, оказывается || Опять же, цель состоит в том, чтобы избежать использования инструмента, я хотел создать веб-сайт, на котором мой ребенок мог бы щелкнуть по пикселю и получить его распечатку на всю страницу в высоком качестве. Теперь, когда у меня есть почти бесконечный запас крошечных изображений размером 32×32, мне нужно было найти способ их масштабирования. В результате создаются индексированные изображения, такие как || picture_<индекс>.<расширение>|| в папке с тем же именем, что и исходное изображение. Итак, вот фрагмент, который я написал, чтобы сохранить спрайты из входного изображения: Но я намерен создать небольшую страницу, чтобы мой ребенок мог выбрать каждый спрайт и распечатать его, мне было бы проще писать на Kotlin. Кроме того, я хотел, чтобы это было в Kotlin, код Python достаточно прост в использовании. Мне нужно было идеальное соответствие пикселей для изображений, используя что угодно, кроме как объединить некоторые спрайты со своими соседями в единый прямоугольник. Мне пришлось немного изменить параметры, например, размер моего структурирующего элемента был уменьшен до 1 пикселя в ширину. Это именно то, что я искал. Еще один поиск в Google, и я наткнулся на эту тему || Stackoverflow ||: БИНГО! Должен быть простой способ сделать это для простых спрайтов. Но я знаю, что это мощный инструментарий, который используется, например, для обнаружения объектов в кадрах. Я совсем не знаком с этим, не буду притворяться, что знаком. Моей первой мыслью было использовать OpenCV. Я хотел все это автоматизировать. Но опять же, я не хочу вырезать каждый из этих спрайтов (187 только на этой картинке). Еще один поиск в Google, и я нашел || Вселенную Марио || веб-сайт, полный Марио || Спрайтов ||. Моя цель состояла в том, чтобы избежать необходимости использовать такие инструменты, как Gimp или || TexturePacker || для управления пиксельной графикой. И вот однажды ваш ребенок просит у вас || Молоток Марио||, который было нелегко найти. Таких, как эта, довольно много, с высоким разрешением и направляющими линиями. Недавно мой 7-летний мальчик попросил меня найти для него пиксельную графику Марио, чтобы использовать ее в качестве шаблона для создания структур minecraft. Использование компьютерного зрения для извлечения пиксельных изображений спрайтов с тегами kotlin, java, opencv, pixelart. Как автоматизировать разделение листов спрайтов с помощью OpenCV. Используя компьютерное зрение для извлечения пиксельной графики спрайтов, мы вернемся со следующей частью на следующей неделе! Код каждого эпизода фиксируется как отдельный коммит, чтобы упростить работу с кодом, просто выберите конкретный коммит и следуйте дальше! Наконец, есть также письменная копия руководства, найденного на dev.to https://dev.to/devwithzachary Затем потоки редактируются в видео, которые вы можете посмотреть || https://www.youtube.com/channel/UC63PqG8ZnWC4JWYrNJKocMA Это приложение написано во время прямых трансляций по адресу || https://www.twitch.tv/devwithzachary || Barker – это простая социальная сеть в стиле Twitter, созданная для демонстрации бессерверных сервисов, предоставляемых платформой AppGallery Connect от Huawei. Проект инициализации devwithzachary/Barker Теперь у нас все готово, на следующей неделе мы рассмотрим, как мы могли бы на самом деле использовать эту функциональность, а также расширить возможности ObjectType и хранения более сложных данных в облаке! И это все! Установка этого в качестве класса приложения в вашем манифесте: Например: Лучший способ сделать это – сделать его частью метода onCreate класса приложения. Как я упоминал ранее, нам необходимо запустить CloudDB, прежде чем мы сможем использовать его в любом месте приложения. Нам осталось еще немного настроить, а затем мы готовы начать использовать CloudDB! Теперь у нас есть все основные методы, которые могут нам понадобиться для получения/установки/удаления объекта пользователя. Это тот момент, когда мы могли бы что-то сделать с этим списком, возможно, обновить пользовательский интерфейс, чтобы показать результат, или выполнить какую-то другую обработку. Для каждого объекта в результате мы обновляем максимальный идентификатор пользователя, а затем добавляем этого пользователя в список. || , здесь мы используем курсор для перемещения по результату, возвращаемому запросом. Последним методом в этом менеджере является || processResult, примеры которого мы рассмотрим на следующей неделе (кроме предоставленного || CloudDBZoneQuery.где(User.class ) Обратите внимание, что для переменной запроса мы можем создать нужный нам тип запроса. Затем метод || queryUsers||, который сгенерирует задачу запроса и запустит ее, в случае успеха мы передадим результат в || processResult||. И, наконец, у нас есть три метода, которые обрабатывают запросы данных, метод || getAllUsers || использует предопределенный запрос, который просто запрашивает все объекты типа User. Если у данного пользователя идентификатор больше текущего максимального, обновите максимальный идентификатор до этого идентификатора пользователя. Затем средство получения идентификатора maxUserID и метод обновления идентификатора maxUserID. Далее у нас есть простой метод, который удалит пользователя из базы данных Метод || executeTask|| устанавливает прослушиватели успеха/неудачи, в то время как два других метода просто настраивают задачу в зависимости от того, повышаем ли мы одного пользователя или список пользователей. Далее у нас есть три метода, которые обрабатывают обновление пользователя, то есть либо обновление, либо вставку, в зависимости от того, существует ли пользователь уже в базе данных. Поскольку у нас есть открытый метод, у нас также должен быть метод закрытия, чтобы закрыть доступ приложений к этой зоне. Полезно, если у вас несколько приложений, которым требуются одинаковые структуры данных. Однако у них не будет доступа к данным другой зоны. Обратите внимание ||, что у вас может быть несколько зон, которые используют один и тот же тип объекта. В методе ||openCloudDBZone || мы настраиваем настроенную облачную зону, в которую будут сохраняться и из которой будут получены данные. Следующий шаг со статическим методом инициализации, метод инициализации CloudDB должен быть вызван в начале вашего приложения, поэтому этот статический метод используется именно для этого! Далее у нас есть конструктор класса, в котором мы получим экземпляр интерфейса CloudDB, который будет использоваться другими методами этого класса. CloudDB в настоящее время не поддерживает автоматическое увеличение, поэтому нам нужно будет постоянно проверять, какой идентификатор использовался последним. Сначала мы определяем переменные, которые нам понадобятся, самое важное здесь – || maxUserID||. Давайте разберем это и посмотрим, что мы сможем сделать с этим классом. Ниже приведен мой класс || CloudDBManager ||, который будет выступать в качестве оболочки, обрабатывающей большую часть функций CloudDB. Чтобы упростить управление соединением между CloudDB и функциональностью приложения, я предлагаю написать для этого отдельный класс. Как только gradle синхронизируется, мы готовы к работе! Итак, ваш файл gradle теперь должен выглядеть следующим образом: Нам нужно добавить новую зависимость CloudDB в файл apps ||build.gradle || Вы заметите, что на этом этапе код не компилируется! Это вспомогательный класс, используемый платформой для определения того, какие классы объектов доступны, в данном случае только класс пользователя. || должно выглядеть так ObjectTypeInfoHelper.java Другой сгенерированный файл, который, как вы можете видеть, представляет собой довольно стандартный класс объектов с настройкой для всех полей, которые мы определили в ObjectType. Давайте теперь взглянем на эти файлы, если вы следовали моим схемам именования вашего User.java должно выглядеть так: Это загрузит два файла в архивированную папку, распакует и добавит эти файлы java в ваш проект Android. Затем введите имя вашего пакета Android. Вернитесь на вкладку ObjectTypes и нажмите кнопку “Экспорт”, выберите формат файла JAVA и android для типа файла. Чаще всего создаются некоторые заглушки, которые реализуются с использованием языка общего назначения (GPL), такого как Java, C# или Python. Поэтому вы не можете быть уверены, что вся информация содержится в модели… и это приводит к неполной документации, которая так же плоха, как и устаревшая документация.

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

Представляем артефакты

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

В этом самом первом выпуске archifacts содержит интеграции для Spring Framework , AxonFramework и j Молекул , библиотека, которая поможет вам выразить ваши архитектурные концепции непосредственно в исходном коде.

Существует также некоторая базовая поддержка для создания документации с использованием AsciiDoc и модели Саймона Брауна C4 .

архитекторы стоит на плечах гиганта: Модуль Arch и его потрясающий базовый API для извлечения концепций из байт-кода.

Обратите внимание на сходство

Концептуально, есть много общего с модулем this . Modulith помогает создавать модульные приложения Spring Boot, которые предпочтительнее развертывать как единое целое. Как архитекторы Модуль этот использует Модуль Arch для обеспечения соблюдения определенных архитектурных ограничений и – на основе некоторых правил – способен идентифицировать строительные блоки приложения.

Хотя я убежден, что Modulith – отличная отправная точка для создания модульных приложений на основе Spring Boot, это был не лучший выбор для моего варианта использования. Модуль этот имеет некоторые последствия и ожидания в отношении структуры приложения. Он имеет расширенную семантику того, что такое модуль и какие правила применяются.

После предоставления некоторых вопросов и PR для модулей Я решил, что эффективнее создать библиотеку, которая полностью независима от любой другой технологии выполнения, такой как Spring Boot.

Я не хочу размещать archifacts в качестве конкурента Modulith . Он имеет несколько иную сферу применения и, может быть, когда-нибудь имеет смысл объединить усилия.

Как начать работу

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

Пожалуйста, имейте в виду, что archifacts находится в очень-очень раннем состоянии, но я уже опубликовал первый релиз в Maven Central, так что каждый может использовать его и оставлять отзывы. Любой вклад очень приветствуется. Чтобы связаться с вами, вы можете использовать GitHub и/или следить за проектом на Твиттер .

Я очень надеюсь, что архитекторы пригодятся для некоторых других проектов.

Последнее обращение к Нильсу Эмке за все ценные обсуждения, обзоры и вклады. Спасибо!

Оригинал: “https://dev.to/olibutzki/archifacts-is-launched-26il”