Русский
Русский
English
Статистика
Реклама

Фреймфорк

Перевод Встречаем Angular 10

29.06.2020 18:10:05 | Автор: admin
Вышел Angular 10.0.0! Это мажорный релиз, который затрагивает всю платформу, включая сам фреймворк, библиотеку компонентов Angular Material и инструменты командной строки. Размер этого релиза меньше, чем обычно. Дело в том, что с момента выхода Angular 9 прошло всего 4 месяца.

Мы стремимся к тому, чтобы выпускать каждый год по два мажорных релиза. Делается это по разным причинам. Во-первых чтобы Angular шёл бы в ногу со временем и соответствовал бы современному состоянию экосистемы JavaScript. Во-вторых чтобы у Angular был бы предсказуемый график выхода новых релизов. Angular 11 мы планируем выпустить этой осенью.



Поговорим о том, что нового появилось в Angular 10.

Новый компонент для выбора диапазонов дат


Angular Material теперь включает в себя новый компонент, предназначенный для выбора диапазонов дат.


Новый компонент

Для того чтобы им воспользоваться, вам понадобятся компоненты mat-date-range-input и mat-date-range-picker.

Вот пример его применения.

Здесь можно узнать подробности о нём.

Предупреждения об использовании CommonJS-импортов


Когда пользуются зависимостями, упакованными в формате CommonJS, это может привести к увеличению размеров приложения и к снижению его производительности.

Начиная с Angular 10 система будет выдавать предупреждения в том случае, если в сборках используются подобные бандлы. Если вы столкнётесь с такими предупреждениями, касающимися ваших зависимостей, перенастройте проект, указав, что вы предпочли бы ESM-бандл (ECMAScript Module).


Применение CommonJS- или AMD-зависимостей может приводить к необходимости принимать меры, помогающие оптимизации проекта

Особый режим, в котором применяются более строгие параметры проекта


Angular 10 предлагает разработчику более строгий вариант настроек проекта, применяемый при создании нового рабочего пространства командой ng new. Вот как это выглядит:

ng new --strict

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

  • Включается строгий режим в TypeScript.
  • Включается строгий режим при проверке типов в шаблонах.
  • Стандартные ограничения размеров различных частей бандла становятся примерно на 75% строже.
  • Включается использование правил линтинга, предотвращающих объявление сущностей типа any.
  • Приложение настраивается так, чтобы его код был бы лишён побочных эффектов, что позволяет эффективнее применять механизм tree-shaking.

Поддержка возможностей Angular в актуальном состоянии


Как это обычно делается в новых релизах Angular, в этот раз мы внесли некоторые изменения в зависимости. Это позволяет Angular использовать самые современные решения из экосистемы JavaScript.

  • Используемая версия TypeScript увеличена до 3.9.
  • Библиотека TSLib обновлена до версии 2.0.
  • Обновлён, до версии 6, линтер TSLint.

Мы, кроме того, поменяли структуру проекта. Начиная с Angular 10 вы сможете работать с файлом tsconfig.base.json. Этот дополнительный tsconfig.json-файл лучше поддерживает механизмы разрешения типов и настроек пакетов, используемые IDE и средствам для сборки проектов.

Новая стандартная конфигурация браузеров


Мы поменяли конфигурацию браузеров, используемую в новых проектов, исключив из неё устаревшие браузеры, и браузеры, которые используются достаточно редко.

Вот параметры браузеров, применяемые по умолчанию в Angular 9.


Параметры браузеров, используемые в Angular 9

Вот что используется в Angular 10.


Параметры браузеров, используемые в Angular 10

У этого шага есть побочный эффект, который заключается в том, что теперь в новых проектах, по умолчанию, отключаются ES5-сборки. Для того чтобы включить ES5-сборки и дифференциальную загрузку для браузеров, которым это нужно (для таких, как IE или UC), достаточно просто добавить в файл .browserslistrc те браузеры, которые требуется поддерживать.

Улучшение взаимодействия с сообществом любителей Angular


Мы серьёзно занялись улучшением работы с сообществом любителей Angular. Так, за последние три недели список открытых задач в трекерах уменьшился примерно на 700 записей. Речь идёт о задачах, имеющих отношение к фреймворку, к инструментам командной строки и к компонентам. Мы, так или иначе, провели работу по двум тысячам задач и планируем наращивать темпы в ближайшие месяцы. А взаимодействие с сообществам позволит нам сделать ещё больше всего полезного.

