Линукс и DevOps Дни
2.1K subscribers
108 photos
8 videos
194 links
Самобытно про разработку, devops, linux, скрипты, тестирование, сисадминство, техдирство, пиэмство и за айтишную жизу.
Download Telegram
Сегодня про RANDOM и револьвер

В бородатые 2000е была такая консольная игруля «Русская рулетка», состояла она из одной строчки:

[ $[ $RANDOM % 6 ] == 0 ] && rm -rf / || echo "You live"


Для начала давай сделаем её более безопасной:

[ $[ $RANDOM % 6 ] == 0 ] && echo 'You died' || echo 'You live'


Суть такая: Если деление по модулю псевдослучайного числа переменной RANDOM вернёт - 0, значит тебе песда и пистолет выстрелил. Соответственно если > 0, то ты пока еще жив и тебе повезло.

А теперь давай посмотрим на условия, при которых «пистолет выстрелит» сразу.

Число отличное от 0, указанное в качестве переменной RANDOM используется как seed (семя) для генератора псевдослучайных чисел.

Если посеять число 2, то при первом обращении к переменной RANDOM получим значение, которое делится на 6 без остатка.

RANDOM=2  
[ $[ $RANDOM % 6 ] == 0 ] && echo 'You died' || echo 'You live'


Этот посев даст нужное в разных версиях интерпретатора. Все дело в том, что в версии bash 5.1 были внесены изменения связанные с этим. Короче если у тебя версия баша > 5.0, то можно изменить поведение генератора с помощью переменной BASH_COMPAT.

Переменная BASH_COMPAT в оболочке Bash используется для указания совместимости с предыдущими версиями Bash. Если установить ее на определенное значение, это может изменить поведение Bash так, чтобы оно соответствовало определенной версии.

Например, если вы установите BASH_COMPAT=3.2, то это означает, что текущая оболочка Bash будет работать совместимо с версией 3.2. Это может быть полезно, если у вас есть скрипты, которые были написаны для старых версий Bash и вы хотите, чтобы они продолжали работать в новых версиях без изменений поведения.


Так, давай теперь это проверим:

( BASH_COMPAT=51 ; RANDOM=0 ; echo $RANDOM )


Получаем значение: 20814

( BASH_COMPAT=50 ; RANDOM=0 ; echo $RANDOM )


А тут уже другое: 20034

Если мы задаем 0 в переменную RANDOM, тогда семя (seed) инициализируется жестко заданным значением. При котором генерируется требуемое число, то есть делится на 6 без остатка.

RANDOM=0  
[ $[ $RANDOM % 6 ] == 0 ] && echo 'You died' || echo 'You live'


Тут пистолет гарантированно выстрелит. Аналогично предыдущему примеру, если начало строки не число:

RANDOM='bashdays'  
[ $[ $RANDOM % 6 ] == 0 ] && echo 'You died' || echo 'You live'


Снова получим 100% выстрел.

✔️ Как работает генератор:

- Начальное значение seed, оболочка получает совершая манипуляции над значениями pid, ppid, uid + текущие время (секунды, микросекунды).

- Далее полученное значение пропускается через алгоритм, а результат сохраняется. При следующих обращениях также пропускается через алгоритм.

- Потом полученное число усекается. В документации указано максимальное возможное значение 32367.

Как я писал выше, руки у нас развязаны и мы можем влиять на начальное значение генератора через переменную RANDOM.

Такие дела, исследуйте!

tags: #bash #linux

@ВАSНDАYS | BАSHDАYS.CОM
Хотели в детстве сыграть в «Самый умный»?💡
Реализуйте мечту в IT-квизе


Активируйте Telegram-бота и проверьте свои знания сразу в восьми темах:

▫️ Дата-центры и железо
▫️ Разработка и soft skills
▫️ ИБ и сети
▫️ Kubernetes и ML

Отвечайте на технические вопросы каждый день и побеждайте в мини-играх — за каждый верный ответ начислим баллы. Игроки с самым высоким рейтингом получат крутые подарки от Selectel. Старт с 22 апреля.

Перейти в бота → https://slc.tl/6evat

Реклама ООО «Селектел» erid 2VtzqvpmxJc
🔤🔤🔤🔤🔤🔤🔤🔤🔤

