Обновить
16
Роман@lampa

Пользователь

4
Подписчики
Отправить сообщение

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

Моё мнение - кто не сумеет освоить инструмент, тот останется за бортом. Вопрос не в том, что именно мы используем сегодня (ИИ, ассемблер или фреймворк), а в том, что завтра на смену этому инструменту придет что-то более совершенное и этим нужно уметь пользоваться.

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

Раньше я тратил время на архитектуру процессора, чтение документации к железу и разбор опкодов. Сейчас я трачу время на выбор правильной версии Spring Boot и обсуждение в LinkedIn, какая из них реально game changer.

Я купил все самые дорогие лицензии на IntelliJ Ultimate и платные курсы по микросервисам на 500 долларов. Вот лохи те, кто до сих пор пишет на ассемблере. Я-то подписан на всех архитекторов из Oracle и читаю их посты. Если кто-то пишет, что их новая библиотека заменяет целую команду системщиков, я вижу это первым. Нужно мыслить на шаг впереди рынка.

Раньше я переживал, что не понимаю какую-то сложную часть системы или утечку памяти. Теперь я вообще давно не понимаю, что там наворотила JVM под капотом. Но оно и не надо, я читал в соцсетях, что понимать работу с памятью — это моветон. Современный инженер не вникает в регистры, он оркестрирует бинами. Если Maven собрал проект — значит, всё хорошо. Если не собрался — нужно добавить ещё пару аннотаций в класс.

Я больше не описываю логику в коде, я делаю это через конфигурацию. Да, это выходит дольше по времени из-за бесконечных XML и аннотаций, но зато я в тренде. Я сначала генерирую структуру проекта через инициализатор, потом уточняю зависимости, потом прошу Lombok переписать всё более структурированно. Через час у меня есть идеальный бойлерплейт.

Коллеги начали задавать странные вопросы: «Ты понимаешь, как этот AbstractProxyFactoryBean работает?» или «Почему это занимает 4 гигабайта в простое?». Я считаю, что это мышление прошлого. Важно не понимать, важно доставлять Enterprise-решения. А если что-то сломалось — всегда можно сказать, что Garbage Collector слегка галлюцинировал и не так очистил кучу. Мы же все понимаем, что это временно.

Иногда я открываю pull request и не могу объяснить, почему там именно так. Но зато там всё выглядит современно: абстракции, интерфейсы интерфейсов, generic-типы, пара новых библиотек от Apache. Выглядит солидно. Если что — всегда можно попросить документацию к фреймворку объяснить, что он имел в виду под этим исключением.

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

Повсюду говорят, что всех, кто не перешел на высокоуровневые ООП-языки, уволят. Меня пока что уволили как раз из-за Java, потому что я стал писать код отвратительного качества с десятикратным оверхедом, но я работаю на перспективу. Да, прод падал. Да, автотесты внезапно тестировали пустой бин. Да, в коде появлялись методы, которые никто не вызывал, потому что их добавил какой-то плагин. Но это цена трансформации.

После увольнения я начал строить свой стартап. Естественно, на ассемблере я не писал, а собрал всё на Spring Cloud за 3 дня. Хочу сделать бизнес и получать 10k $ в месяц. Но пока есть небольшая проблемка. У меня есть один критический баг — StackOverflowError при запуске. Стандартные либы его не пофиксили, и я пока не знаю, что делать в таком случае, ведь я забыл, как работает стек. Пока ищу инфу в блогах, как поступить. Поэтому пока стартап в режиме ожидания.

Мне говорят, что я стал зависим от тяжелых абстракций. Я предпочитаю формулировку «усилил себя инструментами». Но иногда, глубоко ночью, когда очередная сборка проекта зависает на этапе «Resolving dependencies…», я смотрю в экран и думаю: а вдруг всё-таки стоит вспомнить про MOV и PUSH? Но потом вспоминаю, что читать и понимать низкоуровневый код — это моветон.

И если завтра выйдет ещё одна библиотека за 100 долларов, которая обещает писать бизнес-логику за меня, — я, конечно, её куплю. Нельзя же отставать.

Потому что вдруг в этот раз оно действительно заработает идеально.

