Нажмите "Enter" для перехода к содержанию

Веб-сайт Бориса Моторного Записи

PhpBB3 стойко перенёс Brute-force

С популярными движками есть один минус – тебя в конечном итогде находит спам-система, которая заточена под эти популярные движки и начинает брутфорсить пароли, капчу и т.д. Причём, современные спам-системы делают это достаточно агрессивно и много.

Т.е., приложить средней руки проект на средней руки хостинге, типа моего – не составит проблемы.

Так получилось, что вновь созданный форум «Технологическая прачечная» нашла некая бот-ферма. Система статистики сервера регистрировала до миллиона запросов в сутки. В первую очередь обратил внимание на тормознутость отклика данного сайта, самого форума и рабочей вики. СР хостинга было превышено в несколько раз.

При этом, надо отдать должное, движок phpbb3 так и не был взломан, капчу не прошёл ни один злостный бот, а хостер, несмотря на “упирания” в жесткий лимит, не позволил моим проектам прилечь.

В итоге, проблему решил правилом в .htaccess Deny from xxx.xxx.xxx.xxx. Все атакующие адреса были нейтрализованы. График нагрузки ЦП снова в зелёной зоне.

Оставить комментарий

Изменение системы комментирования в блоге

В блоге небольшие нововведения.

Собственная система комментирования на сайте – это всегда излишняя нагрузка на ресурсы (в первую очередь на процессор). Ресурсов на средней руки хостинге не так уж и много. Поэтому, в своё время было решено, что лучше пусть будет ограниченный функционал какого-то из сервисов, но зато это точно не приведёт к падению ресурса по причине упирания в лимит процессорного времени или ещё чего-то.

Теперь у хостера Джино, на первый взгляд, дела с ресурсами стали обстоять заметно лучше. Связано ли это с внедрением так называемых “контейнеров” в админке, а значит пересмотре самой технологии хостинга, или может новые версии php, mysql и apache теперь работают более слаженно и оптимально… в общем и целом, сайт стал выдерживать стресс-тесты, которые раньше выдержать было ему не под силу.

А это значит, что мы можем использовать “излишек” располагаемых мощностей для обеспечения удобства читателей/пользователей, т.е. вас.

Поэтому на сайте будет использоваться хорошо зарекомендовавшая себя в прошлых моих проекта система комментирования wpDiscuz. Бесплатного функционала которой более чем хватает.

Главное достоинство этой системы в том, что она универсальна. Можно авторизоваться как по e-mail, создав локальную учётную запись в моём экземпляре WordPress, можно авторизоваться при помощи популярных социальных сетей и мессенджеров, а можно просто напросто написать своё (или любое) имя в форме комментариев, и не заморачиваться за всякие эти регистрации и персональные данные. Кроме того, разрешено анонимное комментирование. При этом все комментаторы проходят проверку reCaptcha, что гарантирует отсутствие спама.

Пользуйтесь.

комментария 2

Клеточный автомат

Занимательная попалась игра “Жизнь” или, как написано в книге с примерами кода на C++ – Эволюция.

Прилагаю отличную от учебника реализацию на C++:

