Известно, что воспалительный процесс представляет из себя попытку организма избавиться от патогенов, поврежденных клеток или раздражающих веществ, дабы инициировать процесс заживления.
Автор: Культура Процветания
Автор: Культура Процветания
Привет друзья. Сегодня мы хотим поделиться, как вы можете обрезать изображение с помощью простого скрипта cropper.js и PHP. Это простой JQuery плагин изображения кадрирования cropper.js. Cropper Js наследуется от размера родительского элемента изображения (wrapper), так что не забудьте обернуть изображение с видимым блочным элементом и вывод укороченных размеров исходного изображения, так что вы можете использовать их, чтобы обрезать изображение непосредственно.
Зависимости сервера
— PHP 5.5+
Поддержка браузеров
<script src="/путь_к/jquery.js"></script><!-- требуется jQuery --> <link href="/путь_к/cropper.css" rel="stylesheet"> <script src="/путь_к/cropper.js"></script>
PHP код в файл ‘crop.php’, чтобы обрезать изображение
<?php
class CropAvatar {
private $src;
private $data;
private $dst;
private $type;
private $extension;
private $msg;
function __construct($src, $data, $file) {
$this -> setSrc($src);
$this -> setData($data);
$this -> setFile($file);
$this -> crop($this -> src, $this -> dst, $this -> data);
}
private function setSrc($src) {
if (!empty($src)) {
$type = exif_imagetype($src);
if ($type) {
$this -> src = $src;
$this -> type = $type;
$this -> extension = image_type_to_extension($type);
$this -> setDst();
}
}
}
private function setData($data) {
if (!empty($data)) {
$this -> data = json_decode(stripslashes($data));
}
}
private function setFile($file) {
$errorCode = $file['error'];
if ($errorCode === UPLOAD_ERR_OK) {
$type = exif_imagetype($file['tmp_name']);
if ($type) {
$extension = image_type_to_extension($type);
$src = 'img/' . date('YmdHis') . '.original' . $extension;
if ($type == IMAGETYPE_GIF || $type == IMAGETYPE_JPEG || $type == IMAGETYPE_PNG) {
if (file_exists($src)) {
unlink($src);
}
$result = move_uploaded_file($file['tmp_name'], $src);
if ($result) {
$this -> src = $src;
$this -> type = $type;
$this -> extension = $extension;
$this -> setDst();
} else {
$this -> msg = 'Ошибка сохранения файла';
}
} else {
$this -> msg = 'Пожалуйста, загрузите изображения следующих типов: JPG, PNG, GIF';
}
} else {
$this -> msg = 'Пожалуйста, загрузите файл изображения';
}
} else {
$this -> msg = $this -> codeToMessage($errorCode);
}
}
private function setDst() {
$this -> dst = 'img/' . date('YmdHis') . '.png';
}
private function crop($src, $dst, $data) {
if (!empty($src) && !empty($dst) && !empty($data)) {
switch ($this -> type) {
case IMAGETYPE_GIF:
$src_img = imagecreatefromgif($src);
break;
case IMAGETYPE_JPEG:
$src_img = imagecreatefromjpeg($src);
break;
case IMAGETYPE_PNG:
$src_img = imagecreatefrompng($src);
break;
}
if (!$src_img) {
$this -> msg = "Не удалось прочитать файл изображения";
return;
}
$size = getimagesize($src);
$size_w = $size[0]; // натуральная ширина
$size_h = $size[1]; // натуральная высота
$src_img_w = $size_w;
$src_img_h = $size_h;
$degrees = $data -> rotate;
// Повернуть исходное изображение
if (is_numeric($degrees) && $degrees != 0) {
// Градусов в PHP противоположно градусов по CSS
$new_img = imagerotate( $src_img, -$degrees, imagecolorallocatealpha($src_img, 0, 0, 0, 127) );
imagedestroy($src_img);
$src_img = $new_img;
$deg = abs($degrees) % 180;
$arc = ($deg > 90 ? (180 - $deg) : $deg) * M_PI / 180;
$src_img_w = $size_w * cos($arc) + $size_h * sin($arc);
$src_img_h = $size_w * sin($arc) + $size_h * cos($arc);
// Исправить поворачивая изображения на 1px, когда градусов < 0
$src_img_w -= 1;
$src_img_h -= 1;
}
$tmp_img_w = $data -> width;
$tmp_img_h = $data -> height;
$dst_img_w = 220;
$dst_img_h = 220;
$src_x = $data -> x;
$src_y = $data -> y;
if ($src_x <= -$tmp_img_w || $src_x > $src_img_w) {
$src_x = $src_w = $dst_x = $dst_w = 0;
} else if ($src_x <= 0) {
$dst_x = -$src_x;
$src_x = 0;
$src_w = $dst_w = min($src_img_w, $tmp_img_w + $src_x);
} else if ($src_x <= $src_img_w) {
$dst_x = 0;
$src_w = $dst_w = min($tmp_img_w, $src_img_w - $src_x);
}
if ($src_w <= 0 || $src_y <= -$tmp_img_h || $src_y > $src_img_h) {
$src_y = $src_h = $dst_y = $dst_h = 0;
} else if ($src_y <= 0) {
$dst_y = -$src_y;
$src_y = 0;
$src_h = $dst_h = min($src_img_h, $tmp_img_h + $src_y);
} else if ($src_y <= $src_img_h) {
$dst_y = 0;
$src_h = $dst_h = min($tmp_img_h, $src_img_h - $src_y);
}
// Масштаб конечная позиция и размер
$ratio = $tmp_img_w / $dst_img_w;
$dst_x /= $ratio;
$dst_y /= $ratio;
$dst_w /= $ratio;
$dst_h /= $ratio;
$dst_img = imagecreatetruecolor($dst_img_w, $dst_img_h);
// Добавить прозрачный фон в целевом изображении
imagefill($dst_img, 0, 0, imagecolorallocatealpha($dst_img, 0, 0, 0, 127));
imagesavealpha($dst_img, true);
$result = imagecopyresampled($dst_img, $src_img, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h);
if ($result) {
if (!imagepng($dst_img, $dst)) {
$this -> msg = "Не удалось сохранить обрезанный файл изображения";
}
} else {
$this -> msg = "Не удалось обрезать файл изображения";
}
imagedestroy($src_img);
imagedestroy($dst_img);
}
}
private function codeToMessage($code) {
$errors = array(
UPLOAD_ERR_INI_SIZE =>'Загруженный файл превышает директиву upload_max_filesize в php.ini',
UPLOAD_ERR_FORM_SIZE =>'Загруженный файл превышает размер max_file_size, указанного в HTML-форме',
UPLOAD_ERR_PARTIAL =>'Загружаемый файл был загружен лишь частично',
UPLOAD_ERR_NO_FILE =>'Файл не был загружен',
UPLOAD_ERR_NO_TMP_DIR =>'Отсутствует временная папка',
UPLOAD_ERR_CANT_WRITE =>'Не удалось записать файл на диск',
UPLOAD_ERR_EXTENSION =>'Ошибка загрузки файла из-за расширения',
);
if (array_key_exists($code, $errors)) {
return $errors[$code];
}
return 'Неизвестная ошибка загрузки';
}
public function getResult() {
return !empty($this -> data) ? $this -> dst : $this -> src;
}
public function getMsg() {
return $this -> msg;
}
}
$crop = new CropAvatar(
isset($_POST['avatar_src']) ? $_POST['avatar_src'] : null,
isset($_POST['avatar_data']) ? $_POST['avatar_data'] : null,
isset($_FILES['avatar_file']) ? $_FILES['avatar_file'] : null
);
$response = array(
'state' => 200,
'message' => $crop -> getMsg(),
'result' => $crop -> getResult()
);
echo json_encode($response);
HTML код
<!-- Обрезка -->
<div class="modal fade" id="avatar-modal" aria-hidden="true" aria-labelledby="avatar-modal-label" role="dialog" tabindex="-1">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<form class="avatar-form" action="crop.php" enctype="multipart/form-data" method="post">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">×</button>
<h4 class="modal-title" id="avatar-modal-label">Изменить аватар</h4>
</div>
<div class="modal-body">
<div class="avatar-body">
<!-- Загрузка изображения и данных -->
<div class="avatar-upload">
<input type="hidden" class="avatar-src" name="avatar_src">
<input type="hidden" class="avatar-data" name="avatar_data">
<label for="avatarInput">Локальная загрузка</label>
<input type="file" class="avatar-input" id="avatarInput" name="avatar_file">
</div>
<!-- Кадрирование и просмотр -->
<div class="row">
<div class="col-md-9">
<div class="avatar-wrapper"></div>
</div>
<div class="col-md-3">
<div class="avatar-preview preview-lg"></div>
<div class="avatar-preview preview-md"></div>
<div class="avatar-preview preview-sm"></div>
</div>
</div>
<div class="row avatar-btns">
<div class="col-md-9">
<div class="btn-group">
<button type="button" class="btn btn-primary" data-method="rotate" data-option="-90" title="Rotate -90 degrees">Поворот налево</button>
<button type="button" class="btn btn-primary" data-method="rotate" data-option="-15">-15 град</button>
<button type="button" class="btn btn-primary" data-method="rotate" data-option="-30">-30 град</button>
<button type="button" class="btn btn-primary" data-method="rotate" data-option="-45">-45 град</button>
</div>
<div class="btn-group">
<button type="button" class="btn btn-primary" data-method="rotate" data-option="90" title="Rotate 90 degrees">Поворот направо</button>
<button type="button" class="btn btn-primary" data-method="rotate" data-option="15">15 град</button>
<button type="button" class="btn btn-primary" data-method="rotate" data-option="30">30 град</button>
<button type="button" class="btn btn-primary" data-method="rotate" data-option="45">45 град</button>
</div>
</div>
<div class="col-md-3">
<button type="submit" class="btn btn-primary btn-block avatar-save">Готово</button>
</div>
</div>
</div>
</div>
</form>
</div>
</div>
</div><!-- /.modal -->
Что сделать, если я получил неизвестную ошибку загрузки?
Вы можете загрузить огромное изображение, просто настроить upload_max_filesize, post_max_size и memory_limit в вашем файле php.ini. Или проверьте ** php_error.log ** файл, чтобы выяснить проблему.
В этом посте я объясню, как создать пользовательский мета-бокс в WordPress. Когда вы редактирует свой пост, страница состоит из множества мета-боксов по умолчанию, такие как: редактор, изображение записи, опубликовать, рубрики, теги и т.д. Эти мета-боксы находятся на правой стороне экрана редактирования.
Вы можете создавать свои собственные мета-боксы, путем добавления нескольких кодов в файл function.php вашей темы в WordPress или можете создать отдельный плагин для этого. Ниже примеры демонстрируют шаги, как создать пользовательские мета-боксы.
Добавьте ниже крюк в add_meta_boxes действие и сделать вызов add_meta_box().
/* Добавить метабокс на экран редактирования поста */
add_action( 'add_meta_boxes', 'andreyex_add_custom_box' );
function andreyex_add_custom_box() {
$screens = array( 'post', 'my_cpt' );
foreach ( $screens as $screen ) {
add_meta_box(
'andreyex_box_id', // Unique ID
'Пользовательский заголовок метабокса', // Заголовок мета-бокса
'andreyex_inner_custom_box', // Content callback
$screen // тип поста
);
}
}
Ниже код будет создать форму для пользовательского meta box. Пожалуйста, измените приведенный ниже код согласно вашему требованию.
/* Печать содержимого бокса */
function andreyex_inner_custom_box( $post ) {
?>
<label for="andreyex_field"> Описание для этой области </label>
<select name="andreyex_field" id="andreyex_field" class="postbox">
<option value="">Выберите что-то…</option>
<option value="something">Что-то</option>
<option value="else">Иначе</option>
</select>
<?php
}
?>
Добавьте код, приведенный ниже, чтобы сохранить данные формы в базе данных, соответствующих текущему посту.
add_action( 'save_post', 'andreyex_save_postdata' );
function andreyex_save_postdata( $post_id ) {
if ( array_key_exists('andreyex_field', $_POST ) ) {
update_post_meta( $post_id,
'_my_meta_value_key',
$_POST['andreyex_field']
);
}
}
Отображение мета значения в боксе из базы данных на экране редактирования поста.
<?php $value = get_post_meta( $post->ID, '_my_meta_value_key', true ); ?>
<select name="andreyex_field" id="andreyex_field" class="postbox">
<option value="">Выберите что-то…</option>
<option value="something" <?php if ( 'something' == $value ) echo 'selected'; ?>>Что-то</option>
<option value="else" <?php if ( 'else' == $value ) echo 'selected'; ?>>Иначе</option>
</select>
Если вы хотите удалить мета-бокс по умолчанию из экрана редактирования поста, используйте remove_meta_box() для этого.
На этом уроке, мы рассмотрим, как установить Apache, MariaDB, PHP7 (стек LAMP) с PhpMyAdmin на OpenSUSE 42.2 Leap.
Перед установкой любого программного обеспечения, всегда хорошая идея для обновления репозитория и пакетов программного обеспечения.
sudo zypper update
Установка Apache на OpenSUSE с помощью следующей команды.
sudo zypper install apache2
По умолчанию, Apache не будет запускаться автоматически после того, как будет установлен. Вы можете запустить его с помощью команды:
sudo systemctl start apache2
И включить автоматический запуск во время загрузки:
sudo systemctl enable apache2
Проверьте статус:
systemctl status apache2
Мы можем видеть на скриншоте, что Apache работает и автоматический запуск включен.
Проверьте версию Apache:
sudo httpd -v
Вывод:
Server version: Apache/2.4.23 (Linux/SUSE) Server built: 2016-09-13 13:41:45.000000000 +0000
Теперь создайте файл index.html в корне документа.
sudo nano /srv/www/htdocs/index.html
Поместите следующий текст в файл.
<html> <body> <h1> It works!</h1> </body> </html>
Сохраните и закройте файл. Затем в адресной строке браузера введите IP-адрес OpenSUSE 42.2 Leap. Вы должны увидеть «It works!» на веб-странице, а это значит, веб-сервер Apache работает правильно.
Если вы устанавливаете LAMP на локальной машине OpenSUSE Leap 42.2, просто введите 127.0.0.1 или localhost в адресной строке браузера.
По умолчанию брандмауэр SuSE запретит общий доступ к порту 80. Чтобы разрешить общий доступ, необходимо изменить конфигурацию брандмауэра.
sudo nano /etc/sysconfig/SuSEfirewall2
Найти следующую строку.
FW_CONFIGURATIONS_EXT=""
Измените его к следующему, чтобы разрешить общий доступ к порту 80.
FW_CONFIGURATIONS_EXT="apache2"
Сохраните и закройте файл. Затем перезапустите брандмауэр SuSE.
sudo systemctl restart SuSEfirewall2
И, наконец, нам нужно сделать wwwrun (пользователь Apache) в качестве владельца корневого документа.
sudo chown wwwrun /srv/www/htdocs/ -R
Установить MariaDB сервер и клиент на OpenSUSE Leap с помощью следующей команды.
sudo zypper install mariadb mariadb-client mariadb-tools
По умолчанию, MariaDB не запускается автоматически после того, как была установлена. Мы можем запустить ее с помощью команды:
sudo systemctl start mysql
И включить автоматический запуск во время загрузки:
sudo systemctl enable mysql
Проверьте статус MariaDB:
systemctl status mysql
Мы можем видеть на скриншоте, MariaDB работает и включена в автоматический запуск.
Проверьте версию MariaDB:
mysql --version
Вывод:
mysql Ver 15.1 Distrib 10.0.28-MariaDB, for Linux (x86_64) using readline 5.1
Теперь любой пользователь в системе может войти в MariaDB как root с помощью следующей команды:
mysql -u root
Для того, чтобы ограничить доступ, необходимо установить пароль для корневого пользователя MariaDB. Выполните следующую команду:
sudo mysql_secure_installation
Когда он попросит вас ввести пароль MariaDB для root, нажмите Enter , потому что вы не установили пароль администратора еще. Затем введите y и установите корневой пароль для сервера MariaDB.
Далее вы можете просто нажать Enter, чтобы ответить на все остальные вопросы. Это приведет к удалению анонимного пользователя, запретить удаленный вход администратора и удалить тестовую базу данных. Этот шаг является основным требованием для обеспечения безопасности базы данных MariaDB.
Теперь вы можете войти в MariaDB с помощью следующей команды
mysql -u root -p
Введите следующую команду, чтобы установить PHP7 и расширения PHP7.
sudo zypper install php7 php7-mysql apache2-mod_php7
Затем включите PHP модуль и перезапустить веб-сервер Apache.
sudo a2enmod php7 sudo systemctl restart apache2
Создайте файл test.php в корневом каталоге документов.
sudo nano /srv/www/htdocs/test.php
Вставьте следующий код PHP в файл.
<?php phpinfo(); ?>
Сохраните и закройте файл. Теперь в адресной строке браузера, введите server-ip-address/test.php. Замените sever-ip-addressс текущим IP- адресом. Если вы будете следовать этим учебным пособием на локальном компьютере, а затем введите 127.0.0.1/test.php или localhost/test.php.
Вы должны увидеть PHP информацию вашего сервера. Это означает, что обработка PHP работает.
Для безопасности вашего сервера, вы должны удалить файл test.php сейчас.
PhpMyAdmin является веб-инструмент администрирования MySQL/MariaDB. Если вы не хотите администрировать MariaDB из командной строки, то вы можете установить PhpMyAdmin с командой ниже.
sudo zypper install phpMyAdmin
Менеджер пакетов Zypper автоматически установит необходимые расширения PHP7 для вас. После его установки, перезапустите Apache, чтобы включить эти расширения PHP7.
sudo systemctl restart apache2
После этого вы можете посетить веб-интерфейс PhpMyAdmin с помощью
your-server-ip/phpMyAdmin
или
localhost/phpMyAdmin
И войти в MariaDB с корневым паролем.
Поздравляю! Вы успешно установили Apache, MariaDB и PHP7 на OpenSUSE 42.2 Leap.
Утилита tcpdump — это очень мощный и популярный инструмент для перехвата и анализа сетевых пакетов. Она позволяет просматривать все входящие и исходящие из определенного интерфейса пакеты и работает в командной строке. Конечно, вы могли бы пользоваться Wirshark для анализа сетевых пакетов, это графическая утилита, но иногда бывают ситуации когда нужно работать только в терминале.
Tcpdump ничем не хуже Wireshark, и имеет все необходимые возможности для анализа пакетов, к тому же вы можете сохранить все перехваченные пакеты в файл, чтобы анализировать их потом с помощью того же самого Wireshark. В этой статье мы рассмотрим как пользоваться tcpdump для перехвата сетевых пакетов.

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