<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Alfmaster</title><generator>teletype.in</generator><description><![CDATA[Alfmaster]]></description><image><url>https://teletype.in/files/71/1f/711fcad0-2eb1-4048-b653-0eb45f77a076.jpeg</url><title>Alfmaster</title><link>https://blog.alfmaster.ru/</link></image><link>https://blog.alfmaster.ru/?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alfmaster</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/alfmaster?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/alfmaster?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Thu, 07 May 2026 11:39:48 GMT</pubDate><lastBuildDate>Thu, 07 May 2026 11:39:48 GMT</lastBuildDate><item><guid isPermaLink="true">https://blog.alfmaster.ru/ssh-tunnel</guid><link>https://blog.alfmaster.ru/ssh-tunnel?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alfmaster</link><comments>https://blog.alfmaster.ru/ssh-tunnel?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alfmaster#comments</comments><dc:creator>alfmaster</dc:creator><title>Как создать ssh-туннель в MacOS:</title><pubDate>Fri, 02 Dec 2022 05:23:18 GMT</pubDate><description><![CDATA[Зачем это нужно: ]]></description><content:encoded><![CDATA[
  <p id="TzIK">Зачем это нужно: </p>
  <ol id="6E5p">
    <li id="ABb6">Например, у нас есть удаленный сервер, с которого доступна некая база данных, которая дает возможность подключиться к себе только с этого удаленного сервера. А вы хотите к ней подключиться со своей локальной машины - вам поможет SSH-туннель, который как бы виртуально переместит вас сразу на удаленный сервер</li>
  </ol>
  <p id="Gq0f"></p>
  <p id="uo6o">Как создать туннель. Открываем Terminal и пишем: </p>
  <pre id="9Dir">ssh -N -D 9999 {login}@{server_addr}</pre>
  <p id="E2Ne">Где: </p>
  <p id="7sR9"><strong>{login}</strong> - имя пользователя на удаленном сервере<br /><strong>{server_addr}</strong> - IP адрес или доменное имя удаленного сервера<br /><strong>-N</strong> - параметр, отвечающий за то, чтобы команды не транслировались на удалённый сервер<br /><strong>-D 9999</strong> - параметр, указывающий, через какой адрес/порт пробрасывать данные с локального компьютера. То есть если удаленный </p>
  <p id="zjOE"></p>
  <p id="XjmV">А еще туннель можно сделать вот так: </p>
  <p id="YY56">Если вводим такую команду, то создается SSH туннель, который будет пробрасывать с локального компьютера порт {local_port} на {external_ip}:{external_port} как будто мы уже находимся на удаленном сервере {host}</p>
  <pre id="AFhb">ssh {user}@{host} -p{port} -L {local_port}:{external_ip}:{external_port}</pre>
  <p id="hyQa">Где: </p>
  <p id="jyZv"><strong>{user}</strong> - имя пользователя на удаленном сервере<br /><strong>{host}</strong> - адрес удаленного хоста<br /><strong>{port}</strong> - порт на удаленном хосте, нужно указывать только если порт отличается от 22<br /><strong>{local_port}</strong> - порт на локальной машине<br /><strong>{external_ip}</strong> - IP, куда надо прокинуть трафик на внешней машине<br /><strong>{external_port}</strong> - порт на внешней машине</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.alfmaster.ru/shorts-sendmail</guid><link>https://blog.alfmaster.ru/shorts-sendmail?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alfmaster</link><comments>https://blog.alfmaster.ru/shorts-sendmail?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alfmaster#comments</comments><dc:creator>alfmaster</dc:creator><title>SHORT: Настройка sendmail</title><pubDate>Mon, 18 Jul 2022 16:42:31 GMT</pubDate><category>Шорты</category><description><![CDATA[Всю настройку надо делать из под sudo: ]]></description><content:encoded><![CDATA[
  <p id="wxba">Всю настройку надо делать из под sudo: </p>
  <pre id="eNBv">sudo -i</pre>
  <p id="yhGG"></p>
  <p id="43Lh">Сначала устанавливаем sendmail: </p>
  <pre id="z1ew">apt-get install sendmail</pre>
  <p id="vitk"></p>
  <p id="DUsp">Потом запускаем конфигурацию: </p>
  <pre id="2AcY">sendmailconfig</pre>
  <p id="Pcma">на все вопросы отвечаем Y</p>
  <p id="Ewc7"></p>
  <p id="98xZ">Все настройки сохраняются тут: </p>
  <pre id="W302">/etc/mail.sendmail.conf
