-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
-rw-r--r-- 13K 24 марта 2017 · B3FBAC0 · ~6 мин

Впечатления от Assassin's Creed Syndicate

assassin's creed игры

Assassin's Creed Syndicate

[↵] открыть пост vpechatleniya-ot-assassin-s-creed-syndicate.md
-rw-r--r-- 9.5K 28 февр. 2017 · 3EB5FBA · ~4 мин

Впечатления от Assassin's Creed Rogue

assassin's creed игры

Assassin's Creed Rogue

Прошёл очередную часть Assassin's Creed Rogue (Изгой).

[↵] открыть пост vpechatleniya-ot-assassin-s-creed-rogue.md
-rw-r--r-- 1.7K 9 февр. 2017 · F3580BC · ~1 мин

Сайт Space In Box

swift приложения space in box vapor

Сайт Space In Box

Решил информацию о своих приложениях вынести с apps.arm1.ru на отдельный домен. Раз я их когда-то начал публиковать под именем Space In Box, то и домен соответствующий: spaceinbox.me. Решил убрать уже не актуальные и не доступные приложения и максимально везде использовать векторную графику (иконки, логотипы), ибо на ретине глаз сильно режет.

Был отличный повод сделать что-то на Swift на фреймворке Vapor, пока всё нужное получилось. Обновлять, если что-то меняется в логике, конечно, тяжелее, т.к. приходится билдить на сервере всё заново, а это происходит минуты 3-4 каждый раз. А если что-то касается оформления (подправить html), то шаблоны подхватываются бинарником на лету и компилить заново не надо. Скорость работы и потребляемая память (пока 8.8 мб) радуют. Теперь можно обновлять старые и фигачить новые приложения.

UPDATE: С простым обновлением до Vapor 1.5.14 без изменения какого либо кода сайт стал есть ещё меньше памяти - 6.7-7.7 мб.

[↵] открыть пост sajt-space-in-box.md
-rw-r--r-- 1.7K 8 дек. 2016 · B2818A9 · ~2 мин

Бенчмарки Vapor 1.2.5

swift backend vapor ubuntu

Примерно месяц назад я прогонял бенчмарки для серверных Swift-фреймворков. Вчера я обновил свой проект до новой версии Vapor — 1.2.5. Раньше использовал 1.1.11.

Одно из самых важных изменений в Vapor 1.2.x — то, что Vapor теперь использует неблокирующий сервер.

Сегодня я решил прогнать новый бенчмарк проекта, обновлённого до Vapor 1.2, и результаты меня удивили. Он не только быстрее версии 1.1.x — он сравнялся с результатами Node.js!

Vapor vs. Node.js

Мой сервер:

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

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

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

API просто берёт данные из CouchDB и отдаёт их как JSON.

[↵] открыть пост benchmarks-for-vapor-1-2-5.md
makoni@arm1:~/blog$ cd ../page-8/ // ← предыдущая cd ./page-10/ // ещё посты →