• Может ли быть API не как API?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    Нет, не "должен", но может. Лично я пришел к такой схеме:
    - 200-ые статус коды отправляются ТОЛЬКО тогда, когда все прошло успешно. В таком случае не будет никаких success: true или response: {} - а нужные данные, прямо на первом уровне нестинга. Собственно если взять за правило, что 200-ые коды возвращаются когда все ок, то можно полностью избавлятся от этих плохих проверок на наличие ключа в респонсе.
    - 400-ые и 500-ые будут попадать в отдельный колбек/реджектить промис, опять же избавляя от нужды проверять какие-то ключи. Для всех кодов ответов, кроме 400 и 422 - в ответе нету нихрена. Ни code, ни message, ни response. Вообще ничего. Вся инфа находится в самом http status коде. Для 400 и 422 прибавляется параметр code, который является номером ВНУТРЕННЕЙ ошибки (ну, например, есть какие-то предусловия для выполнения запроса - уникальность эмейл адреса при регистрации как пример) - по ней фронт может показывать отдельные ошибки либо выполнять какую-то логику.

    Плюс ко всему этому у себя локально и на сервере для фронта включен дебаг, добавляющий некий параметр _debug к каждому ответу. В нем может хранится любая инфа - сообщение с ошибкой (даже если ее можно понять по http коду или внутреннему), стак трэйс 500-ой ошибки и тд.
    Ответ написан
    Комментировать
  • Как применить изменения к НЕ последнему коммиту?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Есть ветка и три коммита в ней AAA-BBB-CCC...
    Далее были сделаны правки, но их надо применить к коммиту BBB

    git commit -a -m fixes
    git rebase -i AAA

    перенести fixes после BBB, заменить pick перед fixes на fix.

    Всё то же самое, но автоматически:
    git commit -a --fixup BBB
    git rebase --autosquash AAA
    Ответ написан
    1 комментарий
  • Почему отсутствуют подходящие комплекты в Qt?

    vt4a2h
    @vt4a2h
    Senior software engineer (C++/Qt/boost)
    Вам нужно:
    0) Начать пользоваться английской версией всего. Русская локализация на самом деле ужасна.
    1) Перейти на вкладку "Профили Qt" и добавить корректный профиль (если там его уже нет, если есть, то перейти к шагу 3). Для этого нажмите "Добавить" и укажите путь к qmake.exe из установленной версии Qt. Для этого, скорее всего надо ещё и установить отдельно Qt.
    2) Нажать "Применить"
    3) На вкладке "Комплекты" указать добавленный профиль Qt.
    4) Нажать "Ok".
    Ответ написан
    Комментировать
  • Редактирование сайта + git. Как правильно выстроить работу?

    @balamyt92
    ; select * from users; --
    Подскажите, как вы работаете с проектами?

    нужно поднимать локальный веб сервер
    это не удобно.

    что в этом не удобного? неудобно это заниматься этим:
    править файлы проекта в Sublime Text и сразу через SFTP менять их на сервере
    Ответ написан
    3 комментария
  • Что означает const при объявлении переменной в данном случае?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега C
    Седой и строгий
    Квалификаторы могут применяться к любым типам, в том числе уже квалифицированным.

    Например
    const char a;
    const char const a;
    const const char a;
    const const const const const char a;

    обозначают одно и то же - константу типа char.
    Ответ написан
  • Как ограничить смещение битов?

    @res2001
    Developer, ex-admin
    Вам нужен циклический сдвиг?
    Придется реализовывать самому - просто проверьте перед сдвигом последний бит, если он равен 1, то после сдвига прибавьте 1 к числу.
    if(m_d[i] & 0x80) {
      m_d[i] = (m_d[i]<<1);
      ++m_d[i];
    } else {
      m_d[i] = (m_d[i]<<1);
    }
    Ответ написан
    Комментировать
  • Почему нельзя перегрузить оператор?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    bool& operator [] (int index) {
        return selfVector[index];
      }

    должен стать
    std::vector<bool>::reference operator [] (int index) {
        return selfVector[index];
      }
    Ответ написан
    Комментировать
  • Компиляция c++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    получается mainx узнает о том что есть функция printx() на этапе линковки [mainx.o] и [printx.o]?

    Да.

    Каким образом происходит передача информации в [mainx] что функция printx() существует?

    Это работа линковщика связывать ссылки на неопределённые символы с определениями этих символов.
    В main.o в месте вызова printx ставится команда вызова, в секции символов заводится неопределённый символ printx а в секции релокаций заводится запись, связывающая команду вызова с символом:

    objdump -dr mainx.o
    ...
    0000000000000000 <main>:
       0:   55                      push   %rbp
    ...
      3a:   89 c7                   mov    %eax,%edi
      3c:   e8 00 00 00 00          callq  41 <main+0x41>
                            3d: R_X86_64_PLT32      _Z6printxi-0x4
      41:   b8 00 00 00 00          mov    $0x0,%eax
      46:   c9                      leaveq 
      47:   c3                      retq   
    ...


    readelf -a mainx.o
    ...
    Relocation section '.rela.text' at offset 0x580 contains 12 entries:
      Offset          Info           Type           Sym. Value    Sym. Name + Addend
    ...
    00000000003d  001400000004 R_X86_64_PLT32    0000000000000000 _Z6printxi - 4
    ...
    
    Symbol table '.symtab' contains 25 entries:
       Num:    Value          Size Type    Bind   Vis      Ndx Name
    ...
        20: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND _Z6printxi
    ...


    В printx.o в секции символов заводится символ, ассоциированный с адресом в коде, где определена функция printx:

    readelf -a printx.cpp
    ...
    Symbol table '.symtab' contains 24 entries:
       Num:    Value          Size Type    Bind   Vis      Ndx Name
    ...
        14: 0000000000000000    75 FUNC    GLOBAL DEFAULT    1 _Z6printxi
    ...

    Здесь value == 0 -- потому что printx оказалась по адресу 0 в секции .text.

    Линковщик объединяет входные секции согласно скрипту линковки, после чего вставляет конечные адреса символов в места, которые ссылаются на них.
    Ответ написан
    Комментировать
  • Как программируют телекоммуникационное оборудование?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Вообще-то, это не так работает. Сначала ставится задача типа "Разработать устройство такое-то с такими-то функциями". Далее это все прорабатывается до полноценного ТЗ со всеми подробностями. Далее это ТЗ передается инженерам, которые уже под требования ТЗ подбирают оборудование и ПО. Программисты сразу получают плату разработчика с тем же процессором и на ней уже могут производить отладку ОС и ПО. Инженеры тем временем проектируют плату, электронику, тестируют это все. В большинстве роутеров сегодня работает обычный линукс и на обычном процессоре типа ARM. Большая часть того, что там используется стандартизировано и легко покупается и компонуется в один девайс. ПО там зачастую обычный веб сервер с кучей скриптов для настройки стандартных линуксовых прогамм.
    В более сложных и больших сетевых устройствах, которые работают на магистралях, например, все несколько сложнее — там могут использоваться специальные процессоры и ПЛИС, которые программируются несколько иначе. Так же там может быть вообще полностью своя прошивка или какие-то другие специфические системы.
    Ответ написан
    Комментировать
  • Как правильно передавать функцию как параметр C++?

    @Mercury13
    Программист на «си с крестами» и не только
    Не забывайте, что у startManufacturing есть скрытый параметр this.

    Четыре варианта.

    1. Использовать указатель на метод App:
    Rest::function(char * function_name, int (App::* f)(String), App& object)
          // вместо App можно какой-то интерфейс, который App реализует
    …
    object.*f("string");
    ...
    bt_rest.function("", &App::startManufacturing, *this);


    2. Сделать startManufacturing static:
    class App {
      static int startManufacturing(String command)
    };


    3. Сделать обёртку с замыканием:
    Rest::function(char * function_name, int (*f)(String, void*), void*);
    
    void doStartManufacturing(String command, void* closure) {
      reinterpret_cast<App*>(closure)->startManufacturing(command);
    }
    ...
    bt_rest.function("startManufacturing", doStartManufacturing, this);


    4. «Избегай незнакомых женщин и глобальных переменных». Костыль, в общем.
    App app;
    int doStartManufacturing(String command) { return app.startManufacturing(command); }
    ...
    bt_rest.function("startManufacturing", doStartManufacturing);


    Ах да. Вы передаёте String’и по значению. Приспособлены они к такой передаче или всё же лучше по ссылке?
    Ответ написан
    6 комментариев
  • Как сделать прелоадер на сайт в %?

    alsolovyev
    @alsolovyev
    ¯\_(ツ)_/¯ Enjoy life, Eat well & Laugh often
    демонстрация мокапов, очень много изображений которые очень высокого разрешения для ретины

    Подгружайте картинки js'ом(lazy load). Пусть вся станица будет 10%, то каждая загруженная картинка будет 90% / n-image. Вот и обновляйте статус после каждой картинки.

    Но изначально подход какой-то странный. Вы заставляете клиента ждать загрузки картинок всех? Почему не использовать lazy load? Под каждой картинкой pre-loader и по мере загрузки страницы меняйте pre-loader на картинку. Пусть клиент смотрит на 1 пока остальные грузятся.

    Ну и если уж совсем 'правильно', то делайте адекватную preview-картинку(маленького размера). Если ему понравится, то он перейдет на странице с полноразмерной картинкой
    Ответ написан
    1 комментарий
  • Где можно попрактиковаться в разговорном английском?

    webinar
    @webinar
    Учим yii: https://youtu.be/-WRMlGHLgRg
    Находите компанию оказывающую услуги в США, со скайп контактом, звоните, расспрашиваете про услуги. Например, банк и условия по ипотечному кредитованию или web студия и высняете сколко стоит сделать сайт. Смотря какая тематика нужна.
    Ответ написан
    Комментировать
  • Как сделать цепную функцию самостоятельно на JS?

    @domoratskii
    Вам нужно каждый раз возвращать текущий объект. Это делается добавлением return this в конце каждого метода.

    var life = {
      day: 0,
      up() {
        this.day++;
        return this;
      },
      down() {
        this.day--;
        return this;
      },
    }
    
    life.up().up()
    console.log(life.day) //2
    Ответ написан
    5 комментариев
  • Форматы данных для текста и вложений?

    Имхо, в таких случаях лучше использовать БД, например тот же sqlite.
    Ответ написан
    Комментировать
  • Как проверить есть ли в ассоциативном массиве определённое значение JavaScript?

    @undefined_title
    в js {} - это обычный объект, в этом языке объекты играют две роли, как переносчики данных и как обычный объект

    Object.values(obj).some(value => !value);
    вернет true если есть хоть одно пустое значение, null, undefined, "", false и тд.
    (Object.values(obj).filter(value => !value)).length

    вернет количество пустых значений
    Ответ написан
    Комментировать
  • Как перебрать такой массив?

    То что вам нужно называется Reduce.
    var result = array.reduce((previous, current) => {
        if (previous.hasOwnProperty(current)) {
             previous[current]++;
        } else {
             previous[current] = 1;
        }
        return previous;
    }, {});

    На выходе получится как раз то, о чем говорил Сергей Соколов
    Ответ написан
    1 комментарий
  • У меня есть два объекта-коллекции, как объединить их?

    Negwereth
    @Negwereth
    lvivcss.com.ua
    const map = new Map();
    
    [...a, ...b].forEach(item => {
      if (map.has(item.city)) {
        Object.assign(map.get(item.city), item);
      } else {
        map.set(item.city, item);
      }
    });
    
    const merged = [...map.values()];
    
    console.log(merged);
    Ответ написан
    Комментировать