Июн 122019
 

Интернет реклама УБС

Debian

vi /etc/network/interfaces
iface eth0 inet static
        address ip_addr
        netmask 255.255.255.255
        gateway gw_ip_addr
        pointopoint gw_ip_addr

CentOS

/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=mac_address
ONBOOT=yes
BOOTPROTO=static
SCOPE="peer gw_ip_addr"
IPADDR=ip_addr
/etc/sysconfig/network-scripts/route-eth0
ADDRESS0=0.0.0.0
NETMASK0=0.0.0.0
GATEWAY0=
 Posted by at 01:39
Апр 092017
 

В PHP CURL POST руководство, Мы будем объяснять как использовать HTTP GET / POST запросы с PHP CURL library.

В данной статье ниже мы приводим примеры работы с данным протоколом

1) Отправить HTTP GET Запрос с CURL

2) Отправить HTTP POST Запрос с CURL

3) Отправить Random User-Agent в Запросе

4) Обработка перенаправление redirects ( HTTP 301, 302 )

5) Ошибки обработки ( Handle Errors ).

Почему мы используем PHP CURL ?

Отправить HTTP GET запрос, простой способ использовать метод file_get_contents().

file_get_contents('http://it.w-develop.com')

Но для использования POST запроса и использовать Обработчик ошибок не так просто в месте с командой file_get_contents().

Отправить HTTP запрос очень просто с PHP CURL. Вам надо выполнить четыре шага для отправки запроса

Шаг 1). Инициализация CURL сессии
Шаг 2). Заполняем options для CURL сессии
curl_setopt( $ch, CURLOPT_URL, "http://it.w-develop.com" );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
//curl_setopt( $ch, CURLOPT_HEADER, true ); // Если вы хотите использовать заголовки

CURLOPT_URL -> URL для загружки
CURLOPT_HEADER -> добавляем header/not
CURLOPT_RETURNTRANSFER -> если true, информация вернется как строка, а не выводит ее.

Полный список опций, смотри в документации PHP Documentation.

Шаг 3). Загружаем CURL сессию.
$output=curl_exec($ch);
Шаг 4). Зарываем сессию
curl_close($ch);
Note: Вы можете проверить, включен CURL enabled/not со следующим кодом.
if( is_callable( 'curl_init' ) ){
   echo "Enabled";
} else {
   echo "Not enabled";
}

1.PHP CURL GET Пример
You can use the below code to send GET request.

function httpGet( $url ) {

    $ch = curl_init();  
 
    curl_setopt( $ch, CURLOPT_URL, $url );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
//  curl_setopt( $ch, CURLOPT_HEADER, false ); 
 
    $output=curl_exec( $ch );
 
    curl_close( $ch );

    return $output;

}
 
echo httpGet("http://it.w-develop.com");

2.PHP CURL POST Пример
You can use the below code to submit form using PHP CURL.

function httpPost( $url, $params ) {

   $postData = '';
   //create name value pairs seperated by &
   foreach( $params as $k => $v ) {
      $postData .= $k . '='.$v.'&';
   }
   $postData = rtrim( $postData, '&' );
 
   $ch = curl_init();
 
   curl_setopt( $ch, CURLOPT_URL,$url );
   curl_setopt( $ch, CURLOPT_RETURNTRANSFER,true );
   curl_setopt( $ch, CURLOPT_HEADER, false );
   curl_setopt( $ch, CURLOPT_POST, count($postData ) );
   curl_setopt( $ch, CURLOPT_POSTFIELDS, $postData );
 
   $output = curl_exec( $ch );
 
   curl_close( $ch );

   return $output;
 
}

How to use the function:

$params = array(
   "name" => "Ravishanker Kusuma",
   "age" => "32",
   "location" => "India"
);
 
echo httpPost( "http://it.w-develop.com/examples/php/curl-examples/post.php", $params );

3.SEND RANDOM USER-AGENT IN THE REQUESTS
You can use the below function to get Random User-Agent.

