<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Anatolij Nowak - Shlakoblog]]></title><description><![CDATA[Я блоггер, у меня справка есть!]]></description><link>https://vodolaz095.ru/</link><image><url>https://vodolaz095.ru/favicon.png</url><title>Anatolij Nowak - Shlakoblog</title><link>https://vodolaz095.ru/</link></image><generator>Ghost 2.38</generator><lastBuildDate>Tue, 02 Jun 2026 12:49:35 GMT</lastBuildDate><atom:link href="https://vodolaz095.ru/author/anatolij/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Не Zабудем!]]></title><description><![CDATA[#ZаПобеду Они защищают тебя и мир. Поддержим наших парней. Они это услышат!]]></description><link>https://vodolaz095.ru/z/</link><guid isPermaLink="false">6227083aaed21400010005fd</guid><category><![CDATA[Разное]]></category><dc:creator><![CDATA[Anatolij Nowak]]></dc:creator><pubDate>Tue, 08 Mar 2022 07:41:04 GMT</pubDate><media:content url="https://vodolaz095.ru/content/images/2022/03/z.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://vodolaz095.ru/content/images/2022/03/z.jpg" alt="Не Zабудем!"><p>#ZаПобеду Они защищают тебя и мир. Поддержим наших парней. Они это услышат!</p><p>Фотография предоставлена <a href="https://t.me/rt_russian/97829">https://t.me/rt_russian/97829</a></p><p>UPD: почему я поддерживаю операцию по денацификации Украины -</p><p>Этот документ предназначен тем, у кого еще есть вопросы, зачем Россия проводит операцию, против кого и против чего. Когда будете изучать материалы преступлений, совершенных укрофашистами, вспоминайте материалы Нюрнбергского процесса и сравнивайте. А прямо сейчас эти преступления происходят по всей Украине, когда укровоенными и добробатами загоняется тяжелое вооружение в города, происходят убийства и грабежи, отстреливают  своих граждан, принимая их за диверсантов, взрывают мосты и рушат свою же инфраструктуру. При этом всем украинцам конкретно объявлено, что России  «богатства Украины» даром не нужны, она сама еще тот подарочек, от которого 8 лет мозг взрывается. В общем, читайте, делитесь, просвещайте…</p><p>(с) <a href="https://t.me/kremlinprachka/17367">https://t.me/kremlinprachka/17367</a></p><p>Перевод на Английский язык: <a href="https://t.me/ivan_arkatov/175">https://t.me/ivan_arkatov/175</a></p>]]></content:encoded></item><item><title><![CDATA[Работайте, братья!]]></title><description><![CDATA[<p>Я горжусь Россией. <br>#ZаПобеду<br><br>Фотография взята из <a href="https://t.me/rt_russian/97829?single">https://t.me/rt_russian/97829</a><br><br>UPD: почему я поддерживаю операцию по денацификации Украины - <br><br>Этот документ предназначен тем, у кого еще есть вопросы, зачем Россия проводит операцию, против кого и против чего. Когда будете изучать материалы преступлений, совершенных укрофашистами, вспоминайте материалы Нюрнбергского</p>]]></description><link>https://vodolaz095.ru/v/</link><guid isPermaLink="false">622632212292460001b986d6</guid><category><![CDATA[Разное]]></category><dc:creator><![CDATA[Anatolij Nowak]]></dc:creator><pubDate>Mon, 07 Mar 2022 16:29:47 GMT</pubDate><media:content url="https://vodolaz095.ru/content/images/2022/03/---------------.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://vodolaz095.ru/content/images/2022/03/---------------.jpg" alt="Работайте, братья!"><p>Я горжусь Россией. <br>#ZаПобеду<br><br>Фотография взята из <a href="https://t.me/rt_russian/97829?single">https://t.me/rt_russian/97829</a><br><br>UPD: почему я поддерживаю операцию по денацификации Украины - <br><br>Этот документ предназначен тем, у кого еще есть вопросы, зачем Россия проводит операцию, против кого и против чего. Когда будете изучать материалы преступлений, совершенных укрофашистами, вспоминайте материалы Нюрнбергского процесса и сравнивайте. А прямо сейчас эти преступления происходят по всей Украине, когда укровоенными и добробатами загоняется тяжелое вооружение в города, происходят убийства и грабежи, отстреливают  своих граждан, принимая их за диверсантов, взрывают мосты и рушат свою же инфраструктуру. При этом всем украинцам конкретно объявлено, что России  «богатства Украины» даром не нужны, она сама еще тот подарочек, от которого 8 лет мозг взрывается. В общем, читайте, делитесь, просвещайте…<br>(с) <a href="https://t.me/kremlinprachka/17367">https://t.me/kremlinprachka/17367</a><br><br><br>Перевод на Английский язык:<br><a href="https://t.me/ivan_arkatov/175">https://t.me/ivan_arkatov/175</a><br><br></p>]]></content:encoded></item><item><title><![CDATA[systemd - как работать с NodeJS сервисом, у которого утекает память?]]></title><description><![CDATA[В статье рассмотрен один из вариантов борьбы с утечками памяти в приложении на NodeJS, которые начинаются после нескольких часов работы]]></description><link>https://vodolaz095.ru/systemd-memleaky-nodejs/</link><guid isPermaLink="false">60327965f8d7a200018d1510</guid><category><![CDATA[javascript]]></category><category><![CDATA[linux]]></category><dc:creator><![CDATA[Anatolij Nowak]]></dc:creator><pubDate>Sun, 21 Feb 2021 15:26:23 GMT</pubDate><media:content url="https://vodolaz095.ru/content/images/2021/02/dmQ3ddLWu.png" medium="image"/><content:encoded><![CDATA[<img src="https://vodolaz095.ru/content/images/2021/02/dmQ3ddLWu.png" alt="systemd - как работать с NodeJS сервисом, у которого утекает память?"><p>Всем хороша среда выполнения Javascript NodeJS, но у неё есть три недостатка.<br>Первый недостаток - много низкокачественных NPM модулей, включая те, в которых происходят утечки памяти.<br>Второй недостаток - обычная программа требует множество модулей, и обязательно среди них будет несколько, в которых утекает память.<br>Третий недостаток - иногда утечки памяти начинаются после часов, а то и суток работы программы.</p><p><strong>Что с этим делать?</strong><br>Можно потратить много времени, разобраться, где утекает память, написать исправление к модулю и послать Pull-Request разработчикам модуля, который они скорее всего проигнорируют,<br>так как у них проблема не воспроизводится.</p><p>А можно просто перезапустить программу через несколько часов работы, когда начинают появляться утечки памяти.</p><p>Для примера, рассмотрим почтовый сервер на основе <a href="https://haraka.github.io/">https://haraka.github.io/</a>, который, после запуска потребляет 56.8 мегабайт памяти, а через несколько суток - уже 80 мегабайт.</p><p>Данный сервер запускается с помощью systemd, используя этот unit файл.</p><!--kg-card-begin: markdown--><pre><code>[Unit]
Description=Haraka inbound STMP server
After=network.target

