Разработка, HowTo

PHP: Отлаживаем скрипты командной строки на удаленной машине

01-ПревьюОтладка бекенда на PHP уже ни у кого не вызывает проблем: достаточно правильно настроить расширение xdebug (или zend debugger), поставить  расширение в свой браузер и можно отлаживать, трассировать или профилировать бекенд.

Но что делать, когда нам требуется отладить консольную утилиту на удаленном сервере? В браузере выбрать пункте enable xdebug нельзя, а если у нас и получится передать IDE_KEY, то оно не знает, где располагается среда разработки и куда делать connect_back.

Это все легко решается одним маленьким скриптом (Важно сделать замечание: это будет работать только когда мы подключены по SSH).

#!/usr/bin/env bash
IP=`echo $SSH_CLIENT | awk "{print $1}"​`
PHP='/usr/bin/php -d 'xdebug.remote_host=${IP}' -d 'xdebug.remote_autostart=1''
$PHP $@

Теперь достаточно скомандовать

$ php-debug.sh yii

И на рабочей машине мы сразу увидим запрос на подключение.

02-Запрос на настройку путей

HowTo

VirtualBox: получение адреса гостевой машины

vboxmanage guestproperty get <machine name > "/VirtualBox/GuestInfo/Net/<network id>/V4/IP

Например получить адрес в публичной сети, который был роздан при помощи встроенного dhcp.

vboxmanage guestproperty get machine "/VirtualBox/GuestInfo/Net/1/V4/IP"

Подробности: https://www.virtualbox.org/manual/ch08.html

HowTo, linux

Fedora: гибернация

Вы закрываете крышку ноутбука и он выключается. «Но то не то что я ожидаю!» — воскликните вы. Да. Так и есть. Потому что уже много времени подряд гибернация работает из рук вон плохо. Эдакое бедствие в линупсе.

Сначала рассмотрим теорию, а после — практику сна базе дистрибутива Fedora 26.

Основные режимы энергосбережения, которые чаще всего упоминаются пользователями::

  • ждущий режим — это когда отключается питание внешних устройств, но при этом сохраняется питание памяти, что позволяет относительно быстро восстанавливать рабочее состояние системы  В спецификации аппаратного обеспечения указано пять уровней энергосохранения. И разработчики различных операционных систем часто выбирают различающиеся между собой уровни.
  • Спящий режим — это особая разновидность выключения компьютера при котором слепок содержимого оперативной памяти сохраняется на диске. При повторной загрузке ОС проверяет, есть ли слепок памяти. И если да, то восстанавливает слепок в оперативную память и начинает с того места, на котором вы остановились ранее.
  • гибридный спящий режим — это тот же ждущий режим при котором содержимое оперативной памяти сохраняется в энергонезависимой памяти на случай отключения питания (windows-only)

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

Предупреждение: все описанные ниже манипуляции требуют физической перезагрузки компьютера для того, чтобы ядро восприняло новые параметры.

Читать далее

HowTo, linux

No Bootable Device после обновления дистрибутива

1 - no bootable deviceИменно таким неприятным сообщением может встретить вас ноутбук или стационарный компьютер после казалось бы удачно прошедшего обновления дистрибутива.

Почему? Потому что обновился grub-efi, а скрипт, который добавит запись о новом образе для загрузки не записал должным образом.

$ efibootmgr -v
BootCurrent: 0001
Timeout: 0 seconds
BootOrder: 0001,2001,2002,2003
Boot0001* Linux	PciRoot(0x0)/Pci(0x1c,0x4)/Pci(0x0,0x0)/NVMe(0x1,00-00-00-00-00-00-00-00)/HD(1,GPT,f627bf87-5440-4997-8310-aa80dba7e383,0x800,0x64000)/File(\EFI\fedora\shimx64-fedora.efi)A01 ..
Boot0002* Unknown Device: 	HD(1,GPT,f627bf87-5440-4997-8310-aa80dba7e383,0x800,0x64000)/File(\EFI\fedora\shim.efi)RC
Boot2001* EFI USB Device	RC
Boot2002* EFI DVD/CDROM	RC
Boot2003* EFI Network	RC

Увы, снять показания я смог только после восстановления работоспособности системы, поэтому на листинге, который приведен выше, мы видим корректный образ под меткой Boot0001 и тот, который был перед обновлением под меткой Boot0002. На разных системах это может выглядеть совершенно различным образом.

Что делать в случае, когда система совершенно не хочет загружаться?

Следует сделать несколько шагов для восстановления работоспособности (не стоит забывать, что для возможности расширенной работы с uefi на многих биосах должен быть установлен административный пароль — только тогда будут видны все элементы меню).

  • зайти в BIOS
  • найти пункт выбора доверенного uefi-файла
  • указать нужный файл на диске (в случае с fedora — это shimx64-fedora.efi)

 

Разработка, HowTo

Печать в Chrome без подтверждения

Снимок экрана от 2017-10-28 01-07-21Существует задача для pos-систем печатать что-либо автоматически: чеки, квитанции и т.п. Хочется, чтобы печать можно было инициировать из скриптов, но по дефолту все браузеры показывают диалог печати или предварительный просмотр.

