All streams
Search
Write a publication
Pull to refresh
44
0.1
Валерий Вырва @valery1707

Java backend

Send message

Возможно цены у них тоже подрастут, но я буквально месяц назад взял МиниПК на Intel N150 с 16 Gb DDR4 и 512 Gb SSD M.2 NVMe 2280 в приятном корпусе и пачкой интерфейсов, да ещё и с активированной Win11 чуть менее чем за 10к₽ - там не только Win11 вполне неплохо себя чувствует, но и вполне себе игры идут (хотя и на топовую графику надеяться безсмысленно).
Причём я уверен что можно было найти и дешевле или мощнее - просто у меня не было возможности ждать.

эпоха, когда компьютер для экспериментов стоил столько же, сколько бюджетная пицца, закончилась

А о каком ценнике тут идёт речь?
Для меня бюджетная пицца стоит до 1000₽ ($12), а Raspberry Pi 4 Model B с 1 Гб RAM стоит как минимум $35.

обращаться через MCP SSE

Протокол HTTP+SSE уже объявлен устаревшим, актуальный - Streamable HTTP

Библиотеки, полагающиеся на ThreadLocal, например, старые реализации MDC в логировании, становятся узким местом при миллионах виртуальных потоков.

А какие библиотеки логирования уже отказались от ThreadLocal в своих реализациях MDC?

Используются магические числа, строки и т. д.
При этом видно, что автор пишет на Java не впервые, соблюдает отступы, делит код на логические блоки.

Вы же анализировали не оргинальный код агента, а, как указано в статье, код, полученный в результате его декомпиляции - большая часть из описанного скорее относится к особенностям работы декомпилятора, чем к оригинальному коду.

Я в статье всё ещё вижу "680 млн рублей"

Прыгать на смарте в принципе сильно сложнее: там это несколько тапов, а на ПК всего лишь Alt+Tab.
И да, на смарте запустить несколько инстасов приложения (даже браузера) довольно сложно, а значит и открыть несколько альтернатив и переключаться между ними всё равно не выйдет. На ПК с этим всё сильно проще.

Да, на верхнем уровне исключения часто группируются, но не до уровня Exception, а до базового класса библиотеки.

У ПК не только экран большой, но они ещё и поддерживают функциональную многооконность/многовкладочность - анализировать N альтернатив на ПК реально, а на смарте - это боль.

Возможно у нас с вами разный опыт, но именно "вереницу checked-эксепшенов" я встречаю в коде очень редко, а уже так чтобы она занимала больше двух строк (начиналась на строк объявления функции, занимала полностью ещё одну отдельную, и требовала ещё как минимум одну строку) - это и вовсе практически нонсенс.

Поэтому теперь, если метод принимает в качестве параметра read-only List, я могу быть уверен, что внутри он ее точно не изменит.

Всё же уверенным быть нельзя - можно только надеяться:

fun processDigits(digits: List<Int>) {
    if (digits is MutableList<Int>) {
        digits.add(0)
    }
}

fun main() {
    val digits = mutableListOf(1, 2, 3) // MutableList<Int>
    processDigits(digits)
    println(digits) // [1, 2, 3, 0]
}

Технологический стек: ..., бэкенд: TypeScript + Node.js, ..., плагины: Java.

Тут точно нет опечатки?
Как именно встраиваются плагины на Java в бэкенд на TypeScript + Node.js?

Просто перегистрация с переносом была для них бесплатна, скажет так в рамках поддержки - потому и возились.
Но потом этот момент стал припекать и мигрировали на платное облако.

По исследованию "От нейросетей тупеют?" результат "больше ИИ - меньше запомнил" он, с одной стороны, логичен, но, с другой стороны, не так и "безопасен": логично что если ты был меньше вовлечён в производство результата, то ты меньше запомнишь - как и сами результаты, так и всё что к ним привело. Это схоже с покупкой диплома - диплом, конечно, есть, но с его защитой скорее всего будут сложности, а уж через некоторое время ты уже и не вспомнишь даже его тему и основную мысль.
И в отрыве то всё вроде и норм, но ведь ИИ сейчас начинают активно внедрять для улучшения качества выполнения работы основанной на своих личных качествах и возможностях, то вывод исследования говорит о вероятной деградации личных качеств/возможностей в пользу работы ИИ, при том что ИИ вполне может галлюционировать, да и окно контекста не резиновое - а в итоге в результатах и их предпосылках не сможет разобраться никто: ни "автор" так как он "вайб-кодил", ни ИИ так как "контекст кончился" или галюны пошли.

