MYCSS

2025-03-23

🚀 Docker-Compose Generator for ElasticSearch Cluster

Are you tired of manually configuring docker-compose.yml files for Elasticsearch clusters? Say hello to this easy-to-use Python script that automates the process! 🐍

📌 What it does:

This script generates a docker-compose.yml file for setting up an ElasticSearch cluster using template files and environment variables. It creates a cluster with Docker containers, including:

  • ElasticSearch nodes with different roles (master, data, ingest, coordinator)
  • Kibana for visualization
  • Additional service containers

🔧 How it works:

  • Configure your cluster setup using a .env file.
  • Run the script, and voilà! Your docker-compose.yml is ready.

📶 Test Environment:

The generated cluster was tested on a TrueNAS SCALE 24.10.2 server, deployed as a custom application by importing the YAML file. Storage was configured using ZFS Datasets, ensuring reliability and scalability.

💡 Why it’s awesome:

  • Saves time and reduces errors in manual configuration.
  • Flexible and customizable for different cluster setups.
  • Perfect for DevOps engineers and developers working with ElasticSearch.

🔗 Script: https://github.com/lexxai/es_cluster_docker_helper
🔗 Prototype: https://github.com/evermight/elastic-cluster-docker-compose

2025-03-17

Google Learning path: "Machine Learning Engineer Learning Path" - Completed

Нарешті в останній день дії кредитів на навчання отримав сертифікат "Responsible AI for Developers: Privacy & Safety" від Google, чим і завершив довгий, з вересня 2023, Google Learning path: "Machine Learning Engineer Learning Path".

 

Responsible AI for Developers: Privacy & Safety


Progress "Machine Learning Engineer Learning Path"  

Machine Learning Engineer Learning Path


Machine Learning Engineer Learning Path

A Machine Learning Engineer designs, builds, productionizes, optimizes, operates, and maintains ML systems.

21 activities 

A Machine Learning Engineer designs, builds, productionizes, optimizes, operates, and maintains ML systems. This learning path guides you through a curated collection of on-demand courses, labs, and skill badges that provide you with real-world, hands-on experience using Google Cloud technologies essential to the ML Engineer role. Once you complete the path, check out the Google Cloud Machine Learning Engineer certification to take the next steps in your professional journey.



2025-03-04

Proxmox VE, firewall, nf_conntrack_max, nf_conntrack_count

Є Hypervisor, Proxmox VE з ввімкненим firewall на рівні Proxmox, через те, що запущені VM з Proxy сервером "Squid", і бажано обмежити доступ до потенційного доступу до локальної мережі.

Але за великої кількості підключень спрацьовують  обмеження на кількість одночасних сесій підключень.

Proxmos VE, Shell, dmesg
Для стандартних рішень з Ubuntu є змінна файлу з додавань певних рядків у  /etc/sysctl.conf, але усі значення перевизначаються і бачимо постійно значення за замовчуванням.

Not help, /etc/sysctl.conf
Але знайшов давній пост де є пропозиція використати налаштування GUI Proxmox. І це допомогло.
Proxmox VE, GUI, Node, Firewall. Options. nf_conntrack_max

Моніторинг значень - nf_conntrack_count: "watch -n 1 "cat /proc/sys/net/netfilter/nf_conntrack_count"

watch -n 1 "cat /proc/sys/net/netfilter/nf_conntrack_count"

 

2024-12-26

Нотатка. Python. functools.partial.

🔨 functools.partial(func, /, *args, **keywords)

functools.partial

📍 Повертає новий частковий об’єкт, який під час виклику поводитиметься як func, що викликається з позиційними аргументами args і ключовими аргументами keywords. Якщо до виклику надається більше аргументів, вони додаються до args. Якщо надаються додаткові ключові аргументи, вони розширюють і замінюють ключові слова.

📌 Примітка. Більшість функцій планування asyncio не дозволяють передавати ключові аргументи. Для цього скористайтеся functools.partial():

# will schedule "print("Hello", flush=True)"
loop.call_soon(
   functools.partial(print, "Hello", flush=True)
   )
🎧 Використання часткових об’єктів зазвичай зручніше, ніж використання лямбда-виразів, оскільки asyncio може краще відтворювати часткові об’єкти в повідомленнях про налагодження та помилки.
# лямбда-вираз
loop.call_soon(
   lambda : print("Hello")
   )

2024-12-25

Як завершити async-завдання, створене з функції що блокує через asyncio.to_thread(): експеримент та рішення.

Маленький експеримент як завершити async task якщо вона була створена з функції що блокує.

Тобто створена з не асинхронної функції (proc2) за допомогою asyncio.to_thread().

import asyncio
import threading
import time
# Stop event to signal the thread to terminate
stop_event = threading.Event()
async def proc1():
"""
Infinite loop async
"""
i = 0
while True:
print(f"proc1 {i}")
i += 1
await asyncio.sleep(1)
def proc2():
"""
This function is run in a separate thread
is blocked until stop_event is set or max 10 try
"""
i = 0
while not stop_event.is_set():
print(f"proc2 {i}")
i += 1
time.sleep(1)
if i>10:
print("proc2 end legacy after 10 try")
break
async def main():
print("start main")
t1=asyncio.create_task(proc1())
p2=asyncio.to_thread(proc2)
t2=asyncio.create_task(p2)
print("sleep 5")
await asyncio.sleep(5)
print("cancel t1")
t1.cancel()
try:
await t1
except asyncio.CancelledError:
print(f"Task t1 was cancelled.")
print("cancel t2")
t2.cancel()
try:
await t2
except asyncio.CancelledError:
print(f"Task t2 was cancelled.")
# Signal the thread to stop
stop_event.set()
print("end main")
print("start")
asyncio.run(main())
print("done")
"""
# Without use stop_event (L54)
start
start main
sleep 5
proc1 0
proc2 0
proc1 1
proc2 1
proc2 2
proc1 2
proc2 3
proc1 3
proc2 4
proc1 4
proc2 5
cancel t1
Task t1 was cancelled.
cancel t2
Task t2 was cancelled.
end main
proc2 6
proc2 7
proc2 8
proc2 9
proc2 10
proc2 end legacy after 10 try
done
"""
"""
# With use stop_event (L54)
start
start main
sleep 5
proc1 0
proc2 0
proc1 1
proc2 1
proc2 2
proc1 2
proc2 3
proc1 3
proc2 4
proc1 4
cancel t1
Task t1 was cancelled.
cancel t2
Task t2 was cancelled.
end main
done
"""

Як видно з результатів без використання threading.Event(), програма буде постійно працювати навіть після закінчення всіх асинхронних функцій в async loop, тому що окремий потік породжений у цій програмі ще не завершився й async loop буде чекати на нього.

2024-12-22

Моніторинг температури та сповіщення про критичні значення. Оновлення проєкту. Python.

Metrics of temperature and alerts.

 Вступ

До складних часів, коли було ще де і ради чого жити, я поступово впроваджував елементи розумного будинку

Одним із таких кроків стала інтеграція Bluetooth BLE термометрів Xiaomi Mijia (LYWSD03MMC), прошитих альтернативною прошивкою для зручності взаємодії через MQTT брокер.


Перша версія проєкту

До часів навчання на курсах Python Developer я створив невеликий консольний проєкт (v.0.1.0). Хоча спершу я не повністю розумів внутрішню логіку, проєкт дозволяв збирати інформацію про температуру, використовуючи ноутбук як локальний сервер.

Мотивація для оновлення

З набуттям нових знань та навичок під час навчання я почав сприймати код по-новому. А тут ще й зима настала: овочі на балконі потрібно було вчасно заносити до кімнати, щоб уникнути їх промерзання. Заморозки наближалися, тому я вирішив вдосконалити проєкт, додавши функцію сповіщень про критичні температури.

2024-11-25

Optimizing Performance: Python Speed Test for Digit Search in Strings. Shot, Middle, Long ...

Оптимізація продуктивності: Тест швидкості Python для пошуку цифр у рядках

⛓️ У відповідь на оригінальний пост: читайте обговорення тут я раніше провів заміри тільки для однієї категорії - короткий текст, тепер продовження ...

🪜 Я провів експеримент для оцінки ефективності різних методів Python для пошуку цифр у рядках, з урахуванням різних довжин рядків від коротких до довгих. Нижче я порівнюю шість різних технік і їхні переваги при витягуванні цифр. 

А також додано вимірювання продуктивності в різних версіях Python: 3.13.0 та 3.12.5

Категорії для тестування

Рядки були поділені на чотири окремі групи за їхньою довжиною:

  • Short: Короткий рядок, що містить лише кілька символів.
  • Middle: Рядок середнього розміру, приблизно 256 символів.
  • Long (1KB): Довший рядок, приблизно 1 кілобайт, що імітує параграфи тексту.
  • Long (2KB): Значно більший рядок, приблизно 2 кілобайти, підходить для даних, схожих на документи.

Методи порівняння

Нижче наведено шість версій методів витягування цифр, кожен з яких було проаналізовано за показниками продуктивності:

Шість версій для порівняння

 

2024-11-23

Optimizing Performance: Python Speed Test for Digit Search in Strings

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

Я розглянув, як швидко кожен метод виконується при пошуку цифр коротких рядках, а також порівняємо їхню ефективність з погляду часу виконання.

Надалі, порівнявши кілька підходів, я поділюсь висновками щодо того, який з них є найкращим в умовах реального використання Python для цієї задачі.


 
Шість версій для порвняння

2024-11-20

Note. TrueNAS Scale. ACME RFC 2136. Howto: ACME DNS-Authenticator shell script using acmesh project

Умови:

Є контрольований DNS server (BIND) з можливістю оновлювати записи з використанням nsupdate RFC 2136.
Є TrueNAS SCALE Server Dragonfish-24.04.2.5.

Задача:

Додати автоматично оновлюваний сертифікат безпеки  від Let’s Encrypt,  відповідно до стандартів ACME (RFC 8555).

Коли забув ти рідну мову, біднієш духом ти щодня...
When you forgot your native language you would become a poor at spirit every day ...

Д.Білоус / D.Bilous
Рабів до раю не пускають. Будь вільним!

ipv6 ready