function getRandomUserAgent() {
    $userAgents=array(
        "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6",
        "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)",
        "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)",
        "Opera/9.20 (Windows NT 6.0; U; en)",
        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 8.50",
        "Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.1) Opera 7.02 [en]",
        "Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; fr; rv:1.7) Gecko/20040624 Firefox/0.9",
        "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/48 (like Gecko) Safari/48"       
    );
    $random = rand(0,count($userAgents)-1);
 
    return $userAgents[$random];

}

Используется CURLOPT_USERAGENT, Вы можете установить User-Agent string.

curl_setopt( $ch, CURLOPT_USERAGENT, getRandomUserAgent()) ;

4. HANDLE REDIRECTS (HTTP 301,302)
Обрабатывать URL redirects, set CURLOPT_FOLLOWLOCATION to TRUE.Максимальное количество переадресаций можно контролировать, используя CURLOPT_MAXREDIRS.

curl_setopt($ch,CURLOPT_FOLLOWLOCATION,TRUE);
curl_setopt($ch,CURLOPT_MAXREDIRS,2);//only 2 redirects

5. КАК ОБРАТИТЬ ОШИБКИ CURL
мы можем использовать методы curl_errno(), curl_error(), Чтобы получить последние ошибки для текущего сеанса.
curl_error( $ch ) -> returns error as string
curl_errno( $ch ) -> returns error number

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