Да это может звучать как "из-за калькулятора вы разучитесь складывать", но разве это не так? Если не учить детей математическим операциям "на бумаге" и "в уме", а оставить только калькулятор, то они так и не смогут эти операции выполнять самостоятельно и будут полагаться только на калькулятор - и когда "калькулятор" начнёт говорить "2*2 = 5", то вопросов к нему уже не будет.

про AWS у которых free tier сколько уже лет напомните? 15?

Да, у них есть Free tier, но он действует всего год с момента создания аккаунта, а потом всё - или начинай платить или съезжай. А ценник в платном варианте уже то чтобы прямо вкусный.

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

Ну и для регистрации там нужно карту регистрировать, а значит для РФ этот вариант закрыт.

Плюс Typed Errors: Метод явно декларирует варианты результатов и мы обязаны их обрабатывать.

Почему это плюс именно Typed Errors, ведь при использовании Checked Exception метод точно так же декларирует варианты результатов и мы точно так же обязаны их обработать?
Причём при Checked Exception декларируется не просто один тип для ошибки (к тому же обычно общий), а есть возможность указать несколько типов ошибки с возможностью обработать каждый отдельный тип определённым образом.

Плюс Typed Errors: Видно, какие методы возвращают ошибку среди большого количества вызовов.

Почему это плюс именно Typed Errors, ведь при использовании Checked Exception это видно на столько же хорошо?

Минус Exceptions: Сомнительный перформанс при большом количестве исключений.

Это действительно минус, но:

  1. Исключение потому и исключение что оно не должно быть частым случаем.

  2. Исключения не должны использоваться для обычного управления потоком выполнения - только для исключительных ситуаций.

  3. Самая дорога часть это сбор стэка, но если до него не доводить (или отключить его сбор), то стоимость резко снижается, в то время как в случае с Typed Errors даже в случае успешной ветки выполнения есть необходимость в создании инстансов обёрток что тоже не бесплатно, при том что по успешной ветке выполнение по определению идёт чаще.

И в итоге у Typed Errors количество плюсов уменьшается с 3 до 1, а у Exceptions количество минусов уменьшается с 3 до 2 (да и те весьма сомнительны и уже обсуждались выше в комментах).

И в приведённой функции есть неконсистентность:

  • контракт говорит о том что: если функция возвращает true, то аргумент функции mainMotor имеет тип ElectroMotor.

  • тогда как в реальности: функция игнорирует аргумент функции и проверяет тип поля mainMotor из аргумента car.

Да, в примере использования аргумент функции mainMotor содержит значение поля mainMotor из аргумента car, но это частный случай примерения, а не общее поведение.

А ещё лучше код прикладывать не скринами, а кодом:

@OptIn(Experimentatcontracts::class)
fun isHybridCarWithMainElectroAndDieselAdditional(car: Car, mainMotor: Motor, additionalmotor: Motor?): Boolean {
  contract {
    returns(true) implies(car is Hybrid)
    returns(true) implies(mainMotor is ElectroMotor)
    returns(true) implies(additionalMotor is DieselMotor)
  }
  return car is Hybrid && car.mainMotor is ElectroMotor && car.additionalMotor is DieselMotor
}

fun checkCar(car: Car) {
  when {
    isHybridCarWithMainElectroAndDieselAdditional(car, car.mainMotor, car.additionalMotor) -> {
      println("Doing with hybrid and main electro motor and diesel additional motor")
      car.mainMotor.iAmElectro()
    }
  }
}

На сколько я помню это дистиллят от полновесного DeepSeek R1, а не его сжатая/квантизированная версия.

Обычно при работе в команде влитие идёт через Merge/Pull Request, а он завязан на ветку - новая ветка это новый PR, а значит всё обсуждение из старого "теряется", оставая в старом - это как минимум не удобно.
Да и разницы между force-пушем в свою существующую ветку и созданием новой ветки с удалением старой практически нет. Кроме того что ветка будет новая что отразится на том что завязано на имя ветки.

А зачем вообще избегать force-пуша? Это же сервер просто предупреждает о том, что он не сможет плавно переместить указатель ветки на новый коммит - то есть переместить так чтобы не потерять ни один из коммитов входящих в ветку в данный момент, а если локально проводился squash, amend или rebase, то это как раз и приводит к ситуации когда часть коммитов (про которые знает сервер) из ветки выпадают и force при пуше просто говорит ему "да, клиент знает что делает - терять коммиты можно".

При командной работе force-пуш в релизные ветки обычно запрещён политиками, изменять что-то в чужих в целом не принято, а с историей коммитов в своих ветках можно делать всё что угодно.

1
23 ...

Information

Rating
3,984-th
Location
Воронеж, Воронежская обл., Россия
Date of birth
Registered
Activity