shopt -s extglob; : "${PS1}"; : "${_//$'\x01'+([^$'\x02'])$'\x02'}"; : "${#_}"; printf '%b' "\e#8\e[$(((LINES-1)/2));$(((COLUMNS-_)/2))H"


tags:
#bash

@ВАSНDАYS | BАSHDАYS.CОM
⚡️ Появление технологической базы ПО отечественных вендоров и рост приложений, использующих алгоритмы на основе ИИ, — одни из главных трендов 2023 года. А что еще?

Мы опросили 800+ ИТ-специалистов, включая топ-менеджеров компаний, чтобы понять, как за год трансформировался отечественный рынок DevOps. Упаковали все это в отчет, который сейчас можно бесплатно скачать по ссылке.

📊 Из отчета вы узнаете:
- как российские компании преодолевают технологические и кадровые вызовы;
- планы и прогнозы развития рынка DevOps в ближайшем будущем;
- актуальные вопросы безопасной разработки (DevSecOps);
- в каком состоянии кадровый рынок DevOps.

Наши партнеры: МТС, IBS, Яндекс, Лаборатория Касперского, а также НИУ ВШЭ, ИСП РАН и ЭКОПСИ Консалтинг.

Забирайте ежегодный отчет по ссылке.

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

Поддержи подпиской и лайком! Спасибо!👇

https://youtu.be/gTwpoAaB_dY
Привет, это Девопс фабрика! Мы обучаем желающих перейти в DevOps.

Приглашаем на МОК интервью по DevOps! Сделаем бесплатно для первых десяти человек.

МОК интервью - это отличный способ подготовиться к реальным собеседованиям и проверить свои знания в дружелюбной обстановке.

Что вас ждет?

- Реальные вопросы от лидов, проводивших сотни собеседований по DevOps.
- Подробная обратная связь по вашему собеседованию и рекомендации по улучшению.
- Опыт, который поможет вам стать увереннее и легче пройти реальное собеседование.
- Внимательное и дружелюбное отношение, все проводится спокойно и без стресса :)

Посмотреть видео предыдущих интервью и записаться можно по ссылке в канале

Реклама. ООО «Байкалтим», ИНН: 3851008933, erid: 2Vtzqx3bUA5
Официальные тренинги по Zabbix на русском языке от Галс Софтвэр

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

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

Zabbix Certified Specialist (ZCS) 3-7 июня 2024 года (оффлайн + онлайн)

Zabbix Certified Professional (ZCP) 1-3 июля 2024 года (оффлайн + онлайн)

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

Задать вопросы и получить дополнительную информацию вы можете у или по запросу на welcome.com.
Тут у безопасников жопы сгорели после предыдущего поста.

Нужно ли на приватный ssh ключ устанавливать пароль?


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

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

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

Удобно? Охуенно удобно! Главное практично.

Я всегда считал и считаю, что ssh ключи нужны, чтобы заходить на сервера без пароля. Нахуя ты тогда отключаешь возможность логина по паролю и оставляешь ключ к которому нужно вводить пароль?

Добавь тогда уж туда еще один фактор авторизации через QR код и Яндекс.Ключ. Лишним не будет 😲

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

На встрече Алексей Подольский, инженер внутренней разработки в Cloud․ru, расскажет, как безболезненно объединить кластеры Kubernetes, оптимизировать инфраструктуру и повысить безопасность трафика внутри кластера.

На вебинаре вы узнаете:

▪️ как сделать процесс объединения более простым и комфортным — 4 основных условия;
▪️ какие этапы объединения кластеров Kubernetes можно выделить;
▪️ как не только объединить несколько архитектурных решений, но и оптимизировать инфраструктуру и снизить стоимость ее обслуживания;
▪️ как усилить безопасность периметра с помощью тонкой фильтрации трафика;
▪️с какими проблемами можно столкнуться на этапе миграции и как их лучше решать.

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

Веб...
Привет, сегодня коротко, очередная внеплановая пятница. Короче в продолжение к постам про повышение привилегий.

Если звезды сошлись (suid/guid и прочая хуйня), то через vim ты можешь получить интерактивный root shell.

Делается так:

vim -c ':!/bin/sh'


Или так:

vim --cmd ':set shell=/bin/sh|:shell'


