Дафтер http://dafter.ru ru letter@dafter.ru (http://dafter.ru) letter@dafter.ru (http://dafter.ru) http://dafter.ru http://dafter.ru Мерцание/мигание курсора в Ubuntu 14.04 http://dafter.ru/duf/howto/167.html http://dafter.ru/duf/howto/167.html grigor немного меньше.

Читать дальше]]>
Fri, 20 Jun 2014 20:15:11 +0400 Ubuntu 14.04 LTS
Пишем многопоточный скрипт на bash http://dafter.ru/duf/howto/130.html http://dafter.ru/duf/howto/130.html peregrine bash и присутствует утилита GNU parallel. Пользователи Windows могут тоже найти здесь что-то интересное, но они должны учитывать отличия bash скриптов от bat файлов. Статья рассчитана на начинающих, но не на полных новичков, потому элементарные вещи, такие как получение имён и путей файлов подробно рассматриваться не будут. Я лишь кратко напомню о них. Для примера напишем скрипт, оптимизирующий изображения для интернет страничек и удаляющий из них всю лишнюю информацию, такую, как EXIF. Возможно есть более удобные способы написания такого скрипта, но мне они не известны, если Вы знаете, как написать скрипт лучше (сохранив при этом совместимость с Linux), выложите вашу версию в комментариях, я обязательно посмотрю её. Скрипт проверялся только на трёх Linux дистрибутивах: Ubuntu 13.04, Ubuntu 13.10 и Gentoo. Сжатие изображений без потери качества — дело медленное, потому разумно запустить конвертирование в несколько потоков, что даёт значительный прирост (кратный количеству ядер процессора) на многопроцессорных и многоядерных системах. Сразу оговорюсь, что инструменты, которыми я буду пользоваться однопоточные, потому мы будем запускать одновременно несколько процессов обработки (по одному на каждый файл, но в то же время так, чтоб их не было больше, чем доступных машине ядер процессора, GNU Parallel без нас «знает» сколько ядер процессора у нашего ПК и в этом примере нагрузит их все). Вот собственно код скрипта:
#!/bin/bash
opt_optipng ()
{
	input="$1"
	echo "Обрабатывается: (optipng) $input"
	optipng -o3 "$input" >/dev/null 2>&1
}

opt_advpng ()
{
	input="$1"
	echo "Обрабатывается (advpng): $input"
	advpng -z -4 "$input">/dev/null 2>&1
}

opt_advdef ()
{
	input="$1"
	echo "Обрабатывается (advdef): $input"
	advdef -z -4 "$input">/dev/null 2>&1
}

opt_jpegtran ()
{
	input="$1"
	echo "Обрабатывается: $input"
	jpegtran -optimize -progressive -copy none -outfile "$input" "$input" 2>&1
}

opt_gifsicle ()
{
	input="$1"
	echo "Обрабатывается (gifsicle): $input"
	gifsicle --batch --optimize=3 "$input" >/dev/null 2>&1
}

