G|Translate: English EN Français FR Deutsch DE Italiano IT Русский RU Español ES

Приключение пробелов и TAB в html

Крайне забавная тема.

Приключение пробелов и TAB в html

Вот они.

Мнемоника — специальный синтаксис для указания символов в html коде.

Читаем Мнемоники в HTML

Символ пробела, ASCII / UNICOD код 32

В спецификации HTML сделана интересная схема отображения пробелов:

  • несколько пробелов между символами отображается как один
  • несколько пробелов до символа отображаются как один
  • один пробел на пустой строке не отображается
  • внутри тэгов <pre> показываются все пробелы

Зачем это сделано?

Для удобства редактирования кода html руками :)

Вот пример кода в тегах <pre>

<p><b>
   пример текста
   пример текста
   пример текста
</b></p>

данный текст отобразится как

пример текста пример текста пример текста

все пробелы слева и справа будут сокращены до одного.

Кстати, именно по этому вывод массива в PHP необходимо делать в тегах <pre>, что бы браузер не удалял пробелы, которые обеспечивают форматирование

echo '<pre>';
print_r($array);
echo '</pre>';

Символ неразрывного пробела ASCII код 255, UNICODE 0160

Почитать статью

Неразрывный пробел

Можно набрать как ATL 255, визуально пробел 32 и пробел 255 будут выглядеть одинаков

» «

» «

можно посмотреть с помощью конвертера символов в html код

http://wb0.ru/chrconv.php

Приключение пробелов и TAB в html

Так и есть:

  • первый пробел это &#32;
  • второй пробел это &#160;

Пробел называется «неразрывным», т.к. браузер эти пробелы:

  • не сокращает
  • не переносит на другую сторону

Также этот пробел используется в визуальных редакторах CMS для обозначению пустой строки в виде 

<p>&nbsp;</p>

Это же html страница, а не полноценный текстовый редактор. Для визуального редактированию нужно как-то поставить курсор в начале пустой строки.

Вариант <p></p> ничего не даст, так как в самом тексте html будет пустота и курсор между тэгами не поставить.

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

А. С. Пушкин

Приключение пробелов и TAB в html

Точно — код 8239 — Narrow No-Break Space

Символ табуляции TAB ASCII / UNICOD код 09 и его отображение

Вот тут вообще зоопарк.

Читаем статью Табуляция

Да, табуляция — это смещение на 8, 16 символов (и так далее).

Если посмотреть в классическом блокноте Windows, то оно так и будет.

Приключение пробелов и TAB в html

вверху символ табуляции — смещение 8 позиций

ниже — 4 обычных пробела

Приключение пробелов и TAB в html

Так и есть, до первой единицы символ табуляции 09, до второй — 4 пробела 32

В коде html смещение 8 символов для табуляции останется, 4 пробела превратятся в один. Если код html в тэгах <pre> = то обычные пробелы останутся на месте.

Так, стоп.

А почему в части обычных редакторов и IDE для разработки (которые есть и виде сайтов html) кода клавиша TAB делает сдвиг на 4 символа, а не на 8?

Приключение пробелов и TAB в html

Вот редактор Notepad++ = смещение одинаковое. Если посмотреть коды — то картина будет такая же: стандартный символ табуляции (на первой строке) и 4 пробела (на второй).

А просто так договорились. Что сдвиг 4 позиции будет красившие,  чем 8 позиций. И программно прописано показывать сдвиг на 4 символа.

Более того — клавиша TAB передает в ПК только код нажатия, а что делать дальше — решает программа.

И вот тут могут быть варианты:

  • вставляет код 09, показываем как смещение на 4 позиции
  • вставляет код 09, показываем как смещение на 8 позиций
  • вставляем код 32, показываем смещение на 4 пробела
  • вставляем код 0160 (он же ALT 255), показываем смещение на 4 пробела

В результате, если Вам необходимо показать код на своей веб-страницы = нужно перехватить буфер и программного его обработать:

  • заменить 09 на 4 символа 32 (если вставка в тэгах <pre>) и добавить в конец строки <br / >
  • заменить 09 на 4 символа 0160 (если вставка просто на странице html) и добавить в конец строки <br / >
  • или заставить браузер показывать 09 как смещение на 4 позиции (через стили CSS)

Тогда, например код Python (с отступами) корректно отобразится на Вашем сайте.

Наилучшим решением (самый первый вариант) будет использование 4х стандартных пробелов с кодом 32 для смещения на 4 позиции и обертка тегами <pre>.

Это позволит корректно копировать код с сайта в среду разработки языка, «Блокнот» и Notepad++ (и там и там всё будет отображаться одинаково).

Мессенджер «Telegram» делает именно это — все отступы заменяет на набор стандартных пробелов.

Приключение пробелов и TAB в html

Вот код на Python подбора «пифагоровых троек», скопированный из среды разработки IDE в мессенджер. Что там с кодами символов после вставки?

