Диск с забивается сам по себе: 8 советов, как решить проблему переполнения жёсткого диска в Windows 10/8/7

Расширение диска на виртуальной машине — R3

Задача

Для начала определимся с задачей: есть виртуалка с линуксом и на ней нужно добавить место на файловой системе.

Разведка

Нужно определить вводные параметры, так как от них зависит всё. Вывод каждой команды обязательно скриншотьте, так как это поможет понять, как было раньше и, возможно, потом это поможет при восстановлении, если что-то пойдёт не так. Каждая инфраструктура в некотором роде уникальна и я не могу разобрать все варианты. Мы возьмём пару популярных случаев, вы поймёте логику и с остальными случаями справитесь сами. И так, начнём с результата и будем двигаться обратно:

Какую файловую систему нужно увеличить?

Ответ на этот вопрос должны знать вы. Зачастую это корневая файловая система, которая забивается данными, какими-нибудь логами и, если вам повезёт, вы успеете заранее добавить пространство. Ну или другой вариант, вам заранее говорят или вы сами предвидите, что в какой-то файловой системе, где лежат данные, в будущем добавится много данных и текущего выделенного пространства перестанет хватать.

Чтобы понять, какую файловую систему мы хотим увеличить, нужно посмотреть список примонтированных файловых систем:

Так мы можем найти различные параметры, по которым можно будет найти целевую файловую систему. К примеру, если я хочу увеличить корневую файловую систему, то легче будет понять по точке монтирования — корень, т.е. знак слэш. Если, скажем, я не знаю, куда монтируется, но знаю что осталось мало места — то можно будет разобраться по таким параметрам как Use, Available и Size, на сколько процентов используется, сколько места свободно и общий размер файловой системы соответственно. Я определил строку по тем или иным параметрам — и в первом столбце этой строки я увижу файловую систему — ответ на мой вопрос:

/dev/mapper/almalinux_alma-root

Но если вдруг вы так и не нашли, какую файловую систему нужно увеличить, можно понять по директории. К примеру, вы знаете, что на этом сервере база и она хранит все данные в директории /var/lib, и что для этой базы нужно больше места. Найдём файловую систему по этой директории:

df -h /var/lib

Тут мы видим, что /var/lib относится к корневой файловой системе.

И это только вершина айсберга. Следующий вопрос:

Где находится файловая система?

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

К примеру, LVM:

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

Возвращаясь к нашему вопросу, давайте не будем гадать и введёт команду:

Она поможет и определить небоскрёб, какой этаж на каком стоит, и найти, на чём находится наша файловая система. У нас всё просто — та файловая система, которую мы нашли, находится на LVM. Видно, что LVM ссылается на sda2, который является разделом диска sda.

И если вдруг вам показалось, что это просто и в этом любой дурак разберётся, то вспомните тему про stratis. Тот же самый lsblk, но нифига не понятно.

Вспомните математику — главное не ответ, а правильное решение. Поэтому мы пойдём по длинному пути. И так, мы определили, что целевая файловая система находится на LVM. В вашей задаче вместо LVM могут быть другие прослойки. У каждой прослойки свои инструменты для запроса информации, в случае с lvm это lvs, vgs и pvs.

Вспоминаем наш небоскрёб с LVM:

Мы начали с последнего этажа — файловой системы. Зачастую файловая система и нижележащий слой адресуются одинаково, т. е. наш путь /dev/mapper/almalinux_alma-root это и файловая система, и логический том, на котором она находится. Представьте это как бутылку с водой — нижележащий слой это просто оболочка, внутри которого находятся данные.

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

Для первого шага нужна команда lvs с логическим томом:

sudo lvs /dev/mapper/almalinux_alma-root

Тут мы определили, что наш логический том относится к группе almalinux_alma.

Для следующего шага нужна команда vgs с этой группой:

sudo vgs almalinux_alma

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

Берём команду pvs:

sudo pvs

И смотрим, к каким физическим томам относится наша группа. В моём случае это всего один физический том — /dev/sda2, у вас их может быть несколько, даже на разных дисках. В случае с LVM можно увеличить любой, либо добавить ещё один физический том. Но лично я не сторонник создания ещё одних физических томов, дисков и разделов, так как это только усложняет фундамент. Сегодня вы добавите один диск, завтра ещё один и в итоге будет какая-то каша. Лучше увеличить один из физических томов.

Как и в случае с файловой системой и нижележащим логическим томом, также и физический том относится к нижележащему — они делят один адрес, как бутылка с водой. В нашем случае /dev/sda2 это как второй раздел диска sda, так и логический том. Так мы понимаем, что файловая система в нашем случае относится к диску sda, и его мы должны увеличить.

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

Для начала выведем информацию о диске с помощью fdisk:

sudo fdisk -l /dev/sda

Во-первых, очень желательно, чтобы раздел, который мы хотим увеличить, был крайним. Таблицы разделов очень банально устроены — они хранят информацию где раздел начинается и где заканчивается. К примеру, в моём случае увеличить sda2 будет легко — просто поменять значение End на большее. А вот с sda1 такое не прокатит — сразу после его последнего сектора идёт первый сектор sda2. И сделать, чтобы он закончился в одном месте, а потом продолжился в другом — не получится. И если вдруг была бы задача увеличить sda1, то это было бы довольно сложно, пришлось бы двигать всё содержимое. А если это был бы LVM, то как решение можно было бы создать ещё один раздел и добавить в группу, чего мы не хотели бы делать, но это всяко лучше перемещения раздела. В нашем случае всё просто, но, возможно, в будущем я разберу более проблемные случаи.