Удалённые возможности и возможности, пользоваться которыми не рекомендуется


В Angular 10 мы кое-что убрали, а кое-какие возможности отнесли к разряду запланированных к удалению.

Так, теперь в Angular Package Format больше не входят бандлы ESM5 или FESM5. Это экономит примерно 119 Мб трафика при выполнении команд yarn или npm install для пакетов и библиотек Angular. Эти форматы больше не нужны, так как преобразования, необходимые для поддержки ES5, выполняются в конце процесса сборки.

Мы, основываясь на серьёзном обсуждении с сообществом, решили отказаться от поддержки устаревших браузеров, включая IE 9, 10, а так же Internet Explorer Mobile.

Подробности о том, что удалено из Angular 10, и о том, что признано устаревшим, можно почитать здесь.

Обновление до Angular 10


Для того чтобы узнать подробности об обновлении Angular посетите ресурс update.angular.io. Для того чтобы в ходе обновления всё шло бы хорошо, мы рекомендуем, за один шаг обновления, всегда обновляться лишь до одного мажорного релиза.

Если описать процесс обновления буквально в двух словах, то выглядеть это будет так:

ng update @angular/cli @angular/core

Здесь можно найти подробные сведения об обновлении Angular до версии 10.

А вы уже обновились до Angular 10?



Подробнее..

Распознание блоков текста в IOS-приложении с помощью Vision

18.02.2021 14:23:54 | Автор: admin

Работая над приложением, связанным с финансовыми операциями, возникла необходимость распознать и выделить суммы на чеках. Начиная с 13-ой версии в IOS-разработке появился нативный фреймворк Vision, который позволяет распознавать различные объекты на изображениях, без задействования сторонних сервисов.
В данной статье представлен личный опыт разработки приложения, использующего Vision.

Что такое Vision

Из документации Apple: "Vision применяет алгоритмы "компьютерного зрения" для выполнения множества задач с входными изображениями и видео. Фреймворк Vision выполняет распознание лиц, обнаружение текста, распознавание штрих-кодов, регистрацию изображений. Vision также позволяет использовать пользовательские модели CoreML для таких задач, как классификация или обнаружение объектов."
Анализируя документацию Apple, можно предположить, что Vision - это один из этапов подготовки таких продуктов как Apple glasses или шлем смешанной реальности. Забегая вперед, следует подчеркнуть, что данный фреймворк потребляет изрядное количество ресурсов. Обработка статичного изображения может занимать десятки секунд, следовательно, работа с видео в реальном времени будет предельно ресурсоемким процессом, над оптимизацией которого инженерам Apple еще предстоит поработать.
В рамках поставленной задачи, необходимо было решить следующую проблему: распознание блоков текста с помощью Vision.

Разработка

Проект построен на UIKit, который в данной статье детально рассматриваться не будет. Основное внимание уделяется блокам кода, связанным с фреймворком Vision. Приведенные листинги снабжены комментариями, позволяющими разработчикам детальнее понять принцип работы с фреймворком.
В MainViewController, который будет взаимодействовать с фреймворком Vision, нужно объявить две переменные:

//Recognition queuelet textRecognitionWorkQueue = DispatchQueue(label: "TextRecognitionQueue", qos: .userInitiated, attributes: [], autoreleaseFrequency: .workItem)//Request for text recognitionvar textRecognitionRequest: VNRecognizeTextRequest?
  1. Очередь для задач Vision не вызывает никаких затруднений у разработчиков. Именно в ней будут выполняться все задачи фреймворка.

  2. Объявляется переменная типа VNRecognizeTextRequet. Инициализируется объект из ViewDidLoad (или из init), так как он должен быть активен на протяжении всей жизни ViewController. Этот объект отвечает за работу с Vision, поэтому необходимо разобрать его инициализацию подробнее:

//Set textRecognitionRequest from ViewDidLoadfunc setTextRequest() {    textRecognitionRequest = VNRecognizeTextRequest { request, error in        guard let observations = request.results as? [VNRecognizedTextObservation] else {            return        }        var detectedText = ""        self.textBlocks.removeAll()                    for observation in observations {            guard let topCandidate = observation.topCandidates(1).first else { continue }            detectedText += "\(topCandidate.string)\n"                        //Text block specific for this project            if let recognizedBlock = self.getRecognizedDoubleBlock(topCandidate: topCandidate.string, observationBox: observation.boundingBox) {                self.textBlocks.append(recognizedBlock)            }        }                    DispatchQueue.main.async {            self.textView.text = detectedText            self.removeLoader()            self.drawRecognizedBlocks()        }    }            //Individual recognition request settings    textRecognitionRequest!.minimumTextHeight = 0.011 // Lower = better quality    textRecognitionRequest!.recognitionLevel = .accurate}

Настройки объекта textRecognitionRequest. Описание всех доступных настроек можно найти в документации. Наиболее важным является параметр minimumTextHeight. Именно этот параметр отвечает за сочетание быстродействия и точности распознания текста. Для каждого проекта необходимо найти индивидуальное значение данного параметра, оно зависит от того, какие данные будет обрабатывать приложение.
Так как основной поставленной задачей являлось считывание текста с квитанций, для вычисления значения параметра minimumTextHeight в приложение были добавлены различные типы квитанций в различном состоянии (в том числе и основательно помятые). В результате тестирования было определено значение равное 0.011. В случае распознания текста с квитанций, это значение лучшим образом сочетает в себе быстродействие и точность. Однако нужно отметить, что текст с одного изображения распознается в среднем за пять секунд. Подобной скорости недостаточно для обработки информации в реальном времени и ее следует значительно оптимизировать инженерам Apple.
На основе представленного кода можно сделать вывод, что после операции распознания, объект типа VNRecognizeTextRequet получает блоки текста. Именно с ними и ведется дальнейшая работа, в зависимости от функций приложения. В рассматриваемом примере, каждый распознанный фрагмент текста был внесен в текстовое поле. Так как особенностью задействованного приложения является выделение суммы на квитанции, следовательно, сохранялись только блоки текста, которые можно преобразовать в тип Double. Помимо распознанного текстового значения сохраняются и координаты блока текста на изображении.
Представленный ниже метод отвечает за запуск работы запроса на распознание:

//Call text recognition request handlerfunc recognizeImage(cgImage: CGImage) {    textRecognitionWorkQueue.async {        let requestHandler = VNImageRequestHandler(cgImage: cgImage, options: [:])        do {            try requestHandler.perform([self.textRecognitionRequest!])        } catch {            DispatchQueue.main.async {                self.removeLoader()                print(error)            }        }    }}

В метод передается объект CGImage, в котором необходимо распознать текст. Вся работа по распознанию ведется в созданной для этого очереди. Создается объект VNImageRequestHandler, в который передается распознаваемый объект CGImage. В блоке do/try/catch запускается работа инициализированного объекта типа VNRecognizeTextRequet.
Описанные выше функции отвечают за распознание текста в приложении. Однако стоит еще остановится на методах, связанных с выделением нужных блоков текста.

