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

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

Пыльные будни уходящего лета

Говорят, в Ростовской области пыльных бурь, наподобие той, что бушует сейчас, не было лет 10. Но по факту, нечто подобное уже было лет 5 тому назад.

Старожилы же рассказывают, что раньше вообще само понятие пыльная буря было для Ростовской области чуждым.

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

Пыльная буря в Цимлянском районе
Пыльная буря в Цимлянском районе

В особенности, в эти дни не позавидуешь разного рода аллергикам.

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

Почему-то говорят, что ссылочное продвижение не работает, но…

оказывается работает, и ещё как. Потому, что структура сайта, которую представляет мне web-master от Яндекс, сильно подвержена влиянию внешней ссылочной массы.

Несмотря на то, что данный сайт претерпел легальный переезд в личном кабинете, новый домен был недоступен некоторое время со старым содержимым, новая структура была загружена по всем фен-шуй правилам в виде xml-sitemap, на самом сайте сделана правильная структура каталогов (аля “/”), в настройках была запрещена индексация всего лишнего, в личном кабинете всё равно в структуре сайта показаны адреса “посадочных страниц” старого сайта, существовавшего тут по этому адресу за некоторое время до.

И это касается не только Яндекса. В других популярных поисковиках ситуация похожая. И это при неработающих посадочных страницах, которые возвращают чёткое 404 на переход туда. Т.е. если бы посадочная страница была, да ещё и с нужным содержимым…

Значит ссылочная SEO работает?

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

ICQ завершает свою работу под крылом mail.ru

На сайте компании сказано, что

24 мая 2024 г. VK сфокусируется на развитии VK Мессенджера для пользователей и корпоративного сервиса на базе платформы VK WorkSpace для бизнеса. Для усиления экспертизы к командам продуктов присоединятся сотрудники ICQ. Сервис приостановит работу с 26 июня. tech.vk.com

Приостановка работы сервиса косвенно означает, что проект закроют окончательно. Так как приостановка работы – это полная недоступность для пользователей.

Не нужно было гнаться за WhatsApp и Viber. Нужно было сконцентрироваться на том, за что аську действительно любили – на протоколе OSCAR, который давал возможность использовать любой клиент обмена сообщениями. Но нет.

Ушла эпоха.

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

Цимлянский городской форум

В продолжение цимлянских городских традиций создан техномедиаресурс Цимлянский городской неофициальный форум по адресу https://cimla2.ru.

Что там есть? Это UBB-подобный форум. Для регистрации не требуется оставлять телефонных номеров и указывать свои личные данные.

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

Мой профиль на форуме. Можно писать ЛС. Читаю, отвечаю.

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

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-м у Яндекса и, наверное, на полгода-год раньше у Гугла.

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

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