Как стать автором
Обновить
51
0.2
Дмитрий @bogolt

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

Отправить сообщение

8.04 имхо была последняя убунта с человеческим лицом, потом гуи стал ухудшаться, потом появился юнити и другая чушь... сейчас вроде привык но до сих пор скучаю по более простым но функциональным интерфейсам того старого гнома.

Ну так одно дело старая рабочая система, которую сложно поменять, другое качать сегодня десятку убунты, которая уже много лет не поддерживается даже. Впрочем если что я понимаю что это просто скриншот старый вероятнее всего, но это и зацепило, ожидаешь увидеть в объявлении новой версии новый красивый скриншот ( с новыми нескучными ncurses ).

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

Ого, кто-то на новом rtorrent раздает версию убунты вышедшую 14 лет назад! =)

Тогда я был неправ получается, прошу прощения.

Ладно, пошел

дальше, попробовал вашим методом посчитать квадратаное уравнение.

   // x*x -3x - 4 = 0 ( roots: 4, -1 )
    auto a = 1.0;
    auto b = -3.0;
    auto c = 4.0;
    auto disc = calculateDiscriminant(a, b, c);
    auto r = calculateRootsByDiscriminant(disc, a, b);

Увы ни одного из корней ваша функция найти не смогла, хотя они там есть.

Считаю что если уж вы выкладываете код, он должен быть протестирован, тем более что подобные функции тестировать это же счастье - скачать задачник, напихать в таблицу примеров и ответов, и убедится что ваш код считает все что записано в таблице.

Вы приводите очень плохие примеры Си++ кода, я не осилил всю статью но вот это ужасно:

class User {
private:
    int userid;
    std::string password;
    double cash;
public:
    void top_up_account(double sum) {
        cash += sum;
    }

    double withdraw_funds(double sum) {
        if (cash < sum)
            return 0;

        cash -= sum;

        return cash;
    }
}

Итак у нас есть класс, в котором три переменные. При этом переменная password будет инициализированна своим дефолтным конструктором, то есть получит пустое значение, а вот что мы будем делать с userid и cash? Мда, боюсь внутрь будет записан какой-то мусор из оперативной памяти. Но постойте, ведь у нас есть целых два метода с помощью которых можно менять эти переменные? Ну да можно менять, но повляять на исходные значения никак нельзя.

Тут как в шуточной задачке: "Буратино дали три яблока, два он съел. Сколько яблок осталось у Буратино?

Ответ: неизвестно, потому что мы не знаем сколько у него их было до этого."

А вот собственно что выводит ваш класс ( если открыть доступ к переменным )


User u;
    cout << "user: " << u.userid << ",cash: " << u.cash << endl;
    user: 1061167616,cash: 6.9526e-310

Решение:

  1. используйте значения по умолчанию, благо на дворе давно не 2003 год, новые стандарты позволяют писать намного более безопасный си++

class User {
private:
    int userid = 0;
    std::string password;
    double cash = 0.0;

И теперь все становится гораздо лучше. Теперь даже если вы не определите конструктор класса все переменные получат разумные начальные значения.

Как правило там девайсы 13-16 дюймов, и да людям комфортно работать. Видимо этой категории людей большой экран не столь важен. Я лично тоже предпочитаю что-то покрупнее, для меня ноут+внешний большой монитор полностью решает вопрос мобильности и нормального экрана и клавиатуры.

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

Благодаря тому, что микроядро и все компоненты написаны на ассемблере и Rust, разработчикам удалось снизить вероятность возникновения багов и уязвимостей.

Ну про раст понятно, но ассемблер то каким боком к защите от уязвимостей ?

Можно, но слишком много движений и лишнего кода. С таким же успехом можно ничего не делать, кода будет меньше, код будет проще поддерживать.

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

Ну так и данных обрабатывала система в разы меньше. Сайты были примитивнее, экраны меньше. Я вот привел примеры того что реально куча вещей тогда тормозила, ну нельзя было установить ОС за 15 минут ( как сегодня ставится убунта ), да даже установка игры ( с диска например ) занимала ощутимо много времени. Ну или вот я помню как играл в "Проклятые Земли" на эээ 486 компе кажется. Загрузка игры ( а загружаться приходилось часто ) занимала вечность. Натуральную вечность. Да даже в примитивном БГ1 или Фоллауте загрузки были долгими.

А что именно шустро работало? Система загружается, идем ставить чайник. Запуск любой программы - тоже долго ждать. Установить диал-ап соеденение? открыть какую-то страницу в вебе - все долго. Помните как страницы грузились, вот появилась разметка, начал грузится текст.. потом картинки. Да я помню как книги на либ-ру где тупо текст только грузились по минуте.

Так что именно было быстро, что сегодня стало долго ?

Да, прикольно, я немного упросил свою задачу, там на самом деле читаются данные из базы через sqlx, два раза считывать данные из бд не вариант в отличие от парсинга json поэтому хотелось получить именно вложенную структуру.

Где же вы были года два назад, мы как раз гошников искали =(

Решать проблемы копипасты я же написал. У меня случай когда приходят данные разные + немного общих. Хочу вытаскивать общие через эту шаблонную функцию, а частные запихивать как структуру данных.

type A struct {
  X int
}

type B struct {
  S string
}

data = `{"X": 10, "total":100}`

parsedA, total, err := ParseData[A](data)

data = `{"S": "test", "total":5}`
parsedB, total, err := ParseData[B](data)

вот такого хочется, чтобы Total извлекался сам, так как я знаю что он есть в каждой структуре, но при этом сам он мне в типах A, B не нужен

лучше сравнивать через time.Since(started) без преобразования к UnixMicro() потому что в вашем случае вы сравниваете абсолютное время, а в случае time.Since() будет использован монотонный таймер.

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

Потому что реализовали их так что и использовать почти нигде нельзя.

Вот сегодня хотел сделать

func DoSomething[T any](data T) {
  type Request struct {
     T
     MoreData int
  }
  ///...
}

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

Отсутствуют исключения

ну если очень нужно можно панику кинуть, у нее наиболее близкий с исключениями механизм работы. Но лучше конечно не надо.

`if err` может и выглядят некрасиво но обладают достоинством предсказуемости и видимости. Небольшая "лишняя" нагрузка зато огромный выразительный пласт, который сразу говорит "здесь что-то может пойти не так". И каждый раз вы принимаете решение, что-то вроде

  1. не могу дальше работать - выбрасываем ошибку наружу

  2. в общем ерунда, можно обработать локально, вывести лог и продолжить работу или сделать что-то еще

и все, код получается до безобразия предсказуемый и понятный.

Сотрудники заботящиеся о благосостоянии компании которая платит им зарплату, как по мне, что-то из мифов.

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

1
23 ...

Информация

В рейтинге
2 467-й
Зарегистрирован
Активность