Эта статья была рецензирована Клаудио Рибейро . Спасибо всем рецензентам SitePoint за то, что сделали контент SitePoint как можно лучше!
Я люблю iPad. Это фантастический форм-фактор для потребления медиа и игр; и это также хорошо работает в качестве электронного читателя. Проблема в том, что я использую его не так часто, как мог бы. Большую часть времени я потребляю медиа (Netflix, Twitch, YouTube), я пишу параллельно.
Я могу сделать это на своем MacBook, но я никогда не мог сделать это до сих пор. Две вещи сделали это возможным:
-
iOS недавно добавила поддержку воспроизведения изображений в картинках. Это означает, что я могу продолжать играть в видео приложение, работая над чем-то другим.
-
Фантастические приложения (такие как DraftCode и Working Copy ) позволяют кодировать и запускать приложения PHP, а также вносить изменения в Github прямо с iPad.
Сегодня я собираюсь показать вам, как я пишу код на iPad. Я не буду притворяться, что это идеальный рабочий процесс (что такое рабочий процесс?), Но для меня это так же увлекательно, как в первый раз, когда я использовал ноутбук вместо настольного компьютера.
Я начал писать этот пост некоторое время назад. Честно говоря, я не думаю, что приложения, о которых я собираюсь рассказать, были тогда готовы. Они оба получили обновления с тех пор. Как будто разработчики могли слышать в моем мозгу и хотели сделать меня счастливым. Я также прошу прощения за размер этой страницы; Есть много анимационных картинок.
аппаратные средства
Одна из самых важных частей всего этого эксперимента — найти правильную клавиатуру. Когда дело доходит до мобильных устройств, нет недостатка в некачественном оборудовании.
Я довольно долго искал, прежде чем остановиться на клавиатуре, которая мне нравилась . Я могу с уверенностью сказать, что сделал правильный выбор.
Эта клавиатура примерно вдвое длиннее iPad Mini 2 и весит примерно столько же. Клавиши кажутся удивительными, с большим количеством места между ними. И это тихо!
Эта клавиатура также имеет трекпад. iOS не поддерживает мышь или трекпад (насколько мне известно), поэтому вам не нужно использовать клавиатуру с трекпадом. Мне это нравится, потому что он может использоваться как устройство ввода для моего Raspberry Pi (используя один USB-порт для клавиатуры и трекпада).
Если вы не используете клавиатуру Bluetooth, вам понадобится порт USB. К счастью, Apple выпускает адаптер (изначально разработанный для совместимости с цифровыми камерами), который прекрасно работает с любой клавиатурой USB, которую я когда-либо пробовал.
Клавиша Windows используется как клавиша команды, и Windows + z / Windows + x / Windows + c / Windows + v все работают так, как вы привыкли. Вы также можете использовать Windows + → и Windows + ←, чтобы перейти к началу и концу строк.
Мультимедийная клавиатура All-in-one указана на веб-сайте Microsoft как 39,95 долларов США, но на Amazon ее можно купить за 29,99 долларов США. Адаптер Lightning USB указан на веб-сайте Apple как 29,99 долларов США, а на самом деле он стоит на пару долларов дороже от Amazon.
Программы
Я уже упомянул пару приложений ( DraftCode и Working Copy ), и правда в том, что это только два, что вам нужно.
Какие инструменты вы используете для написания кода? Вы, вероятно, используете IDE (или, по крайней мере, текстовый редактор, например, Atom). Вы, вероятно, используете что-то вроде Git для организации и создания версий вашего исходного кода.
DraftCode — это текстовый редактор с подсветкой синтаксиса. Он еще не поддерживает IDE-подобные функции, такие как автозавершение кода и статический анализ, но у него есть возможность запускать сценарии PHP, которые вы пишете в нем.
Более того, он включает в себя дерево файлов, с помощью которого вы можете управлять файлами и папками. С помощью этого интерфейса можно (хотя и несколько трудоемко) структурировать целое PHP-приложение.
Мы рассмотрим, как запускать PHP-приложения немного …
Рабочая копия — это Git-клиент. Бесплатная версия поддерживает Github, Bitbucket и любой другой источник URL Git. Он поддерживает клонирование, выборку и слияние. Я не пробовал ничего с этим, кроме толкания.
Если вы хотите иметь возможность вносить изменения, которые вы кодировали на iPad, вам придется раскошелиться на корпоративную версию. Единственное заметное отличие (учитывая то, как мало я его использовал) заключается в том, что вы можете передавать только код на удаленную версию предприятия.
DraftCode стоит 10,99 долларов США, а рабочая копия (корпоративная) стоит 14,99 долларов США. Пока я записывал (для картинок, которые вы видели перед вами), я заметил странную ошибку экспорта. Когда бесплатная версия была установлена, я мог экспортировать в нее. Когда была установлена корпоративная версия, я не смог. На этом этапе я рекомендую использовать корпоративную покупку бесплатной версии (по той же цене) вместо прямой покупки корпоративной версии.
Написание вашего первого скрипта
Давайте посмотрим на процесс написания PHP-скриптов в DraftCode. После загрузки (и удаления всевозможных файлов примеров) интерфейс замечательно чист:
Внизу дерева файлов (левая панель) есть несколько кнопок. Cog (кнопка настроек) показывает немного информации о приложении и предоставляет кнопки для установки WordPress и phpLiteAdmin (клон SQLite phpMyAdmin).
Затем есть кнопки для создания файлов, папок, импорта медиа-файлов и пакетного перемещения файлов (в этом порядке). Импортер мультимедиа извлекает информацию из медиатеки iPad, поэтому он поддерживает любые аудио / видео / графические файлы, которые вы могли бы воспроизвести на iPad.
Давайте создадим скрипт. Полезно знать, какая версия PHP и какие модули доступны через приложение. Вы можете создать файл с именем практически что угодно (но общим именем для этого вида скрипта будет index.php
или phpinfo.php
):
Пробовать SQLite
Возможно, вы заметили несколько упоминаний о MySQL (в phpinfo
). Это не означает, что вы можете начать использовать базу данных MySQL на своем iPad, просто вы можете подключиться к общедоступному серверу MySQL.
DraftCode имеет расширение SQLite. Давайте используем это и PDO, чтобы проверить, можем ли мы использовать базы данных SQLite:
date_default_timezone_set("UTC"); $handle = new PDO("sqlite::memory:"); $handle->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); $handle->exec(" CREATE TABLE IF NOT EXISTS messages ( id INTEGER PRIMARY KEY, message TEXT ) "); $query = " INSERT INTO messages (message) VALUES (:message) "; $statement = $handle->prepare($query); $statement->bindParam(":message", $message); $message = "hello world"; $statement->execute();
Большая часть этого — просто стандартный пример кода PDO, хотя я прощу вас за то, что вы не знакомы с ним. Мы живем в эпоху слоев абстракций базы данных и объектно-реляционных картографов.
Мы открываем дескриптор базы данных SQLite в памяти и устанавливаем режим ошибок, чтобы выбрасывать исключения. Затем мы создаем таблицу messages
с одним текстовым полем message
.
После этого мы подготовим запрос SQL и свяжем параметр :message
с этим подготовленным оператором. Наконец, мы выполняем подготовленный оператор и полностью ожидаем, что таблица сообщений будет содержать одну строку.
Давайте попробуем извлечь эту строку, используя следующий код:
$messages = $handle->query(" SELECT * FROM messages "); foreach($messages as $message) { print "message: " . $message["message"] . "<br>" . PHP_EOL; }
SQLite не заменяет другие, более надежные базы данных, но мы можем использовать его для разработки приложений, которые когда-либо будут обслуживать только одного пользователя.
Вытащить код с рабочей копией
Чаще всего я работаю над существующей кодовой базой. Было бы ужасно, если бы мне пришлось заново создавать весь рабочий каталог вручную. К счастью, мы можем просто использовать Working Copy для извлечения исходного кода с сервера Git.
Если мы планируем отправить код обратно на Github (при условии, что мы используем этот пульт), неплохо было бы установить удостоверение и подключиться к Github:
Это не является строго необходимым, но по крайней мере это не так (для случая, когда мы хотим добавить код, который мы добавили / изменили). Следующим шагом является клонирование хранилища. Мы можем отправить код в DraftCode, используя диалог обмена. Рабочая копия архивирует хранилище и хранит некоторый PHP-код для извлечения его в буфер обмена iOS. Чтобы извлечь репозиторий (внутри DraftCode), нам нужно создать новый файл, вставить код буфера обмена и запустить его.
Установка Laravel
Последняя версия Laravel (на момент написания 5.3
) поддерживает базы данных PHP 5.6
и SQLite. Это хорошая новость для нас, но нам еще нужно проделать небольшую работу, чтобы она заработала.
Фиксация зависимостей
Как мы уже видели, любой код, который мы хотим запустить, должен быть запущен через сервер DraftCode. Это означает, что мы не можем легко использовать Composer для установки зависимостей. Теоретически возможно сделать сценарий для этого, но это тема для другого времени.
Самый быстрый способ дать Laravel все необходимые ему зависимости — это сохранить их в Git. Таким образом, мы можем вытащить весь Git-репозиторий и развернуть его в рабочем каталоге DraftCode.
vendor
по умолчанию игнорируется в приложениях Laravel. Вам нужно будет удалить его из .gitignore
чтобы иметь возможность зафиксировать его в хранилище.
Настройка среды
.env
— еще один игнорируемый файл. Когда вы опускаете репозиторий Git, у вас, вероятно, не будет версии приложения Laravel, которую вы будете использовать (если вы не намеренно зафиксировали .env
в первую очередь).
В настоящее время невозможно создать (или отредактировать) .env
или .env.example
без предварительного предоставления им расширения .txt
. Вам понадобится .env
с допустимым значением APP_KEY
прежде чем Laravel сможет создавать сеансы.
Iconv
В версии PHP DraftCode не установлена функция iconv_*
. Мы можем использовать библиотеку patchwork/utf8
чтобы подобрать эти функции.
Laravel 4.*
имел обыкновение использовать patchwork/utf8
в качестве зависимости. Это было удалено в 5.0
…
Чтобы добавить его, мы можем использовать:
composer require patchwork/utf8
Как и в большинстве PHP-оболочек, правильное время для их добавления следует непосредственно за автозагрузчиком Composer. Самый первый раз, когда это происходит в Laravel, находится в public/index.php
.
Фактически, состояние по умолчанию public/index.php
:
<?php /** * Laravel - A PHP Framework For Web Artisans * * @package Laravel * @author Taylor Otwell <[email protected]> */ /* | ... */ require __DIR__.'/../bootstrap/autoload.php'; /* | ... */ $app = require_once __DIR__.'/../bootstrap/app.php'; /* | ... */ $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); $response = $kernel->handle( $request = Illuminate\Http\Request::capture() ); $response->send(); $kernel->terminate($request, $response);
Это из https://github.com/laravel/laravel/blob/5dc817bf55598fda017e3b7f39957447bda94846/public/index.php
Итак, чтобы добавить шим для функций iconv_*
, нам нужно добавить следующую строку:
require __DIR__.'/../bootstrap/autoload.php'; \Patchwork\Utf8\Bootup::initAll();
Случайные байты
Laravel также зависит от paragonie/random_compat:~1.4|~2.0
. Эта библиотека предоставляет различные прокладки для более новых криптографических улучшений языка. Главным среди них является возможность генерировать случайные данные криптографически безопасным способом.
То, что делает это поколение криптографически безопасным, является источником энтропии. Шим использует различные источники, которые можно увидеть здесь .
К сожалению, единственным источником, поддерживаемым версией PHP для openssl_random_pseudo_bytes
функция openssl_random_pseudo_bytes
. И хотя в комментарии говорится, что библиотека вернется к openssl_random_pseudo_bytes
в качестве крайней меры, эта функция была удалена в версии 1.3
и заменена функцией, которая выдает исключение.
Laravel требует ~1.4
, что означает, что мы не можем требовать ^1.2
в нашем проекте, не получив ошибку компоновщика. Единственная альтернатива — получить реализацию из версии 1.2
paragonie/random_compat
и включить ее до автозагрузчика Composer.
Если вам интересно, почему мы должны включать его раньше, это потому, что paragonie/random_compat
регистрирует, что paragonie/random_compat
исключение random_bytes
функционирует глобально (и как только он загружается Composer). Это создает ситуацию, когда одна библиотека shim препятствует работе всех других библиотек shim (того же типа). Любопытная позиция…
Пожалуйста, не позволяйте моей критике этого единственного аспекта paragonie/random_compat
заставить вас думать, что мне не нравится библиотека. Это фантастика, и вы, вероятно, должны использовать ее в пользу собственной реализации shim.
openssl_random_pseudo_bytes
реализации openssl_random_pseudo_bytes
выглядит следующим образом:
function random_bytes($bytes) { try { $bytes = RandomCompat_intval($bytes); } catch (TypeError $ex) { throw new TypeError( 'random_bytes(): $bytes must be an integer' ); } if ($bytes < 1) { throw new Error( 'Length must be greater than 0' ); } $secure = true; $buf = openssl_random_pseudo_bytes($bytes, $secure); if ( $buf !== false && $secure && RandomCompat_strlen($buf) === $bytes ) { return $buf; } throw new Exception( 'Could not gather sufficient random data' ); }
Это отсюда
Вы можете сохранить это где угодно, но я сохранил его в path/to/project/compat-random.php
. Нам нужно добавить его выше автозагрузчика Composer:
if (!function_exists('random_bytes')) { require_once __DIR__.'/../compat-random.php'; } require __DIR__.'/../bootstrap/autoload.php'; \Patchwork\Utf8\Bootup::initAll();
Таким образом, будет использоваться реализация openssl_random_pseudo_bytes
(если random_bytes
еще не существует), и paragonie/random_compat
не будет регистрировать генерирующее исключение random_bytes
.
Это явно не так безопасно, как альтернативные функции paragonie/random_compat
внутри paragonie/random_compat
. Вы не должны запускать этот хак в производство.
Пользовательские маршруты
Прежде чем мы поговорим о пользовательских маршрутах, давайте запустим приложение Laravel как оно есть:
Все идет нормально! Но если мы запускаем public/index.php
то как нам когда-либо менять маршруты в другом месте нашего приложения? Чтобы включить это, нам нужно снова изменить public/index.php
:
$_SERVER["REQUEST_URI"] = $_GET["url"]; $response = $kernel->handle( $request = Illuminate\Http\Request::capture() );
Перед каждым запросом мы REQUEST_URI
всем, что мы предоставляем параметру строки запроса url
. Это работает, потому что Request::capture()
HTTPRequest::createFromGlobals
реализацию Symfony HTTPRequest::createFromGlobals
. Та же самая реализация строит различные состояния URI на основе REQUEST_URI
.
Теперь мы можем создавать новые маршруты, такие как:
Route::get("/then", function() { return "hello world"; });
… и перейдите к ним с помощью URL-адреса http://127.0.0.1/tutorial-coding-on-the-ipad/public/index.php?url=then
.
Нажатие кода с рабочей копией
После того, как вы внесли изменения в свой репозиторий, вы, вероятно, захотите зафиксировать и отправить их. Перейдите в корневую папку репозитория и коснитесь имени папки. Вы увидите опцию, чтобы сжать папку. Это займет некоторое время, в зависимости от размера кодовой базы. По завершении вы можете выбрать и поделиться архивом с Рабочей копией.
Рабочая копия может затем определить, какие файлы были изменены, и позволяет отправить их обратно в хранилище.
Вывод
В этом руководстве мы рассмотрели требования к оборудованию, программному обеспечению и конфигурации для разработки приложений PHP на iPad. Мы рассмотрели некоторые из поддерживаемых функций (и ограничений) PHP DraftCode.
Прежде чем мы расстанемся, я думаю, что будет хорошей идеей поговорить о том, почему мы хотим писать код на iPad. Для меня это был забавный эксперимент, но я не думаю, что iPad мог бы стать моей любимой машиной для кодирования. За последние несколько недель приложения значительно (значительно) улучшились, но их все еще медленно использовать (из-за ограничений песочницы и невозможности запуска сценариев CLI).
Существует определенный призыв к использованию iPad, если вы часто летаете. Если вы можете получить аккуратный чехол для них, iPad, клавиатура и адаптер гораздо аккуратнее, чем MacBook и зарядное устройство. IPad может заряжаться в самолете, а сенсорный экран делает случайным перерыв в игре жизнеспособным.
Тем не менее, любая комбинация Surface + клавиатура, вероятно, более удобна в использовании. С Surface вам не нужно устанавливать эти специализированные приложения — вы можете установить обычную среду IDE и используемую среду PHP 7.0.
Итак, я говорю, что вы должны пойти на поверхность? Нет.
Давайте посмотрим на затраты, связанные с рабочим процессом, который я описал в этом руководстве:
- Вам нужен iPad, клавиатура и разъем USB. Если у вас уже есть iPad, это 29,99 долларов США за разъем и стоимость клавиатуры. Или вы можете получить клавиатуру Bluetooth.
- Вам нужен DraftCode, который составляет 10,99 долларов США. Вы можете воспользоваться бесплатной версией Рабочей копии (если все, что вас не интересует, когда вы отправляетесь обратно на удаленный компьютер, или вы довольны отправкой проекта по электронной почте).
Допустим, у вас не было ничего из этого. Вам придется заплатить:
- USD 269 → iPad Mini 2 (Apple)
- USD 29.99 → Разъем для комплекта камеры (Apple)
- USD 29.99 → Мультимедийная клавиатура «все в одном» (Amazon)
- USD 10.99 → DraftCode
- USD 14.99 → Рабочая копия
Это составляет 381,96 долларов США (или 85,96 долларов США, если у вас уже есть iPad). Самый дешевый Surface 3, который вы можете купить ( у Microsoft ), стоит 499 долларов, и вы даже не получаете клавиатуру с ним. Помимо кодирования, я бы предпочел иметь iPad.
Это не заменит ваш текущий рабочий процесс, но это будет сделано в крайнем случае, и это интересно попробовать. Вы уже пробовали что-то подобное? Как ты кодируешь во время путешествия? Дайте нам знать, что сработало для вас в комментариях ниже.