Приключение пробелов и TAB в html

Всё в порядке — четыре символа 32 (стандартные пробелы) вместо одного символа 09 (табуляция). Причем визуально смещение кажется в три символа, но это не так. Просто «длина» пробелов меньше ширины стандартного шрифта.

 И при копировании и вставке обратно в IDE = всё будет нормально работать.

Использование, например «неразрывного пробела» при обратной вставке кода с сайта в IDE — приводит к проблемам.

Приключение пробелов и TAB в html

«Не нравятся» символы в начале строки :(

Четыре неразрывных пробела показываются как красные черточки.

 

Алгоритм суммы одинаковых элементов массива (на примере Python)

Простая задача — посчитать количество одинаковых элементов массива

Алгоритм суммы одинаковых элементов массива (на примере Python)

Глазами легко видеть, что суммы правильные :)

Попробуем теперь сделать тоже самое программно. Используем  Python. 

Логика кажется очень простой:

  • делаем счетчик
  • складываем
  • при смене элемента счетчик обнуляем
  • выводим то, что насчитали

Поехали. Будет картинками, правильный код в виде текста будет в конце статьи.

Используем интерпретатор Питона по ссылке

https://www.online-python.com/

Конечно, массив надо сначала отсортировать, что бы одинаковые элементы были рядом. Будем считать, что это сделано заранее.

Алгоритм суммы одинаковых элементов массива (на примере Python)

Позвольте, а где элемент «Три»?

Так как он в конце массива, наше условие не сработало для последнего подсчета. Точнее — сумма посчиталась, но на экран не вывелась.

Добавим условие «ИЛИ последний элемент массива«

Алгоритм суммы одинаковых элементов массива (на примере Python)

Так:

  • последний элемент «Три» появился
  • но счет неправильный, не произошло последнее суммирование

Точнее — последнее суммирование происходит — но программа не попадает уже в условие, так как цикл закончился.

Пробуем по другому — убираем условие последнего элемента и за пределами цикла еще раз выведем «print»

Алгоритм суммы одинаковых элементов массива (на примере Python)

Теперь всё посчитано правильно.

Но плохо, что у нас одинаковый вывод «print» в двух разных местах.  Это на примере просто.  А в реальности там может быть сложный вывод — и отлавливать ошибку вывода в двух местах вместо одного — это нехорошо.

Нам нужно, что бы «print» был один раз внутри цикла и всё было отображено правильно. Странно, у нас фактически простая конструкция:

  • цикл
  • внутри два модуля
    • модуль условия и вывода
    • модуль суммирования

Почему не работает нормально?

Уберем последний «print» и попробуем переставить модули внутри цикла местами.

Алгоритм суммы одинаковых элементов массива (на примере Python)

Вообще беда:

  • элемент «Три» пропал
  • первые два элемента считаются неправильно (что очевидно — теперь счетчик перед условием)

Внимание — сектор «приз»! 

А где ошибка, собственно?

Всего два модуля, один цикл, оба варианта мы попробовали.

И оба варианта неправильные..

А ошибка не в программе.

Ошибка в начальной логике. Если хорошо подумать — то нам нужна «машина времени».

Мы делаем вывод посчитанного:

  • или это последний элемент массива
  • или в следующей позиции массива уже другой элемент
  • причем эту проверку следующего элемента массива мы можем делать только, если текущий элемент не последний (иначе выйдем за пределы массива)

Алгоритм суммы одинаковых элементов массива (на примере Python)

Вот теперь всё правильно (и убран print(i), который был для отладки).

Ниже код в виде текста для копирования.

arr_data = ["Один", "Два", "Два", "Три", "Три", "Три"]
x = len(arr_data) # число элементов в массиве
find_me = arr_data[0]
count_my = 0
for i in range (x):
    # (№ 2) модуль увеличения счетчика
    count_my = count_my + 1 # увеличиваем счетчик
    #----------------
    out = False # условие вывода
    find_me_old = find_me
    if i == (x-1): # проверка на последний элемент
       out = True
    elif arr_data[(i+1)].find(find_me) < 0: #проверка следующего элемента
       out = True
       find_me = arr_data[(i+1)] #замена элемента на новый
    #---------------
    # (№ 1) модуль условия вывода и сброса счетчика
    if out : 
       print(' Элемент = ', find_me_old, '! Итог = ', count_my)
       count_my = 0
    #--------------
#---

Проверьте отступы (нужны TAB, а не пробелы) после копирования кода — это же Питон.

Как резюме — ошибка может быть не только в программе, но в самом алгоритме.

 

Используем PHP и псевдографику для простой гистограммы

Вот такой вывод «гистограммы» на основе данных массива

Используем PHP и псевдографику для простой гистограммы 

Нет никаких графических библиотек, чистый PHP и символ псевдографики (ASCII 2593). Разная насыщенность:

  • значение более 70% от размера ячейки
  • значение менее полного размера ячейки
  • нет значения — фон