func drawRecognizedBlocks() {    guard let image = invoiceImage?.image else  { return }        //transform from documentation    let imageTransform = CGAffineTransform.identity.scaledBy(x: 1, y: -1).translatedBy(x: 0, y: -image.size.height).scaledBy(x: image.size.width, y: image.size.height)            //drawing rects on cgimage    UIGraphicsBeginImageContextWithOptions(image.size, false, 1.0)    let context = UIGraphicsGetCurrentContext()!    image.draw(in: CGRect(origin: .zero, size: image.size))    context.setStrokeColor(CGColor(srgbRed: 1, green: 0, blue: 0, alpha: 1))    context.setLineWidth(4)        for index in 0 ..< textBlocks.count {        let optimizedRect = textBlocks[index].recognizedRect.applying(imageTransform)        context.addRect(optimizedRect)        textBlocks[index].imageRect = optimizedRect    }    context.strokePath()            let result = UIGraphicsGetImageFromCurrentImageContext()    UIGraphicsEndImageContext()    invoiceImage?.image = result}

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

struct RecognizedTextBlock {    let doubleValue: Double    let recognizedRect: CGRect    var imageRect: CGRect = .zero}

При распознании блоков текста фреймворк Vision вычисляет ряд важных параметров в объекте VNRecognizedTextObservation. Для нужд рассматриваемого проекта необходимо было получить только значение типа Double и его координаты на изображении, сохраняемые в константе recognizedRect.
Для выделения блока текста на изображении, следует применить трансформацию к координатам из константы recognizedRect. Полученные координаты так же сохраняются в объекте RecognizedTextBlock в переменной imageRect, необходимой для обработки нажатий на выделенные блоки текста.
После сохранения точных координат выделяемых блоков на изображении, обработку нажатий на выделенные области можно осуществить несколькими способами:

  • Добавить необходимое количество невидимых кнопок на изображение, при помощи трансформации сохраненного объекта imageRect;

  • При каждом нажатии на изображение проверять массив блоков текста и искать совпадение координат нажатия с сохраненным объектом imageRect и др.

Чтобы не перегружать ViewController дополнительными элементами, был использован второй способ.

//UIImageView tap listener@objc func onImageViewTap(sender: UITapGestureRecognizer) {    guard let invoiceImage = invoiceImage, let image = invoiceImage.image else {        return    }            //get tap coordinates on image    let tapX = sender.location(in: invoiceImage).x    let tapY = sender.location(in: invoiceImage).y    let xRatio = image.size.width / invoiceImage.bounds.width    let yRatio = image.size.height / invoiceImage.bounds.height    let imageXPoint = tapX * xRatio    let imageYPoint = tapY * yRatio    //detecting if one of text blocks tapped    for block in textBlocks {        if block.imageRect.contains(CGPoint(x: imageXPoint, y: imageYPoint)) {            showTapAlert(doubleValue: block.doubleValue)            break        }    }}

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

Выводы

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

Приложение распознающее блоки текста с помощью VisionПриложение распознающее блоки текста с помощью Vision

Для ознакомления проект можно скачать из репозитория.

Подробнее..

Я буду долго гнать велосипед! История создания своего фреймворка

23.02.2021 20:21:55 | Автор: admin

Где-то около 8 лет назад мне потребовалось определиться с PHP фреймворком для реализации одного проекта. Из фреймворков я знал только понаслышке zend, и ModX Revo с Bitrix. Последние-то и фреймворком трудно было назвать - это были полноценные CMS, которых на тот момент было огромное множество, и они были на пике популярности. В то время не искали разработчиков Laravel или Symfony, тогда нужны были администраторы/модераторы/разработчики Bitrix, Drupal и т.д.

И я принял тогда решение писать свой фреймворк с "0". Задача стояла простая - нужна была работа с БД и RESTful API интерфейс.

Итак - начинаем собирать двухколесный.

"Ленивому и в будни праздник"

БД

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

Это привело меня к поиску чего-то готового, и я наткнулся на тогда еще молодой фреймворк Medoo.in, и это оказалось открытием 1. Немного "доработав" фреймворк, проблема с БД была решена.

Приступаем к RESTful API интерфейсу

Что это такое? - Это просто запросы GET, POST, PUT, DELETE от клиента к серверу. Как бы не пытались вложить в это слово "REST" огромный смысл.

А как же SOAP?!

SOAP - это тот же REST интерфейс в котором передается XML по двум каналам GET и POST. И поверьте смотреть на этот формат через такую призму будет куда понятнее :)

С REST'ом были тоже различные мелкие фреймворки которые пытались мне помочь, но меня всё не устраивало. Какие-то роуты, какие-то адресации в общем - трудно, и в другой бы ситуации может быть и помогло но не в этой.

Благо у меня был опыт работы с MODX и тогда мне очень заинтересовал их подход к реализации friendly(дружественных) наименований страниц, отвечал за него небольшой файлик (.htaccess) для Apache. Коротко, со следующим содержанием:

RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(.*)$ /index.php?q=$1 [L,QSA]

Коротко о том, что здесь написано:
Если вы обращаетесь к серверу и на сервере нет такого файла или папки, запрос переадресуется в файл index.php и уже там сами разбирайтесь, что от вас хотел пользователь, при этом никаких 4хх ошибок не будет, ну если вы сами не захотите их сделать.

И запрос http://мойдомен.ру/я/хочу/что-то/необычное будет автоматически отредиректен сюда http://мойдомен.ру/index.php?q=я/хочу/что-то/необычное

И это полностью решало вопрос редиректа! Но не решало вопроса Роутинга, приступим.