/etc/cron.d/sendmail
/etc/mail/sendmail.mc</pre>
  <p id="vc7t"></p>
  <p id="Wk3D">В файле php.ini надо включить использование sendmail: </p>
  <pre id="cljp">sendmail_path =  /usr/sbin/sendmail -t -i</pre>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.alfmaster.ru/ubuntu-disk</guid><link>https://blog.alfmaster.ru/ubuntu-disk?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alfmaster</link><comments>https://blog.alfmaster.ru/ubuntu-disk?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alfmaster#comments</comments><dc:creator>alfmaster</dc:creator><title>Ubuntu. Работа с дисками</title><pubDate>Tue, 31 May 2022 16:55:47 GMT</pubDate><description><![CDATA[Диски бывают больше 2Tb, поэтому лучше использовать parted, а не fdisk. То есть если вы видите инструкцию c fdisk, то она подходит только для дисков до 2Tb]]></description><content:encoded><![CDATA[
  <p id="oDXr">Диски бывают больше 2Tb, поэтому лучше использовать parted, а не fdisk. То есть если вы видите инструкцию c fdisk, то она подходит только для дисков до 2Tb</p>
  <p id="Ukj0">Вот так можно посмотреть какие диски есть: </p>
  <pre id="okyA">parted -l</pre>
  <p id="0NWi">В списке будет что-то такое, типа: </p>
  <pre id="iAN1">Error: /dev/sdb: unrecognised disk label
Model: ATA TOSHIBA MG06ACA8 (scsi)                                        
Disk /dev/sdb: 8002GB
Sector size (logical/physical): 512B/4096B
Partition Table: unknown
Disk Flags: </pre>
  <p id="jrRK">/dev/sdb - так мы узнаем что у нас есть диск /dev/sdb, который не подключен. </p>
  <p id="q43d"></p>
  <p id="L9q1">Вот так выглядит подключенный/размеченный диск: </p>
  <pre id="1vwg">Model: ATA ADATA SU700 (scsi)
