Невозможно отучить людей изучать самые ненужные предметы.
Введение в CSS
Преимущества стилей
Добавления стилей
Типы носителей
Базовый синтаксис
Значения стилевых свойств
Селекторы тегов
Классы
CSS3
Надо знать обо всем понемножку, но все о немногом.
Идентификаторы
Контекстные селекторы
Соседние селекторы
Дочерние селекторы
Селекторы атрибутов
Универсальный селектор
Псевдоклассы
Псевдоэлементы
Кто умеет, тот делает. Кто не умеет, тот учит. Кто не умеет учить - становится деканом. (Т. Мартин)
Группирование
Наследование
Каскадирование
Валидация
Идентификаторы и классы
Написание эффективного кода
Вёрстка
Изображения
Текст
Цвет
Линии и рамки
Углы
Списки
Ссылки
Дизайны сайтов
Формы
Таблицы
CSS3
HTML5
Блог для вебмастеров
Новости мира Интернет
Сайтостроение
Ремонт и советы
Все новости
Справочник от А до Я
HTML, CSS, JavaScript
Афоризмы о учёбе
Статьи об афоризмах
Все Афоризмы
Помогли мы вам |
И тут на сцену выходит Pyto — тоже творение единственного разработчика, но зато полного сил и энтузиазма. А также, кажется, желания испытывать терпение модераторов Apple, постоянно идя по краю дозволенного в App Store. Pyto, к примеру, умеет запускать приложения в фоне, позволяет создавать локальные веб‑серверы и даже имеет встроенную поддержку репозитория PyPI — ставить пакеты можно буквально одной кнопкой!
Установка приложений внутри приложения до сих пор была абсолютным табу в iOS. Любые лазейки в Apple прикрывали, из‑за чего в ту же Pythonista новые пакеты приходилось протаскивать сложной цепочкой действий. Не исключено, что автору Pyto повезло и модераторы просто проморгали нарушения. Или же разрешать программистам некоторые вольности — это новая политика Apple. Поживем — увидим!
У Pyto большие возможности для работы с математическими функциями — к примеру, пакет NumPy, без которого не обходятся любые мало‑мальски сложные вычисления, установлен по умолчанию. Также в Pyto удобно строить графики и даже пользоваться кое‑какими средствами для машинного обучения. К примеру, мне без труда удалось поставить Gensim и поразвлекаться с разбором текстов.
Как и Pythonista, Pyto стоит денег: после трехдневного пробного периода тебя попросят раскошелиться на 750 рублей за базовую версию и 1400 за расширенную, с набором библиотек, требующих компилцяии. Но необходимость раскошеливаться — не главный недостаток Pyto.
Основной проблемой этого приложения остается невероятная сырость. Настолько мощная, что в болото багов можно провалиться по колено, если не с головой. И я не преувеличиваю: один раз мне удалось заклинить Pyto настолько, что даже перезагрузка не помогала.
Однако если держаться проторенных дорожек и пользоваться Pyto бережно и аккуратно, то он сослужит отличную службу.
В Pyto есть командная строка. Но учти, что это не Bash и внутри — не Linux. Это свой командный интерпретатор Pyto. Он поддерживает несколько основных команд Bash — список можно узнать командой help
. Отсюда ты запустишь скрипты на Python, но на установку каких‑то других программ рассчитывать не приходится.
Важное отличие iOS от других операционок — в том, насколько сильно здесь контролируется доступ к файловой системе. Без разрешения скрипт в Pyto не может получить доступ ни к одной папке!
Хорошая новость заключается в том, что запрашивать права очень просто. Для этого в Pyto есть модуль file_system.
Пишем простенький скрипт:
import file_system as fs
path = fs.FolderBookmark()
print(path)
После его запуска появится диалоговое окно для выбора папки. Выбрав ее, ты дашь Pyto права на доступ ко всем файлам в ней. Именно Pyto, а не своему скрипту! Это означает, что дальше доступ к этой папке будет открыт всем программам внутри Pyto, в том числе после любых перезапусков и перезагрузок.
Если же по ходу исполнения скрипта тебе понадобится получать доступ к разным файлам или папкам, ты можешь воспользоваться функциями import_file(
и open_directory(
из того же модуля. Каждый раз при их вызове будет появляться диалоговое окно для выбора файла или папки.
Еще одна особенность iOS — неиспользуемые приложения принудительно завершаются и выгружаются из памяти (если встретишь людей, кропотливо чистящих историю задач в iOS, передай им, что это мартышкин труд — ОС сама отлично с этим справится). Но что сделать, чтобы программа работала в фоне непрерывно? Для разных типов задач в iOS существуют API, все же позволяющие фоновое исполнение.
В Pyto используется нехитрый прием: если тебе нужна работа в фоне, то приложение будет делать вид, что проигрывает аудиофайл, тогда как никакого воспроизведения в реальности не происходит. Для активации этого поведения используй модуль background.
Чтобы программа начала лучше держаться на плаву, достаточно написать что‑то в таком духе:
import background as bg
with bg.BackgroundTask() as task:
# Код для исполнения в фоне
В Pyto есть поддержка еще нескольких интересных возможностей: например, ты можешь активировать свои скрипты вызовами из Shortcuts или URL-схему и передавать им параметры. Другая мощная вещь — мост между Python и Objective-C на основе библиотеки Rubicon-ObjC, он позволяет вызывать функции из нативных фреймворков.
К Pyto прилагается неплохой набор модулей, для работы которых требуется компиляция. Самостоятельно добавлять такие модули, к сожалению, нельзя.
А также несколько собственных модулей для работы с iOS. Мы уже рассмотрели file_system и background, но есть и другие:
Разбор всех этих замечательных возможностей не уместится в одну статью, так что выберем одну небольшую задачу, на которой испытаем Pyto в деле.
Проглядывая доступные в Pyto модули, я заприметил youtube-dl — широко известную утилиту для скачивания видео с видеохостингов. В том числе и тех, которые пытаются защитить контент от подобных действий. В общем, отличная штука! Но пользоваться модулем Python или утилитой для командной строки на мобильном устройстве не очень‑то удобно.
Есть множество способов приделать с помощью Pyto более удобный интерфейс к youtube-dl, в том числе написать графическое приложение на одном из доступных GUI-фреймворков. Однако мне пришла в голову мысль попробовать использовать Pyto в качестве локального веб‑сервера. Заодно можно будет посмотреть, как тут дела с веб‑разработкой.
Первым делом нам потребуется веб‑фреймворк или как минимум библиотека, которая будет упрощать работу с HTTP. В документации мне встретилось упоминание Tornado и Django, но для нашей задачи и то и то — оверкилл. Достаточно будет Flask, который без проблем установился командой pip
и заработал.
Чтобы еще сильнее упростить себе жизнь, я буду использовать клиентский фреймворк HTMX, который позволяет делать асинхронные запросы без использования jаvascript. С ним достаточно задать тегу несколько HTML-атрибутов с информацией о том, куда слать запрос и куда подставлять полученный ответ. Остальное HTMX сделает сам.
Ну и чтобы внешний вид программы был не колхозным, подключим минималистичный CSS-фреймворк Pico.css.
Первым делом импортируем все необходимое.
import flask
from youtube_dl import YoutubeDL
from threading import Thread
import sys
import urllib.request
import os
import background as bg
import file_system as fs
|
|