[Service]
Type=simple

User=haraka
Group=haraka

WorkingDirectory=/opt/haraka/haraka-inbound
ExecStart=/usr/bin/npm start
Restart=always
RestartSec=1s
Environment=NODE_ENV=production

# Hardening
ProtectHome=yes
AmbientCapabilities=CAP_NET_BIND_SERVICE

[Install]
WantedBy=multi-user.target
</code></pre>
<!--kg-card-end: markdown--><p>Как его можно перезапустить, допустим, раз в час, используя systemd?<br></p><p>Для этого достаточно почитать документацию к systemd, и найти этот параметр конфигурации <a href="https://www.freedesktop.org/software/systemd/man/systemd.service.html#RuntimeMaxSec">https://www.freedesktop.org/software/systemd/man/systemd.service.html#RuntimeMaxSec</a></p><!--kg-card-begin: markdown--><p><strong>RuntimeMaxSec=</strong></p>
<p><em>Configures a maximum time for the service to run. If this is used and the service has been active for longer than the specified time it is terminated and put into a failure state. Note that this setting does not have any effect on Type=oneshot services, as they terminate immediately after activation completed. Pass &quot;infinity&quot; (the default) to configure no runtime limit.</em></p>
<!--kg-card-end: markdown--><p>То есть, задав этот параметр равным 3600, мы добьёмся того, что systemd будет автоматически останавливать, и снова запускать почтовый сервер каждый час.<br>Так как Haraka написан неожиданно хорошо для nodejs приложений, он не только быстро перезагружается, он ещё знает, как закончить все транзакции перед перезапуском, и поэтому ни одно письмо не пропадёт.</p><p>Такой unit файл был в итоге создан для почтового сервера:</p><!--kg-card-begin: markdown--><pre><code>[Unit]
Description=Haraka inbound STMP server
After=network.target

[Service]
Type=simple

User=haraka
Group=haraka

WorkingDirectory=/opt/haraka/haraka-inbound
ExecStart=/usr/bin/npm start
Restart=always
RestartSec=1s
Environment=NODE_ENV=production

# Gracefully restart service every hour to prevent memleaks
RuntimeMaxSec=3600

# Hardening
ProtectHome=yes
AmbientCapabilities=CAP_NET_BIND_SERVICE

[Install]
WantedBy=multi-user.target
</code></pre>
<!--kg-card-end: markdown--><p>Теперь почтовый сервер перезапускается раз в час, и в среднем потребляет около 60 мегабайт памяти.</p>]]></content:encoded></item><item><title><![CDATA[NodeJS и ldapJS - как авторизовать пользователя и прочитать свой профиль из базы данных  OpenLDAP?]]></title><description><![CDATA[Задача состояла в том, что пользователь вводит логин (в виде user1) и пароль в NodeJS приложении. И программа должна проверить, угадал ли пользователь пароль, а потом программа должна загрузить все данные о пользователе из базы данных OpenLDAP.]]></description><link>https://vodolaz095.ru/nodejs-openldap/</link><guid isPermaLink="false">602beafcf8d7a200018d1497</guid><category><![CDATA[javascript]]></category><category><![CDATA[linux]]></category><dc:creator><![CDATA[Anatolij Nowak]]></dc:creator><pubDate>Tue, 16 Feb 2021 16:14:53 GMT</pubDate><media:content url="https://vodolaz095.ru/content/images/2021/02/ldap_idm_integration.png" medium="image"/><content:encoded><![CDATA[<img src="https://vodolaz095.ru/content/images/2021/02/ldap_idm_integration.png" alt="NodeJS и ldapJS - как авторизовать пользователя и прочитать свой профиль из базы данных  OpenLDAP?"><p>Недавно на работе у меня было такое задание - соединить NodeJS приложение с OpenLDAP сервером, обладающем следующей структурой данных: в корне - структура  Organization Unit с профилями пользователями, доступная, для примера, по DN:</p><p> <code>ou=people,dc=vodolaz095,dc=life</code>.</p><p>И имеющая следующую струкруту:</p><!--kg-card-begin: markdown--><pre><code>
dn: ou=people,dc=vodolaz095,dc=life
objectclass: organizationalUnit
ou: people

</code></pre>
<!--kg-card-end: markdown--><p>В этой структуре - уже были профили пользователей - например, <code>uid=user1,ou=people,dc=vodolaz095,dc=life</code>, <code>uid=user2,ou=people,dc=vodolaz095,dc=life</code> и т.д.<br></p><p>Аккаунты пользователей принадлежали к типам <code>posixAccount</code>, <code>inetOrgPerson</code>,<code>organizationalPerson</code>,<code>person</code>.</p><p>Аккаунты пользователей выглядели примерно вот так:</p><!--kg-card-begin: markdown--><pre><code>dn: uid=user1,ou=people,dc=vodolaz095,dc=life
cn: Jane Doe
gidnumber: 1000
givenname:  Jane
homedirectory: /home/janedoe
initials: JS
loginshell: /bin/bash
objectclass: posixAccount
objectclass: inetOrgPerson
objectclass: organizationalPerson
objectclass: person
mail: user1@vodolaz095.life
sn: Doe
uid: user1
uidnumber: 1002
userpassword: {SSHA}HF3O9bpD+/a5iswMxRCwBgboZgV2Mkpp
</code></pre>
<!--kg-card-end: markdown--><p>При этом для каждого пользователя был задан пароль.</p><p>Задача состояла в том, что пользователь вводит логин (в виде <code>user1</code>) и пароль в NodeJS приложении. И программа должна проверить, угадал ли пользователь пароль, а потом программа должна загрузить все данные о пользователе из базы данных OpenLDAP.</p><p>Сначала я попробовал данный метод авторизации, который, к сожалению, требует наличия пользователя <code>readonly</code> с полным доступом на чтение ко всей базе данных, что, по моему, не очень безопасно - так как данный пользователь может прочитать все данные, включая те, которые могут составлять коммерческую или же медицинскую тайну. Также пароль пользователя <code>readonly</code> может изменится, и приложение перестанет работать.</p><p>Для работы по протоколу openLDAP я использовал следующую NodeJS библиотеку - <a href="https://www.npmjs.com/package/ldapjs">https://www.npmjs.com/package/ldapjs</a><br>Минимальный работающий образец исходного кода представлен тут:</p><!--kg-card-begin: markdown--><pre><code>'use strict';

const ldap = require('ldapjs');

const ldapClient = ldap.createClient({
  url: 'ldap://127.0.0.1:389'
});

const username = 'cn=readonly,dc=vodolaz095,dc=life';
const password = 'readonly';

ldapClient.bind(
  username,
  password,
  function (error) {
    if (error) {
      throw error;
    }
    console.log('bind performed');

    ldapClient.search('ou=people,dc=vodolaz095,dc=life', {
      filter: `(uid=vodolaz095)`,
      scope: 'one',
      attributes: ['uid', 'dn', 'cn', 'mail']
    }, function (error, res) {
      if (error) {
        throw error;
      }
      res.on('searchEntry', function (data) {
        // console.log('Data found', data);
        console.log('Data object', JSON.stringify(data.object, null, 2));
      });
      res.once('error', function(error){
        throw error;
      });
      res.once('end', function () {
        console.log('Completed');
        process.exit(0)
      });
    });
  }
);
</code></pre>
<!--kg-card-end: markdown--><p>Как видно из кода, мы сначала "биндимся" к базе данных как пользователь <code>readonly</code> с DN <code>cn=readonly,dc=vodolaz095,dc=life</code>, потом ищем пользователя в<br>коллекции <code>ou=people,dc=vodolaz095,dc=life</code> по фильтру <code>(uid=vodolaz095)</code>, и если мы его нашли, то можно попробывать "забиндиться" как этот пользователь к базе данных, тем самым проверив пароль, подходит ли он.</p><!--kg-card-begin: markdown--><pre><code>'use strict';

const ldap = require('ldapjs');

const ldapClient = ldap.createClient({
  url: 'ldap://127.0.0.1:389'
});

const username = 'uid=vodolaz095,ou=people,dc=vodolaz095,dc=life';
const password = 'superSecretPasswordOfVodolaz095!';

ldapClient.bind(
  username,
  password,
  function (error) {
    if (error) {
      throw error;
    }
    console.log('пароль подошёл, пользователь vodolaz095 авторизирован!');
});
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p><strong>Можно ли как то упростить данную процедуру?</strong></p>
<p>Возможно ли не использовать пользователя <code>readonly</code>?</p>
<p>Можно ли минимизировать число запросов данных к базе данных ldap?</p>
<p>Ответ:</p>
<p><strong>Да, можно</strong></p>
<p>И сейчас я расскажу, как.<br>
Оказывается, большинство openLDAP серверов позволяют авторизоваться (&quot;забиндиться&quot;) как искомый пользователь, и даже получить его профиль.</p>
<p>Рассмотрим данный код:</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><pre><code>'use strict';

const ldap = require('ldapjs');

const ldapClient = ldap.createClient({
  url: 'ldap://127.0.0.1:389'
});


const username = 'uid=vodolaz095,ou=people,dc=vodolaz095,dc=life'
const password = 'thisIsVerySecureSecretPassword';


ldapClient.bind(
  username,
  password,
  function (error) {
    if (error) {
      throw error;
    }
    console.log('bind performed');

    ldapClient.search('uid=vodolaz095,ou=people,dc=vodolaz095,dc=life', { 
      scope: 'base', // important
      attributes: ['uid', 'dn', 'cn', 'mail']
    }, function (error, res) {
      if (error) {
        throw error;
      }
      res.on('searchEntry', function (data) {
        // console.log('Data found', data);
        console.log('Data object', JSON.stringify(data.object, null, 2));
      });
      res.once('error', function (error){
        throw error;
      });
      res.once('end', function () {
        console.log('All passed');
        process.exit(0);
      });
    });
  }
);
</code></pre>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p>С помощью этого кода мы напрямую пытаемся &quot;забиндиться&quot; к базе данных ldap как ограниченный пользователь, используя функцию<br>
<code>ldapClient.bind(username,  password, function(error){....})</code>.</p>
<p>Если &quot;забиндиться&quot; получилось, то это означает, что пароль подошёл. Теперь надо получить профиль пользователя, и по умолчанию, все пользователи ldap имеют права на чтение своего собственного профиля.<br>
По крайней мере, так работает в контейнеризированной сборке openLDAP из <a href="https://github.com/osixia/docker-openldap">https://github.com/osixia/docker-openldap</a></p>
<p>После того, как мы забиндились, мы можем попробывать найти свой собственный профиль. Это можно сделать с помощью данной функции:</p>
<pre><code>    ldapClient.search('uid=vodolaz095,ou=people,dc=vodolaz095,dc=life', { 
      scope: 'base', 
      attributes: ['uid', 'dn', 'cn', 'mail']
    }, function (error, res) {....})
</code></pre>
<p>В итоге, мы получаем всю информацию из профиля пользователя в базе данных openldap, при этом приложение использует только пароль, который предоставил сам пользователь, доступ на чтение ко всей базе данных не нужен.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Как надо программировать на языке Golang]]></title><description><![CDATA[В глубинах исходных кодов одного из проприентарных продуктов, который я пилю по субботам...]]></description><link>https://vodolaz095.ru/how-to-program-on-go/</link><guid isPermaLink="false">5e521015421549000104be6f</guid><category><![CDATA[golang]]></category><category><![CDATA[Разное]]></category><dc:creator><![CDATA[Anatolij Nowak]]></dc:creator><pubDate>Sun, 23 Feb 2020 05:47:04 GMT</pubDate><media:content url="https://vodolaz095.ru/content/images/2020/02/e4CsWqdOQ.png" medium="image"/><content:encoded><![CDATA[<img src="https://vodolaz095.ru/content/images/2020/02/e4CsWqdOQ.png" alt="Как надо программировать на языке Golang"><p>В глубинах исходных кодов одного из проприентарных продуктов, который я пилю по субботам, я нашёл упоминение Советского бога программирования <a href="https://vodolaz095.ru/kurov/">А.В. Курова</a>, который воспитал не одно поколение одарённых (не только в общепринятом смысле) программистов.<br></p><!--kg-card-begin: markdown--><pre><code class="language-go">
func TestWorkspace_WriteFile(t *testing.T) {
	w, err := GetWorkSpaceByID(workspaceIDForTests)
	if err != nil {
		t.Error(err)
	}
	assert.Equal(t, &quot;nobody&quot;, w.User, &quot;wrong user&quot;)
	assert.Equal(t, &quot;unknown&quot;, w.Company, &quot;wrong company&quot;)
	assert.Equal(t, config.Config.Hostname, w.Server, &quot;wrong server&quot;)
	assert.Equal(t, 0, w.DiskUsage, &quot;wrong disk usage&quot;)
	assert.Equal(t, 0, w.NumberOfFiles, &quot;wrong number of files&quot;)
	assert.Equal(t, &quot;0 bytes&quot;, w.HumanizeDiskUsage(), &quot;wrong disk usage in human readable form&quot;)

	assert.Equal(t,
		fmt.Sprintf(&quot;%s%s&quot;, config.Config.Path.Workspace, workspaceIDForTests),
		w.GetDirectoryPath(),
		&quot;wrong directory path&quot;,
	)
	assert.FileExists(t, w.GetMetadataPath(), &quot;metadata file not exists&quot;)
	assert.True(t, w.DoBelongsToUser(&quot;nobody&quot;, &quot;unknown&quot;), &quot;not belongs to user&quot;)
	assert.False(t, w.DoBelongsToUser(&quot;somebody&quot;, &quot;unknown&quot;), &quot;belongs to wrong user&quot;)
	assert.False(t, w.DoBelongsToUser(&quot;nobody&quot;, &quot;Microsoft&quot;), &quot;belongs to wrong user&quot;)
	assert.False(t, w.DoBelongsToUser(&quot;somebody&quot;, &quot;Microsoft&quot;), &quot;belongs to wrong user&quot;)
	err = w.WriteFile(&quot;test.txt&quot;, []byte(&quot;this is test.txt file with some data in it. Как говорил мой преподаватель программирования Андрей Владимирович Куров, писать код надо так, чтобы моча ухом шла!&quot;))
	if err != nil {
		t.Error(err)
	}
}