На выходе тебе выплюнет доллар ($) ну и там уже бесоёбишь.

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

И если в этом списке есть vi/vim, то ты ничем не ограничен. Запускаешь полноценный shell через vim и развлекаешься. А порой можно дотянутся и до папки /root и всего остального. Было бы желание 🥳

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

Давай, хороших выходных! Я пожалуй тоже устрою себе внеплановый отпуск на пару дней. Увидимся!

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

tags: #linux #security #utils

@ВАSНDАYS | BАSHDАYS.CОM
This media is not supported in your browser
VIEW IN TELEGRAM
Майские праздники равносильны новогодним, уже на третий день начинаешь деградировать и превращаться в обезьяну. После таких затяжных выходных, нужно еще пару недель, чтобы вернуться к нормальной жизни.

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

✔️ Называется Atuin — Magical shell history.

Если коротко, эта тулза заменяет стандартный поиск в командной строке по ctrl+r на красивенький и достаточно удобный.

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

По сути у тебя одна общая история на нескольких машинах. Очень удобно если бегаешь между ноутом и стационарным компом.

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

Все в лучших традициях selfhosted. Мануал по установке сервера. Через docker-compose за пару минут все расчехляется.

Кстати если нажать стрелочку вверх, сработает триггер и откр
...
Сегодня за девопс, gitlab и как сделать комфортный pipeline с выпадающими списками Variables + Бонусы.

Из коробки, когда ты жмешь кнопку Run Pipeline, тебе нужно руками вбивать нужные Variables, например, чтобы указать окружение, в которое будет раскатан релиз.

Каждый раз вбивать руками Variable ENVIRONMENT=stage / production ну пиздец тяжко и неудобно. А если таких переменных овердохуя, то всё желание пропадает что-то делать.

Хочется чтобы был выпадающий список со всеми параметрами. Накликал мышкой и в продакшен.

Выпадающие списки можно делать не только с окружениями, но и добавить банальные вопросы YES/NO и прочее. А затем в секции rules уже все это разруливать и обрабатывать.

✔️Ниже базовая болванка

Создаем файл .gitlab-ci.yml в корне проекта и добавляем в него:

variables:
ENVIRONMENT:
value: "N/A"
options:
- "N/A"
- "STAGE"
- "PRODUCTION"
description: "Deployment environment"

.stage_server:
&stage_server
WEB_NODE: "xx.xx.xx.xx"
DB_NODE: "xx.xx.xx.xx"

.production_server:
&production_server
WEB_NODE: "xx.xx.xx.xx"
DB_NODE: "xx.xx.xx.xx"

deploy:
tags:
- common-runner
script:
- echo $ENVIRONMENT
- echo "build & deploy here"
rules:
- if: '$ENVIRONMENT == "STAGE"'
variables:
<<: *stage_server
- if: '$ENVIRONMENT == "PRODUCTION"'
variables:
<<: *production_server


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

N/A (выбран по умолчанию) добавлено для дураков, которые ничего не выбирают и сразу тыкают Run Pipeline. В таком случае пайплайн зафейлится и ничего не пострадает.

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

Ну и основная секция deploy, у меня указан раннер с тэгом common-runner, а потом полезная нагрузка которая будет выполнена.

В секции rules зашита логика. В зависимости от того, какое окружение было выбрано из выпадающего списка, применяются настройки либо от stage, либо от production. Короче инклудится нужное.

Собственно всё. Если нужно добавить еще каких-то выпадающих списков, добавляем в первую секцию всё необходимое, аналогично ENVIRONMENT. Ну и потом в rules все это обрабатываем. Например, так:

- if: '$JOB == "YES" && $ENVIRONMENT == "STAGE"'


В общем всё элементарно. По итогу получаем незамысловатый пайплайн, всё в одном месте и ничего не раскидано по самому gitlab.

Бонусы. Да, если нужен общий пайплайн для нескольких проектов, делаем так:

Создаем репу dev/pipelines, кидаем туда файл .gitlab-ci.yml, настраиваем в нем всё под свои реалии.

Дальше в нужных проектах добавляем файл .gitlab-ci.yml с таким содержимым:

include:
- project: "dev/pipelines"
file: ".gitlab-ci.yml"


