Pull to refresh
6
Artem Martirosyan@ArtMartiros

iOS разработчик

3
Subscribers
Send message

Как мы сделали «ssyoutube для ChatGPT» и что из этого вышло

Level of difficultyEasy
Reading time5 min
Reach and readers21K

Потребность поделиться диалогом из ChatGPT рано или поздно возникает. Однако нативного экспорта в удобный формат вроде PDF или Markdown платформа не предлагает. Копипаст — плохое решение: таблицы разваливаются, форматирование кода съезжает, а изображения просто пропадают. Мы решили эту задачу для себя, написав собственный конвертер. Оказалось, что он полезен не только нам.

Так появился pdfchatgpt.com. Принцип простой: копируешь share-ссылку и диалога с ChatGPT, добавляешь pdf в начало ссылки и получаешь готовый файл. Также можно перейти на pdfchatgpt.com и просто вставить ссылку на диалог.

В этой статье — технический разбор нашего решения: от простого скрипта с puppeteer до асинхронной системы с очередями. Делимся опытом для тех, кто решает схожие задачи.

Читать далее

Как писать код, чтобы коллеги тебя не материли

Reading time2 min
Reach and readers6.6K
Представьте себе одну единственную вещь, которая сделает ваш код более понятным, а так же поможет вам намного легче разбираться в чужом коде и вы будете меньше «обсирать» чужой код, который был написан еще до того, как вы пришли в компанию. А самое лучшее вы всегда будете понимать, стоить ли его изменять или лучше не прикасаться к нему. Представили?!
Читать дальше →

Адаптивный дизайн приложения под каждого пользователя

Reading time3 min
Reach and readers8.7K
Я придерживаюсь мнения, что мобильные приложения должны быть более персонализированными. Какие-то функции мне не нужны, другие использую чаще. Но почему-то мы уравниваем всех под одну гребенку, чтобы по чуть-чуть, но угодить большему количеству людей. Чуть дальше в плане персонализации ушли новостные ленты и соц. сети, которые предоставляют уникальный каждому контент.

А что если уйти еще дальше и помимо контента предоставлять людям персонализированный UI?!
Читать дальше →

Написание Unit тестов на Swift для проверки асинхронных задач

Reading time2 min
Reach and readers5K
Сегодня хочу вам быстренько рассказать как тестировать асинхронный код.

Представьте ситуацию, что вам надо загрузить данные из интернета и проверить все ли работает нормально, либо еще какую-нибудь задачу, которая выполняется асинхронно. И как же его протестировать? Что если попробовать так же как и обычный синхронный код?!

    func testAscynFunction() {
        someAsyncFunction()
    }

    func someAsyncFunction() {
        let bg = DispatchQueue.global(qos: .background)
        bg.asyncAfter(deadline: .now() + 5) {
            XCTAssert(false, "Something went wrong")
        }
    }

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

Для решения такой проблемы в тестах есть одна замечательная вещь:
Читать дальше →

Использование бинарного дерева в swift с помощью enum на примере OCR

Reading time2 min
Reach and readers3.8K
Была цель создать приложение на mac, которое может распознавать текст кода с изображений и видео.

Хотелось сделать так, чтобы даже при большом объеме кода, текст распознавался менее, чем за секунду.

Проблема облегчается тем, что язык на котором пишут код всегда английский и ширина между всеми буквами одинаковая (моноширинный шрифт) — такие используются для программирования, и в этих шрифтах легко увидеть разницу между 1 и I, 0 и O и тд.

Если вкратце, то задача сводится к двум частям:

1. Нахождению самой буквы с ее границами


И с этим шикарно справился Vision, новый framework от Apple.

Вот скриншот того как он работает.


2. Распознавание буквы в заданных границах


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

Наглядный пример:



А вот как примерно будет выглядеть дерево
Это часть так как все не поместилось бы, да и не нужно.


Как же перенести этот схематичный рисунок в код, так чтобы не закопаться в нем, и чтобы он был такой же наглядный?!

Ускорение компиляции в Xcode на swift

Reading time2 min
Reach and readers10K
С ростом проекта, скорость компиляции проекта замедляется. Особенно это заметно становится, когда тестируешь программу, делая параллельно небольшие изменения в программе.

Сначала давайте узнаем как долго компилируется проект до наших улучшений. ЧТобы это сделать надо в терминале ввести

defaults write com.apple.dt.Xcode ShowBuildOperationDuration -bool YES

Для этого нужно зайти в раздел Product зажать alt и нажать Clean Build Folder, а потом собрать проект заново. Мой проект компилируется 81 секунду. Посмотрим какой результат будет после улучшения.



Нам, в первую очередь, стоит узнать какие места приводят к замедлению компиляции. По умолчанию Xcode не показывает предупреждения, где проблема, но мы можем это исправить.
Самые «тяжелые» места большие функции и проверка типов. Поэтому нам нужно вписать эти две строчки в раздел Build Settings -> Other Swift Flags -> Debug

-Xfrontend -warn-long-function-bodies=100
-Xfrontend -warn-long-expression-type-checking=100

(здесь у нас стоит 100мс время компиляции, мы можем поставить любое число)

Наглядный рисунок


Пример моего рабочего проекта



У меня есть участок который занимает 13778 ms, скорее всего у вас не будет такого, но из-за специфики проекта у меня такие участки есть. Так как там построено бинарное дерево для OCR.
Из-за глубокой вложенности друг в друга и определения типа только в самом начале, перед знаком равенства, компилятору требуется много времени понять какой перед ним тип. (Дерево занимает 30 строк, вот его часть)
Читать дальше →

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity