avatar
+1.14
7 подписчиков, 12 топиков

Мерцание/мигание курсора в Ubuntu 14.04

Совсем короткая заметка. На днях у меня полетела Windows 8.1 из-за драйвера для Intel HD Graphics. История темная, поэтому углубляться не буду. Решил в очередной раз перелезть на что-нибудь из семейства linux. Поскольку различные OpenSuse и другие вариации систем с .rpm пакетами мне наскучили, а Linux Mint мне не позволяет поставить религия, выбор пал на Ubuntu 14.04. Особенно порадовало, что это LTS релиз, а значит, что багов немного меньше.

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

Пишем многопоточный скрипт на bash

Скажу сразу, что топик посвящён только пользователям *nix систем, в которых есть 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 или социальных сетей) и напишите о моих ошибках в комментариях, я постараюсь их исправить.

Прогресс бар как на YouTube без плагинов


Добрый день, дорогие друзья! Сегодня я хочу показать свой небольшой код, который создает прогресс бар загрузки страницы вверху. Точно такой же эффект мы можем увидеть на YouTube, и он отлично там смотрится. Будем использовать HTML, CSS и библиотеку JQuery.

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


Приступим!

Как это сделано на Дафтере #2: случайная новогодняя картинка в шапке

Добрый день, друзья! Совсем скоро наступит Новый Год и все к нему готовятся, в том числе и сайты. Есть разные варианты украшений: снег, новогодний логотип… Но мы (как и всем известный ВКонтакте) решили добавить рандомное/случайное изображение около названия в шапке. О том, как мы это сделали, речь и пойдет.
Новый Год

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

Как это сделано на Дафтере #1: Панель "наверх" слева

Добрый день, уважаемые пользователи Дафтера. Этот топик начнет серию небольших туториалов и описание изменений, которые мы постепенно проводим на Дафтере. Все планы будущих обновлений раскрывать не будем, все узнаете по порядку. Хотя очень маленькие изменения уже были (полностью переработана шапка, эффекты плавности, новые шрифты), будем рассматривать побольше.
Codepen - удобная среда для ваших экспериментов
Интересное: в качестве cms используется LiveStreet у нас. Для нее есть плагины, но мы стараемся не использовать их. Какого же было удивление, когда даже для кнопки вверх был найден плагин! Интересно, это действительно так трудно?..

Так что там с панелькой?

Загрузка FreeBSD через GRUB

FreeBSD
Однажды я решил установить на попавшийся под руку компьютер 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. Надеюсь, что кому-то удалось помочь, удачи!

Яндекс.Диск через WebDAV

Клиент Яндекс Диска для… Ubuntu Linux — это, конечно, хорошо. Но лично меня такой вариант не устраивает:
  • Приходится хранить файлы и на компьютере и на серверах Яндекса.
  • Если что-то в их клиенте глюканёт мы останемся и без локальных копий и без копий на серверах.
  • (ТруЪ линуксоиды не оценят) Отсутствие GUI.
Я пользовался Я.Диском и до их супер-клиента. И был доволен. Как?
Об этом подробнее...

Раздаем Wi-Fi через Ubuntu

Наверняка вам иногда приходила в голову, что надо объединить все ваши компьютеры в одну сеть. Самый простой способ реализации этой идеи — раздавать Wi-Fi прямо с компьютера. И хотя это возможно штатными средствами Ubuntu, есть очень большой минус у этого метода. А именно — протокол AdHoc, который не поддерживается почти всеми мобильными устройствами. На помощь придет AP-Hotspot, про установку и настройку которого я сегодня расскажу.

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

Ставим Tiny Tiny RSS (tt-rss) сервер (nginx, php и mysql)

Предыстория

Я очень любил Google Reader (RSS агрегатор) и использовал его постоянно. Но, к сожалению, Google решил закрыть сей полезный сервис. Тогда я начал искать альтернативы и наткнулся на Tiny Tiny RSS (tt-rss). Это open-source RSS агрегатор, написанный на PHP. Он действительно неплох, но есть один изъян: тормозящий JavaScript. Впрочем, я буду пользоваться своим Android-смартфоном для чтения и для него есть соответствующие, более быстрые, интерфейсы к tt-rss. (Для iPhone, вроде, тоже есть аналоги)
Я ставлю на Raspberry Pi с дистрибутивом Raspbian Server Edition.
Читать дальше →