Помимо положения раздела также может сыграть роль тип таблицы разделов. Есть два популярных типа — DOS, который часто называют MBR, и GPT. С GPT проблем особо не будет, не считая крайность раздела, а вот с DOS есть ещё один нюанс — деление на основной, расширенный и логический разделы.

Очень многие не знают особенностей таблицы разделов DOS и из-за этого могут по ошибке создать большие проблемы. Поэтому давайте разберёмся.

В таблице разделов DOS может быть всего 4 раздела — их называют основными — primary. Но это ограничение стало создавать проблемы, из-за чего придумали обходной механизм — один из этих разделов использовать как эдакую коробку, внутри которой можно создавать другие разделы. Вот этот раздел-коробка называют расширенным разделом, а разделы внутри него называют логическими разделами. Сам по себе расширенный раздел нельзя использовать как обычный, он почти никакого пространства не занимает и является просто ссылкой на логические. Расширенный раздел не обязательно четвёртый, им может быть и второй, и третий раздел, номер не важен. Но говоря с точки зрения увеличения пространства, если целевая файловая система находится внутри логическая раздела — к примеру sda6, то вам сначала надо будет увеличить коробку, а уже потом sda6. Т.е. сначала нужно расширить sda4, а уже потом sda6.

Возвращаясь к нашему случаю, у нас хоть и таблица разделов DOS, но всего 2 раздела, оба из них основные, поэтому никаких дополнительных нюансов. Просто увеличиваем sda, а потом sda2.

Но sda — это имя диска в самой системе и оно выдаётся динамически при каждом включении. Если у вас подключен один диск — ничего искать и не надо. А если дисков много? Легче всего будет понять по размеру диска. Если же у вас подключено много дисков с одинаковым размером — тут конечно придётся повозиться и нужна информация как с системы, так и с гипервизора.

С точки зрения гостевой системы информацию о диске можно найти с помощью утилиты lsscsi:

lsscsi -i

Но на каких-то дистрибутивах её может и не стоять по умолчанию, тогда можно посмотреть через sysfs:

ls -l /sys/class/block/sda

Опять же, тут всё индивидуально и зависит от гипервизора. На примере с QEMU/KVM можно определить по unit номеру:

Я специально его поменял, чтобы был не 0 — выставил 5-кой. И в системе эта 5-ка видна в наших командах.

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

Окей, диск, который нам нужно увеличить, мы тоже определили. Следующий вопрос:

Кто управляет диском?

А точнее — на каком гипервизоре находится виртуальная машина и где находится нужный диск? От этого зависит как мы будем увеличивать его.

  • Понятное дело, у каждого гипервизора свой интерфейс и свои команды

  • Некоторые гипервизоры для изменения размера диска требуют выключения виртуалки, к примеру — VirtualBox. Другие, к примеру — ESXi — позволяют это делать на лету

  • В некоторых случаях диск для виртуалки может быть выдан по сетевому протоколу, к примеру — iSCSI или Fibre Channel (оптоволокно). Т.е. есть отдельная система хранения данных, на ней создали диск и его указали в гипервизоре для конкретной виртуалки. Зачастую, гипервизору выделяют большой виртуальный диск и он там сам управляет пространством для различных виртуалок, но также возможно выделить диск напрямую виртуалке. И вот в таком случае гипервизор не может изменить размер диска, это уже нужно делать в системе хранения данных. Но это довольно специфичный случай.

Попробуем ответить на этот вопрос. Я буду использовать QEMU/KVM, так как в виртуалбоксе для изменения диска виртуалку надо выключать. К примеру, если в другом гипервизоре без выключения изменить размер диска или добавить новый диск, то гостевая система может не заметить эти изменения и нужно будет вводить дополнительные команды. Если систему выключить и включить, то эти нюансы отпадут. Нам же предпочтительнее без выключения, чтобы рассмотреть побольше.

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

Именно его нам нужно будет увеличить.

И так, всю необходимую информацию мы собрали. Теперь приступим к следующей стадии.

Разработка

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

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

Начнём с вопроса:

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

Ещё раз повторюсь, чтобы не было путаницы — когда я говорю «диск находится на СХД», речь не про общий диск, выделяемый хосту с гипервизором, а отдельный диск, выделяемый конкретной виртуалке. Это очень специфичный случай, но он подойдёт для общего понимания картины.

И так, если диском виртуалки управляет СХД, то увеличиваем его там. Если же диском управляет гипервизор — то нужно задаться ещё одним вопросом:

  • Какой гипервизор?

Как мы говорили, некоторые гипервизоры, к примеру — VirtualBox — не позволяют увеличить диск у работающей виртуалки. И в таком случае нужно будет выключить виртуалку, увеличить диск и заново включить виртуалку. Это не проблема для какой-нибудь тестовой или домашней системы. А в рабочей среде не каждую систему можно безболезненно выключить, некоторые системы могут работать годами без перезагрузки. И в таком случае нужна возможность изменять диск на лету. Для примера, это можно сделать на гипервизорах ESXi или QEMU/KVM — просто на работающей виртуалке увеличиваем диск.

Но при изменении диска на лету нужно задаться ещё одним вопросом:

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

И после того как система увидит, что диск увеличился, возникает следующий вопрос:

Ответом на этот вопрос будет башня, которую мы изучили.

