Задать вопрос
  • За что отвечает require-dev в Composer?

    @harmoxyne
    Отвечает за те зависимости, которые необходимы только для dev-окружения.
    К примеру, Вы точно знаете, что библиотека phpunit нужна для разработки, а на проде будет лишней, тогда phpunit попадает в require-dev.
    Когда выполняется простой
    composer install
    устанавливаются и dev-зависимости.
    Когда выполняется
    composer install --no-dev
    устанавливаются только те зависимости, что в основном блоке require.

    Источник
    Ответ написан
    Комментировать
  • Как изменить горячую клавишу смены языка на Ctrl+Shift в Ubuntu 18.04?

    Надо установить gnome-tweaks:
    sudo apt-get install gnome-tweak-tool
    Далее вызываете gnome-tweaks, с левой стороны выбираете "Клавиатура и мышь".
    Под "Комбинация клавиш ... " есть кнопка "Дополнительные параметры раскладки" нажимаете и в окне выбираете "Переключение на другую раскладку". Там можно выбрать любую комбинацию от Alt+Shift и т.д.
    Ответ написан
    15 комментариев
  • Под какие разрешения рисовать адаптивный дизайн?

    paulradzkov
    @paulradzkov
    Дизайнер, верстальщик, начальник отдела UI
    При рисовании любого дизайна встает техническая задача — уместить элементы сайта в указанную ширину. Уместить в заданную ширину тяжелее, чем растянуть до заданной ширины. Растянуть легко на этапе верстки. Поэтому нужно ориентироваться на минимальную ширину в классе.

    1. Мобильные телефоны — 320px. Ориентируемся на viewport айфона, т.к. он самый маленький. У современных андроидов вьюпорт больше, поэтому их игнорируем (растянется на верстке).

    2. Планшеты — 768px. Опять-таки ориентируемся на айпад в портретной ориентации , т.к. у андроид планшетов вьюпорты обычно имеют размер от 800×1200 или совпадают с айпадом. Планшеты с вьюпортом 600×1024px устарели. К тому же ничего страшного, если в вертикальной ориентации сайт на таком планшете будет выглядеть как на мобильнике, а в горизонтальной ориентации — как на десктопе.

    3. Десктоп и планшеты в ландшафтной ориентации — 1000px. Почему 1000, а не 1024: первое, в настольных браузерах полоса прокрутки съедает (обычно) 18px ширины; второе, от 1000px верстальщику удобнее расчитывать размеры в процентах, а до 1024 все равно растянется при верстке.

    В принципе, этого достаточно, чтобы верстальщик справился.

    Если дизайн не имеет максимальной ширины и тянется от края до края окна браузера, то на усмотрение дизайнера можно нарисовать еще один или несколько эскизов для более широких экранов.

    В каком порядке рисовать? Смотря как поставлено тех.задание. Чаще всего в задании описан полный функционал для настольной версии. Тогда проще нарисовать дизайн под 1000px и перекомпоновать под 768 и 320, выбросив или упростив по пути менее значимые элементы сайта. Т.е. двигаться от сложного к простому.

    Верстать при этом удобнее от меньшего экрана к большему (от простого к сложному). При mobile first верстальщику приходится дописывать новые стили для бóльших экранов поверх базовой версии в 320px вместо того, чтобы обнулять написанные для настольных браузеров стили. В результате для мобильника css весит меньше и парсится быстрее.
    Ответ написан
    Комментировать
  • Как убрать No input file specified?

    Причин появления ошибки No input file specified несколько:
    1. У вас не установлена переменная SCRIPT_FILENAME в конфиге nginx;
    2. Задан неправильный аргумент root в конфиге nginx;
    3. Переменная open_basedir в /etc/php5/fpm/php.ini или в конфиге php5-fpm пула содержит путь, который не соответствует аргументу root в конфиге nginx;
    4. Пользователь с правами которого работает php5-fpm или конкретный пул php5-fpm не имеет прав доступа к каталогу или файлу с php-скриптом;

    Пример правильного конфига nginx + php5-fpm:
    server {
    ....
    root /var/www/mysite.com;
    index index.php index.html index.htm;
    
    location / {
            try_files $uri $uri/ =404;
    }
    location ~ \.php$ {
            try_files $uri = 404;
            fastcgi_pass unix:/var/lib/php5-fpm/mysite.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include /etc/nginx/fastcgi_params;
    }
    ...
    }
    Ответ написан
    Комментировать
  • Пожалуйста оцените мое убогое ООП?

    Stasgar
    @Stasgar
    Обученная макака
    Во-первых: начните изучать архитектурную часть программирования, изучите паттерны проектирования, изучите SOLID, DRY, KISS и остальные модные словечки, постарайтесь всё это осознать, или, на крайняк - зазубрить. Всё придет с опытом, изначально все не понимали зачем всё так сложно, но эта сложность обусловлена неисчислимыми литрами слёз и потраченных нервов, всё не просто так.

    Судя по всему это тестовое или учебное задание. От вас требовалось отоверинжинирить простую задачу. Давайте попробуем:

    Суть задачи - есть файл с определенной структурой хранения данных, структура строковая. Требуется этот файл преобразовать в другую структуру данных и вывести эту структуру в json формате. Задача ясна.

    Разобъем задачу на отдельные независимые этапы:
    1) Преобразование одной структуры данных (текстового файла) в другую (объект, понятный PHP, к примеру)
    2) Преобразование этой структуры данных в Json формат.
    Первый вопрос, который может возникнуть - почему сразу не преобразовать в json? Ответ - при расширении системы в будущем - нам понадобится вывести данные в виде массива, или в виде XML, или даже в виде готового файла Excel. Нам будет сложно дополнять логику изначального класса, ничего при этом не сломав и не затронув уже существующий функционал. Также ответом на этот вопрос может являться каждая буква из SOLID принципов, подробнее отвечу дальше, когда буду пояснять за реализацию, см. ниже

    Теперь рассмотрим эту задачу с точки зрения ООП, начнем думать не от конкретной реализации, а от интерфейса и абстракции (мы не парсим конкретный файл, мы парсим просто файл, мы не переводим его в конкретное представление json, мы переводим его просто в представление):
    Нам понадобится 2 класса - непосредственно класс, читающий файл и преобразующий его в простейший тип данных (например PHP array). Второй класс - преобразователь простейшего типа данных парсера в какой-то определенный тип:
    1. LogFileReaded implements/extends FileReaderContract(интерфейс, возможно абстрактный класс, если понадобится предустановленная логика)

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

    2. JsonPresenter implements/extends DataTypePresenterContract

      Абстракция содержит контракт на метод output(), а в конструкторе принимются исходные данные. В конкретной реализации JsonPresenter в output() будет банальный json_encode() (да, это нормально, нет, класс не лишний и нет, json_encode() нельзя пихать в сам парсер) А теперь к вопросу - почему не следует просто запихать это всё в парсер и вместо массива отдать json: в будущем, когда система будет расширяться - нам понадобится представить данные в виде XML - что тогда будем делать - переписывать весь код парсера ради добавления switch case "json" и т.д.? А если что-то сломается во всей системе? А если вариантов представления станет настолько много, что файл будет просто не читаем? А при данном подходе достаточно будет просто написать новый класс XMLPresenter, или даже ExcelPresenter, который на выводе не строку будет выдавать, а целый файл (опустим типизацию output пока)). Также этот класс можно реализовать в виде декоратора (паттерн), да и много еще как.



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

    К примеру: в итоге, если вас уже повысили, и вы вместо парсинга стали заниматься более высшими материями - новому программисту, чтобы дописать логику преобразования данных в Excel не нужно знать как конкретно вы преобразовывали когда-то эти данные в json, ему не нужно дебажить ваш код, ему достаточно посмотреть на интерфейс - отнаследоваться от него и написать свой собственный метод преобразования и дальше использовать его в нужном месте.

    P.S. В данной реализации опускаются и упрощаются некоторые моменты для понятности
    Ответ написан
    21 комментарий
  • Как посчитать количество цифр после запятой?

    @daMage Автор вопроса
    В функцию передается число: 1.3500, 1.36, 1.2...
    Функция должна возвращать количество цифр после точки
    Ответ написан
    Комментировать
  • Реально в 36-40 лет стать тестировщиком или программистом если есть свободное время?

    Moskus
    @Moskus
    Реально, только есть тонкости.
    Во-первых, тестирование - как правило, самая "чёрная" и дешёвая работа в этой области.
    Во-вторых, программирование похоже на спорт: чем раньше начинаете, тем лучше результат. Это не значит, что у вас ничего не получится, просто многое может даваться с заметно большим трудом.
    В-третьих, стоит поинтересоваться, нет ли в уже знакомой вам области производства задач узкоспециализированного программирования. Как в машиностроении - программирование ЧПУ-станков или роботов, а также - автоматизация на PLC. Если вы научитесь чему-то такому, у вас будет преимущество опыта. А в каком-нибудь web вы будете ещё одним полным новичком из тысяч.
    Ответ написан
    2 комментария
  • Как поднять посещаемость сайта?

    RotgarSett
    @RotgarSett
    SEO Эксперт
    Первый шаг - выявление направленности проекта:
    • коммерческий
    • информационный
    • энциклопедический
    • социальная сеть и прочее

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

    Далее есть список факторов которые необходимо учитывать всем ресурсам, это технические, семантические и поведенческие факторы.

    Для начала необходимо подготовить фундамент - провести подробный анализ техническихфакторов помогут такие программы как Netpeak Spider или Screaming Frog (программ конечно многое множество, но эти используют чаще всего). Но, к сожалению, тулсами можно проверить не все и необходимо будет изучить матчасть и проверять многие технические аспекты руками.

    Затем переходим к семантике, это очень сложный вопрос который лучше будет описать в другом ответе, но, в двух словах, необходимо убедиться что у всех страниц сайта заполнены важные элементы семантики (title, h1 и прочее) и они соответствуют контенту страницы.

    После, к UX сайта, четко продумывая взаимодействие пользователя и максимальное для него удобство. Тут же сразу учтем и часть коммерческих факторов, и оформление контента и прочее что напрямую связано с поведением пользователя.

    В финале мы получим идеально внутренне оптимизированный ресурс и можно будет приступать к внешней оптимизации.

    Старайтесь делать все максимально полезным для пользователя. Органичность содержимого сайта, реальная польза входящей ссылки для пользователя на стороннем ресурсе и прочее белое SEO это то к чему надо стремиться!

    Яндекс подсказывает как развивать сайт белыми методами и чтобы он был полезен пользователю. Все материалы можно найти:
    В Блоге Вебмастеров
    На канале Академии Яндекса
    В Хелпе Яндекс Вебмастера
    Ответ написан
    1 комментарий
  • Есть ли такой сервис?

    Taraflex
    @Taraflex
    Ищу работу. Контакты в профиле.
    Ответ написан
    Комментировать
  • Правильно ли понимаю оптимизацию MySQL?

    Astrohas
    @Astrohas
    Python/Django Developer
    Если понял я тебя, то думаешь ты что количество полей таблицы будет на производительность влиять. Нет ибо это заблуждение. Лучше создать индексы тебе для этих двух полей. А таблица дополнительная с данными исчерпывающими - это зло против формы нормальной реляционной. Допустим нашел ты уже данные по таблице своей, а нужны стали потом тебе поля дополнительные, что будет тогда?
    Ответ написан
    1 комментарий
  • Как отправить смс в WhatsApp?

    @JunDevTest
    Контакты: thejundev@gmail.com | @juniordev
    К сожалению, WhatsApp ведёт очень жёсткую политику по отношению к разработчикам, у него отсутствует публичный API и возможность отправки сообщений на номера, которые не находятся в ваших контактах. Однако, в сети существуют сервисы, которые предоставляют такой API, однако он не официальный, его использование несет в себе риск бана вашего аккаунта без возможности восстановления. К тому-же такая услуга не бесплатна ( на одном из сервисов, стоит 900р/мес. за 1 аккаунт ) и как правило, с лимитом на количество отправленных сообщений.

    Существует так называемое WhatsApp Business API которое доступно лишь "средним и крупным компаниям", заявка отправляется через Facebook, где её проверяют и выносят свой вердикт, по поводу допуска. Простым смертным и ИП-шникам оно не доступно. https://www.whatsapp.com/business/api

    Как отметил пользователь storm57, на GitHub можно найти несколько открытых проектов, которые предоставляют API для WhatsApp в виде библиотек и компонентов для различных языков программирования.
    Однако, использование такого способа, может сильно повысить риск бана аккаунта, даже по сравнению с платными сервисами, которые работают через WhatsApp WEB.

    Относительно безопасный и практически бесплатный способ: https://github.com/sigalor/whatsapp-web-reveng
    Библиотека, работающая на собственном сервере, с возможностью получения API и отправки сообщений.
    Когда-то хотел с ней "поиграться", если захотите, могу установить и настроить её для вас на вашем или моём сервере, мои контакты сверху под ником.
    Ответ написан
    2 комментария
  • Плавный переход между страницами сайта. Как реализовать?

    webirus
    @webirus
    Тыжверстальщик! Наверстай мне упущенное...
    https://s-sd.ru/files/ppcontent/index.html
    https://s-sd.ru/blog_studio_design/plavnaya_smena_...
    Делайте что хотите в качестве эффектов %)
    По идее, это делается 10-15 строк jquery.
    А логика у этого плагина простая, как 5 копеек.
    1. Жмем на ссылку перейти по ссылке.
    2. Страница откладывает переход, запоминая ссылку.
    3. Сначала показывает эффект, потом скрывает всю страницу.
    4. Потом уже переходит на другую страницу.
    5. А на новой странице, просто идет плавная загрузка контента.
    Ответ написан
    3 комментария
  • Почему увеличивается потребления оперативной памяти на сервере?

    martin74ua
    @martin74ua
    Linux administrator
    команду free -m запустите.
    Часть памяти отдается под буфера и кеш, при необходимости эта память будет выдана по запросу приложения.

    Вообще нормальное явление, когда свободной памяти в районе 15-20% остается.... возможно даже меньше..
    А насчет перезагрузки...
    [root@storage ~]# uptime
    09:16:08 up 1257 days, 22:45, 1 user, load average: 7,07, 6,43, 5,72

    и зачем ее перегружать....
    Ответ написан
    3 комментария
  • Как правильно написать авторизацию/аутентификацию?

    deemytch
    @deemytch
    linux root, ruby/perl programmer, sql, backend.
    Если совсем коротко, то суть авторизации заключается в том, что пользователь взамен своего пароля и логина получает какую-то длинную малопредсказуемую строку, которую хранит все время сессии на своей стороне и предъявляет серверу на каждый чих. И кроме сервера эту строку никому-никому.

    А сервер хранит эту строку у себя, с привязкой к записи пользователя.

    Дополнительные детали - это хранение этой строки с ограничением по времени, с привязкой к IP адресу, версии браузера и другим деталям, с тем, чтобы можно было регулировать количество одновременных сессий, время сессии, и пытаться обнаружить воровство этой строки. Строка обычно называется хэш, хотя не факт. Строку можно не хранить, а сверять с другим хэшои, получаемым из первого. И так далее по мере роста фантазии и извращённости мыслей.
    Ответ написан
    Комментировать
  • В какой БД хранить логи посещений?

    Arris
    @Arris
    Сапиенсы учатся, играя.
    Первый вопрос: За какой период их надо хранить? Вечно? А смысл в этом есть?

    Второй вопрос: сколько УЖЕ записей посетителей и за какой период. "Рано или поздно" - это может быть и через неделю, и через год, и никогда.

    Если не ответить на эти вопросы заранее - может получиться так, что ты решаешь задачу, которую решать не нужно, потому что имеющихся средств (mysql или даже хранение логов в CSV) достаточно.
    Ответ написан
  • Блокировка DigitalOcean?

    @ynblpb_spb
    дятел php
    Тоже попал под блокировку в DO

    Выход простой
    Топаете в любого отечественного хостера, покупаете самую дешевую VDS с хорошим каналом и настраиваете reverse proxy на nginx приблизительно с таким конфигом:

    server {
            listen                  80;
            server_name             domain.ru;
            
            location / {
                    proxy_pass http://111.111.111.111:80;
                    proxy_connect_timeout                           60;
                    proxy_send_timeout                                      60;
                    proxy_read_timeout                                      60;
                    proxy_redirect                                          off;
                    proxy_buffer_size                                       4k;
                    proxy_buffers                                           4 32k;
                    proxy_busy_buffers_size                         64k;
                    proxy_temp_file_write_size                      10m;
                    proxy_set_header        Host                    $host;
                    proxy_set_header        X-Real-IP               $remote_addr;
                    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            }
    }

    где 111.111.111.111 это IP адрес вашего дроплета в DO

    и для https сайтов

    server {
            listen                  443;
            ssl                     on;
            server_name             domain.ru;
            ssl_certificate      /etc/nginx/ssl/domain.ru.crt;
            ssl_certificate_key  /etc/nginx/ssl/domain.ru.key;
            ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
            ssl_ciphers  "RC4:HIGH:!aNULL:!MD5:!kEDH";
    
            location / {
                    proxy_pass https://111.111.111:443;
                    proxy_connect_timeout                           60;
                    proxy_send_timeout                                      60;
                    proxy_read_timeout                                      60;
                    proxy_redirect                                          off;
                    proxy_buffer_size                                       4k;
                    proxy_buffers                                           4 32k;
                    proxy_busy_buffers_size                         64k;
                    proxy_temp_file_write_size                      10m;
                    proxy_set_header        Host                    $host;
                    proxy_set_header        X-Real-IP               $remote_addr;
                    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            }
    
    }


    такая вот у нас замечательная, страна, конечно...
    Ответ написан
    11 комментариев
  • Первая работа для верстальщика, как получить?

    vilka_2009
    @vilka_2009
    Верстаю
    Честно говоря, работа похожа на то, что ты скачал готовый шаблон и попытался его освоить и переверстать под адаптив. Видно, что какие-то вещи, типа слайдера, эффектов слишком хорошо сделаны, продуманы, а в исходники смотришь, а там то сасс файлы, то scss.. то скрипт называется common, то script.min.js, хотя это два одинаковых и не минифицированных скрипта. Видно, как хорошо сделана десктопная версия, и как плохо - мобильная. Взять то же меню в мобильной версии: появляется панель с кнопками, в которой не продолжена стиллистика сайта, нет эффектов наведения. Ошибки новичка. Но вот на десктопной версии у тебя очень удачно получилось продумать эффекты наведения.. Хмм, что мешало сделать так же в меню?! Падазрительнааа --
    Ну и самое важное: где история изменений в гите? Зачем выкладывать репозиторий, если в нем нет истории?
    Итог: работу найти не можешь, поэтому пишешь сюда, считая, что тостер - это неплохая площадка для само-рекламы. При этом нихера не сделано по существу, и не видно как ты работал. и ты ли вообще.
    В последнее время много таких людей стало, кто ищет работу на тостере под предлогом вопроса: что я делаю не так, как устроиться на работу, почему меня никто не берет, ну возьмите уже наконец меня, прям тут.. Тьфу. Вопросов таких целая куча и ответов к ним тоже. Но искать людям лень. Да и хватит себя жалеть. Нарабатывай портфолио в гите, с ИСТОРИЕЙ! Не пудри мозги людям.
    Но! Если это и впрямь твоя верстка, то можешь смело искать себе работу, хотя бы на поддержку готовых проектов. Я уже через 3 месяца после начала учебы нашла, на 23к не в Москве, а в райцентре таксказать. Главное терпение и усё будет.
    Ответ написан
    2 комментария
  • Стоит ли покупать коленный стул?

    Jump
    @Jump
    Системный администратор со стажем.
    Стоит ли покупать коленный стул?

    Для чего?
    Если в медицинских целях - такой вопрос нужно задавать лечащему врачу, а не посторонним людям.
    Если не в медицинских целях - попробуйте удобно ли вам на нем работать.
    Если удобно- можно и купить.
    Если неудобно - зачем он нужен?
    Ответ написан
    Комментировать