• Есть аналоги checkio или codewars для PHP?

    @Def123 Автор вопроса
    Отвечу сам на свой же вопрос: аналогов пока что нет, но на том же codewars.com PHP заявлен в разделе coming soon, также, там есть голосовалка (в меню, где надо выбрать язык для вступительного теста). По этой голосовалке выходит, что php стоит в очереди на реализацию на 3 месте. Так что кому не лень, зайдите и проголосуйте за PHP, до C там рукой подать, может реально побыстрее зарелизят))

    Ну а по поводу сайтов с задачами и решениями, то что нагуглилось:
    www.w3resource.com/php-exercises
    phpexercises.com
    Ответ написан
    Комментировать
  • Как доработать маленький код на JS?

    IonDen
    @IonDen
    JavaScript developer. IonDen.com
    1. Ссылки не нужны, используйте спаны в пагинации
    <form method="get" id="testForm">
      <input type="text" name="name" class="page" />
      <input type="submit" name="search" id="search" value="Поиск"/>
      <input type="hidden" name="current_page" id="current_page" value="{current_page}">
    </form>
    
    <span id="pagination">
      <span class="toPage" data-num="1">1</span>
      <span class="toPage" data-num="2">2</span>
      <span class="toPage" data-num="3">3</span>
      <span class="toPage" data-num="4">4</span>
      <span class="toPage" data-num="5">5</span>
      <span class="toPage" data-num="6">6</span>
      <span class="toPage" data-num="7">7</span>
    </span>


    2. Такой JS:
    $(document).on("click", ".toPage", function () {
        var num = $(this).data("num");
        $(".page").prop("value", num);
        $("#testForm").trigger("submit");
    });
    Ответ написан
    6 комментариев
  • Периодически не подгружаются картинки на сайте, почему?

    @xtreme
    Снимаю порчу по SSH :)
    Pending - это ожидание. Если у курильщика Chrome - тогда он ограничен 6 одновременными соединениями к одному ресурсу. Ты установил коннект, получил страницу и браузер начинает подгружать статику. И судя по браузеру "некурильщика" - у тебя там мелкие картинки, и на каждый файл надо установить соединение. С ограничением в 6 соединений, если у тебя сверху заливается нечто тормозящее - остальные будут курить до освобождения очереди.

    Включаю телепатический шлем...

    Как один из вариантов - объединить мелкие картинки в спрайты и грузить их одним коннектом, отображая с помощью CSS нужные участки в нужных местах. (Google PageSpeed тебе то же самое подскажет)
    Второй, как полумера - использовать кеш браузеров клиента, чтобы не грузить картинки каждый раз с сервера. Но в первый раз все равно придется загрузить их со страницы в любом случае.
    Далее, судя по всему у тебя либо подрезана скорость на доступ к веб-серверу, либо сервер откровенно тормозит. Картинку размером в 80КБ грузить секунду - это долго.
    Рискну предположить, что у тебя в качестве веб-сервера стоит апач. В таком случае рекомендую увести его например на 127.0.0.1:80, а перед ним на этом же сервере на внешний интерфейс воткнуть nginx с простым конфигом:
    (Естественно, путь до проекта и внешний IP-адрес подставить свои)
    server {
      listen 192.168.0.1:80;
      server_name my-super-puper-project;
      
      location ~ ^.+\.(jpg|png) {
        root /home/www/your-project-name;
        expires 1d;
      }
      location / {
        proxy_pass http://127.0.0.1:80;
      }
    }


    В этом случае картинки (jpg|png) будет отдавать легковесный nginx без участия apache, что значительно разгрузит твой сервер, а на apache будет уходить все остальное (в т.ч. и ЧПУ-ссылки). Если у тебя css и js также отдаются прямо с диска, а не генерятся на каждый запрос динамически, как сумасшедшие - можно их включить в конфиг к картинкам.
    Если с сетью порядок - браузер станет получать статические файлы гораздо быстрее, а значит время Pending тоже уменьшится, что благоприятно скажется на быстродействии.
    Ответ написан
    2 комментария
  • Как дебажить в yii2 (конкретно rbac)?

    kompi
    @kompi
    nullstack devoops
    Универсальный вариант - xdebug и ставить нужные watcher'ы.
    Ответ написан
    Комментировать
  • Как командно разрабатывать php проект?

    copist
    @copist
    Empower people to give
    Инфраструктура
    * Создайте репозиторий на Bitbucket или GitHub.
    * Создайте себе локально копию репозитория и локально поднимите базу данных с одинаковой структурой
    * Если в базе требуются изменения, создавайте "миграции", которые обновят структуру данных или сами данные.
    * Свои изменения по коду, так же как и миграции, отправляйте в репозиторий

    Ещё есть возможность создания виртуальных серверов для разработки или использование online IDE. Решает кучу проблем, если интернет быстрый.
    * https://compilr.com/ Полноценная среда разработки
    * https://koding.com/ Среда разработки с предустановленным веб-сервером и элементами социальной сети
    * online-php.com Online IDE
    * https://codeanywhere.com/ Среда разработки. Код можно хранить в облаке, а также в Dropbox, Google Drive, FTP, github.
    Другие тулзы для совместной работы в online

    Промежуточные версии
    Если вы географически недалеко друг от друга, то просто периодически показывайте, что у вас получается.
    Если нет, пользуйтесь Skype Shared Screen, Join.me и другие аналогичные продукты, чтобы вместе смотреть и обсуждать голосом. А лучше TeamViewer, чтобы можно было вместе и посмотреть, и поправить.

    Обновление сервера
    Изменения на сервер устанавливайте из того-же репозитория. Не забудьте про миграции. Озаботьтесь вопросами безопасности. Хотя бы так: скрыть файлы .git
    Ответ написан
    Комментировать
  • Кто-нибудь использует много веб-фреймворков в новой разработке?

    copist
    @copist
    Empower people to give
    Во-первых, это вопрос личных предпочтений и предпочтений команды.
    Во-вторых, это требования обстоятельств при промышленной эксплуатации.

    На старте, обычно, выбирается то, что лучше знаешь. Да хоть бы и без фреймворков. Переключаться на старте - это тратить время впустую. Главная задача - получить MVP.

    После получения MVP (Minimum Viable Product) и "зелёного света" на промышленную разработку, можно оценить результаты тестирования на потенциальных потребителях, выяснить предполагаемую нагрузку и, при необходимости, пересмотреть платформу. Сменить программную или аппаратную архитектуру, язык программирования или их комбинацию, фреймворк - стек технологий это называется.

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

    Есть проекты, которые жёстко костылят и они таким образом живут годы. Вплоть до того, что там PHP4 и отображение прямо в файлах с бизнес-логикой, зато страницы выдаются за миллисекунды.
    Есть проекты, которые уже несколько раз переписывали с нуля, потому что охренеть какая сложная штука получается и без достаточно высокого уровня абстракции его очень сложно наращивать.
    Есть те, где не костылили и не меняли платформу, а просто увеличили производительность сервера до небес.
    Ответ написан
    Комментировать
  • Почему возникает Bad Request (#400) на форме в yii 2.0?

    @mrlipuzhin
    <input type="hidden" name="_csrf" value="<?=Yii::$app->request->getCsrfToken()?>" />
    Ответ написан
    1 комментарий
  • Как совместить EasyPHP и Laravel?

    Sanasol
    @Sanasol Куратор тега Laravel
    нельзя просто так взять и загуглить ошибку
    Если это ваш рабочий компутер (не сервер), то 80 порт занят скайпом 99%

    А в качестве сервера все советуют OpenServer.

    Я в свое время пользовался Vertrigo, и до сих пор бы пользовался :)
    Ответ написан
    2 комментария
  • Какой набор инструментов выбрать для реализации веб-проекта?

    evnuh
    @evnuh
    Поиск Гугл помог мне, впусти и ты его в свой дом
    PHP + любая БД + фреймворк - самое быстрое начало. Фреймворк возьмите самый примитивный, который реализует MVC, роутит маршруты и немножко шаблонизирует. Есть микро-форки популярных фреймворков типа Silex (Symfony) silex.sensiolabs.org и Lumen (Laravel) lumen.laravel.com
    P.S. Wordpress ни в коем случае не берите, это готовая cms, а чтобы её допиливать нужно 1) жопу вместо головы 2) не для новичка совсем.
    Ответ написан
    7 комментариев
  • Какова роль интерфейсов в ООП?

    Приведу пример на коленке. Хотим, например, написать абстрактную файловую систему. Для начала, определим интерфейс, для ФС:

    interface FileSystemInterface {
      public function write($file, $data);
      public function read($file);
    }


    Затем, хочу реализацию интерфейса ФС для работы с файликами:

    class OSFileSystem implements FileSystemInterface {
      public function write($file, $data) {
         // открываем файлик, пишем данные
      }
    
      public function read($file) {
        // открываем файлик, возвращаем данные
      }
    }


    Вдруг, кому-то захотелось файловую систему в облаке. Окей, не проблема, реализуем это:
    class CloudFileSystem implements FileSystemInterface {
      public function write($file, $data) {
         // открываем соединение с облаком, пишем данные
      }
    
      public function read($file) {
        // открываем соединение с облаком, возвращаем данные
      }
    }

    Пусть у нас есть кой-то код, работающий с файловой системой, назовем его "Хранилище файлов". Пусть он выглядит примерно так:

    class FileStorage {
      protected $Fs;
      
      public function __construct(FileSystemInterface $Fs) {
        $this->Fs = $Fs;
      }  
    
      public function saveFile() {
        $this->Fs->write('file.txt', 'file data');
      }
    
      public function getFile() {
        return $this->Fs->read('file.txt', 'file data');
      }
    }


    Отлично! Теперь мы можем хранилищу файлов отдать любой объект с реализованным интерфейсом FileSystemInterface. Пример:

    // Хранилище файлов работает с файловой системой ОС:
    $FS = new OSFileSystem();
    $FileStorage = new FileStorage($Fs);
    $FileStorage->getFile();
    
    // Хранилище файлов работает с файловой системой в облаке:
    $FS = new CloudFileSystem();
    $FileStorage = new FileStorage($Fs);
    $FileStorage->getFile();


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

    Ashlst
    @Ashlst
    Фанат эстетики и красивых решений.
    3 комментария
  • Как организовать загрузку файлов в форме?

    vakorovin
    @vakorovin
    Разработчик
    Здравствуйте! Не раскрыли вы полностью ваш вопрос, но постараюсь ответить, исходя из наших проектов на yii2.
    Если используется механизм, при котором файлы можно прикреплять на этапе создания некой модели (скажем Portfolio), и загружаются они сервер посредством ajax-запроса (к примеру https://github.com/hayageek/jquery-upload-file), то возникает ситуация, что привязываться то еще не к чему (объект класса Portfolio еще не сохранен), а файлы уже на сервере. На этот случай используем поле hash, значение которого уникально, и именно по нему привязываются файлы. Т.е. при создании нового объекта Portfolio сразу генерируем уникальный hash, передаем его в форму создания, и с ним грузим аяксом файлы. При желании можно повесить cron-задачу для удаления из файловой системы файлов, которые привязаны к несуществующему Portfolio.hash.

    Далее, сама модель. Берем официальную документацию:

    https://github.com/yiisoft/yii2/blob/master/docs/g...

    Расширяем как нам угодно, например так:

    class File extends \yii\db\ActiveRecord
    {
        public $file;
    
        public function rules()
        {
            return [
                [['file'], 'file'],
                [['filename', 'parent_id'], 'required'],
                [['parent_id'], 'integer'],
                [['filename', 'path'], 'string', 'max' => 255],
                [['description'], 'string']
            ];
        }


    Далее, в контроллере как себя вести, описано как раз по ссылке выше, но в нашем случае суть такова - для каждой новой модели (об этом чуть позже) получаем сам файл:

    $model = new File();
            $model->file = UploadedFile::getInstance($model, 'file');


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

    if ($model->file && $model->validate()) {                
                $model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension);
            }


    Одно уточнение. Если загружать файлы по одному, и только в форме показывать несколько полей, то это решается средствами js, повесить кнопку для создания очередных fileInput с именем File[][file] и textInput File[][description] - проблем не составит. А вот если требуется закинуть их сразу пачкой, то выходов 2 - либо как в указанном по ссылке примере - в одной модели разрешить мультизагрузку, и уже из нее (после валидации) создавать нужные вам модели, либо (что мне кажется логичнее) играться с методом formName(), который будет возвращать нужное имя аттрибута из формы.

    Т.е. в базовом случае поля формы имею имена File[file], File[description], File[id]. В нашем же случае получаются такие имена:

    File[0][file], File[0][description], File[0][id];
    File[1][file], File[1][description], File[1][id];
    File[2][file], File[2][description], File[2][id];


    Теперь в контроллере в цикле проходим

    foreach (Yii::$app->request->post('File') as $sn => $file){
            $model = new File;
            $model->fakeFormName = "File[{$sn}]";
            $model->file = UploadedFile::getInstance($model, 'file');
        }


    В примере выше мы заранее создали свойство $fakeFormName, в которое поместим требуемое для каждого случая базовое имя полей формы и вернем его значение в методе formName(), в таком случае UploadedFile::getInstance($model, 'file') сработает как надо.

    Уф, не знаю, насколько доходчиво разъяснил, что-то может потерял в потоке сознания, но думаю основную суть и опорные точки разъяснил. Если что-то непонятно, отпишитесь, я распишу подробнее (проектов на Yii2 много, все включают работу с файлами в той или иной степени, есть разные реализации, в том числе прямо сейчас пишем файловый менеджер для нашей админки на yii2).
    Ответ написан
    Комментировать
  • Дефицит специалистов - так всё-таки это правда или миф?

    Jeiwan
    @Jeiwan
    А вы посмотрите на те вопросы, которые тут люди задают, посмотрите, какие проблемы люди пытаются решить. 30% вопросов об одном и том же: как начать что-то делать. На другие 60% вопросов ответ можно найти самостоятельно. 10% вопросов действительно чего-то стоят. А ведь все эти вопросы как раз и задают такие вот "специалисты".
    Люди не хотят самостоятельно думать, самостоятельно решать задачи. Даже не то чтобы решать, а просто найти ответ в интернете, так как 99% проблем уже решено кем-то другим. Люди не хотят просто хоть немного напрячься. Чтобы где-то работать программистом, не нужно много ума: достаточно уметь искать информацию в интернете. Но и на это не все способны. Люди не умеют работать. Поэтому на фриланс-биржах так много откликов, поэтому заказчики постоянно обжигаются на таких откликах и поэтому изо всех сил держатся за одного хорошо разработчика.
    Любого человека, который что-то делает, который самостоятельно решает задачи, в любой компании с руками оторвут и деньгами завалят. Людей много, а способных работать — единицы.
    Ответ написан
    4 комментария
  • Как обучиться созданию правильной архитектуры сайта?

    AlexXYZ
    @AlexXYZ
    O Keep Clear O
    Знаете, наверное нельзя этому обучиться по книге. На самом деле есть особый вид знания, о котором в книге не напишут и о нем никто не говорит, потому что "это" у каждого свое - это знание о том, как не надо делать. Тайна этого сакрального знания скрывается в бездне подсознания из опыта неудавшихся и загубленных проектов или самонадеянных обещаний, о которых иногда даже стыдно вспомнить. О своих неудачах никто не напишет книгу, к сожалению, хотя почитать на эту тему есть чего:
    citforum.ru/database/articles/proekt_bd_part1.shtml

    Вообще, чтобы написать хорошую программу надо заниматься интеграцией, а вы пишете, что для вас это сложно и вы ленитесь. Но именно этим вам и надо заниматься.
    "-Братан, я не ел три дня! - как не ел? Надо заставлять себя!"
    Читайте по фреймворку в день (иногда и одного примера достаточно, чтобы понять, что фреймворк не нужен), смотрите примеры его использования, сохраните эту привычку в течении года и все будет ок. )
    Ответ написан
    Комментировать
  • Где вы храните пароли?

    edinorog
    @edinorog
    Троллей не кормить!
    https://ru.wikipedia.org/wiki/KeePass но онли форточки. Автоматический ввод только с Ослика и только то что не страшно профукать.
    Ответ написан
    5 комментариев
  • Как переквалифицироваться из эникейщика в программиста?

    zolt85
    @zolt85
    Программист
    Всем привет, это снова я.
    Молодой человек! Вам 23! ВСЕГО! А Вы уже как я, по-старчески, ворчите. Я таких как Вы, вижу ежедневно. Сейчас поясню. В моем городе туго с программистами, хотя город молодежный, продвинутый (в Томске я живу). Мы постоянно ищем людей, сейчас в сторону удаленных разработчиков уже смотрим, потому что на собеседования приходят такие как Вы. Не в плане опыта, а в плане запросов. 23 года, опыта никакого нет, но нужно мне минимум 40 тыр. Родной! За что? Пойми, чтобы понять какой-ты как разработчик, с тобой нужно поработать пару месяцев, а в среднем первый "выхлоп" от тебя будет только через полгода. Поэтому такой мой Вам совет, если хотите развиться как разработчик, стисните зубы, объясните все жене, и идите джуниором. Лучше в Java или C#. Набирайтесь опыта. В нашей сфере работодатели в основном адекватные и видят, когда от Вас уже есть толк. И не стесняются повышать ЗП.

    Удачи Вам!
    Ответ написан
    13 комментариев
  • Объясните пожалуйста код на js?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Самовызываемая анонимная функция
    (function(){
    })();

    Такая функция будет тут же выполнена. jQuery - это параметр, который передается в функцию. $ - переменная, по которой будет доступен переданный параметр внутри функции.
    Эта конструкция эквивалентна следующей
    var myFunc = function($){
    };
    myFunc(jQuery);

    За исключением того, что не создается лишняя переменная в глобальной области видимости (myFunc), ради чего все и делается.
    Ответ написан
    1 комментарий