</code></pre>
<!--kg-card-end: markdown--><blockquote>this is test.txt file with some data in it. Как говорил мой преподаватель программирования Андрей Владимирович Куров, писать код надо так, чтобы моча ухом шла!</blockquote><p>В общем:</p><blockquote>НЕПЫА́ЙТЕ АДУ́ЙТЕ!</blockquote><p>(в переводе на Русский язык - "не проверяйте, а думайте")</p>]]></content:encoded></item><item><title><![CDATA[Как установить Centos 8 NetInstall если вылезает ошибка "Error setting up base repository"]]></title><description><![CDATA[Чтобы исправить данную ошибку, образу надо сообщить путь до совместимого хранилища зависимостей. Проще всего сделать это так: во вкладке "Installation source" задать источник https://mirror.yandex.ru/centos/8.0.1905/BaseOS/x86_64/os/ ( с протоколом HTTPS) и типом "repository URL".]]></description><link>https://vodolaz095.ru/centos8_fix_error_setting_up_base_repository/</link><guid isPermaLink="false">5e08ad87f1f6210001988bd6</guid><category><![CDATA[linux]]></category><dc:creator><![CDATA[Anatolij Nowak]]></dc:creator><pubDate>Sun, 29 Dec 2019 13:52:27 GMT</pubDate><content:encoded><![CDATA[<p>В интернете широко распространён дистрибутив Centos8, который можно легално загрузить на Ваш компьютер отсюда: <a href="https://www.centos.org/download/">https://www.centos.org/download/</a></p><p>В частности, для России лучше всего использовать хранилище яндекса:  <a href="https://mirror.yandex.ru/centos/8.0.1905/isos/x86_64/">https://mirror.yandex.ru/centos/8.0.1905/isos/x86_64/</a><br></p><p>На момент написание статьи в хранилище Яндекса присутсвует минимальный ISO образ версии 8.0.1905  (<a href="https://mirror.yandex.ru/centos/8.0.1905/isos/x86_64/CentOS-8-x86_64-1905-boot.iso">https://mirror.yandex.ru/centos/8.0.1905/isos/x86_64/CentOS-8-x86_64-1905-boot.iso</a>),<br>который при инсталяции загружает нужные зависимости из локальной сети или из сети Интернет.</p><p><br>В данном образа есть неприятная, но легко устранимая ошибка - 0016456: CentOS 8 Netinstall broken: "Error setting up base repository", которую похоже скоро решат - <a href="https://bugs.centos.org/view.php?id=16456">https://bugs.centos.org/view.php?id=16456</a>. Но, на момент написания статьи,  ошибка ещё не исправлена, и образ не может загрузить требуемые зависимости для установки системы.<br></p><p>Проявляется эта ошибка так:</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://vodolaz095.ru/content/images/2020/02/centos8_bug.png" class="kg-image" alt="Ошибка - Installation Source Error setting base repository"></figure><!--kg-card-end: image--><p>Чтобы исправить данную ошибку, образу надо сообщить путь до совместимого хранилища зависимостей.<br>Проще всего сделать это так: во вкладке "Installation source" задать<br>источник <a href="https://mirror.yandex.ru/centos/8.0.1905/BaseOS/x86_64/os/">https://mirror.yandex.ru/centos/8.0.1905/BaseOS/x86_64/os/</a> ( с протоколом HTTPS) и типом "repository URL".</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://vodolaz095.ru/content/images/2020/02/centos8_fix.png" class="kg-image"><figcaption>Задаём путь до репозитория</figcaption></figure><!--kg-card-end: image--><p>И установку можно продолжить как обычно.</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://vodolaz095.ru/content/images/2020/02/centos8_install.png" class="kg-image"><figcaption>Продолжение установки Centos7</figcaption></figure><!--kg-card-end: image--><p>Поздравляю всех с наступающим Новым, 2020 годом и окончанием десятилетия.</p>]]></content:encoded></item><item><title><![CDATA[Как бороться с ошибкой read ECONNRESET в Ghost]]></title><description><![CDATA[Иногда мой блог вместо страницы выдавал ошибку 500, с отображением SQL запроса, который не прошёл. select count(distinct posts.id) as aggregate 
from posts 
where (posts.status = 'published' and posts.page = false)]]></description><link>https://vodolaz095.ru/fix-econnreset-in-ghost/</link><guid isPermaLink="false">5d04d10541f2e50001b0f807</guid><category><![CDATA[javascript]]></category><dc:creator><![CDATA[Anatolij Nowak]]></dc:creator><pubDate>Sun, 16 Jun 2019 12:22:55 GMT</pubDate><media:content url="https://vodolaz095.ru/content/images/2021/02/error500.png" medium="image"/><content:encoded><![CDATA[<img src="https://vodolaz095.ru/content/images/2021/02/error500.png" alt="Как бороться с ошибкой read ECONNRESET в Ghost"><p>Иногда мой блог вместо страницы выдавал ошибку 500, с отображением SQL запроса, который не прошёл. </p><p>Это выглядело так:</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://vodolaz095.ru/content/images/2019/06/oAwqHVMxM-1.png" class="kg-image" alt="Как бороться с ошибкой read ECONNRESET в Ghost"><figcaption>Ошибка потери соединения с базой данных</figcaption></figure><!--kg-card-end: image--><!--kg-card-begin: markdown--><p>Код ошибки мог меняться в замисимости от страницы, но почти всегда это был SQL запрос вроде такого</p>
<pre><code class="language-sql">select count(distinct posts.id) as aggregate 
from posts 
where (posts.status = 'published' and posts.page = false)
</code></pre>
<p>Главное, что в нём всегда встречалось <code>read ECONNRESET</code>.</p>
<!--kg-card-end: markdown--><p>Причина неполадок состояла в том, что сервер базы данных закрывал соединение с блог платформой, так как оно, по мнению сервера, не использовалось. </p><p>Данная неполадка чинится отправкой этих запросов на MariaDB сервер через консоль:</p><!--kg-card-begin: markdown--><pre><code class="language-sql">
SET GLOBAL connect_timeout=28800;
SET GLOBAL wait_timeout=28800;
SET GLOBAL interactive_timeout=28800;

