• Для чего существуют другие парадигмы программирования?

    saboteur_kiev
    @saboteur_kiev Куратор тега Программирование
    software engineer
    Нельзя в двух словах сказать зачем нужны парадигмы программирования, потому что для этого нужно иметь опыт программирования, чтобы вы могли усвоить ответ.

    Например, ваше представление: "ООП удобен для бизнеса, можно разделять программу на модули" - неверно.
    Модульность появилась задолго до ООП. Бизнес появился задолго до программирования, и ООП и бизнес не слишком и связаны.

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

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

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

    И напоследок - полиморфизм и все другие фичи ООП - это уже следствие того, что парадигму стараются сделать максимально гибкой.
    Самая главная суть ООП заключается в следующем:

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

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

    Moskus
    @Moskus
    Вам нужно работать не со всеми цветами из изображения, а с цветовой статистикой.
    Методы поиска доминирующих цветов изображения описаны в этой статье на Хабре https://habrahabr.ru/post/156045/ и в трех других, на которые даны ссылки в ее первом абзаце.
    Далее, вам нужно искать изображение, в наборе доминирующих цветов которого есть цвет, наиболее близкий к тому, по которому вы осуществляете поиск. Для этого, вам нужно ознакомиться с теорией цветовых пространств и сравнения цветов на основании расстояний между ними в этих пространствах. По это теме начните с https://habrahabr.ru/post/181580/
    Это не такая простая задача, как вам кажется. Простые решения для нее дают отвратительный результат.
    Ответ написан
    5 комментариев
  • Откуда появляется задерджка при анимации?

    rockon404
    @rockon404
    Frontend Developer
    Вот заплатка решающая вашу проблему https://jsfiddle.net/cug6w5sd/1/
    Добавил дополнительные условия в слушатель keyup.
    Лучше переписать покрасивей.
    Ответ написан
    1 комментарий
  • Что подразумевается под strong knowledge С++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Но вот что вообще определяет уверенное знания С++. То есть, что именно для этого нужно знать?

    Это очень просто: нужно уметь прочитать любой фрагмент кода на C++ и понять его.
    Открывайте С++ исходники наугад и читайте любую функцию. Если вы в состоянии сделать это много раз подряд с разными проектами -- скорее всего вы уверенно знаете С++.
    Ответ написан
    4 комментария
  • Как встроить технологию blockchain в проект?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    DPFvZuqU8AAeU0C.jpg
    Ответ написан
    Комментировать
  • Зачем шифровать скрипты, например PHP с помощью ionCube 9?

    Sanasol
    @Sanasol Куратор тега PHP
    нельзя просто так взять и загуглить ошибку
    А если серьезно, то это у них вроде ускоряет загрузку скриптов. Что-то типа компиляции в байт-код.

    маркетинг шит 146%
    не может быть быстрее при как минимум еще одной обработке сверху в видел модуля для запуска закодированного кода. Ресурсов наоборот больше сожрёт, скорость в лучшем случае не упадёт.

    Объясните, зачем он? Когда применяется? Приведите реальный пример.

    когда продаешь самохостящийся продукт на php в котором есть проверка лицензии или просто супер гениальные алгоритмы которые не хочется раскрывать. Чаще конечно никаких гениальных вещей там нет и шифруют только ради проверки лицензии и отключения софта когда лицензия кончилась.

    Как правило все версии(кроме самых самых свежих) любого шифровальщика относительно легко раскрываются с помощью гугла/форумов DeZender'ов или даже онлайн сервисов.
    Вскрытие не всегда бесплатно естественно и не всегда прокатывает(точность не 100% при восстановлении, суть уловишь, но исходиники будут не рабочие).
    Суть вскрытия в удалении/обходе проверки лицензии.
    Т.к. особо там ничего не придумаешь, то проверка лицензии это зачастую просто запрос на сайт продавца из разряда
    $license_ok = file_get_contents("http://shopcms.com/check_license.php?domin=customer.com");
    if($license_ok) {
    //ok
    } else {
    die("Pay for license");
    }


    Поэтому обходится примерно так:
    Без изменения оригинального кода и работой с зашифрованынми исходниками(в случае если расшифровать не удалось до конца, но суть проверки лицензии понятна)
    1. Заворачиванием сайта продавца на локалхост с вечной лицензией. (прописать в hosts файл)
    2. Подменой глобальных переменных($_SERVER) чтобы проверялся домен на котором есть лицензия. (вставить в index.php или другое место где исходники открыты)

    Если исходники расшифровались правильно и работают
    3. Выпиливанием проверки лицензии из исходников.

    Лень искать, а точнее поиска нет по овтетам, но уже писал.
    Я считаю что шифрование никак не увеличит продажи или защитит от мамкиных хакеров.
    Кто очень хочет - он будет ломать, в случае неудачи просто не будет пользоваться.
    Кто адекватный - будет платить в любом случае за СЕРВИС/ОБСЛУЖИВАНИЕ. Т.е. получать обновления и поддержку разработчиков.

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

    Возможно даже можно сравнить с борьбой с пиратами.
    Закрывают торренты, видео сайты, судятся из-за "упущенной прибыли".
    При этом продолжают снимать и прибыли только растут с годами.
    Никто так и не доказал что раздача кинца/игор на торренте равняется потери прибыли.
    И опять же даже наоборот помогает некоторым продуктам увиличивать аудиторию.

    PS. Забыл решение написать грамотное по моему мнению.

    1. Если у вас действительно супер-пупер секретный алгоритмы которые никто не знает или может повторить.
    Использовать исключительно модель SaaS или производить вычисления через ваш сервер(но продукт всё равно будет стоять на сервере клиентов).

    2. Если никаких алгоритмов взлома гугла/пентагона/игил/телеграма там нет.
    Просто отдавать открытые исходники для работы.

    3. Если вы пишите очень плохой код и вам стыдно или хороший код, но вы жадный.
    Используйте SaaS.
    Технологии позволяют привязать домен клиента к вам, создать ему отдельное рабочее пространство(виртуалку/сервер) и всё что только придумать можно.
    Ответ написан
    4 комментария
  • Как сделать вход в первую папку в скрипте sh?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    обнаружить папку в директории и осуществить вход в неё

    find -maxdepth 1 -type d -not -name '.' >& /dev/null && cd "`find -maxdepth 1 -type d -not -name '.' | head -n1`"
    Ответ написан
    1 комментарий
  • Как декодировать такой десятичный код?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    echo html_entity_decode("Ноябрь'17", ENT_QUOTES);
    
    Ноябрь'17
    Ответ написан
    1 комментарий
  • Как определить установлены мессенджеры на телефоне или нет?

    @afanasiyz
    Javascript-разработчик
    Если интересует, какие именно приложения установлены (и вы разрабатываете именно мобильное приложение), то вот небольшой плагинчик (для кордовы), там в коде есть пример, как приложение проверяет, установлен ли инстаграм.
    https://github.com/vstirbu/InstagramPlugin/

    (/src/android/CDVInstagramPlugin.java строка 83).

    Думаю, если знать айдишники приложений телеграма, ватсаппа и вайбера, то можно провернуть что-то такое.
    Ответ написан
    Комментировать
  • Кто как укладывает бизнес правила в БД?

    Таблица принятия решений (таблица решений) - очень эффективное решение для такого рода задач.
    Из русской Википедии:
    Таблица принятия решений (таблица решений) — способ компактного представления модели со сложной логикой. Аналогично условным операторам в языках программирования, они устанавливают связь между условиями и действиями. Но, в отличие от традиционных языков программирования, таблицы решений в простой форме могут представлять связь между множеством независимых условий и действий.

    5a15e62220a7b529500711.png
    На английском - Decision table - можно найти гораздо больше полезного материала, чем на русском. Допустим, это видео с объяснением.
    Таблицы можно хранить в СУБД и обмениваться при помощи CSV.
    IBM и многие другие компании применяют их в разных своих продуктах. Особенно полезны для описания деятельности бухгалтерии, складского учета и пр.
    Ответ написан
    3 комментария
  • Как избежать коллизии access_token?

    qonand
    @qonand
    Software Engineer
    Нужно ли добавлять к это методу логин или это проблемы можно как то избежать?

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

    @akurash
    Для начала вам нужно проконсультироваться со своими финансистами/экономистами/бухгалтерами (кто занимается ценообразованием и отвечает за цены). Консультация нужна для того, чтобы выяснить, будет ли допустимым хранение только одной учетной цены в учетной валюте при условии, что все остальные цены (в других валютах) будут формироваться на лету путем пересчета учетной цены по курсу.
    В ряде случаев это недопустимо, т.к. внезапно может выясниться, например, что ваши ценовики для формирования цен используют свои собственные представления о том, как именно нужно их формировать, и эти представления могут отличаться от логики вашего ПО (например, могут отличаться правила округления при пересчете по курсу, или не все полученные цифры удастся объяснить с точки зрения представлений программиста о математике и/или о здравом смысле).
    Также может оказаться, что все цены в разных валютах фиксируются в бумажных документах (прейскурантах или т.п.) за подписью каких-либо должностных лиц, и эта фиксация происходит не ежедневно с учетом изменяющегося курса, а, к примеру, раз в месяц, или по факту изменения учетной цены. Если фиксация цен имеет место, то скорее всего цены на сайте всегда должны будут соответствовать ценам в документах, а не просто вычисляться по ежедневному курсу.
    Дальнейшую стратегию нужно строить с учетом всплывших обстоятельств ценообразования. В идеале никаких нюансов не обнаружится и вы будете вольны реализовать работу с ценами по собственному усмотрению.
    Ответ написан
    Комментировать
  • Как поэтапно выводить текст (шрифт прописной рукописный)?

    @vetsmen
    Первое, что приходит в голову, это преобразовывать текст в SVG элемент и по очередности анимировать path элементы, как тут: https://codepen.io/ghepting/pen/xnezB
    Пожалуй, более легкого способа для полноценной имитации рукописного ввода нет, если не банальный побуквенный вывод текста с нужным шрифтом
    Ответ написан
    1 комментарий
  • Зачем нужно ООП в javascript?

    thehighhomie
    @thehighhomie
    Вам нужно почитать эти две статьи + комментарии людей снизу:
    ООП в функциональном стиле
    ООП в прототипном стиле

    И видео:
    Javascript-джедай #20 - Прототипы и наследование
    Javascript-джедай #21 - Конструкторы и классы

    Этого вполне хватит чтобы понять ооп в JS и для чего он) во время практики вы сами прозреете)

    И лучше изучи весь учебник: Современный учебник Javascript

    На счет видео Sorax'a не скажу что мне они нравятся но в сети его хвалят, так что решать вам, мне больше учебник помог.
    Ответ написан
    3 комментария
  • В чем удобство указывать константам двоичные и шестнадцатиричные числа?

    Stalker_RED
    @Stalker_RED
    Вопрос читабельности.
    Немного проще прикинуть что 0b100 + 0b10 = 0b110
    Еще сильнее это заметно, когда надо наоборот, понять по какой-то сумме какие компоненты в нее входят.
    Гораздо проще разложить в уме 101010 на 100000, 1000 и 10, чем 42 на 32, 8 и 2
    Ответ написан
    Комментировать
  • Как реализация вкладки на сайте?

    Тут скорее не вкладки, а фильтрация контента.
    В вашем примере реализована она на серверной стороне - при клике делается ajax-запрос и заменяться контент.
    Тут базовый алгоритм простой - отслеживаем через JS клик по "вкладке", делаем нужный ajax-запрос на сервер, потом заменяем старый контент на полученный в ответе на запрос. Ну и обвешиваем доп. плюшками, типа подсветки активного пункта меню (вкладки), спиннеры при загрузке и прочее.

    Небольшие списки контента можно фильтровать и на клиентской стороне, есть разные js-плагины, к примеру вот:
    https://www.kunkalabs.com/mixitup/
    Ответ написан
    1 комментарий
  • ДДос атака на nginx пакетами 1 байт?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    500 строк в секунду - это не мощно и, вероятно, даже не DDoS. Если адрес один, то просто закройте ему доступ брандмауэром, а если адреса разные, то настройте лимит запросов в Nginx.

    nginx.conf
    http {
        ...
        limit_req_zone $binary_remote_addr zone=reqlimit:10m rate=30r/s;
        ...
    }

    some_site.conf
    server {
        ...
        location / {
            ...
            limit_req zone=reqlimit burst=10 nodelay;
        }
    }

    После этого запросы с одного ip-адреса начиная с 31-го в секунду будут отбрасываться.

    Как вишенку на торт, можно добавить ещё фильтр для fail2ban:

    nginx-req-limit.conf
    [Definition]
    
    failregex = limiting requests, excess: .* by zone .*, client: <HOST>
    ignoreregex =

    и правило в jail.local
    [nginx-req-limit]
    enabled = true
    port = http,https
    filter = nginx-req-limit
    logpath = /var/www/*/*/logs/error.log # Здесь укажите свой путь к логам виртуального хоста
    findtime = 600
    maxretry = 10
    bantime = 7200

    После этого адреса DoS'еров будут автоматически блокироваться брандмауэром на два часа. Что разгрузит Nginx от обработки паразитного трафика.
    Ответ написан
    11 комментариев
  • Java и Kotlin. Как осваивать вместе?

    @bubuxDD
    Учите что-нибудь одно. Лучше выучить 1 язык хорошо, чем иметь кашу из-двух языков. Да и в разработке решают не столько языки сколько умение строить архитектуру приложений, выбирать оптимальные алгоритмы и фреймворки. Кругозор в смежных технологиях также приветствуется. А языки осваиваются быстро, 2-10 дней на усвоения синтаксиса, в то время как научиться писать хорошо продуманные с архитектуроной точки зрения проекты очень сложно и 10 лет тут мало.
    Ответ написан
    Комментировать
  • С чего начать изучение блокчейн?

    Советую читать онлайн-издания, так как книги часто не успевают за развитием технологий. Отличные фундаментальные работы на английском есть здесь: nakamotoinstitute.org/literature/.
    Полезные русскоязычные сайты: https://forklog.com/, https://bitnovosti.com/
    Хорошее видео об основах криптовалют: https://www.youtube.com/watch?v=bBC-nXj3Ng4 (есть субтитры на русском от меня:))
    Ещё, чтобы понять ICO, нужно немного разобраться в Ethereum. Хорошие материалы есть здесь: https://ethclassic.ru/
    И если с английским ОК, послушайте выступления самого здравомыслящего исследователя блокчейна: https://www.youtube.com/channel/UCJWCJCWOxBYSi5DhC...
    У него есть книга (первые глав 5 не очень технические): mirknig.su/knigi/programming/161246-mastering-bitc...
    Частичный перевод на русский тут (не проверяла, за качество не ручаюсь): https://www.bitcoinbook.info/translations-of-maste...
    Ответ написан
    Комментировать
  • Какой шаблон проектирования больше подходит для загрузки связанных сущностей?

    qonand
    @qonand
    Software Engineer
    1. Как-то у Вас сущности живут отдельной жизнью друг от друга. По сути сейчас Вы перенесли структуру своей базы данных на объекты, а это не правильно. Сущность заказа должна агрегировать в себя сущности позиций заказа и покупателя, а не просто содержать их идентификаторы. Например:
    class OrderEntity
    {
        /**
         * @var integer Идентификатор заказа
         */
        protected $id;
        
        /**
         * @var MemberEntity Объект покупателя
         */
        protected $member;
        
        /**
         * @var ItemEntity Массив позиций заказа
        protected $items = [];
    }

    2. Получение данных из базы данных в объект должно быть реализовано в каком-нибудь репозитории или в каком-нибудь датамаппере. Почитайте про эти паттерны. Но вообще лучше взять какую-нибудь вменяемую ORM что бы избежать кучи гемора.
    3. По названиям классам - не добавляйте в них суфикс Entity, код становиться из-за этого более нагроможденным, лучше используйте пространства имен
    Ответ написан
    3 комментария