2) По импедансу - правильно я понимаю, что импеданс согласовывают в том случае, если дорожка до антенны получилась кривая или её невозможно сделать 50 Ом? Ведь нога чипа тоненькая. Т.е. грубо говоря нога чипа 30 Ом, начало дорожки такое же, далее дорожка расширяется до 50 Ом и в итоге на антенну приходит 45 Ом и мы конденсатором добираем эти 5 Ом?

3) По антенне - правильно ли я понимаю, что радиоволна как бы врезается в любую часть антенны, поэтому мы можем делать её любой формы?

Спасибо! Я тогда еще чуть тупых вопросов задам:

1) Почему некоторые платы esp32 с экраном, а некоторые нет, но работают они на глаз одинаково (замерял децибелы при приближении/удалении). Возможно, что плата без железного экрана сама выступает экраном, т.к. она больше чем плата с экраном?

2) Зачем согласовывать импедансы если чип - линия - антенна 50 Ом?

3) Зависит ли прием и передача сигнала от вида антенна типа "змейка"? Можно ли сделать не змейку, а спиральку или квадрат (незамкнутный)?

4) Дорожка, которая приходит в антенну - это одно и тоже? Или дорожка должна быть 50Ом, а антенна может быть протравлена тонкой, но главное нужной длины?

5) Тут в комментах есть фотки платы для телевизора и тракт идет 1) плавным 2) обособлен землей, которая соединена переходами - про переходы я так понимаю для соблюдения 50Ом, а плавность зачем? И почему тогда антенна поворачивает не правно, а сразу на 90 град?

6) И по фотки плат телевизоров - там антенна вообще не линия или змейка, а огромный прямоугольник - как это объясняется?

Очень интересно! Я бы еще почитал статью для нубов, где на пальцах объясняется как рассчитать антенну на плате для того же esp32 чипа. Почему выход из чипа подключается к змейке через конденсатор, почему из чипа дорожка одной толщины, а сама антенна другой, почему выход подключается именно через 5мм (условно) после земли, а не через 10. Ну и как проверить эту антенну, например, если под рукой есть nanovna

Я так понимаю модерирует отзывы и сразу их отправляет в бан =) А чтобы восстановить отзыв, например "Всё отлично", нужно написать полотно текста в поддержку (читай в пустоту) и скинуть скрины

Вот примерный вариант:

Есть таблица пользователей (id, name, current_cat_id, current_action) и посещений (id, user_id, created, cat_id, action), таблица категорий (id, ROOT_value, SUB_ROOT_value, CAT_calue, SUB_CAT_value). Также есть таблица правил для составления отчетов (id, name, cat_type, cat_id, last_cat_type, last_cat_id, action, last_action). Нужно взять правило, найти для этого правила пользователя и для этого пользователя найти последнее посещение, причем если указано ROOT, то мы используем ROOT_value и т.п. Также cat_id. last_cat_id, action, last_action может быть 0 тогда мы ищем без них.

Вот примерное решение на дипсике:

SQL код
-- Создание таблицы категорий
CREATE TABLE categories (
    id SERIAL PRIMARY KEY,
    ROOT_value VARCHAR(50),
    SUB_ROOT_value VARCHAR(50),
    CAT_value VARCHAR(50),
    SUB_CAT_value VARCHAR(50)
);

-- Создание таблицы пользователей
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    current_cat_id INTEGER REFERENCES categories(id),
    current_action INTEGER
);

-- Создание таблицы посещений
CREATE TABLE visits (
    id SERIAL PRIMARY KEY,
    user_id INTEGER REFERENCES users(id),
    created TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    cat_id INTEGER REFERENCES categories(id),
    action INTEGER
);

-- Создание таблицы правил
CREATE TABLE rules (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    cat_type VARCHAR(20),
    cat_id INTEGER,
    last_cat_type VARCHAR(20),
    last_cat_id INTEGER,
    action INTEGER,
    last_action INTEGER
);

