• На собеседовании сказали, что не все функции - замыкания. Так ли это?

    @lazarevBoris
    Тред просто огонь!:)
    Дело в том, что такой же спор (из 8 страниц, на эту же тему) был не так давно на другом ресурсе, где мудрый дядька под ником "javascript" объяснял окружающим (которые тоже уперлись рогом, как и многие здесь), почему в js по факту всё является замыканием.
    Поэтому было крайне интересно, чем же и здесь дело закончится.
    И в очередной раз было доказано, что где бы ни была объявлена функция (а начиная с es6 и let - и блок кода) - она образует замыкание с цепочкой внешних лексических сред (или хотя бы одной LE), что полностью соответствует определению, предысторию которого хорошо описал Александр.
    Что наглядно изобразил Alexandroppolus (надеюсь, вы не будете против, если я достану ваш пример из jsfiddle и размещу здесь, чтобы он не пропал с течением времени):

    description:
    функция, созданная внутри iframe, замкнула внутрифреймовую глобальную переменную, и продолжает работать, даже когда фрейм удалили. Кнопкой frameValue можно убедиться, что в window той переменной нет.

    html:
    <script>
      var globalValue = 1000;
      var globalCounter = function() {
        return globalValue++;
      };
    </script>
    <div>
      <button>iframe counter</button>
      <button>globalCounter</button><br >
      <button>frameValue</button>
      <button>globalValue</button>
    </div>

    JS:
    const iframeHTML = 'iframe...<' + `script>
      var frameValue = 1;
      var counter = function() {
        // debugger;
        return frameValue++;
      };
      
      window.parent.iframeCounter = counter;
    <` + '/script>';
    
    function createTempFrame() {
    	const blob = new Blob([iframeHTML], {type: "text/html"});
      const frm = document.createElement('iframe');
      frm.src = URL.createObjectURL(blob);
      
      document.body.appendChild(frm);
      
      setTimeout(() => {
      	document.body.removeChild(frm);
      }, 900);
    }
    
    window.onload = function () {
      const buttons = document.querySelectorAll('button');
      
      buttons[0].onclick = function() {
        alert(iframeCounter());
      };
    
      buttons[1].onclick = function() {
        alert(globalCounter());
      };
      
      buttons[2].onclick = function() {
        alert(window.frameValue);
      };
      
      buttons[3].onclick = function() {
        alert(window.globalValue);
      };
     
      createTempFrame();
    };


    Так что да, автор треда, который ходил на собеседование, был прав, замыкание в его примере есть.
    Ответ написан
    1 комментарий
  • Я сделал Code Review, может быть я где-то ошибся или у вас есть что добавить?

    @Sing303
    Опишу, как бы комментировал я
    public sealed class DataProvider : IDisposable
    {
        // nit: Предложил бы названия firstValue, secondValue либо более осмысленные, если возможно
        public extern int LongRunningCalculation(int value, int value2);
        public extern void Dispose();
    }
    
    // nit: сразу бы хотелось видеть уровень доступа и sealed (если класс не планируется наследовать)
    // Class2 - дать нормальное имя
    // { - перенести на 2ю строку по рекомендациям code style от microsoft (если не принято иных)
    class Class2 {
        // Синхронизация не нужна, если убрать метод Init, а Create вызвать в статическом конструкторе
        private readonly object _sync = new object();
        
        // _ht - дать осмысленное название
        // Судя по использованию, value может быть int`ом. Не зачем иметь лишний boxing и проверки на тип
        // _ht статический, значит к нему могут быть обращения из разных потоков, лучше сделать его ConcurrentDictionary
        // Прям сходу не могу сказать, но, возможно, использовал бы какой то другой тип Dictionary <key, key, val> (самописный или существующий), кажется, так было бы быстрее чем массив в ключе
        private static Dictionary<int[], object> _ht; 
    
        // nit: хотелось бы имена со смыслом
        public int GetValue(int index, int index2)
        {
            // Лишний метод, удалить. Create вызовем в static конструкторе
            Init();
            // Если ключ у нас объект, то необходимо реализовать IEqualityComparer для этого Dictionary (иначе не понятно как по нему искать)
            var key = new[] {index, index2};
            // Проверка на тип не нужна, Dictionary сделаем типа int
            if (_ht.ContainsKey(key) & _ht[key].GetType() == typeof(int))
                // приведение типов больше не нужно
                return ((int)_ht[key]);
            // nit: else не обязателен
            else
                // int не может быть null, будет ошибка, вернуть либо default, либо возвращаемое значение должно быть int?
                return null;
        }
    
        // Метод удалить, вызовем Create в статическом конструкторе без lock
        public void Init() 
        {
            if (_ht == null)
                lock (_sync)
                    Create();
        }
        
        // Нет смысла делать метод public, сделать private
        public static void Create() 
        {
            // nit: и так видно какой тип создаём, можно использовать var
            // Обернуть в using
            DataProvider provider = new DataProvider();
            
            // Тут следует инициализировать значение _ht, т.к. ранее оно нигде не создаётся
            // Не забыть передать реализацию IEqualityComparer в конструктор
            
            // nit: хотелось бы видеть использование фигурных скобок (если не принят иной code style)
            // nit: вместо int можно var
            // i и j, похоже, несут какой то смысл, можно попробовать придумать нормальное название (иначе не понятно почему 100 и 12, их можно в константы класса)
            // nit: возможно можно использовать Parallel.ForEach
            for (int i = 0; i < 100; i++)
                for (int j = 1; j <= 12; j++)
                    _ht[new [] { i, j }] = provider.LongRunningCalculation(i, j);
        }
    }

    А переписал бы так (если не убирать массив в dictionary)
    public interface IDataProvider : IDisposable
    {
        int LongRunningCalculation(int firstValue, int secondValue);
    }
    
    public sealed class DataProvider : IDataProvider
    {
        public extern int LongRunningCalculation(int firstValue, int secondValue);
        public extern void Dispose();
    }
    
    public sealed class DataProviderService
    {
        public DataProviderService(IDataProvider dataProvider)
        {
            _dataProvider = dataProvider;
        }
    
        private static readonly ConcurrentDictionary<int[], int?> _calculatedCache = new ConcurrentDictionary<int[], int?>(new CalculatedEqualityComparer());
        private readonly IDataProvider _dataProvider;
    
        public int? GetValue(int firstValue, int secondValue)
        {
            var isNotSupportedValues = firstValue > 100 || firstValue < 0 || secondValue < 1 || secondValue > 12;
            if (isNotSupportedValues)
            {
                return null;
            }
    
            var key = new[] { firstValue, secondValue };
            if (!_calculatedCache.TryGetValue(key, out var result))
            {
                result = _dataProvider.LongRunningCalculation(firstValue, secondValue);
                _calculatedCache.TryAdd(key, result);
            }
            
            return result;
        }
    }
    Ответ написан
    5 комментариев
  • Как в столбец SQL-таблицы записать массив?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега SQL
    Седой и строгий
    Не надо в столбец записывать массив, это идёт в разрез с принципами работы реляционных баз данных и нарушает нормализацию.
    Ответ написан
    2 комментария
  • Как добавить PHP файл в веб Visual Studio проект?

    toxa82
    @toxa82
    Так же как и любой другой файл в проект добавляете.
    Ответ написан
    3 комментария
  • Как обойти cors?

    @firecorer
    Совсем недавно занимался решением такой проблемы. Всего лишь нужно отдать необходимые HTTP заголовки клиенту.
    Пример на php:
    header('Access-Control-Allow-Origin: *');
    header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');
    header('Access-Control-Allow-Credentials: true');
    header('Access-Control-Allow-Headers: Authorization, Origin, X-Requested-With, Accept, X-PINGOTHER, Content-Type');
    Ответ написан
    2 комментария
  • Гайд по поступлению в Беларуси?

    saboteur_kiev
    @saboteur_kiev Куратор тега IT-образование
    software engineer
    Растолковывать тебе никто не будет. Детский сад закончился, после школы ты никому не нужен. Вообще. В школе из класса в класс тебя тянули за уши. Там даже двоечников на второй год оставляют КРАЙНЕ редко. А за пределами школы - просто отчислят и все, иди ищи работу в макдональдсе или умирай с голоду.

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

    На вышку поступаешь чтобы получить высшее образование. Там гайдов полно - сдаешь вступительные, поступаешь. Плохо сдаешь - не поступаешь.

    Такова взрослая жизнь.

    Поэтому есть родители - поговори с ними, они уже прошли многое, и если не знают профессию, то знают жизнь.
    Можно поговорить вообще о разном, и делая скидки что родители могут быть "старперами", не стоит забывать что родители как-то раздобыли дом, еду, одежду и смогли потратить ОЧЕНЬ много чтобы вырастить тебя. Это очень плохо понимается (количество усилий), потому что ты видишь и помнишь больше сейчас, чем то что было 15 лет назад.

    Если собираешься оставаться в Беларуси, ищешь учебные заведения в твоем городе или там, где в принципе можешь жить (снять квартиру, если есть деньги).

    Смотришь что там преподают. Для ИТ хорошо математические, а может есть и айтишной направленности. Не так важно какой факультет. Именно программированию все равно будешь учиться дополнительно и сам. То, что дают в институтах - это в основном академические знания, и хорошая основа там больше математика, которая мало устаревает.
    Ответ написан
    7 комментариев
  • Можно ли вычислить автора сайта?

    Griboks
    @Griboks
    Найти юридического владельца сайта очень легко. Но есть три нюанса:
    1) возможно, это подставное лицо
    2) он может жить очень очень далеко
    3) его может крышивать государство/провайдер

    Меня удивляет то, что автор такого сервиса/сайта не боится, что к ему кто-то наведается и настучит по процессору)))

    На самом деле по закону можно подать коллективный иск на обман и мошенничество. Но, как вы понимаете, если судиться с мегафоном никто не хочет, то с ноунейм фирмами тем более.
    Ответ написан
    6 комментариев
  • IOS разработка без Mac. Возможно ли?

    DevMan
    @DevMan
    без макоси вы не собирете билд под железку.
    остаётся покупка нового или б/у мака или увлекательный секас с виртуалками или хакинтошем.
    Ответ написан
  • Почему jQuery Colorpicker не запоминает прозрачность?

    Stalker_RED
    @Stalker_RED
    В шестизначном css hex color не должен быть альфа канал, там должны быть только каналы RGB. Поэтому код так и написан.
    Для RGBA там есть отдельные методы (несколько на выбор), до которых вы похоже не долистали
    https://github.com/LuanLouis/jPainter/blob/master/...
    Ответ написан
    Комментировать
  • Как полностью защитить ноутбук от взлома?

    hottabxp
    @hottabxp
    Сначала мы жили бедно, а потом нас обокрали..
    Как полностью защитить ноутбук или компьютер от взлома?
    Не включать его.
    Ответ написан
    7 комментариев
  • Где найти книги или курсы по PHP, где даётся проектирование приложений с учётом ООП?

    glaphire
    @glaphire Куратор тега PHP
    PHP developer
    Мне в свое время помогла проработка всех шаблонов проектирования из трех источников: "Head First Design Patterns"+refactoring.guru+designpatternsphp.readthedocs.io. Каждый шаблон разбирала и пыталась понять, почему здесь нужен паттерн, а не процедурный код, обернутый в один класс. Еще помогла книга по чистой архитектуре, но она зашла уже после паттернов. Просто важно полностью для себя понять, почему эти подходы до сих пор существуют и находить для себя два-три примера, потому что один-единственный пример для изучения может быть однобоким и даже неправильным.
    Также эти книги и темы помогают вылечиться от трудностей решения задач на фреймворках, потому что наконец-то начинаешь видеть всю структуру и взаимодействия модулей и классов, а не просто примеры из документации натягиваешь на бизнес-требования)
    Ответ написан
    3 комментария
  • Как правильно делать локализацию приложения в Laravel?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    Я "храню" язык в URL

    /about - на английском
    /ru/about - на русском
    /ar/about - на арабском
    и т.д.

    При первом заходе по IP узнаю страну и перенаправляю юзера на нужную локализацию.
    Можно первый раз определять по заголовку Accept language (мне это больше нравится)

    Использую этот пакет https://github.com/mcamara/laravel-localization
    Ответ написан
    6 комментариев
  • Недостатки видеоуроков?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    Видеоуроки - как книжки "для чайников". Как правило - это много частных примеров, мало теории. Плюс к тому, обычно читать тот же текст получится быстрее, чем смотреть видео, т.к. читать можно по диагонали.
    Видеоуроки подойдут, если:
    • У вас индукционное мышление - 100 примеров лучше чем страница теории.
    • Вы воспринимаете "на слух" лучше, чем читая текст.

    Но рано или поздно наступит момент, когда документация станет родным домом, а видеоуроки будут восприниматься как потеря времени, потому что время==деньги, и час расслабона, смотря видео, станет стоить слишком дорого.
    Но не стоит вообще отказываться от таких форматов. Мой преподаватель по электронике, умнейший человек, говорил: "Не стоит гнушаться книжек 'Для чайников' - в них информация изложена кратко и максимально доступно. И этого минимума может хватить чтобы начать уже что-то делать"
    Ответ написан
    Комментировать
  • Активность сим,что видят по моему номеру?

    @x_shader
    Oracle & Coffee
    Как мы делали в похожей ситуации.

    БК покупает такой сервис от оператора.
    Под капотом может быть очень много критериев. Например: дата активации, сумма трат в месяц, регулярность пополнений, профиль пользования (больше входящих/исходящих, больше месенджеров, серфинга, видео, соцсетей и тп), количество звонков, трафика, бывает ли в роуминге и ещё 100500 других.

    БК вначале даёт оператору список номеров хороших и плохих клиентов. Оператор на базе списков и параметров выше обучает ML модель.
    Затем, когда в БК приходит новый клиент, они передают оператору номер, а тот возвращает некий ответ модели - надёжность=0.75, к примеру.

    Т.е. в этом случае никто тебе не объяснит, как прогревать. Просто твой профиль использования должен быть похож на профили других абонентов, которые раньше понравились БК.
    Но есть и случаи попроще. Оператор просто продает инфу вроде "номеру больше трёх месяцев, или нет".
    Ответ написан
    1 комментарий
  • На каком я сейчас уровне?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    1. Не умеешь пользоваться гитом, тк загрузил файлы через Upload
    2. Код невозможно проверить, тк ты закинул только cs файлы, но не приложил не менее важный csproj - не разбираешься, как собирается проект.
    3. Про свич кейс тебе уже сказали в комменте.
    Про остальное мало что можно сказать - код самый обычный, на три с минусом, не очень хороший, но и не слишком ужасный.
    С архитектурой плохо, тк детали реализации смешаны с бизнес-правилами.
    По алгоритмам нельзя оценить, тк никаких сложных алгоритмов в твоём проекте нет.

    Уровень, имхо: стажёр/младший разработчик(обязательно под менторством и наблюдением более опытного)
    Ответ написан
    5 комментариев
  • Язык программирования D. Почему отличный язык остался невостребованным?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Представьте, что вам нужно изучить иностранный язык и от выбора языка зависит сколько людей в мире вы будет понимать, какое количество текстов вы сможете прочитать, сколько вакансий вам будет доступно и какого размера зарплаты вам светят. Что выберите - английский или венгерский? Так же у языка программирования. Пока на нём нет вакансий, никто не хочет его учить, а пока никто не хочет его учить, на нём нет вакансий. Вырваться из замкнутого круга можно только двумя путями - либо язык предлагает суперконкурентное преимущество программисту, либо ему выдаёт кредит доверия гигантская корпорация. Очевидно. у D не нашлось ни того, ни другого.
    Ответ написан
    24 комментария
  • Что такое pre-backend, пребэк, бэкендовский скрипт?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Вам нужно сделать прокси для вашего сайта.
    Это просто файл php который делает запрос на СДЕК и отдает результат вашему скрипту, потому как он на вашем домене и на одном порту то CORS не ограничивает и все работает.

    Вот один из примеров
    https://dzone.com/articles/building-simple-api-proxy
    Ответ написан
    1 комментарий