function httpGetWithErros( $url ) {

    $ch = curl_init();  
 
    curl_setopt( $ch, CURLOPT_URL, $url );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
 
    $output=curl_exec( $ch );
 
    if ( $output === false ) {

        echo "Error Number:" . curl_errno( $ch ) . "
"; echo "Error String:" . curl_error( $ch ); } curl_close($ch); return $output; }

Вывод полного списока ошибок, refer CURL errors

Мар 222016
 

Термопринтер Через COM Linux, Unix, Debian, Ubuntu, CentOS

Первоначально, надо, что бы Ваш Unix определил COM порт к которому мы подключили принтер.

Проверить можно это командой:

lsusb
ls /dev

Внимательно читаем документация к принтеру, и там должны быть похожие команды.

После пытаемся отправлять текст:

echo -ne "Проверяем как же работает текстовка\n" > /dev/ttyUSB0

Частичная обрезка:

echo -ne $'\x1B\x6D' > /dev/ttyUSB0

Полная обрезка:

echo -ne $'\x1B\x69' > /dev/ttyUSB0

Остальные команды смотрите в документации, они вводятся аналогично.

Мар 192016
 

Hibernate: основные типы данных

Hibernate предоставляет ряд готовых решений для привязки и приведения типов данных языка программирования к типам данных SQL. Такой процесс преобразования в Hibernate основан на использовании интерфейса org.hibernate.type.Type, а точнее его конкретных реализаций.

Тип данных в Hibernate нельзя отнести ни к типу данных Java, ни к типу данных SQL. Он представляет собой мост между этими двумя типами, содержит информацию о них обоих одновременно и предоставляет правила для их преобразования. При этом SQL типы представлены абстрактно и их преобразование происходит уже в зависимости от текущего SQL диалекта базы данных. Такой подход представляет собой гибкое решение для подключения различных баз без изменения кода приложения и позволяет не задумываться о типах данных и спецификации SQL, поддерживаемых конкретной базой.

Типы данных в Hibernate разделены на 3 категории: основные типы, составные типы и типы коллекций. В этой статье речь пойдет только об основных типах данных, которые используются для отображения одного поля в БД. Эти типы удовлетворяют большинству потребностей приложения, обеспечивая связь между основными типами Java и распространенными типами SQL.

Основные встроенные типы данных:

Java Class Hibernate Class (org.hibernate.type) Hibernate тип Возможный тип данных SQL¹
¹ Конечный тип зависит от производителя БД
java.lang.String StringType string VARCHAR
(или Oracle VARCHAR2)
MaterializedClob materialized_clob CLOB
TextType text LONGVARCHAR (или TEXT)
java.lang.Character
(or char primitive)
CharacterType char CHAR
java.lang.Boolean
(or boolean primitive)
BooleanType boolean BIT
NumericBooleanType numeric_boolean INTEGER
(0 = false, 1 = true)
YesNoType yes_no CHAR
(‘N’ = false, ‘Y’ = true)
TrueFalseType true_false CHAR
(‘F’ = false, ‘T’ = true)
java.lang.Byte
(or byte primitive)
ByteType byte TINYINT
java.lang.Short
(or short primitive)
ShortType short SMALLINT
java.lang.Integer
(or int primitive)
IntegerType int
integer
INTEGER
java.lang.Long
(or long primitive)
LongType long BIGINT
java.lang.Float
(or float primitive)
FloatType float FLOAT
java.lang.Double
(or double primitive)
DoubleType double DOUBLE
java.math.BigInteger BigIntegerType big_integer NUMERIC
(или Oracle NUMBER)
java.math.BigDecimal BigDecimalType big_decimal NUMERIC
(или Oracle NUMBER)
java.util.Date
java.sql.Timestamp
TimestampType timestamp TIMESTAMP
java.sql.Time TimeType time TIME
java.sql.Date DateType date DATE
java.util.Calendar CalendarType calendar TIMESTAMP
java.util.Calendar CalendarType calendar TIMESTAMP
CalendarDateType calendar_date DATE
java.util.Currency CurrencyType currency VARCHAR
(или Oracle VARCHAR2)
java.util.Locale LocaleType locale VARCHAR
(или Oracle VARCHAR2)
java.util.TimeZone TimeZoneType timezone VARCHAR
(или Oracle VARCHAR2)
java.net.URL UrlType url VARCHAR
(или Oracle VARCHAR2)
java.lang.Class ClassType class VARCHAR
(или Oracle VARCHAR2)
java.sql.Blob BlobType blob BLOB
java.sql.Clob ClobType сlob СLOB
byte[] BinaryType binary (или byte[]) VARBINARY
MaterializedBlobType materialized_blob BLOB
ImageType image LONGVARBINARY
Byte[] WrapperBinaryType wrapper-binary (или Byte[]) VARBINARY
char[] CharArrayType characters (или char[]) VARCHAR
(или Oracle VARCHAR2)
Character[] CharacterArrayType wrapper-characters (или Character[]) VARCHAR
(или Oracle VARCHAR2)
java.util.UUID UUIDBinaryType uuid-binary BINARY
UUIDCharType uuid-char CHAR (или VARCHAR для существующих колонок)
PostgresUUIDType pg-uuid PostgreSQL UUID
java.io.Serializable SerializableType serializable(или имя класса реализующего интерфейс Serializable) VARBINARY

Типы blob и clob не всегда удобны для использования в приложении, потому как эти объекты не могут быть переиспользованы за пределами транзакции. Их альтернативой могут послужить materialized_blob и materialized_clob, эти типы сразу воссоздаются как байтовый массив и строка соответственно, и доступны вне транзакции.

За исключением коллекций, все встроенные типы Hibernate поддерживают null семантику. Уникальные идентификаторы и коллекции могут быть любым из этих типов данных, за исключением binary, blob и clob.

Использование Hibernate типов

Сразу хочу сказать, что для типов данных Java указывать Hibernate типы совсем не обязательно, в этом случае Hibernate подберет и назначит их самостоятельно. Но при использовании типов данных, которые могут быть сопоставлены более чем с одним Hibernate типом, лучше задавать их явно. Например, если свойство имеет тип java.lang.String, то по умолчанию Hibernate промаппит его типом «string». Это означает, что Вы должны явно определить Hibernate тип для свойства, если хотите отобразить строку как «text» или «materialized_clob».

Для определения Hibernate типа используется атрибут type при маппинге с помощью xml файла. Атрибут type может указываться в любых элементах, таких как <id>, <property>, <discriminator>, <index>, или <element>:

<hibernate-mapping>
<class name="User" table="USER">

<id name="id" column="ID" type="long">
<generator class="native"/>
</id>

<property name="birthdate" column="BIRTHDATE" type="timestamp"/>
</class>
</hibernate-mapping>

В случае маппинга с помощью аннотаций используется аннотация

org.hibernate.annotations.Type:

@Type(type = "yes_no")
private boolean newModel;

@Type(type = "text")
private String description;

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

Мар 192016
 

BrowserMob Proxy + Selenium: автоматизация сбора данных о производительности

BrowserMob Proxy это бесплатная утилита, которая позволяет собирать данные о производительности веб-сайтов и браузеров. Обычно используется вместе с инструментальными средствами автоматизации, такими как Selenium или Watir. Proxy позволяет управлять поведением браузера, имитировать сетевой трафик и задержки, изменять HTTP запросы и ответы. К востребованной функциональности также можно отнести использование «черного» и «белого» списков, что позволяет, например, блокировать загрузку сторонних сайтов, не относящихся к тестированию Вашего веб-приложения, и тем самым повысить скорость тестов.
Также довольно часто BrowserMob используется для автоматизации доступа к сайтам, требующим Basic авторизацию.

Управлять прокси-сервером можно напрямую через Java интерфейс или через REST API. В этой статье мы будем рассматривать только интересующий нас Java интерфейс. Для того, чтобы подключить BrowserMob в проект нужно скачать библиотеку и добавить ее в проект, либо добавить соответствующую зависимость в pom.xml, если вы используете Maven:


			net.lightbody.bmp
			browsermob-proxy
			2.0-beta-8
			test
		

Если у Вас уже имеется подключенная в проект библиотека Selenium, то лучше исключить использование Selenium API, встроенного в BrowserMob. Но при этом учитывайте возможные несоответствия версий Selemium и BrowserMob:


			net.lightbody.bmp
			browsermob-proxy
			2.0-beta-8
			test
			
				
					org.seleniumhq.selenium
					selenium-api
				
			
		

Java реализация BrowserMob представлена в виде набора классов, основной из которых net.lightbody.bmp.proxy.ProxyServer.
Пример запуска прокси-сервера с FirefoxDriver и сбора данных загрузки страницы:

import net.lightbody.bmp.core.har.Har;
import net.lightbody.bmp.proxy.ProxyServer;

import org.junit.Test;
import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;

public class ProxyServerTest {

    @Test
    public void testMobProxyServer() throws Exception {
        // запуск прокси сервера
        ProxyServer server = new ProxyServer(4444);
        server.start();

        // получение Selenium proxy
        Proxy proxy = server.seleniumProxy();

        // конфигурация FirefoxDriver для использования прокси
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability(CapabilityType.PROXY, proxy);

        WebDriver driver = new FirefoxDriver(capabilities);

        // создание HAR с меткой "yandex.ru"
        server.newHar("yandex.ru");

        // открытие страницы
        driver.get("http://yandex.ru");

        // получение данных HAR
        Har har = server.getHar();

        // здесь будет обработка полученных данных

        driver.quit();
        server.stop();
    }
}

Вывод в консоль свидетельствует об успешном запуске и остановке прокси-сервера на 4444 порту:

HttpSer~ - Version Jetty/5.1.x
Contain~ - Started HttpContext[/,/]
SocketL~ - Started SocketListener on 0.0.0.0:4444
Contain~ - Started net.lightbody.bmp.proxy.jetty.jetty.Server@133321d6
Threade~ - Stopping Acceptor ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=4444]
SocketL~ - Stopped SocketListener on 0.0.0.0:4444
Contain~ - Stopped HttpContext[/,/]
Contain~ - Stopped net.lightbody.bmp.proxy.jetty.jetty.Server@133321d6

HAR

BrowserMob Proxy предоставляет полученную им информацию в HAR (HTTP Archive) формате. Этот формат используется инструментами мониторинга HTTP для выгрузки собранных данных. Фактически HAR формат представляет из себя JSON структуру данных в кодировке UTF-8, которую можно просматривать и анализировать использую различные HAR визуализаторы.

После того как в тесте мы получили данные HAR их можно сохранить физически в виде файла:

// получение данных HAR
        Har har = server.getHar();

        // обработка полученных данных
        try {
            File file = new File("results\\Test.har");
            if (!file.exists()) {
                file.createNewFile();
            }
            FileOutputStream fos = new FileOutputStream(file);
            try {
                har.writeTo(fos);
            }
            finally {
                fos.close();
            }
        }
        catch (IOException e) {
            // обработка ошибки
            e.printStackTrace();
        }
        finally {
            driver.quit();
            server.stop();
        }

Обновив проект Вы увидите сохраненный файл Test.har в папке results (папка была предварительно создана перед запуском).

Полученный HAR файл содержит JSON данные, которые можно использовать как текстовую информацию, либо просмотреть в удобном представлении, используя один из существующих онлайн инструментов, например, HTTP Archive Viewer 2.0.15:

Получить интересующую Вас информацию и поместить ее в собственный отчет можно и без сохранения HAR файла. Java класс net.lightbody.bmp.core.har.HarLog предоставляет набор методов для выборочного получения нужной информации:

Har har = server.getHar();

        // получить информацию о браузере
        System.out.println(har.getLog().getBrowser().getName());
        System.out.println(har.getLog().getBrowser().getVersion());

        // список всех обработанных запросов
        for (HarEntry entry : har.getLog().getEntries()) {

            System.out.println(entry.getRequest().getUrl());
            // время ожидания ответа от сервера в миллисекундах
            System.out.println(entry.getTimings().getWait());
            // время чтения ответа от сервера в миллисекундах
            System.out.println(entry.getTimings().getReceive());
        }

Помимо сбора информации net.lightbody.bmp.proxy.ProxyServer позволяет манипулировать запросами и полученными ответами с помощью добавления интерсепторов запросов и ответов соответственно:

public void addRequestInterceptor(RequestInterceptor interceptor)
public void addResponseInterceptor(ResponseInterceptor interceptor)

Пример интеграции BrowserMob с драйверами ChromeDriver и InternetExplorerDriver:

public class ProxyServerTest {

    private static ProxyServer server;
    private static Proxy proxy;

    @BeforeClass
    public static void setUpProxy() throws Exception {
        server = new ProxyServer(4444);
        server.start();
        proxy = server.seleniumProxy();
    }

    @Before
    public void createNewHar() {
        server.newHar("yandex.ru");
    }

    /**
     * ChromeDriver
     */
    @Test
    public void testChromeDriver() throws Exception {
        ChromeOptions option = new ChromeOptions();
        option.addArguments("--proxy-server=localhost:" 
                                                + server.getPort());
        WebDriver driver = new ChromeDriver(option);

        driver.get("http://yandex.ru");

        driver.quit();
    }

    /**
     * InternetExplorerDriver
     */
    @Test
    public void testIEDriver() throws Exception {
        DesiredCapabilities capabilities = 
                                DesiredCapabilities.internetExplorer();
        capabilities.setCapability(CapabilityType.PROXY, proxy);
        capabilities.setCapability("ie.setProxyByServer", true);
        WebDriver driver = new InternetExplorerDriver(capabilities);

        driver.get("http://yandex.ru");

        driver.quit();
    }

    @After
    public void saveHAR() throws Exception {
        Har har = server.getHar();
        File file = new File("results\\" 
                         + har.getLog().getBrowser().getName() + ".har");
        if (!file.exists()) {
            file.createNewFile();
        }
        FileOutputStream fos = new FileOutputStream(file);
        try {
            har.writeTo(fos);
        }
        finally {
            fos.close();
        }
    }

    @AfterClass
    public static void stopProxyServer() throws Exception {
        server.stop();
    }
}