-- Вставка тестовых данных в категории
INSERT INTO categories (id, ROOT_value, SUB_ROOT_value, CAT_value, SUB_CAT_value) VALUES
(1, 'Electronics', NULL, NULL, NULL),
(2, 'Electronics', 'Computers', NULL, NULL),
(3, 'Electronics', 'Computers', 'Laptops', NULL),
(4, 'Electronics', 'Computers', 'Laptops', 'Gaming'),
(5, 'Electronics', 'Computers', 'Laptops', 'Business'),
(6, 'Electronics', 'Phones', NULL, NULL),
(7, 'Electronics', 'Phones', 'Smartphones', NULL),
(8, 'Electronics', 'Phones', 'Smartphones', 'Android'),
(9, 'Electronics', 'Phones', 'Smartphones', 'iOS'),
(10, 'Home', NULL, NULL, NULL),
(11, 'Home', 'Kitchen', NULL, NULL),
(12, 'Home', 'Kitchen', 'Appliances', NULL),
(13, 'Home', 'Kitchen', 'Appliances', 'Refrigerators'),
(14, 'Home', 'Kitchen', 'Appliances', 'Ovens'),
(15, 'Home', 'Living Room', NULL, NULL),
(16, 'Home', 'Living Room', 'Furniture', NULL),
(17, 'Home', 'Living Room', 'Furniture', 'Sofas'),
(18, 'Home', 'Living Room', 'Furniture', 'Tables');

-- Вставка тестовых данных в пользователей
INSERT INTO users (id, name, current_cat_id, current_action) VALUES
(1, 'John Doe', 4, 1),  -- Gaming Laptops, action=1
(2, 'Jane Smith', 8, 2), -- Android Phones, action=2
(3, 'Mike Johnson', 13, 1), -- Refrigerators, action=1
(4, 'Sarah Wilson', 17, 3), -- Sofas, action=3
(5, 'Tom Brown', 5, 2), -- Business Laptops, action=2
(6, 'Lisa Davis', 9, 1), -- iOS Phones, action=1
(7, 'Alex Miller', 14, 2), -- Ovens, action=2
(8, 'Emma Garcia', 18, 1); -- Tables, action=1

-- Вставка тестовых данных в посещения
INSERT INTO visits (id, user_id, created, cat_id, action) VALUES
-- Посещения для John Doe (user_id=1)
(1, 1, '2024-01-15 10:00:00', 3, 1), -- Laptops
(2, 1, '2024-01-16 14:30:00', 4, 2), -- Gaming Laptops
(3, 1, '2024-01-17 09:15:00', 2, 1), -- Computers

-- Посещения для Jane Smith (user_id=2)
(4, 2, '2024-01-14 11:20:00', 7, 2), -- Smartphones
(5, 2, '2024-01-15 16:45:00', 8, 1), -- Android Phones
(6, 2, '2024-01-16 13:10:00', 6, 2), -- Phones

-- Посещения для Mike Johnson (user_id=3)
(7, 3, '2024-01-13 08:30:00', 12, 1), -- Appliances
(8, 3, '2024-01-14 15:20:00', 13, 2), -- Refrigerators
(9, 3, '2024-01-15 11:45:00', 11, 1), -- Kitchen

-- Посещения для Sarah Wilson (user_id=4)
(10, 4, '2024-01-12 12:00:00', 16, 3), -- Furniture
(11, 4, '2024-01-13 14:15:00', 17, 1), -- Sofas
(12, 4, '2024-01-14 10:30:00', 15, 2), -- Living Room

-- Посещения для других пользователей
(13, 5, '2024-01-11 09:00:00', 5, 2), -- Business Laptops
(14, 6, '2024-01-10 13:20:00', 9, 1), -- iOS Phones
(15, 7, '2024-01-09 16:40:00', 14, 2), -- Ovens
(16, 8, '2024-01-08 08:15:00', 18, 1); -- Tables

-- Вставка тестовых правил
INSERT INTO rules (id, name, cat_type, cat_id, last_cat_type, last_cat_id, action, last_action) VALUES
-- Правило 1: Пользователи с ROOT категорией Electronics и последним посещением любой категории
(1, 'Electronics Users Any Last Visit', 'ROOT', 1, NULL, 0, 0, 0),

