Задать вопрос
  • Как удаленно обновлять программу на php?

    inoise
    @inoise Куратор тега PHP
    Solution Architect, AWS Certified, Serverless
    Я бы в идеале вынес из локальной сети в интернет этот сервис и выдал всем централизованные доступы, но если возможности нет то добро пожаловать в начало пути DevOps. Возьмите, для старта, Jenkins и научите его развертывать обновления. Можно по расписанию, можно по обновлению master ветки из репозитория
    Ответ написан
    Комментировать
  • Как лучше распространить (продавать) коммерческий проект (angular 9 + php), локально или на сервере с общим доступом?

    @boss_lexa
    во первых не смешивайте бизнес модели (единоразовая оплата и подписку ежемесячно/ежеквартально/ежегодно) и тип пользования (SaaS или установка на сервер клиента)

    1) Регулярная подписка скорее всего даст большую прибыльность с одного клиента (LTV), чем стоимость его привлечения (CAC) и для бизнеса лучше выбрать именно ее. Но все зависит от сложивших рыночных условий на ваш продукт - возможно в данном типе бизнеса подписки не берут. Чтобы понять нужно изучить рынок и сделать какие-то тестовые продажи. Даже если клиент пользуется ПО на своем сервере - вы также можете лицензировать его по подписке. А еще для подписки важно правильно выбрать периодичность ее оплаты так, чтобы ее бизнес модель сложилась (LTV > 2 CAC не более чем за полгода) - некоторые компании берут например не менее чем за 3-6 месяцев оплаты - тк меньше им не окупаются затраты на привлечение клиентов в разумное время.

    2) Для защиты вашего ПО от кражи - самый надежный вариант продавать только доступ к своему серверу, про защиту данных и стоимость серверов - посмотрите на сервис Lightsail AWS - там в одном регионе по 3 датацентра с низким пингом, делаете репликацию и бекапы чтобы данные были надежно защищены от потери и были высокодоступны, недорогие цены на vps от 3.5$/месяц.

    Установка на сервер клиента - это как правило нужно только корпоративным клиентам, для которых критически важна информационная безопасность - такие клиента готовы платить за это!

    А еще есть ряд клиентов - которым администрирование своего сервера/хостинга - не удобно.

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

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

    Поэтому решение - 2 тарифа:
    1. регулярная недорогая подписка на SaaS сервис в облаке (ежеквартально/ежемесячно/ежегодно) для клиентов которые платят немного
    2. регулярная подписка с большой стоимостью с установкой на сервер клиента (ежеквартально/ежемесячно/ежегодно) для корпоративных клиентов которые готовы платить много
    Ответ написан
    Комментировать
  • Дайте оценку верстке?

    @Flying
    Визуально выглядит вполне пристойно и очевидных косяков почти нет, но если копнуть глубже - возникают вопросы.

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

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

    Однако и в этом случае и, тем более, в случае фоновых изображений ниже по странице вы допускаете ошибки с выбором форматов файлов, способами их вставки в страницу и оптимизацией. К примеру из картинки с автомобилем можно выжать почти 100кб просто за счёт использования оптимизаторов. Гораздо грустнее ситуация с фоновыми картинками ниже по тексту. Во-первых вы сохраняете фотографии в PNG, получая на выходе файлы по мегабайту, хотя они же в JPEG занимали бы в 5-10 раз быстрее. Во-вторых вы, скорее всего, сохранили фоновые картинки уже обработанными (затемнёнными). Я не видел макета, но предположу что там эти картинки стоят в их оригинальном виде и на них наложены какие-нибудь фильтры. На первый взгляд кажется что проблемы нет, но на практике (в случае вёрстки для реального сайта) вы вынуждаете человека который будет поддерживать сайт либо готовить картинки с такой же пост-обработкой либо мириться с тем что стиль сайта меняется. Правильное решение здесь - грузить картинки как они есть и реализовывать фильтры на CSS, тем более что здесь это делается элементарно через multi background или псевдо-класс с полупрозрачным фоном. Очевидно также что для таких тёмных картинок вполне можно использовать JPEG с меньшим качеством и тем самым существенно сэкономить пользователям трафик.

    Ещё одна проблема связанная с фоновыми картинками - вы не подкладываете под них близкий по цвету solid color. Попробуйте включить в dev.tools "Network throttling", отключить кэш и перегрузить свою страницу - думаю вы поймёте что я имею в виду - белые блоки с белым текстом стоят довольно продолжительное время, постепенно заполняясь довольно тёмными картинками. Если бы background-color под ними был бы чёрным - проблемы бы не было.

    Далее - логотип. Обычно логотипы разрабатываются отдельно и даже если он выглядит просто набранным шрифтом - это вовсе не значит что это не так. Логотип Google, Microsoft или Яндекс - тоже просто название, но, надеюсь вы не сверстаете их, написав надпись текстом? В общем логотип = картинка, лучше в векторе. Сейчас даже одно съезжание слогана на пиксель влево относительно названия уже рушит всю конструкцию логотипа.

    Обратите внимание на то как вы работаете с формами. Все поля в форме являются <input type="text">, хотя часть названий явно намекает на date / time селекторы, а "Choose Vehicle" - на список выбора.

    Хотелось бы отметить работу с иконками - их всё-таки лучше хранить в SVG и либо требовать с дизайнера либо подбирать на том же Icon Finder. При этом оформление (те пресловутые жёлтые кружки) лучше делать через CSS т.к. это позволяет вам существенно гибче работать с размерами элементов.

    Есть всякие недочёты касающиеся responsive, к примеру, внимание как отображается блок "Our Tariffs" в размере чуть более 600px, в частности название тарифа и описание.

    Пожалуйста обратите внимание на то что вы используете два разных меню для desktop и mobile представления. В целом в вашем случае меню довольно простое и можно было бы обойтись одним. Конечно две копии используют часто, но у этого решения есть свои недостатки (в частности отсутствие синхронизации состояния), так что вы должны осознанно принимать решение по таким вопросам. Кроме того inline обработчики onclick там явно могут быть заменены на элементарный
    document.querySelectorAll('.menu a, .menu-hover a').addEventListener()
    что явно сделает код более простым и поддерживаемым.

    Ещё один важный момент который зачастую опускают при вёрстке - поведение макета с реальными данными. То что дизайнер в макете понапихал везде lorem ipsum и тексты примерно одинакового размера - отнюдь не означает что на реальном сайте эти условия будут соблюдаться. Отсутствие навыка проверять поведение макета в изменяющихся условиях ведёт к множеству ошибок которые не видны в условиях синтетических данных. К примеру попробуйте в блоке "We Do Best Than You Wish" (претензии по поводу английского языка оставим в стороне) в любом из элементов банально увеличить количество текста в 2-3 раза. В Chrome это приводит только к излому сетки, в Firefox - ещё и к изменению размера иконки. При этом я предполагаю что Firefox ведёт себя правильно т.к. пропорции элементов изменились, а ограничения размеров на картинки у вас не заданы.

    В целом похоже что макет верстался и проверялся только в Chrome. К примеру посмотрите как ведёт себя картинка с рукой и телефоном в Firefox при изменении размеров. Опять же Firefox вполне корректен т.к. вы не обрезали картинку корректно, предпочитая выгрузить "как есть" и подгонять положение в CSS, но забыв при этом про overflow: hidden для контейнера.

    Теперь перейдём к CSS:

    Обратите внимание на то как вы подключаете внешний шрифт:
    family=Lato:400,700,700i,900,900i&amp;subset=latin-ext
    . Возникают два вопроса:
    1. Зачем вам subset=latin-ext на сайте где есть только базовая латиница?
    2. Как вы выбирали начертания? У вас подключаются 5 начертаний (400, 700, 900 + два italic'а), при этом grep по CSS даёт значения font-weight 200, 300, 400, 500, 600, 800 и ни одного italic. Вам не кажется что эти множества почти не пересекаются?


    Кроме того вы постоянно забываете про fallback шрифты что на медленном интернете и при отсутствии инструкций для font loading приводит к невидимому контенту страницы на период загрузки.

    Отсутсвие ограничения по ширине для .wrapper приведёт к недопустимо широкому сайту на больших мониторах с высоким разрешением. Можете уменьшить масштаб страницы до 50% и полюбоваться результатом.

    В стилях повсеместно используются достаточно общие названия классов в global namespace. К примеру кто бы мог подумать что стилизует селектор .text? Вы уверены что нигде больше на сайте подобный селектор не встретится? Даже при дальнейшем развитии сайта? Другими словами именование селекторов - важная часть работы, вы можете использовать любую методологию (тот же БЭМ или что-то ещё) или разработать свою, но ваш код не должен ломаться при добавлении ещё пары блоков, особенно если это будет делать другой человек.

    Списки элементов, к примеру тот же .product-cont лучше делать именно списками, а не распихивать элементы по столбцам вручную, благо flexbox и column layout здесь всё прекрасно сделают за вас, зато имея одноранговый список вы обеспечите себе куда большую свободу действий.

    Использование id в качестве CSS селектора - плохая практика, но у вас таких мест немало, 11 штук.

    Уверен что мог бы найти ещё что-то, но надеюсь для затравки хватит, и так много получилось... :)
    Ответ написан
    4 комментария
  • Как отображать изображения на тестовом сайте, если они лежат на основном?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    можно наладить редирект в оппаче, Redirect /uploads http://main.site/uploads
    но я бы просто перенес картинки на тестовый.
    Ответ написан
    Комментировать
  • Можно ли упростить функции?

    Adamos
    @Adamos
    Конечно. Например, первую функцию можно заменить на
    return ['tablename' => $table];
    Больше она все равно ничего не делает.

    А если вы, кроме unset, узнаете еще хотя бы об одной функции - array_fill, то и вторую функцию удастся сократить вполовину.
    Ответ написан
    1 комментарий
  • Как сверстать такую штуку?

    Как-то так
    Ответ написан
    Комментировать
  • Как сделать контролируемые обмены в онлайн-игре?

    @Karpion
    Я не понял проблемы.

    Где игроки собирают вещи? В процессе игры - подбирают с земли, берут с лута?
    Я бы сделал так, что собрать можно только сырьё; а вещи - скрафтить самостоятельно или купить у соответствующих мастеров. Причём мастера делают вещи только когда у них есть сырьё; и цены на вещи-и-сырьё зависят от соотношения спроса и предложения.
    Готовые вещи - можно снять с разбойников, но никак не с животных.

    У кого можно "обменять 10 вещей одинаковой ценности на одну вещь ценностью выше"? У других игроков? У NPC-торговца?
    (Кстати, тут лучше говорить не "ценность вещи", а "класс" или "категория".)

    Если речь о торговле между игроками - то пусть меняют как хотят. Любые ограничения в этой области - дико раздражают.

    Я не понял фразу "10 вещей ценностью ниже могут в сумме стоить дороже одной вещи ценностью выше или же наоборот". Откуда вообще берётся понятие "стоимость"?

    Я вообще советую не делить вещи на категории. Т.е. у вещей есть только цена в деньгах - для торговли; и сырьё + мастерство для изготовления.
    При этом - изготавливать вещи могут как NPC-мастера, так и игроки. Но игроку для этого надо долго прокачивать навык, портя при этом сырьё. А NPC-мастера есть не везде.

    Если Вы считаете, что у вещи есть какая-то стоимость - то Вы (как автор игры) задаёте эту стоимость всем NPC-торговцам. И понятно, что стоимость выражается в каких-то деньгах.
    Так вот, если NPC-торговец соглашается менять какие-то вещи на другие, но имеется расхождение по стоимости - то NPC-торговец требует от игрока доплатить некую сумму или же сам предлагает доплату.
    Если Вы хотите, чтобы NPC-торговец имел прибыль - то он должен постоянно делать перекос цен в свою сторону. Т.е. если я хочу поменять вещь Икс на вещь Игрек - то NPC-торговец требует доплатить 80 монет; а если я хочу поменять вещь Игрек на вещь Икс - то NPC-торговец предлагает мне доплату только 55 монет.

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

    Следует разделить NPC-мастеров и NPC-торговцев.
    NPC-мастер - покупает сырьё и продаёт свою продукцию. Причём процесс производства - подчиняется законам сохранения.
    NPC-торговец торгует чем угодно; ну или группа NPC-торговцев делят товары сообразно своей специаизации, если так игрокам удобнее. Но NPC-торговец может торговать только тем, что у него есть. Товары он может покупать и у игроков, и у NPC-мастеров своего города. При этом NPC-торговец может создавать квесты на доставку каких-то предметов, неважно откуда: он просто выставляет заказ с некой ценой.
    Чтобы написать стратегию поведения NPC-торговцев - я советую пригласить студентов-экономистов в качестве курсового проекта или даже диплома. Надо договоритться с каким-нибудь экономическим ВУЗом, и каждый год студенты будут дописывать торговый алгоритм.
    Ответ написан
    3 комментария
  • Пуск windows 8.1?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    1. Без посторонних - никак.
    2. Странно, что сам windows для вас - менее подозрителен!
    3. Юзаю ClassicShell - проблем нет (всегда проверяйте хеш-сумму скачанного файла дистрибутива с указанной на сайте!).
    Ответ написан
    Комментировать
  • Как перевести web-приложение в desktop?

    @antonwx
    В общем и целом... есть electron, который может помочь сделать это десктопным приложением, но запускать apache и mysql всё равно в фоне придётся
    Ответ написан
    1 комментарий
  • Как перевести web-приложение в desktop?

    Sanes
    @Sanes
    Ты его распространять собрался? Странное решение.
    Может лучше Python подучить? Он легкий.
    Ответ написан
    1 комментарий
  • Метод call объекта-функции в js как работает?

    ThunderCat
    @ThunderCat Куратор тега JavaScript
    {PHP, MySql, HTML, JS, CSS} developer
    6 комментариев
  • Найти и заменить запятую на точку?

    wapster92
    @wapster92 Куратор тега JavaScript
    console.log('55,5'.replace(',','.'))
    Ответ написан
    Комментировать
  • Как реализовать смену url после ajax запроса?

    @dthpth
    Погромист
    добавить свой обработчик на window.onpopstate и, увидев нужный url, менять контент на прежний (который был предварительно сохранён)
    Ответ написан
    Комментировать
  • Как реализовать это?

    Kozack
    @Kozack Куратор тега CSS
    Thinking about a11y
    Пишете HTML, добавляете CSS так чтобы соответствовало вашему дизайну ‍️
    Ответ написан
    Комментировать
  • Как обрезать текст после ajax загрузки?

    Eridani
    @Eridani
    Мимо проходил
    Если в запросе "success" вызвать функцию cutText(); то она начинает резать все посты и даже те которые уже обрезаны

    Куда угодно ставить маркер о том, что текст уже обрезан, например, класс модификатор у итема, соответственно, в теле success обращаемся к функции, которая берет все неотмаркированные итемы
    Ответ написан
    Комментировать
  • Как реализовать данную кнопку?

    SmthTo
    @SmthTo Куратор тега CSS
    Все перепёлки мира будут оплакивать мою смерть.
    Если для нормальных браузеров, то так и через один псевдоэлемент:


    Если для браузеров а-ля IE11 (+ всех нормальных), то так и через два псевдоэлемента:
    Ответ написан
    2 комментария
  • Как применить класс после увеличения высоты экрана?

    В функции scrolling ты удаляешь все обработчики события scroll у элемента document. Поэтому не срабатывает обработка события объявленная в самом верху.
    Ответ написан
    Комментировать
  • Правильно составить запрос DISTINCT?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Судя по нестандартному формату даты, хранится она в виде строки. Значит в конце может быть один или несколько пробелов, которые просто не видны при выводе.
    Ответ написан
    2 комментария
  • Как защитить запрос от изменения?

    @Narts
    Решение очень простое
    Создаем две функции: cryptID и decryptID, которые шифруют и дешифруют ID. Пользователю отдаем зашифрованный ID, типа:
    data-id="wallId_G5ht3Q"
    Далее когда пользователь отправляет запрос, получаем G5ht3Q, расшифровываем его, и проверяем, существует ли запись с таким ID
    Ответ написан
    2 комментария