• Как разработать мобильное приложение с использвонием DRF?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Django
    Седой и строгий
    На любом.
    Ответ написан
    Комментировать
  • Как лушче спроектировать максимально точную модель промышленного предприятия?

    Stalker_RED
    @Stalker_RED
    Какой паттерн проектирования ... возможно, абстрактная фабрика будет уместна
    да, конечно. Абстрактная фабрика более уместна, чем какая-то конкретная фабрика, типа парфюмерной фабрики, или птицефабрики.
    Ответ написан
    2 комментария
  • На каком языке сейчас чаще всего программируют микроконтроллеры?

    @majstar_Zubr
    C++, C#, gamedev
    У Java ME есть минимальные системные требования для целевых устройств.
    Взглянув на них, становится понятно, что это не для микроконтроллеров в общем случае. Конечно, встраиваемая система встраиваемой системе рознь, но вот микроконтроллеры ещё используют не только для встраиваемых систем, а прямо в железо, например, радио-приемопередающего устройства, спроектированного на работу с протоколом физического уровня. Такие контроллеры могут иметь килобайты памяти всех видов. Зачастую, такие девайсы предлагают не так много ассемблерных инструкций, чтобы имело смысл делать под них компилятор Си. В более универсальных микроконтроллерах компилятор есть, поэтому это вполне себе повод для радости.

    Там, где можно развернуть JME, уже есть Linux kernel, поэтому ответ на вопрос о том, почему больше используется Си, чем Java, заключается в том, чем занимается компания, в чем у нее бизнес и какой у нее рынок. Количественно, решений, которым нужно JME просто меньше, относительно тех, в которых не нужна прослойка в виде ОС.
    Ответ написан
    Комментировать
  • На каком языке сейчас чаще всего программируют микроконтроллеры?

    fox_12
    @fox_12
    Расставляю биты, управляю заряженными частицами
    почему для этой цели (как я читал на других источниках) язык Си выбирают чаще чем свой более развитый аналог - Java

    Пример контроллера - ATTiny13:
    - 1 КБ внутрисистемно программируемой Flash памяти программы
    - 64 байта внутрисистемно программируемой EEPROM памяти данных,
    - 64 байта встроенной SRAM памяти

    Удачи с размещением виртуальной машины Java + кода самой программы с учетом имеющихся ресурсов...
    Ответ написан
    5 комментариев
  • Где найти друга программиста?

    SpacePurr
    @SpacePurr
    c#, wpf
    Ясное дело на дваче
    Ответ написан
    Комментировать
  • Как писать чистый код на Python?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Практика.
    Ответ написан
    Комментировать
  • Какую базу данных учить?

    @dmshar
    Зависит от того, в каком классе вы учитесь.
    Ответ написан
    Комментировать
  • Влияет скорость python на веб-программирование?

    fox_12
    @fox_12 Куратор тега Python
    Расставляю биты, управляю заряженными частицами
    Python очень медленный язык и не годится для профессиональной деятельности, а только для обучения

    А пацаны из Google, NASA, Youtube, Pinterest, Instagram и прочих - то не в курсе оказывается...
    Че с них взять - дилетанты...

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

    Для веб-программирования выбор языка - далеко не первостепенной важности задача.
    На практике вы чаще упретесь в другие причины, нежели в ограничения языка.
    Ответ написан
    Комментировать
  • Python vs C# Какая разница?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Нет, не будет.
    Ответ написан
    Комментировать
  • Как работает сборщик мусор с колбеками Promise?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Сборщики мусора (далее GC) бывают разные, в том же v8 используется сразу 3 типа GC в зависимости от поколения объектов (упрощенно молодое, старое и сложные случаи), но в большинстве своем принцип работы сводится к просчету достижимости из некоторого корня в дереве объектов (например глобального объекта, но не только его). v8 не является исключением, и его GC содержит C++ api для создания таких корней. Из JS мы данным api можем воспользоваться лишь косвенно, через сущности языка предоставляемые либо самим v8 либо платформой (браузером, node.js, deno и т.д.)
    Чтоб было понятно давайте рассмотрим простой пример:
    const h = 'Hello world!';
    const n = 'nothing';
    setTimeout(() => {
      console.log(h);
    }, 1000);
    У нас есть строковые переменные h и n. Переменная n нигде больше не используется и ее память очистится при ближайшей работе GC. А вот переменная h оказалась в замыкании созданном стрелочной функцией. И хотя в JS мы не можем достучаться до h имея ссылку на эту функцию, сама функция все таки имеет ссылку на h, а значит h не может быть уничтожена пока не будет уничтожена сама функция. В терминах GC ссылка на h будет серой, то есть сама ссылка на h недоступна из корня напрямую, но сейчас мы проверяем объекты, которые на нее ссылаются и истина будет зависеть от них (подробнее можете погуглить "mark black white and gray memory in gc").
    Давайте посмотрим на саму стрелочную функцию, которая держит h в замыкании. Из кода видно, что мы ее передаем в функцию setTimeout, о которой известно, что это api предоставленное платформой (а значит вероятно какая-то часть написана на C++), а так же, что она асинхронная. Платформе реализующей setTimeout наша функция понадобится после асинхронного ожидания и никто платформе не сможет гарантировать, что во время этого ожидания не будет работы GC, поэтому ей ничего не остается, кроме как запросить у v8 создание нового корневого дерева объектов, в которое и будет положена ссылка на данную функцию.
    После же выполнения таймаута платформе больше не нужна наша функция, поэтому ссылка на нее будет удалена из дерева объектов. А так как других ссылок на функцию нет, и она больше не доступна ни из одного корня - GC удалит из памяти и функцию и строку связанную h, которая так же стала недоступна из корня.

    Посмотрим на пример из вопроса. У нас есть стрелочная функция, которая удерживает на себе инстанс компонента через this ссылку (так как стрелочные функции замыкают this). Саму функцию в памяти удерживает промис порожденный вызовом loader('url'), так как мы отдали её в метод then. Других ссылок на данную функцию нет, а значит и сама функция и ее замыкание (инстанс компонента) будут "жить" не менее "жизни" промиса.
    Скажем был отправлен запрос на сервер, но потом компонент в котором был объявлен промис и колбек был удален.
    И после удаления приходит ответ от сервера, и он выполнит колбек. Это значит что колбек остался в памяти со всеми переменными контекста
    Если других ссылок не осталось, то инстанс компонента будет удерживаться от очистки через промис.

    Теперь стоит разобраться с самим промисом. У него может быть 3 состояния - pending, resolved или rejected. После перехода в состояния resolved или rejected промис может выполнить сохраненные колбэки в ближайшем микротаске, а после он удалит на них ссылки из себя, в следствии чего, память удерживаемая замыканием колбэка может быть очищена (при отсутствии на нее других ссылок, достижимых из какого-либо корня).
    В состоянии pending промис может потенциально находится бесконечно долго, при этом ссылаясь на все колбэки переданные ему в методы then, catch или finally, а значит так же косвенно ссылаясь на их замыкания. И тут все зависит от того, кто ссылается на данный промис, и достижим ли он из корня. И да, промис вполне может быть удален из памяти так и не дождавшись своего завершения.
    интересное умозаключение
    Если Promise - это обещание, то в данном случае оно будет нарушено?


    В комментах к вопросу есть еще один интересный пример:
    function getSomething(){
      return new Promise((resolve, reject)=>{
        if(sys_condition){
           resolve();
        } 
      })
    }
    
    function testPromise(){
      let config = {....}
      getSomething().then(()=>{
         #use config
         goOn(...config)
      })
    }
    
    testPromise();
    У нас есть вызванная 1 раз функция testPromise, которая получает из функции getSomething промис, в который с помощью метода then сохраняет колбэк, удерживающий в замыкании переменную config. Сам промис она нигде не сохраняет, что здесь очень важно.
    В функции getSomething мы просто возвращаем промис созданный через его конструктор, который как мы уже знаем нигде больше не сохраняется. И на этом могло бы все и закончится, без вызова колбэка независимо ни от чего. Но конструктор промиса выполняет свой колбэк синхронно, а кроме того он передает в него 2 функции - resolve и reject, которые в своем замыкании ссылаются на только что созданный промис (а это уже 2 ссылки на него, хотя мы то его никуда не сохраняли). Переменная reject никак не используется, а значит спокойно может быть удалена после завершения колбэка. Переменная resolve просто вызывается как функция внутри условия, но более тоже никак не используется и никуда не сохраняется, а значит так же может быть удалена.
    В этом примере. если sys_condition = false и resolve не вызовется, это значит что создается утечка памяти
    Нет, утечки памяти не будет. Колбэк созданный в testPromise будет удален вместе с замыканием, так и не вызвавшись ни разу.
    Ответ написан
    3 комментария
  • В чем разница определений метода компонента?

    0xD34F
    @0xD34F Куратор тега Vue.js
    В первом случае контекстом будет не экземпляр компонента, так что если внутри метода вы хотите вызывать другие методы или обращаться к свойствам, этот вариант неприемлем.

    Второй - более короткая запись третьего.
    Ответ написан
    Комментировать
  • Mutex RWMutex отличия?

    RWMutex нужен, когда у нас есть объект, который нельзя параллельно писать, но можно параллельно читать. Например, стандартный тип map.
    Перед записью в защищаемый мьютексом объект делается .Lock(), а вызовы .Lock() и .RLock() в других горутинах будут ждать, пока вы не отпустите мьютекс через .Unlock().
    Перед чтением защищаемого объекта делается .RLock() и только вызовы .Lock() в других горутинах блокируются, вызовы .RLock() спокойно проходят. Когда отпускаете мьютекс через .RUnlock(), ждущие вызовы .Lock() по-очереди могут забирать мьютекс на себя.
    Таких образом обеспечивается параллельное чтение объекта несколькими горутинами, что улучшает производительность.
    Ответ написан
    4 комментария
  • На какой стороне может быть затык с максимальным количеством tcp соеденений?

    Судя по ошибке, упираетесь в лимит открытых дескрипторов. Можно вручную поднять через ulimit. Как установить для вашей ОС на постоянку, зависит от вашей ОС
    Ответ написан
    2 комментария
  • Какую СУБД выбрать для большого проекта?

    inoise
    @inoise
    Solution Architect, AWS Certified, Serverless
    Да любую. Большой проект понятие растяжимое и в 99.999999% случаев это завышенная оценка
    Ответ написан
    Комментировать
  • Как сделать такой же эффект прокрутки как на этом сайте?

    Уменьшить карточку можно примерно вот так:

    Ответ написан
    Комментировать
  • Классы и ООП: зачем, а главное - когда использовать, а когда нет?

    Adamos
    @Adamos
    Простая аналогия разницы между процедурщиной и ООП.

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

    Так вот, после определенного объема и сложности работать с "книжкой" (например, найти конкретную таблицу и сверить ее данные) тяжко даже автору.
    Ответ написан
    Комментировать