Disk /dev/sda: 120GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system     Name  Flags
 1      1049kB  2097kB  1049kB                        bios_grub
 2      2097kB  1027MB  1024MB  linux-swap(v1)        swap
 3      1027MB  120GB   119GB   ext4</pre>
  <p id="SlES"></p>
  <p id="EHXP">Итак, подключим и разметим <strong>/dev/sdb</strong>:</p>
  <pre id="eWHu">parted /dev/sdb</pre>
  <p id="edOZ">Назначаем метку: </p>
  <pre id="hKay">mklabel gpt</pre>
  <p id="hwLu">Дальше взываем команду </p>
  <pre id="8jfp">print</pre>
  <p id="Ihjc">Мы это сделали для того, чтобы узнать какой размер у диска (чтобы когда мы создаем партицию - мы правильную цифирку указали</p>
  <p id="0iCJ">например: </p>
  <pre id="t9AM">Model: ATA TOSHIBA MG06ACA8 (scsi)
Disk /dev/sdb: 8002GB</pre>
  <p id="7Bpe">во, тут 8002GB</p>
  <p id="sydV">дальше создаем партицию: </p>
  <pre id="SoWx">mkpart primary 1 8002G</pre>
  <p id="NERd">Всё, можем выходить: </p>
  <pre id="PI4x">quit</pre>
  <p id="8QBk"></p>
  <p id="mFsr">Форматируем диск: </p>
  <pre id="Fkhw">mkfs.ext4 /dev/sdb1</pre>
  <p id="cLqS"></p>
  <p id="pNHy"></p>
  <h2 id="ILx3">Монтирование диска</h2>
  <p id="Opk2">Сначала создаем папку, куда надо будет примонтировать диск:</p>
  <pre id="2D0d">mkdir /home/newdisk</pre>
  <p id="owEY">Потом монтируем диск: </p>
  <pre id="2qCU">mount -t ext4 /dev/sdb1 /home/newdisk/</pre>
  <p id="N0kg"><strong>/dev/sdb1</strong> - это какое диск<br /><strong>/home/newdisk/</strong> - куда монтировать</p>
  <p id="JwhW">Чтобы диск не отваливался каждый раз после перезагрузки системы: </p>
  <pre id="5Byo">nano /etc/fstab</pre>
  <p id="VOQ5">И дописываем туда что-то типа такого: </p>
  <pre id="eMNa">/dev/sdb1       /backup         ext4    default         0       2</pre>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.alfmaster.ru/lte-sinr-rsrp-yota</guid><link>https://blog.alfmaster.ru/lte-sinr-rsrp-yota?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alfmaster</link><comments>https://blog.alfmaster.ru/lte-sinr-rsrp-yota?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alfmaster#comments</comments><dc:creator>alfmaster</dc:creator><title>Характеристики 3G/LTE модема, что значат</title><pubDate>Sat, 16 Apr 2022 12:06:47 GMT</pubDate><description><![CDATA[SINR(Signal Interference + Noise Ratio), он же отношение сигнал/шум. ]]></description><content:encoded><![CDATA[
  <p id="wjLM"><strong>SINR</strong>(Signal Interference + Noise Ratio), он же отношение сигнал/шум. </p>
  <p id="zqYW">Как понимать значение этого показателя: </p>
  <pre id="xFaU">Отлично: ≥ 20дБ
Хорошо: 13дБ - 20дБ
Удовлетворительно: 0 дБ - 13 дБ
Плохо: ≤ 0 дБ</pre>
  <p id="SAgb"></p>
  <p id="sh3Q"></p>
  <h3 id="1u3n">RSRP (Reference Signal Received Power) - мощность принимаемого сигнала</h3>
  <p id="1PAd">Как понимать значение этого показателя: </p>
  <pre id="pMpi">Отлично: ≥ -80 дБм
Хорошо: -80 дБм ... -90 дБм
Удовлетворительно: -90 дБм ... -100 дБм
Плохо: ≤ -100 дБм</pre>
  <p id="1XCq">Если коротко: Чем ближе к нулю - тем лучше. Значения всегда отрицательные. </p>
  <p id="zeWD">Если &quot;проседает&quot; до 95 и ниже - значит сигнал стабильно плохой, хорошего интернета не будет</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.alfmaster.ru/cordova-cheat-sheet</guid><link>https://blog.alfmaster.ru/cordova-cheat-sheet?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alfmaster</link><comments>https://blog.alfmaster.ru/cordova-cheat-sheet?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alfmaster#comments</comments><dc:creator>alfmaster</dc:creator><title>Шпаргалка по командам Cordova</title><pubDate>Fri, 07 Jan 2022 12:07:41 GMT</pubDate><description><![CDATA[Как проверять не протухли ли какие-то пакеты: ]]></description><content:encoded><![CDATA[
  <p id="i1fq">Как проверять не протухли ли какие-то пакеты: </p>
  <pre id="8miC">npm outdated</pre>
  <p id="oCmZ">У cordova есть отдельная утилита для проверки актуальности плагинов</p>
  <p id="9jIh">Чтобы установить: </p>
  <pre id="Y5Vj">npm install -g cordova-check-plugins</pre>
  <p id="TTuc">Потом запускаем вот так: </p>
  <pre id="IG8U">cordova-check-plugins --update=auto </pre>
  <p id="2LVt">Проверяет и обновляет плагины. </p>
  <p id="wsL6"></p>
  <p id="dNQk">Приготовить сборку приложения для компиляции: </p>
  <pre id="UZYA">cordova prepare ios
cordova prepare android</pre>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.alfmaster.ru/ubuntu-20-web-sphere-mq-php-module</guid><link>https://blog.alfmaster.ru/ubuntu-20-web-sphere-mq-php-module?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alfmaster</link><comments>https://blog.alfmaster.ru/ubuntu-20-web-sphere-mq-php-module?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alfmaster#comments</comments><dc:creator>alfmaster</dc:creator><title>Ubuntu20: Установка клиента IBM WebSphere MQ + модуль для php</title><pubDate>Wed, 29 Dec 2021 12:53:21 GMT</pubDate><description><![CDATA[Если хотите работать с Websphere MQ с ипользованием PHP - это квест. ]]></description><content:encoded><![CDATA[
  <p id="tl9f">Если хотите работать с Websphere MQ с ипользованием PHP - это квест. </p>
  <p id="w97X">Установка делается в несколько шагов: </p>
  <ol id="8eKG">
    <li id="E8zE">Скачиваем и устаналиваем <strong>WebSphere MQ</strong></li>
    <li id="reUF">Скачиваем и устанавливаем PHP-MQSERIES (чтобы работать с <strong>WebSphere MQ)</strong></li>
  </ol>
  <p id="eDOT">Я пробовал собрать тоже самое для MacOS (для MAMP) - не получилось, сам модуль для PHP - не компилируется. </p>
  <p id="W3rb"></p>
  <h3 id="97p8"><strong>Установка WebSphere MQ</strong></h3>
  <p id="ckHt">Проходим на <a href="https://www-945.ibm.com/support/fixcentral/swg/downloadFixes?parent=ibm~WebSphere&product=ibm/WebSphere/WebSphere+MQ&release=7.5.0.8&platform=All&function=fixId&fixids=7.5.0.8-WS-MQC-LinuxX64&useReleaseAsTarget=true&includeRequisites=1&includeSupersedes=0&downloadMethod=http&login=true" target="_blank">https://www-945.ibm.com/support/fixcentral/swg/downloadFixes?parent=ibm~WebSphere&amp;product=ibm/WebSphere/WebSphere+MQ&amp;release=7.5.0.8&amp;platform=All&amp;function=fixId&amp;fixids=7.5.0.8-WS-MQC-LinuxX64&amp;useReleaseAsTarget=true&amp;includeRequisites=1&amp;includeSupersedes=0&amp;downloadMethod=http&amp;login=true</a></p>
  <p id="yeDD">И скачиваем 7.5.0.8 Client install image for WebSphere MQ on Linux X86-64</p>
  <p id="yF9v">Чтобы далеко не ходить, вот ссылка на по состоянию на 2022 год: </p>
  <pre id="5ZXc">wget https://ak-delivery04-mul.dhe.ibm.com/sdfdl/v2/sar/CM/WS/06zly/1/Xa.2/Xb.jusyLTSp44S0eZIuphr9nceu78L-EaopWceuAGmXuBaqzF1lbPcU5h70t_U/Xc.CM/WS/06zly/1/7.5.0.8-WS-MQC-LinuxX64.tar.gz/Xd./Xf.LPR.D1VK/Xg.11572581/Xi.habanero/XY.habanero/XZ.B2dHyxmWZrlGDA-lQIjtN806oDQiqKAn/7.5.0.8-WS-MQC-LinuxX64.tar.gz</pre>
  <p id="bLoy"></p>
  <p id="m1Gr">Последовательность шагов (всё делаю из под root/sudo): </p>
  <pre id="Dtdx">cd ~
mkdir tmp
wget https://ak-delivery04-mul.dhe.ibm.com/sdfdl/v2/sar/CM/WS/06zly/1/Xa.2/Xb.jusyLTSp44S0eZIuphr9nceu78L-EaopWceuAGmXuBaqzF1lbPcU5h70t_U/Xc.CM/WS/06zly/1/7.5.0.8-WS-MQC-LinuxX64.tar.gz/Xd./Xf.LPR.D1VK/Xg.11572581/Xi.habanero/XY.habanero/XZ.B2dHyxmWZrlGDA-lQIjtN806oDQiqKAn/7.5.0.8-WS-MQC-LinuxX64.tar.gz</pre>
  <p id="LjoV">Содержимое скаченного распаковываем в /root/tmp/mqseries</p>
  <p id="S43u">Далее, ставим необходимый минимум: </p>
  <pre id="KL8R">apt install rpm
cd /root/tmp/mqseries
./mqlicense.sh -accept
rpm -ivh MQSeriesRuntime-7.5.0-8.x86_64.rpm
rpm -ivh MQSeriesClient-7.5.0-8.x86_64.rpm
rpm -ivh MQSeriesSDK-7.5.0-8.x86_64.rpm</pre>
  <p id="sguC"></p>
  <p id="R9LP">Теперь надо поставить модуль PHP:</p>
  <p id="20fm">Фишка в том, что стандартный модуль, которых хранится в pecl (на момент написания - v0.15.0) с php8.0 не ставится, а вот если скачать его же с исходников на gitHub - ставится. </p>
  <p id="J2av">Делаем следующее: </p>
  <pre id="fUi0">cd /root/tmp
mkdir php_mqseries
cd php_mqseries
wget https://github.com/php/pecl-networking-mqseries/archive/refs/heads/master.zip</pre>
  <p id="6zwr">Распаковываем содержимое в ту же папку, куда скачали, там внутри архива папочка, вот ее содержимое кладем в /root/tmp/php_mqseries</p>
  <p id="5HD7">Дальше: </p>
  <pre id="lTgI">cd /root/tmp/php_mqseries
phpize
./configure --with-libdir=lib64 
make</pre>
  <p id="9cXP"></p>
  <p id="xR4x">Готово, модуль скомпилировался, теперь добавляем его в PHP. </p>
  <p id="0zzX">Копируем готовый модуль из /root/tmp/php_mqseries/modules/mqseries.so  в папку /usr/lib/php/20200930</p>
  <p id="BJRk">В файлы: </p>
  <pre id="U300">nano /etc/php/8.0/cli/php.ini 
nano /etc/php/8.0/apache2/php.ini</pre>
  <p id="acgG">добавляем: </p>
  <pre id="zfK4">extension=mqseries</pre>
  <p id="mk6g">Скорректируйте путь до файла php.ini в соответствии с вашей версией PHP</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.alfmaster.ru/ubuntu-20-redis-server</guid><link>https://blog.alfmaster.ru/ubuntu-20-redis-server?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alfmaster</link><comments>https://blog.alfmaster.ru/ubuntu-20-redis-server?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alfmaster#comments</comments><dc:creator>alfmaster</dc:creator><title>Ubuntu 20: установить и запустить Redis Server</title><pubDate>Wed, 29 Dec 2021 12:12:56 GMT</pubDate><description><![CDATA[Заходим как sudo и выполняем:]]></description><content:encoded><![CDATA[
  <p id="egD1">Заходим как sudo и выполняем:</p>
  <pre id="AGNj">apt install redis-server</pre>
  <p id="pt75">После установки - запускаем Redis сервер: </p>
  <pre id="2f4Q">systemctl start redis-server</pre>
  <p id="3VCu">И делаем так, чтобы он после перезагрузки - запускался сам: </p>
  <pre id="dO0k">systemctl enable redis-server</pre>
  <p id="58FL"></p>
  <p id="JxBx">Redis из коробки работает хорошо, но его еще можно поднастроить: </p>
  <pre id="sFw5">nano /etc/redis/redis.conf</pre>
  <p id="qKfM">Что можно поправить: </p>
  <pre id="za7B">maxmemory 512mb
maxmemory-policy allkeys_lfu</pre>
  <p id="tgWv"></p>
  <p id="0zip">В примере выше, мы пишем, что максимально программа может использовать до 512 мегабайт памяти.</p>
  <p id="w24g">Параметр maxmemory-policy указывает что делать когда достигнут лимит памяти. Вот доступные значения:</p>
  <ul id="DazT">
    <li id="wyC6"><strong>volatile-lru</strong> - (Least Recently Used) удалить ключ, который использовался давнее всех и имеет метку expire;</li>
    <li id="ggfQ"><strong>allkeys-lru</strong> - удалить ключ, который использовался давнее всех;</li>
    <li id="pGqL"><strong>volatile-lfu</strong> - (Least Frequently Used) удалить ключ, который использовался реже всех и имеет метку expire;</li>
    <li id="Uc5N"><strong>allkeys-lfu</strong> - удалить ключ, который использовался реже всех;</li>
    <li id="Ow41"><strong>volatile-random</strong> - удалить случайный ключ с меткой expire;</li>
    <li id="DkW4"><strong>allkeys-random</strong> - удалить случайный ключ;</li>
    <li id="BXsv"><strong>volatile-ttl</strong> - удалить ключ с ближайшим временем уничтожения;</li>
    <li id="4XN2"><strong>noeviction</strong> - не принимать новые запросы на запись.</li>
  </ul>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.alfmaster.ru/ubuntu-server-18-lts-to-20-lts</guid><link>https://blog.alfmaster.ru/ubuntu-server-18-lts-to-20-lts?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alfmaster</link><comments>https://blog.alfmaster.ru/ubuntu-server-18-lts-to-20-lts?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alfmaster#comments</comments><dc:creator>alfmaster</dc:creator><title>Как обновить Ubuntu Server 18 до Ubuntu Server 20</title><pubDate>Fri, 03 Dec 2021 12:04:02 GMT</pubDate><description><![CDATA[На самом деле просто]]></description><content:encoded><![CDATA[
  <p id="CTaY">На самом деле просто</p>
  <p id="83fg">Обновляем репозитории и пакеты</p>
  <pre id="3bb6">sudo apt update
sudo apt full-upgrade</pre>
  <p id="rtIZ"></p>
  <p id="fv0o">Скорее всего после этого надо сделать: </p>
  <pre id="KWuR">reboot</pre>
  <p id="w2v2"></p>
  <p id="cQIX">После этого запускаем: </p>
  <pre id="TQmt">do-release-upgrade</pre>
  <p id="giPt">В процессе установщик будет спрашивать вопросы, на которые отвечаем либо &quot;y&quot;, либо ENTER </p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.alfmaster.ru/mysql-tricks</guid><link>https://blog.alfmaster.ru/mysql-tricks?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alfmaster</link><comments>https://blog.alfmaster.ru/mysql-tricks?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alfmaster#comments</comments><dc:creator>alfmaster</dc:creator><title>MySQL приемчики</title><pubDate>Wed, 01 Dec 2021 12:53:58 GMT</pubDate><description><![CDATA[Как сортировать по значению цифры внутри строкового поля. ]]></description><content:encoded><![CDATA[
  <p id="uXap">Как сортировать по значению цифры внутри строкового поля. </p>
  <p id="Cz8m">Пример: у нас есть varchar, где написаны цифры и надо отсортировать вывод по значению этих цифр (а не по строковому значению). </p>
  <pre id="EYEv">SELECT * FROM {table} ORDER BY cast({column_name} as unsigned)</pre>
  <p id="7Nvq"></p>
  <p id="zmKT">Посмотреть размер таблиц в БД: </p>
  <pre id="Vy6Y">SELECT
    table_name AS &#x60;Table&#x60;,
    round(((data_length + index_length) / 1024 / 1024), 2) &#x60;Size in MB&#x60;
FROM information_schema.TABLES
WHERE table_schema = &quot;{database}&quot;</pre>
  <p id="tdqN"> где {database} - это имя базы, для которой нужно получить размер таблиц</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.alfmaster.ru/ubunu-20-lamp-install</guid><link>https://blog.alfmaster.ru/ubunu-20-lamp-install?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alfmaster</link><comments>https://blog.alfmaster.ru/ubunu-20-lamp-install?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=alfmaster#comments</comments><dc:creator>alfmaster</dc:creator><title>Стартовая настройка Ubuntu 18 / Ubuntu 20 LTS</title><pubDate>Wed, 03 Nov 2021 07:33:09 GMT</pubDate><description><![CDATA[Тут коротко что нужно последовательно дергать, чтобы установить LAMP на Ubuntu 18 LTS / Ubuntu 20 LTS]]></description><content:encoded><![CDATA[
  <p id="IIZ4">Тут коротко что нужно последовательно дергать, чтобы установить LAMP на Ubuntu 18 LTS / Ubuntu 20 LTS</p>
  <p id="gdwQ"></p>
  <h3 id="1N7W">Общее</h3>
  <p id="CaPM">Заходим на сервер, включаем:</p>
  <pre id="iSgJ">sudo -i</pre>
  <p id="FaoF"></p>
  <p id="dhDd">Обновить:</p>
  <pre id="U7my">apt update</pre>
  <p id="x5mZ"></p>
  <p id="Uemg">Ставим вспомогательные программы:</p>
  <pre id="Knmu">apt install -y mc htop iotop curl git unzip net-tools</pre>
  <p id="jKB9"></p>
  <h3 id="CdtX">Установка Apache:</h3>
  <pre id="wSam">apt install apache2 -y
apt install libapache2-mpm-itk -y
a2enmod rewrite
systemctl restart apache2</pre>
  <p id="gkW0"></p>
  <p id="Kdie">Теперь создаем хост:</p>
  <pre id="o83B">cd /etc/apache2/sites-available/
touch hostname.conf
nano hostname.conf</pre>
  <p id="9YaN">hostname - может быть любым именем</p>
  <p id="Qd2j">Пример конфига виртуального хоста для http:</p>
  <pre id="MfGM">&lt;VirtualHost *:80&gt; 
    ServerName site.ru 
    ServerAlias www.site.ru 
    DocumentRoot /home/site/www/public 
    AssignUserId site site 
    &lt;Directory /home/site/www/public &gt; 
        Options FollowSymLinks 
        AllowOverride All 
        Require all granted 
    &lt;/Directory&gt;
&lt;/VirtualHost&gt;</pre>
  <p id="Ao5b">Пример конфига для https: </p>
  <pre id="IJ0O">&lt;VirtualHost *:80&gt;
        ServerName      site.ru
        ServerAlias     www.site.ru site.ru
        DocumentRoot    /home/site/www/public
        AssignUserId    site site
        &lt;Directory /home/site/www/public &gt;
                        Options FollowSymLinks
                        AllowOverride All
                        Require all granted
        &lt;/Directory&gt;
        RewriteEngine on
        RewriteCond %{SERVER_NAME} =site.ru [OR]
        RewriteCond %{SERVER_NAME} =www.site.ru
        RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
&lt;/VirtualHost&gt;</pre>
  <pre id="uzJX">&lt;IfModule mod_ssl.c&gt;
    &lt;VirtualHost *:443&gt;
        ServerName      site.ru
        ServerAlias     www.site.ru site.ru
        DocumentRoot    /home/site/www/public
        AssignUserId    site site
        &lt;Directory /home/site/www/public &gt;
            Options FollowSymLinks
            AllowOverride All
            Require all granted
        &lt;/Directory&gt;
        SSLCertificateFile /etc/letsencrypt/live/site.ru/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/site.ru/privkey.pem
        SSLEngine on
        SSLProtocol             all -SSLv2 -SSLv3
        SSLCipherSuite          ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES2$
        SSLHonorCipherOrder     on
        SSLCompression          off
        SSLOptions +StrictRequire
        LogFormat &quot;%h %l %u %t \&quot;%r\&quot; %&gt;s %b \&quot;%{Referer}i\&quot; \&quot;%{User-agent}i\&quot;&quot; vhost_combined
        LogFormat &quot;%v %h %l %u %t \&quot;%r\&quot; %&gt;s %b&quot; vhost_common
    &lt;/VirtualHost&gt;
&lt;/IfModule&gt;</pre>
  <p id="KyYc">/home/site/www/public  - это путь до корневой директории сайта. В этом примере - такое подходит для Laravel, например</p>
  <p id="1SzW">site.ru - имя сайта, какого он уровня - не важно</p>
  <p id="JM4D">site - это имя пользователя, apache будет работать в его папке из под него (это ОЧЕНЬ удобно, кто так не делает - обрекает себя на бесконечные страдания и решение вопросов в доступами к файлам через предоставление прав 777 на папки)</p>
  <p id="wIzZ">/etc/letsencrypt/live/site.ru/fullchain.pem и /etc/letsencrypt/live/site.ru/privkey.pem - путь до файлов с сертификатами. </p>
  <p id="GnOL"></p>
  <p id="Qyrg">Также в файл <strong>/etc/apache2/apache2.conf</strong> нужно добавить <strong>ServerName localhost</strong>:</p>
  <pre id="kb1i">nano /etc/apache2/apache2.conf
ServerName localhost</pre>
  <p id="4nDV"></p>
  <p id="eYjd">проверить что настройки верные:</p>
  <pre id="zfeY">apache2ctl configtest</pre>
  <p id="RvJh">применяем настройки, просим apache применить их:</p>
  <pre id="kSLT">a2ensite sites.conf
systemctl reload apache2</pre>
  <p id="8xE7"></p>
  <h2 id="xjdQ">SSL для Apache2</h2>
  <p id="zL6P">Если нужно сделать домен с самоподписным сертификатом, то сертификат можно выпустить вот так: </p>
  <pre id="L4uy">openssl req -new -x509 -days 10000 -nodes -out cert.pem -keyout cert.key -subj &quot;/C=RU/ST=MSK/L=MSK/O=Alfmaster/OU=Alfmaster/CN=site.ru/CN=www.site.ru&quot;</pre>
  <p id="Tz3g">После этого в Apache2 можно вписать вот такой конфиг: </p>
  <pre id="Pf6w">&lt;VirtualHost *:443&gt;
        ServerName site.ru
        ServerAlias www.site.ru
        DocumentRoot /home/site/www/public
        AssignUserId site site
        &lt;Directory /home/site/www/public &gt;
                Options FollowSymLinks
                AllowOverride All
                Require all granted
        &lt;/Directory&gt;
        SSLEngine on
        SSLCertificateFile cert/site.ru/cert.pem
        SSLCertificateKeyFile cert/site.ru/cert.key
&lt;/VirtualHost&gt;</pre>
  <p id="2Kjh"><strong>cert/site.ru/cert.pem</strong> - это адрес относительно папки апача (/etc/apache2/)</p>
  <p id="kP0o"></p>
  <h3 id="RMhQ">MySQL</h3>
  <pre id="oEIt">apt install mysql-server</pre>
  <p id="0wKa"></p>
  <p id="edes">После этого делаем так, чтобы было удобно пользоваться паролем</p>
  <pre id="00Qz"> mysql
 ALTER USER &#x27;root&#x27;@&#x27;localhost&#x27; IDENTIFIED WITH mysql_native_password BY &#x27;{PASSWORD}&#x27;;
 FLUSH PRIVILEGES;
 exit</pre>
  <p id="GahU">где password = root пароль</p>
  <p id="yib6"></p>
  <p id="NuMy">Далее настройка безопасности</p>
  <pre id="stcb">mysql_secure_installation</pre>
  <p id="oRsi">на все вопросы отвечаем &quot;Y&quot;, на второй вопрос про пароль: 2 (MEDIUM: 8+ символов, включая буквы разных регистров, цифры, спецсимволы),</p>
  <p id="Lkpt"></p>
  <p id="Xkdv">Файл конфигурации для разного количества RAM:</p>
  <pre id="tUj4">nano /etc/mysql/mysql.conf.d/mysqld.cnf </pre>
  <p id="X2hn">Можно выбрать один из готовых конфигов. </p>
  <pre id="EoI0">
MySQL5.7: 8GB_RAM: https://alfmaster.ru/conf/mysql57_8gb.conf
MySQL5.7: 16GB_RAM: https://alfmaster.ru/conf/mysql57_16gb.conf
MySQL5.7: 32GB_RAM: https://alfmaster.ru/conf/mysql57_32gb.conf

MySQL8: 4GB_RAM: https://alfmaster.ru/conf/mysql8_4gb.conf
MySQL8: 8GB_RAM: https://alfmaster.ru/conf/mysql8_8gb.conf
MySQL8: 16GB_RAM: https://alfmaster.ru/conf/mysql8_16gb.conf
MySQL8: 32GB_RAM: https://alfmaster.ru/conf/mysql8_32gb.conf
MySQL8: 64GB_RAM: https://alfmaster.ru/conf/mysql8_64gb.conf

service mysql stop
service mysql start</pre>
  <p id="drtu">Важно: При этих настройках MySQL &quot;зажрет&quot; почти всё свободную память на VM (но при этом хорошо будет работать на нагрузках). Если базы у вас небольшие - возьмите самый маленьких конфиг (на 4Gb)</p>
  <p id="Agn6"></p>
  <p id="efZE">Восстановить пароль от root, если потерял:</p>
  <pre id="DTMJ">nano /etc/mysql/mysql.conf.d/mysqld.cnf 
добавить после [mysqld]:
skip-grant-tables
После этого: 
mysql
update user set authentication_string=PASSWORD(&#x27;root_password&#x27;) where user=&#x27;root&#x27; and host=&#x27;localhost&#x27;;
flush privileges;
exit;</pre>
  <p id="H2Rp"></p>
  <p id="OcAS">Теперь пользователя надо создавать вот так:</p>
  <pre id="IWHK">CREATE database {DBNAME};
CREATE USER &#x27;{USER}&#x27;@&#x27;localhost&#x27; IDENTIFIED BY &#x27;{PASSWORD}&#x27;;
GRANT ALL PRIVILEGES ON {DBNAME}.* TO &#x27;{USER}&#x27;@&#x27;localhost&#x27;;
FLUSH PRIVILEGES;
\q</pre>
  <p id="KKGc"></p>
  <p id="LBij">Проверить какие доступы есть для пользователя: </p>
  <pre id="1G1p">SELECT host FROM mysql.user WHERE User = &#x27;{USER}&#x27;;</pre>
  <p id="i7ad"></p>
  <p id="Orkt"></p>
  <h3 id="EnfG">PHP</h3>
  <pre id="ct2M">apt install -y php libapache2-mod-php php-mysql php-bcmath php-bz2 php-cli php-common php-curl php-gd php-imap php-json php-mail php-mbstring php-redis php-soap php-xml php-zip</pre>
  <p id="wm6F">После установки настраиваем параметры в php.ini: </p>
  <pre id="7qNY">nano /etc/php/*.*/apache2/php.ini
_
для php7.4: /etc/php/7.4/apache2/php.ini
для php8.0: /etc/php/8.0/apache2/php.ini
для php8.1: /etc/php/8.1/apache2/php.ini</pre>
  <p id="Ernv"></p>
  <p id="hqdR">Заменяем, чтобы было вот так (ну или как вам там надо): </p>
  <pre id="E4ev">memory_limit = 512M
post_max_size = 128M
upload_max_filesize = 128M
max_execution_time = 120
max_input_time = 120</pre>
  <p id="gfaZ"></p>
  <p id="Q03B">Потом: </p>
  <pre id="wigt">nano /etc/apache2/mods-enabled/dir.conf</pre>
  <p id="uNEd">Переставить во второй строчке index.php на первое место</p>
  <pre id="2Fis">systemctl restart apache2</pre>
  <p id="8Ajb"></p>
  <p id="8gve">Composer</p>
  <p id="yyxz">Делаем это под root (sudo)</p>
  <pre id="akED">cd ~
curl -sS https://getcomposer.org/installer -o composer-setup.php
php composer-setup.php --install-dir=/usr/local/bin --filename=composer</pre>

]]></content:encoded></item></channel></rss>