-- Правило 2: Пользователи с SUB_ROOT категорией Computers и последним посещением ROOT Electronics
(2, 'Computer Users Last Electronics', 'SUB_ROOT', 2, 'ROOT', 1, 0, 0),

-- Правило 3: Пользователи с CAT категорией Laptops и последним посещением SUB_ROOT Computers
(3, 'Laptop Users Last Computers', 'CAT', 3, 'SUB_ROOT', 2, 0, 0),

-- Правило 4: Пользователи с SUB_CAT категорией Gaming и последним посещением CAT Laptops
(4, 'Gaming Laptop Users Last Laptops', 'SUB_CAT', 4, 'CAT', 3, 0, 0),

-- Правило 5: Пользователи с действием=1 и последним действием=2
(5, 'Action 1 Users Last Action 2', NULL, 0, NULL, 0, 1, 2),

-- Правило 6: Пользователи с ROOT Home и последним посещением SUB_ROOT Kitchen
(6, 'Home Users Last Kitchen', 'ROOT', 10, 'SUB_ROOT', 11, 0, 0),

-- Правило 7: Пользователи с конкретной категорией 8 (Android) и последним посещением категории 7 (Smartphones)
(7, 'Android Users Last Smartphones', NULL, 8, NULL, 7, 0, 0),

-- Правило 8: Пользователи с любыми настройками (все пользователи)
(8, 'All Users Any Settings', NULL, 0, NULL, 0, 0, 0),

-- Правило 9: Пользователи с действием=2 и последним посещением ROOT Electronics
(9, 'Action 2 Users Last Electronics', NULL, 0, 'ROOT', 1, 2, 0),

-- Правило 10: Пользователи с SUB_CAT Business и последним действием=2
(10, 'Business Laptop Users Last Action 2', 'SUB_CAT', 5, NULL, 0, 0, 2);

-- Создание индексов для оптимизации
CREATE INDEX idx_users_current_cat_action ON users(current_cat_id, current_action);
CREATE INDEX idx_visits_user_created ON visits(user_id, created DESC);
CREATE INDEX idx_visits_cat_action ON visits(cat_id, action);
CREATE INDEX idx_categories_root_value ON categories(ROOT_value);
CREATE INDEX idx_categories_sub_root_value ON categories(SUB_ROOT_value);
CREATE INDEX idx_categories_cat_value ON categories(CAT_value);
CREATE INDEX idx_categories_sub_cat_value ON categories(SUB_CAT_value);
CREATE INDEX idx_rules_id ON rules(id);

-- Запрос для проверки правила (пример для правила 1)
SELECT DISTINCT ON (u.id)
    u.id as user_id,
    u.name,
    u.current_cat_id as user_cat_id,
    u.current_action as user_action,
    v.id as visit_id,
    v.created as visit_created,
    v.cat_id as visit_cat_id,
    v.action as visit_action,
    r.name as rule_name
FROM rules r
CROSS JOIN users u
LEFT JOIN categories user_cat ON user_cat.id = u.current_cat_id
LEFT JOIN categories rule_cat ON rule_cat.id = r.cat_id
LEFT JOIN LATERAL (
    SELECT v.* 
    FROM visits v
    LEFT JOIN categories visit_cat ON visit_cat.id = v.cat_id
    LEFT JOIN categories rule_last_cat ON rule_last_cat.id = r.last_cat_id
    WHERE v.user_id = u.id
    AND (r.last_action = 0 OR v.action = r.last_action)
    AND (
        r.last_cat_id = 0 
        OR (r.last_cat_type = 'ROOT' AND visit_cat.ROOT_value = rule_last_cat.ROOT_value)
        OR (r.last_cat_type = 'SUB_ROOT' AND visit_cat.SUB_ROOT_value = rule_last_cat.SUB_ROOT_value)
        OR (r.last_cat_type = 'CAT' AND visit_cat.CAT_value = rule_last_cat.CAT_value)
        OR (r.last_cat_type = 'SUB_CAT' AND visit_cat.SUB_CAT_value = rule_last_cat.SUB_CAT_value)
        OR (r.last_cat_type NOT IN ('ROOT', 'SUB_ROOT', 'CAT', 'SUB_CAT') AND v.cat_id = r.last_cat_id)
    )
    ORDER BY v.created DESC
    LIMIT 1
) v ON true
LEFT JOIN categories visit_cat_final ON visit_cat_final.id = v.cat_id
LEFT JOIN categories rule_last_cat_final ON rule_last_cat_final.id = r.last_cat_id
WHERE 1 = 1 
AND (r.action = 0 OR u.current_action = r.action)
AND (
    r.cat_id = 0 
    OR (r.cat_type = 'ROOT' AND user_cat.ROOT_value = rule_cat.ROOT_value)
    OR (r.cat_type = 'SUB_ROOT' AND user_cat.SUB_ROOT_value = rule_cat.SUB_ROOT_value)
    OR (r.cat_type = 'CAT' AND user_cat.CAT_value = rule_cat.CAT_value)
    OR (r.cat_type = 'SUB_CAT' AND user_cat.SUB_CAT_value = rule_cat.SUB_CAT_value)
    OR (r.cat_type NOT IN ('ROOT', 'SUB_ROOT', 'CAT', 'SUB_CAT') AND u.current_cat_id = r.cat_id)
)
ORDER BY u.id, v.created DESC NULLS LAST;

