• Логично ли данное ООП поведение в javascript и отличается ли оно от c++ и java?

    k12th
    @k12th
    console.log(`You're pulling my leg, right?`);
    Вы так говорите, будто существует какое-то эталонное ООП, хранящееся в палате мер и весов в Париже. ООП -- это несколько принципов, которые можно трактовать по-разному (Алан Кей, ЕМНИП, сказал: "Я изобрел термин ООП, но я не имел ввиду C++"). В JS вообще классов не было до недавнего времени, да и сейчас это тонкий слой синтаксической сахарной пудры над прототипами.

    Когда мы в JS обращаемся к свойству объекта, то движок сначала ищет это свойство в самом объекте. Если свойство не найдено, то идем в объект, который записан как прототип этого объекта, и ищем в нем. Повторяем этот шаг, пока не найдем свойство или не дойдем до Object.
    Когда мы вызываем метод объекта через точку (типа b.bar()), то он выполняется в контексте этого объекта b. super.foo() пропускает первый шаг в поиске свойства, берет метод сразу из прототипа прототипа и тоже выполняет его в контексте b. А в контексте b метод bar у нас переопределяет родительский метод, поэтому у нас получается бесконечная рекурсия, которая насильно обрывается движком.

    Что должно быть в Java/C++ я вам не подскажу, к сожалению. Возможно, там будет поведение, которое вы ожидаете.
    Ответ написан
    Комментировать
  • Логично ли данное ООП поведение в javascript и отличается ли оно от c++ и java?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Всё дело в том, что this в A.foo ссылается не на A, а на инстанс B. А поиск метода идёт по цепочке прототипов, начиная сверху, поэтому до A.bar никогда не доходит.
    Рассуждать, логично это или нет, бессмысленно - это просто так и нужно принять такое поведение, понять его и использовать.

    И нет, в Java и C++ поведение не такое. Вообще, в javascript наследование прототипное и есть закидоны особенности с контекстом вызова, поэтому привычное из других языков понимание ООП в нём не всегда работает.
    Ответ написан
    1 комментарий
  • Какие варианты подключения нескольких разработчиков к одному репозиторию существует?

    iiiBird
    @iiiBird
    Пока ты спишь - твой конкурент совершенствуется
    В настройках репозитория можно указывать так называемых "Collaborators" (если речь о github). все кто там будут указаны- будут иметь доступ к репозиторию.
    Ответ написан
    Комментировать
  • Какая разница в опционалах в Swift?

    Implicitly Unwrapped Optional, в целом, ведут себя как Optional. На самом деле, они преобразовываются к Optional при каждом удобном случае:

    let x: Int! = 42
    let y = x   // y has type Int?

    Есть два отличия: во-первых, можно привести IUO к non-optional типу:

    func f(_ arg: Int) { print(arg) }
    
    let x: Int! = 42
    
    let y: Int = x
    let z = x as Int
    f(x)

    Во-вторых, можно вызывать на такой переменной методы самого объекта. Если в IUO содержится nil, то приложение упадёт с соответствующим сообщением:

    struct Dog {
        func bark() { print("Woof!") }
    }
    
    let d: Dog! = Dog()
    d.bark()

    Применяются IUO, в основном для отложенной инициализации:

    class Foo {
        var x: Int!
    
        init() {
            // I can't setup x at this point :(
            x = nil
        }
    
        func setup(x newValue: Int) { x = newValue }
    
        func foo() {
            // I promise that setupX() will be called before
            // I will deal with x as if it was always present
            print(x * 2)
        }
    }

    Замечу, что, начиная со Swift 3, IUO - это вовсе не тип, а лишь атрибут переменной, который разрешает неявные преобразования с ней. "Под капотом" всё выглядит как-то так:

    let x: Int! = 42
    @implicitlyUnwrapped let x: Optional<Int> = .some(42)
    Ответ написан
    Комментировать
  • Стали бы вы учитывать рейтинг пользователя на Тостере, если бы приглашали его на работу в свою компанию?

    sayber
    @sayber
    Да, я программирую на PHP и еще асинхронно!
    Это все хорошо, но лучше бы функцию временной блокировки ввели.
    А то чистить спамеров тяжело, не имея возможности его остановить.

    Сам рейтинг будет интересен только тем, кто в нем что то понимает.
    Т.е. обычному HR это без надобности.
    Ответ написан
    1 комментарий
  • Вопрос музыкоделам: Как узнать, фейковое ли оборудование я купила?

    @pudovMaxim
    web-developer
    У производителя.
    А, на сколько мне известно, профессиональные мониторные уши не должны давать приятный или хороший звук - их задача давать звук 1-в-1 как на записи, со всеми провалами и искажениями. Возможно надо слушать разные уши прямо в магазине. Начиная с самых дешевых китайских. Иногда можно удивиться.
    Ответ написан
    Комментировать
  • Пароли пользователей после переноса с yii?

    @xfg
    Yii использует алгоритм хеширования blowfish. Чтобы в php получить хеш по этому алгоритму, нужно просто взять функцию crypt и вторым аргументом передать соль в формате$2a$13$6abRKtrd12bvkltrfsorbd

    где
    $2a$ (также может быть $2x$ или $2y$) - указывает на алгоритм блоуфиш.
    13 - сложность алгоритма, может быть от 04 до 31. Чем больше число, тем дольше будет вычисляться хеш.
    6abRKtrd12bvkltrfsorbd - 22 символа для соли.

    Проверить хеш против пароля можно функцией password_verify. Берете хеши, которые вам нагенерил Yii и передаете в функцию password_verify и всё у вас заработает, без проблем. Я с Yii на node.js уезжал с этими хешами, никаких проблем :)

    Все что ниже можно не читать. Там для тех, кому интересно откуда взялось 3 разных префикса ($2a$, $2x$, $2y$).

    Префиксы $2y$ и $2x$ существуют только в PHP, так как они налажали в алгоритме блоуфиш в версиях до 5.3.7. Префикс $2x$ был добавлен для обратной совместимости, т.е. если вы генерили хеши $2a$ в версии PHP до 5.3.7 и теперь обновились до или выше этой версии и хотите, чтобы ваши уже существующие уязвимые хеши продолжали правильно работать, то нужно было заменить у таких хешей префикс с $2a$ на $2x$. Префикс $2y$ это уже исправленный алгоритм хеширования и ничем не отличается от $2a$ в версиях PHP 5.3.7 и выше. Подробнее обо всем этом можно прочитать php.net/security/crypt_blowfish.php

    Yii использует префикс $2y$. Но в спецификации из всех этих префиксов есть только $2a$ и его и нужно использовать, если у вас версия выше или эквивалентна PHP 5.3.7. Так что, если вы избавились от Yii, то можете поменять и префикс у ваших хешей. Потому что, когда я мигрировал на node.js библиотека для блоуфиш хеширования естественно не поддерживала никаких $2y$ и $2x$ и не собиралась этого делать в дальнейшем, так как это не их баги, а PHP, вот пусть PHP с этими префиксами и живет :)
    Ответ написан
    1 комментарий
  • Что за особенный объект, к которому можно применить метод clone()?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    p.clone = function() {
        return new URI(this);
    };

    https://github.com/medialize/URI.js/blob/85279a0ed...

    То объект клонируется, хотя метод clone предназначен для клонирования дом-элементов, но это сработает.

    При чём здесь .clone() вообще? На jQuery свет клином не сошёлся, и за её пределами есть разумная жизнь, которая вполне себе может называть методы так же, как в jQuery, не имея с ней ничего общего при этом. У нас в офисе тоже есть Константин, но я же понимаю, что вопрос писал, скорее всего, не он.

    P.S.
    И uri и obj это объекты, что подтвердит typeof
    В javascript всё объекты.
    typeof null // "object"
    typeof [] // "object"
    Ответ написан
    1 комментарий
  • Как Laravel ускоряет создание сайта?

    v_decadence
    @v_decadence
    > Так проще же сделать таблицу в phpmyadmin
    На продакшн сервер и все тестовые сервера ручками потом переносить все изменения?

    > Есть валидация данных, так это просто сделать на чистом php с помощью if, использую ajax
    И получается что-то вроде этого?

    > по мне так проще сделать шаблоны на разных языках
    И при малейшем изменении бегать по 10 файлам и менять одно и то же место?

    > сайт будет больше тормозить и больше лишних конструкций
    Это скорее CMS касается с её кучей модулей, которые далеко не всегда нужны конкретному сайту.

    Мне кажется, вы просто не делали более-менее серьёзного проекта (требования к которому не вписываются в возможности CMS), иначе таких вопросов не возникло бы.
    Есть сайты, которые действительно можно быстрее сделать на CMS, но по мере роста проекта не всегда такое решение остаётся легко поддерживаемым.
    С помощью Laravel (и другого здравого фреймворка) можно сделать почти всё и контролировать любую часть сайта.
    Если у вас сайтик с тремя страничками и формой обратной связи, то да, быстрее будет сделать на CMS.
    Ответ написан
    9 комментариев
  • Есть ли шаблоны интерфейсов для программ?

    pozZzitiv
    @pozZzitiv
    Дизайнер и перфекционист
    Есть, называются UI kit ну или UI psd, что часто одно и тоже. Это наборы элементов интерфейса из которых можно создать любой свой.
    Реже можно найти прямо интерфейс уже собранный, но таких совсем мало встречается.

    Если вам для вдохновления или поиска удачных решений для удобного интерфейса, то просто смотрите на реальное ПО и берите лучшее. Шаблоны в этом плане не помогут.
    Ответ написан
    1 комментарий
  • Каким инструментом отслеживать изменения в mysql?

    27cm
    @27cm
    TODO: Написать статус
    при достижении определенного порога(допустим число больше 100) происходило какое то событие, например удаление этой строки.

    Изменение значения инициируется из PHP скрипта?
    Вот и сделайте в скрипте проверку: если новое значение больше 100 - DELETE, иначе - UPDATE.
    Никаких кронов / events и триггеров тут не нужно.
    Ответ написан
    1 комментарий
  • GitKraken где найти материал обучения?

    GavriKos
    @GavriKos
    Если вы знаете git - то с gitkraken не должно быть никаких проблем.
    Если не знаете git - ищите по нему обучалки - их ПОЛНО
    Ответ написан
    Комментировать
  • Какая книга по php является самой полной?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Ответ написан
    Комментировать
  • Как завершение программы в osx через кнопку (x) в верхнем левом углу?

    mmmaaak
    @mmmaaak
    Отвыкай щёлкать мышкой, учи хоткеи. Тратится куча времени, особенно на больших десплеях, водить курсором туда-сюда. Зачем, когда можно нажать cmd+q
    Ответ написан
    2 комментария
  • Можно ли одним пользователем редактировать файлы для другого?

    planc
    @planc
    Почему я не могу править файлы пользователем wwwdev

    потому что для группы www стоят права только на чтение
    -rw-r--r--
    юзер - группа - все остальные

    либо дать права на запись для группы www
    chmod g+w имя_файла

    флаг -R если надо поменять права рекурсивно в папке
    chmod -R g+w *

    еще есть такая фишка, как acl:
    это возможность на один файл поставить разные права, для разных юзеров
    https://serversforhackers.com/video/linux-acls
    https://wiki.archlinux.org/index.php/Access_Contro...
    Ответ написан
    Комментировать
  • Есть ли смысл подписывать REST API запросы?

    @vintage
    Кука - это тоже access_token, только подставляемый браузером автоматически, даже если запрос инициирует не ваша страница, а страница левого сайта. Соответственно, при пробрасывании токена через куки, сторонний сайт сможет делать запросы к вашему, от имени пользователя. Нужно ли такое разрешать - вы решаете сами. Если нужно - просто используйте куки. Если не нужно, то самое простое - с запросом посылать взятый из куки токен в хедере, а на сервере сверять их идентичность. Получить куки скриптом можно лишь с того же сайта, кто их поставил. В урле токен лучше не посылать, чтобы он не светился в логах.
    Ответ написан
    2 комментария
  • Как писать кроссплатформенные приложения на C++?

    Adamos
    @Adamos
    GTk - это не С++, это С.
    wxWidgets - легкие и сильно похожие на MFC / VCL, что когда-то было плюсом. Сам использую эту библиотеку для кроссплатформенной разработки, но вам сейчас, на распутье, советую все-таки Qt. А еще советую писать не под Виндой. Из тех же соображений, из которых в вебе не верстают изначально под Ослик. Принцип "работаем по стандартам, добавляем костыли для девиаций", а не наоборот.
    Ответ написан
    4 комментария
  • Паттерны проектирования?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Паттерны - это не код. Паттерны - это идея. А код (реализация) может быть разной. Поэтому везде, где вы видите код - это частный пример паттерна.
    Ответ написан
    Комментировать
  • Как вернуть ответ из XMLHttpRequest?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Из асинхронной функции невозможно вернуть значение, потому что на момент выхода из неё оно ещё не определено.
    Вы можете:
    1. Вернуть промис, который будет возвращать значение
    2. Принимать в асинхронную функцию другую функцию и вызывать её при получении результата, передавая его в качестве аргумента.
    3. Сделать запрос синхронным и писать результат в глобальную переменную.
    4. Использовать синтаксис async/await, если у вас свежая версия Node.

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