Задать вопрос
  • Является ли хорошей практикой использование Stack Trace библотек в дебаг сборке?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Это нормальная практика. Например, ваш браузер скорее всего именно таким инструментом пользуется (если он на хромиуме основан).
    Ответ написан
    9 комментариев
  • Header-only. Страдает ли размер бинарника?

    @Mercury13
    Программист на «си с крестами» и не только
    Для шаблонов Си++ в линкеры пришлось добавлять специальное исключение — ведь расшаблоненные функции будут повторяться в каждом имеющемся объектном файле.

    Теста ради сделал такой проект

    // MAIN.CPP
    #include <iostream>
    
    #include "tmpl.h"
    
    void doFile1();
    
    int main()
    {
        const char* x = "main";
        outThing(x);
        doFile1();
        return 0;
    }
    
    // FILE1.CPP
    #include "tmpl.h"
    
    void doFile1()
    {
        const char* x = "doFile1";
        outThing(x);
    }
    
    
    // TMPL.H
    #pragma once
    
    #include <iostream>
    
    template <class T>
    void outThing(const T& x)
    {
        std::cout << "The thing is " << x << std::endl;
    }


    Для чего x — при расшаблонивании появилось outThing(char[5]&) и соответстсвенно char[8]&.
    А теперь дамп линкера
    Discarded input sections
    
     .text$_Z8outThingIPKcEvRKT_
                    0x0000000000000000       0x50 debug/main.o
    
    Linker script and memory map
    
    .text$_Z8outThingIPKcEvRKT_
                    0x0000000140002900       0x50 debug/file1.o
                    0x0000000140002900                void outThing<char const*>(char const* const&)
    
    Ну и ещё парочка структур для раскрутки стека и подстановки адресов…


    Так что даже при -O0 оно не будет ничего дублировать. Да и логикой понятно: что дублировать, что не дублировать — один хрен потребуется специальная логика, и разницы мало.
    Ответ написан
    1 комментарий
  • Какова уязвимость данного подхода?

    ky0
    @ky0
    Миллиардер, филантроп, патологический лгун
    Поздравляю, вы изобрели "your own PFS" :)

    В принципе, внутри нормально зашифрованного канала можно делать что угодно, хоть обменяться ключами и установить новое, на основе этих ключей, соединение - только зачем? Всякого рода IPSec-туннели и site-to-site впны для того и служат, чтобы можно было внутри них пускать нешифрованный трафик, если, например, протокол шифрования не умеет.
    Ответ написан
    3 комментария
  • IntelliJ IDEA(или любая IDE Jetbrains) - можно ли как-то скрыть assert'ы?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Ну в принципе любой код можно скрыть (code folding) в IDEA.

    Можно например, выделить код и нажать ctrl + ' . '

    Можно попробовать выделить код, затем нажать ctrl + alt + T (Code -> Surround with) и выбрать удобный для вас тег, а затем прописать название для fold и скрыть блок

    https://www.jetbrains.com/help/idea/code-folding-s...

    Плагинов, которые автоматически скрывали бы assert я не встречал, но в принципе можно и написать небольшой плагин
    Ответ написан
    2 комментария
  • Есть ли уже существующая структура данных для данной задачи?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Смотрите решение задачи о рюкзаке через динамическое программирование.

    Постройте двумерный массив, который будет говорить, можно ли собрать данную сумму первыми k объектами.

    Используя его можно относительно быстро восстанавливать все множества с заданной суммой а заодно посмотреть, какие суммы возможно набрать.
    Ответ написан
    1 комментарий
  • Почему скорость битовых операций отличается в 1000 раз?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Скорее всего, обращение к массиву тормозит. Там, видимо, еще и проверки на попадание в границы массива происходят.

    Если вы место обращения к массиву будете делать currentByte & (1 << (7-j)), то должно работать почти также быстро.

    P.s. и вообще у вас какой-то странный выбор порядка битов. Обычно сдвигают вправо, к младшему биту. Тогда вместо маски будет тупо 0x1.
    Ответ написан
  • How to properly check backend for updates in background?

    iLLuzor
    @iLLuzor
    Java, Kotlin, Android Developer
    Это делается через пуши.
    Ответ написан
  • Closure Vs Common Function pointer?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Если лямбда или анонимный класс не используют переменных из объемлющей области видимости, то компилятор не станет их захватывать и разницы со ссылкой на метод не будет. Чтобы убедиться в этом, проведём эксперимент. Нам понадобится три класса:
    import java.util.function.Supplier;
    
    public class ExampleWithMethodRef {
        private static String someMethod() {
            return "Internal value";
        }
    
        public static void main(String[] args) {
            String value = "External value";
            Supplier<String> lambda = ExampleWithMethodRef::someMethod;
        }
    }

    import java.util.function.Supplier;
    
    public class ExampleWithLambda {
        public static void main(String[] args) {
            String value = "External value";
            Supplier<String> lambda = () -> "Internal value";
        }
    }

    import java.util.function.Supplier;
    
    public class ExampleWithCapturingLambda {
        public static void main(String[] args) {
            String value = "External value";
            Supplier<String> lambda = () -> value;
        }
    }

    Скомпилируем все три и запустим с параметром -Djdk.internal.lambda.dumpProxyClasses=. В рабочем каталоге появятся классы, в которые разворачиваются лямбды и ссылки на методы. Посмотрим, что у них внутри:

    javap -p -c ExampleWithMethodRef$$Lambda$1
    final class ExampleWithMethodRef$$Lambda$1 implements java.util.function.Supplier {                       
      private ExampleWithMethodRef$$Lambda$1();                                                               
        Code:                                                                                                 
           0: aload_0                                                                                         
           1: invokespecial #10                 // Method java/lang/Object."<init>":()V                       
           4: return                                                                                          
                                                                                                              
      public java.lang.Object get();                                                                          
        Code:                                                                                                 
           0: invokestatic  #19                 // Method ExampleWithMethodRef.someMethod:()Ljava/lang/String;
           3: areturn                                                                                         
    }


    javap -p -c ExampleWithLambda$$Lambda$1
    final class ExampleWithLambda$$Lambda$1 implements java.util.function.Supplier {                          
      private ExampleWithLambda$$Lambda$1();                                                                  
        Code:                                                                                                 
           0: aload_0                                                                                         
           1: invokespecial #10                 // Method java/lang/Object."<init>":()V                       
           4: return                                                                                          
                                                                                                              
      public java.lang.Object get();                                                                          
        Code:                                                                                                 
           0: invokestatic  #19                 // Method ExampleWithLambda.lambda$main$0:()Ljava/lang/String;
           3: areturn                                                                                         
    }


    javap -p -c ExampleWithCapturingLambda$$Lambda$1
    final class ExampleWithCapturingLambda$$Lambda$1 implements java.util.function.Supplier {                                            
      private final java.lang.String arg$1;
                                                                                                                                         
      private ExampleWithCapturingLambda$$Lambda$1(java.lang.String);                                                                    
        Code:                                                                                                                            
           0: aload_0                                                                                                                    
           1: invokespecial #13                 // Method java/lang/Object."<init>":()V                                                  
           4: aload_0                                                                                                                    
           5: aload_1                                                                                                                    
           6: putfield      #15                 // Field arg$1:Ljava/lang/String;                                                        
           9: return                                                                                                                     
                                                                                                                                         
      private static java.util.function.Supplier get$Lambda(java.lang.String);                                                           
        Code:                                                                                                                            
           0: new           #2                  // class ExampleWithCapturingLambda$$Lambda$1                                            
           3: dup                                                                                                                        
           4: aload_0                                                                                                                    
           5: invokespecial #19                 // Method "<init>":(Ljava/lang/String;)V                                                 
           8: areturn                                                                                                                    
                                                                                                                                         
      public java.lang.Object get();                                                                                                     
        Code:                                                                                                                            
           0: aload_0                                                                                                                    
           1: getfield      #15                 // Field arg$1:Ljava/lang/String;                                                        
           4: invokestatic  #28                 // Method ExampleWithCapturingLambda.lambda$main$0:(Ljava/lang/String;)Ljava/lang/String;
           7: areturn                                                                                                                    
    }


    Невооружённым глазом видно, что байткод вариантов со ссылкой на метод и лямбдой, не использующей переменную, идентичен, в обоих случаях происходит обращение в пул констант. Но если лямбда обращается к переменной, то в прокси-классе появляется поле arg$1, содержащее значение захватываемой переменной. Формально это влияет на потребление памяти, но если вы не собираетесь генерировать лямбды миллионами, то это влияние которым можно пренебречь, тем более во времена, когда даже на мобильных устройствах объёмы памяти измеряются гигабайтами.
    Ответ написан
    1 комментарий
  • Почему параллельное I/O медленнее?

    Jump
    @Jump
    Системный администратор со стажем.
    Выяснил, что нежелательно иметь более 1-го потока для Дискового i/o
    Ну хотя бы потому что исполнительный механизм диска один - и в один момент времени будет выполнятся одна операция. А остальные будут ждать очереди.

    Если у нас один поток читает файл - будет очередь запросов этого потока. Фактически линейное чтение - такое диск отрабатывает на максимальной скорости. Обычный HDD показывает линейное чтение на уровне 100-200мегабайт в секунду.

    Если у нас десять потоков читает - у нас будет очередь запросов из разных потоков. Линейного чтения уже не будет, будет случайной чтение. А случайное чтение диски отрабатывают очень медленно. Обычный hdd покажет максимум 1мегабайт в секунду.
    Ответ написан
    5 комментариев
  • Сongestion avoidance (UDP)?

    @Drno
    чем меньше пакетов, тем быстрее они обработаются... особенно если это TCP
    Ответ написан
    5 комментариев
  • Производительность системы обмена сообщениями?

    402d
    @402d
    начинал с бейсика на УКНЦ в 1988
    В теории, там тяжелая операция , только снятия элемента с головы очереди. Опять же в теории она может
    оказаться выполняемой вместе с обновлением стекающего тока в микросхемах памяти.
    На практике нужно глубоко покопаться в всех этих виртулизациях . А так операция копирования данных
    в ОЗУ из одного места в другое , выполняется вспомогательными контролерами, а не АЛУ.
    Сорри, что в терминах ранних процессоров.
    Ответ написан
    3 комментария
  • Как ускорить выборку данных MongoDb?

    Посмотрите на explain запросов. Похоже что индексы созданы не оптимально.
    Ответ написан
    Комментировать
  • Для чего нужны пакетные менеджеры для js, например Yarn?

    1) При чем здесь NPM? На кой черт он сдался Node'у? И как он перекочевал во фронтенд? Это просто интересная фича Node, которую начали использовать фронтендеры, а bower развивался параллельно?

    Это пакетный менеджер, чтобы распространять пакеты централизованно, а не искать по всем закоулкам интернета. К этому пришли/придут все языки/среды разработки. У c# есть nuget, у php - composer...

    3) Зачем мне (буду говорить просто) на "сайте" какой-то файл package.json, lock.json? И вообще, зачем мне какие-то зависимости? Установка - да, удобно. Но ведь все условно плагины (галерейки, jquery и пр., и пр.) являются частью сайта и друг от друга не зависят обычно.

    все условно плагины

    Это хорошо, если написанный Вами код использует только зависимости первого уровня вложенности. В проектах бОльшего масштаба, вложенность зависимостей может достигнуть и 3 и 5 уровней. Это когда используемый Вами пакет зависит еще от трех пакетов, каждый из которых, в свою очередь, зависит еще от нескольких, каждый из которых может принести еще несколько зависимостей... Соберете руками?
    Максимум - плагин jquery зависит от самой jquery.

    Это в Вашем кейсе так. Но не значит, что у всех поголовно.

    Надо передать среду разработки - отдаю vagrantfile

    vagrant - сторонняя зависимость.

    Вы не смотрите, что Node.js - весь такой из себя сервер. Это в первую очередь тулчейн для разработки, а потом уже интерпретатор js. Ибо исторически, до появления node, сама только мысль о js на сервер-сайде вызывала эмоции вида "WTF? O_o Seriously?" и "LOL xD". Потому node.js релизился именно как готовый тулчейн для разработки поверх интерпретатора js. То, что над репозиторием npm появились другие менеджеры - это работа сообщества. Чем они лучше/хуже и в каких кейсах - думаю, практикующие люди вам ответят сегодня. Хотя, скорее всего отправят в поиск.
    Ответ написан
    Комментировать
  • Как организовать архитектуру взаимодействия микросервисов?

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

    Нужно придумать задачу, где сервисы будут более независимы друг от друга. Тогда и не будете мучаться чтобы понять, как сделать сервисы более автономными. В идеале любой сервис может продолжить свою работу, и реализовывать все или часть своих функций, если другие сервисы лежат. Хорошо например, если между сервисами А и Б взаимодействие реализовано через очередь сообщений - тогда упавший сервис Б после поднятия разгребёт эту очередь и выполнит всё то, что успел попросить у него сервис А пока Б лежал.

    Об аутентификации можно тоже говорить много и долго, обычно чтобы жить некоторое время без сервиса аутентификации её делают по токенам (JWT например). Тогда целевой сервис сам может проверить, авторизован человек или нет.

    Если уж так хочется бложик, то я бы оставил его в покое в виде самостоятельного сервиса, а в качестве других сервисов сделал бы:
    - уведомления о новых комментариях/постах в мессенджер/почту (как раз хорошо будет через MQ общаться с основным сервисом);
    - какую-нибудь аналитику элементарную, которая независимо собирается, например по посетителям, телеметрию короче;
    - сервис автопостов - заказываешь пост с нужным содержимым на указанную дату и время, этот сервис пользуется API основного сервиса бложика и постит что-либо без вашего участия.

    Вот уже что-то будет интересное. Обратите внимание, что пожалуй все из этих трёх сервисов могут работать без основного, и наоборот - основной сервис может класть сообщения в очередь для других сервисов (1-го и 2-го), и сервисы будут разгребать эту очередь пока работают.
    Ответ написан
    Комментировать
  • Many-to-many как избежать Race conditions?

    Вижу два решения - использовать очереди или выполнять проверку на уровне триггеров БД.
    Ответ написан
    Комментировать
  • Many-to-many как избежать Race conditions?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Блокировка таблицы или SQL-запрос, составленный так, чтобы возникала ошибка при попытке добавлении лишней записи.
    Например, для MySQL
    INSERT 
      INTO `users_subscriptions` (`user_id`, `subscription_id`)
      SELECT IF(`count` < 5, :userId, NULL), :subscriptionId
        FROM (
          SELECT COUNT(*) AS `count`
            FROM `users_subscriptions`
            WHERE `user_id` = :userId
        ) AS `t`
    Ответ написан
    Комментировать
  • Many-to-many как избежать Race conditions?

    @yayashitoya
    Как можно избежать этого ?


    Все уже придумано до нас. Лет эдак за 50.
    Делать в одной транзакции. И проверку и добавление подписки.
    Ответ написан
    Комментировать
  • Корректный вид URL для end point'a?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Если это RESTFUL, то
    Метод: PUT
    Путь: /events/:event_id
    Данные: title=Great+event&owner=Karl

    То, что у вас написано, больше похоже на фрагмент JSON-RPC.
    Ответ написан
    Комментировать
  • Корректный вид URL для end point'a?

    inoise
    @inoise
    Solution Architect, AWS Certified, Serverless
    1ый. А еще лучше
    GET /events - список событий с фильтром
    GET /events/:id - данные одного выделенного события
    POST /events - создание нового
    PUT /events/:id - обновление события
    DELERE /events/:id - удаление события
    Ответ написан
    Комментировать