Журналируемые файловые системы Linux

Хоть немного и старая, но всё же хорошая статья на доступном языке о журналировании в файловых системах.

Журналируемые файловые системы обеспечивают надёжность и защиту от повреждения данных при крахе системы или потере питания. Время восстановления в таких системах намного меньше, чем в традиционных файловых системах (например таких в которых применяется fsck). Их польза очевидна, и они уже стали стандартом файловых систем.

Читать далее Журналируемые файловые системы Linux

Как в Laravel создать подключение к БД в runtime

Бывают ситуации, например, когда предопределённых в конфиге Laravel подключений к базам данных не достаточно и возникает потребность создавать подключения динамически во время выполнения PHP скрипта. Например, креденшиналы задаются как параметры консольной команды. Иногда это единственный способ проинтегрироваться с посторонним приложением. Далее рассмотрим один из способов решения подобных задач. Читать далее Как в Laravel создать подключение к БД в runtime

Запуск команд от имени системных пользователей

Когда требуется запустить команду или просто проверить права доступа от имени другого пользователя, можно воспользоваться примерно такой командой:

su -c whoami nobody

Для обычных пользователей это вернёт ожидаемый результат. Но, для системных пользователей, вроде nobody, apache и .т.д., результат будет таким:

This account is currently not available.

Читать далее Запуск команд от имени системных пользователей

Что делать с Error opening terminal: unknown?

В некоторых docker-контейнерах при запуске консольных приложений, вместо программы может отобразиться ошибка:

Error opening terminal: unknown.

Лечится это проще простого, достаточно выполнить:

export TERM=xterm

И затем повторно запустить приложение.

Error getting container from driver devicemapper: Error mounting: device or resource busy

Что делать, если во время старта docker-контейнера появляется ошибка вроде такой?

Error response from daemon: Cannot start container [container]: Error getting container [id] from driver devicemapper: Error mounting '/dev/mapper/docker-252:3-528078-[id]' on '/var/lib/docker/devicemapper/mnt/[id]': device or resource busy
Error: failed to start containers: [[container]]

Достаточно выполнить:

umount /var/lib/docker/devicemapper/mnt/[id]

Где, [id] — идентификатор контейнера. После чего можно ещё раз запустить контейнер.

Такая ситуация может возникнуть, если docker daemon внезапно завершился, например при недостаточном количестве свободной памяти.

Как по-быстрому увеличить объём выделяемой памяти для консольного PHP скрипта?

Иногда при обработке с помощью PHP больших и не очень данных, можно словить досадную ошибку посреди выполнения скрипта:

PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 20480 bytes)

Конечно, можно увеличить memory_limit в php.ini или дописать в скрипт:

ini_set('memory_limit','256M');

Читать далее Как по-быстрому увеличить объём выделяемой памяти для консольного PHP скрипта?

Что не так с file_put_contents() в PHP?

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

Синтаксический сахар это хорошо. Судя по описанию, функция file_put_contents() идентична последовательным успешным вызовам функций fopen(), fwrite() и fclose(), что влечёт за собой некоторые особенности, связанные с этими функциями. Сразу скажу, что пробовал воспроизводить это только внутри Docker контейнеров и утилизацией диска близкой к 100%, возможно в другом окружении такое поведение воспроизводиться не будет. Для начала давайте с умным видом  посмотрим исходник PHP 7.1.12. Читать далее Что не так с file_put_contents() в PHP?

Cлучайные числа с плавающей точкой в PHP

Стандартные библиотеки PHP умеют генерировать только целые случайные числа. Однако, возникают задачи где нужно не целое рандомное число с максимально длинным хвостом, например, в диапазоне от 0 до 1. В таком случае можно воспользоваться таким способом:

$rnd = rand(0, getrandmax() ) / getrandmax();

Если же количество знаков после запятой должно быть, например, 2, то:

$rnd = rand(0, 100) / 100;

Отлично! А что, если нужно случайное число в диапазоне от 4 до 10 с тремя знаками после запятой? Пожалуйста:

$rnd = 4 + rand(0, 1000) / (1000 / (10 - 4) );

Или:

$rnd = 4 + rand( 0, (10 - 4) * 1000 ) / 1000;

Задача о диагонали и площади квадрата

Задача на декомпозицию, формулировка которой может направить по неверному пути. Есть квадрат со сторонами N, например, N = 5. У него есть диагональ, выделенная серым цветом. Нужно найти количество клеток на нижней половине, $cnt = f(N). Не обращайте внимание на рисунок, это просто визуализация для отвлечения внимания.

Читать далее Задача о диагонали и площади квадрата

Что не так с этим скриптом?

Очень крутая задача, в которой не всё так просто, как кажется на первый взгляд. Попробуйте найти в ней 2 логические ошибки. SQL-инъекция здесь служит отвлекающим манёвром.

<?php 
 $dest = $_POST['destination']; 
 $result = $_POST['data']['result']; 
 $output = ""; 
 
 if ($dest == 'file') { 
     $file = fopen('storage.txt', 'a+'); 
     fwrite($file, $result); 
     $output = "stored in file"; 
 } elseif ($dest == 'db') { 
     $db = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'user', 'pass'); 
     $db->exec("INSERT INTO storage (value) VALUES ('{$result}');"); 
     $output = "stored in db"; 
 } 
 
 echo $output;

Читать далее Что не так с этим скриптом?