SIZEPNG=$(find . -type f \( -iname '*.png' -o -iname '*.PNG' \) -printf '%s\n' | awk '{SUM+=$1} END {print SUM}');
SIZEGIF=$(find . -type f \( -iname '*.gif' -o -iname '*.GIF' \) -printf '%s\n' | awk '{SUM+=$1} END {print SUM}');
SIZEJPG=$(find . -type f \( -iname '*.JPG' -o -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.JPEG' \) -printf '%s\n' | awk '{SUM+=$1} END {print SUM}')
SIZE=$[SIZEPNG+SIZEGIF+SIZEJPG]

export -f opt_optipng
find  -type f | cut -c 3- | grep -ie '.png$' | sort | parallel opt_optipng '{}'
export -f opt_advpng
find  -type f | cut -c 3- | grep -ie '.png$' | sort | parallel opt_advpng '{}'
export -f opt_advdef
find  -type f | cut -c 3- | grep -ie '.png$' | sort | parallel opt_advdef '{}'
export -f opt_jpegtran
find  -type f | cut -c 3- | grep -e '.JPG$' -e '.jpg$' -e '.jpeg$' -e '.JPEG$' | sort | parallel opt_jpegtran '{}'
export -f opt_gifsicle
find  -type f | cut -c 3- | grep -ie '.gif$' | parallel opt_gifsicle '{}'

echo "Готово!"
SIZEPNG2=$(find . -type f \( -iname '*.png' -o -iname '*.PNG' \) -printf '%s\n' | awk '{SUM+=$1} END {print SUM}');
SIZEGIF2=$(find . -type f \( -iname '*.gif' -o -iname '*.GIF' \) -printf '%s\n' | awk '{SUM+=$1} END {print SUM}');
SIZEJPG2=$(find . -type f \( -iname '*.JPG' -o -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.JPEG' \) -printf '%s\n' | awk '{SUM+=$1} END {print SUM}')
SIZE2=$[SIZEPNG2+SIZEGIF2+SIZEJPG2]
if [ $SIZEPNG ]; then
	PERCENTPNG=$[100-SIZEPNG2*100/SIZEPNG]
fi
if [ $SIZEGIF ]; then
	PERCENTGIF=$[100-SIZEGIF2*100/SIZEGIF]
fi
if [ $SIZEJPG ]; then
	PERCENTJPG=$[100-SIZEJPG2*100/SIZEJPG]
fi
if [ $SIZE ]; then
	PERCENT=$[100-SIZE2*100/SIZE]
	echo "Исходный размер всех обрабатываемых файлов был $SIZE байт а после обработки составил $SIZE2 байт. Среднее сжатие на $PERCENT%
Из них:"
fi
if [ $SIZEPNG ]; then
	echo "PNG: было: $SIZEPNG байт, стало $SIZEPNG2 байт, сжалось на $PERCENTPNG%"
fi
if [ $SIZEGIF ]; then
	echo "GIF: было: $SIZEGIF байт, стало $SIZEGIF2 байт, сжалось на $PERCENTGIF%"
fi
if [ $SIZEJPG ]; then
	echo "JPG: было: $SIZEJPG байт, стало $SIZEPJPG байт, сжалось на $PERCENTJPG%"
fi

Теперь более детально разберём структуру скрипта и его работу:
Скрипт состоит из 5 функций, выполняющих различные оптимизации изображений при помощи программ optipng, AdvanceCOMP, jpegtran и gifsicle. Подробно разбирать их параметры мы не будем, для этого есть man-ы. Скажу, что на текущий момент такое их использование даёт наиболее сильное сжатие, какого мне удалось добиться. Поиск файлов в директориях осуществляется при помощи команды find, find. -type f означает, что искать будем в директории, откуда запущен скрипт и только файлы, а не каталоги и ссылки. Командой sort выполняется сортировка, можно обойтись и без неё, но так вывод скрипта во время работы получается более удобным и информативным. Про echo, grep, cut и awk можете почитать самостоятельно, благо информации по их использованию на русском языке в сети достаточно много и ничего сложного в них нет. Теперь пару слов о функциях:
opt_optipng ()
{
	input="$1"
	echo "Обрабатывается: (optipng) $input"
	optipng -o3 "$input" >/dev/null 2>&1
}

Это функция, код её очень прост. В качестве переменной $input она принимает первый аргумент, с которым её запустили, в нашем скрипте за это отвечает следующий код:
find  -type f | cut -c 3- | grep -ie '.png$' | sort | parallel opt_optipng '{}'

фигурные скобки {} требуются для GNU Parallel, именно там происходит «вставка» аргументов со стандартного ввода, а в нашем случае поступивших через пайп. Осталось обратить ваше внимание на последний, но очень важный момент. Перед запуском функции через GNU Parallel мы должны сделать её видимой для скрипта, как внешнюю команду. (GNU Parallel разрабатывался именно для запуска внешних программ в несколько потоков) Для этого служит строка
export -f opt_optipng

Названия для функции в таком случае надо выбирать такое, чтоб оно не совпадало со стандартными командами, такими как cat, grep, sed и т.д., во избежание недоразумений. После завершения скрипта, экспортированные командой export -f функции будут недоступны и не вызовут никаких проблем (новые команды терминала не появятся).

Надеюсь, кто-нибудь найдёт этот материал полезным. В случае, если Вы найдёте ошибки в статье, не стесняйтесь, зарегистрируйтесь (или войдите на сайт при помощи OpenID или социальных сетей) и напишите о моих ошибках в комментариях, я постараюсь их исправить.]]>
Tue, 18 Feb 2014 00:08:09 +0400 BASH Linux Unix *nix скрипты многопоточный скрипт очередь заданий параллельные вычисления
Прогресс бар как на YouTube без плагинов http://dafter.ru/duf/howto/128.html http://dafter.ru/duf/howto/128.html grigor
Добрый день, дорогие друзья! Сегодня я хочу показать свой небольшой код, который создает прогресс бар загрузки страницы вверху. Точно такой же эффект мы можем увидеть на YouTube, и он отлично там смотрится. Будем использовать HTML, CSS и библиотеку JQuery.

Пример доступен здесь.
UPD: Пример больше не работает, смотрите на YouTube


Приступим!]]>
Fri, 14 Feb 2014 18:39:22 +0400 Jquery YouTube прогресс бар
Как это сделано на Дафтере #2: случайная новогодняя картинка в шапке http://dafter.ru/duf/howto/119.html http://dafter.ru/duf/howto/119.html grigor Новый Год