Всё, теперь не надо плодить кучу .gitlab-ci.yml с одинаковым содержимым, все инклудится из одного места. Ну и если нужно что-то поменять, меняем один раз и все проекты автоматически это подхватывают.

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

Хорошего тебе дня, увидимся!

tags: #devops

@ВАSНDАYS | BАSHDАYS.CОM
Java — один из самых популярных языков программирования, который используют разработчики для создания игр и приложений. Если вы давно мечтаете попробовать себя в этой сфере, скорее записывайтесь на мини-курс по Java-разработке. Подойдёт новичкам разного возраста, а ещё это полностью бесплатно!

Регистрируйтесь: https://epic.st/0gaPiE?erid=2VtzqvfS5WZ
🎉 И получите первый подарок — гайд по профессии Java-разработчика.

Что будем делать на мини-курсе:

🔹 Обсудим, почему Java — один из самых востребованных языков
🔹 Познакомимся с кодом Java и рассмотрим ключевые элементы приложений на этом языке
🔹 Определим навыки для трудоустройства
🔹 Сравним Java и Python
🔹 Сделаем Java-приложения по инструкции

Формат мини-курса отлично подойдёт для обучения из любой точки мира: смотрите видео в удобное время и закрепляйте навыки на практике.

Успейте записаться бесплатно!

Реклама. ЧОУ ДПО «Образовательные технологии «Скилбокс (Коробка навыков)», ИНН: 9704088880
Люди любят жаловаться на жизнь, а когда предлагаешь обратиться к психологу — это «дорого», «некогда», «я им не доверяю».

Кому действительно важно разобраться в себе и изменить жизнь, видит возможности, а не препятствия

Первый шаг к решению проблемы — это её осознание. В этом может помочь канал доказательного врача-психиатра и психотерапевта , через терапевтические тексты которого можно поработать над:

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

Реклама. Ковалев К.И. ИНН: 325502816794
Чипи-чипи, чапа-чапа. Привет, на скрине 🚫некий Linux бедолага очень обрадовался, когда нашел пасхалку в команде date. Этакий нигде недокументированный аргумент.

date --iso=seconds


Ну да, если запросить help либо глянуть в гуглах, такая конструкция нигде не упоминается.

Молодец чо. НО, если бы он знал про функцию getopt_long, то вряд ли сделал открытие. Ща расскажу в чем прикол.

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

Функция getopt_long входит в состав пакета GNU C (glibc)


Собственно вот оригинальная команда:

date --iso-8601=seconds


Но если пропустить её через getopt_long, получим ту самую «пасхалку»:

date --iso=seconds


✔️ Еще примеры для понимания:

1. nano --smart --book
2. ls --hyper --show
3. du --one --human --sum


1. --smarthome --bookstyle
2. --hyperlink --show-control-chars
3. --one-file-system --human-readable --summarize


Понял в чем прикол? Но это еще не всё!

Утил...
Скидка 20% на комплект сервисов: Managed Kubernetes, объектное хранилище S3 и облачные базы данных

Запускайте и развивайте веб-проекты любой сложности с помощью отказоустойчивых и масштабируемых сервисов Selectel. До 30 июня подключите три сервиса и пользуйтесь ими со скидкой 20%. Скидка не ограничена по времени и действует, пока вы используете все три сервиса.

Преимущества PaaS-сервисов в Selectel:

◽️ Быстрый запуск, отказоустойчивость и легкое масштабирование.

◽️Вы можете размещать и хранить персональные данные пользователей по закону, ведь сервисы соответствуют 152-ФЗ.

◽️Для того, чтобы развернуть проект в удобной панели my.selectel достаточно несколько кликов.

Переходите по ссылке, что зарегистрироваться и подключить сервисы со скидкой: https://slc.tl/ycean

Реклама ООО «Селектел» erid 2VtzquePgc2
Упоримся? А давай!

Открывай терминал с башем и запускай команду:

while :; do cat /etc/hosts ; done | grep -m1 'a'


По идее тут что-то вроде бесконечного цикла, который будет cat’ить на экран файл hosts, предварительно грепнув содержимое по символу «a».

Аргумент -m1 = выход после первого вхождения искомой подстроки. После этого, конец канала закрывается для чтения.


Запустил? И всё зависло! По крайней мере у меня вывелась только одна строчка вида:

127.0.0.1 localhost bashdays