#include
#include
#include using namespace std;
#define FILL_CHAR 219
#define EMPTY_CHAR 255
void print(unsigned int generation, char *print_arr) {
printf("Generation:%i\n%s\n", generation, print_arr);
}
bool equals(bool *array1, bool *array2, unsigned int n, unsigned int m) {
for (unsigned int i = 0; i < n; i++) // for (unsigned int j = 0; j < m; j++) if (array1[i * m + j] != array2[i * m + j]) return false; return true; } unsigned short inline get(bool *array, unsigned int n, unsigned int m, unsigned int x, unsigned int y) { if (x < 1 || y < 1 || x > m || y > n) return 0;
return array[(y - 1) * m + (x - 1)];
}
void process_output(bool *array1, bool *array2, char *print_arr, unsigned int n, unsigned int m) {
#pragma omp parallel for
for (__int64 i = 0; i < (__int64)n; i++) { for (unsigned int j = 0; j < m; j++) { unsigned short alive_near = get(array1, n, m, j, i) + get(array1, n, m, j, i + 1) + get(array1, n, m, j, i + 2) + get(array1, n, m, j + 1, i) + get(array1, n, m, j + 1, i + 2) + get(array1, n, m, j + 2, i) + get(array1, n, m, j + 2, i + 1) + get(array1, n, m, j + 2, i + 2); if (alive_near > 3)
{
array2[i * m + j] = false;
print_arr[i*(m + 1) + j] = EMPTY_CHAR;
}
else if (alive_near > 2)
{
array2[i * m + j] = true;
print_arr[i*(m + 1) + j] = FILL_CHAR;
}
else if (alive_near > 1)
{
array2[i * m + j] = array1[i * m + j];
print_arr[i*(m + 1) + j] = array1[i*m + j] ? FILL_CHAR : EMPTY_CHAR;
}
else {
array2[i * m + j] = false;
print_arr[i*(m + 1) + j] = EMPTY_CHAR;
}
}
print_arr[m + i*(m + 1)] = '\n';
}
print_arr[n*(m + 1) - 1] = '\0';
}
void process_no_output(bool *array1, bool *array2, unsigned int n, unsigned int m) {
#pragma omp parallel for
for (__int64 i = 0; i < (__int64)n; i++) { for (unsigned int j = 0; j < m; j++) { unsigned short alive_near = get(array1, n, m, j, i) + get(array1, n, m, j, i + 1) + get(array1, n, m, j, i + 2) + get(array1, n, m, j + 1, i) + get(array1, n, m, j + 1, i + 2) + get(array1, n, m, j + 2, i) + get(array1, n, m, j + 2, i + 1) + get(array1, n, m, j + 2, i + 2); if (alive_near > 3
{
array2[i * m + j] = false;
}
else if (alive_near > 2)
{
array2[i * m + j] = true;
}
else if (alive_near > 1)
{
array2[i * m + j] = array1[i * m + j];
}
else {
array2[i * m + j] = false;
}
}
}
}
int main(int argc, char *argv[]) {
ifstream in("in.txt");
unsigned int n;
unsigned int m;
unsigned int delay;
unsigned int max_iterations;
bool output;
in >> n >> m >> delay >> max_iterations >> output;

bool *array1 = new bool[n * m];
bool *array2 = new bool[n * m];

if (output)
{
char *print_arr = new char[n*(m + 1)];
for (unsigned int i = 0; i < n; i++) { for (unsigned int j = 0; j < m; j++) { in >> array1[i * m + j];
print_arr[i*(m + 1) + j] = array1[i*m + j] ? FILL_CHAR : EMPTY_CHAR;
}
print_arr[m + i*(m + 1)] = '\n';
}
printf_s("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
print_arr[n*(m + 1) - 1] = '\0';

print(0, print_arr);
this_thread::sleep_for(chrono::milliseconds(delay));
unsigned int generation = 0;
while (true) {

chrono::steady_clock::time_point start, end;
start = chrono::steady_clock::now();
process_output(array1, array2, print_arr, n, m);
print(++generation, print_arr);
if (equals(array1, array2, n, m) || max_iterations != 0 && generation >= max_iterations)
break;

end = chrono::steady_clock::now();
__int64 time = chrono::duration_cast(end - start).count();
if (time < delay) { this_thread::sleep_for( chrono::milliseconds(delay - time)); } bool *temp = array1; array1 = array2; array2 = temp; } } else { chrono::steady_clock::time_point start, end; start = chrono::steady_clock::now(); for (unsigned int i = 0; i < n; i++) { for (unsigned int j = 0; j < m; j++) { in >> array1[i * m + j];
}
}
unsigned int generation = 0;
while (true) {
process_no_output(array1, array2, n, m);
generation++;
if (equals(array1, array2, n, m) || max_iterations != 0 && generation >= max_iterations)
break;

bool *temp = array1;
array1 = array2;
array2 = temp;
}
end = chrono::steady_clock::now();
__int64 time = chrono::duration_cast(end - start).count();
ofstream out("out.txt");
out << "Time, milliseconds: " << time; } return 0; }

Источник кода: https://pro-prof.com/forums/topic/game_life_openmp

Оставить комментарий

Рабочие записи

Как-то меня учили ещё при приёме на работу, что весь рабочий процесс – имеется ввиду настройку параметров защит, автоматики и т.д., да и вообще, всё что не понятно – нужно записывать в рабочую тетрадь. Всегда.

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

Вести записи рабочего процесса – это очень удобно. И ещё удобнее вести эти записи в электронном виде. А ещё, удобнее, когда этот электронный вид – это какая-нибудь система управления контентом (wordpress1, joomla, mediawiki2), любая из которых достаточно защищена по современным меркам от взлома и чужого внимания.

Так, для личного использования и простоты настройки я рекомендую WordPress. Если нужна база знаний предприятия, или предполагается коллективное ведение записей относительно большой группой лиц, то лучшим выбором станет Mediawiki. Хотя, всё зависит от личных предпочтений. И блог на WordPress тоже можно сделать коллективным.

  1. Кстати, этот сайт работает на этой системе управления контентом[]
  2. Mediawiki тоже может быть настроена, как приватная wiki[]
Оставить комментарий

Dark backlinks

В этом месяце по количеству спам сообщений через форму обратной связи лидирует предложение выкинуть конкурентов из поиска за счёт огромного количества спам ссылок.

Это работает?

Насколько я могу помню, ссылки в SEO престали работать году эдак в 17-м у Яндекса и, наверное, на полгода-год раньше у Гугла.

Раз я об этом пишу – спам точно работает. А вот ссылки?

Оставить комментарий

FIDONET

Вероятно, многие из вас помнят сеть Fidonet.

Некоторые в ней состояли, некоторые читали через usenet-гейты…

Я, признаться, в этой сети никогда не состоял. Во-первых, в нашем городке достаточно мало народу. Во-вторых, понятия ночной тариф на межгород в ЮТК в то время не существовало. Поэтому внешние коммуникации были дороги (дороже интернета по картам, поэтому смысли Фидо и терялся).

Но теперь появились так называемые web-bbs, которые любому зарегистрированному пользователю позволяют быть полноценным поинтом сети Фидонет.

Я воспользовался WebBBS https://wfido.ru/.

Теперь мой фидошный адрес – 2:5023/24.4238

Пишите.

Оставить комментарий

Автоподключение к сети Wi-Fi на Windows

Предыстория

Для обеспечения безопасности данных и устройств есть внутренняя локальная сеть, так скажем, файлохранилище и IoT. Для управления из вне есть комп с Windows со специальным программным обеспечением, который используется как шлюз. Во внутреннюю локальную сеть комп смотрит через сетевую карточку  по витой паре, во внешнюю – через Wi-Fi “свисток”. Со временем стала проявляться проблема – Wi-Fi периодически отваливается, но не подключается автоматически заново. Причем, не помогает приоритизация сетей и т.д.

Решение

Необходимо сделать скрипт, который по заданному интервалу времени бы подключал Wi-Fi соединение. Для этого воспользуемся встроенным в Windows средством планировщика задач. Идём в панель управления Windows, открываем раздел Администрирование, ищем там Планировщик задач. В меню Действие выбираем пункт Создать задачу. Переходим во вкладку Триггеры. Создаём триггер с периодичностью Ежедневно. В дополнительных параметрах выберете повторять каждые 15 минут, например. Ещё можно установить параметр длительности повторения. Можно выбрать один день, можно и бесконечно. Смотрите сами. Всё равно задача будет перезапускаться каждый день. Поэтому не страшно оставить значение по умолчанию.

Во вкладке действие напишите следующее:

netsh wlan connect name=”имя_сети_wifi”

Где имя_сети_wifi – это SSID сети, к которой нужно подключаться.

Эпилог

Вероятно, проблема того, что Wi-Fi в Windows часто отключается и автоматически не переподключается – более глубока. Обычно, если во второй сети тоже есть интернет, и в настройках сетевого адаптера прописано автоматическое получение IP адреса и параметров сети, то переподключение не будет производиться, так как цель – наличие интернета на компьютере – и так достигнута. Может драйвера, может аппаратные проблемы Wi-Fi-USB адаптера. На самом деле сначала стоит озадачиться поиском брешей в безопасности второй сети. Но если же всё устраивает, то метод с постоянным выполнением скрипта переподключения – это неплохой себе метод, который будет работать.

Оставить комментарий

Правильные формулировки в эксплуатации очень важны

В инструкции по эксплуатации на уровнемер Ризур есть уточнение:

Уровнемер является средством автоматизации и не относится к средствам измерения.

И это уточнение резко снижает трудовые затраты на эксплуатацию и абсолютно никак не снижает её качество.

Оставить комментарий

error: ld returned 1 exit status в Code::blocks

При изменении структуры каталогов в проектах на C++ на домашней машине под управлением Kubuntu было замечено следующее:

  1. В IDE Codeblock проект из папки, в пути к которой будет хотя бы один символ кириллицы, нельзя скомпилировать. GCC не может получить доступ к такой папке.
  2. В Ubuntu и её производных папки типа “Рабочий стол”, “Документы” и т.д. так и называются в файловой системе, в отличии от Windows, где эти папки имеют русскоязычные название только в проводнике в преобразованном формате, а в файловой системе они имеют наименования на латинице.
  3. Догадаться об этом никак нельзя. В логгере нет ничего кроме “ld returned 1 exit status” не пишется.

При разработке на Windows такой проблемы не замечено.

Оставить комментарий