Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode

Мозаика из фотографий с помощью convert (ImageMagick)

Из фотографий или картинок одинакового размера можно сделать мозаику. Получается интересный эффект.

Для этого я написал два bash-скрипта.

Первый уменьшает размеры фотографий, второй делает из миниатюр мозаику.

Скрипт для уменьшения фотографий

#!/bin/bash

SW=150
SH=150
FROMDIR="fromdir"
TODIR="todir"

for name in $(ls $FROMDIR); do
  convert -resize ${SW}x${SH} -strip $FROMDIR/$name $TODIR/$name
done

Здесь:

  • SW — ограничение ширины миниатюры;
  • SH — ограничение высоты миниатюры;
  • FROMDIR — каталог, в котором находятся фотографии;
  • TODIR — каталог, в который будут сложены миниатюры.

Скрипт для создания мозаики из миниатюр

#!/bin/bash

SW=150
SH=112
COLS=15
REZFILE="mosaic-`date "+%Y-%m-%d_%H_%M_%S"`.jpg"
FDIR="small"

(
echo "convert $(i=0 && for name in $(ls $FDIR | sort -R); do echo -n " -page +$[($i%$COLS)*$SW]+$[(($i-$i%$COLS)/$COLS)*$SH] $FDIR/$name"; i=$[$i+1]; done) -mosaic $REZFILE"
)

Здесь:

Read full post gblog_arrow_right

Установка Redis via unix.socket

О том, как установить Redis в качестве сервера на Linux и обращаться к нему через Unix.socket

По мотивам куцей доки: http://redis.io/topics/quickstart и http://redis.io/download

От рута делаем:

mkdir /usr/src/redis
cd /usr/src/redis
wget http://redis.googlecode.com/files/redis-2.4.4.tar.gz
tar xzf redis-2.4.4.tar.gz
cd redis-2.4.4
make && make test

Если тесты прошли нормально (должно быть написано что-то вроде этого: “\o/ All tests passed without errors!”), то двигаемся дальше.

Read full post gblog_arrow_right

Библиотека для загрузки фотографий на сайт

transImage — это PHP библиотека для простой загрузки фотографий на сайт.

Она умеет:

  • Получать изображение из файла, автоматически нормализовать его размер для экономии памяти
  • Автоматически поворачивать исходное изображение по данным Exif
  • Создавать копии себя с изменёнными размерами, изменять свой размер
  • Наносить водяные знаки. Поддерживает любые водяные знаки, соответствующие интерфейсу waterMark (см. код)
  • Выводить результат клиенту или сохранять его в файловую систему
  • Подкладывать белый фон, если исходное изображение поддерживает прозрачность
  • Быстро создавать миниатюру для предпросмотра, используя миниатюру из Exif
  • Преобразовывать изображения в строку для использования их с data:URI. В этом случае небольшие изображения можно передавать с другими параметрами в формате JSON (при использовании Ajax)

Для более подробной информации смотрите комментарии в коде.

Read full post gblog_arrow_right

Замена салонного фильтра на Fiat Albea

Для замены салонного фильтра понадобятся:

  • фильтр
  • крестовая отвертка
  • фонарик
  • тряпка под коленки
  • хорошая погода

Операция занимает 15 минут. Перед входом со стороны переднего пассажира лучше бросить тряпку, потому что, чтобы добраться до фильтра, придётся встать на колени и залезть под бардачок.

Салон Fiat Albea, вид на место установки фильтра

Вид под бардачком, где расположен салонный фильтр

Фильтр находится под бардачком.

Расположение фильтра крупным планом

Крышка фильтра

Read full post gblog_arrow_right

Рыбацкие снасти из Китая

Сегодня наконец-то пришла моя рыбацкая посылка из Гонконга.

Посылка из Гонконга

А именно, сделал небольшой пробный заказ на китайском сайте focalprice.com.
До этого заказывал только на dealextreme.com.

Заказывал:

  1. Воблер
  2. Набор воблеров
  3. Набор виброхвостов
  4. Доставалку крючка из щучьей пасти

Шло около месяца, хотя я надеялся, что придет быстрее. Рыболовный сезон откроется не скоро, но тем не менее стоит учитывать. Отправили на следующий день после заказа — это, безусловно, плюс. В делекстриме бывает, что по две недели ждёшь отправки.

Read full post gblog_arrow_right

php Cacher

Опубликовал набор классов для кеширования:
http://github.com/valmat/Cacher
Опубликовано под лицензией
GPL v.3 (http://www.gnu.org/licenses/gpl.txt)
То есть свободно для использования и изменения. Разумеется, приветствуются любые исправления и дополнения.

Назначение

Мне нужен был очень простой, но в то же время мощный кеширующий модуль с понятной логикой. При этом он должен быть пригодным для работы на односерверном, но в то же время нагруженном проекте.

Read full post gblog_arrow_right

define vs const в PHP

Как известно, при разработке крупных веб-приложений помимо архитектуры постоянно приходится задумываться также и о производительности. Этим постом я хотел бы открыть серию публикаций по тестированию PHP на производительность.

Речь пойдет о сравнении способов хранения констант в приложении на PHP.
А именно сравниваются два подхода:

define('CONST1', 'val11');
define('CONST2', 'val12');
define('CONST2', 'val13');

и

class Consts {
    const CONST1 = 'val1';
    const CONST2 = 'val2';
    const CONST3 = 'val3';
}

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

Read full post gblog_arrow_right

PHP Counter

Выложил на github.com свой класс Counter.

В основном сделал это, чтобы потестить сам GitHub.

Адрес страницы на гитхабе: http://github.com/valmat/MC_Counter

Как использовать

Класс Counter — это образец реализации счетчика на memcache.

Можно построить другие реализации на общем интерфейсе.
Сохранение результатов применения значений счетчика осуществляется по заданному числу.
Можно реализовать сохранение по заданному интервалу времени.

  • Конструктор принимает три аргумента: ключ, имя слота и идентификатор для инициализации слота.
  • Для чего это сделано: инкремент счетчика должен быть очень быстрой операцией.
  • Не целесообразно тратить время и системные ресурсы на создание объектов, которые не будут использованы.
  • Поэтому передается только имя класса слота, который создается только в случае необходимости.
  • К таким случаям относится обмен данными между локальным и постоянным хранилищем счетчика.
  • Слоты необходимы, так как Counter не может знать о способе хранения данных в постоянном хранилище и путях доступа к ним.
  • Для предотвращения состояния гонки необходим механизм блокировок.
  • При наличии блокировки процессы, не получившие эксклюзивные права на получение данных, будут писать во временное хранилище, а процесс, установивший блокировку, по окончании своей работы инкрементирует счетчик данными из временного хранилища.
  • При сбросе данных в постоянное хранилище по условию достижения кратности значения счетчика ($this->Val % $this->upd_delim), блокировка не требуется, так как в этом случае (при достаточно большом значении $this->upd_delim) в текущий момент времени только один процесс приходит к необходимости сброса данных.

Пример использования

$cnt = new Counter('anykey', 'AnySlot', 15);
echo $cnt->increment();
echo $cnt->get();
echo $cnt->set(11);

Восстановление удалённых и повреждённых данных в Linux

Когда-то давно, лет десять назад, случалось мне отформатировать раздел жёсткого диска под Windows. На диске была важная информация, поэтому встала задача данные восстановить. Помню, путём продолжительного гугления были найдены несколько замечательных программ и кряков к ним. И данные были, хоть и частично, но восстановлены. Назывались эти программы, вроде бы, Easy Recovery, Recover4All и какая-то ещё.

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

Read full post gblog_arrow_right