Для построения используется цифровой массив — могут быть положительные и отрицательные данные.

Массив ниже — данные вначале более актуальные по времени, поэтому в коде используется реверс (что бы эти данные оказались справа на гистограмме)

$arr_count = array (150,145,20,10,5,0,99,85,41,34,21,56,75,46,78,34,125,130,128,10,15,24,50,30,20,0,10,20,30,50,30,20,10,5,0,5,10,20,30,50,150,145);

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

Вот еще «график» при наличии отрицательных значений в массиве

Используем PHP и псевдографику для простой гистограммы

Сами данные ниже, есть отрицательные значения

$arr_count = array (150,145,20,10,5,0,99,85,41,34,21,56,75,46,78,34,125,130,128,10,15,24,50,30,20,0,-10,-20,-30,-50,-30,-20,-10,-5,0,5,10,20,30,50,150,145);

 

Код PHP — функция вызывается с передачей ей цифрового массива.

Параметры:

  • массив
  • необходимость реверса массива (по умолчанию False)
  • высота вывода в строках, по умолчанию 20.
echo tsl_graph ($arr_count);

/////----------------------------------------------------------------
function tsl_graph ($arr_count, $revesr_arr = FALSE, $high_star = 20) {
	//$arr_count - числовой массив для вывода с использованием псевдографики
	//$revesr_arr - необходимость реверса массива, по умолчанию FALSE
	//$high_star - число строк для вывода "графики", по умолчанию 20
	
	$count_total = array_sum($arr_count) ; 	//сумма данных в массиве
	$arr_count_new = ($revesr_arr ? array_reverse($arr_count) : $arr_count); //реверс	
	$len_count_total = count($arr_count_new); 	//число элементов массива

	$max_array = max($arr_count_new); 
	$min_array_var = min($arr_count_new);
	$min_array = ($min_array_var < 0 ? $min_array_var : 0); //диапазон с учетом отрицательных значений
	$pik_arr = ($max_array - $min_array)/$high_star; 	//значение одного "деления" по вертикали
		
	$graph_line = '';
	$num_line = $high_star; 	//самая верхняя строка графика
	//сверху вниз
    while ($num_line > 0) {
		
		//формируем строку, используем одинаковый символ с разным цветом - иначе разная ширина
		$star_line = '';
		$num_element = 0;
		$shift = $min_array/$pik_arr ;  //смещение при наличии отрицательных чисел
		while ($num_element < $len_count_total) {
			$virt_line = $num_line + $shift ; //для 0 без изменений, для отрицательного будет вычитаться
					
			if ( ($arr_count_new[$num_element] > 0) && ($virt_line > 0 ) ) { //для положительных чисел и положительных строк
				$tail = $arr_count_new[$num_element] - ($pik_arr*($virt_line-1)); //хвост
				if ($tail >= ($pik_arr*0.7)){ // красим полностью при 70%
					$star_line .= '▓'; 
				}elseif ($tail >0 && $tail < $pik_arr) {
					$star_line .= ''; // слабый серый для мелких показаний
				}else{
					$star_line .= ''; //фон
				}
			}elseif ( ($arr_count_new[$num_element] < 0) && ($virt_line <= 0 ) ){ //для отрицательных чисел и линии 0, -1, -2
				$tail = abs($arr_count_new[$num_element]) + ($pik_arr*($virt_line)); //хвост
				if ($tail >= ($pik_arr*0.7)){ // красим полностью при 70%
					$star_line .= '▓'; 
				}elseif ($tail >0 && $tail < $pik_arr) {
					$star_line .= ''; // слабый серый для мелких показаний
				}else{
					$star_line .= ''; //фон
				}
			}else{ // ноль - делать черту не работает = ширина разная и график разваливается
				$star_line .= '';				
			}
			
			$num_element = $num_element + 1;
		}	
		//сборка элементов массива в одну строку с переводами строк
		$graph_line .= $star_line.'
';
		$num_line = $num_line - 1;
	}
return '
'.$graph_line.'
Total '.$count_total.'
';
}

Комментарии:

  • используется символ псевдографики (ASCII 2593)
  • символ используется и для гистограммы и для фона (серым цветом)
  • разные символы использовать нельзя, т.к. шрифты в разных браузерах могут быть разными и толщина их тоже может быть разной
  • можно использовать реверс массива, т.к. обычно более свежие данные в начале массива (в начале таблицы), а на графике они должны оказаться справа — при желании можно отключить, код простой
  • функция возвращает строку html с графиком и суммой элементов массива
  • гистограмма использована вместо точек графики из-за того, что эти символы «прилипают» друг к другу, использование «звездочек» дает некрасивую картинку
  • никакой защиты от некорректных данных в функции нет — можно при желании доработать

 

ВАЖНО: если WordPress что-то испортил в коде на этой странице — пишите через обратную связь (или site_post@bk.ru), вышлю файл PHP.