Как мы и говорили, в каждой системе эта башня может отличаться, у кого-то больше этажей, у кого-то меньше. Но суть одна и та же — нужно поочерёдно увеличить каждый этаж, начиная с фундамента. Все предыдущие шаги были для увеличения диска sda. Увеличение каких-то этажей будет совмещено — скажем, при увеличении физического тома(pv) группа томов тоже увеличивается(vg).

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

Теперь зададимся вопросом:

  • А какие тут риски?

Ситуаций может быть много, но есть две особые, которые всё перекрывают — можно:

К примеру, вместо увеличения диска можно случайно указать диск меньшего размера. Да, обычно есть какая-то защита от дурака, но представим, что не помогло и мы насильно уменьшили диск. Тут уже ничего не поделать, единственное спасение — это восстанавливать бэкап. Обычно это очень долго и мучительно, а для компании это может быть очень болезненно. А если бэкапа нет — страшно представить. Так что единственный, хоть и болезненный вариант — бэкап. Поэтому прежде всего убедитесь, что есть бэкап целевой системы. Ну и есть куча различных ошибок, которые можно совершить и поломать разметку диска, файловую систему и всё такое.

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

Итоговая блок-схема выглядит так:

И так, мы разработали план, мы оценили риски, теперь приступаем к реализации.

Реализация

Начальные шаги будут отличаться на разных системах в зависимости от гипервизора и расположения диска. Будем считать, что вы знаете как на вашем гипервизоре сделать бэкап виртуалки или увеличить диск, я же рассмотрю свой вариант на QEMU/KVM.

Бэкап

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

cp -v /home/doctor/vms/alma. qcow2{,.bkp}

Диск

Дальше увеличиваем диск до нужного размера:

virsh blockresize almalinux8 /home/doctor/vms/alma.qcow2 20GB

Проверим, увидела ли система изменения? Для этого сойдёт fdisk:

sudo fdisk -l /dev/sda

Сейчас мы видим 18 Гибибайт, а раньше было 16. Значит увеличилась. Кто-то может спросить — вроде до 20 увеличивали, почему же 18? Потому что мы выдали 20 гигабайт, а в fdisk-е видим это в гибибайтах.

Если же ваша система не увидела изменения диска, то, как мы и говорили, нужно просканировать диск на изменения. Это можно сделать с помощью следующей команды:

sudo su
echo 1 > /sys/block/sda/device/rescan

Эта команда заставит ядро пересканировать информацию о диске и заметить, что, оказывается, у диска другой размер.

И так, фундамент у нас увеличен.

Раздел

Теперь нужно увеличить раздел sda2.

И так, заходим в fdisk:

sudo fdisk /dev/sda
p

и смотрим таблицу разделов.

Как вы помните, тут важно, чтобы раздел был последним. В чём суть увеличения раздела — мы удаляем раздел и создаём заново. Не бойтесь, ничего не поломается если удалить раздел и сразу заново создать с тем же начальным сектором и чтобы конечный сектор был тем же, или больше. Начальный и конечный сектора видны в столбике Start и End. Т.е. пока вы находитесь в fdisk, никакие изменения на диск не пишутся, изменения сохраняются только при выходе.

И ещё раз напомню, что если у вас таблица разделов DOS и есть расширенный раздел, то сначала надо увеличить расширенный раздел, а уже потом логический раздел внутри расширенного.

В нашем случае расширенного раздела нет, поэтому начинаем с удаления второго раздела:

Теперь нужно заново создать второй раздел:

n
p
2
Enter
Enter
N

Обратите внимание, что при создании первый сектор совпадает с тем, что был до удаления. Конечный сектор раньше был 33 миллиона, а теперь стал 39 миллионов, т. е. диапазон увеличился — а значит и раздел стал больше.

fdisk увидел, что на разделе есть метка LVM, и уточнил, стоит ли нам её стереть. Выбираем N, так как мы не хотим затрагивать никакие данные.

Прежде чем сохранить изменения нажимаем

и убеждаемся, что размер второго раздела увеличился. Если вы вдруг сделали что-то не так, размер стал меньше или номер раздела не тот или ещё что-то не так — то нажимаете q, чтобы выйти без сохрания.

Если же всё правильно, пишите w для сохранения изменений.

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

В нашем случае никаких ошибок не было, раздел увеличился, значит ставим ещё одну галочку.

Физический том (pv)

Теперь очередь физического тома.

Посмотрим размер раздела и физического тома на нём:

sudo fdisk -l /dev/sda2
sudo pvs

Как видите, LVM пока не заметила изменений. А значит нам нужно увеличить размер физического раздела с помощью команды pvresize:

sudo pvresize /dev/sda2

И проверить результат:

sudo pvs

Теперь видно, что размер физического тома увеличился.

Группа томов (vg)

Если посмотреть группу томов, то видно, что места стала больше, т.е. с группой томов нам никаких дополнительных операций делать не надо.

Логический том (lv)

Дальше нас интересует логический том. Для его увеличения используем команду lvextend:

sudo lvextend almalinux_alma/root -l +100%FREE -r

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

Файловая система

Если же у вас была другая башня, скажем, без LVM, то вам пришлось бы увеличивать файловую систему самостоятельно. В зависимости от типа файловой системы, для ext4 команда была бы одной:

sudo resize2fs /dev/mapper/almalinux_alma-root

а для xfs другой:

sudo xfs_growfs /dev/mapper/almalinux_alma-root

Т.е. у каждого типа файловой системы свои команды.

Теперь убедимся, что файловая система действительно выросла:

df -h /