</code></pre>
<!--kg-card-end: markdown--><p>Эти переменные задают критерии, используемые сервером для того, чтобы определить, какие соединения считаются неиспользуемыми, и их можно разорвать. Я поставил значение в 8 часов (28800 секунд), и разрывы соединения пропали.</p><p>Подробнее о всех системных переменных базы данных <a href="https://mariadb.com/kb/ru/library/server-system-variables/">MariaDB</a>.</p><p><strong>Обновление 1.</strong></p><p>При перезагрузке сервера с базой данных, глобальные переменные к сожалению сбрасываются. Одно из возможных решений проблемы ошибки с разрывом соединения было описано в этом комментарии</p><p><a href="https://github.com/TryGhost/Ghost/issues/9739#issuecomment-406240883">https://github.com/TryGhost/Ghost/issues/9739#issuecomment-406240883</a></p><p>Пользователь с ником <em>Toub</em><strong> </strong>посоветовал переодически загружать главную страницу блога, чтобы платформа посылала запросы к базе данных, и соединение восстанавливалось.</p><p>При этом техническая поддержка платформы Ghost показала особенную клиентоориентированность, и я понял, что они ничем помочь не могут и не хотят, по их мнению, официальные образы докера с не правильно работающим соединением с базой данных это нормально.</p><p>Поэтому, проблему я начал решать сам.</p><p>Я написал такой скрипт на nodejs, который открывает главную страницу блога до тех пор, пока не будет возвращаться ответ  со статусом 200 - то есть блог работает в штатном режиме.</p><!--kg-card-begin: markdown--><pre><code class="language-js">
'use strict';

const async = require('async'); // tested with  version &gt;=2.6.2
const request = require('request'); //  tested with version &gt;=2.88.0

let i = 0;
async.doWhilst(
  function (callback) {
    request('https://blog.vodolaz095.life', function (error, response) {
      if (error) {
        return callback(error);
      }
      i += 1;
      console.log('Test %s. Status code - %s', i, response.statusCode); // eslint-disable-line
      callback(null, response.statusCode);
    });
  },
  function (statusCode) {
    return statusCode !== 200;
  },
  function (error) {
    if (error) {
      throw error;
    }
    console.log('Blog awaken!');  // eslint-disable-line
    process.exit(0);
  }
);

