Сообщения

Монтирование NFS

Смонтировать удалённую файловую систему можно несколькими разными вариантами. Сейчас опишу, как я это сделал на свежеустановленной KUbuntu. Во-первых, чтобы не выходила ошибка вида: mount: /mnt/storage/public: bad option; for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount.<type> helper program. Нужно установить пакет, в котором будет библиотека для поддержки клиентского функционала NFS: sudo apt-get install nfs-common Далее мне нужно было один из каталогов моего файлового хранилища подключать в мой локальный каталог (я его предварительно создал) - /mnt/storage/public. Ранее я это делал через /etc/fstab записью вида: 192.168.1.245:/mnt/public /mnt/storage/public nfs nofail,x-systemd.automount,x-systemd.requires=network-online.target,x-systemd.device-timeout=10 0 0 Сейчас по совету статьи "Автомонтирование файловых систем с systemd" решил сделать то же самое через systemd. Создал два файла: sudo nano /etc/systemd/system/mnt-storage-public.mount

PHP: значения по-умолчанию и типизация

Рассмотрим примеры, когда значения по-умолчанию в комбинации с указанием типов входных и выходных параметров функции могут ввести в заблуждение. Для начала рассмотрим такой сценарий: требуется разработать функцию, которая будет возвращать всегда целочисленное значение, а на вход принимает один параметр - тоже целочисленный. Заготовка: <?php class Product {     /**      * @param int $productId      *      * @return int      */     public function getStrangeProduct(int $productId): int     {         return $productId;     } } $obProduct = new Product(); При таком раскладе совершенно очевидно, что вызов var_dump($obProduct->getStrangeProduct(0)); вернёт целочисленное значение 0: /mnt/projects/sites/server.local/www/test-functions.php:16:int 0 Теперь представим, что ТЗ изменилось. Теперь нужно, чтобы функция имела значение по-умолчанию для входного параметра, когда функция вызывается без указания параметра. Так функция примет вид:     /**      * @param int|null $productId   

Запуск приложений ARM на x86 virtual Android

Изображение
Задача: запустить любимую игрушку или полезное приложение Android на компьютере под управлением linux. Первый шаг - это запустить хоть сам голый Android на компьютере внутри базовой операционной системы.Для этой цели есть несколько вариантов решения. Можно использовать стандартный эмулятор Android для разработчиков от Google, - запустить любую версию Android. Можно использовать Anbox с его Android 7.1. Фишка Anbox в том, что будет максимально задействовано родное железо без лишних слоёв эмуляции. Третий вариант, который я тут приведу - Genymotion - платный проект виртуализации, в котором можно получить бесплатную лицензию для домашнего использования. В общем, выбрать есть из чего. Где взять программу для установки Какой бы проект вы не установили, потребуется найти установочный пакет интересуемого приложения или же установить менеджер приложений (самый популярный вариант - Google App и Google Play services в придачу к нему). Начнём с самого простого случая. Вариантов будет несколько

Postman: nginx secure link

Изображение
В предыдущей статье рассматривался вариант защищённых ссылок, которые предоставляет модуль ngx_http_secure_link_module веб-сервера nginx. В этой статье рассмотрим, как тестировать этот вид ссылок в программе Postman , - как автоматически вычислять md5 хэш от переменных и постоянных параметров. Динамические параметры Postman В программе Postman можно использовать переменные, которые могу выступать и частью URL, и значениями параметров запроса. Так ссылка /s/api/v1/auth/?md5= 1pzX968MiqPu_ZvYYht5Xg &expires= 1704067200 из прошлой статьи с применением переменных должна стать такого вида: /s/api/v1/auth/?md5= {{md5}} &expires= {{expires}} Переменные удобно привязывать к настройкам окружения - кнопка с глазом - "Environment quick look" . Настройки окружения удобно делать для нескольких инсталляций сайтов (боевой, тестовый, локальный и пр.). В программе Postman просто переключать окружение и отправлять запрос на нужный домен. При этом все прочие параметры запроса остаются

Закрытое API: nginx secure link

Изображение
Допустим, есть API для сугубо внутреннего пользования. Например, взаимодействие мобильных приложений и сайта. API нигде не офишируется, нет публичной документации и вообще никаких упоминаний где-либо вне организации. Но само API открытое. Нет никакой 0Auth авторизации, или JWT, или ещё чего-то. В какой-то момент API начинает работать не только на внутренние цели, но и на пользу нежелательным сторонним пользователям. Начинают напрямую пользоваться API методами, тем самым создавая лишнюю нагрузку на серверах, утечку данных и прочие негативные последствия. Как открытое API превратить в закрытое? При этом не поломать старые валидные клиенты (хотя бы на переходный период). И в перспективе пресечь любые несанкционированные запросы через API. Тут приведу один вариант, полностью средствами веб-сервера nginx. Если кто-то знает ещё удачные варианты - пишите в комментариях. Модуль ngx_http_secure_link_module На странице официальной документации отлично описана польза, которую даёт применение это

Битрикс: архитектурная ошибка SQL

Изображение
В схеме базы данных битрикса есть неочевидный баг. На первый взгляд, всё выглядит нормально, а по факту - не работает. Дело вот в чём. Есть таблица пользователей - b_user . Вполне логично ожидать от такой таблицы, что поле логина будет уникальным. Чтобы база данных не давала физически сохранить две учётные записи с одинаковым логином. Но в битриксе это не так! Уникальный составной ключ Яркий пример проблемы, которую привносит разработчик, выполняя работу архитектора баз данных. SQL-запросом SHOW CREATE TABLE b_user; Можно просмотреть схему таблицы, где видно, что есть некий уникальный составной ключ ix_login . На этот ключ возлагались напрасные надежды следить за уникальностью логинов. Вот как выглядит схема этой таблицы (из вывода запроса убрал ненужные в данном обзоре столбцы): CREATE TABLE `b_user` ( `ID` int(18) NOT NULL AUTO_INCREMENT, `TIMESTAMP_X` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `LOGIN` varchar(50) COLLATE utf8_unicode_ci NOT NULL, `PAS

jQuery UI: Сборка из исходников

Изображение
 Введение Недавно понадобилось поставить только виджет datepicker из набора jQuery UI . Ранее для этого требовалось зайти на официальный сайт, выбрать галочками нужное и скачать итоговый пакет. Сейчас же сайт отдаёт ошибку 502: Я даже подумал, что проект забросили и больше не поддерживают библиотеку. Но выход нашёлся. Если внимательно посмотреть сайт, то можно найти ссылку на репозиторий github . Там есть недавние коммиты - значит проект жив. Сборка из исходников Клонируем себе проект: git clone https://github.com/jquery/jquery-ui.git Далее перерыл сайт для разработчиков, искал в интернете, на их же github - как можно собрать из исходников именно то, что нужно (как это делается на сайте в Download Builder ), а не весь гигантский набор виджетов и эффектов jQuery UI. Нигде ничего не нашёл, кроме указания верного пути в Stack Owerflow . Переходим в каталог исходников и устанавливаем зависимости для сборки: cd jquery-ui/ npm install sudo apt install node-grunt-cli Меняем файл сборки G