MYCSS

2026-03-04

Blogger to GitHub Pages Sync Tool (blog2ghp)

Навіщо?

Я вирішив отримати практичний досвід роботи з GitHub Actions та GitHub Pages.

Мій блог має RSS-стрічку, і це дало ідею: якщо автоматично обробляти RSS-сторінки, можна отримати повну резервну копію блогу у форматі Markdown.
А вже цей Markdown легко опублікувати в репозиторії GitHub Pages / Jekyll.

Таким чином я отримую:
  • автоматичний бек-ап контенту
  • контроль над контентом у Git
  • можливість міграції з Blogger без втрат
  • статичну версію блогу

Приклад використання

Блоґ котрий копіюється

Результат копіювання на GitHub pages

2026-02-25

Ollama DeProxy або як отримати локальний доступ до віддаленої Ollama

Ollama DeProxy

Я маю віддалений сервер із GPU, на якому запущена Ollama.

Водночас середовище розробки зазвичай очікує, що Ollama доступна локально - наприклад, за адресою http://localhost:11434 або в межах локальної мережі (http://192.168.0.111:11434).

Класичні рішення

Найпростіший варіант — SSH-тунель:
ssh remote@server -L 11434:localhost:11434

Після цього локальний localhost:11434 проксуватиметься на віддалений сервер.

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

Проблема з авторизацією

У моєму випадку Ollama використовується разом із OpenWebUI, який проксіює доступ до Ollama через власний API з токен-авторизацією.

Однак більшість застосунків, що інтегруються з Ollama, очікують простий доступ до http://localhost:11434 без жодної авторизації. Через це вони не можуть напряму працювати через OpenWebUI.

Рішення — Ollama DeProxy

Щоб спростити інтеграцію, я написав невеликий застосунок - Ollama DeProxy.

2026-01-30

Windows Docker. Virtual image file just only grow size of .vhds file.

Куди зникає місце на диску?

Docker у Windows працює через WSL (Windows Subsystem for Linux), яка в свою чергу використовує віртуалізацію Hyper‑V. Це означає, що всі дані зберігаються у файлах образів віртуальних дисків .vhdx.

З часом диск починає стрімко розростатися, і рано чи пізно місце на системному SSD закінчується. Тоді виникає питання: куди ж воно поділося?

На допомогу приходить утиліта WinTree (diskanalyzer.com), яка дозволяє швидко побачити, що саме займає простір.

Саме так я й з’ясував, що проблема була у Docker. Але коли перевірив сам Docker - там усе вже очищено, а файл .vhdx продовжував залишатися гігантським.

docker system df

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          2         2         329.2MB   0B (0%)
Containers      3         0         2B        2B (100%)
Local Volumes   62        1         2.309GB   2.125GB (92%)
Build Cache     0         0         0B

Чому VHDX росте безконтрольно.

Реальний розмір віртуального тому завжди більший за фактичні дані. Це відбувається тому, що .vhdx‑файл у WSL та Docker може лише збільшуватися у міру потреби. 

Коли ти видаляєш образи чи очищаєш дані, простір всередині Linux‑файлової системи звільняється, але сам файл на диску не стискається автоматично. 

Тому він продовжує залишатися гігантським, навіть якщо даних там майже немає. 

Docker .vhdx before compact

Стискаємо образ диску 

Виходимо з застосунку "Docker Desktop" та робимо завершення "WSL":
wsl --shutdown
Стискаємо VHD файл відкриваючи консоль PowerShell як Administrator.
Optimize-VHD -Path "$env:LOCALAPPDATA\Docker\wsl\disk\docker_data.vhdx" -Mode Full

Тепер набагато краще.

Docker .vhdx after compact

 

2025-12-24

pfSense + HAProxy + ACME: HTTP-01 validation without using port 80

Вступ

У багатьох інсталяціях pfSense використовується не лише як firewall, а і як точка термінації HTTPS для внутрішніх вебсервісів. Типовий стек виглядає так:
  • pfSense - firewall та reverse-proxy
  • HAProxy - маршрутизація HTTP/HTTPS трафіку
  • ACME (Let’s Encrypt) - автоматична генерація HTTPS сертифікатів
  • Внутрішні вебсервери - працюють по HTTP у локальній мережі

У цій публікації як розгляну як коректно пройти ACME HTTP-01 валідацію, коли порт 80 вже зайнятий HAProxy, без зупинки сервісів і без DNS-01.


2025-06-21

Docker Port Is Busy on Windows? Fix for: bind: An attempt was made to access a socket in a way forbidden by its access permission.

If you're getting a Docker error like:

(HTTP code 500) server error - ports are not available: exposing port TCP 0.0.0.0:8182 -> 127.0.0.1:0: listen tcp 0.0.0.0:8182: bind: An attempt was made to access a socket in a way forbidden by its access permissions.
But nothing is using the port, it’s likely because Windows has excluded the port dynamically, especially after Docker was previously using it. 
 
(HTTP code 500) server error - ports are not available

1. Verify Nothing Is Listening on the Port

netstat -aon | findstr :8181

If you see no output, the port is not in use by any application.

2. Check Excluded Port Ranges:

netsh interface ipv4 show excludedportrange protocol=tcp

Protocol tcp Port Exclusion Ranges

Start Port    End Port
----------    --------
      6575        6674
      7162        7261
      7262        7361
      7362        7461
      7462        7561
      7562        7661
      7681        7780
      7781        7880
      7881        7980
      7981        8080
      8081        8180
      8181        8280
      8281        8380
      8381        8480
      8481        8580
     30604       30703
     49690       49789
     49790       49889
     49890       49989
     50000       50059     *
     50160       50259
     50360       50459
     50460       50559
     50660       50759
     50760       50859
     50860       50959
     51064       51163
     51243       51342
     51344       51443

You’ll notice 8182 falls within the 8181–8280 range - without a * at the end, meaning it's a dynamically excluded port.

You cannot remove dynamic exclusions manually.

3. Restart winnat Service to Clear Dynamic Exclusions: 

This step clears dynamic port reservations created by services like Docker: 
net stop winnat
net start winnat

* Run the above in Administrator Command Prompt 

 

4. Recheck Excluded Ports:

netsh int ipv4 show excludedportrange protocol=tcp

Protocol tcp Port Exclusion Ranges

Start Port    End Port
----------    --------
     50000       50059     *

* - Administered port exclusions.

If 8182 is no longer in the list, you're good to go.

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().

Як видно з результатів без використання 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).

2024-11-17

5-Day Gen AI Intensive Course with Kaggle and Google. Educational - Parking AI.

Ось і закінчився 5 денний інтенсив на тему Генеративного ШІ.
Захопило це після прослуховування LiveStreams кожного дня, але у запису коли зʼявлялися субтитри котрі вже можна перекласти.
По закінченню отримав такий бейдж від Kaggle 😉
Badge Kaggle

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

Оформив простий Colab projet ParkingAI.ipynb. Для його виконання необхідно отримати GOOGLE_API_KEY від aistudio.google.com і додати до секретних ключів.  Зверніть увагу на список країн де AI Studio може працювати.

Ось ядро логіки роботи з models/gemini-1.5-flash

In general the state diagram is.

# https://github.com/google-gemini/generative-ai-python
# https://colab.research.google.com/github/google-gemini/cookbook/blob/main/quickstarts/Function_calling.ipynb
# List of tools/functions for the parking AI system with explicit parameter types

parking_tools = [get_free_space, get_statistics, get_user_preferences, check_parked_car]

# Instruction to the model on how to use the tools
instruction = """
You are a helpful AI assistant for a smart parking app. Users can ask you questions about the app's features,
their parking status, and how to use the app. Use the available tools (get_free_space, get_statistics,
get_user_preferences, check_parked_car) to access relevant information and provide clear and concise answers.
"""

model = genai.GenerativeModel(
    "models/gemini-1.5-flash-latest",
    tools=parking_tools,
    system_instruction=instruction,
    )
user_query = input("Ask your question (commands: [e]xit, [h]istory): ")
response = chat.send_message(user_query)
print(response.text)

Приклади запитів:

Ask your question (commands: [e]xit, [h]istory): user 23 what preferred place ?

    User 23 prefers Zone A and Zone B.

Ask your question (commands: [e]xit, [h]istory): user 24 and 33 ?

    User 24 prefers Zone B and Zone C. There is no preference on record for user 33.

Ask your question (commands: [e]xit, [h]istory): h
user -> [{'text': 'user 23 what preferred place ?'}]
--------------------------------------------------------------------------------
model -> [{'function_call': {'name': 'get_user_preferences', 'args': {'user_id': 23.0}}}]
--------------------------------------------------------------------------------
user -> [{'function_response': {'name': 'get_user_preferences', 'response': {'preferred_locations': ['Zone A', 'Zone B']}}}]
--------------------------------------------------------------------------------
model -> [{'text': 'User 23 prefers Zone A and Zone B.\n'}]
--------------------------------------------------------------------------------
user -> [{'text': 'user 24 and 33 ?'}]
--------------------------------------------------------------------------------
model -> [{'function_call': {'name': 'get_user_preferences', 'args': {'user_id': 24.0}}}, {'function_call': {'name': 'get_user_preferences', 'args': {'user_id': 33.0}}}]
--------------------------------------------------------------------------------
user -> [{'function_response': {'name': 'get_user_preferences', 'response': {'preferred_locations': ['Zone B', 'Zone C']}}}, {'function_response': {'name': 'get_user_preferences', 'response': {'preferred_locations': []}}}]
--------------------------------------------------------------------------------
model -> [{'text': 'User 24 prefers Zone B and Zone C.  There is no preference on record for user 33.\n'}]
--------------------------------------------------------------------------------
Ask your question (commands: [e]xit, [h]istory): q
Exiting the chat. Goodbye!
Ask your question (type 'exit' to quit): What you can?
I can:

* Tell you how many free parking spaces are available.
* Provide overall usage statistics for the app.
* Tell you your preferred parking locations (if you provide your user ID).
* Check if your car is currently parked (if you provide your license plate number).

Ask your question (type 'exit' to quit): how many parking space ?
There are currently 10 free parking spaces.

Ask your question (type 'exit' to quit): My car ABC123
OK.  And what about your car with license plate ABC123?  Do you want to know if it's currently parked?

Ask your question (type 'exit' to quit): yes 
Yes, the car with license plate ABC123 is currently parked.

Ask your question (type 'exit' to quit): What about car AJJS11, is parked ?
No, the car with license plate AJJS11 is not currently parked.

Ask your question (type 'exit' to quit): Скільки вільних місць зараз є?
There are currently 10 free parking spaces.

Ask your question (type 'exit' to quit): Відповідай мені укаріїнською мовою.
Гаразд, я буду відповідати українською.  Задавайте питання!

Ask your question (type 'exit' to quit):  Скільки вільних місць зараз є? І який номер моєї машини?
Зараз є 10 вільних паркувальних місць.  Повідомте мені номер вашої машини, щоб я міг перевірити, чи вона припаркована.

Ask your question (type 'exit' to quit): Я вже відповідав, чи ти не мамʼятаєш ?
Вибачте, я не маю пам'яті попередніх розмов.  Для того, щоб перевірити, чи ваша машина припаркована, будь ласка, вкажіть її номерний знак.

Ask your question (type 'exit' to quit): ABC123
Так, автомобіль з номером ABC123 припаркований.

Ask your question (type 'exit' to quit): Яка сататистика використання ?
Загальна кількість зареєстрованих користувачів становить 100. Середнє використання додатку за тиждень складає 5.
Аsk your question (type 'exit' to quit, 'history' for history show): history
Ask your question (type 'exit' to quit, 'history' for history show): Мова спілкування українська
Добре, я буду спілкуватися з вами українською.  Задавайте питання.

Ask your question (type 'exit' to quit, 'history' for history show): Номер моєї машини ABC123, вона припаркована ?
Так, ваш автомобіль з номером ABC123 припаркований.

Ask your question (type 'exit' to quit, 'history' for history show): history
user -> [{'text': 'Мова спілкування українська'}]
--------------------------------------------------------------------------------
model -> [{'text': 'Добре, я буду спілкуватися з вами українською.  Задавайте питання.\n'}]
--------------------------------------------------------------------------------
user -> [{'text': 'Номер моєї машини ABC123, вона припаркована ?'}]
--------------------------------------------------------------------------------
model -> [{'text': 'Перевіряю...\n\n'}, {'function_call': {'name': 'check_parked_car', 'args': {'license_plate': 'ABC123'}}}]
--------------------------------------------------------------------------------
user -> [{'function_response': {'name': 'check_parked_car', 'response': {'is_parked': True}}}]
--------------------------------------------------------------------------------
model -> [{'text': 'Так, ваш автомобіль з номером ABC123 припаркований.\n'}]
--------------------------------------------------------------------------------
Ask your question (type 'exit' to quit, 'history' for history show): яка моя улюблена зона ?
Для того, щоб відповісти на це питання, мені потрібен ваш ідентифікатор користувача.  Будь ласка, вкажіть його.