Роутим!!!

С роутами мне показалось слишком сложной реализация в предыдущих фреймворках, и любому программисту должно быть сразу понятно куда "бежать", взглянув только на строку запроса, не ища её описания в огромных списках, а то и хуже в phpdocs.

В общем - роутинг банален, первое значение роута - это всегда класс для обработки, 2-е значение - это public функция. И не к чему какие-то сложности. Для исключения я придумал функцию Init в которую передаются все параметры о роуте.

Как к вам обращаются через GET, POST, и т.д. можно всегда узнать из $SERVER["METHOD"], если не унаследовались от нужного класса.

Так обращение к http://domen.com/users/list/10/30 переадресует пользователя в класс users.controller.php функция public function list($params) {}

По-моему, ничего прозрачнее придумать уже невозможно.

Собственно на этом можно было бы и остановиться, и так и было. Всё было сделано по канонам MVC - модель/выдача/контроллер - построена, но без View.

В 2-х словах о MVC кому интересно

MVC - это что-то вроде стандарта правильной разработки "программ".
Контроллер - это первое с чем "сталкивается" пользователь. Там система начинает понимать, что он неё хотят, "открыть страницу со списком пользователей", или "самоуничножиться".

Контроллер - сам не обращается к БД, для этого есть модель. И контроллер ничего не выводит на экран, для этого есть View, контроллер только подготавливает(упаковывает) данные. Если у вас в контроллере появились не дай бог прямые запросы к БД и формирование тегов html, то выйдите на улицу подышите, можете закурить, но запах клея и краски надо выветреть. Так быть не должно.

Модель - это область обращения к БД. Почему надо её выводить отдельно? Вам может пригодится позже. К примеру при смене БД или при смене колонок в таблице, вам не надо искать по всему коду все места где есть обращение к таблице, а изменить запрос или выдачу в одном месте - Модели данной таблицы.

Выдача - это часть отвечает за формирование результата работы Контроллера. На основании данных из контроллера формируется HTML, или JSON, или XML, или межгалактический стандарт! Всё зависит от того что захотите.

5 лет, система работала как часы, 250 тыс. REST запросов в сутки, независимо от версии php, от нахождения сервера, сервер не нагружался в пики и до 15% на самом слабом железе - всё работало!

Вот ссылка

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

А для этого я его не проектировал...

"Всякому овощу свое время"

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

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

В общем не вдаваясь в подробности существующий тогда TWIG - разбил все мои начинания в пыль! Я реализовал почти аналогию TWIGа и когда увидел его, мне потребовалось не мало мужества принять, то, что данный инструмент - в 100 раз "гибче", "удобнее", и т.д, моего.

С точки зрения ядра мне оставалось всего лишь определять что возвращает мне класс, и если он возвращал мне объект(object), то я не задумываясь, и по всем принципам SOLID (сейчас слюна у отличников потекла) отправлял его рендерить и выводить на экран!

Вот ссылка с твигом

Юхуууу! Где мой пина-колада, я отдыхать!
...
Почти
...
Как подкралось не пойми от куда, и кто его придумал - ТЕСТИРОВАНИЕ!!!

"Бага с возу - релизу легче"

Тут я даже не стал долго думать. Есть отличные инструменты по типу CODECEPTION.
Добавил через Composer - поднастроил - пользуйся! Фреймворк позволяет подключать вендорные(vendors) модули.

Если кто-то поможет настроить SILENIUM на CODECEPTION - буду рад, у меня пока не получилось.

И ссылка с Codeception

Теперь точно пошел пить свой "Куба-Либре"!

В следующий раз расскажу и сравню одно и тоже задание на 4-х популярных фреймворках - это Laravel, Symfony, Yii2 и Phalcon, попробую рассказать о их "+" и "-" на простом примере с какими проблемами я сам столкнулся и как их решил.

Спасибо, не унывайте!

Подробнее..
Категории: Php , Symfony , Фреймфорк

Новости Yii 2021, выпуск 2

07.05.2021 22:14:21 | Автор: admin

Привет, сообщество!


С вами Александр Макаров, samdark и этой второй выпуск в этом году. Я попросил членов команды написать что-то для вступления, но, похоже, они предпочитают писать код :)


Есть новости по важным обновлениям Yii 3 и набор релизов Yii 2. Также упомянем некоторые интересные проекты, не связанные напрямую с кодом.