Как видите, теперь размер корневой файловой системы больше.

Итоги

В целом, вся эта задача не такая сложная. Но есть отягчающий фактор — ошибка может привести к потере данных. И так как нет людей, которые не ошибаются, всегда делайте бэкап заранее и проверяйте, что бэкапы рабочие.

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

Каким диском резать керамическую плитку болгаркой

Плитка далеко не всегда используется в том формате, в котором продается. Углы стен, переходы, оформление панелей — все это требует использования фрагментов плитки. Что разрезать ее ровно и аккуратно, чаще всего используют углошлифовальную машину, или попросту болгарку. Но эффективность работы инструмента зависит от диска — это основная его часть, которая и отвечает за резку кафельной плитки.

Как выбрать диск для резки плитки

Диск нужно выбирать в зависимости от того, какой материал он будет обрабатывать. От этого зависит и цена. Например, самые дорогие — это диски с алмазным напылением, которое делает их особо прочными. Однако высокая стоимость окупается долговечностью и высоким ресурсом диска. Самый дешевый вариант — каменный диск. Однако его можно использовать для минимальных объемов кафеля, он не сможет дать той точности при распиле, что предлагает алмазный диск, и быстро изнашивается. Кроме того, при его использовании образуется много пыли, так что для помещений с чистовой отделкой он не подходит.

Все диски для резки плитки имеют стандартизированные размеры, поэтому не составит труда купить в магазине нужный. У каждой болгарки есть максимально допустимый диаметр диска, и превышать его нельзя. Конечно, можно установить на углошлифовальную машину с диаметром диска 125 мм алмазный круг с диаметром в 230 мм, но это заставит вас снять защитный кожух с инструмента, что запрещено правилами безопасности. Есть несколько вариантов диаметров круга для болгарки. Важно помнить — чем больше диаметр, тем более толстые материалы он может резать.

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

Виды дисков

Производители инструментов предлагают несколько вариантов дисков для плитки — на любой кошелек, для разных материалов и объемов работ. У каждого диска есть свои особенности, преимущества и недостатки.

  • Каменные диски — он популярны в нашей стране из-за низкой цены. Однако на этом запас их достоинств заканчивается — ресурс их невелик, и обычно к концу активного рабочего дня они выходят из строя. Во время их работы образуется много каменной пыли. И наконец — диски этого вида не могут обеспечить не то что фигурного реза, но даже и аккуратного и точного реза. Кроме того, сам диск достаточно хрупкий, и при грубой транспортировке на нем образуются сколы и заусенцы. Использовать такой диск нельзя — во время работы в болгарке он может разлететься на куски и повредить рабочему.

  • Стальные диски — эти изделия более прочные и долговечные, а также могут использоваться как для сухой, так и для мокрой резки. На стальные диски обычно наносят алмазное напыление — это увеличивает их ресурс. Стоимость таких кругов выше и зависит она от типа нанесения алмазной крошки. К примеру, самые дешевые стальные диски с алмазным напылением производятся методом серебряного припоя — припой в процессе эксплуатации быстро стирается, так что срок службы таких дисков невелик. В среднем ценовом сегменте известны диски, на которых напыление производится с помощью электричества. Они подойдут для больших объемов кафеля. Алмазные круги, напыление на которые наносится с помощью лазерной напайки, используются даже в промышленном оборудовании, настолько они прочны и долговечны. Их можно применять для резки самых твердых материалов. Это самые дорогие диски.

  • Сегментированные сухорезы— такие инструменты могут работать без водяного охлаждения. Однако они все равно подвержены перегреву, поэтому мастер должен делать остановки через каждые 20-30 секунд. Свое название сегментированные сухорезы получили из-за прорезей в металле, которые расположены по всей окружности диска. Эти вырезы обеспечивают более эффективное охлаждение без остановок, так что болгарка с таким диском может работать дольше без вынужденных отключений. Например, инструмент с этим диском работает по полторы минуты без остановок. Правда, качество реза у таких болгарок низкое, рез может получиться неровным и неаккуратным. На поверхности диска часто образуется сколы, так что ресурс его недолог.

  • Сплошные сухорезы — на таких дисках нет прорезей, поэтому их можно использовать не только для резки кафеля, но и для шлифовки его кромок. Правда, отсутствие разрезов выступает и недостатком таких дисков — ведь охлаждение ухудшается, и инструмент не может работать дольше 15 секунд, затем нужно делать перерыв. Так что использовать такие диски можно только для маленьких объемов кафеля.

  • Комбинированные — их можно использовать как для мокрой, так и для сухой резки. Они совмещают в себе параметры сплошных и сегментированных дисков. Срок работы без остановок чуть больше, чем у сплошных, но меньше чем у сегментированных. Такие диски служат недолго, так как мелкая пыль после резки забивается в диск и мешает ему нормально вращаться. Если у сплошного диска можно использовать водяное охлаждение, то для комбинированных дисков это запрещено — они сильно расширяются из-за перегрева и могут взорваться, если на них попадет влага.

  • Диск для тонкой работы— в процессе отделки комнаты кафелем нужно не только делать прямые резы, но и нарезать плитку на небольшие фрагменты. Диск должен быть тонким — оптимальная его толщина 1,5 мм. Такая толщина позволит сделать тонкий и аккуратный рез на декоративных элементах кафельной плитки, везде, где нужна тонкая и бережная работа.

Как уменьшить пыль от УШМ