Но почему оно зависло? А потому, что утилита cat при попытке записать данные в сломанный канал, завершается сигналом.

✔️ Давай убедимся:

set -o pipefail
cat /etc/hosts | exit 0
echo $(( $? > 128 ? $? - 128 : $? ))


Получаем цифру 13. Откуда она взялась? Смотри! Если команда завершается сигналом, тогда статус ошибки ($?) == 128 + Номер сигнала.

А дальше вычитаем, делим, умножаем, корень квадратный вычисляем, заводим в дискриминант по синусу. Пеню. Короче получили цифру 13.

Более подробно про сигналы мы с тобой разбирали в этом посте.

Давай посмотрим, что такое 13:

kill -l 13


Вывелось PIPE, что равносильно SIGPIPE (Broken Pipe). Ага!

Получается что наш бесконечный цикл постоянно запускает утилиту cat, которая тут же завершается.

Раньше эта ситуация была очевидна и на экран выводилась ошибка. А вот с версии Bash 3.1-alpha1 это пофиксили, вот выжимка из спеков:

This document details the changes between this version, bash-3.1-alpha1,
and the previous version, bash-3.0-release.

By default, the shell no longer reports processes dying from SIGPIPE.


Нахуй так сделали, непонятно, скорее всего ушли в сторону set pipefail, типа кому надо тот включит, чтобы лишнее гавно на экран не сыпалось.

Ладно. После запуска этого бесконечного цикла, можешь запустить htop и визуально глянуть как порождается бесконечное количество процессов, растет счетчик PID. А как только выработан лимит PID, пиды начинают использоваться повторно. В общем это хорошо видно.

Ну либо так можно глянуть:

ps --no-headers --sort=pid -eo pid


Увидишь большую разницу между значениями PID.

Теперь как это пофиксить. Если уж захотелось упороться, нужно упарываться правильно.

Вот несколько вариантов:

while : ; do cat /etc/hosts || { echo $? >&2 ; exit; } ;done | grep -m1 'a'
while : ; do cat /etc/hosts || break ; done | grep -m1 'a'
while : ; do cat /etc/hosts || exit ; done | grep -m1 'a'


Если присмотреться, может возникнуть вопрос — а откуда выходит exit? Цикл выполняется в подоболочке, потому что является участником канала.

Давай проверим:

while : ; do cat ; done | grep -m1 'a' &


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

А такое не позволительно фоновым процессам, поэтому такие задания будут приостановлены.

Проверяем, что оно действительно приостановлено:

jobs -l

[1]+251913 Stopped (tty input) while :; do
cat;
done
251921 | grep --color=auto -m1 'a'


Ну и теперь смотрим, кто есть кто:

ps --forest -o pid,ppid,stat,comm

PID PPID STAT COMMAND
251893 251854 Ss bash
251913 251893 T \_bash
251924 251913 T | \_cat
251921 251893 T \_grep
251962 251893 R+ \_ps


Процесс 251913/251893 и есть подоболочка, в котором крутится наш цикл. Вот с этой подоболочки и выходит exit.

Сложно? Да не… азы с некоторыми нюансами. Изучай!

tags: #linux #bash

🔔
Привет. В Linux есть утилита basenc, которая входит в состав пакета coreutils. С помощью неё можно конвертировать данные в двоичный формат. Это который 00110010.

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

А всё просто, давай закодируем название деревни:

echo 'пиздачосово' | basenc -w16 --base2msbf


По итогу получаем набор 0 и 1. Ключ -w16 я указываю, чтобы выводить по 16 символов в строке. Для удобства. Так как русские символы кодируются двумя байтами.

✔️ Вывод получился таким:

1101000010111111
1101000010111000
1101000010110111
1101000010110100
1101000010110000
1101000110000111
1101000010111110
1101000110000001
1101000010111110
1101000010110010
1101000010111110
00001010


А почему в последней строке какой-то обрубок?

Это не обрубок, это 8 бит! И эти 8 бит == символу новой строки, который закодирован одним байтом, о чем нам говорит левый бит первого и единственного октета (00001010).

А декодируется всё это безобразие так:

str="1101000010111111110100001011100011010000101101111101000010110100110100001011000011010001100001111101000010111110110100011000000111010000101111101101000010110010110100001011111000001010"

echo $str | basenc -d --base2msbf


Просто указываем ключ -d и вуаля!

Если тема интересна, можешь почитать более подробно про кодирование UTF-8 здесь.

Вага-вага!

Сегодня чуть позже (16:00 МСК) залетит еще один партнерский пост, но это будет не просто рекламная интеграция.

Ниже я сделаю кнопку (в 16:02 МСК). Нажав на нее ты сможешь выиграть 1 бесплатный купон на неплохую онлайн конфу. Всего будет 3 таких купона. Всю эту кухню контролирую лично я, поэтому наёба тут нет.

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

Короче если интересно, не пропусти. Давай, хорошего дня!

tags: #linux #bash

🔔
Масштабирование задач и высокая производительность с Immers.cloud

Друзья, мы являемся одними из ведущих поставщиков IaaS услуг в России, специализирующийся на использовании GPU. На нашем сайте представлен широкий выбор видеокарт для обучения и инференса нейронных сетей, включая в свой арсенал такие мощные модели, как Н100 и А100 на 80 Gb с NVlink.

Мы закрепляем физические ядра процессора и графические адаптеры только за одним клиентом.

Это значит, что:

🌳 Ядра процессора будут доступны на 100% процессорного времени;
🌳 Выбранный графический ускоритель будет зарезервирован только за вашим сервером;
🌳 Вы получите высокую производительность при работе с системой хранения.

Тестирование виртуальных серверов с сетевыми загрузочными дисками показывает до 70 000 IOPS на случайные операции чтения и до 60 000 IOPS на случайные операции записи.

Вы можете быть уверены, что арендуемые CPU и GPU используются только вашим виртуальным сервером.

Заинтересованы? Давайте обсудим, как наш сервис может стать решением ваши...
Если испытываешь проблемы с написанием постов, есть пиздатый лайкфак!

Открываешь свой любимый редактор и пишешь — Короче блядь!


А далее пост пишется на одном дыхании. Кстати этот способ отлично работает для всяких документаций, планирования спринтов и т.п.

Ну чо — Короче блядь. Пятничная математика!

Массив bin содержит 256 восьмиразрядных числа в двоичной системе счисления.

bin=({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1})


Особенность этого массива — значение любого элемента массива, соответствует индексу элемента в двоичном представлении. Таким образом перевод числа из десятичной в двоичную систему счисления, сводится к заданию числа (дес) в качестве индекса.


echo ${bin[101]}


Получаем: 01100101

Количество разрядов двоичного числа (длина любого индекса)

echo ${#bin[0]}


Получаем: 8

Количество двоичных чисел (длина массива)

echo ${#bin[@]}


Получаем: 256

Разрядность можно регулировать количеством списков начиная с {0..1}{0..1}. Но будь очень осторожен, память не резиновая!

✔️ Раз зашел разговор за память...

echo $((2**63))


Иииииии… Получаем по ебалу: -9223372036854775808

А почему так? Минус каким хером тут? А все правильно!

Эта ситуация называется — Целочисленное переполнение. И оно НЕ отслеживается в Bash!

Про Целочисленное переполнение читай тут


help let


Начиная с версии 2.05b-alpha1 используется тип intmax_t.

This document details the changes between this version, bash-2.05b-alpha1, and the previous version, bash-2.05a-release.

The shell now performs arithmetic in the largest integer size the machine supports (intmax_t), instead of long.


Ну и смотрим маны:

man 7 system_data_types


Давай затестим:


echo "Дипазон: От $((2**63)) до $((2**63-1))"


У меня такое: -9223372036854775808 до 9223372036854775807

Это границы для положительных и отрицательных чисел.

Чо еще…

Перевод из двоичной системы счисления в десятичную.

echo $(( 2#1000 ))


Получаем: 8

В арифметических операциях Bash можно задавать систему счисления.

echo $(( 2#1000 + 2#1000 ))  
let dec=2#0001
echo $dec


В общем случае в данных конструкциях не обязательно указывать знак $ перед именем переменной. Но при указании системы счисления это всё же нужно.

bin=0011  
echo $(( 2#$bin ))


Получаем: 3

Наверное на этом всё, если есть что добавить, пиши в комменты. Хороших тебе предстоящих выходных и береги себя!

tags: #bash #linux

🔔