Блог Вячеслава Волкова

Тому, что действительно нужно знать, никто не научит.

— Оскар Уайльд

Раздел блога / Мини советы

Как проверить открытые порты в linux

Для того, что бы посмотреть открытые используемые порты в linux, можно воспользоваться командой sudo netstat -tlnp

[root@my-host ssh]# sudo netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      18910/nginx         
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      13322/sendmail      
tcp        0      0 0.0.0.0:443                 0.0.0.0:*                   LISTEN      18910/nginx         
tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      18935/php-fpm       
tcp        0      0 127.0.0.1:3306              0.0.0.0:*                   LISTEN      27774/mysqld        
tcp        0      0 127.0.0.1:11211             0.0.0.0:*                   LISTEN      13185/memcached     
tcp        0      0 0.0.0.0:2221                0.0.0.0:*                   LISTEN      27911/sshd          
tcp        0      0 :::2221                     :::*                        LISTEN      27911/sshd

JSON Сериализация класса php с помощью JsonSerializable

Очень часто возникает ситуация когда необходимо сериализовать тот или иной класс в JSON представление по определенным правилам.

Например, мы можем это сделать с помощью такой конструкции.
<?php
class Test {
	public $a = 'A';
	public $b = 'B';
}

$b = new Test();
echo json_encode($b);
?>

На выходе мы получим вот такой результат:
{"a":"A","b":"B"}

Но как быть, например, если у класса у нас есть приватные или продектед свойства, а при сериализации они все равно должны быть видны. Например, вот такой пример:
<?php
class Test {
	protected $a = 'A';
	protected $b;
}

$b = new Test();
echo json_encode($b);

На выходе мы получим просто пустой объект {}.

Для исправления этой проблемы в PHP существует интерфейс JsonSerializable, который и позволяет нам сериализовать класс по каки-то условиям. Например,
<?php
class Test implements JsonSerializable {
	protected $a = 'A';
	protected $b = true;
	public function jsonSerialize() {
		$result = array(
			'value' => $this->a,
			'result' => $this->b
		);
		return $result;
	}
}
$b = new Test();
echo json_encode($b);
?>

Нам нужно лишь реализовать метод jsonSerialize. Теперь на выходе у нас будет вот такой результат:
{"value":"A","result":true}

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

И базовый класс модели сериализации выглядит уже вот так.
<?php namespace App\Model;
class BaseJsonModel extends Base implements \JsonSerializable {
	public function __construct() {
		parent::__construct();
	}
	public function jsonSerialize() {
		$reflect = new \ReflectionClass($this);
		$props   = $reflect->getProperties(\ReflectionProperty::IS_PUBLIC | \ReflectionProperty::IS_PROTECTED);
		$result = array();
		foreach($props as $item) {
			$name = $item->getName();
			$result[$name] = $this->$name;
		}
		return $result;
	}
	public function __toString() {
		return json_encode($this->jsonSerialize(), JSON_UNESCAPED_UNICODE);
	}
}

Установка bower компонентов через https:// вместо git://

Большинство компонентов которые устанавливаются через Bower, например, пытаются произвести загрузку через get:// протокол, а он работает по порту 9418. Если у вас установлен фаервол который закрывает этот порт, то само собой загрузить ничего не получится.

Поэтому существует специальная настройка конфигурации которая позволяет загружать компоненты по https протоколу.  Для этого в консоли вашей ОС выполните следующую строку.
git config --global url.https://.insteadOf git://

Сортировка DOM элементов с jQuery

Очень часто может возникнуть ситуация когда необходима сортировка html элементов в DOM с помощью javascript.

Для решения данной задачи можно воспользоваться встроенной функцией sort.

Например, у нас есть вот такой неупорядоченный список.
<button class="sort-elements">Сортировать</button>

<div class="sorting">
    <ul class="elements">
        <li>Элементы</li>
        <li>Для</li>
        <li>Проверки</li>
        <li>Сортировки</li>
        <li>На</li>
        <li>jQuery</li>
    </ul>
</div>

Для его сортировки можно использовать следующий метод
$('.sort-elements').click(function(){
    var $elements = $('.elements li');
    var $target = $('.sorting ul');
    
    $elements.sort(function (a, b) {
        var an = $(a).text(),
            bn = $(b).text();
        
        if (an && bn) {
            return an.toUpperCase().localeCompare(bn.toUpperCase());
        }
        
        return 0;
    });
    
    $elements.detach().appendTo($target);
});