Можно, например, использовать для визуализации результатов логов по месяцам

Используем PHP и псевдографику для простой гистограммы

Как собрать информацию из лога по месяцам — читаем статью ниже

Алгоритм суммы одинаковых элементов массива

Вырезаем первые 7 символов из лога (как раз год-месяц) и считаем элементы по изменению этого поля. Никаких сложных формул по работе с датами.

 

В Debian 11 нет команды iptables

При вводе команды iptables получаем “command not found”. Это  как?

В Debian 11 нет команды iptables

А вот так :)

По умолчанию теперь есть nftables. Включена в ядро Linux, начиная с версии 3.13, выпущенной 19 января 2014 года. Является заменой четырех команд:

  • iptables
  • ip6tables
  • arptables
  • ebtables

Базовых отличий два:

  • в одной команде объедена работа с протоколами IPv4 и IPv6
  • теперь нет изначально созданных таблиц — нужно создавать самостоятельно

Таблицы могут быть одного из 6-ти семейств (families):
ip — для обработки пакетов IPv4
ip6 — IPv6
inet — обрабатывает сразу и IPv4 и IPv6 (чтобы не дублировать одинаковые правила)
arp — пакеты протокола ARP
bridge — пакеты, проходящие через мост
netdev — для обработки «сырых» данных, поступающих из сетевого интерфейса (или передающихся в него)

Цепочки получают на вход пакеты из хуков (цветные прямоугольники на картинке). Для ip/ip6/inet предусмотрены хуки prerouting, input, forward, output и postrouting.

В Debian 11 нет команды iptables

 

Прочитать про netfilter и fail2ban можно ниже

Установка fail2ban на Linux

Синтаксис nft более схож с реальной грамматикой языка.

Команда для добавления правила блокирования пакетов, направленных на адрес 1.2.3.4:

nft add rule ip filter output ip addr 1.2.3.4 drop

Синтаксис такого же действия для iptables:

iptables -t filter -A OUTPUT -j DROP -d 1.2.3.4

Для обеспечения обратной совместимости предоставляется специальная прослойка, позволяющая использовать iptables/ip6tables поверх инфраструктуры nftables.

Для облегчения перехода можно конвертировать правила iptables в nftables с помощью утилит iptables-translate, iptables-restore-translate, iptables-nft-restore и т.п. Утилиты находятся в пакете iptables, который нужно установить дополнительно.

Две полезные статьи по использованию команды nft

Как пользоваться NFT

Переход с iptables на nftables

 

Использование тройного === в программировании (PHP)

Любопытный пример.

Использование тройного === в программировании (PHP)

Программисты знают, что есть несколько вариантов «равно»:

  • присваивание $a = 10
  • сравнение if ($a == $b) {……..}
  • тождественное сравнение if ($a === $b) {……..}

Если с первыми двумя вариантами достаточно понятно, то третий вариант вызывает вопросы. 

Тождественно равно — должны совпадать не только значения, но и типы переменных. Основные типы в PHP:

  • число $a = 10;
  • строка $b = ’10’; // кавычки показывают, что внутри строка
  • логическая переменная $c = FALSE;

И например, условие $a == $b будет верным, т.к. сравниваются значения и интерпретатор PHP «понимает», что это десять.

А вот условие $a === $b будет ложным, т.к. дополнительно сравниваются и типы переменных —  число и строка.

На уровне определений понятно. Зачем это нужно в реальном программировании?

В PHP есть функция поиска подстроки в строке

$pos = strpos(‘abcdef’, ‘a’);

Функция возвращает позицию найденной подстроки, в данном случае 0 (поиск идет слева направо, позиции считаются от нуля). Если ничего не найдено — возвращается логическое значение FALSE.

И все бы было просто и  хорошо, но интерпретатор PHP может воспринимать 0 — как логическое FALSE

<?php
if (!$pos) { // условие в скобках истина
   echo 'ничего не найдено';
}
// так не правильно
?>

Ноль признается логической переменной (т.к. он находится в условии), инвертируется и получается TRUE. PHP помогает программисту. Можно использовать числа 0 и 1 в качестве логических переменных (если они в условии или сравнении).

Хотя просто это нулевая позиция, которая была найдена.

Вот тут нам и пригодится тройное равно

<?php
if ($pos === FALSE) { // переменная тождественно равна FALSE
   echo 'ничего не найдено'; 
} else {
   echo 'позиция символа '.$pos;
}
?>

Использование конструкции === позволяет избежать ошибок.

P.S.

В настоящее время лучше использовать функцию mb_strrpos() — она корректно работает с юникодом и многобайтовыми строками (наша кириллица и другие языки).

Функции для работы с многобайтовыми строками

Переадресация с https на http

Зачем это нужно?

Переадресация с https на http