Ask your question (type 'exit' to quit, 'history' for history show): 23
Ваші улюблені зони паркування - це Зона A та Зона B.

Ask your question (type 'exit' to quit, 'history' for history show): history
user -> [{'text': 'Мова спілкування українська'}]
--------------------------------------------------------------------------------
model -> [{'text': 'Добре, я буду спілкуватися з вами українською.  Задавайте питання.\n'}]
--------------------------------------------------------------------------------
user -> [{'text': 'Номер моєї машини ABC123, вона припаркована ?'}]
--------------------------------------------------------------------------------
model -> [{'text': 'Перевіряю...\n\n'}, {'function_call': {'name': 'check_parked_car', 'args': {'license_plate': 'ABC123'}}}]
--------------------------------------------------------------------------------
user -> [{'function_response': {'name': 'check_parked_car', 'response': {'is_parked': True}}}]
--------------------------------------------------------------------------------
model -> [{'text': 'Так, ваш автомобіль з номером ABC123 припаркований.\n'}]
--------------------------------------------------------------------------------
user -> [{'text': 'яка моя улюблена зона ?'}]
--------------------------------------------------------------------------------
model -> [{'text': 'Для того, щоб відповісти на це питання, мені потрібен ваш ідентифікатор користувача.  Будь ласка, вкажіть його.\n'}]
--------------------------------------------------------------------------------
user -> [{'text': '23'}]
--------------------------------------------------------------------------------
model -> [{'text': 'Добре, перевіряю ваші налаштування...\n\n'}, {'function_call': {'name': 'get_user_preferences', 'args': {'user_id': 23.0}}}, {'text': '\n'}]
--------------------------------------------------------------------------------
user -> [{'function_response': {'name': 'get_user_preferences', 'response': {'preferred_locations': ['Zone A', 'Zone B']}}}]
--------------------------------------------------------------------------------
model -> [{'text': 'Ваші улюблені зони паркування - це Зона A та Зона B.\n'}]
--------------------------------------------------------------------------------

Що було на курсі?

 

[Day 1 Assignments] 5-Day Gen AI Intensive:

💡What You’ll Learn

Today you’ll explore the evolution of LLMs, from transformers to techniques like fine-tuning and inference acceleration. You’ll also get trained in the art of prompt engineering for optimal LLM interaction.

The code lab will walk you through getting started with the Gemini API and cover several prompt techniques and how different parameters impact the prompts.

📼 Day 1 Livestream with Paige Bailey

[Day 2 Assignments] 5-Day Gen AI Intensive:

💡 What You’ll Learn

Today you will learn about the conceptual underpinning of embeddings and vector databases and how they can be used to bring live or specialist data into your LLM application. You’ll also explore their geometrical powers for classifying and comparing textual data.

 📼 Day 2 Livestream with Paige Bailey

[Day 3 Assignments] 5-Day Gen AI Intensive:

💡 What You’ll Learn

Learn to build sophisticated AI agents by understanding their core components and the iterative development process.

The code labs cover how to connect LLMs to existing systems and to the real world. Learn about function calling by giving SQL tools to a chatbot, and learn how to build a LangGraph agent that takes orders in a café.

 📼 Day 3 Livestream with Paige Bailey

[Day 4 Assignments] 5-Day Gen AI Intensive:

💡 What You’ll Learn

In today’s reading, you’ll delve into the creation and application of specialized LLMs like SecLM and MedLM/Med-PaLM, with insights from the researchers who built them.

In the code labs you will learn how to add real world data to a model beyond its knowledge cut-off by grounding with Google Search.  You will also learn how to fine-tune a custom Gemini model using your own labeled data to solve custom tasks.

 📼 Day 4 Livestream with Paige Bailey

[Day 5 Assignments] 5-Day Gen AI Intensive:

💡 What You’ll Learn

Discover how to adapt MLOps practices for Generative AI and leverage Vertex AI's tools for foundation models and generative AI applications.

 📼 Day 5 Livestream with Paige Bailey


2024-11-13

Performance Comparison of Python Function Implementations for Equivalent Output

😄 Цікаво інколи оптимізувати код.
Отримав такі рішення для випадку коли не завжди є рядок з всіма параметрами і його треба розбити на частини.

📅 Рядок category може бути "W", "P-V-00", "S", "P-V-01", "L-X", "L-X-A-B-C-D"
Проведено 10_000_000 замірів 8 разів і отримано середні значення часу виконання.

Perfomance Comparison

🔖Наведено топ 3 результати вимірювань. 

  1. Як не дивно, на першому місці Version 5, коли є всі елементи в категорії, але на останньому коли не всі елементи є - вітання до try-except.
    Можна провести алегорію з приказками "Як тривога, то до Бога", "Без біди Бога не кличуть".
  2. На другому місці Version 6 та Version 9 в інших випадках.

2024-11-08

Using Apache Spark with Python, emphasizing its role compared to Celery

🚀 Python у розподілених обчисленнях: Apache Spark проти Celery

Ви коли-небудь замислювалися, чи може Apache Spark впоратися з розподіленими завданнями в Python, як Celery? Давайте розберемо відмінності і те, коли варто використовувати кожен з них.

 

Apache Spark з Python (PySpark)

🔹 Spark - це потужний фреймворк для великомасштабної обробки даних. За допомогою PySpark ви можете обробляти величезні набори даних і виконувати такі завдання, як ETL (Extract, Transform, Load або Витяг, Перетворення та Завантаження), аналіз даних і машинне навчання між кластерами.
🔹 Spark є відмовостійким та оптимізованим для пакетної обробки розподілених наборів даних, що робить його ідеальним рішенням для роботи з великими даними.

 

Celery для робочих процесів на основі завдань

🔹 Celery, з іншого боку, призначена для планування завдань та асинхронної обробки. Часто в парі з веб-додатками вона ідеально підходить для таких завдань, як надсилання сповіщень або запуск фонових завдань.
🔹 На відміну від Spark, Celery краще підходить для виконання індивідуальних завдань у режимі реального часу, а не для масштабної обробки даних.

 

Основні висновки

⭐ Використовуйте Spark для обробки великих даних, ETL та конвеєрів машинного навчання.
⭐ Використовуйте Celery для управління окремими завданнями, особливо у веб-додатках.

2024-11-03

Secure Temporary File Upload Service. PHP. NextCloud. WebDAV. Upload files form.

    Завершив невеликий проєкт зі створення форми для завантаження файлів у хмарне сховище.
    Проєкт реалізовано за допомогою PHP, Redis та WebDAV для забезпечення ефективного зберігання та обробки файлів. 

    Overview:

    This project provides a secure, temporary file-upload service with time-limited access. It generates a unique URL for file uploads, includes CAPTCHA protection, and sends the URL to the user via email. The following is a list of key functionalities and features implemented in this project.

    2024-10-31

    Prism. Code formatting in blogspot.

    Prism


    Example of use Prism:

    
    # Your Python code goes here
    
    from types import MethodType
    
    class Person:
        def __init__(self, name):
            self.name = name
    
    # Function to add dynamically as a method
    def say_hello(self):
        return f"Hello, my name is {self.name}"
    
    # Create an instance of Person
    person = Person("Alice")# Bind the function say_hello to person instance as a method
    person.say_hello = MethodType(say_hello, person)
    
    # Call the new method on the instance
    print(person.say_hello())  # Output: "Hello, my name is Alice"
    
    

     

    cdnjs links

    https://cdnjs.cloudflare.com/ajax/libs/prism/9000.0.1/themes/prism-tomorrow.min.css
    https://cdnjs.cloudflare.com/ajax/libs/prism/9000.0.1/themes/prism.min.css
    https://cdnjs.cloudflare.com/ajax/libs/prism/9000.0.1/components/prism-python.min.js
    
    Коли забув ти рідну мову, біднієш духом ти щодня...
    When you forgot your native language you would become a poor at spirit every day ...

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

    ipv6 ready