Или вот здесь можно посмотреть рабочий пример сортировки.

Как сменить значения двух столбцов в mysql

Очень часто мы можем ошибиться при внесении данных в БД mysql, например, такое часто может возникнуть когда вы спутаете параметры широты или долготы. Что бы быстро сменить значения двух столбцов в БД вам пригодится вот такой простой запрос который меняет значения и для NULL столбцов тоже.
UPDATE swap_test SET x=(@temp:=x), x = y, y = @temp;

Ошибка «upstream sent too big header» при установке xdebug в symfony 2

После установки xdebug и запуске DEV environment в Symfony 2 можно получить ошибку Bad Gateway. В логах nginx можно найти следующую ошибку:
upstream sent too big header while reading response header from upstream

Для ее исправления необходимо увеличить параметры в конфигурации виртуального хоста Nginx.
fastcgi_buffer_size 32k;
fastcgi_buffers 4 32k;

В итоге получаем вот такой конфиг:
location ~ ^/(app|app_dev|config)\.php(/|$) {
          fastcgi_buffer_size 32k;
          fastcgi_buffers 4 32k;
          fastcgi_pass    unix:/tmp/site.sock;
          fastcgi_split_path_info ^(.+\.php)(/.*)$;
          include fastcgi_params;
          fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
          fastcgi_param  HTTPS off;
        }

wordpress: get_the_content() с форматированием

Если вы пользовались функцией get_the_content(), то замечали, что она возвращает данные в не форматированном виде. Функция the_content() же возвращает форматированные данные.
<?php echo get_the_content(); ?>
<?php the_content(); ?>

Для того, что бы функция get_the_content() возвращала форматированные данные, к ней необходимо применить фильтр the_content. Для этого напишем свою функцию get_formatting_content() и поместим ее в файл "functions.php".
function get_formatting_content ($more_link_text = '(more...)', $stripteaser = 0, $more_file = '') {
	$content = get_the_content($more_link_text, $stripteaser, $more_file);
	$content = apply_filters('the_content', $content);
	$content = str_replace(']]>', ']]&gt;', $content);
	return $content;
}

Как отсортировать json объект на javascript

Благодаря встроенной в javascript функции sort можно очень просто сортировать массивы
[1, 3, 9, 2].sort(function(a,b){return a-b;});
  // Returns: [1, 2, 3, 9]

UPD: Стоить заметить, что для сортировки числовых значений надо задать функциональный литерал иначе функция сортирует массив как строковые значения.

Но как быть, когда нам пришел json объект с произвольными данными и нам надо отсортировать его по какому-то из значений, например, "цене товара" или "времени добавления" ?

Для этого в javascript в функцию sort можно передать функцию сортировки. Вот пример, как можно сортировать json объект на javascript
[
  { name: "Клиент 1", price: 2000 },
  { name: "Клиент 2", price: 1000 },
  { name: "Клиент 5", price: 1200 },
  { name: "Клиент 3", price: 3000  }
].sort(function(obj1, obj2) {
  // Сортировка по возрастанию
  return obj1.price-obj2.price;
});

Для обратной сортировки можно поменять местами первый и второй объект
[
  { name: "Клиент 1", price: 2000 },
  { name: "Клиент 2", price: 1000 },
  { name: "Клиент 5", price: 1200 },
  { name: "Клиент 3", price: 3000  }
].sort(function(obj1, obj2) {
  // Сортировка по убыванию
  return obj2.price-obj1.price;
});

UPD: Сортировка массива объектов по строкам
[
  { name: "Бананы", price: 2000 },
  { name: "Сливы", price: 1000 },
  { name: "Тыква", price: 1200 },
  { name: "Ананасы", price: 3000  }
].sort(function(obj1, obj2) {
  if (obj1.name < obj2.name) return -1;
  if (obj1.name > obj2.name) return 1;
  return 0;
});

jQuery outerHTML или как получить html содержимое jQuery объекта

Очень часто мы создаем html объекты в jQuery и еще чаще нам необходимо получать готовую строку html его содержимого. Но возникает небольшая проблема, что при вызове метода html() мы получаем не все содержимое, а дочернего элемента. Что бы избежать этого и получать весь нужный html напишем небольшой плагин для jQuery. Узнать больше »
Страница 1 из 212