Неизбежное последствие работы углошлифовальной машины — образование большого количества пыли. Но зная несколько секретов работы этого инструмента, можно снизить количество пыли до минимума. Например, можно не прорезать плитку на всю толщину, а сделать только надрез по всей длине, а потом надломить ее. Еще можно использовать мокрую резку или водяное охлаждение — частички воды соберут на себя всю лишнюю пыль. Поможет прибраться после масштабной резки кафеля мощный строительный пылесос.

Техника безопасности

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

Во-первых, у всех мастеров должна быть защитная одежда — рукавицы или перчатки, очки, закрывающие глаза, но не мешающие обзору, маска, костюм, который защищает руки и ноги. Если будут производиться большие объемы работ, сопровождаемые выделениями пыли, то обязателен респиратор для защиты органов дыхания. На лицо должен быть надвинут защитный кожух, он предохранит лицо от стружек и осколков.

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

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

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

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

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

И еще — не ориентируйтесь только на цену инструмента, тем более не покупайте подозрительно дешевые болгарки и диски. Такая дешевизна может обернуться поломкой оборудования в первый же день, а также травмой мастера из-за сломавшегося в первые же минуты работы диска. Кроме того, дешевые диски настолько хрупкие, что ломаются еще до того, как их установили в болгарку — их можно повредить даже просто неаккуратно бросив инструмент. Оптимальный вариант — диск для углошлифовальной машины с алмазным напылением. Он с честью выдержит большой объем работ, прослужит долго без сколов и трещин.

Написание интерактивного веб-приложения на Common Lisp: Hunchentoot, затем CLOG

Мы хотим, чтобы веб-приложение отображало список данных и имело поле ввода для интерактивной фильтрации.

Мы начнем с простого обычного веб-приложения, созданного с помощью
Хунченут. У нас будет поисковый ввод для фильтрации наших данных, и мы увидим, что для большей интерактивности, как правило, для фильтрации результатов по мере того, как пользователь вводит, нам потребуется больше, чем простые HTTP-запросы. Нам понадобится JavaScript. Но мы достигнем такого уровня интерактивности с CLOG (и без JavaScript).

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: этот пост является моей записью для конкурса CLOG!

Давайте установим наши первые библиотеки: Hunchentoot для веб-сервера, Djula для HTML-шаблонов, str для строковой утилиты.

 #+(или)