Читать дальше]]>
Sun, 29 Dec 2013 15:42:46 +0400 Новый Год случайное изображение в шапке js случайная картинка как ВКонтакте
Как это сделано на Дафтере #1: Панель "наверх" слева http://dafter.ru/duf/howto/109.html http://dafter.ru/duf/howto/109.html grigor Codepen - удобная среда для ваших экспериментов
Интересное: в качестве cms используется LiveStreet у нас. Для нее есть плагины, но мы стараемся не использовать их. Какого же было удивление, когда даже для кнопки вверх был найден плагин! Интересно, это действительно так трудно?..

Так что там с панелькой?]]>
Tue, 03 Dec 2013 19:52:06 +0400 dafter дизайн панель наверх кнопка наверх как вконтакте
Загрузка FreeBSD через GRUB http://dafter.ru/duf/howto/83.html http://dafter.ru/duf/howto/83.html grigor
Однажды я решил установить на попавшийся под руку компьютер 8 популярных дистрибутивов Linux и одну FreeBSD. Да, вот так оригинально. Последней установил Ubuntu, т.к. она замечательно определила все 7 остальных установленных дистрибутивов и добавила необходимые строчки в GRUB (мне было лень возиться самому, вспоминая, на какой раздел что я установил). Но это не главное.

Осталось только добавить в GRUB пару строчек для загрузки FreeBSD.

menuentry "FreeBSD" {
root (hd0,a)
kernel /boot/loader
}


Но не тут-то было — у меня стоял GRUB 1.98, который ругался на команду kernel:

error: unknown command `kernel'.


Тогда я попробовал загрузить шнягу наподобие windows:

set root=(hd0,a)
chainloader +1


Но тут мне показалась другая ошибка:

error: invalid signature


После довольно продолжительного поиска, я нашел такой способ:

set root=(hd0,a)
freebsd /boot/loader


Но и тут меня ждала неудача :(

error: unknown command `freebsd'.


И лишь в четвертый раз все получилось — когда в консоль GRUB я ввел следующие строки, пошла загружаться Фря.

set root=(hd0,a)
kfreebsd /boot/loader
boot


Т.е. команды freebsd нет, есть kfreebsd. Необычно.

А в сам конфиг Grub'а ( /boot/grub/grub.cfg) нужно добавить следующее:

menuentry "FreeBSD" {
set root=(hd0,a)
kfreebsd /boot/loader
}


Такой вариант подходит для GRUB 1.98, для остальных — не знаю, с GRUB2 я дел особо не имел и не собираюсь, т.к. привычный grub 0.97 на моих рабочих компьютерах выполняет все необходимое и смысла пробовать что-то другое пока нет :)