Есть несколько причин:

  •  у нас сайт в разработке, пока работает на http, но поисковые боты проверяют и протокол https (и делают заглушку основным «зеркалом»…)
  • у нас сайт в процессе переезда на другой сервер, а сертификат SSL может выпускаться от 10 мин до 1 часа (если проверка по DNS) — а в поиске все страницы сайта выдаются в виде https://site.ru

Нужно как-то и поисковым машинам сказать, что это временно.

И посетителям сайта, которые в этот момент перейдут с поиска — тоже об этом сказать.

Основная статья по перевода на HTTPS

Как включить HTTPS на сайте?

ВАЖНО: браузер проводит проверку наличия SSL-сертификата раньше (при запросе https), чем срабатывает редирект. Если у Вас нет активного SSL-сертификата (а его пока нет) — посетители сайта в любом случае увидят предупреждение браузера о незащищённом контенте раньше, чем сработает редирект.

Вариантов несколько.

У хостера настроена (на уровне Nginx) заглушка при запросе HTTPS

Очевидно, что запросы до файла .htaccess (Apache) не дойдут. Делаем переадресацию прямо в самом файле-заглушке html вида

<!DOCTYPE html>
<html>
<head>
<title>Сайт на реконструкции</title>
<meta http-equiv="refresh" content="0;URL=http://site.ru" />
<meta name="robots" content="noindex,nofollow">
</head>
<body>
<p>Скоро здесь будет сайт</p>
</body>
</html>

Делаем переадресацию (с нулевой задержкой) на протокол http и запрещаем его роботам индексировать. Если в Nginx всё настроено правильно, то и роботы получат код 302 Moved Temporarily («перемещено временно»).

Нам как раз это и нужно.

Переадресация с https на http

Код 301 Moved Permanently («перемещено навсегда») — ни нам, ни роботам не нужен.

Переадресация https->http средствами Apache

Если запрос https доходит до папки сайта — то можно использовать .htaccess

RewriteEngine On
RewriteCond %{SERVER_PORT} ^443$ [OR]
RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ http://site.ru/$1 [R=302,L]

или

RewriteEngine On
RewriteCond %{ENV:HTTPS} =on
RewriteRule ^(.*)$ http://site.ru/$1 [R=302,L]

или без указания имени домена

RewriteEngine On 
RewriteCond %{ENV:HTTPS} =on 
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=302,L]

В всех случаях отдаем роботам ошибку 302!

Переадресация всех страниц сайта на главную страницу

У нас же только заглушка есть, остальных станиц пока нет.

Нам не нужен 404 код при переходе с поиска…

Используем конструкцию

RewriteEngine On
RewriteBase /
RewriteRule ^(.*)$ index.php [L,QSA]

Пусть пока посетители сайта видят основную заглушку index.php

 

 

Чем отличается сервер VPS от VDS

В чем разница VPS/VDS?

Чем отличается сервер VPS от VDS

Хитрые хостеры отвечают, что это одно и то же.

А вот не совсем:

  • VPS — (англ. virtual private server) — виртуальный частный сервер
  • VDS — (англ. virtual dedicated server) — виртуальный выделенный сервер

Server — он конечно сервер, но разный. Одна буква P/D — и разница есть.

Читаем статью про хостинг

Хостинг VPS

Самые низкие тарифы VPS – на виртуализации OpenVZ

Читаем статью

Как выбрать VPS/VDS по параметрам

Вот именно OpenVZ — это как раз виртуальный частный сервер VPS. Точнее — это контейнер (причем для его работы требуется модифицированное ядро Linux — в отличии от Docker), а не сервер. Внутри контейнера можно запускать только те программы, которые поддерживает общее ядро.

А ядро у всех пользователей общее. И под пользователей выделены контейнеры, где созданы виртуальные ядра, память и пр.
Хостеры очень любят OpenVZ – так там диск тоже виртуальный и его объем динамически распределяется между пользователями. Т.е. Ваши 15 Гб на диске типа у хостера и 3 использованных = факт только 3 использованных и Вам еще выделят до 15 при необходимости…

Поэтому дешево.

НО для OpenVZ:

  • так как диск виртуальный и он не весь ваш – там невозможен SWAP -> те при исчерпании оперативки будет срабатывать OOM Killer – и самые загруженные процессы будут убиваться. Пришло много пользователей, памяти выделилось много (надо же где-то процессору собрать html по инструкциям php), оперативная память кончилась, убили наиболее загруженный процесс (как правило mysql) – сайт/сайты отвалились…..
  • так как ядро Linux общее — Вы не можете помять, например, нужную версию fail2ban с 0.9.0 на 0.10.0 (с поддержкой IP v6)
  • и ограничение всего 256 правил для iptables — т.е. полноценную защиту от ботов не сделать.

 

Читаем здесь

Установка fail2ban на Linux

Настраиваем fail2ban под свои задачи

И оперативная память тоже интересно расходуется. Т.е. она конечно в рамках тарифа вся Ваша — но посмотрим на графики.

