Kotlin: Корутины (coroutines)

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

Основные особенности корутин



Асинхронность: Корутины позволяют выполнять длительные операции асинхронно, не блокируя основной поток.

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

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

Пример использования корутин
import kotlinx.coroutines.*

fun main() = runBlocking {
    println("Start")

    // Запуск корутины
    launch {
        delay(2000) // Приостановка корутины на 2
...

Kotlin: Как осуществляется переход от списка к ID (Использование XML макетов)

Для примера возьмём список чатов и один чат, к которому будем писать код, чтобы перейти.

Для реализации перехода между списком чатов и конкретным чатом в Kotlin/Android, можно использовать следующий подход:

Список чатов (ChatListActivity/Fragment):
// При клике на элемент списка
chatList.setOnItemClickListener { parent, view, position, id ->
    val chatId = chatList[position].id // Получаем id чата
    
    // Создаем Intent для перехода
    val intent = Intent(this, ChatActivity::class.java)
    intent.putExtra("chat_id", chatId) // Передаем id чата
    startActivity(intent)
}

Activity/Fragment чата (ChatActivity):
class ChatActivity : AppCompatActivity() {
    private var chatId: Int = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_chat)

        // Получаем переданный id чата
        chatId = intent.getIntExtra("chat_id", 0)

        // Теперь
...

PHP: Как определить поворот изображения с помощью exif_read_data()

Что такое EXIF и зачем он нужен


EXIF (Exchangeable Image File Format) — это стандарт, позволяющий добавлять к изображениям и другим файлам метаданные: информацию о камере, настройках съёмки, дате, геолокации и ориентации снимка.

Эти данные записываются камерой или смартфоном при создании фото и могут быть прочитаны специальными инструментами, в том числе PHP‑функцией exif_read_data().

Как EXIF хранит информацию о повороте


Ключевой параметр для определения поворота — поле Orientation (ориентация). Оно принимает значения от 1 до 8, каждое из которых описывает определённое положение камеры при съёмке:
  • 1: нормальное положение (0°);
  • 3: повёрнуто на 180°;
  • 6: повёрнуто на 90° по часовой стрелке;
  • 8: повёрнуто на 90° против часовой стрелки.

Остальные значения (2, 4, 5, 7) описывают зеркальные повороты, которые встречаются реже.

Практический пример на PHP
Шаг 1. Чтение EXIF‑данных
Используйте функцию exif_read_data(), чтобы получить метаданные изображения:
$exifData =
...

PHP: Регулярные выражения: Расширенные возможности

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

Захват групп и обратные ссылки


Захват групп: Группы позволяют извлекать определенные фрагменты текста:
preg_match('/(\d+) (\w+)/', '123 apples', $matches);
// $matches[1] => '123', $matches[2] => 'apples'

Обратные ссылки: Обратные ссылки позволяют использовать захваченные группы в замене:
preg_replace('/(\w+) (\w+)/', '$2, $1', 'John Doe');
// Результат: 'Doe, John'

Утверждения (Lookahead и Lookbehind)


Positive Lookahead: Проверяет, что после текущего положения есть определенный паттерн:
preg_match('/apple(?= pie)/', 'I love apple pie'); // Вернет true

Negative Lookahead: Проверяет, что после текущего положения нет определенного паттерна:
preg_match('/apple(?! pie)/', 'I love apple juice'); // Вернет true

Positive Lookbehind: Проверяет, что...

PHP: Регулярные выражения: Разбор URL с помощью preg_match

Регулярные выражения (регэкспы) — мощный инструмент для работы с текстом, позволяющий решать широкий спектр задач, связанных с поиском, извлечением и обработкой данных. Одна из распространенных задач — разбор URL-адресов, когда нужно извлечь отдельные части (модуль, тип, идентификатор) из URL. В этой статье мы рассмотрим, как это сделать с помощью функции preg_match() в PHP.

Пример регулярного выражения


Рассмотрим шаблон регулярного выражения, который помогает извлечь части URL:
preg_match('%^/(?<module>[-\w\d]+)(?:/(?<type>[-\w\d]+))?(?:/(?<id>[-\w\d]+))?/?$%', $urlPath, $match);

Разбор регулярного выражения


  • %^/: начало строки, после которого идёт косая черта (/).
  • (?<module>[-\w\d]+): именованная группа захвата для выделения модуля. Допускаются буквы, цифры, тире и подчёркивание.
  • (?:/(?<type>[-\w\d]+))?: необязательная группа захвата для типа. Опционально присутствует после косой черты.
  • (?:/(?<id>[-\w\d]+))?: необязательная группа захвата для идентификатора. Опционально
...