Скорее всего задача и код немного кривые, но в итоге при 4 типах правил + вариант "без правила" + action/без action должно было давать множитель 16 сырых данных. Т.е. таблица юзеров * таблица посещений * количество правил * 16 давало какие-то космические цифры в экспейне, которые тупо зависали =) Да, это про olap процессы.

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

Список стран, которые умеют производить cmos матрицы, можно на пальцах пересчитать если верить интернету.

Спасибо! Насколько я помню, грубо говоря в ссд заряд хранится прямо в транзисторе, в этом плавающем затворе. И соответственно заряжать конденсатор уже не нужно, так почему ссд медленнее, чем полевики с конденсаторами в оперативной памяти?

Когда мы замеряем напряжение на конденсаторе, то он как бы "разряжается". Если постоянно его читать, то в конце концов он полностью разрядится, но этого не происходит из-за того, что усилитель его постоянно подзаряжает, всё верно?

Не понял, зачем нужно постоянное напражение для оперативки, ведь если мы закрываем транзистор, то конденсатор оказывается отвязанным от внешнего мира и не должен разряжаться. Понял, заряд постепенно утекает из конденсатора. Почему тогда из накопителей не утекает? И почему нельзя совместить технологию ssd и ram?

В общем кто набредёт на эти комментарии, присмотритесь с к dw3000, а конкретно к модулю bu04, у него две антенны и встроенный МК, с которым можно общаться через AT команды. Без боли можно получить расстояние, направление и ориентацию (в плане впереди сигнал или сзади)

Не понял прикола с Thread.sleep(0); Это о том, что не ленитесь вставлять sleep в if блок?

А можно поподробней или где почитать?

Если БД используется как olap, то всё это рабочие схемы. Переливки во временные таблицы, отключение репликации, расчёт на партициях, блин да даже ram диск использовать это вполне норм. Да, тогда надо брать спарк, но тут речь про постгрю :-)

Вообще если предполагается какое-то массовое удаление и речь зашла про доп. подготовки вроде отключения триггеров, то есть еще вариант - таблицу готовим в рид онли, на её основе создаем новую через `create as select` и переименовываем новую в старую, а старую потом дропаем, иначе это удаление вообще может зависнуть)))

А можете поподробнее описать как измерять фазу? https://forum.qorvo.com/t/how-can-we-extract-the-phase-noise-of-dw1000/11799/2 об этом речь?

@aabzel а не знаете, могут ли два и более устройств одновременно получать расстояние друг до друга? А может еще и направление?

да, но по сравнению с отладочными платами esp32 за 150-250рэ - разница существенная, уже не получится взять и купить 10-20 штучек поиграть)

Цена на эти модули кусачая, но с другой стороны какие здесь аналоги? Я в своё время пытался с десяток esp32 подружить между с собой с помощью RSSI, но на практике это не работает, определить кто на каком расстоянии +-10м сложно

1
23 ...

Информация

В рейтинге
6 382-й
Откуда
Россия
Зарегистрирован
Активность