• Сбрасывать стили в общем файле или в отдельном блоке?

    @petrovaHack
    бемовский блок можно вставить куда угодно. Куда угодно в пределах сайта? Или вообще?

    Вообще, ведь бэмовский блок по БЭМ не зависит от внешних блоков. А раз не зависит, то и вставлять можно куда угодно. А как сделать его независимым? А значит не полагаться на какой-то внешний normalize/reset, а задавать все требуемые свойства самому блоку. А раз мы будем задавать margin, padding и т.д., то какой смысл в normalize? Он будет просто дублировать внутренние свойства блоков. Более того, создает путаницу при вёрстке. Забыли где-то прописать в блоке margin, блок подхватил это из normalize, и вы думаете, что блок в порядке, рабочий, а по факту в другом проекте без нормалайз его поведение будет не таким... Т.е. с normalize вы только увеличите шансы на ошибки.
    Вот почему по БЭМ (да и не только, а всегда, когда стараетесь строить модульно) не стоит включать сбросы стилей.
    Ответ написан
    Комментировать
  • На собеседовании сказали, что не все функции - замыкания. Так ли это?

    @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 комментарий
  • На собеседовании сказали, что не все функции - замыкания. Так ли это?

    @Vitsliputsli
    Абсолютно понимаю автора, он цитирует определение замыкания, а ему в ответ - определения не нужны, они лишь путают. Он спрашивает, а как тогда? Ему кто про мусорщик, кто про стек, и у него создается ощущение, что сами не могут договориться. Но кроме этого, автор прав, его функция - замыкание.
    Замыкания везде работают одинаково. Если функция содержит ссылки на переменные объявленные вне тела этой функции, и которые не являются ее параметрами - это и есть замыкание. Что значит фраза - все функции в javascript - замыкания? Дело в том, что в других языках область видимости может просто не позволить обращаться к внешним переменным, в таких языках функция не будет замыканием, но может быть возможность превратить функцию в замыкание через специальный синтаксис. В javascript таких манипуляций не нужно, поэтому в нем любая функция - замыкание.
    Т.е. замыкание это возможность в функции создать ссылки на внешние переменные. А здесь уже как следствие, работа мусорщика, если есть рабочая ссылка, то объект не уничтожается, а в приведенных примерах с 2 функциями она рабочая, так как можно получить доступ из корневого объекта, что удовлетворяет требованиям алгоритма mark-and-sweap. Но это следствие, а не принцип работы замыкания.
    Поэтому автор абсолютно прав - его функция это замыкание. Потому что ни в одном определении замыкания нет никаких упоминаний о мусорщике, а значит разницы нет на какие внешние данные ссылаться.
    Другое дело, все хотят видеть не замыкание, а его хитрое использование, а именно сохранение ссылки объявленной в замыкании при уничтожении ссылки во внешней функции. Не надо считать собеседующего бездарем, если бы вы ему объяснили свою точку зрения, он вполне мог бы и согласиться, хотя и не факт, многие собеседования проходят в виде допроса, что говорит о неадекватности или о слабой квалификации собеседующего, в такие конторы не стоит идти.
    Ответ написан
    1 комментарий
  • На собеседовании сказали, что не все функции - замыкания. Так ли это?

    @Arlekcangp
    Разработчик, Лид, Архитектор ПО
    Похоже вас поймали на том что в js кто-то решил переопределить термин "замыкание"... Т к javascript далеко не первый язык, в котором есть нечто, претендующее называться термином "замыкание", то следует в первую очередь рассмотреть общее определение. Возьмём его из википедии:

    Замыкание (англ. closure) в программировании — функция первого класса, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции в окружающем коде и не являющиеся её параметрами. Говоря другим языком, замыкание — функция, которая ссылается на свободные переменные в своей области видимости.
    Замыкание, так же как и экземпляр объекта, есть способ представления функциональности и данных, связанных и упакованных вместе.
    Замыкание — это особый вид функции. Она определена в теле другой функции и создаётся каждый раз во время её выполнения. Синтаксически это выглядит как функция, находящаяся целиком в теле другой функции. При этом вложенная внутренняя функция содержит ссылки на локальные переменные внешней функции. Каждый раз при выполнении внешней функции происходит создание нового экземпляра внутренней функции, с новыми ссылками на переменные внешней функции.
    В случае замыкания ссылки на переменные внешней функции действительны внутри вложенной функции до тех пор, пока работает вложенная функция, даже если внешняя функция закончила работу, и переменные вышли из области видимости.[1]
    Замыкание связывает код функции с её лексическим окружением (местом, в котором она определена в коде). Лексические переменные замыкания отличаются от глобальных переменных тем, что они не занимают глобальное пространство имён. От переменных в объектах они отличаются тем, что привязаны к функциям, а не объектам.


    Как видим из этого длинного определения (а не только его первого предложения) интервьюер оказался формально прав (что является неожиданностью и для меня самого. Кто знает, возможно это веяние нового или всё же творчество чрезмерного ЧСВ js-кодерков, но не будем предвзятыми) Посмотрим дальше...Переходим в английскую версию той же страницы в википедии:

    In programming languages, a closure, also lexical closure or function closure, is a technique for implementing lexically scoped name binding in a language with first-class functions. Operationally, a closure is a record storing a function[a] together with an environment.[1] The environment is a mapping associating each free variable of the function (variables that are used locally, but defined in an enclosing scope) with the value or reference to which the name was bound when the closure was created.[b] Unlike a plain function, a closure allows the function to access those captured variables through the closure's copies of their values or references, even when the function is invoked outside their scope.


    О! А тут нет никаких "функций, вложенных в функцию" и нет никаких "создающихся каждый раз" Хм... Интересно. Ну за то есть абзац о том как появились замыкания:

    The concept of closures was developed in the 1960s for the mechanical evaluation of expressions in the λ-calculus and was first fully implemented in 1970 as a language feature in the PAL programming language to support lexically scoped first-class functions.[2]

    Peter J. Landin defined the term closure in 1964 as having an environment part and a control part as used by his SECD machine for evaluating expressions.[3] Joel Moses credits Landin with introducing the term closure to refer to a lambda expression whose open bindings (free variables) have been closed by (or bound in) the lexical environment, resulting in a closed expression, or closure.[4][5] This usage was subsequently adopted by Sussman and Steele when they defined Scheme in 1975,[6] a lexically scoped variant of Lisp, and became widespread.


    Ага. Оказывается первоначально они появились в такой не конвенциональной, с сегодняшней точки зрения VM, как SECD... И их создатель прямо говорит, что это код плюс данные. Далее термин применяют к лямбда-выражениям. Ничего не говорится, должны ли эти выражения возвращаться функцией, или достаточно того, что бы они захватывали переменные из своего лексического (или динамического, как в common lisp) окружения. Далее нам сообщают, что некие мистеры, Сасман и Стил, спустя каких то 11 лет добавили это в свой язык Scheme... Ну что же. Посмотрим замыкания в Scheme... А именно откроем книгу Сасмана и соавторов "Структура и интерпретация компьютерных программ" или "SICP" Первый раз (исключая содержание) слово "замыкание" встречается в главе 2 "Поcтроение абстракций c помощью данных"


    Важная идея в работе с составными данными — понятие замыкания (closure): клей для
    сочетания объектов данных должен позволять нам склеивать не только элементарные
    объекты данных, но и составные.


    Но, как выяснилось, это не те замыкания... Это замыкание в том смысле, что структуру одного типа (в данном случае пары) могут ссылаться на самих себя. И это то как термин "замыкание" понимают математики. Далее в SICP никаких других определений замыканий нет (несмотря на то, что само их использование конечно же есть) Ну ничего не остаётся как посмотреть что же сегодня называют замыканиями в языке Scheme... Гугл по этому запросу выдал первой ссылкой: https://www.cs.utexas.edu/ftp/garbage/cs345/schint....
    Цитирую:

    Procedures are Closures
    Scheme procedure's aren't really just pieces of code you can execute; they're closures.

    A closure is a procedure that records what environment it was created in. When you call it, that environment is restored before the actual code is executed. This ensures that when a procedure executes, it sees the exact same variable bindings that were visible when it was created--it doesn't just remember variable names in its code, it remembers what storage each name referred to when it was created.

    Since variable bindings are allocated on the heap, not on a stack, this allows procedures to remember binding environments even after the expressions that created those environments have been evaluated. For example, a closure created by a lambda inside a let will remember the let's variable bindings even after we've exited the let. As long as we have a pointer to the procedure (closure), the bindings it refers to are guaranteed to exist. (The garbage collector will not reclaim the procedure's storage, or the storage for the let bindings.)

    Here's an example that may clarify this, and show one way of taking advantage of it.

    Suppose we type the following expression at the Scheme prompt, to be interpreted in a top-level environment:

    Scheme> (let ((count 0))
               (lambda ()
                  (set! count (+ count 1))
                  count)))

    ##

    Evaluating this let expression first creates a binding environment with a binding for count. The initial value of this binding is 0. In this environment, the lambda expression creates a closure. When executed, this procedure will increment the count, and then return its value. (Note that the procedure is not executed yet, however--it's just created.) This procedure, returned by the lambda expression, is also returned as the value of the let expression, because a let returns the value of its last body expression. The read-eval-print loop therefore prints a representation of the (anonymous) procedure.


    Что имеем ? В Scheme - вообще любая функция - это замыкание! Т к она всегда захватывает контекст, даже если там пусто!. Что видим в коде ? Ну с точки зрения Scheme тут конечно вложенная функция, т к let - это на самом деле lambda, но так происходит потому, что в Scheme нет переменных в понимании js. В js же можно считать, что глобальный контекст - результат действия нечто, что эквивалентно let. Захватывает ли любая функция в js этот контекст ? Не знаю. Но точно знаю, что в вашем примере это определенно так - х часть контекста, который захватывается функцией. Кто хочет поспорить - идите спорьте с создателями Scheme (скажите, когда попкорн покупать, я посмотрю как вас пороть будут. Набежало тут вайтишников =)) Кто то может сказать "а вот у нас в js замыкания определяются не так" На что я отвечу: знаете, товарищи, а идите ка вы лесом! Если есть однажды созданный и определенный термин, нужны весьма веские причины что бы менять его определение. Желания левой ноги очередного вайтишника тут не достаточно.
    Ответ написан
    30 комментариев
  • В каком возрасте лучше начинать втягивать своего ребёнка в IT-индустрию/программирование?

    saboteur_kiev
    @saboteur_kiev Куратор тега IT-образование
    software engineer
    Втяните его грамотным пользователем для начала.

    Скорость печати, английский, эксель. Если у него есть какие-то интересы на компе (простые игрушки), можно научить их ломать или через какой-то auto-it ботоводить.

    Если у него самомотивации нет, то снаружи мотивацию можно привить только личным примером.
    Если ты программист - просто подкидывай задачки или рассказывай интересные моменты. По надобности - литературу и подсказки. Сам втянется.
    Ответ написан
    Комментировать
  • В каком возрасте лучше начинать втягивать своего ребёнка в IT-индустрию/программирование?

    php666
    @php666
    PHP-макака
    Только вчера был крик души: ebanoe-it.ru/2021/03/24/could-not-enter-it/
    Человек пошел учиться (видимо, без особого осознания), понял, что не его и в итоге работает в Евросети.

    тру-программера с хорошими финансовыми перспективами
    шофёры в СССР тоже думали о финансовых перспективах, таксисты в 90х тоже не жаловались, потом были бухгалтера в эпоху перестройки.

    В итоге шофер ценится более-менее только тогда, когда у него права начинаются от категории С-С1.
    Таксист сейчас это раб, работающий за 160 рублей.
    Бухгалтер - вполне заурядная профессия. Как и программист.

    А ещё, жители Донецка до 2014 года даже представить не могли, что скоро будет война.

    Какой смысл думать за другого человека, да ещё и на такое далекое будущее?
    Ответ написан
  • В каком возрасте лучше начинать втягивать своего ребёнка в IT-индустрию/программирование?

    @keeprocking
    п.с. пока ты думаешь как научить ребенка программированию пораньше, реально умные пацаны наоборот ограждают своих детей от технологии - https://www.entrepreneur.com/article/303657. Подумай об этом.

    И отдай ребенка на спорт! И не губи его здоровье компьютером. Оно еще в школе будет нагибаться ой как.

    Хочешь подготовить ребенка к программированию? Учи с ним английский язык с детства. Языки детки хорошо воспринимают как раз пока маленькие.
    Ответ написан
    6 комментариев
  • Как узнать текущую максимальную цену за клик (max CPC) в Google Ads?

    DeoZ
    @DeoZ
    Веб-разработка и Реклама
    Эта колонка появляется при ручном управлении ставками, а у Вас автоматическая стратегия. При ней Вы не можете назначать максимальные ставки отдельным запросам или группам.
    Ответ написан
    3 комментария
  • Как исключить дробное число (с запятой) в Яндекс.Директ? Т.е. как засунуть его в минус-фразы?

    DeoZ
    @DeoZ Куратор тега Яндекс.Директ
    Веб-разработка и Реклама
    Запятые, точки и другие знаки препинания Яндекс не учитывает, поэтому Вы их не сможете исключить. Для него "размер 3,5" = "размер 3 5".
    У Вас есть два варианта:
    1. Добавить к фразе с указанным размером все остальные цифры, например:
    кухня 3 метра -1 -2 -4 -5 -6 -7 -8 -9
    Это сработает надёжно.
    2. Менее надёжный (не уверен что чётко сработает в Вашем случае), но более точный вариант.
    кухня 3 метра -[3 1] -[3 2] -[3 3] -[3 4] -[3 5] -[3 6] -[3 7] -[3 8] -[3 9]
    В этих случаях учитывается именно порядок цифр и то, что между ними нет других слов.
    Ответ написан
    1 комментарий
  • Дешёвые способы привлечения юзеров из Индии?

    opium
    @opium
    Просто люблю качественно работать
    Можно на трафораме , там вообще индусов можно дешево гонять.
    https://www.traforama.com/
    Чисто нагнать для пф большого самое то и будет стоить три копейки.
    Ответ написан
    1 комментарий
  • Продажа цифровых товаров за рубежом через BTC, возможно ли?

    @boss_lexa
    у BTC мало пользователей чтобы быть единственным способ оплаты
    https://www.buybitcoinworldwide.com/how-many-bitco...

    платежи за цифровые товары можно принимать через
    https://gumroad.com/

    за софт
    https://paddle.com/

    через paypal принимаем платеже несколько лет:
    на личном аккаунте - проблем не возникало
    на аккаунте компании - ежегодно требуют "бюрократическую бумажку" об актуальных данных компании - простое письмо о том что данные компании не изменились.

    еще можно стать самозанятным (ИП на НПД) и подключить классический интернет-эквайринга через банки: тинькофф (зарубежных покупателей успешно принимает - но списание только в рублях - покупатели потеряют на конвертации валюту пару процентов) или альфабанк (доступно 30+ валют спиcаний с карт - но опыта с ним еще пока не было).

    также находил услуги по аренде stripe аккаунтов - сам не пробовал, возможно мошенники - так что на свой страх и риск
    https://bestpayments.solutions/
    https://easypayments.online/
    Ответ написан
  • Не работает line-height, почему?

    Lizard-108
    @Lizard-108 Автор вопроса
    Ящерица
    Короче решил проблему. Проблема была в том что DOCTYPE html не был выведен в первую очередь, вместо него сначала шли php-шные echo со всякой шнягой.
    Ответ написан
    Комментировать
  • Какова периодичность чтения sitemap ботами google/yandex?

    ReactorHeart
    @ReactorHeart
    SEO аналитик
    Ориентируйтесь не на Sitemap, т.к. он только указание Google о том, какие страницы Вы, как вебмастер считаете важными.
    Смотрите аналитику по сканированию: Google консоль - Прежние отчеты и инструменты - Статистика сканирования:
    5eb51c4a53ca3212134807.jpeg

    Это более информативная, хотя, признаюсь, недостаточная информация.
    Провоцируйте Google на более частое и глубокое сканирование вашего сайта.
    Ответ написан
    2 комментария
  • Как в налоговую отчитываются сайты а-ля seosprint, socpublic, advego?

    kumaxim
    @kumaxim
    Web-программист
    Автор, все перечисленные тобою сервисы находятся вне юрисдикции РФ. В этом и заключается ответ на твой вопрос. Давай возьмем для примера Адвего. Если ты пролистаешь в самый низ их сайта, то найдешь там две кнопки Webmoney. Кликаем на любую и видим, что сервису принадлежит WMID 378559979197, который зарегистрирован на некую UPFRONT SALES L.P. в Соединеном Королевстве.

    В чем суть? Британской налоговой не интересны граджане НЕ Евросоюза, которые постоянно проживают за его пределами. По своему опыту общения могу сказать, что им на русских с их копейками там вообще плевать. У ребят своих проблем там зватает.

    Теперь, ты можешь спросить, а как же ребята прнмают платежи от русских? Так все просто. В РФ оформляется филиал, который заключает договора с платежными системами. Филиал никаких выплат, кроме, разве что расходов на собственный офис, не производит. Выплаты исполнителям сайта делает британская компания, через какие-нибудь WebMonay или Payoneer

    Рассчитываю, что вектор дальнейших поисков тебе понянет. :-)
    Ответ написан
    2 комментария
  • Как в налоговую отчитываются сайты а-ля seosprint, socpublic, advego?

    @d-stream
    Готовые решения - не подаю, но...
    Может быть посмотреть в сторону направления "агент". В НК больше акцентируется на понятии "платежный агент", но стоит порыть в сторону его боковика, где контрагент А через агента платит за услуги контрагенту Б через агента, вычитающего свою комиссию. В таком случае доходом агента является та самая комиссия, а не весь оборот.
    Ответ написан
    2 комментария
  • Яндекс режет заголовки, как узнать, кому изначально направлялось письмо?

    В общем случае, к сожалению, никак.
    Обычно при доставке в ящик проставляется заголовок Delivered-To, но какого-либо стандарта, регламентирующего проставление этого заголовка нет и Яндекс его не проставляет.

    В случае когда у письма только один получатель, он будет фигурировать в заголовке Received.

    Как вариант, можно попробовать письма с ящика info@ форвардить на другой ящик, чтобы у форварда был единственный получатель и он светился в Received, а уже с этого ящика форвардить дальше. Не уверен, что это будет работать во всех случаях (например для локальных/нелокальных писем).
    Ответ написан
    4 комментария
  • Алгоритм на php или js - как из любого хэша получить числовое значение из интервала X-Y?

    BRAGA96
    @BRAGA96
    Например так:
    class Hash {
        static encode(content) {
            return btoa(unescape(encodeURIComponent(content)));
        }
    
        static decode(content) {
            return decodeURIComponent(escape(atob(content)));
        }
    }
    
    const encode = Hash.encode(JSON.stringify([6, 1.5, 23, 34, 'зелёный']));
    
    console.log(encode);
    
    const decode = Hash.decode(encode);
    
    console.log(JSON.parse(decode));
    Ответ написан
    2 комментария
  • Алгоритм на php или js - как из любого хэша получить числовое значение из интервала X-Y?

    sergiks
    @sergiks Куратор тега Алгоритмы
    ♬♬
    да хоть разбить хэш на байты, сложить, взять остаток от деления на 10 и прибавить 5.
    Ответ написан
    3 комментария
  • Как экранировать строку в REGEXP (mysql) средствами PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Я думаю, что preg_quote() должна подойти.
    Ответ написан
    1 комментарий