• Переход из 1С в web-разработчики (PHP ) в 35 лет. С чего начать и реально ли?

    AlexeyGfi
    @AlexeyGfi
    YouTube >>> Битриксоид из Колхоза
    Больше 10 лет работаю под Битриксом. Мне очень нравится то, что в этой работе нужен целый стек знаний. Начиная от настройки апача и нжинкса (у меня свой сервер на Хетцнере) и до вёрстки. Прям прёт от кайфа.

    Этот год начал вникать в новое ядро (а там уже ORM), начал восполнять недостаток знаний. Ниточка за ниточкой... — просмотрев видео-курс по Ларавел понял, что моё мировоззрение дало трещину. Насколько там всё строго и по полочкам, в противовес анархии внутри Битрикса. Но у битрикса шикарное лицо. CMS прокачана так, что удобно как заказчику, так и обслуживающей команде. Вряд ли какая CMS сможет угнаться. Но внутренности... Мама дорогая. Хочется скрестить Ларавел и Битрикс (CMS).

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

    Ища выход стремлению "хочу большего" завёл профиль на апворке и логично задумался: а что я могу предложить? То есть сначала была шальная мысль выходить на full-stack заказы c Битриксом, но, блин, после Ларавелл я уже не уверен. Если переходить (менять тех заказчиков, которые уже есть), то на солидный уровень (по задачам, в первую очередь). А для этого нужно понимание: к чему душа лежит (выбор технологии) и что востребовано (однозначно могу сказать, что буду копать Ларавел — уже и мини-проекты придумал; из фронт-энда буду пробовать пилить Вью, но пока что нет жёсткой мотивации: чистый css/js никто не отменял). А значит метод проб и ошибок. Пока не определился — держать ушки на макушке и анализировать входящий поток, не особо отвлекаясь от текущих дел, потому что так можно и загнуться (а на плечах семья, дети).

    Пытаясь понять, «как оно», — запустил и небольшой оффлайн бизнес с продажей через Интернет. Есть опыт запуска своих проектов и этот путь мне кажется наиболее перспективным для удовлетворения жизнью: сразу делаешь то, что легко согласовывать (с самим собой =), за ошибки платишь сам, можно делать неспеша (некоторые решения должны вызреть внутри), а можно упасть и прям не вставать пока не закончил — делаешь-то для себя, а это совсем другой настрой.

    Но чем хорошо (полезно) по-фрилансивать: остаёшься в курсе новинок, не оседаешь в своей тине и не разучиваешься шевелиться. По сабджу — держать нос по ветру, пробовать разные задачки, пока не придёт чёткое понимание.
    Ответ написан
    Комментировать
  • Минимальные настройки безопасности Linux на VPS?

    Tyranron
    @Tyranron
    Ряд моментов Вы уже сделали, но я все равно их опишу для полноты списка.

    1. Создать отдельного пользователя и хороший пароль на sudo. Не использовать больше root напрямую. Совсем.

    2. SSH. Отключаем метод аутентификации по паролю. Если Вам не нужны другие методы, то их тоже можно отключить, оставив только publickey. Отключаем возможность аутентификации root'ом. Включаем использование только 2й версии SSH протокола.

    3. Устанавливаем Fail2Ban и настраиваем чтобы после нескольких неуспешных попыток подключения по SSH банило по IP на длительное время. Кол-во попыток и время бана можно тюнить в меру своей паранойи. У меня, например, банит на час после 2х неуспешных попыток.

    4. Iptables. Действуем по принципу "запрещено все, что не разрешено". Запрещаем по умолчанию весь INPUT и FORWARD трафик снаружи. Открываем на INPUT'е 22 порт. В дальнейшем открываем порты/forwarding по мере необходимости. Если у нас предполагаются сервисы на соседних серверах нужные только для внутренней коммуникации (Memcached, Redis, и т.д.), то открываем для них порты только для определенных IP. Просто так торчать наружу для всех они не должны.

    5. Настраиваем автоматические обновления apt-пакетов. Уровень security. То есть так, чтобы обновления безопасности накатывались автоматически, но при этом не выполнялись обновления со сменой мажорной версии (дабы обезопасить себя от "само сломалось").

    6. Устанавливаем ntpd. Серверное время должно быть точным. Также временную зону сервера лучше всего установить в UTC.

    7. TLS (не SSL) используем везде где можем. Через Let's Encrypt получаем бесплатные валидные сертификаты. В конфигах веб-серверов, mail-серверов, и других приложений торчащих наружу (в том числе и OpenVPN), запрещаем/убираем использование слабых шифров. Все ключи/параметры генерируем не менее 2048 бит. Самоподписные сертификаты подписываем с помощью SHA-256 (не SHA-1). Diffie-Hellman параметры (dh.pem) под каждый сервис лучше сгенерить отдельно. Проверяем TLS сервисов через Nmap. Минимальный grade должен быть A, не должно быть warning'ов.

    8. Правильный менеджмент пользователей/групп. Приложения/сервисы не должны запускаться под root'ом (разве что они действительно этого требуют и иначе никак). Для каждого сервиса создается свой пользователь.

    9. Если предполагается upload файлов через PHP (либо другие скриптовые языки), в директории, куда эти файлы загружаются (и которая доступна снаружи), должно быть жестко отключено любое выполнение скриптов/бинарников, что на уровне ОС (x права), что на уровне веб-сервера.

    Это была база.
    Дальше, в меру своей паранойи можно за'harden'ить сервер ещё следующими моментами:
    - SELinux, chroot
    - доступ к SSH только с определенных IP (нужно иметь 3-4 VPN-сервера под рукой)

    UPD И да, все это помнить/настраивать руками каждый раз может быть запарно. Используйте Ansible и автоматизируйте процесс (там родные и YAML, Jinja2 и Python).
    Ответ написан
    10 комментариев
  • Как без костылей сделать так, чтобы footer сайта всегда был внизу?

    @dmz9
    не бойся добавить обертку к разметке, от этого никто еще не умер.
    есть всего 2 случая:
    1. высота футера заранее известна и жестко можно её указать. в этом случае обычно использую вот такое
    <html>
    <head>
    <style type="text/css">
    * {
        /* обычно все нормальные адекватные верстальщики юзают css-reset поэтому 
        тут просто масло-масляное. такие правила в нем всегда есть, но они необходимы на самом деле.*/
        padding: 0;
        margin: 0;
        box-sizing: border-box;
    }
    
    body,
    html {
    	background-color: orange;
        height: 100%;
        /* растягиваем корневой элемент и боди на всю высоту окна браузера. 
        да, даже если контента 10 страниц - эти элементы будут именно по размеру окна */
    }
    
    .wrapper {
        min-height: 100%;
        /* обертка должна быть не-меньше чем всё окно целиком. это растягивает враппер 
    на всю высоту окна браузера (как минимум). если контента больше чем одна страница - 
    правило будет просто опускаться, и враппер будет заниматься столько, сколько нужно  */
        padding-bottom: 80px;
        /* вообще, указывать надо чуть больше, либо добавлять main отдельный нижний маржин. 
    если этого не делать футер будет очень близко к main поэтому нужен отступ. 
    обычно 15-16 пикселей (спейсер) */
    }
    
    footer {
    	background-color: green;
        height: 80px;
        /* мы знаем высоту футера и указываем ее */
        margin-top: -80px;
        /* основная суть всего способа - отрицательный верхний маржин затягивает футер наверх на всю 
    собственную высоту футера. соль в том что враппер, идущей по потоку документа перед футером уже занял 
    всю высоту окна. и если мы этого не сделаем то футер всегда будет ниже нижней границы окна 
    даже когда контента не будет, плюс, появится полоса прокрутки. отрицательный маржин 
    нивелирует этот эффект и футер оказывается "прибит" к полу */
    }
    </style>
    </head>
    <body>
        <div class="wrapper">
            <header></header>
            <main>я майн</main>
        </div>
        <footer>пыщщ пыщщ</footer>
    </body>
    </html>

    если используется less/sass то еще проще - заводим переменную (типа $footer_height) и юзаем ее и в паддинге (padding-bottom:$footer_height+15px) и в стилях футера (height:$footer_height; margin-top:-1*$footer_height;). замена высоты футера будет в одном месте (dry!)
    2. второй вариант - высота может меняться - в основном у адаптивных сайтов.
    расскажу как обойтись без флексбокс но нужно немного JS.
    за высотой футера следит скрипт, и при каждом ресайзе страницы обновляет высОты и маржины/паддинги. использовать jquery проще всего, плюс, он почти всегда есть почти везде.
    выглядит примерно так.
    <html>
    <head>
        <style type="text/css">
        * {
            padding: 0;
            margin: 0;
            box-sizing: border-box;
        }
        
        body,
        html {
            background-color: orange;
            height: 100%;
        }
        
        .wrapper {
            min-height: 100%;
            /* теперь паддинг не нужен */
            /* погорячился - все таки нужен )) */
           padding-bottom:80px;
        }
        
        footer {
            background-color: green;
            min-height: 80px;
            /* чтобы футер не схлапывался в нулевую высоту когда в нем пусто */
            height: 80px;
            margin-top: -80px;
            /* можно не убирать, чтобы оставить совместимость с чем то без JS */
        }
        </style>
    </head>
    <body>
        <div class="wrapper">
            <header></header>
            <main>я майн</main>
        </div>
        <footer>а я футер! ололо</footer>
        <script src="http://code.jquery.com/jquery-2.2.4.min.js" type="text/javascript"></script>
        <script type="text/javascript">
        $(document).ready(function() {
            // сначала подождем загрузки
            // объявим переменные, чтобы заново не выбирать каждый раз те же ноды
            var footerHeight, $footer = $('footer'),
                $main = $('main');
            $(window).resize(function() {
                // вешаем обработчик на изменение размеров страницы - т.е. если меняется ширина страницы, 
                // или высота, даже если в футер кто то потом аяксом что то подгрузит - 
                // сработает ресайз и все сам поменяет
                footerHeight = $footer.height('auto').height();
                // важный момент - чтобы "снять" правильную высоту элемента - надо чтобы поток документа сам 
                // назначил верную высоту футеру. а для этого сделаем её "auto". даже если забыли/не захотели убрать 
                // из стилей жестко прописаную высоту - инлайн стиль перебивает весом, и поэтому высота 
                // будет такая "как надо". потом снимаем мерку, и юзаем её
                $main.css({
                    'paddingBottom': (footerHeight + 15)
                });
                // не забываем кемел-кейс для значений-через-дефис
                $footer.css({
                    'height': footerHeight,
                    'marginTop': (footerHeight * -1)
                })
            }).trigger('resize'); // после навешивания обработчиков насильно запускаем первый ресайз
        })
        </script>
    </body>
    </html>

    ------------------------------
    варианты с позиционированием крайне не люблю - дело не в том что я не умею с ним обращаться. я то как раз таки умею, а вот многие другие делают из этого лютые костыли, которые потом заколебешься переделывать. так что лучше не используйте позиционирование там, где оно не нужно (в прибитии футера к полу например).
    то что бутстрап использует позиционирование в своём прибитом футере не значит что это супер-правильно или это best-practices. просто они решили сделать так а не как то иначе.
    Ответ написан
    1 комментарий
  • Как без костылей сделать так, чтобы footer сайта всегда был внизу?

    @Gudzera
    Рекомендую использовать bootstrap.
    html {
      position: relative;
      min-height: 100%;
    }
    body {
      /* Margin bottom by footer height */
      margin-bottom: 60px;
      background:#edeef0;
    }
    .footer {
      position: absolute;
      bottom: 0;
      width: 100%;
      /* Set the fixed height of the footer here */
      height: 60px;
      background-color: #f5f5f5;
    }


    <footer class="footer">
          <div class="container">
            <p class="text-muted">© Osnova Websites</p>
          </div>
    </footer>
    Ответ написан
    3 комментария
  • Зачем использовать Vue вместе с Laravel?

    @ollisso
    Для чего лично вам использовать его - сложно сказать :)

    Как его мы его используем:
    1. динамика на странице, т.е. даже простое "если изменилось поле А то изменить поле Б" делается намного проще и быстрее чем на jquery/javascript
    2. темлейтинг. Нужно вам например сделать удобный темплейт на JS - вы можете или сам движок придумывать. или использовать готовый. Vue - один из них.
    3. Отображение данных с сервера. Опять же, можно генерировать весь хтмл на сервере, можно на клиенте. На сервере свои плюсы и минусы, на клиенте - свои.

    Удобство VUE - что можно использовать на отдельных элементах отдельных страниц. Нет нужды полностью переходить на него для всех страниц.

    Вот посмотрите примеры тут:
    https://vuejs.org/v2/examples/hackernews.html
    Ответ написан
    4 комментария
  • Зачем использовать Vue вместе с Laravel?

    Добавили, чтобы вы jquery спагетти не использовали. Vue (как и другие js фреймворки) сокращает количество кода на клиенте и уменьшает его запутанность.

    Для примера вы создаете админку для магазина. У вас есть следующие варианты:
    1. Делать статическую страницу. На клиенте никакой логики, все вычисляет сервер. При новой покупке администратор должен будет обновить страницу.
    2. Писать динамический фронтэнд с использованием vue, angular и чего угодно остального. Бэкэнд шлет вам уведомления через вэбсокеты о новых заказах без перезагрузки страницы.
    2.1 Вы берете jquery и сначала все идет хорошо. Первые полчаса. Затем ваш код обрастает огромным количеством обработчиков событий. Если товар заканчивается на складе, его надо убрать из таблицы, затем если заказ отменяется, его надо вернуть в таблицу. Вы его вернули, но почему-то кнопка в строке с ним, вызывающая модальное окно перестала реагировать на события, потом еще что-то случилось и еще. Проблемы с jquery растут как снежный ком и вы проклинаете свое решение создать динамическую админку.
    2.2 Вы используете современный js фреймворк. Vue в этом плане хорош низким порогом изучения. Вы загружаете определенные обхекты и в зависимости от их свойств vue сам строит таблицы (с проданными и непроданными товарами), скрывает лишние элементы (не показывать такую-то кнопку, если товар всего 1), отправляет плагинам команды на обновление при изменении объектов и следит за тем, чтобы события, которые отваливались при jquery подходе работали.

    Я не сказать что спец в javascript, но (именно поэтому) меня vuejs на текущем проекте очень выручает.
    Ответ написан
    Комментировать
  • Как правильно разделять бэкенд и фронтэнд в сложных веб-приложениях?

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

    Если же проект контентный и будет часть доступная поисковикам, анонимвм и все такое - все сложнее и скорее, при сильном желании использовать angular придется делать много SPA. И выборочно.

    Все дело в том, что с развитием проекта, когда встанут вопросы о поисковиках, скорости и всяком таком, окажется, что angular совершенно к этому не годен. Вещи вроде prerender решают проблему исключительно в простейших случаях и при развитии функционала требуют не тривиальный подходов и другой лабуды. Здесь речь идет о редиректах, 404, возможности ставить мета теги, noindex и все такое.
    Люди могут заявлять, что и 404 и 301/302 prerender поддерживает, но усилия в которые все это выливается в 100 раз превосходят те, что требуются при стандартном подходе, когда html отдает бекенд.

    Т.е. angular и ему подобные приносят пользу только в случае правильного применения.

    В вопросе не прозвучало о специфике проекта, потому, возможно мои слова не к месту, однако - предупрежден - вооружен.

    Спасибо.
    Ответ написан
    Комментировать
  • Yandex translate api post запрос ничего не получает?

    LightAir
    @LightAir
    LA
    Смотрите внимательней ваш код. Инициализируется curl в переменную $ch, а опции ставятся для несуществующего $curl.

    function url_get_contents ($Url) {
        if (!function_exists('curl_init')){
            die('CURL is not installed!');
        }
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_FAILONERROR, 1);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // allow redirects
        curl_setopt($ch, CURLOPT_TIMEOUT, 20); // times out after 4s
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return into a variable
        curl_setopt($ch, CURLOPT_URL, $Url);
        curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 GTB6");
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        $output = curl_exec($ch);
        curl_close($ch);
        return $output;
    }
    
    $params = array( 'key' => 'ключ', 'text' => 'Test Message', 'lang' => 'en-ru',);
    $query = http_build_query($params);
    $response = url_get_contents('https://translate.yandex.net/api/v1.5/tr.json/translate?'.$query);
    echo $response;
    Ответ написан
    Комментировать
  • Как сэкономить ресурсы оперативной памяти при кодинге в Ubuntu?

    theurs
    @theurs
    screenfetch показывает занятую/всего памяти
    попробуй установить пакет zram-config и перезагрузить
    Ответ написан
    2 комментария
  • Почему PhpStorm не правильно определяет объявления методов?

    yesworld
    @yesworld
    Потому что Штор проиндексировал все файлы/либы JS.

    Добавляете в исключение все папки, которые не нужны.
    ПКМ на папку, выбираем Mark Directory As и Excluded

    Если там и есть нужный файл, добавьте отдельно либу в библиотеку: External Libraries.
    Ответ написан
    4 комментария
  • Какой хороший чат для сайта?

    @zdevl
    Интересный вариант описан на Хабре https://habrahabr.ru/post/264035/.
    Без ВК, но через Телеграмм работает. Можно несколько операторов в онлайне держать. Я его еще не пробовал, но в планах есть. И у посетителя сайта нет никакой привязки к какой-ибо соц.сети, что на мой взгляд большой плюс. Далеко не все посетителя сайта хотят светить свой профиль в ВК или где-либо еще. А тут человек пишет в чат, а оператор получает сообщения в Телеграмме.
    ГитХаб https://github.com/Surzhikov/TelegramSiteHelper
    Ответ написан
    Комментировать
  • Как изолировать сайты на VPS?

    orlov0562
    @orlov0562
    I'm cool!
    Запускай веб-сервер от разных юзеров (например, для апач с помощью модуля mpm_itk) и настрой open_base_dir исключительно на директории сайтов.
    Ответ написан
    1 комментарий
  • Что лучше, качать шрифты себе на хостинг или использовать cdn google?

    webirus
    @webirus
    Тыжверстальщик! Наверстай мне упущенное...
    Тут будет множество мнений и какое реально правильное не сказать точно.
    Я для себя выбрал вариант - грузить себе по двум основным причинам.
    Во-первых, я оптимизирую шрифты иначе. Как правило требуется гораздо меньше символов, чем заложенов CDN.
    Во-вторых, не зависеть от других сайтов. А вдруг гуглофонт упадет?))) Ну, или плохой коннект до CDN.
    Мой вариант более затратный по времени. Скачай, оптимизируй, загрузи, подключи.
    Я вообще не использую CDN (сейчас в меня полетят камни), но я считаю это правильным.
    Ответ написан
    5 комментариев
  • Оптимизация frontend'a (помимо JavaScript)?

    Sanasol
    @Sanasol Куратор тега JavaScript
    нельзя просто так взять и загуглить ошибку
    Кажется это по теме: https://video.yandex.ru/users/ya-events/view/3267/

    В виде статьи тут: https://habrahabr.ru/company/yandex/blog/239169/
    но она почему-то поломана, можно в кеше гугла поискать...

    Так же в гугле можно найти слайды презентации.
    Ответ написан
    Комментировать
  • Laravel, IF, ELSE в файлах Routing?

    Sanasol
    @Sanasol Куратор тега Laravel
    нельзя просто так взять и загуглить ошибку
    middleware

    up
    router умеет поддомены обрабатывать
    https://laravel.com/docs/5.1/routing#route-group-s...
    Ответ написан
    1 комментарий
  • Исходники каких PHP-проектов лучше поизучать для примера отличного PHP-кода?

    @vashaaa
    Юх с горы
    Symphony копайте, вам на год хватит.
    UPD:ответ вас позлил наверное но я Объясню. Yii хорош, но symphony лучше. Копайте его, залейте клона с официального гита себе и разберитесь что и как работает. Не узнайте как с ним работать, а именно нарежьте его нано скальпелем до переменных, и посмотрите как он устроен. На том же гите поищите проекты на нем и разберитесь как и почему. Если уверены в своих силах закомитьте что нибудь, мелкую фичу. Почему symphony а не что-то ещё? Разберёшся с ним - с остальными проблем не будет. Конечно можно с дуру взять и смотреть Zend, но пожалейте свои мозги и время,года 3-4 на понимание уйдёт. Почему фреймворк а не книги или что-то ещё? Ну как вам сказать, книги это хорошо и читать их нужно, но фреймворки и примеры работ это здесь и сейчас, это то что востребовано то что вас прокормит, а книги можно почитать для общего развития авось где-то пригодится. Но это я именно об php и структуризации кода. Алгоритмы, архитектуры бд и т.д. закидывать не лзя, это читайте.
    Ответ написан
    7 комментариев
  • Отношения таблиц в Laravel?

    @Yadalay
    Php, Mysql, Html, Css, Js/Jquery/Ajax, Laravel
    Использовать hasOne() или, например, hasMany().
    Ответ написан
    Комментировать
  • Отношения таблиц в Laravel?

    miraage
    @miraage
    Старый прогер
    0) Настраиваем связи
    1) User::with('posts.categories')->get()
    Ответ написан
    1 комментарий
  • Какой функцией можно заменить mysql_result() в PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Комментировать