Это неудобно при создании киосков.

Казалось бы уже неоднократно с таким сталкивались и должны были придумать подходящее решение. Но, увы, решение есть, а все советы о том, как его использовать даже на официальных форумах браузеров некорректны.

Что нам предлагают:

  • Использовать опцию —disable-print-preview (или включать аналогичную настройку в about:flags)
  • Вместе с ней включать опцию —kiosk-printing, которая в теории должна избавить нас от диалога выбора принтера.

А вот и нет. Эти опции нельзя использовать совместно. В чем суть: —disable-print-preview передает управление на диалог выбора принтера в системе, а это лишает нас контроля над выбором пользователя. Во многих (во всех) конфигурациях windows и linux нельзя избавиться от шага выбора принтера, а предварительный просмотр в хроме подменяет диалог выбора принтера.

Опция —kiosk-printing воздействует только на диалог предварительного просмотра chrome сразу печатая просматриваемый документ, а если мы его отключим, то и смысла в установке этого параметра нет.

Отсюда вывод: если вы хотите делать автоматическую печать, то используйте только —kiosk-printing.

Из минусов стоит отметить, что окошко предварительного просмотра все же на некоторое мгновение появляется на экране.

<!DOCTYPE html>
<html>
<head>
<title>autoprint</title>
</head>
<body>
data
<script>
    window.addEventListener('load', function() {
      window.print()
    })
  </script>
</body>
</html>

И это сработает — принтер начнет печатать.

UPD:

Chromium, issue 169004: баг с окном предварительного просмотра в режиме kiosk-printing (непофикшено)

Разработка

PHP: и 64х битные числа

Мне понадобилось в одном из проектов работать с 64х битными числами в качестве масок.

Раньше не доводилось использовать столь большие константы в системах и я был несколько удивлен поведением интерпретатора.

var_dump(1 & 0xffffffffffffffff);

Этот код выведет вам на экран

int(0)

Хотя другой код выводит ровно так, как и должно быть.

var_dump(1 & ~0);
int(1)

Но при этом

var_dump(1 & hexdec(dechex(~0)), 1 & ~0);
int(0)
int(1)

Такое поведение показалось немного странным и, как позже выяснилось, все упирается в константу PHP_INT_MAX, которая на 64х битных системах равна 0x7fffffffffffffff. Семерка в начале идет потому что первый бит зарезервирован под знак.

В чем же тут дело? Если мы хотим записать очень большое число (8 байт ff), то пишем мы это число как положительное целое. Вот так: 0xffffffffffffffff. Интерпретатор сравнивает число с PHP_INT_MAX и если оно его не провосходит, то все будет сконвертировано в int, а если превосходит, то во float. Убедиться в этом можно следующим кодом.

var_dump(0xffffffffffffffff);
float(1.844674407371E+19)

А все это лишь из-за того, что в php нет типа unsigned (и модификатора для данного типа тоже нет). Поэтому записывать числа нам позволено лишь от PHP_INT_MIN до PHP_INT_MAX. Все остальное будет float’ом.

Но мы же по прежнему можем работать с 8-ми байтными числами. Для примера -1 в дополнительном коде это то самое число, которое нам нужно!

var_dump(dechex(-1));
int(0xffffffffffffffff)

Очевидный ответ: либо вспоминать способы формирования чисел в дополнительном коде, либо работать с битовыми операциями.

var_dump(1 & ((0xffffffff << 32) | 0xffffffff), 1 & ~0);
int(1)
int(1)

Разумеется все вышеописанное характерно и для 32з битныз платформ с поправкой на PHP_INT_SIZE (размер инта в байтах).

Литература:

Разработка, HowTo

Часть 9: Codeception. Настройка. Unit-тесты (Тестирование ПО)

codeceptionОглавление

Продолжаем цикл статей Тестирование ПО. В этой части рассмотрим установку и настройку фреймворка codeception. Попутно перенесем все ранее написанные тесты на новую платформу.

Прежде, чем двигаться дальше нам необходимо познакомиться с таким фреймворком как codeception. На базе PHPUnit можно делать лишь блочные и модульные тесты. Его предназначение полностью расшифровывается в названии. Поскольку изначально он был заточен под применение исключительно для юнит-тестирования (и модульного конечно же).

PHPUnit никуда не делся, но так как найти абсолютно все ошибки лишь модульными тестами нельзя, то со временем стали появляться различные инструменты для проведения функционального или приемочного тестирования — одни из них это selenium, который открывает браузер при проверяет соответствие сгенерированной страницы том, что ожидает пользователь и имеет возможность заполнять формы и отправлять запросы.

Появилась потребность в инструментах более высокого уровня, которые могли бы позволить манипулировать всем этим разнообразием консольных команд, приложений и всем тем, что позволяет искать ошибки в приложениях. Одним из таких инструментов стал Codeception — надстройка над PHPUnit, которая помимо прочего умеет выполнять тесты в браузере, осуществлять сетевые запросы, заполнять формы и много чего еще.

Читать далее