(ql:quickload '("hunchentoot" "djula" "str"))
 

Создаем пакет для наших экспериментов, и «входим» в него. Я использую UIOP define-package , потому что он выдает меньше предупреждений, чем defpackage , когда мы добавляем и удаляем символы. Он также имеет больше возможностей ( :reexport ), который я здесь не использую.

 (uiop:define-package:clog-contest
    (:использовать:cl))
(в комплекте: clog-contest)
 

ОК. Определяем маршрут. Он принимает один параметр GET для демонстрационных целей.

 (hunchentoot:define-easy-handler (root-route:uri "/") (имя)
  (формат nil "Эй~@[ ~A~]!" имя))
 

Запустите сервер:

 (defvar *server* (make-instance 'hunchentoot: easy-acceptor: порт 6789))
(hunchentoot:запустить *сервер*)
 

и получить доступ к http://localhost:6789/
Теперь давайте создадим наши продукты. Мы быстро определяем класс, содержащий идентификатор, название и цену.

(продукт дефкласса ()
  ((id :initarg :id :accessor product-id :type integer
       :documentation "Уникальный идентификатор")
   (заголовок :initarg :title :accessor product-title :type string)
   (цена :initarg :price :accessor product-price :type integer)))
(defvar *идентификатор продукта* 1
  «Глупый счетчик для увеличения нашего уникального идентификатора продукта. 
  Обычно это дается БД.")
(defparameter *products* '() "Список продуктов.")
 

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

 (определение случайной цены ()
  "Вернуть целое число от 1 до 10 000 (цена выражена в центах)".
  (1+ (случайное 9999)))
(defparameter *title-part-1* (список «симпатичный», «маленький», «крутой», «белый», «синий»))
(defparameter *title-part-2* (список "книга" "автомобиль" "ноутбук" "путешествие" "отвертка"))
(определить случайное название ()
  (let ((index (random (length *title-part-1*)))
        (индекс-2 (случайный (длина *название-часть-2*))))
    (format nil "~a ~a" (elt *title-part-1* index) (elt *title-part-2* index-2))))
 

попробовать:

 #+(или)
(случайное название)
 

Получаем такие названия, как «белая книга», «маленькая машина» и т. д.
Теперь, в целях тестирования, мы создаем 100 фиктивных экземпляров продукта:

 (defun gen-test-products (& необязательный (nb 100))). 
  (дотаймс (in nb)
    (push (make-instance 'product
                         :id (включая *идентификатор продукта*)
                         :title (случайное название)
                         :цена (случайная цена))
          *продукты*)))
(defun reset-test-products ()
  (setf *продукты* ноль))
 

Пробуем и получаем:

*продукты*
(#<ПРОДУКТ {1005B29363}> #<ПРОДУКТ {1005B29113}> #<ПРОДУКТ {1005B28EC3}>
 #<ПРОДУКТ {1005B28C73}> #<ПРОДУКТ {1005B28A23}> #<ПРОДУКТ {1005B287D3}>
 …)
 

Реализуйте метод print-object , если вам нужны красивые литералы продукта. См. Кулинарную книгу.

Теперь давайте отобразим товары в браузере. Мы изменим наш маршрут.
Мы обязательно извлекаем логику представления в functions.

(defun print-product (это &необязательный (поток нулевой))
  «Распечатать название продукта и цену в STREAM (по умолчанию возвращает новую строку)».
  (форматировать поток "~a - ~f~&"
          (str:fit 20 (название продукта) ;; функция подгонки была недавно объединена. 
          (/(товар-цена его)100)))
(defun print-products (продукция)
  «Вернуть список продуктов в виде строки (фиктивной, для тестов)».
  (с выводом в строку (s)
    (формат s "Товары:~&")
    (долист (это продукты)
      (печатная продукция это s))))
 
CL-USER> (печатная продукция (подпоследовательность *products* 0 10))
"Продукты:
красивая машина - 22,26
классное путешествие - 13.87
маленькая отвертка - 35,6
белый ноутбук - 6.08
книжечка - 27,57
белый ноутбук - 42,63
синее путешествие - 93,8
синяя машина - 29,99
красивая машина - 38,95
маленький отвертка - 46,99
 

Мы указываем нашему маршруту отображать список продуктов следующим образом:

(hunchentoot:define-easy-handler (root-route:uri "/") ()
  (печатная продукция *продукция*))
 

Мы что-то видим, но возвращать текст в браузер глупо. Нам нужны шаблоны.
Мы будем использовать шаблоны Djula. И мы украдем немного готового красивого HTML 🙂

Я буду использовать Bulma CSS, потому что это просто, современно (flexbox) и просто так. Я не знаю всех фреймворков CSS.
Я буду делать покупки в этой витрине шаблонов Bulma: https://bulmatemplates.github.io/bulma-templates/ IIRC. Я взял «Модальные карты» и немного упростил его.
Наш окончательный результат:

Давайте создадим templates/ и создайте:

Базовый шаблон загружает Bulma из CDN, создает панель навигации, определяет блок «контента», который будет переопределен другими нашими шаблонами, и нижний колонтитул.

Наш шаблон продуктов «расширяет» base.html и создает блок «контент».
Там мы перебираем список продуктов, предоставленный нашим корнем Hunchentoot, и отображаем их.
Но прежде чем это произойдет, нам нужно установить и настроить Djula для поиска и компиляции наших шаблонов.
Говорим Djula искать шаблоны в каталоге templates/.

 (djula:add-template-directory "templates/")
 

Обратите внимание, что обычно я делаю это относительно файла .asd, который мы еще не создали:

(djula: добавить-шаблон-каталог
 (asdf: относительный путь к системе "myproject" "src/templates/"))
 

Если у вас есть проблема с путем в Lisp REPL, в SLIME вы можете ввести ,cd (команда с запятой), чтобы изменить текущий рабочий каталог.
Теперь определяем наши шаблоны:

 (defparameter +base.html+ (djula:compile-template* "base.html"))
(defparameter +products.html+ (djula:compile-template* "products.html"))
 

В итоге видно, что это скомпилированные шаблоны:

CLOG-КОНКУРС> +products.html+
#
 

Хорошо, наш маршрут должен вернуть шаблон и передать ему данные.
Наш маршрут возвращает djula:render-template* .

 (hunchentoot:define-easy-handler (root-route:uri "/") ()
  (djula:render-template* +products.html+ ноль
                          :продукты *продукты*))
 

Отлично!
Мы отображаем все продукты. Мы примем поисковый запрос, чтобы отфильтровать их. Разбивка на потом.

У нас есть поле ввода, определяющее HTML-форму,
который вызывает конечную точку поиска.
Нам нужно:

(defun search-products (запрос и необязательный (продукты *продукты*))
  "Найдите QUERY в названии продуктов. 
  Это будет вызов БД».
  (цикл для продукта в продуктах
     when (str:containsp (str:downcase query) (str:downcase (product-title product)))
     собирай товар))
 

Попробуйте:

 #+(или)
(поисковые продукты "отлично")
 

Теперь поиск маршрута. Он принимает один параметр GET, q для «запроса».

(hunchentoot:define-easy-handler (маршрут поиска: uri "/search") (q)
  (let* ((products (search-products *products* q)))
    (djula:render-template* +products.html+ ноль
                            :title (формат nil "Мои продукты - ~a" q)
                            : запрос д
                            : продукты продукты
                            :no-results-p (ноль (длинные продукты)))))
 

Попробуйте, работает 🙂
Согласен, алгоритм поиска упрощен. А как насчет нескольких слов, акцентов, опечаток, неточного поиска (основы)…?

Ваш поисковый запрос виден в параметрах URL:
http://localhost:6789/search?q=путешествие
Обычно это хорошо. В современных одностраничных приложениях вы теряете это или вам приходится самостоятельно обрабатывать структуру URL.

Поиск требовал перезагрузки страницы. Если ваше приложение быстрое, это может не быть проблемой.
Однако, если бы мы хотели, чтобы поиск был более интерактивным, например, показывая результаты по мере ввода, нам нужно было бы использовать JavaScript. Входит ЗАБОР.

Можем ли мы сделать наше приложение интерактивным с помощью CLOG?

Ну, можем, и что еще круче, так это то, что разработка
процесс сам по себе очень интерактивен. CLOG отправляет изменения на страницу
через веб-сокеты при добавлении или редактировании функций. Таким образом, мы
можно увидеть изменения в режиме реального времени. Например, изменить цвет:

(setf (цвет фона *тело*): красный)
 

и БАМ, красный.

Давайте создадим еще один пакет для этого нового приложения. Я буду «использовать» функции и макросы, предоставленные пакетом :clog, а также наши ранее определенные :clog-contest (да… мы еще не :export).

(uiop: определить-пакет: засор-конкурс-с-засором
    (: использовать : cl : засорить
          :засор-конкурс))
(в пакете: clog-contest-with-clog)
 

Самые первые шаги, которые вы можете сделать, чтобы понять интерактивную забаву CLOG, — это внести изменения в окно браузера, находясь в CLOG REPL.

(ql: быстрая загрузка "засор")
CL-USER> (засоряющий пользователь в пакете)
CLOG-USER> (clog-repl)
CLOG-USER> (setf (цвет фона *body*) "красный")
CLOG-USER> (create-div *body* :content "Hello World!")
 

И вуаля. Для вас открылось окно браузера.

Здесь вы также найдете множество демонстраций: https://github.com/rabbibotton/clog/tree/main/tutorial
Вы можете запустить их с помощью (clog:run-tutorial 1) (по номеру id).

Далее я приглашаю вас ознакомиться с общими элементами CLOG: https://rabbibotton.github.io/clog/clog-manual.html#toc-8-common-clog-elements

Как правило, для создайте div в элементе DOM, мы используем create-div .

Первое, с чего мы хотим запустить наше приложение CLOG, — это инициализировать функцию. Его подпись:

инициализировать (обработчик нового окна и ключ (хост 0.0.0.0) (порт 8080) (сервер hunchentoot)
 (расширенная маршрутизация ноль) (первый длинный опрос ноль) (загрузочный файл /boot.html)
 (загрузочная функция ноль) (статическая загрузка-html ноль) (статическая загрузка-js ноль)
 (статический-корень (пути-слияния ./статические-файлы/ (засорение системного-исходного-каталога))))
Инициализируйте CLOG на сокете, используя HOST и PORT для обслуживания BOOT-FILE.
в качестве маршрута по умолчанию для установления соединений через веб-сокеты и статических
файлы, расположенные в STATIC-ROOT. […]
 

Далее вызывается наша функция add-products с телом (объект CLOG) в качестве аргумента.

 (учебное пособие по запуску функции ()
  «Начать обучение».
  (инициализировать «добавить продукты»)
  (открытый браузер))
 

Итак, что мы хотим сделать? Мы хотим создать поле ввода для поиска и отображать наши продукты ниже. Когда пользователь что-то вводит, мы хотим немедленно отфильтровать продукты и повторно отобразить их.

Первая версия, в которой мы отображаем только продукты, будет такой:

(defun add-products (тело)
  (let* ((result-div (create-div body :content "")))
    (display-products result-div (subseq clog-contest::*products* 0 10))))
 

И функция display-products ниже:

(defun display-products (продукты для тела)
  "Покажите эти продукты на странице.
  Создайте div для каждого продукта со строкой для представления продукта.
  Здесь мы не создаем красивые карточки товаров Bulma».
  (долист (это продукты)
      (создать-div body :content
                  (формат ноль "~a - ~a"
                          (clog-contest::product-id это)
                          (clog-contest::print-product it)))))
 

Теперь нам нужно настроить интерактивность. Событие, за которым нужно следить, — это ключевое событие. В CLOG у нас есть метод set-on-key-up . Требуется: объект CLOG (объект DOM, который он отслеживает для событий) и функция-обработчик. Эта функция принимает два аргумента: объект CLOG и событие.

В нашей функции добавления продуктов ниже мы создаем поисковый ввод и прослушиваем событие нажатия клавиши:

(defun add-products (тело)
  "Создайте ввод для поиска и div для продуктов.
  Свяжите событие нажатия клавиши в поле ввода с нашей функцией фильтра».
  (let* ((form (create-form body))
         (ввод (форма элемента формы создания: ввод: имя «запрос»
                                     :этикетка
(форма создания ярлыка :content "Отфильтровать продукт: ")))
         (результат-div (создать-div body :content "" )))
    (ввод по нажатию клавиши
                   (лямбда (событие объекта)
                     (format t ":key-up, значение: ~a~&" (значение obj)) ; Ведение журнала
                     (setf (текстовый результат-div) "") ; вот как мы стираем текущий контент.
                     (событие обработки-фильтра-продукта-результата-div obj)))
    (display-products result-div clog-contest::*products*)))
 

Ниже, чтобы узнать, что набирается в поисковом вводе, используем (значение obj) .

(defun handle-filter-product (событие div obj)
  «Поиск и повторное отображение продуктов».
  ;TODO: немного подождать
  (объявить (игнорируемое событие))
  (пусть ((запрос (значение obj)))
    (если (> (запрос длины) 2)
        (div display-products (запрос clog-contest::search-products))
        (напечатайте "жду новых входных данных"))))
 

Работает\o/

Есть несколько предостережений, над которыми нужно поработать:

  • если вы наберете поисковый запрос из 4 букв быстро, наш обработчик будет ждать ввода не менее 2 символов, но он будет запущен еще 2 раза. Это, вероятно, исправит мерцание.

И, как вы заметили:

  • мы не копировали и не вставляли красивый HTML-шаблон, так что нам нужно немного поработать с этим :/

CLOG вовсе не ограничивается такими веб-сайтами. Вы можете создавать игры (есть демонстрация Snake), многопользовательские приложения (есть демонстрация чата)… и все это, делая все в бэкенде, на Common Lisp, с большим количеством интерактивности под рукой. Попробуйте!


Кстати, этот пост написан в грамотном стиле с Эрудитом. Все записывается в файл .lisp и экспортируется в уценку. Прочитайте об этом здесь и посмотрите его исходный код на GitHub. Вы можете wget этот исходный код, открыть его в своем редакторе и попутно скомпилировать фрагменты.

Дополнительные веб-материалы см.:

  • https://github.com/CodyReichert/awesome-cl#web-frameworks традиционные веб-фреймворки, а также Weblocks (Reblocks), CLOG, ISSR…
  • https://lispcookbook.github.io/cl-cookbook/web.html
  • демо: https://github.com/vindarel/demo-web-live-reload
  • демо, очень похожее на наш список продуктов, созданный с помощью Djula и Bulma CSS, немного более полный: https://github.com/vindarel/lisp-web-template-productlist
  • Демонстрация списка задач ISSR: https://github.com/vindarel/demo-ISSR-djula
  • скелет моего веб-проекта: https://github.com/vindarel/cl-cookieweb
  • демо-версия Caveman и htmx, аккуратной JS-библиотеки, обеспечивающей простую интерактивность во многих случаях использования: cl-beers. «htmx дает вам доступ к AJAX, переходам CSS, веб-сокетам и событиям, отправленным сервером, непосредственно в HTML с использованием атрибутов, поэтому вы можете создавать современные пользовательские интерфейсы с простотой и мощью гипертекста». Он не всегда заменяет JS-фреймворк, но его стоит рассмотреть.

НЕУСТРАНИМЫЕ ЗАБОРКИ…? ПОПРОБУЙТЕ ЭТО – Epson Stylus Pro 4900, 7900, 9900

Я и мой гениальный приятель Стив размышляем над проблемой засорения Epson Stylus Pro

Во-первых, мне очень жаль, что у вас засор. Во-вторых, я чувствую твою боль. В-третьих, половина мира тоже…

Через MYX900.com со мной связались пользователи Epson Stylus Pro 4900, 7900, 9900 и 11880 со всего мира. США, Азия, Африка, Новая Зеландия, Бразилия, Италия, Канада, Германия и так далее. Это здорово, потому что каждый пользователь предлагает свой опыт, свою борьбу, и в результате я получаю знания.

Если вы столкнулись с неустранимым засором на вашем компьютере, основываясь на моем опыте и тех, которыми я поделился со мной, вы можете попробовать следующее:

1. Первый шаг на пути к устранению смертельных засоров — позвонить Epson по телефону (562) 276-1305 . Но есть вероятность, что если вы не готовы потратить на починку своей машины примерно столько же денег, сколько потратили на ее покупку, вы оставите телефонный звонок в поисках ответов. …Перейдем ко второму шагу

2 — Если у вас есть принтер Epson Stylus Pro с X900 head, вам не привыкать к засорению форсунок или очистке. Тем не менее, это первый шаг, поэтому попробуйте некоторые стандартные очистки — но сначала разберитесь с ними ЗДЕСЬ.

3 – Если стандартная чистка не помогает устранить засор, попробуйте парную очистку в сервисном режиме, существует четыре различных уровня интенсивности. Наконец, если ваши смертельные засоры сохраняются, попробуйте SS Cleanings, но они могут быть опасными. Текущие чернила не только создают цвет на бумаге, но и действуют как охлаждающая жидкость внутри пьезоэлектрической головки на пути к бумаге. Забитая головка снижает подачу чернил и, следовательно, также является горячей головкой, поэтому перед тем, как попробовать их, узнайте о чистке SS, чтобы не поджарить себе голову — ЗДЕСЬ

The Epson Stylus Pro Clog Conundrum

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

Следуйте по пути чернил, от ваших тележек до ваших сопел

5 – Вот где мои друзья от Новой Зеландии до Африки, от Великобритании до США – все исследования и эксперименты по электронной почте окупаются. На самом деле надежда ЕСТЬ. Один пользователь Epson Stylus Pro 4900, парень по имени Джон Шваллер, на самом деле прочистил неустранимый засор, заправив принтер чернилами. Это первый шаг в жизни вашего принтера — заполнить чернилами демпферы, линии и головку. Этот процесс называется «Зарядка чернил». Если вы зайдете в сервисный режим, в разделе очистки вы найдете опцию заправки чернил последней в списке. Невозможно заряжать только пары, но можно заряжать только одну сторону машины, а не обе. Это помогает немного сэкономить чернила. Джон сказал мне, что он выполнил несколько процессов загрузки чернил. Его машина была 4900, поэтому очереди не очень длинные, что наводит меня на мысль, что 4900 — самая дешевая машина, на которой можно примерить это. В любом случае это бросок костей. Однако здесь нет никакой опасности, кроме вашего кошелька. При зарядке вашей машины форсунки в головке не воспламеняются, поэтому нет опасности их перегрева. Я еще не проверял это, но я ожидаю, что этот процесс — когда у вас уже есть заполненные чернилами линии — должен протолкнуть тонну чернил через вашу забитую головку, эффективно промывая ее. …что подводит нас к шестому шагу

6 – Хотя это очень заманчиво, я знаю, мысль снять головку X900 и замочить ее в Windex, Simple Green, любимой смеси для тортов вашей мамы или даже в бензине (поверьте мне, я пробовал все, включая ультразвуковую очистку) это опасная территория. Внутренности вашего удивительно крошечного пьезоэлектрического лабиринта печатающей головки исключительно хрупкие. Поэтому лучше оставить применение давления жидкости инженерам, которые создали этот засор-монстр машины в первую очередь — оставить головку на месте.