Статьи

Пакетное уменьшение изображений в консоли

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

Читать дальше

Разный chmod для файлов и каталогов

Простой способ задать раззные права доступов для файлов и каталогов внутри одной директории.

Читать дальше

CakePHP. Запуск функций Shell.

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

Для того что бы запустить код написанный с Console/Command необходимо в начале импортировать интересующий Вас класс, а потом вызвать нужную функцию.

//Console/Command/FeedShell.php
App::uses('AppShell', 'Console/Command');
class FeedShell extends AppShell {
public function main() {
//...
}
public function load($feed_id) {
//...
}
}

Далее в том месте где хотите использовать эту функцию пишем так:

App::uses('FeedShell', 'Console/Command');
$Feed = new FeedShell();
$Feed->load($this->id);

Я например это использую в модели, после сохранения записи.

Быстрая прокрутка экрана

Возникла идея по "допилу" интерфейса на тачах. Пролистывание экрана в низ до самого конца или вверх, при очень большом объёме информации занимает много времени. А что если в момент пролистывания по "энерции" появлялась бы активная область которая перемещала бы видимую область в конец или начало. Например так:

Начинаем пролистывать резко экран

home_end_1

Читать дальше

Хранение фалов конфигурации. PHP, data или JSON?

Мне стало интересно, что менее ресурсоёмко при чтение файлов конфигурации: сериализованные данные, include PHP файла или JSON. Забегая вперёд скажу, результаты теста показывают что без разницы как хранить настройки.

И так, вариант №1 include_once:

//test_include.php 
include_once 'config.php';
echo $config['var1']."\n";
echo $config['var5']."\n";
//config.php
$config = array(
  'var1' =--> 1,
  'var2' => 2,
  'var3' => 3,
  'var4' => 4,
  'var5' => 5,
  'var6' => 6,
  'var7' => 7,
  'var8' => 8,
  'var9' => 9,
  'var10' => 10
);

Вариант №2 сериализованные данные:

//test_data.php 
$config = unserialize(file_get_contents('config.data'));
echo $config['var1']."\n";
echo $config['var5']."\n";
//config.data 
a:10:{s:4:"var1";i:1;s:4:"var2";i:2;s:4:"var3";i:3;s:4:"var4";i:4;s:4:"var5";i:5;s:4:"var6";i:6;s:4:"var7";i:7;s:4:"var8";i:8;s:4:"var9";i:9;s:5:"var10";i:10;}

Вариант №3 JSON данные:

//test_json.php 
function toArray($data) {
  if (is_object($data)) $data = get_object_vars($data);
  return is_array($data) ? array_map(__FUNCTION__, $data) : $data;
}
$config = toArray(json_decode(file_get_contents('config.json')));
echo $config['var1']."\n";
echo $config['var5']."\n";
//config.json 
{"var1":1,"var2":2,"var3":3,"var4":4,"var5":5,"var6":6,"var7":7,"var8":8,"var9":9,"var10":10}

Скрипт для многократного запуска:

//test.sh 
#!/bin/bash
echo $1
i=0
while [ $i -lt 1000 ]
do
  php $1 > /dev/null 2> /dev/null
  i=$[$i+1]
done

Результаты:

$ time ./test.sh test_include.php 
test_include.php
real  0m14.026s
user  0m7.388s
sys  0m5.076s
$ time ./test.sh test_data.php 
test_data.php
real  0m14.009s
user  0m7.556s
sys  0m4.900s
$ time ./test.sh test_json.php 
test_json.php
real  0m14.104s
user  0m7.440s
sys  0m5.024s

Как я и сказал в самом начале, нет особой разницы как хранить файлы конфигурации, но я всё же считаю что более читабельный вариант это всё же PHP файлы, т.к. в них можно без труда добавить комментарии, так же в них можно объявлять константы и пользоваться уже ими.

bzip, gzip или pigz?

Навеяно статьёй "Ускорение резервирования базы данных"  из журнала "Системный администратор" за декабрь 2012 год #12(121).

Основной смысл статьи был в том что бы не сохранять предварительные данные из mysqldump в файл который будет сжиматься, а сразу сжимать поток и записывать его на диск. Я сразу заинтересовался этой статьёй, т.к. у меня на сервере то же существует так скажем лишняя нагрузка которая меня нервирует.

У себя я использую bzip2 т.к. он лучше сжимает файл, но как результат у меня бекап снимается за 13m18.770s то есть всё выгляло изначально примерно так:

mysqldump --user=dumper --password=secret db_name --single-transaction --lock-tables --quick ${work_dir}/mysql/db_name.sql
bzip2 -9 ${work_dir}/mysql/db_name.sql
#13m18.770s
Читать дальше

Изменяемое количество параметров функции в PHP

Иногда возникают случаи, что при создании функции мы заранее не можем определить сколько в неё будет передано параметров. В большинстве случаев это решается одним параметром в виде массива. Но иногда массив использовать не удобно, и нужно использовать именно параметры при вызове функции. Примером может служит функция sprintf в которой всего один параметр обязательный, но в неё может быть передано какое угодно количество дополнительных параметров. Итак, как мы это можем сделать? Для решения этой задачи нам понадобиться функция func_get_args(). Эта функция вернёт нам список всех переданных параметров. Объясню на примере:

function my_printf($msg, $args = null) {
  if ($args !== null) {
    return vsprintf($msg, array_slice(func_get_args(), 1));
  } else {
    return $msg
  }
}

В примере проверяется есть ли дополнительные аргументы и если они есть, то от списка переданных аргументов отрезается первый элемент (само сообщение) и оставшиеся аргументы передаются функции vsprintf. А если аргументов нет, то тогда просто возвращается само сообщение.

Для полноты картины приложу так же вариант описанный в самом начале, с параметрами в виде массива.

function data($params = array()) {
  $default = array(
    'param_one' => 'foo',
    'param_two' => 'bar'
  );
  $params = array_merge($default, $params);
  //...
  return $params;
}
$result = data(array('param_one' => 'other'));
print_r($result);
/*
Array
(
    [param_one] => other
    [param_two] => bar
)
*/

nginx+apache+ff=Не возможно определить тип содержимого

Дано:
  • nginx + Apach 2 (бэкграундом)
  • В одном из 3-х обновлений страниц FireFox выдает что не может отобразить содержимое.

Поиск причины оказался затруднён тем что ff не хотел при этом показывать заголовки. Но после того как я подключил TCP/IP Monitor в Eclipse, то выяснилось что дело в том что Apache разбивает свой ответ на фрагменты (Transfer-Encoding: chunked). Nginx не может принять такой ответ и в добавок ко всему ещё пытается его сжать.

И так, решение. Отключаем в Apache разбивку ответа по частям. Для этого в настройках Apache или .htaccess указываем:

SetEnv downgrade-1.0

И после этого всё начинает работать нормально.

Изменение яркости дисплея в Ubuntu

Для того что бы в Ubuntu можно было изменять яркость дисплея через клавишу Fn, нужно сделать следующее:

sudo gedit /etc/default/grub

Изменить GRUB_CMDLINE_LINUX="" на GRUB_CMDLINE_LINUX="acpi_osi=Linux" Затем,

sudo update-grub

Оригинал http://forum.ubuntu.ru/index.php?topic=147479.0

vBulletin. Создание модулей. Настройки модуля.

Когда вы расширяете функционал форума, то в большинстве случаев вам будет не хватать только программной части - бывает ещё необходимо администраторам давать хоть какие то рычаги для настройки поведения вашего модуля.

Я не смог найти как можно добавить настройки в самой панели управления при разработке модуля, но я опишу как можно добавить настройки в xml файле модуля.

И так, по мимо самой настройки, вам ещё понадобятся фразы для её отображения:

  1. Заголовок раздела настроек
  2. Название переменной
  3. Описание переменной

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

Читать дальше