• Как организовать защиту от парсинга сайта?

    Написал довольно много различных парсеров и автоматизаций веб разной сложности, и могу сказать, что единственный вариант - это не публиковать информацию вообще. Думаю следующее поможет отбить желание парсить сайт или как минимум повысит стоимость разработки\поддержки парсера:
    1. Система мониторинга поведения пользователя (движение мышки, координаты нажатия на кнопки и т.п.) для того чтобы вычислять ботов.
    2. Не использовать Id и name или другие атрибуты, по которым можно вычислить контент.
    3. Обфусцировать СSS и делать имена классов динамическими.
    4. Динамически добавлять различный мусор в разметку.
    5. Использовать веб-фреймворк, и не светить методы наружу.
    6. Использовать капчу, от разных вендоров и с динамически генерируемым url, причём загружать её так, чтобы её нельзя было вытащить из кэша браузера (от перехвата запроса это не спасёт, но жизнь автоматизаторам подпортит).
    7. Переодически менять вёрстку.

    Загружать контент через Ajax я бы не рекомендовал: перехватить реквест от браузера не такая уж большая проблема, зато сразу сужается область поиска контента.
    Ответ написан
    Комментировать
  • Есть ли мануал по настройке через CLI Telnet D-Link Wireless N 150 ADSL2+ Modem Router DSL-2640U?

    @dosnmater Автор вопроса
    Пришел ответ из поддержки. Из телнета набрать надо resident_cli и оттуда уже начинать плясать. Там и help можно прописать для вывода команд, которые могут изменять параметры, и команды более менее понятные. А про нормальный роутер - я покупал dlink до того, как начал интересоваться маршрутизацией и т.п. Я и понятия не имел, что у норм роутера должен быть консольный порт. Всем спасибо.
    Ответ написан
    Комментировать
  • Как найти ошибки в bitrix, если отображается белый экран?

    murzix
    @murzix
    Я что-то нажал и оно само
    Если битрикс свежий и в папке /bitrix/ есть файл .settings.php, то там можно указать файл для лога ошибок и типы ошибок которые будут туда записываться.

    У меня на локалке настройки такие:
    'exception_handling' => 
      array (
        'value' => 
        array (
          'debug' => true,
          'handled_errors_types' => E_ALL & ~E_NOTICE & ~E_STRICT & ~E_USER_NOTICE & ~E_DEPRECATED,
          'exception_errors_types' => E_ALL & ~E_NOTICE & ~E_WARNING & ~E_STRICT & ~E_USER_WARNING & ~E_USER_NOTICE & ~E_COMPILE_WARNING,
          'ignore_silence' => true,
          'assertion_throws_exception' => false,
          'assertion_error_type' => 256,
          'log' => array (
            'settings' => array (
              'file' => 'bitrix/modules/error.log',
              'log_size' => 1000000,
            ),
    	  ),
        ),
        'readonly' => true,
      ),
    Ответ написан
    Комментировать
  • Как перезагрузить страницу методом GET?

    usdglander
    @usdglander Куратор тега PHP
    Yipee-ki-yay
    Вы, конечно, же уже знаете про window.location.reload?
    Ответ написан
    Комментировать
  • Какую версию linux, выбрать для обучения?

    sim3x
    @sim3x
    убунту
    Ответ написан
    Комментировать
  • Как управлять docker'ом?

    amelihovv
    @amelihovv
    Фулстек веб разработчик
    Чтобы поставить доп расширения какие-то или внести любые изменения в образ контейнера, нужно создать свой кастомный Dockerfile. Например, для php это будет выглядеть следующим образом:
    # php/Dockerfile
    
    FROM php:7-fpm:latest
    
    MAINTAINER Vasya Pupkin
    
    # Ставим, например, composer.
    
    RUN php -r "readfile('http://getcomposer.org/installer');" | php -- --install-dir=/usr/bin/ --filename=composer


    Затем обновляем docker-compose.yml. Указываем, что будем использовать свой Dockerfile и указываем имя нового образа.
    php:
            build:
    	    context: ./php
    	    dockerfile: Dockerfile
            image: my-php
            volumes:
                - ./www:/www
                - ./php/log.conf:/usr/local/etc/php-fpm.d/zz-log.conf
            networks:
                - code-network


    Чтоб теперь можно поиграться с композером, можно сделать следующие вещи:

    1. Зайти в контейнер по ssh и запускать композер оттуда

    docker-compose exec my-php bash
    composer --version


    2. Запустить композер с хостовой машины

    docker-compose exec my-php composer --version
    или
    docker-compose run --rm  my-php  composer --version


    Чтоб чуть упростить набор команд, можно создать скриптик на bash (установи себе git bash на windows, из него можно будет выполнять его).

    #!/usr/bin/env bash
    
    COMPOSE="docker-compose"
    
    if [ $# -gt 0 ]; then
        if [ "$1" == "composer" ]; then
            shift 1
            $COMPOSE run --rm \
                -w /www \
                my-php \
                composer "$@"
    
        # If "test" is used, run unit tests,
        # pass-thru any extra arguments to php-unit
        elif [ "$1" == "test" ]; then
            shift 1
            $COMPOSE run --rm \
                -w /www \
                my-php \
                ./vendor/bin/phpunit "$@"
    
        # If "npm" is used, run npm
        # from our node container
        elif [ "$1" == "npm" ]; then
            shift 1
            $COMPOSE run --rm $TTY \
                -w /var/www/html \
                node \
                npm "$@"
        else
            $COMPOSE "$@"
        fi
    else
        $COMPOSE ps
    fi


    Ну и с его помощью можно делать следующее

    ./dev.sh # docker-compose ps
    ./dev.sh logs my-php # docker-compose logs my-php
    ./dev.sh composer --version # выполнение любой composer команды
    ./dev.sh npm --version # выполнение любой npm команды
    ./dev.sh test --filter some_test_method # запуск phpunit тестов


    P. S. У меня тоже, когда-то, докер сложновато шел. Это нормально.
    Ответ написан
    2 комментария
  • Порекомендуйте оптимальный вариант переноса(бэкапа)?

    @ldvldv
    1.
    virsh dumpxml vm > vm.xml  # получаем конфиг виртуалки
    
    virsh define vm.xml  # создаем ВМ из конфига
    virsh start vm # запускаем ВМ
    
    2.
    
    теоретически можно так:
    
    lvcreate -L1G -s -n vmhdd.backup /dev/VG/vmhdd # создаем снимок тома ВМ
    ssh root@server.ru lvcreate -L20G -n vmhdd VG # создаем том на новом сервере  с размером тома оригинала
    dd if=/dev/VG/vmhdd.backup | gzip | ssh root@server.ru "gunzip | dd of=/dev/VG/vmhdd" # копируем содержимое тома 
    lvremove /dev/VG/vmhdd.backup # удаляем снимок
    
    3. Изменить размер тома можно на новом сервере или перед копированием используя resize2fs (ext) или стандартными средствами (Windows)
     -> parted -> lvresize
    Ответ написан
  • Неплохо знаю WP но зарабатываю мало, что делаю не так?

    alex-1917
    @alex-1917
    Если ответ помог, отметь решением
    ППЦ, вот кто обваливает рынок!!
    Магазин будет приносить прибыль владельцу, а вы скромняшка, боитесь цену загнуть, будто делаете личную страничку васи пупкина.
    Если бизнес не может купить себе инет-магазин за хотя бы 40к рубасов, то по сути такой бизнес и не нужен никому, он загнется через пару месяцев с таким скупердяйством! Там же еще надо будет продвигать, работать скорее всего в соц. сетях и т.д.
    А вы своей скромностью только увеличиваете энтропию, висят потом такие дохлые магазины годами, пока домен не забудут продлить...
    Магазин на минималке с версткой всех страниц меньше 120к не делаю, средняя 200-300к, с полной настройкой (доставка, геопривязки, скидки, накопительные, личные кабинеты, промокоды, связи товаров и т.д.) - это тебе на будущее ориентир!
    Ответ написан
    6 комментариев
  • $APPLICATION->IncludeFile, как убрать вывод div'а?

    $APPLICATION->IncludeFile оборачивает всё в div только в 2 случаях.
    1. Включён режим правки
    2. Внутри подключаемого файла есть div
    Ответ написан
    Комментировать
  • Как можно вернуть доступ в административную панель CMS Битрикс для конкретного пользователя?

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

    $USER->Authorize(1)

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

    Вынесите редактируемый текст во включаемую область и пусть контентщик её отдельно правит:

    $APPLICATION->IncludeComponent('bitrix:main.include','',
        [
            'AREA_FILE_SHOW' => 'file',
            'PATH' => 'путь до файла с включаемой областью',
            'EDIT_TEMPLATE' => ''
        ],
        false
    );
    Ответ написан
    Комментировать
  • Как в bitrix сделать редактирование в визуальном редакторе определенного (контентного) блока?

    @Maksim37rus
    <?
      require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
      $APPLICATION->SetTitle("О центре");
    echo '
    <div class="side"><!-- Тут боковое меню --></div>
    <div class="main">
        <!-- Тут контент, который надо редактировать -->
    	
        <p>';
    	?>
    	Текст
    	<?
    	echo '</p>
    </div>';
    require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>


    Это для конкретной страницы. Вообще лучше<div class="side"> и <div class="main"> вынести в шаблон.
    Ответ написан
    1 комментарий
  • Как отключить рекламу в Disqus?

    @ikode
    web developer
    Переходите по адресу: https://YOURSITE.disqus.com/admin/settings/ads/ и отключайте рекламу!
    5a0fb448a7ce2689445918.jpeg
    Ответ написан
    Комментировать
  • Есть ли аналоги CMS Textolite для статических сайтов?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    главное чтобы время было

    https://www.staticgen.com/
    Ответ написан
    Комментировать
  • Как изменить шапку при скроллинге?

    Ibraguim
    @Ibraguim
    Ответ написан
    Комментировать
  • Как можно обновить iframe на jQuery при нажатии на ссылку?

    nalomenko
    @nalomenko
    Руководитель отдела разработок в студии «Lava»
    Есть несколько способов

    //Обновить один конкретный iFrame
    $('#iframe')[0].contentWindow.location.reload(true);
     
    //Обновить все iFrame на странице
    $('iframe').each(function() {
      this.contentWindow.location.reload(true);
    });
    
    //Еще один способ обновить все iFrame
    $('iframe').attr('src', $('iframe').attr('src'));
    Ответ написан
    Комментировать
  • Какие тестовые задания дают на верстальщика?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    Не нормально.
    Не нормально в качестве теста перелопатить реальную страницу или сверстать с нуля лендос.
    Уточнение: не нормально, если такое тестовое задание не оплачивается.

    Нормальное тестовое задание должно занимать на выполнение не более двух-трех часов у соискателя.
    Ответ написан
    Комментировать
  • Переход с постоянки на фриланс, стоит ли игра свеч?

    @McBernar
    У вас скромный рейт. Хотя, возможно, для Чехии это нормально.

    Я работал и работаю на фрилансе уже много лет. И в штате много лет тоже работаю.
    Поэтому могу кое-что сказать.

    Минусы

    1. Все байки про фриланс — правда.

    2. Нужно иметь железную дисциплину, чтобы работать в строго отведенные часы, а в другое время отдыхать. И чтобы вставать вовремя, а не спать до обеда.

    3. Со временем ты превращаешься в пещерного человека, потому что большую часть времени проводишь дома. Кому-то это комфортно, кому-то не очень. Кто-то умеет с этим справляться, кто-то нет. Но социализации, доступной в офисе, очень не хватает. Фейсбук и чаты не заменят живое общение.

    4. Очень много мудаков среди клиентов. Со временем научишься их определять с первых же слов в переписке. Но до этого придется некоторое количество раз обжечься.

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

    6. Хорошее описание проекта, хороший продукт сам по себе — на фрилансе этого мало. Повезет, если получится удаленно вписаться в команду, которая делает или большой проект или делает много проектов на потоке. Если же это разовые проекты, то будь готов к задаче вида "ну мне вот сайт нужен с формой, сообщениями и робокассой, а ну вот еще там корзина, да".

    7. Забудь про стабильность. Сегодня ты заработал двойную зарплату, а в следующем месяце процентов 50. Нет никого, кто строго раз в две недели будет тебе перечислять деньги на карту.

    Плюсы

    1. Свобода в выборе задач и проектов. Это прям кайф.

    2. Есть возможность заниматься своими делами, потому что за проекты отвечаешь ты и только ты. Соответственно, можно брать выходные, когда тебе удобно, а не когда они на календаре пришли.

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

    4. Есть возможность учиться. Не вечером после работы, днем, когда голова свежая.
    Офис эту возможность сильно ограничивает.

    5. Есть много времени и сил на свои проекты. То, до чего не доходили руки целый год офисной работы, может быть сделано довольно быстро.

    Где работать
    Попробуй везде. И на фл и на апворке есть свои плюсы и минусы.
    Но самые лучшие клиенты — это, конечно, которые приходят напрямую.
    Ответ написан
    3 комментария
  • Как конвертировать yml (xml яндекс.маркета) в CSV?

    @bik Автор вопроса
    Пока пользуюсь этим:
    <?php
    ignore_user_abort(1);
    error_reporting(0);
    header("Content-Type: text/html; charset=utf-8");
    
    	$cat = array();
    	$xml = new XMLReader();
    	$xml->open('./yml - Kopie.xml');
    		
    	while($xml->read() && $xml->name !== 'category');
    		while($xml->name === 'category'){
    			$node = new SimpleXMLElement($xml->readOuterXML());
    			$id = +$xml->getAttribute("id");
    			$name = ''. $node;
    			
    			$cat[$id] = $name;
    			
    		$xml->next('category');
    		}
    	$xml->close();			
    
    //////////////////////////////
    
    	$xml = new XMLReader();
    	$xml->open('./yml - Kopie.xml');	
    		
    	$allparams = array();
    	$idparams = array();
    	while($xml->read() && $xml->name !== 'offer');
    		while($xml->name === 'offer'){
    			$node = new SimpleXMLElement($xml->readOuterXML());	
    			$id = +$xml->getAttribute("id");
    			
    			foreach ($node->param as $param){
    				$name = ''. $param['name'];
    				$value = ''. $param;
    				$allparams[] = ''. $param['name'];				
    				$idparams[$id][$name] = $value;
    			}				
    		$xml->next('offer');
    		}
    	$xml->close();
    	
    	$allparams = array_unique($allparams);
    	sort($allparams);
    
    //////////////////////////////
    
    	$xml = new XMLReader();
    	$xml->open('./yml - Kopie.xml');
    	$flag = true;	
    	while($xml->read() && $xml->name !== 'offer');
    		while($xml->name === 'offer'){
    			$node = new SimpleXMLElement($xml->readOuterXML());
    			
    			$id = $xml->getAttribute("id");
    			$available = $xml->getAttribute("available");
    			$url = $node->url;
    			$price = $node->price;
    			$currencyId = $node->currencyId;
    			$delivery = $node->delivery;
    			$local_delivery_cost = $node->local_delivery_cost;
    			$typePrefix = $node->typePrefix;
    			$vendor = $node->vendor;
    			$vendorCode = $node->vendorCode;
    			$model = $node->model;
    			$description = $node->description;
    			$cpa = $node->cpa;
    			$weight = $node->weight;
    			$pickup = $node->pickup;
    			$c = +$node->categoryId;
    			$category = $cat[$c];
    			
    			$picture = '';
    			foreach ($node->picture as $pic){
    				$picture .= $pic .' ';			   
    			}					
    			
    			if($flag){
    				$str = '"id";"Наличие";"url товара";"Цена";"Валюта";"Доставка";"Цена доставки";"Тип";"Производитель";"Код производителя";"Модель";"Описание";"Заказ на маркете";"Вес";"url картинки";"Самовывоз";"Категория";';
    				$j = count($allparams);
    				while($j-- > 0){
    					$str .= '"'. $allparams[$j] .'";';
    				}
    				$str .= PHP_EOL;
    				$str = mb_convert_encoding ($str ,"Windows-1251" , "UTF-8" );			
    				$path = fopen("out.csv", "a+");
    				fwrite($path, $str);
    				fclose($path);
    				$flag = false;
    			}
    			
    			$params = '';
    			$j = count($allparams);
    			while($j-- > 0){				
    				$params .= '"'. $idparams[$id][$allparams[$j]] .'";';			
    			}		
    			
    			$str = '"'. $id .'";';
    			$str .= '"'. $available .'";';
    			$str .= '"'. $url .'";';
    			$str .= '"'. $price .'";';
    			$str .= '"'. $currencyId .'";';
    			$str .= '"'. $delivery .'";';
    			$str .= '"'. $local_delivery_cost .'";';
    			$str .= '"'. $typePrefix .'";';
    			$str .= '"'. $vendor .'";';
    			$str .= '"'. $vendorCode .'";';
    			$str .= '"'. $model .'";';
    			$str .= '"'. $description .'";';
    			$str .= '"'. $cpa .'";';
    			$str .= '"'. $weight .'";';			
    			$str .= '"'. $picture .'";';
    			$str .= '"'. $pickup .'";';
    			$str .= '"'. $category .'";';
    			$str .= $params;
    			$str .= PHP_EOL;
    			
    			$str = mb_convert_encoding ($str ,"Windows-1251" , "UTF-8" );			
    			$path = fopen("out.csv", "a+");
    			fwrite($path, $str);
    			fclose($path);			
    			
    		$xml->next('offer');
    		}
    	$xml->close();
    gc_enable();
    echo 'ok';
    ?>


    Предварительно сокращаю описание товаров:
    sed 's#\(<description>\).*\(</description>\)#\1'xxxxx'\2#g' test.xml > test2.xml
    Ответ написан
    1 комментарий