Данные с панели управления — порядка 750 Мб занято из 3 Gb

Чем отличается сервер VPS от VDS

Данные через биллинг (общие данные с сервера) — занято порядка 2 Гб

Чем отличается сервер VPS от VDS

Как такое может быть?

Проверим командой (через SSH)

free -h

Смотрим на результат. Что это?

Чем отличается сервер VPS от VDS

  • total 3 Gb- понятно
  • used 726 Mb  — понятно
  • cache 1,3 Gb — а это кто?

А это общее ядро Linux в Вашей памяти (которая в рамках OpenVZ) кэширует различные операции… Пока Вы часть памяти не использовали — она идет на общие нужны ядра операционной системы.

И при использовании режима модуля Apache FastCGI тоже есть ограничения.

Чем отличается сервер VPS от VDS

Количество «воркеров» (т.е. рабочих процессов) ограничено двумя. Т.е. режим FastCGI Вы включить можете, а максимальное число рабочих процессов — не можете. Фактически это ограничение означает, что только два посетителя одновременно (в один и тот же момент времени) могут увидеть Ваш сайт. Если пришел третий — ему надо подождать, пока двум предыдущим сервер отдаст страницу :(

В общем, надо смотреть конкретные цифры у конкретного хостера.

Те вариант VPS = OpenVZ+Apache+Nginx+FastCGI+PHP – он дешевый, но для серьезных проектов на подходит….

Он даже хуже (иногда) чем обычный виртуальный хостинг – на виртуальном  хостинге сайты просто тормозить будут, а на VPS с OpenVZ при нехватке памяти – падать (SWAP-файла на диске нет по определению)…

А вот виртуализация KVM — это полноценный выделенный сервер VDS. Фактически на нем может быть запущена любая операционная система.

ВАЖНО: существуют  дешевые варианты VDS на KVM. Дешевле, чем OpenVZ. В чем секрет? Вы получаете чистую виртуальную машину с root доступом. И всё.

И дальше сами настраиваете:

  • или руками через SSH или через установку бесплатной панели управления хостингом
  • доступ через FTP
  • мониторинг нагрузки и прочее
  • вручную настраиваете сертификаты SSL (бесплатные let’s encrypt)
  • вручную настраиваете Fail2Ban

Можно конечно и за деньги — арендовать панель управления, подключить платный сертификат. Но сразу стоимость вырастет в несколько раз.

То есть если у Вас есть навыки администрирования Linux — то сможете получить дешевый VDS. Если навыков нет — будет дороже. Но зато управления мышью клац-клац :)

Нужно информационного сайта:

  • или KVM брать – он дороже в 4 раза (и как минимум 2 ядра, 4 гига RAM и своп на диске), но там весь диск Ваш и можно сделать SWAP
  • или выделенный сервер в железе – совсем дорого
  • или домашнюю машину 4 ядра + 8 гиг (на том же 775 сокете) + хороший инет-канал 500 Мбит/с + KVM+Apache+Nginx+PHP (без FastCGI – только для дублирования сайта на хостинге) + DNS от Яндекса (с балансировщиком – основная отдача с домашнего сервера и плюс резерв с платной VPS) + CMS должна уметь делать синхронизацию из дома на сервер (статика и база)
  • основная отдача с домашнего сервера и плюс резерв с платной VPS + на хостинг отдаем только статику html (генерируем статичный сайт из WP)
  • Записи должны быть с html на конце (что бы физические файл создать)
  • Те все дополнения и изменения делаем только дома на сервере WP+PHP, потом преобразовываем в статику
  • На php остается только форма обратной связи – отдельный скрипт

 

Нужно для интернет-магазина:

  • желательно облачное решение с ресурсами по требованию
    • резкие всплески нагрузки (реклама, акции, сезонность)
    • много пользователей в одном пике – память будет расти лавинообразно
  • одного ядра не хватит для нормальной работы
    • т.к. для каждого посетителя будет раздел «Вы смотрели» — страница каждый раз формируется заново
    • кэширование готовых страниц мало поможет — значит, работает процессора и собирает из PHP станицы заново

Что выбрать HDD или SSD у хостера?

Простой вопрос HDD vs SSD

Что выбрать HDD или SSD у хостера?

Казалось бы — что тут выбирать?

Каждый, кто менял в своей Windows 7 на старом ПК диск HDD на SSD = радовался увеличению быстродействия системы.

SSD — быстрее:

  • нет механических систем
  • да и электроны быстрее по микросхемам бегают

Но у хостера — не домашний ПК, там сервер. И диски не по отдельности, а соединены в RAID-массив.

Некоторые хостеры предлагаю очень простой выбор

Что выбрать HDD или SSD у хостера?

У некоторых выбор посложнее: SAS или SSD

Что выбрать HDD или SSD у хостера?

А что такое SAS HDD?

