• На сколько плохо иметь статический список внутри класса, в добавляются новые экземпляры этого класса через конструктор?

    yarosroman
    @yarosroman Куратор тега C#
    C# the best
    А можно поинтересоваться смыслом данной конструкции? Это не рекурсивность, это вполне можно назвать циклической ссылкой, хотя и неявной. Сборщик мусора вполне собирает такие вещи.
    Ответ написан
    2 комментария
  • Как создать кнопку, которая отчистит весь HTML на сервере?

    mrusklon
    @mrusklon
    Не получается? Яростно гугли!
    только фантазия, сайт надо показывать через удаленный доступ типа тимвивера или видео записывать

    можно конечно поплясать с датами, например сегодня 10.10.2020 , ставим в коде что после 10.10.2021 body будет пустым , но опять же заказчик наймет кого нибудь и за 10 минут этот код уберут
    Ответ написан
    Комментировать
  • Cтоит ли учить бустрап?

    sfi0zy
    @sfi0zy
    Creative frontend developer
    У вас есть рабочая задача. Вы выбираете инструменты для ее решения. Если инструмент подходит для ее решения, упрощает вам жизнь - вы его используете. Если инструмент не подходит для решения задачи и только все усложняет на ровном месте - вы его не используете. Вне контекста ваших задач вопрос не имеет смысла - возможно бутстрап вам подойдет для их решения, а возможно, что и нет. И вы можете заменить слово "бутстрап" на любое другое название инструмента, логика останется той же. А просто познакомиться с каким-то инструментом для расширения кругозора - лишним не будет. По крайней мере будете знать, для каких задач он подходит и в будущем будете делать более осознанный выбор.
    Ответ написан
    Комментировать
  • Можно ли запретить браузеру кэшировать javascript код?

    Для того чтобы заставить браузер скачать скрипт, достаточно просто добавить в конце url какой-нибудь ключ, например:
    example.com/script.js?version=0.0.1
    это можно делать автоматически на стороне сервера.
    Обычно в современном фронтенде такая проблема не стоит, потому что webpack генерирует уникальные имена скриптов и стилей автоматически.
    Ответ написан
    Комментировать
  • Как работает сборщик мусор с колбеками 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 комментария
  • В файл идут не те данные, почему?

    edward_freedom
    @edward_freedom
    Попробуй заменить
    sw.WriteLine(text);
    на
    sw.WriteLine(string.join(Environment.NewLine, text));
    Ответ написан
    6 комментариев
  • При выполнении асинхронного метода вылезает ошибка, в чём проблема?

    twobomb
    @twobomb
    Потому-что ты пытаешься получит доступ к контролу из другого потока, используй инвок
    private async void Button_Click(object sender, RoutedEventArgs e)
            {
                await Task.Run( () => 
                { 
                    for (int i = 0; i < 101; i++)
                    {
    Dispatcher.Invoke((Action)(() =>
                {
                        label1.Content = i.ToString();
                }));
                        Thread.Sleep(1000);
                    }
                });
            }
    Ответ написан
    1 комментарий
  • Правильная архитектура при построение Web приложения?

    @andreysuha
    Что то знаю
    Архитектура больше зависит от Ваших навыков архитектора и опыта написания приложение, а не от стека. Если Вы выберете условную Джаву, хотя знаете php, то архитектура от этого лучше не станет.
    Ответ написан
    Комментировать
  • Angular. Как вызвать функцию из шаблона при загрузке страницы?

    Xuxicheta
    @Xuxicheta Куратор тега Angular
    инженер
    вам похоже нужно вот это https://angular.io/guide/lifecycle-hooks
    Ответ написан
    Комментировать
  • Какие существуют паттерны использования git?

    DevMan
    @DevMan
    делать ветку каждые N минут/часов – это бред.
    ветка должна быть логичной: пилите новую фичу – делаете новую ветку, пилите новую версию – делаете новую ветку, надо что–то проверить/поэкспериментировать –делаете новую ветку.

    комиты – чем чаще, тем лучше, особенное если над кодом работает много людей. но тоже не по секундомеру.

    нет четких правил, просто пользуйтесь здравым смыслом. со временем сами придете к тому, что удобно и что не очень.
    ну и почитайте про git flow.
    Ответ написан
    Комментировать
  • Чем конструктор отличается от метода?

    DevMan
    @DevMan
    конструктор – метод, который вызывается автоматически при создании объекта.
    Конструктор_(объектно-ориентированное_программирование)
    Ответ написан
    Комментировать
  • Как спроектировать крупное приложение на vue?

    bootd
    @bootd
    Гугли и ты откроешь врата знаний!
    Хорошо бы знать, что у вас за проект и какие задачи он решает.
    на выходе мы получим огромный бандл из всех модулей
    - это почему же так?
    А webpack для чего придумали? vue cli 3 вроде как из коробки вместе в webpack уже умеет всё разделять на модули, ну и вам самим никто не мешает сделать полностью модульную структуру так, как вам хочется, вручную настроив сборку проекта.

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

    Есть ещё nuxt.js в котором сделано ещё больше для модульности, там модули все загружаются тогда, когда они реально нужны. Т.е. у вас 10 страниц, у каждой своя логика, на пол мегабайта. При заходе на сайт, логика 10 страниц не будет загружена, а лишь тогда, когда вы зайдёте на страницу. Ну и опять же, никто не мешает и там добавить своих правил для webpack, если что-то не устроит. Следовательно, если определённому типу менеджеров нужна лишь определённая часть сайта, то зайдя на нужную ему страницу он загрузит логику этой страницы, но не десятка других.

    А верстать всё это вы как собираетесь?
    А раз это мини сайты в одном большом сайте, как вы собираетесь делать общие стили и компоненты?

    То есть, для каждого модуля свои vuex, router
    - ну а кто мешает вам на файлики разбить хранилище и роутер?

    У vuex есть свойство modules - куда и импортируем модуль хранилища
    У Router по сути тоже самое https://stackoverflow.com/questions/46590760/vue-j... вот статья для примера.

    Ну и всё же, даже если всё вот так разделить, где целиком отдельные spa друг от друга, а как вы связывать их собираетесь 1 целое?
    Типа написали плагин и что, теперь его во все 10 разных модулей подключать?
    Типа, есть шапка, одна на весь сайт, создал компонент, что, тоже ходить и в каждый подключать?

    Ну, так должно же быть у них что-то общее между собой, делающее всё это единым сервисом.
    Как бы да, есть яндекс, который сумел создать единый UI для своих проектов, но и проекты у него никак не связаны между собой, а если и связаны, то не сайты друг с другом, а как бы общая база яндекса связана с проектами.
    Как я понял, в вашем примере, модули - это яндекс музыка, карты, новости и т.п. Зачем всё это объединять в 1 проект? ИМХО Если я так понял, то нужно не просто отдельные модули делать, а отдельные сайты.

    К сожалению, я слабо понимаю, что у вас там за ВАСЯ иентерпрайз, что бы в целом посидеть и подумать + я так и не услышал в вашем вопросе доводов архитектуры ваших коллег.
    Ответ написан
    7 комментариев
  • Сколько стоит час веб-разработчика-фрилансера?

    @deliro
    Ты веcь такой кругом молодец, то знаешь, это знаешь. А теперь представь себе среднестатистический проект, который должен приносить бизнесу деньги. За две недели работы ты едва напишешь хлипкий CRUD для данных, неправильно смаппив бизнес-сущности в объекты ORM, ещё через месяц натянешь какой-то слайдер на jQ, попутно захватив 2мб JS кривых библиотек, а через два заказчик поставит тебе плохую оценку, потому что твой ценник он оплатил не за то, что ему нужно, а потому что ты знаешь монады, которые ему даром не сдались.

    А теперь давай представим простого программиста. Из алгоритмов он с трудом вспоминает сортировку пузырьком, а двусвязный список — предел его знаний о структурах данных, и даже этим списком он пользовался два раза в жизни. Хаскель он никогда не видел в глаза, C++ учил только в школе, вместо этого пишет неэффективный код на PHP. И у него есть опыт. За день он распишет сущности, за второй сделает универсальный CRUD, на третий день поднимет фронт на React'е с SSR. Да, внутренности проекта будут "медленными". Вместо O(logN) что-то будет выполняться за O(N) или даже O(N^2), но всем похер. Пока всё работает на приемлемом уровне — бизнес радуется.

    Кстати, к чему эта поучительная лапша? Я хотел сказать, что всеми этими модными словами можно пугать друзей и преподавателей, но в реальной жизни все алгоритмы уже реализованы, все типы данных уже подобраны оптимально. Знать их полезно для себя (чтобы мозг не атрофировался), но не для работы. Для работы тебе нужны такие навыки как:

    * Оптимальный баланс между говнокодом и идеальным кодом
    * Оптимальный баланс между скоростью разработки и оптимизацией кода
    * Оптимальный баланс между поддерживаемым кодом и костылями
    * Умение использовать те инструменты, с которыми ты работаешь. Опять же, для того, чтобы писать быстро, при этом имея минимальное количество говнокода и обеспечивая максимальную поддерживаемость (в пределах сроков). Например, можешь выкинуть в помойку свой Vim, как бы круто ты себя не чувствовал, разрабатывая в консольном редакторе, если продукты от JetBrains позволят за это же время сделать что-то лучше или чего-то больше
    * Чувство "знаю больше менеджеров". Это то чувство, когда тебе кажется, что "вот эта фича скоро изменится" и надо сделать архитектуру заранее более гибкой. Или "вот эту фичу мы через месяц выпилим" и не надо тратить на неё силы — напиши костыль и через месяц с чистой совестью удали его
    * Знания, как сделать ту или иную фичу. Потому что фичи повторяются (немного видоизменяясь) от проекта к проекту. И если ты сделал что-то за два дня, в следующий раз ты похожее сделаешь за три часа

    Что касается инструментов, выбери любой полноценный фреймворк, который умеет решать 90%+ потребностей "из коробки": Symfony, Django, Laravel

    Всякие "минималистичные" поделия вроде Falcon, Flask (в PHP не знаю, я на питоне пишу) оставь хипстерам. Пусть они говорят: "Мой фалкон такой быстрый, он написан на Cython". Тебя это не должно волновать, потому что бизнес с твоей скоростью разработки уже заработал достаточно денег, чтобы купить ещё десять серверов, пока фалконисты неделю гуглили, как прикрутить миграциии и запустить юнит-тесты на VPSке за пять баксов.
    Ответ написан
    5 комментариев
  • Можно ли в конструктор Thread() передать функцию через переменную?

    petermzg
    @petermzg
    Самый лучший программист
    Thread threads = new Thread(func);
    Вы передаете не имя функции, а метод. При этом метод должен соответствовать определенному описанию
    delegate void ParameterizedThreadStart(object obj); // если передается параметр
    delegate void ThreadStart(); // если не передается


    Программа это всетаки набор функций/[методов обьектов]. И имен у этих функций как таковых нет.
    Имена функций это extra информация, что в .Net можно получить через механизм Reflection.

    Для вашей задачи, можно сделать коллекцию.
    Dictionary<string, Action> funcs;
    Куда сможете сохранить нужные вам имена и задать функцию для исполнения.
    Thread threads = new Thread(funcs["имя функции"]);
    Для более сложных вариантов, вам нужно будет смотреть в сторону использования Reflection
    Ответ написан
    1 комментарий
  • Массив. Количество одинаковых значений?

    freeExec
    @freeExec
    Участник OpenStreetMap
    Почему не база данных, можно как и в базе данных:
    using System.Linq;
    
    var list = new List<int>() { 1, 5, 5, 4, 7, 5 };
    var gr = list.GroupBy(e => e);
    foreach (var line in gr)
    {
        Console.WriteLine("{0} => {1}", line.Key, line.Count());
    }
    Ответ написан
    Комментировать
  • Что происходит когда нажимаешь на кнопку input type=submit?

    ThunderCat
    @ThunderCat Куратор тега JavaScript
    {PHP, MySql, HTML, JS, CSS} developer
    Как я понимаю: создается POST AJAX-запрос к указанному адресу.
    Нет, происходит субмит формы, никакого аякс запроса по умолчанию не создается, обычный запрос, пост или гет зависит от метода указанного в форме.

    Но после получения ответа от сервера (в моем случае status=200) браузер переходит на адрес запроса в показывает ответ запроса в html.
    Так и должно быть, браузер отсылает форму и переходит по урл отсылки чтобы получить ответ.

    Как это обработать, как сделать так, чтобы браузер никуда не переходил и не показывал пользователю ответ?
    Гуглите "отправка формы ajax" - миллион статей.
    Ответ написан
    Комментировать
  • Из за чего ен отображаются изображения в ListBox?

    FoggyFinder
    @FoggyFinder
    В шаблоне элемента списка вы устанавливаете источником привязки ImageList - коллекцию BitmapImage

    <Image Width="100" Height="75" IsEnabled="False"
           Source="{Binding Path= ImageList}"  />


    У изображения нет такого свойства, и следовательно ничего не отображается. Здесь вы хотите использовать сам объект, а не какое-либо из его свойств. Просто не указывайте Path в привязке (или сообщите в явном виде используя символ .: {Binding Path = . })

    <Image Width="100" Height="75" IsEnabled="False"
           Source="{Binding}"  />


    Совет

    Image может сам подцепить картинку если использовать корректный путь к файлу, а значит можно упростить класс убрав ImageList и использовав в привязке LinksToPictures. Кроме этого можно безболезненно убрать приватные свойства (вы все равно не сможете к ним привязаться). В итоге после небольшого рефакторинга получится следующий класс:

    public class Gallery
    {
        private string directoryPath; // Путь к каталогу
        public IEnumerable<string> LinksToPictures { get; } // Названия файлов
    
        public Gallery(string directoryPath)
        {
            this. directoryPath = directoryPath;
            LinksToPictures = Directory.GetFiles(directoryPath, "*.jp*g");
        }
    }


    Примечание:

    1. Устанавливать ItemsSource для списка можно в разметке:

    ItemsSource="{Binding LinksToPictures}"

    Если вы так пробовали делать, но не видели изменений, проверьте что DataContext был установлен, на данном этапе это можно сделать так:

    public MainWindow()
    {
        InitializeComponent();
        DataContext = new Gallery("F://");
    }


    В дальнейшем вы научитесь устанавливать контекст извне окон.

    2. Если вы хотите изменять значение свойства из кода объекта (Galery) вам нужно будет реализовать интерфейс INotifyPropertyChanged (или, сокращенно INPC).

    А для того, чтобы интерфейс обновлялся при изменении последовательности элементов (удаление, добавление и т.д.), коллекция должна реализовывать интерфейс INotifyCollectionChanged (в ответах и комментариях вы можете увидеть часто используемое сокращение - INCC).
    List<_> к таким коллекциям не относится, поэтому лучше заменить на ObservableCollection.

    Это очень важные интерфейсы, поэтому рекомендую разобраться как они работают.
    Ответ написан
    2 комментария
  • C#. Как исключить ошибку в данном случае?

    shai_hulud
    @shai_hulud
    Использовать SingleOrDefault вместо Single. Тогда в output будет null, если ничего не найдено.
    output = File.ReadLines(tempOutputFile + ".txt").SingleOrDefault(l => Regex.IsMatch(l, "^.*[0-9][А-я].*$"));

    Если может быть больше одного совпадения то заменить на FirstOrDefault, LastOrDefault
    Ответ написан
    Комментировать
  • Как в live режиме отслеживать изменение в бд?

    flapflapjack
    @flapflapjack
    на треть я прав
    Как мне кажется - вы не в том направлении мыслите.

    А при чем тут вообще БД? Вы каким скриптом запись статьи обрабатываете - в том же месте и шлите уведомления в удобном вам виде. База данных тут вообще не при чем. Максимум, как в данной задаче должна участвовать БД - это сообщить методу рассылки пушей - смогла новость записаться или не смогла. (Если новость не записалась, то и пуши кидать не нужно, ведь статья еще не существует)
    Ответ написан
    Комментировать
  • Как организовать Подстановку в SQL запрос неизвестное множество данных?

    petermzg
    @petermzg
    Самый лучший программист
    SELECT *
    FROM Universities
    WHERE Location IN (select location from tableWidget)
    Ответ написан
    1 комментарий