• Как привести словесный пример полиморфизма?

    @kttotto
    пофиг на чем писать
    Когда Вам нужно что-то записать, обычно берут листочек и ручку. А можно не ручку, можно карандаш, можно фломастер или перьевую ручку. Полиморфизм будет заключаться в том, что Вам нужен объект, которым можно что-то записать, а какой конкретно и как он реализует саму запись Вас не сильно беспокоит. Т.е. когда Вы скажите: "дай мне объект для записи", Вам можно будет подсунуть любой объект, который как абстракция будет является "перо".

    Когда Вы хотите спать, Вы говорите: "дай мне на что можно лечь". И можно будет лечь хоть на диван, хоть на кровать, хоть на кресло-кровать. Абстрактно это все будет "кровать", но реализацию будет иметь разную.

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

    Полиморфизм бывает трёх типов: параметрический, ad-hoc и полморфизм подтипов.

    Параметрический полиморфизм нужен чтобы писать логику, параметризованную типами, реализующими некоторые интерфейсы (вырожденный случай - параметризованные любыми типами). Простейший пример: функция map, применяющая функцию к каждому элементу массива. Без полиморфизма мы бы писали отдельную функцию для каждого типа:

    mapIntFloat :: (Int -> Float) -> [Int] -> [Float]
    mapIntFloat f [] = []
    mapIntFloat f (x:xs) = (f x) : (map f xs)
    
    mapIntString :: (Int -> String) -> [Int] -> [String]
    mapIntString f [] = []
    mapIntString f (x:xs) = (f x) : (map f xs)
    -- и так далее


    Выходит довольно громоздко и налицо повторение логики в каждой функции вида mapTypeType. Чтобы избежать повторения логики, параметризуем функцию map относительно типов исходного массива и массива, получаемого в результате:

    map :: forall a b. (a -> b) -> [a] -> [b]
    map f [] = []
    map f (x:xs) = (f x) : (map f xs)


    Теперь вместо конкретных типов вроде Int или Float у нас переменные типов: a и b.

    Окей, но если копнуть глубже, оказывается, что логика, похожая на map для массивов, применима и к другим типам. Например, к optional-значениям. Без ad-hoc полиморфизма мы напишем что-то типа:

    mapList :: forall a b. (a -> b) -> [a] -> [b]
    mapList f [] = []
    mapList f (x:xs) = (f x) : (mapList f xs)
    
    mapMaybe :: forall a b. (a -> b) -> Maybe a -> Maybe b
    mapMaybe f Nothing = Nothing
    mapMaybe f (Just x) = Just (f x)


    Видно, что логика везде примерно одна и та же, сигнатуры совпадают с точностью до параметризванного типа. Вот для этих случаев и нужен ad-hoc полиморфизм:

    class  Functor f  where
        map :: (a -> b) -> f a -> f b


    Мы параметризовали нужную нам логику относительно параметризованного типа f и теперь можем писать реализации для конкретных типов:

    instance  Functor Maybe  where
        map f Nothing = Nothing
        map f (Just x) = Just (f x)
    
    instance  Functor [] where
        map f [] = []
        map f (x:xs) = (f x) : (map f xs)


    Сама функция map теперь имеет тип:

    map :: forall f a b. Functor f => (a -> b) -> f a -> f b


    Теперь мы можем писать функции, которые работают с любыми функторами, то есть опять-таки сократить повторение логики в коде.

    Наконец, полиморфизм подтипов - это несколько другой подход к предыдущей проблеме. Вместо выделения общего интерфейса мы создаём базовый тип и наследуем от него остальные. В этом случае Functor будет абстрактным классом с абстрактным методом map, от которого наследуются типы Maybe, List и т.д. В таком случае сигнатура функции, принимающей и возвращающей функтор, будет выглядеть примерно так: foo :: Functor Int -> Functor String.
    Ответ написан
    1 комментарий
  • Как найти источник скрипта в html?

    lukoie
    @lukoie
    Скачать все файлы, и сделать поиск по ним в файловом менеджере.
    Ответ написан
    8 комментариев
  • Контроль памяти в JavaScript?

    KorniloFF
    @KorniloFF Куратор тега JavaScript
    Работаю по font-end / JS
    Ответ написан
    Комментировать
  • Как вывести сотрудника на чистую воду?

    @Beltoev
    Живу в своё удовольствие
    Сломайте какую-то часть функционала (намеренно), оставив в исходном коде, куда в любом случае попадет реальный исполнитель, "предложение" связаться с вами. Нет, не явно, конечно же)

    Простой пример "псевдокодом":
    ...
    var goToImplementation = 10000;
    
    var hello = IWantToOfferYouAJob(goToImplementation);
    ...
    function IWantToOfferYouAJob(yourPotentialSalary)
    {
       if (yourPotentialSalary is enough)
       {
           var writeMeToEmail = "mail@mail.ru";
       }
    }


    Что-то в таком стиле, чтобы без вникания в задачу не бросалось в глаза, но при более глубоком изучении складывалась общая картина о том, что баг намеренный и тебя куда-то приглашают. То есть, реальный исполнитель может думать, что ваш сотрудник - владелец проекта, но по коду должна сложиться реальная картина, чтобы он связался напрямую с вами, а не отписался сотруднику
    Ответ написан
    Комментировать
  • Возможно ли найти удаленную стажировку в it?

    sfi0zy
    @sfi0zy
    Creative frontend developer
    Но вряд ли кого-то интересует человек без опыта... Нормальной работы тут не было...
    сложно ли устроиться... много что пробовал... вольюсь во что-то новое если понадобится

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

    Фриланс тоже имеет смысл попробовать, но это не для всех. Там умение продавать продукт имеет большее значение, чем умение его создавать.
    Ответ написан
    2 комментария
  • В To-Do приложении таски отмечаются через один. Почему?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Потому что при каждом создании нового пункта вешается дополнительный обработчик клика на все пункты списка. В результате на чётных пунктах срабатывает чётное количество обработчиков - класс goal-check выставляется и тут же снимается.

    UPD. Обработчики кликов на .goal и .delete надо вешать один раз, применяя делегирование:

    $('.todo-task').on('click', '.delete', function() {
      $(this).parent().remove();   
    });
    
    $('.todo-task').on('click', '.goal', function() {
      $(this).toggleClass('goal-check');
    });
    Ответ написан
    3 комментария
  • Как зарегистрировать протокол для открытия приложения из браузера?

    @BorisKorobkov
    Web developer
    При установке приложения оно должно зарегистрировать в браузере свою Scheme.
    Общая информация www.openintents.org/intentsregistry
    Примеры для iOS/Android https://stackoverflow.com/questions/11421048/andro...
    Ответ написан
    1 комментарий
  • Как убить процесс ноды завершенный некорректно?

    Выполните команду fuser -k 3090/tcp это прибьет приложение которое использует Ваш порт.
    Ответ написан
    Комментировать
  • Как перевести bitcoin без комиссии?

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

    По идее скоро должно стать полегче, когда все обновят ПО и начнут использовать транзакции с вынесением подписей, согласно сегвиту, но пока единственный простой вариант для мелких транзакций - использовать альтернативные криптовалюты, типа Litecoin. благо конвертировать одно в другое не проблема на биржах, даже если на выходе нужен Bitcoin.
    Ответ написан
    Комментировать
  • Куда развиваться и как профессионально расти как php программист в маленькой фирме?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Взгляните на рынок -- куча крутых нагруженных сервисов делается в мире.

    Чтобы ответить себе же, ответьте мне (я расту, мне интересно):
    - пишете ли вы тесты? TDD? DDD?
    - делаете ли сервисный слой?
    - следуете ли GRASP и SOLID?
    - есть ли опенсорсное что-либо? (например делали что-то для того же Symfony?)
    - оптимизировали ли вы огромные нагрузки?
    - упирались ли в пределы php и выносили ли отдельные элементы системы на др языки?
    - обучали ли вы ребят (с нуля, хорошему коду и практикам)?
    - занимались ли международными проектами?
    - запили ли что-нибудь свое, что стало популярным?
    - участвовали ли в конференциях?

    Если везде да -- скажите, что это за маленькая фирма, в которой так можно вырасти?

    Короче -- сделай список, в чем слабоват, что бы ты хотел -- и лупи силой железобетона по этим точкам!
    Ответ написан
    1 комментарий
  • Как реализовать таксометр?

    freeExec
    @freeExec
    Участник OpenStreetMap
    Проблема кривых треков решается сматчиванием трека с графом дорог. Так что если хотите более точных показаний расстояний то копайте в эту сторону. Вот ребята пилят удобный граф под это дело, но я читал по диагонали, не знаю насколько там завершено.
    Ответ написан
    Комментировать
  • А Вы встречали гениев-программистов?

    sfi0zy
    @sfi0zy
    Creative frontend developer
    Смотрю вопрос пользуется популярностью, поэтому тоже поделюсь мыслями. Люди, которые отвечают выше, смотрят на этот вопрос с одной стороны, а я расскажу с другой. Не буду называть себя гением и даже талантливым, но тем не менее ситуация, которую вы описываете, мне очень знакома. Я сам такой. Не общительный, со своим ноутом, решаю неочевидные задачки, занимаюсь в основном фрилансом, чтобы уменьшить бессмысленное общение на общие темы, хотя переодически сталкиваюсь с командами. Есть похожие знакомые. Не буду давать советов или рекомендаций. Просто поделюсь наблюдениями с обратной стороны, а выводы вы уже сами делайте.

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

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

    Резюме его тянуло на senior, а в комменте к резюме говорилось об отсутствии командной разработки и том, что кандидат интроверт.

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

    Он достал из портфеля свой ноутбук и с невиданной до этого скоростью решил новую тестовую задачу за 22 минуты

    Дело в том, как такие люди обрабатывают информацию. Почитайте другой ответ, я там приводил пример. Для сохранения рассудка отдельные факты не запоминаются и есть необходимость иметь свой набор закладок/заметок/исходников чтобы что-то сделать. Иначе получается, что "кусок мозга отрезали", а без него даже простейшая задача, которая не встречалась в последний месяц, может вызвать затруднения.

    что первый раз в жизни видел такой подход к решению задачи и те инструменты, которыми пользовался кандидат были ему не известны

    Это следствие широкого кругозора из предыдущего пункта. Просто есть особенность: если вы говорите "сделай мне xxx с помощью yyy" такой человек с большой вероятностью скажет "но с помощью zzz это сделать проще/быстрее/понятнее/проще_поддерживать и.т.д.". Не стоит сразу отбрасывать эту мысль, практически всегда она будет серьезно аргументирована. Это касается оценки заданий на собеседовании - если вы получили решение или ответ, который не ожидали - это стоит обсудить. Так вы покажете свою заинтересованность в знаниях кандидата. А это жирный плюсик в ваш адрес.

    В ответах выше говорят, что
    Для организации гений скорее вреден, чем полезен.

    Это спорное утверждение. Такой разработчик быстро устает от рутины, но даже рутину он может делать быстрее, чем кто-то другой. Или вообще может ее автоматизировать используя знания из других областей. Да, работать 9 часов в день практически невозможно. Но и за 4-5 часов при частичной занятости можно успевать очень многое.

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

    Еще там кто-то сказал
    психологических качеств (как вольётся в коллектив, в процесс)

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

    zoroda
    @zoroda
    Необычный Fullstack
    Ох, эйчары! Они такие эйчары! Сколько с ними ни общался - милые, замечательные люди. Но как же далеки они от народа!
    Приходилось взаимодействовать с HR как с позиции кандидата, так и с позиции руководителя.
    Валик-джан, я тебе один умный вещь скажу, но только ты не обижайся (c) Г.Данелия
    Руководитель принимает решение о приёме на работу кандидата исходя из двух основных составляющих:
    а) технических знаний и навыков (что сможет выполнять), которые может оценить только технарь, например, тимлид;
    б) психологических качеств (как вольётся в коллектив, в процесс), которые должен оценить HR-специалист.
    Не пытайтесь решать чужую задачу. Проводить техническую часть собеседования, определять насколько "гениален" человек как разработчик - не ваше.
    Самое большее, что вы могли бы сделать, - определить, какие нужны этому кандидату особые условия работы и донести это до техлида и руководителя. Поверьте, именно за это вам будет благодарен руководитель, а не за то, что вы определили в ком-то гения.
    И таки да, гении - проблемные. По себе знаю :)
    Ответ написан
    Комментировать
  • А Вы встречали гениев-программистов?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Не надо высматривать гениев. Чудоковатым гениям место в институтах. В бизнесе их гениальность применить почти невозможно. Ищите человека подходящего под ваши условия работы и требования.
    Ответ написан
    10 комментариев
  • Где найти список всевозможных функций указания CSS селектора (class и id) используемых в js?

    @Mikola-BLR
    1) document.getElementById(id)
    2) document.getElementsByClassName(names)
    3) document.getElementsByName(name)
    4) document.getElementsByTagName(name)
    5) document.querySelector(selectors)
    6) document.querySelectorAll(selectors)

    .addClass() - это метод (функция) из библиотеки jQuery, а не из чистого Javascript.
    В JS есть classList.
    ClassList является геттером. Возвращаемый им объект имеет несколько методов:
    .add()
    .remove()
    .toggle()
    .contains()
    все они принимают в качестве аргумента имя класса.

    Собственно, на том ресурсе, на который я привёл ссылки (MDN - Mozilla Developer Network) в первую очередь стоит искать ответы, и прочитать описание остальных методов (в левой колонке обычно весь список, относящийся к какой-то теме)
    Ответ написан
    Комментировать
  • Как ограничить скорость интернета?

    @Fixid
    Толкового выйдет мало, самым простым способом (но и требующим некоторых знаний) купить mikrotik младших серий, цена 600-700р, внутри возможность настроить как душе угодно.

    Аналогично сижу на adsl и при upload пинг уходит в бесконечность. Проблему решил такой схемой

    инет <-> D-Link DSL-2500U (pppoe) <-> Mikrotik hAP Lite (proxy, QoS, VPN, Wifi IoT) <-> Xiaomi WiFi3 ( перешит, базовая wifi ac)

    Максимальная скорость на upload в 80% от канала, теперь пинг не скачет и упал до 10-15мс.
    Еще можно уменьшить пинг ценой потери скорости download, путем смены adsl протокола
    Ответ написан
    Комментировать
  • Каким образом Генераторы могут позволять контролировать асинхронность?

    mannaro
    @mannaro Куратор тега JavaScript
    Умею профессионально гуглить
    У тебя небольшая каша в голове. Изначально был callback, затем ему на смену пришел promise. Потом придумали генераторы, которые научились останавливать функцию до достижения какого-то события. Использовать их оказалось очень удобно для ожидания разрешения промиса.
    А потом ввели сахар - async/await. Тот же генертор, но немного в профиль. Где await вместо yield, а async вместо *.
    Ответ написан
    7 комментариев
  • Как разобраться в битовых масках или как их там?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Про двоичное представление чисел вы же в курсе?
    0 = 0000 0000
    1 = 0000 0001
    2 = 0000 0010
    3 = 0000 0011
    4 = 0000 0100
    5 = 0000 0101
    6 = 0000 0110
    7 = 0000 0111
    8 = 0000 1000
    9 = 0000 1001

    ... и так далее. До 232 или даже до 264 - зависит от системы, 32- или 64-битной и языка программирования.

    Позиции битов считаются справа налево. Крайний правый бит имеет позицию 0. Позиция бита – это степень двойки. Если бит установлен в 1, надо прибавить 2 в степени этой позиции.

    Например, число 3 = 0000 0011 означает 20 + 21 = 1 + 2 = 3.

    Примечательно, что степени двойки – 0, 1, 2, 4, 8, 16, 32, 64, ... – выражаются всего одним включённым битом, одной единичкой, остальные биты – нули.

    Битовые маски – это договорённость, что каждый бит (каждая позиция) значит что-то определённое, что может быть включено или выключено, 1 или 0. Как линейка выключателей.

    Например, с разрешениями ВКонтакте:
    1 - бит 0 - notify
    2 - бит 1 - friends
    4 - бит 2 - photos
    8 - бит 3 - audio

    У ВК линейка длинная, состоит из 32 «выключателей».

    Допустим, вашему приложению требуются разрешения photos и audio – биты 2 и 3 надо установить в 1, остальные 0. Это можно сделать простым сложением: 22 + 23 = 4+8 = 12. В двоичной системе: 12 = 0000 0000 0000 1100

    Для удобства вычисления ВК прямо пишут значения, которые надо прибавить, чтобы получить нужную битовую маску – итоговое число, которое вы передадите в метод АПИ для запроса разрешения.

    Ещё один пример, вам требуется стена wall и offline доступ в любое время. Смотрите в таблице, какие там числа: wall (+8192) и offline (+65536). Значит, вам нужно просить разрешения для маски 73728
    Ответ написан
    Комментировать
  • Использование нелицензированного ПО в организации, кто несёт ответственность?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    А теперь от теории к практике, я сам несколько раз попадал под проверки, а также несколько лет "работал" независимым специалистом по киберпреступлениям, в том числе на проверках лицензионной чистоты. Руководство всегда показывает пальцем на админа и говорит "Мы не знали, вот ответственный специалист!" Заканчивается это тем, что компанию штрафуют, а админу прилетает срок. Наличие бумажки о том, что директор знал об установке пиратского софта трактуется судом как преступный сговор. Позиция админа "я не обязан разбираться в тонкостях лицензирования" - это как позиция бухгалтера "я не обязан разбираться в тонкостях налогообложения". Правильных решений может быть только два - либо заставить компанию перейти на лицензионное ПО, либо уволиться.
    Ответ написан
    39 комментариев