Если вы не знаете, какой раздел указывать для загрузки, то определить его можно простым перебором. Включаете компьютер, дожидаетесь появления меню Grub, жмете C, попадаете в его командную консоль и смотрите, где что:

grub> root (hd0,0)
error: no such partition
grub> root (hd0,3)
(hd0,3): Filesystem is ext2
grub> root (hd0,1)
(hd0,3): Filesustem is unknown
grub> root (hd0,a)
(hd0,a): Filesystem is ufs2


Вот на ufs2, скорее всего, и стоит FreeBSD. Надеюсь, что кому-то удалось помочь, удачи!]]>
Fri, 11 Oct 2013 19:07:32 +0400 FreeBSD Ubuntu Grub kernel
Яндекс.Диск через WebDAV http://dafter.ru/duf/howto/66.html http://dafter.ru/duf/howto/66.html SEVENID Клиент Яндекс Диска для… Ubuntu Linux — это, конечно, хорошо. Но лично меня такой вариант не устраивает:
  • Приходится хранить файлы и на компьютере и на серверах Яндекса.
  • Если что-то в их клиенте глюканёт мы останемся и без локальных копий и без копий на серверах.
  • (ТруЪ линуксоиды не оценят) Отсутствие GUI.
Я пользовался Я.Диском и до их супер-клиента. И был доволен. Как?
Об этом подробнее...]]>
Wed, 28 Aug 2013 22:27:25 +0400 WebDAV Яндекс диск Яндекс Linux
Раздаем Wi-Fi через Ubuntu http://dafter.ru/duf/howto/62.html http://dafter.ru/duf/howto/62.html grigor
Читать дальше]]>
Wed, 21 Aug 2013 13:24:02 +0400 ap-hotspot Ubuntu Wi-Fi роутер точка доступа Windows
Ставим Tiny Tiny RSS (tt-rss) сервер (nginx, php и mysql) http://dafter.ru/duf/howto/59.html http://dafter.ru/duf/howto/59.html SEVENID ПредысторияЯ очень любил Google Reader (RSS агрегатор) и использовал его постоянно. Но, к сожалению, Google решил закрыть сей полезный сервис. Тогда я начал искать альтернативы и наткнулся на Tiny Tiny RSS (tt-rss). Это open-source RSS агрегатор, написанный на PHP. Он действительно неплох, но есть один изъян: тормозящий JavaScript. Впрочем, я буду пользоваться своим Android-смартфоном для чтения и для него есть соответствующие, более быстрые, интерфейсы к tt-rss. (Для iPhone, вроде, тоже есть аналоги)
Я ставлю на Raspberry Pi с дистрибутивом Raspbian Server Edition.
Читать дальше]]>
Fri, 09 Aug 2013 16:39:40 +0400 перевод Raspberry Pi rss сервер
Поднимаем I2P-роутер на Raspberry Pi http://dafter.ru/duf/howto/55.html http://dafter.ru/duf/howto/55.html SEVENID ПредысторияRaspberry Pi сферический в вакууме.
Raspberry Pi — маленький, малопотребляющий и относительно недорогой компьютер на ARM.
Читать дальше]]>
Mon, 29 Jul 2013 19:31:26 +0400 Raspberry Pi I2P ARM Java
Собираем компьютер, часть 1: что из чего http://dafter.ru/duf/howto/36.html http://dafter.ru/duf/howto/36.html grigor
Хочу приступить немедленно!]]>
Tue, 28 May 2013 13:34:13 +0400 Собрать компьютер видеокарта системный блок
Инструкция по джейлбрейку iOS 6.1 http://dafter.ru/duf/howto/12.html http://dafter.ru/duf/howto/12.html grigor
  • iPhone 5
  • iPhone 4S
  • iPhone 4
  • iPhone 3GS
  • iPad 4
  • iPad 3
  • iPad 2
  • iPad mini
  • iPod touch 5G
  • iPod touch 4G
  • Apple TV 2G

Что нужно сделать?]]>
Sat, 20 Apr 2013 12:10:47 +0400 apple iOS джейлбрейк iPhone iPad iPod Apple TV