</code></pre>
<!--kg-card-end: markdown--><p>И поставил его в крон на запуск каждую минуту.</p><!--kg-card-begin: markdown--><pre><code>* * * * * cd /home/vodolaz095/ &amp;&amp; node /home/vodolaz095/wakeBlog.js   
</code></pre>
<!--kg-card-end: markdown--><p>Посмотрим, что из этого получится...</p>]]></content:encoded></item><item><title><![CDATA[Куров]]></title><description><![CDATA[ПРО́СТО Я АМГЫ́Л Просто я Вам говорил. Крайне неоднозначное выражение. По неопытности можно принять за оправдание.]]></description><link>https://vodolaz095.ru/kurov/</link><guid isPermaLink="false">5cfbf38753958b0001f8c93f</guid><category><![CDATA[Разное]]></category><dc:creator><![CDATA[Anatolij Nowak]]></dc:creator><pubDate>Sat, 08 Jun 2019 17:45:22 GMT</pubDate><media:content url="https://vodolaz095.ru/content/images/2020/02/-----.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://vodolaz095.ru/content/images/2020/02/-----.jpg" alt="Куров"><p>Андрей Владимирович Куров - преподаватель из МГТУ имени Баумана с очень необычной манерой говорить.</p><p>Далее - попытка сделать перевод того, что он говорит.</p><p>1.1. ЯГУ́<br>1.2. Я ЖГУ Я говорю / Я же говорю. Обычно используется в начале или конце предложения, иногда не несёт смысловой нагрузки.<br>2. Я ГЫЛ Я говорил. Обычно используется в середине предложения, иногда не несёт смысловой нагрузки.<br>3.1. ЮРИВТИ́ФЫЧЬ.<br>3.2. ЮРДИ́ЧЬ.<br>3.3. ЕВТИИ́ЧЬ.<br>3.4. ЕБВЗДИ́ЧЬ.<br>3.5. БВЗБВЗДИ́ЧЬ.<br>3.6. *****ДИ́ЧЬ. Преподаватель кафедры ИУ-7 Алексеев Юрий Евтихович. Варианты приведены в порядке возрастания эмоциональности и уменьшения умственной активности. Последний вариант не поддаётся расшифровке.<br>4. КЛЫАТУ́РА Клавиатура. Устройство ручного ввода информации в персональный компьютер.<br>5. КАА́́ Когда. Употребляется в начале предложения, иногда не несёт смысловой нагрузки.<br>6. ДА Когда. Употребляется в конце предложения, иногда не несёт смысловой нагрузки. Бывает частью составных выражений вроде НУДА́, означающего "ну когда".<br>7. В ОБЩА́ГЕ Вообще говоря. Далее обычно следует очередь гласных звуков, количество которых свидетельствует об уровне умственного развития говорящего<br>8. ПАССА́ЛЬ Pascal. Компилируемый язык программирования, изобретённый Никлаусом Виртом в 1970-м году. Используется в IDE Delphi. Изучается по программе первого курса кафедры ИУ-4 МГТУ имени Н.Э. Баумана.<br>9. ЙЕНТ End. Оператор конца блока в языке Pascal.<br>10. ВЫ́НЮ! Выгоню! Восклицание, применяемое в состоянии эмоционального возбуждения. Часто применяется не к месту.<br>11. CЪЕ́МА Схема. Довольно умное слово.<br>12. АЛАРИ́ТУМ Алгоритм. Последовательность действий, направленная на получение необходимого результата.<br>13. ПРОАГАИ́РОАНИЕ Программирование. Процесс создания исходного кода программ, компилируемого в итоговое приложение.<br>14. ПШВО! Пошёл вон! Обычно следует через несколько минут после слова, указанного в пункте №10.<br>15. ЩО Ещё. Чаще всего встречается в словосочетании ШОЩО, обозначающем "что ещё".<br>16. АА́ЧЕМ? А зачем? Обычно используется в процессе завала студентов на лабораторных работах или экзаменах.<br>17. ИЗТОШО́ Из того, что. Крайне интеллектуальное выражение.<br>18.1 И́ЦА.<br>18.2 КАКЫ́ЦА.<br>18.3 НЕГЫ́ЦА. Говорится, как говорится, не говорится. Вставляется в предложение тогда, когда мозг говорящего не может догнать до смысла говорённого.<br>19. АЧЁ́ЭТО ТАО́Е? А что это такое? Обычно используется в процессе завала студентов на лабораторных работах или экзаменах.<br>20. ВЫ́ССИ ЗАО́БКУ! Вынеси за скобку! Применяется тогда, когда преподаватель не хочет принимать лабораторную работу студента в настоящий момент.<br>21. НЕПЫА́ЙТЕ АДУ́ЙТЕ! Не проверяйте, а думайте! Применяется в случае длительного дебага лабораторной работы студентом.<br>22. АДЕ́ ТЫЭ́ТО ПОЧИТА́Л? А где ты это прочитал? Обычно используется в процессе завала студентов на лабораторных работах или экзаменах.<br>23. ДУБА́ЙЕР. Дебаггер. Средство отладки программ в IDE.<br>24. РИИТАТИ́Л. Repeat until. Оператор цикла с постусловием в языке Pascal.<br>25.1 ПАГАА́МА.<br>25.2 ПАПАГАА́МА. Программа, подпрограмма.<br>26. СОСАМА́ИЦЫ. Свойства матрицы. Употребляется чаще всего там, где матрицы нету вовсе.<br>27.1 АОМЕ́РНЫЙ.<br>27.2 ДУМЕ́РНЫЙ. Одномерный, Двумерный. Обычно используется применительно к массивам.<br>28. ГАДЕО́Б. Гардероб. С наибольшей частотой произносится в первые 15 минут пары.<br>29. ССАСА́Л. Сказал. Одно из немногих слов, всегда употребляемых там, где надо.<br>30. СУКИВШКА́Ф! Сумки убрать в шкаф. Обычно находится в одном потоке слов вместе со словом, указанным в пункте №28.<br>31. НАЧТ. Значит. Чаще всего обозначает начало очередного потока слов.<br>32. РАССО́ИМСЯ. Расходимся. Последняя фраза на паре.<br>33. ФУРЫ́ЧЬ. For each. Процедура языка Pascal для работы с множествами.<br>34. КАДВА́ТАЯ. Квадратная. Чаще всего используется примениельно к матрице.<br>35. БЫКА́ТАЯ. B[k]. Обычно - про элемент множества.<br>36. ЛОХМА́ТАЯ МА́ИЦА. Лохматая матрица. Матрица, у которой при выводе на экран в виде таблицы получается неровный правый край.<br>37. ДИНОЗА́УР ПОАГАИ́РОАНИЯ. Динозавр программирования. Программист с опытом работы более 30 лет.<br>38. СТАРИЧКИ́. Преподавательский состав МГТУ им. Н. Э. Баумана.<br>39. БОРМО́ЧУТ. Преподают. Обычно используется применительно к СТАРИЧКАМ.<br>40. ДВО́ИШНИК. Студент кафедры ИУ-4. Надо воспринимать не как характеристику, а как ссылку.<br>41. КАСТА́ТА. Константа.<br>42. ПЬЕЭ́ННАЯ. Переменная.<br>43. ВАРЕ́БЕЛ. Variable.<br>44. МУ́ЙЕСТВО. Множество. Тип данных, включающий в себя несколько однотипных элементов<br>45. НУА́ЙТЕ! Ну давайте! Проявление снисходительности и/или доброй воли и/или побуждение к действию.<br>46. МЕТАБОЩА́. Метод борща. Вольное переименование пузырькового метода сортировки.<br>47. КАКА́Т. Concat. Функция языка Pascal для строковых переменных.<br>48.1 САКА́<br>48.2 ПАСАКА.́ Строка, подстрока. Тип данных в языке Pascal.<br>49. РИСА́ЛЬТ Result. Псевдопеременная для записи результата работы функции в языке Pascal.<br>50. КА́ЧАСТЕ В качестве. Очень высокоинтеллектуальное выражение.<br>51. ПРО́СТО Я АМГЫ́Л Просто я Вам говорил. Крайне неоднозначное выражение. По неопытности можно принять за оправдание.</p><!--kg-card-begin: image--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://vodolaz095.ru/content/images/2020/02/------2.jpg" class="kg-image" alt="Куров"><figcaption>Андрей Владимирович Куров - фото из энтих ваших инторнетов.</figcaption></figure><!--kg-card-end: image-->]]></content:encoded></item><item><title><![CDATA[Документация о Javascript]]></title><description><![CDATA[Полезные ссылки на документацию по языку программирования Javascript ]]></description><link>https://vodolaz095.ru/javascript-links/</link><guid isPermaLink="false">5cfaed95bf075e000167e151</guid><category><![CDATA[javascript]]></category><dc:creator><![CDATA[Anatolij Nowak]]></dc:creator><pubDate>Fri, 07 Jun 2019 23:06:49 GMT</pubDate><content:encoded><![CDATA[<p>Полезные ссылки на документацию по языку программирования Javascript:</p><ol><li><a href="https://developer.mozilla.org/ru/">https://developer.mozilla.org/ru/</a></li><li>https://javascript.ru</li><li><a href="https://nodejs.org/api/">https://nodejs.org/api/</a></li></ol>]]></content:encoded></item><item><title><![CDATA[Хорошие книги по Go]]></title><description><![CDATA[Список ссылок и литературы о языке Go]]></description><link>https://vodolaz095.ru/golang-books/</link><guid isPermaLink="false">5cfae78cbf075e000167e133</guid><category><![CDATA[golang]]></category><dc:creator><![CDATA[Anatolij Nowak]]></dc:creator><pubDate>Fri, 07 Jun 2019 22:43:33 GMT</pubDate><content:encoded><![CDATA[<p>Список ссылок и литературы о языке Go.</p><p><strong>На Английском языке</strong></p><ol><li><a href="https://golang.org/">https://golang.org/</a> - официальное руководство</li><li><a href="https://www.golang-book.com/books/intro">https://www.golang-book.com/books/intro</a> - книга для начинающих от Калеба Доксли.</li><li><a href="https://gobyexample.com/">https://gobyexample.com/</a></li></ol><p><strong>На Русском языке</strong></p><ol><li><a href="http://golang-book.ru/">http://golang-book.ru/</a> - перевод книги Калеба Доксли</li><li><a href="https://www.ozon.ru/context/detail/id/148161581/">https://www.ozon.ru/context/detail/id/148161581/</a> - книга "Язык программирования" Go от Брайана Кернигана и Алана Донована. Торренты ищите сами, книга стоит того, чтобы её купить.</li></ol><p></p>]]></content:encoded></item><item><title><![CDATA[Десертное мясо с мёдом]]></title><description><![CDATA[Мясо по рецепту наших предков.]]></description><link>https://vodolaz095.ru/holymeat/</link><guid isPermaLink="false">5cfada34bf075e000167e0de</guid><category><![CDATA[мясо]]></category><dc:creator><![CDATA[Anatolij Nowak]]></dc:creator><pubDate>Fri, 07 Jun 2019 21:47:19 GMT</pubDate><content:encoded><![CDATA[<p></p><p><strong>Ингредиенты</strong>:<br>1. Масло подсолнечное рафинированное 3.5 столовых ложки. 	<br>2. Мёд 1 столовая ложка<br>3. Перец чёрный молотый 2 щепотки	<br>4. Мякоть "свинины"  400 г<br>5. Половина чайной ложки соли<br>6. Полторы чайных ложки столового уксуса</p><p><strong>Приготовление:</strong></p><ol><li>Мясо нарезать на кубики по 1 см</li><li>Мариновать 30 минут в холодильнике</li><li>Варить в кастрюле 50 минут, сначала на сильном огне, чтобы корочка образовалась, а потом на слабом огне, чтобы пропеклось</li></ol>]]></content:encoded></item></channel></rss>