Задать вопрос
  • Фрилансеры, где хранить деньги?

    opium
    @opium
    Просто люблю качественно работать
    криптовалюты ваше все
    ну и думаю что вы не проводите по миллиону за каждую транзакцию и оборот у вас не пол миллиарда чтобы банк спрашивал источники ваших доходов
    не того боитесь
    Ответ написан
    8 комментариев
  • Стал работать по часам и обнаружил, что выходит 6 часов в день. Это нормально?

    Odisseya
    @Odisseya
    Оптимизирую PageSpeed & Performance
    У нас ПМ закладывает норму: 60% время продуктивной работы, от общего количества рабочих часов. Это коэффициент средней команды. 70% — делает более эффективная команда кот. получает за это бонус. Например, на миттинге задача оценивается в 15 человеко-часов, с учетом коэффициента команды 0,6 она трансформируется в 25 рабочих человеко-часов.

    Так, из 8ми рабочих часов выходит нижняя норма: 4,8 продуктивных часов.
    Получается, что ваши 6ч — это очень хороший результат.
    Ответ написан
    1 комментарий
  • Как быть с проблемой блокировки в Украине?

    saboteur_kiev
    @saboteur_kiev Куратор тега Веб-разработка
    software engineer
    Можете в hosts файле домены яндекса перенаправить на localhost.
    Ответ написан
    Комментировать
  • Как быстро верстать сайт по psd/png/jpg эскизам?

    Пытаюсь оптимизировать свою работу

    Любая оптимизация начинается с замеров... в данном случае, затраченного времени.

    Запускаете трекер и смотрите результат. Можете выложить тут, тогда народ будет знать что проседает и чем это ускорить.

    Хотя если самая времязатратная операция - поиск ответов в интернете и ожидание ответов на тостере, то тут поможет только очень большое количество сверстанных проектов ))
    Ответ написан
    Комментировать
  • Какую взять ORM для своего проекта?

    @D3lphi
    Возьмем ORM из двух популярных PHP-фреймворков. Первая будет Eloquent ("Родная" для фреймворка Laravel), а вторая - Doctrine (Одна из доступных ORM в фреймворке Symfony). Кардинальным отличием этих двух "систем" является то, что первая разработана на основе паттерна Active Record, а вторая - с использованием паттерна Data mapper. Чем же они отличаются? Приведу абстрактные примеры кода для первого и второго паттерна:

    Active Record:
    $user = new User(); // Создаем "сущность" нового пользователя.
    $user->login = 'D3lph1'; // Устанавливаем его логин равным 'D3lph1'.
    $user->password = '123456'; // Устанавливаем пароль этому пользователю.
    $user->save(); // Сохраняем пользователя.


    Все, новый пользователь создан и находится в базе данных. Теперь, Data mapper:
    $user = new User();
    $user->login = 'D3lph1'; // Устанавливаем его логин равным 'D3lph1'.
    $user->password = '123456'; // Устанавливаем пароль этому пользователю.
    
    $manager = ... // получаем объект менеджера (Например, из DI контейнера).
    $manager->persist($user); // "Скармливаем" новоиспеченного пользователя нашему менеджеру.
    // $manager->persis($user1); // Мы можем создать еще одного пользователя и уведомить менеджер об этом.
    // $manager->persis($user2); // И еще одного...
    $manager->flush(); // После выполнения этого метода данные отправятся в базу данных.


    Очевидно, первый способ куда проще. Но не все так просто. Дело в том, что паттерн Active Record нарушает принцип единственной ответственности (Single responsibility SOLID). И поэтому, в какой-то степени, может считаться антипаттерном. (Но это ни в коем случае не значит, что его не нужно использовать, для большинства проектов "хватит" за глаза). Наша сущность пользователя делает слишком много. Она не только представляет данные, но и еще работает с ними. В больших проектах это может усложнить поддержку кода. Data mapper, напротив же, разделяет представление данных в сущность (user) и работу с данными (manager, в данном примере. Также, за работу с данными отвечает репозиторий. Вы столкнетесь с ним, как только вам потребуется получить данные из БД (Doctrine)). В небольших проектах вы не заметите особой разницы. Разве что во втором случае увеличится количество классов. Так, в Eloquent вы создаете 1 модель, а в Doctrine - сущность и репозиторий.

    Все современные ORM включают в себя также, так называемые, query builder'ы. Они помогают отказаться от языка запросов, такого как SQL. Вы будете составлять запросы таким образом:
    $result = $qb
          ->select(['id', 'login'])
          ->where('id', '<>', 3)
          ->get();


    Собственно, query builder'ы помогают абстрагироваться от конкретной СУБД. То бишь, вы написали запрос 1 раз, а затем от того, какую СУБД вы используете будет зависеть выходной sql код. Генерация этого кода будет произведена абсолютно прозрачно для вас.

    Обе ORM имеют работать с отношениями. Вам нужно будет указать, как таблицы относятся друг к другу, а затем вы сможете удобно обращаться к связанным сущностям.

    Теперь конкретно. Так как вы только начинаете осваивать ORM, я бы порекомендовал начать с Eloquent. Она гораздо проще, чем Doctrine, да и более производительная, к тому же. Как освоите Eloquent, смело учитесь работать с Doctrine. Она обязательно должна быть "в копилке" ваших скиллов, так как является самой мощной в "мире" PHP.

    Успехов!
    Ответ написан
    2 комментария
  • Apache, www-data, права на файлы и директории?

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

    Но лично я на своих серверах предпочитаю связку nginx+php-fpm+chroot. Для каждого сайта рабочие процессы запускаются с правами владельца сайта, допустим u1:u1. На корневой директории сайта стоит 0710 и u1:nginx, на папке log 0770/u1:nginx. На всех остальных файлах стоят права 0640/u1:u1, на папках 0711/u1:u1. Если файл публичный, то он должен относиться к группе nginx. Ни какой php одного сайта ни чего не может прочесть в файлах другого.
    Ответ написан
    3 комментария
  • Интенсив html academy?

    На интенсиве мы пошагово собираем полноценный проект с нуля. Процесс работы похож на реальный процесс работы верстальщика. То есть, если у вас хватает базовых знаний, но как сверстать страницу с нуля по макету в фотошопе вы ещё не понимаете, то интенсив будет полезен.

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

    opium
    @opium
    Просто люблю качественно работать
    если делать сайты по миллиону то примерно штук 5-10 в год выходит
    итого 5-10 миллионов
    Ответ написан
    Комментировать
  • Как запустить несколько openvpn на одном компьютере?

    @pcdesign
    openvpn всё равно же только через root работает

    Достаточно в конфиге добавить:
    user nobody
    group nobody


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

    opium
    @opium
    Просто люблю качественно работать
    по заказчикам все по папкам раскидываете
    закончили работу переместили в архив с годом
    итого в активной папке ну пяток активных заказчиков.
    Ответ написан
    Комментировать
  • Скрипт, выполняемый на JavaScript за секунду, на PHP за 30 секунд проходит только 20%. В чём причина?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    Короче говоря херню ты написал, друже. вот оптимизированный код, отрабатывает за пару секунд.

    <?php
      for($a=9; $a>=1; $a--) {
        $a10 = 10*$a;
    
        for($b=9; $b>=1; $b--) {
          if ($a===$b) continue;
          $b100 = 100*$b;
    
          for($c=9; $c>=1; $c--) {
            if ($a===$c || $b===$c) continue;
    
            for($d=9; $d>=1; $d--) {
              if ($a===$d || $b===$d || $c===$d) continue;
              $d100 = 100*$d;
              $v2 = 1000*$d+$d100+$a10+$b;
    
              for($e=9; $e>=1; $e--) {
                if ($a===$e || $b===$e || $c===$e || $d===$e) continue;
    
                for($f=9; $f>=1; $f--) {
                  if (
                    $a===$f || $b===$f || $c===$f ||
                    $d===$f || $e===$f
                  ) continue;
                  $fc=$f*$c;
    
                  for($g=9; $g>=1; $g--) {
                    if (
                      $a===$g || $b===$g || $c===$g ||
                      $d===$g || $e===$g || $f===$g
                    ) continue;
                    $g10 = 10 * $g;
                    $g10a = $g10+$a;
    
                    for($h=9; $h>=1; $h--) {
                      if (
                        $a===$h || $b===$h || $c===$h ||
                        $d===$h || $e===$h || $f===$h || $g===$h
                      ) continue;
                      $v3 = $b100+10*$h+$f;
    
                      for($j=9; $j>=1; $j--) {
                        if (
                          $a===$j || $b===$j || $c===$j || $d===$j ||
                          $e===$j || $f===$j || $g===$j || $h===$j
                        ) continue;
    
                        if(
                          $d100+$g10+$j + 100*$j+$a10+$e + $v3 === $v2
                          && $fc/$j === $g10a
                        ) {
                          echo  "\n a=",$a,
                                " b=",$b,
                                " c=",$c,
                                " d=",$d,
                                " e=",$e,
                                " f=",$f,
                                " g=",$g,
                                " h=",$h,
                                " j=",$j,"\n\n";
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }


    Если вдруг не понял что к чему, объясняю, у тебя вложено друг в друга 9 циклов от 1 до 10, таким образом получается 10^9 итераций, т.е. миллиард. И ты все условия и вычисления упихал в самый внутренний цикл, и производишь их миллиард раз, причем в 95% ситуаций вообще в холостую. Я вынес все проверки и вычисления максимально наружу, насколько это позволяет логика, таким образом 95% итераций, холостых вычислений и пр. мусора просто не выполняется в принципе. Поэтому код теперь отрабатывает быстро, как и должен.
    Ответ написан
    7 комментариев