Вот тут вся разница:

  • SAS HDD — это серверные диски, которые работают по протоколу SAS (дуплекс — умеют писать и читать одновременно)
  • SATA SSD — это диски, которые работают по протоколу SATA (полудуплекс — читают и пишут по очереди — как в рации «прием/передача» для примера)

Читаем статью

Интерфейсы SAS и SATA

Что выбрать HDD или SSD у хостера?

При увеличении числа дисков в массиве RAID:

  • физическая сущность диска нивелируется
  • фактическая скорость обмена начинает ограничиваться протоколом

В результате скорость обмена данными в массиве у SAS HDD может быть выше, чем у SATA SSD. Чистый маркетинг — все хотят SSD и на спрос есть предложение.

И конечно, всё еще зависит от:

  • какая версия протокола у дисков
  • в какой RAID собраны диски

Т.е. если Вам нужен сервер VDS/VPS для хостинга сайта — выбирайте SAS HDD. Это будет немного быстрее и немного дешевле варианта SATA SSD.

А если Вам надо быстро и дорого — берите NVMe — это твердотельная память с протоколом PCIe (быстрый и многопоточный).

Защищаем скрипт PHP от прямого вызова

В папке плагинов WordPress лежит замечательный файл index.php

Защищаем скрипт PHP от прямого вызова

«Молчание — золото»…

Это как раз для любителей вызвать папку «/wp-content/plugins/» напрямую.

В скриптах WordPress проверяется служебная переменная ABSPATH перед запуском

if (!defined ('ABSPATH')) exit;

При попытке выполнить скрипт вне пространства WP — на выход

А как быть с самодельным скриптом ,который запускается с Вашего сайта, но не из WP?

Для начала очевидное:

  1. Сделаем свой index.php
  2. Будем показывать его любопытным при прямом запуске

Вариант файла index.php

<?php
header($_SERVER['SERVER_PROTOCOL']." 404 Not Found");
echo 'Silence is golden';
exit;
?>

при показе файла дополнительно сообщаем боту, что ошибка 404 «файл не найден» — для разнообразия

Т.к Ваш скрипт запускается с какой-либо страницы Вашего сайта — то там должен быть рефер  с именем этой страницы. При прямом запуске — рефер будет пустой.

$backurl = $_SERVER['HTTP_REFERER'];
if (empty ($backurl)) { 
   include 'index.php';  
   exit;
}

Но это еще не все. Боты научились подделывать рефер (что бы их так просто не выгоняли), там может быть:

  • или Ваш домен mysite.ru с ошибкой вида www.mysite.ru
  • или URL адрес Вашего скрипта вида http://mysite.ru/test.php

С последним вариантом бот бился 6 часов с интервалом 1 сек… Подбирая разные варианты запуска php.

Атака шла с IP v6 — так что версия fail2ban 0.9 ничего тут не смогла сделать (поддержка IP6 только с версии 10.0).

Добавим дополнительные проверки

$backurl = $_SERVER['HTTP_REFERER'];
$domen_link = ((!empty($_SERVER['HTTPS'])) ? 'https' : 'http') . '://' . $domen;
//----------
if (empty ($backurl)) { 
   include 'index.php'; 
   exit;
}
if (mb_strpos($backurl, $domen_link)=== FALSE) { 
   include 'index.php'; 
   exit;
}
if (mb_strpos($backurl, '.php') > 0) { 
   include 'index.php'; // 
   exit;
}

где $domen_link — домен Вашего сайта с протоколом и поищем:

  • или отсутствие правильного домена в строке рефера (откуда был вызван скрипт)
  • или символы ‘.php’ в рефере

Если хотя бы одна из трех ловушек сработает — бот получит страницу index.php и 404 ошибку.

Бинго!

ВАЖНО: «символы ‘.php’ в рефере» ! 

Иногда вредные боты подменяют рефер и там вписывают название Вашего скрипта вида https://mysite.ru/script.php

А у Вас например, скрипт script.php после выполнения перезагружает страницу, откуда он был запущен https://mysite.ru

А там теперь, в рефере (бот подделал) — название Вашего же скрипта. Что произойдет? После захода такого бота сервер уйдет в цикличный вызов скрипта и ему будет нехорошо…

P.S.

Если разработчики ботов еще что придумают — допишем ловушки :)

Как заработать на рекламе на информационном сайте

Собственно никак :)

Как заработать на рекламе на информационном сайте

Есть сервисы Яндекс РСЯ и Google Adsense.

Посмотрим внимательно:

  • Яндекс принимает в свою сеть сайты с 10 000 визитов  день (Россия)
  • Google принимает всех

Цифры по Google Adsense — в среднем с сайта 500 визитов в день (15 000 в месяц) Вы получите порядка 50 долл. Чтобы хотя бы получить 500 долл. за месяц — у Вас должен быть сайт с уровнем визитов 150 000 в месяц.

