-rw-r--r-- 2.1K 21 мая 2018 · 831A704 · ~1 мин

Конвертер из JPG в HEIF

jpg to heif converter приложения apps macos open source

Конвертер JPG в HEIF

Сегодня я решил поэкспериментировать с HEIF — форматом, который Apple завезли вместе с macOS 10.13 и iOS 11. Они говорили, что у него такое же качество при гораздо меньшем размере файлов.

Формат поддерживается в свежих версиях macOS и iOS, а последние модели iPhone умеют снимать в нём.

Я подумываю сжать свой домашний архив фото и видео. С HEVC (H.265) я уже экспериментировал, и результаты были отличные — я уменьшил размер видео, перекодировав их в HEVC прекрасной утилитой HandBrake.

Единственный способ сконвертировать JPG в HEIF (расширение HEIC), который я нашёл, — приложение «Просмотр» в macOS. Но мне было интересно, смогу ли я сделать это сам на Swift. Смог :)

Папка с 64 фотографиями с моего экшен-камеры весила 203 МБ в JPG. И всего 31,3 МБ в HEIC.

macOS и iOS поддерживают формат из коробки. И что интересно — фото в этом формате легко добавляются в библиотеку «Фото» и появляются на всех устройствах, использующих iCloud. Но если попытаться экспортировать такое фото из «Фото» — оно на лету сконвертируется в JPG, так что оригинальный HEIC, похоже, экспортировать нельзя.

Конвертер бесплатный и с открытым исходным кодом (но только под macOS): https://github.com/makoni/jpg-to-heif-converter

[↵] открыть пост jpg-to-heif-converter.md
-rw-r--r-- 2.8K 21 апр. 2018 · D5C5FA9 · ~1 мин

Впечатления от Assassin's Creed Chronicles: China

assassin's creed игры

Assassin's Creed Chronicles: China

[↵] открыть пост vpechatleniya-ot-assassin-s-creed-chronicles-china.md
-rw-r--r-- 8.8K 24 нояб. 2017 · 210FD78 · ~4 мин

Анимация касания индикатора в UISlider

swift ios полезное uislider

Анимация касания индикатора в UISlider

Стояла задача - при касании слайдера анимировать в приложении сделать анимированное увеличение ползунка. Так же, как это сделано у Apple в приложениях Apple Music и Podcasts в плеере, когда начинаешь перематывать позицию воспроизведения. Пока искал способ стандартными средствами, убил немало времени. Очень не хотелось писать прям свой кастомный слайдер, хотелось использовать системный UISlider, что мне, в итоге, и удалось.

[↵] открыть пост animatsiya-kasaniya-indikatora-v-uislider.md
-rw-r--r-- 997B 24 окт. 2017 · FBD7F97 · ~1 мин

SMS Антикредит

sms антикредит ios приложения

SMS Антиспам для iOS

Надоел мне СМС-спам, который мне периодически приходит - то кредит предлагают, то ипотеку. Как раз, просматривая один из видосов с WWDC, увидел, что Apple дали API для фильтрации SMS-сообщений. Если сработает твой фильтр - то такие сообщения будут приходить без звукового или вибросигнала, втихую, и попадать в отдельную категорию спама в Сообщениях.

Недолго думая, запили такой вот фильтр и выложил в App Store. Надеюсь, кому ещё, кроме меня, пригодится.

Скачать в App Store

[↵] открыть пост sms-antikredit.md
-rw-r--r-- 567B 5 сент. 2017 · E5E50B4 · ~1 мин

openssl и Vapor 2

vapor swift шпаргалки

Столкнулся с тем, что перестал компилиться проект на Ubuntu на Vapor 2. Точнее, одна из зависимостей - Crypto. Оказалось, что из-за добавленного репозитория, в котором были более новые версии некоторых библиотек, оно и не компилилось. Запишу сюда - пришлось даунгрейдиться:

apt install libssl-dev=1.0.2g-1ubuntu4.10
apt install openssl=1.0.2g-1ubuntu4.10
[↵] открыть пост openssl-i-vapor-2.md
-rw-r--r-- 1.4K 14 июня 2017 · 5C60537 · ~2 мин

Бенчмарки: Vapor 2 vs. Vapor 1

swift backend vapor ubuntu

После миграции своего пет-проекта с Vapor 1 на Vapor 2 я прогнал бенчмарки, чтобы сравнить производительность. Я не запускал бенчмарки на последней версии ветки 1.x (1.5.15), поэтому буду сравнивать Vapor 2.1.0 с результатами Vapor 1.2.5 из прошлого замера.

Мой сервер:

  • 2 ГБ RAM
  • 1 ядро CPU
  • SSD
  • 125 Мбит/с исходящего трафика
  • Ubuntu 16.04.2 LTS
  • CouchDB

Бенчмарк с другого сервера запускался так:

wrk -t4 -c20 -d5m https://my_url

API просто берёт данные из CouchDB и отдаёт их как JSON. Проект на Vapor собирался Swift 3.1.1.

[↵] открыть пост benchmarks-vapor-2-vs-vapor-1.md
-rw-r--r-- 2.5K 3 мая 2017 · 6BC24C7 · ~2 мин

Weak delegate в Swift 3

swift шпаргалки утечки памяти

Memory usage in Xcode

Боролся тут с утечками памяти в рабочем проекте. Копание привело к тому, что после ухода из UIViewController далеко не вся память освобождается. Если несколько раз открывать этот UIViewController, возвращаться назад и снова открывать - потребляемая память растёт и не очень слабо освобождается.

Суть проблемы оказалась в протоколах и делегатах. Классическая ошибка. У меня в UIViewController используется UICollectionView с кастомной ячейкой, у которой есть делегат. Мой UIViewController является для каждой ячейки делегатом. Пример реализации протокола и делегата в интернете и книге по Swift выгядит примерно так:

// Protocol
protocol MyCollectionViewCellDelegate {
    func someFunc()
}

// UICollectionViewCell
final class MessageCollectionViewCell: UICollectionViewCell {
    var delegate: MyCollectionViewCellDelegate?
}

// UIViewController
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    // some code....
    cell.delegate = self
}

Внутри объекта ячейки у нас strong-ссылка ;на делегата (UIViewController), в результате происходит утечка памяти.

Решение простое - сделать слабую ссылку (weak) для delegate. Для этого придётся указать протоколу, что реализовать его сможет только класс. Структуры уже пролетают, но и нужны в структурах нет. Меняется всё так:

// Protocol
protocol MyCollectionViewCellDelegate: class {
    func someFunc()
}

// UICollectionViewCell
final class MessageCollectionViewCell: UICollectionViewCell {
    weak var delegate: MyCollectionViewCellDelegate?
}

После этих простых изменений всё стало прекрасно - после возвращения назад из UIViewController использование памяти возвращается на исходный уровень.

[↵] открыть пост weak-delegate-v-swift-3.md
makoni@arm1:~/blog$ cd ../page-7/ // ← предыдущая cd ./page-9/ // ещё посты →