Статусная страница


Так как вопрос "Как вообще дела с Yii3?" задают слишком часто, мы сделали страницу с прогрессом по пакетам Yii3. Считается просто: пакет со стабильным релизом считается готовым, пакет без стабильного релиза нет. Фреймворк не требует релиза абсолютно всех пакетов, так что бета выйдет раньше, чем будет 100%. Чуть позже мы добавим ссылку на эту страницу с главной страницы официального сайта.


Улучшения дизайна


Создатель awesomic пригласил нас использовать сервис бесплатно в качестве благодарности за Yii 2. Сейчас мы не хотим делать полный редизайн сайта так как это существенно отвлечёт нас от Yii3. Поэтому, сделаем следующее:


  • Освежим логотип без потери узнаваемости.
  • Сделаем согласованный стайл-гайд с логотипом, цветами, формами, шрифтами и так далее.
  • То же для диаграмм и схем в документации.
  • Сделаем хорошую стартовую страницу для шаблонов приложений и внешний вид для демо.
  • Сделаем хороший внешний вид для дебаггера и Gii.


Сообщество


Сообщество Yii всегда мигрировало с платформы на платформу. Во времена Yii 1 главной площадкой был форум. Он и сейчас является лучшим местом для сложных вопросов потому как отлично индексируется поисковиками. В качестве чата мы использовали IRC. Позже сообщества сформировались в Facebook и StackOverflow. IRC для многих был неудобен, поэтому мы попробовали Gitter и Slack.


Сейчас Yii3 мы больше всего обсуждаем в Telegram и, похоже, он стал более популярен, чем Slack.


Yii 2


Готов большой набор обновлений:



Yii 3


Разработка Yii3 идёт немного медленней, чем хотелось бы. Тем не менее, прогресс мне очень нравится. Мы выпускаем всё больше стабильных независимых пакетов и постоянно улучшаем основы, такие как конфигурацию и контейнер.


Релизы пакетов:



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


Шаблоны приложений и демо



Роутинг и диспетчер middleware



Asset-ы


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


DI и Factory


Мы опять поломали синтаксис. __class теперь class, свойства префиксируются $. namespace-ы тоже немного поменяли. Скорее всего это последнее такое изменение в декларативном синтаксисе контейнера.


Эти изменения позволили нам добавить метаданные без какого-либо шанса на конфликт со свойствами:



Конфиги


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




Старый плагин был обновлён для совместимости с изменениями в пакетах Yii 3.


На этом мы не останавливаемся. Будут ещё улучшения.


Data response



Translator


Набор пакетов для перевода почти готов к релизу. Кроме общей зачистки мы добавили инструмент для обновления перевода на основе кода и консольную команду для него. По удобству получилось, как минимум так же, как переводы в Yii 2.


Консоль


Начали группировать команды по namespace при выводе их списка.


Docker


Исправил образы Docker, включая образы под Nginx. Теперь они автоматически собираются через GitHub actions и достпны на Docker hub.


Новая и обновлённая документация


  • Middleware дополнительные диаграммы для лучшего понимания концепта.
  • Cookies подписывание и шифрование кук.

Почитать



Спасибо!


Хочу сказать спасибо всем спонсорам и разработчикам, благодаря которым стала возможна разработка Yii 3. Вместе у нас всё получится!


  • CraftCMS Отличная OpenSource CMS на Yii2.
  • Onetwist Software Услуги качественной разработки приложений.
  • SkillShare Обучение новым навыкам.
  • Betteridge Ювелирные изделия.
  • dmstr Облачные решения на основе Docker.
  • HumHub OpenSource решения для общения команды.
  • JetBrains Отличные инструменты для разработки.
  • Skin.Club Рынок скинов для CS:GO.
  • EFKO Group фудтех, производство продуктов питания, и венчурные инвестиции. С недавнего времени ещё и ЭФКО Цифровые Решения, отдельная растущая сервисная IT-компания, которая планирует заниматься не только внутренними проектами ЭФКО.

Кроме перечисленных нас поддерживают отдельные разработчики и другие компании.


Отдельное спасибо тем, кто помог Yii 3 кодом:


Подробнее..
Категории: Php , Yii , Фреймфорк , Yii3 , Yii framework

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru