CompTalks
16 subscribers
29 photos
1 video
2 files
14 links
Download Telegram
Channel photo updated
"Це вам не кнопочки красити на фронтенді, це курва системне програмування..." - Ти не жив, поки не написав власноруч парсер інструкцій з масками і зсувами.

🧙Wizard Level 6: “Bitwise operations are the dark magic of programming.”
👩‍💻Silico VM: інтеграція CPU+RAM, frontend, IPC

За останні дні, я додав підтримку повного циклу ініціалізації, емуляції одної інструкції та дампу стану CPU через WebUI.

👩‍💻kernel/
- CPU module: отримав підтримку базової ініціалізації та дампу.
- RAM module: обробляє 32-бітні читання та записи
- Введена базова інструкція ADD дял перевірки логіки CPU.

🖥ipc/
- Створено окремий модуль від ядра (kernel), який слухає stdin і приймає JSON-команди (init, dump).
- Логіка команд відділена від I/O.

👩‍💻backend/
- Запускається окремий CLI-процес (тобто скомпільований kernel & ipc), з яким спілкується через stdin/stdout.
- Додано HTTP-server, який обробляє /init і /dump

🖥frontend/
- Простий index.html з кнопками “Init CPU” та “Dump CPU State”
- JSON-вивід рендериться в <pre> для дебагу стану регістрів


📊 На даний момент Silico уже може:
- проініціалізувати CPU (x0–x30, SP, PC, PSTATE)
- передавати команди через IPC
- виводити повний дамп CPU через веб
- мати базову взаємодію між пам’яттю та процесором

Це тільки початок ... Попереду ще багато інженерного м’яса !
Please open Telegram to view this post
VIEW IN TELEGRAM
1
На першій частині стріма, я розширив декодування інструкцій та набір opcode'ів. Включено повний список базових інструкцій ARM64. Додано допоміжні функції декодування.

Єдине, що не реалізовано це гілки та операції з пам'яттю, вони залишаються як OPCODE_UNKNOWN для майбутньої реалізації.

https://github.com/DenysSkobalo/silico/commit/735e18c706178ba4bb72e015f40f924b3f8eb76c

Продовжую далі😌
За три години стріма, розширив DecodeInstr, ввів InstrClass для класифікації інструкцій (арифметика, логічні, гілки, памʼять, системні). Переписав decode() та імплементував execute() для підтримки цієї класифікації. Виніс арифметичні та логічні інструкції у execute_alu(). Додано інструкції: ADD, SUB, ADDI, SUBI, MUL, MOVZ, MOVN, MOVK, AND, ORR, EOR, ANDI, ORRI, EORI.

Додано повідомлення про невідому інструкцію з точним PC, щоб легше відловлювати баги.

У main.c тепер є зручний приклад з повним тестовим набором інструкцій, які працюють: обчислення, логіка, завантаження констант, зсуви.

Commit 1: https://github.com/DenysSkobalo/silico/commit/99468597a66ed3c3012fd468f3e5d6af19ef78b7

Commit 2: https://github.com/DenysSkobalo/silico/commit/dd4d1cc077181f082c3554a6725b3b5758231fa1
Літо всралося, відпочинок закінчився, час знову грузнути в грьобаному універі й розгрібати свої проєкти. Останній курс, тому треба добивати все, що почав.

Кілька місяців тому я запускав експеримент — писати свою мінімальну ОС. Потім забив, але репо на GitHub залишив. І ось тиждень тому дістав його з архіва й нарешті почав рухати далі.

Що вже зроблено:
- прибрав старий 16-бітний bootloader на ASM;
- завів Multiboot через GRUB та ISO;
- організував лінкування ядра через LD і NASM;
- написав мінімальне ядро на C з виводом на VGA;
- навів лад у Makefile: тепер є build, iso, qemu, docker;
- додав build.sh для Docker-збірки.

Проєкт оживає, і навіть у такому мінімальному вигляді він уже приносить кайф. Далі буде цікавіше.

Репо: https://github.com/DenysSkobalo/detux
На днях, мені прийшов мікроконтролер на базі ESP8266EX. В ній присутній WiFi (802.11 b/g/n) з TCP/IP стеком, SRAM (64KB instructions + 96KB data), SPI Flash 4 MB, GPIO, SPI, I^2C, UART, PWM, ADC.

І перше, що я вирішив на ньому зроюити, це підняти легкий вебсервер. Написав все на С++ та скомпілював для Arduino через заголовковий файл. А далі все постандарту, збірка проєкта та прошивка через Makefile. Одне з мінусів те, що я не маю доступу до роутера тому підняв через телефон хотспот та підключився до нього і на ПК на якому потрібно відкрити піднятий сервер, він повинен теж бути підключеним до WiFi (у моєму випадку хотспот), що підключений сам сервер. Далі відкриваєм IP-адрес котрий пише на OLED, що підключений до чіпсета, вбиваємо в браузер, відкривається сайт, пишемо повідомлення та отримуємо повідомлення на екрані, що було написано на сайті.

Але, щоб вирішити проблему щодо відкриття сайту з любого WiFi, то я придумав рішення. Можна прокинути тунель через Ngrok або Cloudfare Tunnel, але я вибрав Ngrok, прокинув тунель, отримав згенероване рандомне URL-посилання і все працює так само.

Ось такий невеликий, але доволі цікавий проєкт. Нижче залишаю посилання на репо.

https://github.com/DenysSkobalo/ESP8266-webAP
CompTalks
На днях, мені прийшов мікроконтролер на базі ESP8266EX. В ній присутній WiFi (802.11 b/g/n) з TCP/IP стеком, SRAM (64KB instructions + 96KB data), SPI Flash 4 MB, GPIO, SPI, I^2C, UART, PWM, ADC. І перше, що я вирішив на ньому зроюити, це підняти легкий…
Продовжую гратись з ESP8266EX 🙂
Після того як підняв базовий вебсервер і прокидав тунель через Ngrok, я вирішив трохи ускладнити завдання.

🔹 Тепер мікроконтролер працює у режимі Access Point (AP) -- тобто він сам створює WiFi-мережу. Не потрібно ніякого роутера чи хотспоту з телефону: ESP8266 піднімає свій SSID, показує його та IP прямо на OLED-екрані, і до цієї мережі можна підключитися будь-яким пристроєм. Відкриваєш браузер → заходиш за IP → бачиш сайт із ESP.

По суті, ESP8266 перетворився на мініатюрний роутер із власним вебсервером.

Репо той самий, але тепер у ньому інша назва:
https://github.com/DenysSkobalo/ESP8266-webAP
Давно не читав, що там в "улюбленому" ІТ ринку робиться, і наткнувся на нове дослідження Гарварду (62 млн резюме + 285 тис. компаній) показало цікаву річ.

До 2022 року все було рівно: і джуни, і сеньйори росли в кількості.
Але з початку 2023 року, коли компанії масово почали інтегрувати ChatGPT-подібні інструменти, відбувся так сказати перелом:
- джуни пішли вниз, їх перестали активно наймати,
- сеньйори залишились у плюсі, їх найм продовжився.

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

Найбільше втратили випускники “середніх” університетів. Еліта та самий низ залишилися більш захищеними.

Висновок такий, що генеративний AI робить кар’єрну драбину вужчою знизу. Увійти в гру джунам стало важче, а нерівність лише зростатиме.

https://papers.ssrn.com/sol3/papers.cfm?abstract_id=5425555
👍1
Project DB.zip
6.3 MB
Перший за три роки університетський проєкт, який реально викликав інтерес, проєктування і реалізація бази даних для керування віртуальними машинами (PostgreSQL + Docker).
Нарешті завдання, де можна було мислити як інженер, а не просто писати блять базові алгоритми або слухати брєд професорів без досвіду.

*прикріпляю зіпку проєкта зверху, там і скрипти, і документація на французькій та українській
🔥2
AI повністю змінив відчуття від програмування.
Раніше застряг, значить, кілька днів у StackOverflow, Reddit і нескінченних костилях.
Тепер просто чекаєш апдейт моделі або перемикаєшся на іншу LLM, і все запрацювало. І ми навіть ще не в еру AGI
Сьогодні хочу поділитися невеликим експериментом із low-level програмування на macOS – це Data Link Sniffer, простий sniffer Ethernet/Wi-Fi, побудований на основі BPF (Berkeley Packet Filter).

Ідея дуже проста, але водночас демонструє роботу з мережею на найнижчому рівні: ми читаємо сирі Ethernet-фрейми з мережевого інтерфейсу, а потім виводимо MAC-адреси відправника та отримувача і тип кадру (EtherType).

Технічно, програмі потрібні лише:
- macOS,
- права root (щоб отримати доступ до /dev/bpf*),
- компілятор Clang.

Після компіляції (make) та запуску (sudo ./bpf_sniffer) можна спостерігати трафік у реальному часі. Варто пам’ятати, що на Wi-Fi в managed mode ви не побачите всі підключені пристрої для цього потрібен monitor mode. І ще невелике зауваження: іноді macOS може виводити попередження про BIOCSETBUFSIZE – його можна ігнорувати.

Цей проєкт чудовий приклад того, як низькорівневе програмування дозволяє отримати доступ до мережі на рівні кадрів, обходячи високорівневі API. Для тих, хто цікавиться мережею, BPF і системним програмуванням, це відмінний старт/

Github Repo:
https://github.com/DenysSkobalo/bpf_sniffer
Три тижні тому в мене прийшла ідея зробити маленьку утиліту для macOS: щоб клавіатура автоматично переключалась залежно від активного додатку. Наприклад, коли я відкриваю Telegram — розкладка українська, а коли відкриваю термінал — англійська. Потім я трохи забив на цю ідею… і ось учора вирішив нарешті реалізувати її.

Ідея виявилась цікавою, бо на перший погляд здається простою, але насправді довелось продумати декілька речей: як відслідковувати активний додаток і як переключати розкладку клавіатури у реальному часі.

