Молярный скотч
(дада, я знаю, что уже было на Баше, но я придумал раньше)
Молярный скотч
(дада, я знаю, что уже было на Баше, но я придумал раньше)
Вечный Junior, он же chronos@ljr, он же Виктор Багров из г. Кондопоги, офигенный молодой поэт, качающий завораживающие верлибры, наверное, прямо из ноосферы или информационного поля Вселенной. Так что я ничего пиарить не буду, просто оставлю это здесь.
***
сегодня он стоит в поле, и завтра он
тоже там
в поле
среди разъяснений
стоит
думает
слушает
а вчера: куски объяснимого
сваи
04 06 19
Ссылка на оригинал
***
я допускаю Быть: и тебе и друг
ому
т изымает
я
в отвесном письме
стороны среза двоятся
вдвойне
у предгорья их всплески
сквозное сечение
в памяти
рассекаем план (кто. он?)
после в завтра никто не укажет
на место
заведомо ложного поиска в эхо
не помнить
04 06 19
Ссылка на оригинал
***
и книга здесь остановится, и вина
пока что здесь незнакомая
при отсеке
при вывихе
вкладышем развернется
в необратимом
обратном разборе
висеть останется: слово: и эта: (па
п
ка)мешек: в снова
03 06 19
Ссылка на оригинал
***
собирали картинки, а они под столом
подо льдом: всё в смещенном
пока (ты) (й)
вне поля: подвижен скворец
голос
голос
квадраты
в мишени:
03 06 19
Ссылка на оригинал
Ну не мог я мимо такого пиздеца пройти! В копилочку всяким антипобедным и антипатриотическим сообществам.
Особенно с «допризывной подготовкой» они прямо в яблочко попали!
А так же ISO-образ Acronis True Image и Puppy Slacko.
Попросили превратить мою заметку про то, как можно пользоваться Acronis True Image без его акронисовского «восстановления при загрузке», превратить в интерактивный скрипт, который делает все то, что описано в заметке, но сам, задавая пользователю наводящие вопросы.
Сделал, чо. Правда, скрипт, наверняка, дичайший быдлокод, но работает без ошибок. Единственное что, предварительно надо создать основной раздел ext2/ext3 на жестком диске, и он должен идти первым. Потом установить винды, сделать линуксовый раздел активным, а потом уже запускать скрипт со всеми потрохами.
Скрипт дико большой, и отдельно его описывать мне откровенно влом, впрочем, в виде отдельных заметок, все самое основное я в этом блоге уже обсуждал.
Эмуляция восстановления при загрузке Acronis True Image с помощью syslinux/extlinux Копия
1. Создание списков (из файлов в каталоге) Копия
2. Простой интерактив в bash-скриптах (запрос Y/N и запрос строки) Копия
3. Простой интерактив в bash-скриптах (меню, списки) Копия
4. Проверка, установлен ли флаг раздела «активный» Копия
5. Определение файловой системы раздела диска в Linux Копия
6. Поиск загрузчика Windows Копия
7. Получение MBR ID и номера раздела, для передачи управления другому загрузчику Копия
8. Число или строка в переменной BASH Копия
Поскольку, наверняка набыдлокодил, то исправления и дополнения приветствуются.
Продолжаем заниматься прикладным геоложеством, тем более, что этот минерал в не таком далеком прошлом и правда прикладывали, даже с силой, можно сказать, терли об свой организм. А точнее, использовали вместо скраба. Итак, знакомьтесь, пемза — пепел давно потухшего вулкана. И этот образец откопал я лично на даче у друга, так что я прям геолог, геолог прям. Примерно вот по этим координатам: 62.257657, 34.439260. Могу налюбить вас эдак на километров 10, тому ще GPS-навигатор я благополучно в городе оставил, а теперь восстанавливаю поездку по гугл-картам. Вроде, нашел похожее на правду озеро. Если что, поеду еще раз, подкорректирую координаты.
Особенность обработки участка в том, что у них на огороде нет привозной земли от слова совсем, так что, что было из огорода выкопано, то там и лежало с тех времен, когда в Карелии еще были действующие вулканы. Ближайшие к точке в Лижме, и чуть дальше — в Гирвасе:
Лижма, если по дороге, ~ в 19 км, если спрямить, наверное, будет километров 15, т.е. для вулкана фигня — доплюнуть мог.
До более известного Гирвасского вулкана — напрямую ~55 км, еще и через озеро Сандал. Мог он туда доплюнуть или нет, не ведаю.
Сам минерал легкий, пористый (навскидку, весит примерно столько же, сколько гораздо меньший по объему кусочек шунгита), у него, наверное, внутри еще есть газы той земной атмосферы :). А еще он легко разделяется на довольно толстые пластины. Этот кусок я не трогал, но над другими мы экспериментировали, плюс находили практически ровные пластины пемзы в земле.
Другие фото:
Так что вот, такая занимательная геология, не отходя от дачи.
Ездили мы на днях с поэтами в славный город С., где поэты выступали, а я зарулил на местную метеостанцию и сфотографировал там раритетную таблицу для определения видимости. Собственно, таблицу меня запрягли осовременивать, пришлось делать ее копию в Excel’е, а таблица древнючая — 70х годов прошлого века. Так что сегодня у нас артерфакт метеорологический.
Лицевая сторона:
Оборотная сторона:
Позвали тут в дружественную конторку, где после очередных обновлений перестал работать какой-то очередной русский инновационный криптопровайдер (не Крипто Про, с ним вроде такой беды не случалось). Оказалось, программулина конфликтовала с кривым активатором ODIN, да-да, винда почему-то тоже оказалась нелицензионной, несмотря на государственный статус этой самой конторки. Пришлось удалять.
А активатор кривой тому ще подсовывает в винду патченное ядро, дабы установить драйвер без цифровой подписи, нужный для эмуляции таблицы SLIC.
На рутрекере, кстати, в хорошей и обстоятельной теме про активацию семерки, предлагали просто создать BAT-файл со следующим содержимым, и запустить его с правами администратора, после чего перезагрузиться:
del "%windir%\system32\drivers\oem-drv64.sys"
del "%windir%\system32\xNtKrnl.exe"
del "%windir%\system32\xOsLoad.exe"
del "%windir%\System32\ru-RU\xOsLoad.exe.mui"
del "%windir%\System32\en-US\xOsLoad.exe.mui"
%windir%\system32\bcdedit.exe /set {current} path \Windows\system32\winload.exe
%windir%\system32\bcdedit.exe /deletevalue {current} kernel
%windir%\system32\bcdedit.exe /deletevalue {current} nointegritychecks
%windir%\system32\bcdedit.exe /deletevalue {current} custom:26000027
reg delete HKLM\SYSTEM\CurrentControlSet\services\oem-drv64 /va /f
Кому-то может и поможет, но мне не повезло, файлы активатора не удалились, reg delete не сработал, потому я просто нашел в дистрибутиве их виды «автоматический установщик» активатора, и просто провернул последовательность действий в обратном порядке.
Получился такой вот CMD-файл
В каталоге с этим батником должен быть подкаталог data, со следующим содержимым:
1. Утилита SetACL.exe, которая будет менять права доступа к ключам Реестра, и восстанавливать их после редактирования. Утилиту взял из того же дистрибутива.
2. Утилитка sleep, но это так, для красоты, моя прихоть.
3. Файлы Реестра (*.reg) для x86 и x64 ОС, в которых прописано, какие ключи удалять anti-oem-drv64.reg anti-oem-drv86.reg
Далее я сделал RAR-SFX с таким сценарием:
;Расположенный ниже комментарий содержит команды SFX-сценария
Setup=Deactivator.cmd
TempMode="Удалить активатор?","Деактиватор"
Silent=1
Overwrite=1
И поставил галочку в дополнительных параметрах SFX, на запрос административного доступа.
После перезагрузки можно удалить файлы активатора, таким вот CMD-файлом.
@ rem echo Этот файл должен быть запущен с правами администратора и после выполнения Deactivator'а
@ rem echo Чтобы окончательно удалить следы активатора нажмите любую клавишу, иначе CTRL+C!
@ rem pause
DEL "%windir%\system32\drivers\oem-drv64.sys"
DEL "%windir%\system32\xNtKrnl.exe"
DEL "%windir%\system32\xOsLoad.exe"
DEL "%windir%\System32\ru-RU\xOsLoad.exe.mui"
DEL "%windir%\System32\en-US\xOsLoad.exe.mui"
DEL "%windir%\system32\drivers\oem-drv86.sys"
@echo "Clean complete."
@pause
И SFX-сценарий к нему:
;Расположенный ниже комментарий содержит команды SFX-сценария
Setup=Cleaner.cmd
TempMode="Выполняйте только после исполнения Deactivator'а, если хотите окончательно удалить следы активации","Окончательная очистка"
Silent=1
Overwrite=1
1. Deactivator.exe
2. Cleaner.exe
Сегодня в номере геологический атерфакт, образец породы шунгита, собственно, из месторождения близ Шуньги, деревни, которая и дала название минералу. Это практически сверхчистый образец, с повышенным содержанием фуллеренов, для использования в медицине и быту. Да, из него можно сделать фильтр для воды, но я лично не хочу портить камень, поэтому просто помещаю его в банку с водой на ночь, если мне вдруг хочется шунгитовой водички.
Если вдруг захотите себе такой же (хоть кило) — добро пожаловать в редакционный телеграм, у нас прямые поставки из Шуньги, а доставить можем по всему СНГ и РФ.
Если вы мэр города, то назначьте на должность начальника Горводоканала человека с еврейской фамилией. Вы дадите новую жизнь старому мему, про евреев, кран и воду.
Раз уж в прошлой заметке зашла речь про chainloading, т.е. передачу управления другому загрузчику из Syslinux, был разобран стандартный способ указания загрузчика в виде записи hdX Y
, и определен минус этого способа, то можно рассказать и про устранение этого минуса.
Согласно спецификации, управление другому загрузчику можно передать не только указав номер диска и раздела, но и в следующем формате:
mbr:<id> [<partition>]
где:
<id> - уникальный MBR ID
<partition> - номер раздела жесткого диска
Эта схема, конечно, для предыдущего случая, но разделы (а не диски), в обоих случаях нумеруются одинаково. А вот вместо hd0
(hd1
, hd2
…) будет mbr:<id>
.
Вот часть измененного конфига syslinux.cfg
, где chainloading используется для загрузки Windows со второго раздела на первом жестком диске, только теперь жесткий диск определяется не по номеру, а по MBR ID:
LABEL windows menu label Microsoft Windows 7 kernel modules/chain.c32 append mbr:0x31c5dff2 2
Сделал весь процесс в отдельной функции get_slid()
, куда первым параметром передается имя устройства (с номером раздела или без), например, /dev/sda2
.
1. Получим имя устройства без пути:
T_BN=`basename $1`
2. Получим номер раздела, удалив из начала имени все латинские буквы:
T_VOLNUM=`echo "$T_BN" | sed 's/^[a-z]*//'`
3. Получим имя устройства, с полным путем, но без номера раздела:
T_DSKNAM=`echo "$1"|sed 's/[0-9]\+$//'`
4. Проверим, не получилась ли пустая строка (может случиться, если в первый параметр что-то не то положили):
if [ -z "$T_DSKNAM" ]; then return 1 #error fi
5. Получаем идентификатор MBR, способ указан в руководстве по chain.c32
[1]:
T_MBRID=`hexdump -s 440 -n 4 -e '"0x%08x\n"' "$T_DSKNAM"`
т.е. hexdump читает из MBR устройства 4 байта идентификатора, и выдает их в виде строки требуемого формата.
6. Формируем строку для конфигурации Syslinux:
SL_ID="mbr:$T_MBRID $T_VOLNUM"
7. Пример вызова функции:
if [ -z "$1" ]; then echo "Use "`basename $0` "<device>" exit fi get_slid "$1" if [ "$?" -ne 0 ];then echo "Error!" else echo "$1: $SL_ID" fi
По многочисленным просьбам одного читателя, наслаждайся.
Меня спрашивают, а где на практике можно применить «номер буквы в алфавите», про получение которого в bash-скрипте было недавно написано. Вот пример такого практического применения. Известно, что в Linux дисковые устройства представлены в виде /dev/sda
, /dev/sdb
, /dev/sdc
и т.д., а разделы диска в виде /dev/sda1
, /dev/sda2
…
SYSLINUX, точнее его модуль chain.c32
, который может передавать управление другим загрузчикам, использует другой формат:
hdD P
где:
D
— номер устройства (диска) в BIOS
P
— номер раздела на диске
Отсчет дисков ведется с 0, разделов — с 1 (0 — главная загрузочная запись диска)
Например, hd0 2
— загрузка должна производиться со 2 раздела первого диска, hd1 1
— с 1 раздела второго жесткого диска, hd3 0
— необходимо передать управление главной загрузочной записи (MBR) четвертого диска.
Вот часть конфига syslinux.cfg
, где chainloading используется для загрузки Windows со второго раздела на первом жестком диске:
LABEL windows menu label Microsoft Windows 7 kernel modules/chain.c32 append hd0 2
— Минус, связанный с BIOS. Если вдруг порядок устройств в BIOS поменяется, то загрузчик SYSLINUX «заблудится» и попытается передать управление не туда.
— Некоторые линуксы меняют порядок именования жестких дисков, т.е. /dev/hda
может и не соответствовать первому загрузочному диску. Тут уже зависит от конкретного дистрибутива.
Первый минуса можно избежать, используя вместо номера диска MBR ID, но это уже тема для отдельной заметки.
chain.c32
Я организовал это в отдельной функции get_sysl_hd()
, чтобы было удобно утащить в другой скрипт, буде понадобится. Первый параметр функции — имя устройства, например, /dev/sda1
1. Получаем имя устройства без пути к нему.
T_DN=`basename $1`
2. Можно проверить, соответствует ли имя устройства формату имени дисков, а то вдруг нам CD-ROM подсунули 🙂
Имя диска начинается с первой буквы s
или h
на некоторых пожилых дистрибутивах, далее следует буква d
, далее — латинская буква a-z
, потом могут следовать цифры (номера разделов). Можно сообразить вот такое простенькое регулярное выражение:
^[sh]d[a-z][1-9]*$
Далее пропускаем результат работы basename
через grep
, и проверяем выхлоп в переменной. Если переменная пустая, подсунули что-то не то.
T_DN=`basename $1|grep '^[sh]d[a-z][1-9]*$'` if [ -z "$T_DN" ]; then return 1 fi
Но на самом деле, эта проверка не очень-то и нужна, можно пропустить этот пункт
3. Получаем третью букву в имени диска с помощью команды expr
:
expr substr pos len
где:
substr
— операция получения подстроки
pos
— позиция символа в строке (отсчет ведется с единицы)
len
— длина подстроки
T_3LET=`expr substr $T_DN 3 1`
4. Получаем номер буквы в алфавите. Я воспользовался вторым копия из ранее описанных способов.
S_CODE=`printf '%d' \'$T_3LET`
A_CODE=`printf '%d' \'a`
SYSL_ID="hd"`expr $S_CODE - $A_CODE`
5. Получим номер раздела, удалив sed
‘ом все латинские буквы с начала имени устройства в переменной $T_DN
:
T_VOLNUM=`echo "$T_DN" | sed 's/^[a-z]*//'` if [ -z "$T_VOLNUM" ]; then T_VOLNUM=0 fi
Если переменная окажется пустой, значит нам подсунули устройство, без указания раздела — необходимо сослаться на MBR. Присваиваем T_VOLNUM
значение 0
.
6. Добавляем полученные данные в переменную SYSL_ID
SYSL_ID="$SYSL_ID $T_VOLNUM"
7. Пример вызова функции:
if [ -z "$1" ]; then echo "Use "`basename $0` "<device>" exit fi get_sysl_hd "$1" if [ $? -ne 0 ];then echo "Bad device name!" else echo "$1: $SYSL_ID" fi
В околошкольной крипипасте:
сжечь ему эту погонь
Интересно, кого полагалось сжечь, местного военкома, или даже целого министра обороны?
За «погонью» идет ее сестра «серень», наверное, весьма зловонное растение.
На участке бабушки вовсю цвела серень
И, наконец, финалист нашего сегодняшнего хит-парада, мужыкальный, прям-таки инструмент из теста по музыке — сексофон.
Как у поэта Лесина о природе зла/добра.
Стою в магазине я, в очереди на кассу, пробиваю себе вкусный бич-пакет Биг-Бон, нравятся они мне очень.
По передо мной стоит «сердобольная» тетушка, из серии тех проклятых «сердоболов», которые будут поудобнее укладывать человека с переломом основания черепа до приезда скорой, вызывать скорую мирно отдыхающему пьянице, или рассказывать про вред ГМО и прививок, ежили их, наконец, догнало мракобесие в терминальной стадии.
— Вот зачем вы эту гадость покупаете, в этих бич-пакетах одна химия! Купите лучше макарон простых!
— Женщина, милая, вот вы приходите домой, включаете свет. Так вот, в лампочке — физика! Если у вас телефон с компьютером есть — в них математика и ее подруга информатика, а у вас самой внутри — биология. Если дома есть кот, то сразу две биологии в одной квартире! Знаете, жить вообще страшно, куда ни плюнь, везде какая-нибудь наука…
Один из немногих моментов, когда я узрел подтверждение гипотезы, что человек, однако, своего рода компьютер. Я увидел BSOD в реальности. А у кассирши, явный перегруз модуля «корпоративной вежливости».
Вот еще одно решение задачи про номер буквы в латинском алфавите (это подойдет и для русского, нужно просто изменить паттерн). Решение не очень красивое, зато дико простое.
#!/bin/bash
alf="abcdefghijklmnopqrstuvwxyz" #переменная, хранящая паттерн
b=`expr index $alf $1`
echo "$1 is $b"
Чтоб нумерация начиналась с 0, меняем строку
b=`expr index $alf $1`
на
b=`expr index $alf $1 - 1`
Примечание: параметр index
команды expr
позволяет получить индекс строковой последовательности: index <где_найти> <что_найти>
1. С помощью операторов for
и if
Копия
2. С помощью printf
Копия
В комментариях предложили более элегантное решение этой задачки.
#!/bin/bash
code=`printf '%d' \'$1`
a_code=`printf '%d' \'a`
answer=$( expr $code - $a_code )
echo $answer
1. printf
— команда, выводящая текст (обычно на экран), с учетом заданной форматирующей строки. Подробнее о команде printf
можно почитать в источниках, а вообще башевский printf
, является аналогом printf
из C++, и ее рекомендуют для замены древней команды echo
в bash-скриптах.
Первым параметром является строка, описывающая формат, в данном случае '%d'
означает, что нужно вывести десятичное число.
Второй параметр — выводимая строка.
Перед вторым параметром добавляется символ ‘ (одна одинарная кавычка): Интерпретируется как кодовый номер этой буквы в текущей кодировке [1], одинарную кавычку экранируем символом \
.
Таким образом, в переменной code
окажется код первого символа из первого параметра командной строки скрипта.
2. Далее, таким же образом, получаем код первой буквы в алфавите.
3. В итоге, получаем номер буквы в алфавите, посчитав выражение с помощью оператора expr
[2]
1. Этот код не будет работать на некоторых довольно странных устройствах, где кодовая таблица латинского алфавита представляет собой перемежающиеся заглавные и строчные буквы: AaBbCcDd и т.д. (или aAbBcCdD…)
2. Чтобы отсчет букв шел с единицы, необходимо изменить выражение answer=$( expr $code - $a_code )
на
answer=$( expr $code - $a_code + 1 )
3. С кириллицей этот способ не сработает, используйте предыдущий
По вкусу можно добавить проверки, как в предыдущем скрипте.
Можно сказать, что номерследующий N-ART за 2019 г.
Джва года ждал этой картинки. Нарисовано вручную, и так, скорее всего, пойдет без изменений на новую футболку #2. Разве что текст добавлю.
Остальные файлы здесь
Вопрос был задан студенту-первокурснику преподом на зачете по Linux. Студент на вопрос не ответил и вчера ушел на пересдачу, впрочем, задав вопрос мне. Думаю, формулировка задания понятна. Я, кстати, сначала тоже запарился, и начал выдумывать всякие дикие варианты с получением кода символа, преобразованием кода символа в номер буквы латинского алфавита, потом подумал, что иметь секс с локалью (разбирайся еще, юникод не юникод) не стоит, и родил вот такое простое решение с помощью цикла for
и оператора if
.
Нужную букву будем брать из параметра командной строки скрипта.
#!/bin/bash #get number of latin letter in alphabet #use nlett <letter>, e.g nlett a SNUM=1 for SYMB in {a..z}; do if [[ "$SYMB" == "$1" ]]; then break else let "SNUM=SNUM+1" fi done echo "$1 is $SNUM"
Перебираем в цикле все буквы от a
до z
, нашли нужную — выводим номер, не нашли — увеличиваем счетчик $SNUM
.
Чтобы отсчет шел с 0
, просто присваиваем начальному значению счетчика 0
:
SNUM=0
Чтобы пользователь не ввел ничего лишнего, а только маленькую латинскую букву, можно добавить проверку перед циклом for
:
SFND=`echo $1|grep '^[a-z]$'` if [ -z "$SFND" ]; then echo "Error: in first parameter must be one small latin letter!" exit 1 fi
И заменить в цикле и далее $1
на $SFND
.
Есть и более элегантное решение.
Почему-то много написано, про то, как относительный путь преобразовать в абсолютный, или же получить абсолютный путь к текущему каталогу, а как получить относительный путь из одного каталога в другой, еле нашел.
Скажем, есть 2 каталога, известны полные пути:
/tmp/test/dir1/subidr1/startpoint
и /tmp/test/dir2/subdir2/endpoint
, надо получить относительный путь из каталога startpoint
в каталог endpoint
Проще всего получить относительный путь командой realpath
со следующими параметрами:
realpath --relative-to="ОТКУДА" "КУДА"
где:
ОТКУДА
— стартовый каталог
КУДА
— конечный каталог
Выполнение команды
realpath --relative-to="/tmp/test/dir1/subidr1/startpoint" "/tmp/test/dir2/subdir2/endpoint"
выведет на экран относительный путь:
../../../dir2/subdir2/endpoint
Если каталог не существует, будет отображена ошибка:
realpath: /tmp/test/dir2/subdir2/endpoint: No such file or directory
Утилита realpath
входит в пакет coreutils, поэтому есть везде, кроме старых и совсем урезанных дистрибутивов:
#!/bin/bash
#get relative path example
#start path: /tmp/test/dir1/subidr1/startpoint
#end path: /tmp/test/dir2/subdir2/endpoint
START="/tmp/test/dir1/subidr1/startpoint"
END="/tmp/test/dir2/subdir2/endpoint"
mkdir -p "$START"
mkdir -p "$END"
cd "$START"
echo -n "Start directory:"
pwd
RP=`realpath --relative-to="$START" "$END"`
echo "Relative path: $RP"
echo "CD to relative path:"
cd "$RP"
echo -n "End directory:"
pwd
qaru.site — там предлагаются и другие способы, разной степени велосипедности, например, использовать Python или получать относительный путь исключительно средствами оболочки (на мой взгляд, неудобно, и можно где-нибудь накосячить).