Или, например,  300 000 визитов в месяц — как хочет Яндекс (10 000 * 30 дн).

Что для информационного сайта силами одного вебмастера малореально. И не забываем, что у многих установлен AdBlock Plus, который достаточно хорошо отрезает рекламные модули.

Этого хватит на оплату домена, хостинг VPS и немного на мороженое…

Хостинг VPS нужно покупать нормальный, что бы он мог обеспечить отдачу контента такому количеству желающих. В двух словах — т.к. желающих много — Вам нужна многопоточность, что обычный дешевый хостер не может обеспечить.

Читаем статью

Хостинг VPS

Особенности работы с Google Adsense

Проходим регистрацию, добавляем свой сайт, добавляем на него код — ждем подтверждения, что с сайтом система может работать.

Две основные стратегии работы — полностью автоматический режим и возможность самостоятельно добавлять код объявлений на сайт.

Как заработать на рекламе на информационном сайте

Переводим на русский «подбирать лучшие места»:

  • в текст статьи втыкается 3-5 рекламных блоков
  • в боковые панели сайта добавляется 2-3 блока
  • и вишенка — при клике по пункту меню появляется всплывающая реклама

В результате сайтом в принципе нельзя пользоваться. Забавно.

Лучше сделать свои медийные блоки и вручную их разместить на сайте:

  • перед контентом
  • после контента

Как заработать на рекламе на информационном сайте

Да, кликов будет меньше — но по крайней мере сайт будет выглядеть нормально.

ВАЖНО

Просто вставить свой созданный медийный блок на страницы AMP не сможете.

Это легко только для автоматизированных страниц. Для вставки самостоятельного медийного блока Google Adsense необходимо корректировать код. Конечно — в справке Google Adsense написано «Разместите этот фрагмент кода на AMP там, где должно показываться объявление«. А как разместить — не написано.

Читаем статью

Грамотная и максимальная монетизация AMP страниц

А еще вот так бывает после старта рекламы (т.е. уже после проверки, что сайт готов)

Как заработать на рекламе на информационном сайте

Робот считает, что на Вашем сайте бесполезный контент. При этом сам же Гугль нормально показывает сайт в выдаче….

Роботы правят миром :(

Статистика блокировок рекламы

Все помнят про существование AdBlock

Можно оценить результаты (и других блокировщиков рекламы тоже). Как пример:

  • посещаемость (просмотры страниц) сайта 10 000 в месяц
  • блоков рекламы на странице 8
  • показов блоков рекламы 30 000
  • просмотров блоков рекламы 15 000 (т.е. на видимой части экрана)

 

Легко поделить одно на другое

  • Вместо 80 000 (8 блоков на страницу) показов рекламных блоков мы и имеем 30 000, т.е. 50 0000 / 80 000 = 62% выдачи рекламы блокировщики рекламы отсекают
  • и посетитель видит в среднем 50% от показанной рекламы — т.к. часть рекламы расположена ниже и пользователь не использовал скроллинг

Т.е. по итогу посетитель страницы видит 15% от размещенной рекламы на сайте. Реально — еще меньше, так как блокировщики блокируют частично еще и счетчики Google и Яндекс. Ибо слишком много собирается информации о пользователе вместо простого подсчета страниц.

Обратная сторона — на некоторых сайтах начинают вывешивать рекламы больше, чем полезного контента. И без блокировщика на сайте ничего почитать нельзя…

Почему не получится использовать свою рекламу на сайте

Не получится — низкая релевантность объявлений. Что бы был клик со стороны посетителя:

  • объявление должно показываться в той же категории, что и текст (или по той же теме)
  • только поисковая система всё знает о посетителе (что он смотрел ранее, его интересы и прочее)

Если Вы делаете свою рекламу — то количество кликов будет на уровне 1 промилле (1/1000). Если рекламная система дает объявление — то количество кликов будет на уровне 1% (1/100).

Хоть что-то.

И вторая причина. Сейчас поисковые системы превратились в магазин по продаже рекламы. Вот пример — на поисковый запрос все позиции  на видимой части первого экрана — это реклама, а не результат поиска.

Как заработать на рекламе на информационном сайте

Поиска нет вообще :(

При попытках на своем сайте давать свою cdj. рекламу — Ваш сайт обрушат в поиске… Конкуренты не нужны.

Как заработать на рекламе на информационном сайте

Малополезный контент, избыток рекламы — почему вообще система поиска принимает такие решения за пользователей…

А рекламная система добавляет файл ads.txt, в котором есть информация — кто и как рекламирует.

Ads.txt — это текстовый файл, хранящийся в основной папке веб-сайта, который содержит список компаний, уполномоченных продавать рекламу на  сайте. IAB Tech Lab выпустила этот инструмент в мае 2017 года для решения проблемы мошенничества, подтверждая им подлинность рекламных мест.

Это официально. А по факту — это сигнал поисковым машинам, что используется именно их рекламный канал.