Розробка йшла поетапно:
1. Моніторинг активного додатку
Спочатку я пробував різні способи отримати назву активного вікна. Виявилось, що найстабільніше працює NSWorkspace.sharedWorkspace().frontmostApplication через Objective-C код. Це стало основою модуля macos_bridge.m, який підключений до C-проєкту через заголовки macos.h та macos_bridge.h.
2. Зміна розкладки
Наступний крок — переключення розкладки клавіатури. Для цього я реалізував функцію set_keyboard_layout, яка працює через TIS (Text Input Source) API macOS. Тепер можна задавати ідентифікатори розкладок на кшталт com.apple.keylayout.ABC чи com.apple.keylayout.Ukrainian-PC.
3. Парсер JSON правил
Щоб користувач міг налаштувати, яка розкладка для якого додатку, я реалізував власний парсер JSON-файлу rules.json. Він читає конфігурацію правил у C, виділяє назви додатків та потрібні розкладки. Наприклад:

{
"rules": [
{"app": "kitty", "layout": "eng"},
{"app": "Telegram Desktop", "layout": "ua"},
{"app": "Google Chrome", "layout": "eng"}
]
}

Функція apply_rules_to_active_window перевіряє активний додаток і застосовує потрібну розкладку у реальному часі.

На даному етапі утиліта поки що в розробці, і готова лише підутиліта ADA (auto-detected-app). Вона вже може відслідковувати активний додаток та виводити debug-вивід із застосованими правилами розкладки.

Власна проблема з постійним переключенням розкладки перетворилась на окремий проєкт.

https://github.com/DenysSkobalo/macos-input-switcher
Зараз активно введеться розробка проєкту "MIS", і вже відбулося кілька важливих змін і покращень:

1. Повна інтеграція C та Objective-C
Тепер проєкт компілюється як єдиний бінарник, де C-логіка і Objective-C код (для macOS API) працюють разом без “костилів”. Тепер усі модулі, включно з відслідковуванням активного додатку і управлінням клавіатурою, компілюються через один Makefile і збираються у повноцінний .app.

2. Нова система правил
JSON-конфіг rules.json отримав оновлення: додав підтримку нових додатків і точних ідентифікаторів розкладок. Наприклад, тепер можна задати:

{
"rules": [
{"app": "kitty", "layout": "com.apple.keylayout.ABC"},
{"app": "Telegram", "layout": "com.apple.keylayout.Ukrainian-PC"},
{"app": "ChatGPT", "layout": "com.apple.keylayout.Ukrainian-PC"},
{"app": "Google Chrome", "layout": "com.apple.keylayout.ABC"}
]
}
1
3. Новий модуль layout_switcher
Реалізована централізована логіка зміни розкладки. Тепер не потрібно окремо викликати API для кожного додатку — функції layout_switcher_init та layout_switcher_free керують усім циклом переключень, економлячи ресурси та мінімізуючи затримки.

4. Відмовились від старого модуля auto-detected-app
Раніше я робив окремий агент, який тільки виводив debug-інформацію. Зараз він повністю інтегрований у головний бінарник, і відстеження активного додатку працює у фоновому режимі без додаткових процесів.

Результат: зараз утиліта вже збирається в готовий .app, автоматично підтягує правила з rules.json і змінює розкладку під час роботи з будь-яким додатком. Тестування показує, що переключення практично миттєве, а CPU навантаження мінімальне.

https://github.com/DenysSkobalo/macos-input-switcher/commit/57a66c3f9722924648c261f00abee2403d079240
Сьогодні день був так сказати проведений в резюме та LinkedIn. Але по закінченю, я загадав що у мене є ігровий ноутбук, який я вже не використовую. І в голову прийшла думка, а якщо я з нього спробую зробити сервер для своїх пет-проєктів. Ну і з цього почалось 4-годинне занурення як Sysadmin & DevOps.

Спочатку, я зробив загрузочну флешку з Ubuntu Server. Вставив в ноутбук, зніс до біса Windows (дратує Windows), встановив на свою машину Ubuntu Server Minimized, без GUI і лишнього сміття.
Далі, підключення до Wi-Fi. А це окрема проблема тому, що я живу у гуртожитку та немаю Ethernet кабелю. Хвилин 10-15, почитавши про netplan, написав конфіг для підключення до Wi-Fi і все, доступ отриманий. Після цього йшла Linux-рутина,
sh sudo apt update && sudo apt upgrade -y
, далі встановлення базових інструментів. З головного це nvim, я зрозумів, що я без нього як без рук, якщо йдеться про написання коду, конфігів. А потім я згадую, що якщо я буду не вдома а доступ до "сервера" треба буде отримати, я встановлюю та налаштовую OpenSSH. Одразу пересідаю за свій Macbook та підключаюсь до нього через ssh і продовжую налаштування "сервера". А да доречі, ще зробив таку структуру:

/srv/docker # for Docker container
/srv/projects # for my projects
/srv/volumes # for saved Docker volumes
1