• Где найти бесплатный работающий хостинг для одностраничника?

    yakovmanshin
    @yakovmanshin
    Software Engineer
    GitHub Pages или Cloudflare Pages. По возможностям они очень похожи, но Cloudflare дополнительно поддерживает кастомные команды для этапа сборки (чтобы можно было хранить в репозитории только необходимое (например, отдельно контент в Markdown и отдельно HTML-шаблоны), а финальную версию статики генерировать на лету).
    Ответ написан
    Комментировать
  • Курс по IOS разработке?

    yakovmanshin
    @yakovmanshin
    Software Engineer
    Это больше предположение, но оно основано на моем профессиональном опыте. Вы не можете найти достаточно полные курсы по SwiftUI, потому что SwiftUI до сих пор сырой и не закрывает все задачи. Я пока ни разу не встречал проекты крупнее и сложнее тех, которые вы видите в туториалах, чтобы они целиком (не отдельные компоненты) были построены на SwiftUI без костылей, и команды, которые не ломали голову с тем, как его интегрировать.

    Сейчас UIKit — это по-прежнему основной UI-фреймворк, без знания которого в реальных проектах не обойтись. Сториборды, которые вы упоминаете, — это всего лишь инструмент для визуальной верстки. Работать с UI в UIKit можно целиком в коде.
    Ответ написан
    Комментировать
  • Как найти почту на хосте, чтобы поменять аватарку (поставить логотип)?

    yakovmanshin
    @yakovmanshin
    Software Engineer
    Прежде всего, стоит иметь в виду, что для отправки почты не требуется иметь ящик в привычном понимании (с папками вроде «Входящие» и т.д.) — адрес можно использовать как outbound-only, при этом отправленные на него письма (например, если вы ответите на рассылку) будут отклоняться.

    Если вы уверены, что домен все-таки используется для полноценной почты, нужно начать с определения почтового сервера. Сделайте lookup MX-записей и посмотрите, нет ли там известного сервиса (aspmx.l.google.com, mx.yandex.net и т.д.). Если есть, открывайте соответствующую веб-почту (mail.google.com, например) и пытайтесь войти.

    Если в качестве MX-сервера указано что-то не известное вам, есть навскидку два варианта: либо между интернетом и почтовым сервером стоит реле (например, я сталкивался с ситуацией, когда для почты использовался Google Workspace, но по регуляторным, инфобезным или другим соображениям все письма пропускались через реле), либо используется собственный почтовый сервер (причем как что-то общедоступное, но просто установленное на собственные серверы, так и внутренняя разработка — второе редкость).

    Имейте в виду, что веб-почты может не быть совсем или она может быть отключена.

    UPD. MX-записи домена, который вы оставили, указывают на то, что для почты используется Mail.ru / VK WorkSpace.
    Ответ написан
    Комментировать
  • Апп, лочащий планшет с iOS или Android каждые 10-15 минут и требующий решить арифметическую задачу для разлочки?

    yakovmanshin
    @yakovmanshin
    Software Engineer
    В iOS есть два инструмента, которые в теории можно использовать для вашей задачи: Guided Access и Screen Time.

    Guided Access позволяет закрепить на экране одно приложение, выйти из которого можно только после ввода пароля. Такое иногда используют в магазинах или ресторанах, чтобы превратить устройство в «киоск», на котором смотреть каталог / меню можно, а делать все остальное — нет.

    С помощью Screen Time вы можете настроить список разрешенных / запрещенных приложений (в том числе по графику или продолжительности). Например, разрешить YouTube на один час в день по будням и три часа по выходным, а обучающие приложения разрешить без ограничений.

    Если говорить про сугубо техническое решение, я это вижу так: приложение, которое совмещает в себе учебу и развлечения («решил задачку — продлил мультик на 15 минут»), которое закрепляется с помощью Guided Access. Я не знаю, существуют ли такие приложения на рынке, но вы можете поискать.
    Ответ написан
    Комментировать
  • Каким видом полиморфизма является этот код?

    yakovmanshin
    @yakovmanshin
    Software Engineer
    Пример на сайте не очень наглядный, но ошибок в нем нет и полиморфизм он вполне иллюстрирует (в переопределении метода method2).

    Декларацию переменной действительно можно заменить на метод, который принимает экземпляр A и всех его дочерних классов: для наглядности так будет лучше, но в остальном отличий мало. (Мой код на TypeScript, но его смысл понятен, думаю.)
    class A {
        someMethod(): string {
            return "A";
        }
    }
    
    class B extends A {
        someMethod(): string {
            return "B";
        }
    }
    
    function callSomeMethod(object: A) {
        console.log(object.someMethod());
    }
    
    callSomeMethod(new A()); // "A"
    callSomeMethod(new B()); // "B"


    Можно обойтись и без функции, если явно указать тип переменной (и если PHP так позволяет):
    const objectWithSomeMethod: A = new B();
    Ответ написан
    Комментировать
  • Активная блокировка VPN провайдером, решения нет?

    yakovmanshin
    @yakovmanshin
    Software Engineer
    Протокол Shadowsocks хорошо умеет справляться с такими кейсами. Можете попробовать Outline (нужен свой сервер).

    А при возможности меняйте провайдера. Какими бы ни были законы в стране, у интернет-провайдера всегда есть возможность придерживаться их формально — но не выпрыгивать из штанов в попытках усложнить жизнь пользователям (как в вашей ситуации).
    Ответ написан
  • Как предотвратить попадания писем в спам?

    yakovmanshin
    @yakovmanshin
    Software Engineer
    Вам нужно настроить SPF и DKIM. В админке Яндекса, когда подключаете кастомный домен (и когда он уже подключен), такие варианты предлагаются.

    Но имейте в виду, что работать это все будет только в том случае, если бот делает рассылки через почтовый сервер Яндекса (smtp.yandex.com).
    Ответ написан
    1 комментарий
  • Как редактировать содержимое ячейки таблицы в Swift 5?

    yakovmanshin
    @yakovmanshin
    Software Engineer
    Навскидку у вас два варианта: произвести изменения непосредственно в ячейке или обновить источник данных и перезагрузить ячейку.

    Первый вариант сложнее в реализации, не вполне соответствует архитектурному подходу, который Apple рекомендует использовать (нагрузка ячеек кучей функционала мешает оптимизациям и может привести к UI-лагам), и уместен в очень редких ситуациях, поэтому я не буду вдаваться в детали.

    Второй вариант решает ~90% задач и реализуется максимально просто. У вас есть массив с модельками, к которому таблица обращается в методе tableView(_:cellForRowAt:). Когда нужно изменить содержимое ячейки, вы меняете данные массиве, а потом вызываете метод reloadRows(at:with:) с индексом изменившегося элемента. Если приложение не поддерживает iOS 12 и более старые версии, перезагрузка ячеек может происходить автоматически — см. UITableViewDiffableDataSource.
    Ответ написан
    Комментировать
  • Можно ли в ios приложении добавить баннер пополнения баланса через сайт?

    yakovmanshin
    @yakovmanshin
    Software Engineer
    Многое зависит от того, за что именно платят ваши пользователи, а вы это не уточнили в вопросе.

    Оплата через iTunes обязательна для контента, который «потребляется» внутри приложения (примеры: виртуальная валюта в игре, отключение рекламы, подписка на аудиокниги*). Если у вас что-то другое — интернет-магазин, электронный кошелек и т.д., — эти ограничения не действуют: можете хоть веб-вью открывать, хоть нативную форму для реквизитов показывать.

    При худшем раскладе вы можете сообщать в приложении, что регистрация доступна в другом месте (не уверен, что более детальное упоминание, тем более кнопки, проходят ревью), а уже там рассказывать про оплату. Впрочем, какое-то время назад я видел в приложении ЛитРес огромный банер с предложением оформить подписку, ведущий на сайт. Это 100% нарушало правила стора, но к пользователям все равно попало.

    * Для так называемых reader apps с недавних пор действует исключение: в них теперь можно сообщать, что регистрация / подписка / оплата доступна в браузере, и показывать кнопку, отправляющую туда. Определение и примеры reader apps можно найти в правилах App Store, вот несколько: Netflix, Amazon Prime Video, Spotify, Kindle.
    Ответ написан
  • Свой почтовый сервер сложно поддерживать?

    yakovmanshin
    @yakovmanshin
    Software Engineer
    «Настроил и забыл» — это точно не про собственный сервер: даже если оставить в стороне вопросы первоначальной настройки, потом все равно придется регулярно тратить время на мониторинг аптайма, бэкапы, обновления, миграцию БД между версиями и т.д.

    Для 5–10 человек по всем параметрам — деньгам, усилиям, времени и т.д. — выгоднее подключиться к большому провайдеру типа Гугла или Яндекса.
    Ответ написан
    2 комментария
  • Как обойти офисное ограничения скорости интернета для телефонов?

    yakovmanshin
    @yakovmanshin
    Software Engineer
    Не совсем ответ на вопрос, но можете попробовать Outline для обхода блокировок: берете самую простую машину в облаке ($3.50 в Hetzner или $5 в AWS Lightsail), поднимаете на ней сервер и подключаетесь к нему со всех устройств (клиенты есть и для десктопов, и для мобильных). По отзывам знаю, что Outline справляется с блокировками очень эффективно (под капотом Shadowsocks); по своему опыту могу сказать, что скорость практически не режется (получал 60–80 Мбит/с на канале «до» 100 Мбит/с).

    Единственное — неизвестно, как ваши безопасники отнесутся к тому, что вы будете заворачивать в Outline рабочий трафик.
    Ответ написан
    Комментировать
  • Если приложение использует Https запросы, мне нужно указывать, что это является шифрованием в App Store Connect?

    yakovmanshin
    @yakovmanshin
    Software Engineer
    В App Store Connect просят указать, использует ли приложение шифрование, которое не входит в список исключений (для этого списка не требуется предоставлять документацию).

    Подробное описание правил и процессов есть в документации.

    А здесь можно найти таблицу с видами шифрования и целями использования. Для обычных HTTPS-соединений дополнительная информация не требуется.
    Ответ написан
    Комментировать
  • Как обратно включить начальное меню xcode?

    yakovmanshin
    @yakovmanshin
    Software Engineer
    Это окно можно открыть в любое время через меню Window → Welcome to Xcode; также работает сочетание клавиш shift + command + 1. В открывшемся окне можно вернуть галочку Show this window when Xcode launches.
    Ответ написан
    Комментировать
  • Как настроить переадресацию почты с домена?

    yakovmanshin
    @yakovmanshin
    Software Engineer
    Я для таких задач уже пару лет использую сервис ImprovMX. Там есть и catch-all (когда перенаправляются письма, отправленные на несуществующие адреса), но можно добавлять и отдельные пересылки (удобно, если какой-то сервис спамит, перенаправлять письма от него на null).
    Ответ написан
    Комментировать
  • Как слать push со звуком на IOS?

    yakovmanshin
    @yakovmanshin
    Software Engineer
    Да, разрешение на звуки в пуш-уведомлениях нужно запрашивать явным образом. Только после этого такой пункт появится в настройках и, собственно, начнут проигрываться звуки.

    Обратите внимание на элемент .sound внутри массива, переданного в options:

    let center = UNUserNotificationCenter.current()
    center.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
        
    }


    Подробнее можно почитать в документации (код выше взят из нее).
    Ответ написан
    Комментировать
  • Что есть что в многопоточности?

    yakovmanshin
    @yakovmanshin
    Software Engineer
    Поток — это цепочка задач (блоков кода), которые выполняются компьютером. Потоки нужны, чтобы более эффективно использовать многоядерные процессоры: каждое ядро может выполнять отдельный поток без перерывов (тайм-шейринга). Потоки на платформах Apple примерно соответствуют традиционному пониманию потоков.

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

    Очередь (DispatchQueue) — это абстракция из фреймворка GCD (Grand Central Dispatch). Ее придумали для того, чтобы обходить проблему с частым созданием потоков. Внутри очереди есть точно такие же задачи (блоки кода), но при этом создание очереди — менее «дорогой» процесс, чем создание потока.

    В конечном итоге задачи из очереди все равно выполняются в определенном потоке. Но несколько очередей могут делить между собой один и тот же поток — как раз чтобы не создавать лишние. Обычно ОС самостоятельно распределяет задачи из очередей по потокам.

    На картинке показаны две очереди. Стрелки, идущие от верхней к нижней, демонстрируют добавление асинхронных блоков кода в нижнюю очередь (асинхронных — потому что верхняя очередь не ждет, пока нижняя выполнит задачу, а идет дальше).
    Ответ написан
    1 комментарий
  • Как отфильтровать в AppStore приложения по минимальной версии IOS?

    yakovmanshin
    @yakovmanshin
    Software Engineer
    В документации к API поиска единственный доп. атрибут, который можно использовать для приложений, — название разработчика. Других фильтров нет. Поэтому сайты, которые умеют делать запросы в iTunes / App Store и используют при этом официальный API, не помогут.

    Можно поискать сайты, которые парсят веб-версию App Store, или готовые подборки приложений для старых версий iOS.
    Ответ написан
    Комментировать
  • Как Instagram под iOS запоминает логин и как удалить все его данные, чтобы он заново запросил логин?

    yakovmanshin
    @yakovmanshin
    Software Engineer
    При необходимости разработчик приложения может выставить записям в Keychain такие атрибуты доступа, с которыми эти записи будут храниться локально и не попадут в iCloud Keychain. Вы можете найти эти атрибуты в документации: у них есть суффикс ThisDeviceOnly. Вот что говорится в описании к каждому из них:
    Items with this attribute do not migrate to a new device. Thus, after restoring from a backup of a different device, these items will not be present.


    В iOS доступ к Keychain-секретам имеется только у того приложения, которое их создало. Ни другие приложения, ни сам пользователь не могут обращаться к чужим записям. Как следствие, существует только один способ удалить записи без участия создавшего их приложения — стереть все данные с устройства.

    P.S. Стоит добавить, что удаление самого приложения записи в Keychain не задевает — они будут храниться и дальше.
    Ответ написан
    3 комментария
  • Бесплатный OS X сервер для разработчиков ещё дают?

    yakovmanshin
    @yakovmanshin
    Software Engineer
    Как отдельный выпуск ОС, предназначенный для установки на серверы, Mac OS X Server перестал существовать в 2011 году (последней версией был Snow Leopard Server). Начиная с Lion, Server — это приложение в Mac App Store, сейчас оно стоит $20.

    С годами из этого приложения удаляли отдельные функции, выкидывая их совсем — как, например, почтовый сервер, веб-сервер и т.д. — или перенося в клиентскую ОС — так поступили с кэшированием обновлений, Time Machine-сервером, Xcode-сервером и т.д. В разделе поддержки есть страница со статусами серверных функций и альтернативными решениями.

    Сегодня приложение Server в Mac App Store годится только для администрирования iOS-устройств под MDM (судя по оценке 1.7, пользователи этому не рады).
    Ответ написан
    Комментировать
  • Cordova и публикация в сторах - Есть ли проблемы?

    yakovmanshin
    @yakovmanshin
    Software Engineer
    В случае с iOS проблемы при публикации в App Store создает не столько сам web view, сколько “unrestricted web access” — это когда пользователь может напрямую (введя URL) или как-то еще (переходя по ссылкам с сайта на сайт) попасть на ресурс с «небезопасным контентом». У меня был случай, когда ревьюер смог из эмбеда YouTube попасть на десктопную версию сайта и через поиск найти ролики с возрастными ограничениями. Если такая ситуация обнаруживается на ревью, приложение не выкидывают из App Store совсем, но предлагают поднять категорию до 17+ или убедиться, что сайт внутри web view изолирован и не позволяет перейти в «большой интернет».

    Что касается подтверждения прав на контент, обычно вопросов не возникает. Так или иначе, в iOS можно связать домен с приложением, и это дает дополнительные возможности: например, ссылки на сайт могут открываться сразу в приложении.
    Ответ написан
    Комментировать