Мониторим домены

Небольшой скрипт на php для мониторинга освободившихся доменов в помощь лентяям.

 

<?php

$domains = array(
    'domain1.ru',
    'domain2.ru'
);

$email = 'my@email.com';

foreach($domains as $domain)
{
    $inf = check_domain($domain);
    if(!isset($inf['free-date']))
    {
        $text = 'DOMAIN ' . $domain . ' FREE';
        mail($email,$text, $text);
    }
}

function check_domain( $domain )
{
    $curl = curl_init();
    curl_setopt( $curl, CURLOPT_URL,'r01.ru/domain/whois/check-domain.php?domain=' . $domain);
    curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
    curl_setopt($curl,CURLOPT_FOLLOWLOCATION,true);
    $result = curl_exec($curl);
    $info = array();
    $infoField = array(
        'free-date',
        // 'domain','type','descr','state','nic-hdl','person','phone','fax-no','e-mail','reg-till','created','changed', 'registrar'
    );
    foreach($infoField as $field)
    {
        preg_match('#' . $field . ': (.*)#',$result,$m);
        $info[$field] = isset($m[1]) ? strip_tags($m[1]) : '';
    }
    return $info;
}

Запускать скрипт по крону, раз в 5-10 минут.

PS Письма по-умолчанию будут падать в спам.

URL без завершающих слэшей и www

Часто бывает нужно убрать www и завершающие слэши из всех URL. Данную операцию достаточно просто выполнить при помощи кода в .htaccess

#Если вы хотите, чтобы всегда был домен с www
RewriteCond %{HTTP_HOST} ^domen\.ru
RewriteRule ^(.*)$ http://www.domen.ru/$1 [R=301,L]

#Если вы хотите, чтобы всегда был домен без www
RewriteCond %{HTTP_HOST} ^www\.domen\.ru
RewriteRule ^(.*)$ http://domen.ru/$1 [R=301,L]

#Добавить завершающий слэш
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*[^/])$ $1/ [L,R=301]

#Удалить завершающий слэш
RewriteBase /
RewriteCond %{HTTP_HOST} (.*)
RewriteCond %{REQUEST_URI} /$ [NC]
RewriteRule ^(.*)(/)$ $1 [L,R=301]

Расширение всех файлов в XML формате

Не нашел нигде список всех расширений файлов, но зато наткнулся на сайт http://open-file.ru в котором приведен весь список расширений. Решил написать небольшой скрипт, который вытянет все расширения с описаниями и типами в XML файл.

Ниже код скрипта:


<?php

set_time_limit(0);
$url = 'http://open-file.ru';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
$result = curl_exec($ch);
preg_match('~<p>(.*)</p>~',$result,$match);
preg_match_all('~<a href="(/types/.*/)">.*</a>~Us',$match[1],$match);
$extension = array();
$xml = '<?xml version="1.0" encoding="UTF-8"?>
<extensions>';
foreach( $match[1] as $link )
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, ( $url . $link ));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    $result = curl_exec($ch);
    preg_match( '~<table>(.*)</table>~Us', $result, $table );

    $reg = array(
        '~<tr><td>.*<a href="/types/.*">(.*)</a>.*</td>',
        '<td>.*<a href="/types/.*/">(.*)</a>.*</td><td>',
        '.*<a href="/types/.*">(.*)</a>.*</td></tr>~'
    );

    preg_match_all(implode($reg),$table[1],$data);
    foreach( $data[1] as $key => $ext )
    {
        $xml .= '
            <extension>
                <name><![CDATA[' . $ext . ']]></name>
                <type><![CDATA[' . $data[2][$key] . ']]></type>
                <description><![CDATA[' . $data[3][$key] . ']]></description>
           </extension>
';
   }
}

$xml .= '</extensions>';

file_put_contents('tmp/extensions.xml' , iconv( 'cp1251', 'utf8', $xml ) );

Архив со всеми расширениями файлов в формате XML: extensions.xml.zip

Скрипт для отправки обновлений на почту

Для одного проекта понадобилось высылать заказчику обновления ( pack ), так как это рутинная задача, я решил написать простой скрипт на shell:

 

#!/bin/sh 

# Мыльник куда отправляем пакет с обновлениями 
EMAIL=$1 

# Директория с проектом 
PROJECT=/var/www/my_project 

# Дата ( для заголовка письма и названия файла архива с обновлением ) 
DATE=`date +%d-%m-%Y_%H-%M` 

# Название файла архива с обновлением 
TARNAME=pack_my_project_$DATE.tgz 

# Локальная директория в которой сохраняются архивы с обновлениями 
PACK=pack/$TARNAME 

# Изменения в проекте ( git ) 
CHANGE=`cd $PROJECT && git diff --stat | awk 'NF != 7 {print $1}' && cd - > /dev/null` 

# Тема письма с архивом обновления 
SUBJECT='Обновление project от $DATE' 

# Тело письма, опционально 
BODY='' 

# Создаем архив с изменениями и отправляем письмо
cd $PROJECT && \
tar czf $PACK $CHANGE > /dev/null && \
( ( echo $BODY $CHANGE ); uuencode $PACK $TARNAME ) \ 
| mail -s "Обновление project от $DATE" $EMAIL && \
cd - > /dev/null 

в .zshrc прописываем путь к директории к скрипту и ставим разрешение на выполнение файла

Отправляем:

 $ my_project_update.sh test@gmail.com 

Сообщение с паком уйдет на почту.

TODO: Мою задачу скрипт решает полностью, но его можно доработать:
1) проверка наличия параметра $1
2) проверка, что в проекте реально есть изменения

Быстрое добавление множества директорий в .gitignore

Часто в проекте есть директория uploads/ с вложениями, содержимое в которых не нуждаются в поддержки версионности, для того чтобы не утомлять себя ручным вводом каждой директории можно воспользоваться командой:

 $ ls -l uploads | awk {'print "/uploads/"$9"/*"'} > ../.gitignore 

Дело сделано, нужные директории теперь не будут включены в репозитарий.

Ошибка ld: symbol(s) not found for architecture x86_64

При попытке собрать php-5.2.10 на macOS 10.8.2, появляется ошибка ld: symbol(s) not found for architecture x86_64.

Решить проблему можно следующем образом:

1) добавляем в Makefile строку

EXTRA_CFLAGS=-lresolv

2) меняем в ext/iconv/iconv.c

#define iconv libiconv to #define iconv iconv

После этого php собирается отлично и без проблем.

Источник: https://discussions.apple.com/thread/3507736?start=0&tstart=0

Выравнивание дива по вертикали и горизонтали

Иногда бывает нужно отцентрировать div на странице, это достаточно просто сделать через абсолютное позиционирование:

 <!DOCTYPE html> 
<html> 
<head> 
<style type="text/css"> 
div { 
background-color: #000; 
height: 500px; 
left: 50%; 
margin: -250px 0 0 -250px; 
top: 50%; 
position: absolute; 
width: 500px; 
} 
</style> 
</head> 
<body> 
<div></div> 
</body> 
</html> 

Это создаст квадрат Малевича 500×500 пикселей по центу страницы.

Видео с Youtube поверх дива с position=fixed

Столкнулся с проблемой отображения iframe с видео c Youtube поверх дива с position=fixed

Вот решение:

прописываем у ссылке на ролик get параметр wmode=transparent и заводим в фрейме новый атрибут wmode=»Opaque

<iframe title=»YouTube video player» width=»480″ height=»390″ src=»http://www.youtube.com/embed/lzQgAR_J1PI?wmode=transparent» frameborder=»0″ wmode=»Opaque»>

Решение на JS с поддержкой jquery:

$(document).ready(function()

$(‘iframe’).each(function()
var url = $(this).attr(«src»);
var char = «?»;
if(url.indexOf(«?») != -1)
var char = «&»;

$(this).attr(«src»,url+char+»wmode=transparent»);
);

);

Отрывок из книги Сергея Тормашева «Наследие»

Даже волки, преследуя стадо оленей и пожирая слабых и плохо приспособленных, убивали лишь следствие. ГМО же боролось с самой сутью проблемы — уничтожала стадо по генетическому принципу. Ты не хочешь заботиться о себе и будущем своих детей? Тебе наплевать, что происходит с планетой и какая экология тебя окружает? Тебя не интересует, что ты ешь, пьешь, вдыхаешь? У тебя не хватает мозгов заработать достаточно денег на покупку чистой пищи в магазинах МАГБ? Тогда ГМО для тебя, добро пожаловать в фаст-фуд. Ешь на здоровье, и природа вздохнет спокойно — твои дети родятся нежизнеспособными и не дадут потомства. После твоей смерти уже никто не передаст следующему поколению твои гены тупоумия и недалекости. Вот что такое естественный отбор по Уэйну! Да будет так, и так будет!

Групповое переименование файлов по маске

По долгу службы встала задача переименовать группу файлов в директории по маске ( убрать у php файлов префикс и постфикс ).
Исходные файлы вида aqNameClass.class.php нужно привести к виду NameClass.php

Решается эта задача одной командой shell:

 for i in *.class.php; do mv "$i" `echo "$i" | sed "s/\.class//" | sed "s/^aq//"`; done 

Unix – это круто =)

Монтирование SD карты с правами пользователя в arch linux

Задача:

примонтировать SD карту на 64G как дополнительный жесткий диск, чтобы не-root мог читать ее и записывать в нее.

Решение:

mount -o uid=<uid> /dev/<dev_id> /mnt/<mount_point>

где,

<uid> — id пользователя ( узнать можно командой id или посмотреть в /etc/passwd )

<dev_id> — устройство sd карты

<mount_point> — каталог в который будет примонтирована SD-карта.

в /etc/fstab добавляем опцию монтированя uid=<uid>

и всё.

Скругление углов на PHP / GD

Сегодня товарищ кинул ссылку на интересный скрипт, который позволяет округлять углы на php.
Полезная вещь. Вот код скрипта.

<?php
/**
* Углоскруглятель :)
*
* Sergey Fedotov <sergey89@gmail.com>
* Version: 1.1
*/

$filename = 'image.jpg';
$radius = 15;

/**
* Чем выше rate, тем лучше качество сглаживания и больше время обработки и
* потребление памяти.
*
* Оптимальный rate подбирается в зависимости от радиуса.
*/

$rate = 3;

$img = imagecreatefromstring(file_get_contents($filename));
imagealphablending($img, false);
imagesavealpha($img, true);

$width = imagesx($img);
$height = imagesy($img);

$rs_radius = $radius * $rate;
$rs_size = $rs_radius * 2;

$corner = imagecreatetruecolor($rs_size, $rs_size);
imagealphablending($corner, false);

$trans = imagecolorallocatealpha($corner, 255, 255, 255, 127);
imagefill($corner, 0, 0, $trans);

$positions = array(
array(0, 0, 0, 0),
array($rs_radius, 0, $width $radius, 0),
array($rs_radius, $rs_radius, $width $radius, $height $radius),
array(0, $rs_radius, 0, $height $radius),
);

foreach ($positions as $pos) {
imagecopyresampled($corner, $img, $pos[0], $pos[1], $pos[2], $pos[3], $rs_radius, $rs_radius, $radius, $radius);
}

$lx = $ly = 0;
$i = $rs_radius;
$y2 = $i;
$r_2 = $rs_radius * $rs_radius;

for (; $i <= $y2; $i++) {

$y = $i;
$x = sqrt($r_2 $y * $y);

$y += $rs_radius;
$x += $rs_radius;

imageline($corner, $x, $y, $rs_size, $y, $trans);
imageline($corner, 0, $y, $rs_size $x, $y, $trans);

$lx = $x;
$ly = $y;
}

foreach ($positions as $i => $pos) {
imagecopyresampled($img, $corner, $pos[2], $pos[3], $pos[0], $pos[1], $radius, $radius, $rs_radius, $rs_radius);
}

header(‘Content-Type: image/png’);
imagepng($img);

Шелл на PHP

Небольшая тулза на PHP+Ajax, которая позволяет выполнять shell команды.

Вот код:

<?php
if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' )
{
if(!empty($_POST['command']))
{
exec($_POST['command'], $result);
if(is_array($result)) {
foreach($result as $str)
$res[] = htmlspecialchars($str);
$res = isset($res) ? implode("<br />", $res) : '';
} else {
$res = $result;
}
echo $res;
}
exit();
}
?>

<!DOCTYPE HTML>
<html>
<head>
<title>Shell</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript">
function clear(c) {
c.attr("value", "");
}
$(document).ready(function() {
var c = $("input[name='command']");
clear(c);
c.focus(function() {
$("span").hide();
});
c.blur(function() {
$("span").show();
});
c.keyup(function(event) {
if(event.keyCode == 13)
$.post('sh.php', { command: $(this).val() }, function(data) {
$("div").html(data);
clear(c);
});
});
});
</script>
<style type="text/css">
* {background: #000; border: 0; color: green; font: 62.5% Arial, Helvetica, sans-serif; width: 100%;}
body {font-size: 1.5em; margin: 0; padding: 0;}
input {background-color: #000; font-size: 1em; width: 80%;}
div {background: #000; font-size: 1em; height: 100%;min-height: 20px;width: 90%;}
strong {color: #fff;}
hr {color: #fff; background-color: #fff; height: 1px; margin-top: 0; width: 100%;}
blink {font-size: 1.5em;}
p {
background: #fff url(http://www.catb.org/~esr/hacker-emblem/glider.png) no-repeat top right;
display: block;
height: 55px;
right: 20px;
position: absolute;
width: 55px;
}
</style>
</head>
<body>
<?php system('hostname')?>&gt;<span><blink>_</blink></span>
<input name="command" />
<hr />
<p></p>
<div></div>
</body>
</html>

И снова fluxbox

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

Для начала обнаружил, что после перехода у меня слетела возможность переключаться на русский язык.
Это показалось странным так как setxkbmap у меня запускался в .xsession, но как я понял после запуска fluxbox
любые команды прописанные в startup игнорируются, поэтому прописал

setxkbmap -layout us,ru -variant ,winkeys -option grp:caps_toggle,grp_led:scroll,terminate:ctrl_alt_bksp,compose:ralt
в файл .fluxbox/startup перед командой запуска fluxbox
exec fluxbox
Прописал так же в этом же файле запуск коньков
conky&

Туда же добавляем обои рабочего стола, закидываем обои куда-нибудь в .fluxbox/bg/ и прописываем путь к обоене. В качестве обоены я решил использовать няшку из манги с тату-логотипом арчилинукса %))
Например вот так:
fbsetbg -f bg/archMangaBabe.jpg
Название виртуальных столов в панели — «Рабочий стол <N>» смотрится уныло и слишком длинно, поэтому решил поправить название на D<N>, правится это в файле .fluxbox/init:
session.screen0.workspaceNames: D1,D2,D3,D4
Можно немного сэкономить место на экране и сделать автоскрытие тулбара
session.screen0.toolbar.autoHide: true
Так как экран на нетбуке маленький, то удобно когда в тулбаре показывается как можно больше открытых приложений, так что изменил ширину тулбара с 70 на 80

session.screen0.toolbar.widthPercent: 80
Редактим .fluxbox/menu и добавляем то что хотим видеть в меню, а так же убираем ненужные пункты, у меня получилось что-то вроде этого:

[begin] (Trinity)
[encoding] {UTF-8}
[exec] (Terminal) {terminal}
[separator]
[exec] (Mc) {mc}
[exec] (Thunar) {thunar}
[separator]
[exec] (Eclipse) {eclipse}
[separator]
[exec] (Firefox) {firefox}
[separator]
[exec] (Climm) {terminal -e climm}
[exec] (Skype) {skype}
[separator]
[exec] (Moc) {terminal -e mocp}
[exec] (Alsamixer) {terminal -e alsamixer}
[exec] (Alsa reload) {terminal -e sudo alsactl restore}
[separator]
[exec] (Gimp) {gimp}
[separator]
[submenu] (System Tools)
[exec] (top) {xterm}
[exec] (top) {xterm -e top}
[separator]
[end]
[submenu] (Fluxbox menu)
[config] (Configure)
[submenu] (System Styles) {Choose a style...}
[stylesdir] (/usr/share/fluxbox/styles)
[end]
[submenu] (User Styles) {Choose a style...}
[stylesdir] (~/.fluxbox/styles)
[end]
[workspaces] (Workspace List)
[commanddialog] (Fluxbox Command)
[reconfig] (Reload config)
[exec] (About) {(fluxbox -v; fluxbox -info | sed 1d) | xmessage -file - -center}
[end]
[separator]
[exec] (Xlock) {xlock -mode blank}
[separator]
[restart] (Restart)
[exit] (Exit)
[endencoding]
[end]

Вот что получилось :)

 

 

Няшка Arch

 

Используйте fluxbox. Всем удачи!

Скрипт добавления нового виртуального хоста

[announce]Как-то поднадоело мне постоянно редактировать вручную httpd.conf и /etc/hosts и я решил написать скрипт, который бы позволил автоматизировать этот процесс[/announce]
Вот такой скрипт:

#!/bin/sh

# Константы:
HOSTS='/tc/hosts'; # Путь к файлу hosts
HTTPD_CONF='/etc/httpd/conf/extra/httpd-vhosts.conf';

# Путь к файлу с настройками виртуальных хостов
DIR_HTTP='/srv/http/'; # Путь к директориям с хостами
IP_MASK='127.0.0.'; # Маска по которой будет формироваться новый IP
INDEX_FILE='index.php'; # Index файл в корневой папке нового виртуального хоста
DIR_LOG='/var/log/httpd/'; # Путь к папке с логами
EMAIL_ADMIN='wikide@gmail.com'; # Email админестратора

# Функция вывода ошибок
get_error() {
    echo $1;
    exit 0;
}

# Функция проверки ip
check_ip() {
    if [ "`cat $HOSTS | grep \"$ip\"`" ]; then
        echo 1;
    fi
}

# Проверяем наличея параметра с именем хоста
if [ "$1" ]; then
    if [ "$2" ]; then
        # Если задан свой IP
        new_ip=$2;
        if [ "`check_ip $new_ip`" ]; then # Проверка на наличее в файле
            get_error 'Такой ip адрес - '$new_ip' уже занят. Введите другой или пусть скрипт '$0' сам сгенерирует ip адресс для нового хоста.';
        fi;
    else
        # Получаем IP автоматически
        new_ip=$IP_MASK$((`tail -1 $HOSTS | awk '{ split($1, ip, "."); print ip[4]}'`+1));
    fi

    # Если корневая папка нового хоста уже существует
    if [ -d $DIR_HTTP$1/ ]; then
        get_error 'Директория '$1' уже есть в '$DIR_HTTP'. Подберите другое имя.';
    else
        # Создаем корневую директорию виртуального хоста
        mkdir $DIR_HTTP$1;
        echo -e "
    <html>
     <head>
      <title>New host</title>
     </head>
     <body>
        <h1>Created host '$1'!</h1>
     </body>
    </html>"
> $DIR_HTTP$1'/index.php';
  
    # Запись в hosts
        sudo echo $new_ip  $1 | sudo tee -a $HOSTS 1>/dev/null;

    # Запись в конфиг Apache
        sudo echo -e "#Create date: `date '+%F %T'`
          DirectoryIndex $INDEX_FILE
          ServerAdmin $EMAIL_ADMIN
          DocumentRoot \"$DIR_HTTP$1/\"
          ServerName $1
          ServerAlias $1
          ErrorLog \"$DIR_LOG$1.log\"
          CustomLog \"$DIR_LOG$1\" common"
| sudo tee -a $HTTPD_CONF 1>/dev/null;

        # Перезапускаем сервер
        sudo apachectl restart;

        # Выводими сообщение

        echo 'Виртуальный хост "'$1'" успешно создан'
    fi
else
    get_error 'Нужно обязательно указать название нового хоста $0 NAME_HOST [IP_HOST]';
fi

exit 0;

Zsh

[announce]Справка по zsh. Пусть будет тут на всякий случай.[/announce]

Введение

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

Zsh — командный процессор UNIX, который может использоваться как в качестве командного процессора для скриптов, так и в качестве интерактивной оболочки. Zsh обладает множеством возможностей, среди которых — настраиваемый механизм дополнений (completions), редактирование командной строки, механизм сохранения историй, встроенное исправление неправильных команд.

По возможностям Zsh наибольшее сходство имеет с ksh, но при этом еще обладает множеством расширений.

Свежие версии Zsh доступны с сервера www.zsh.org и его зеркал. Кроме этого, Zsh часто включают в состав популярных дистрибутивов Linux и других вариантов UNIX.

Запуск

Обычно Zsh указывают в качестве интерактивной оболочки для входа в систему. Но, кроме этого, Zsh можно запускать и отдельно, с разными ключами, определяющими его поведение. Например, ключ -r заставляет Zsh работать в «ограниченном» (restricted) режиме, ключ -c указывает откуда читать команды для выполнения, а ключ -i заставляет работать в интерактивном режиме.

При работе в «ограниченном» режиме запрещается выполнять некоторые действия: изменять каталог, запускать программы с помощью команды exec, перенаправлять вывод в файлы, изменять значение переменных среды, используемых при запуске программ, а также запускать программы, используя их абсолютные имена.

При запуске Zsh старается эмулировать sh или ksh в зависимости от того, под каким именем его запустили. В режиме эмуляции не исполняются обычные скрипты инициализации и завершения работы Zsh. Для инициализации используются файлы /etc/profile и $HOME/.profile

Файлы, используемые при запуске

При запуске Zsh читается некоторое количество файлов, содержащих команды инициализации. В первую очередь читается файл /etc/zshenv, затем читается файл $ZDOTDIR/.zshenv. Затем, если запускаемый процесс используется для входа в систему, то читаются файлы /etc/zprofile и $ZDOTDIR/.zprofile. Затем, если оболочка является интерактивной, читаются файлы /etc/zshrc и $ZDOTDIR/.zshrc. И наконец, если процесс используется для входа в систему, то читаются файлы /etc/zlogin и $ZDOTDIR/.zlogin.

Когда происходит выход из оболочки, использовавшейся для входа в систему, то читаются файлы $ZDOTDIR/.zlogout и затем /etc/zlogout.

Если переменная ZDOTDIR не установлена, то вместо нее используется значение переменной HOME. Файл /etc/zshenv читается при запуске любого процесса Zsh, поэтому он должен быть настолько малым, насколько это возможно.

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

Грамматика команд

Грамматика команд по большей части совпадает с грамматикой других командных процессоров семейства bourne shell, хотя имеются различные расширения, специфические для данного командного процессора. Схожесть грамматики позволяет быстро перейти к работе с использованием Zsh, и осваивать новые возможности уже в процессе его эксплуатации.

Перенаправление вывода

Zsh поддерживает такое же перенаправление вывода как и bash, но кроме этого он поддерживает множество расширений. Некоторые расширения работают только если заданы соответствующие настройки. Например, если не задана опция CLOBBER, то использование команды > для существующего файла приведет к возникновению ошибки и невыполнению команды. На этот случай, для практически всех команд существуют их модификации, которые не зависят от настроек. Например, для команды > существуют ее модификации >! и >|.

Для одновременного перенаправления стандартного вывода и стандартного потока сообщений об ошибках определены дополнительные команды >&, &>, >>&, &>> и их модификации со знаками | и ! (например, &>|). Эти команды соответственно переписывают и дополняют информацию в указанных файлах, а также позволяют избавиться от неуклюжих конструкций вида 1>FNAME 2>&1.

Zsh также позволяет перенаправлять информацию в более чем в один файл, аналогично использованию команды tee (это доступно только если определена переменная MULTIOS, что обычно указано по умолчанию). Кроме этого можно одновременно использовать перенаправление и конвейеры. Например, команда date >foo | cat запишет дату в файл foo и выведет ее в стандартный поток вывода.

Если установлена переменная MULTIOS, то имя файла, указанное в качестве того, куда надо будет перенаправлять информацию, подвергается раскрытию шаблонов (globbing). Таким образом можно использовать команду

# : > *

для усечения всех файлов в текущем каталоге.

Множественное перенаправление также работает и при вводе информации, позволяя заменять конструкции вида

# cat foo fubar | sort

на конструкции

# sort <foo <fubar

или даже

# sort <f{oo,ubar}

Zsh даже позволяет использовать перенаправление без указания команды. Если не установлена переменная NULLCMD, то при таком использовании будет возникать ошибка. Но если установлена переменная NULLCMD, или READNULLCMD (она имеет преимущество над NULLCMD), то эти команды будут использоваться для обработки данных. По умолчанию NULLCMD имеет значением команду cat, а READNULLCMD значением команду more. Таким образом команда

# < file

приведет к показу указанного файла.

Функции

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

Для ускорения загрузки Zsh может использовать автоматически загружаемые функции, когда они только объявляются, но не считываются. При первом использовании такой функции происходит ее считывание и компиляция. Для объявления автоматически загружаемой функции используется встроенная команда autoload (или ее налоги functions -u и typeset -fu). Поиск определений функций осуществляется по каталогам, перечисленным в переменной fpath.

Кроме обычных функций, Zsh позволяет определять функции со специальным значением. Так, например, функция chpwd вызывается при изменении рабочего каталога, а функции precmd и preexec выполняются перед каждым выводом приглашения и перед выполнением считанной команды соответственно. Кроме того, может быть определена функция periodic, которая может выполнятся через каждые $PERIOD (если этот параметр определен) секунд перед выводом приглашения.

Задания

Zsh работает с задачами подобно bash, но при этом имеется возможность более гибко работать с заданиями запущенными в фоновом режиме. Кроме команды &, которая используется для запуска задачи в фоновом режиме, также определены команды &| или &!, которые запускают программу таким образом, что она не будет иметь записи в таблице задач и с которой нельзя будет работать обычными функциями работы с заданиями.

Для ссылки на задания можно использовать специальные переменные: %NUMBER — для ссылки на задание номер NUMBER (как в bash); %STRING и %?STRING — для ссылки на задания, чьи командные строки начинаются и содержат строку STRING соответственно; %% (или %+) и %- для ссылки на текущее и предыдущее задание.

Подстановка переменных

Zsh имеет множество расширений в области различных подстановок. По назначению подстановки можно разделить на две группы: Подстановки в строке приглашения и прочие подстановки. Подстановки в строке приглашения могут использовать функции из группы «прочие подстановки».

Подстановки в строке приглашения

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

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

Полное описание всех возможных подстановок для строки приглашения можно найти в справке по Zsh.

Темы для строки приглашения

Благодаря возможностям Zsh пользователи пишут различные модули расширений. Одним из таких модулей является модуль для установки тем для строк приглашения. Этот модуль загружается с помощью команд:

# autoload -U promptinit

# promptinit

и позволяет пользователям использовать заранее подготовленные темы приглашений. Команда prompt -p выдает примеры всех установленных тем строки приглашения.

Прочие подстановки

Все остальные подстановки выполняются в пять шагов, в перечисленном ниже порядке:

  • Сначала выполняются подстановки в истории. На этом этапе подставляются строки из истории, которые соответствуют заданным командам. См. раздел Подстановки истории.
  • Затем выполняется раскрытие псевдонимов (алиасов). Раскрытие алиасов выполняется немедленно, до того, как командная строка будет разобрана.
  • Затем выполняется подстановка процессов, параметров, команд, раскрытие арифметических выражений, и затем уже раскрытие выражений в скобках. Каждый из этих этапов подробно описан в справке по Zsh.
  • Раскрытие имен файлов. На этом этапе происходит подстановка комбинаций строк и чисел с символом ~. Если используется комбинация с числом, то каталог берется из стека каталогов. Если после символа ~ задается строка, то эта строка будет использоваться как имя пользователя, и вместо сочетания ~ со строкой подставляется домашний каталог соответствующего пользователя.
  • И на последнем шаге происходит генерация имен файлов (globbing). См. раздел Генерация имен файлов.

Полный перечень всех шаблонов и настроек вы сможете найти в справке по Zsh.

Подстановки истории

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

Подстановки истории Zsh позволяют указать какое слово из команды нужно задействовать. Для этого используются следующие указатели слов:

:0
первое слово в командной строке;
:n
n-й аргумент;
:^
1-й аргумент (аналогично :1);
:$
последний аргумент строки;
:X-Y
аргументы с X по Y;
:X-
все аргументы начиная с X кроме последнего;
:*
все аргументы;
:X*
все аргументы начиная с X (аналогично :X-$).

Кроме этого, в подстановках истории после указателей слов можно использовать модификаторы, которые позволяют выполнять различные подстановки в истории. Так, например, модификатор :h работает подобно использованию команды dirname, а модификатор :t работает подобно команде basename. Полный список модификаторов можно получить в руководстве по Zsh.

Генерация имен файлов

Zsh предоставляет множество дополнений и настроек по генерации имен файлов.

Операторы глоббинга

Кроме стандартных символов (таких как *, ?, [...]), используемых для генерации имен файлов в других командных процессорах, в Zsh определены дополнительные операторы глоббинга, такие как:

^X
совпадает с любым кроме X. Например, ^*.elc будет соответствовать всем файлам, кроме тех которые указаны в маске (в нашем случае это файлы с расширением .elc);
X~Y
совпадает со всем, что соответствует шаблону X, и не соответствует шаблону Y. Например, *.el*~*.elc соответствует всем файлам, чье расширение начинается с .el, но при этом не будут учитываться файлы с расширением *.elc;
X#
соответствует нулю или нескольким вхождениям шаблона X;
X##
соответствует одному или нескольким вхождениям шаблона X.

Флаги глоббинга

Флаги глоббинга используются для воздействия на шаблон, который стоит правее указанного флага. Все флаги имеют форму (#X), где X определяет нужный модификатор. Ниже приведено описание нескольких флагов, которые могут наиболее часто использоваться в работе:

i
делает шаблон независимым от регистра символов, которые в нем применяются;
l
заставляет символы в нижнем регистре, которые используются в шаблоне, соответствовать символам и в вернем и нижнем регистре. Символы в верхнем регистре, будут соответствовать точно тем же символам;
I
локально отменяет воздействие флагов l и i;

Другие флаги, описаны в руководстве по Zsh.

Квалификаторы глоббинга

При генерации имен файлов могут использоваться квалификаторы глоббинга, так что пользователь может указывать какие типы файлов будут подпадать под под генерацию имен. Квалификаторы указываются в конце шаблона и заключаются в круглые скобки. Среди квалификаторов есть, например,

.
для указания обычных файлов,
/
для указания каталогов,
=
для указания сокетов,

и многие другие (можно указывать права доступа, времена модификации файлов и т.п.). Их полное описание можно найти в руководстве по Zsh.

Рекурсивный глоббинг

Zsh позволяет производить рекурсивное раскрытие имен файлов. Для этого используются формы **/ и ***/ Первая форма отличается от второй лишь тем, что не следует по символьным ссылкам. Так, например:

# ls **/foo

произведет поиск файлов с именем foo во всех подкаталогах.

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

Кроме вышеперечисленных настроек. Zsh также позволяет использовать приблизительное соответствие, пытаясь найти файлы, в именах которых (по его мнению :-) могли бы быть сделаны ошибки.

Параметры и настройки

В Zsh различают параметры и настройки. Параметры используются для передачи и хранения данных, а настройки используются для управления поведением Zsh.

Параметры

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

Для объявления типов параметров или присвоения целого или строкового значения параметру, используется встроенная команда typeset. Значения строкового или целого типа могут присваиваться простым приравниванием — ИМЯ=ЗНАЧЕНИЕ. Для присваивания других типов параметров используется команда typeset.

Позиционные параметры используются для доступа к аргументам командной строки для функции или скрипта командного процессора. Специальные параметры *, @ и argv являются массивами, которые содержат все позиционные параметры. Позиционные параметры могут быть изменены после запуска скрипта или функции с помощью встроенной команды set.

Настройки

Настройки устанавливаются с помощью встроенной команды setopt, а удаляются с помощью команды unsetopt. Список настроек приведен в документации по Zsh.

Дополнения (completitions)

Дополнения обеспечивают набор строк за вас. Они могут быть в разных формах, но для их выполнения (обычно) используется клавиша TAB.

В Zsh дополняться может все что угодно: имена и пути файлов; имена встроенных и внешних команд, а также их ключи; имена переменных среды; имена пользователей и компьютеров, а также многое другое. Zsh имеет в своей поставке некоторое количество определений дополнений для основных программ операционных систем. Для первоначальной настройки дополнений, вам необходимо лишь вставить команду compinit в ваш файл инициализации, после чего Zsh сможет использовать дополнения для тех команд, настройка для которых имеется в поставке Zsh.

Виджеты дополнений

Виджеты дополнений определяются с помощью ключа -C встроенной команды zle, которая предоставляется модулем zsh/zle.

Дополнения с использованием compctl

Данный метод аналогичен по настройке тем дополнениям, что применяются в csh & tcsh и является устаревшим, так что новые пользователи скорее всего предпочтут использовать другие методы определения дополнений, но он все равно поддерживается текущими версиями Zsh.

Задание дополнений с помощью данного метода имеет общую форму:

# compctl ключи [command ...]

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

Ключи определяют типы параметров, которые будут подпадать под дополнение (ключи командной строки, списки выполняемых заданий, и т.п.).

Ключ -k указывает, что параметры, которые будут дополняться, будут переданы в массиве. Это ключ очень полезен, когда у вас списки параметров приведены в файле, или заданы в явной форме. Так, можно явно задать список серверов, имена которых будут дополняться при использовании команды ssh:

# compctl -k "( server1 server2 )" ssh

В том случае, если у вас много серверов, то вы можете перечислить их в файле и вместо явного перечисления указать в скобках команду для получения содержимого нужного файла (в нашем примере пусть это будет ~/.servers):

# compctl -k "( ` cat ~/.servers ` )" ssh

Ключ -K позволяет пользователю указать функцию, которая будет вызываться для получения списка дополняемых параметров.

Другие ключи команды compctl описаны в справочном руководстве по Zsh.

Подсистема дополнений

Эта подсистема является новой и введена начиная с версии 4.0. При этом для пользователей остается доступной старая подсистема дополнений с использованием команды compctl, однако можно запретить ее использование с помощью команды:

# zstyle ':completion:*' use-compctl false

Основным отличием новой системы дополнений от старой является то, что вместо того, чтобы задавать все настройки разом при запуске командного процессора, соответствующие части кода будут вызываться только тогда, когда будет нажата клавиша TAB, при этом будут генерироваться новые дополнения. Также введены новые команды, которые заменяют использование команды compctl с разными ключами, например, для задания списка дополнений должна использоваться команда compadd.

Поведение команд зависит от используемого контекста, что позволяет генерировать разные списки дополнений для разных контекстов. Эта возможность, как и остальные, управляются с помощью команды zstyle. Например, можно выдавать список дополнений в виде меню, перебирать их циклически, а также построить небольшой менеджер файлов с помощью стандартных команд Zsh.

Полное описание всех возможностей новой системы дополнений можно найти в руководстве пользователя Zsh.

Модули Zsh

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

Загрузка модулей производится с помощью команды zmodload. Например, для загрузки модуля редактирования командной строки zle будет использоваться команда

# zmodload zsh/zle

Модуль редактирования командной строки (zsh/zle)

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

Привязки клавиш

Модуль редактирования поддерживает концепцию таблиц привязки клавиш (keymaps). В любой момент времени может существовать любое количество таблиц привязки. По умолчанию в Zsh определены 4 таблицы привязки клавиш, которые эмулируют команды Emacs, редактора vi в режиме вставки, редактора vi в режиме команд, а также специальный режим safe, которые не определяет никаких привязок, кроме вставки символов соответствующих клавишам.

Встроенные команды zle

Модуль zle предоставляет пользователю некоторое количество встроенных команд. Сюда относятся команды привязки клавиш — bindkey, которая позволяет определять и переопределять сочетания клавиш; команды управления виджетами zle — создания, удаления, выдачи списка и другие.

Виджеты zle

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

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

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

Модуль zsh/zftp

Данный модуль позволяет пользователю выполнять команды ftp в командной строке или внутри скриптов. Интерфейс похож на тот, который используется в традиционном клиенте ftp, но при этом используются все возможности Zsh — дополнения, глоббинг и редактирование. Загрузка данного модуля предоставляет пользователю одну встроенную команду — zftp, с помощью которой и выполняются все операции.

Загрузка модуля выполняется с помощью команд:

# autoload -U zfinit
# zfinit

Встроенная команда zftp обеспечивает выполнение всех команд. Синтаксис команды выглядит следующим образом:

# zftp подкоманда [аргументы]

Подкомандами являются обычные команды ftpopen, cd, get, put, bin и другие. Кроме того, модуль предоставляет другие команды, которые являются алиасами для команд «zftp подкоманда«, такие как zfopen, zfget, zfcd и другие.

Другие модули Zsh

Кроме вышеперечисленных модулей, в поставку Zsh входят модули работы со списками привилегий POSIX.1e (модуль zsh/cap), работы с математическими функциями (модуль zsh/mathfunc), модуль использования некоторых стандартных команд (chown, chgrp, ln, rm и других) как встроенных (модуль zsh/files) и другие модули. Для получения их полного списка и описания работы с ними смотрите документацию из поставки Zsh.

Дополнительные источники информации

Вы можете найти дополнительную информацию о Zsh используя следующие ресурсы:

Источник: http://alexott.net/ru/writings/zsh/

Скрипт запуска wifi в ARCH Linux

[announce]Небольшой скрипт для подключения к сетям wifi в ARCH linux [/announce]

 

#!/bin/bash

# Определяем интрфейс ( в моем случае это - wlan0)
if [ "$2" ]; then 
	dev=$2;
else 
	dev="wlan0";
fi

# Действие
case "$1" in
	start)
		sudo ifconfig $dev up;
		sudo wpa_supplicant -B -i$dev -c/etc/wpa_supplicant.conf;
		sleep 3;
		sudo dhcpcd $dev 2>/dev/null;
	;;
	stop)	
		sudo killall -9 dhcpcd 3>/dev/null;
		sudo killall -9 wpa_supplicant 3>/dev/null;
		sudo ifconfig $dev down;
	;;
	list)
		sudo ifconfig $dev up;
		sleep 1;
		sudo iwlist $dev scanning;
		sudo ifconfig $dev down;
	;;
	restart)
		$0 stop;
		$0 start;
	;;
	status)
		echo -n 'IP arrdess: '; ifconfig wlan0 | grep "inet addr" | awk '{print $2}' | sed 's/addr://'
		echo -n "Essid: "; iwconfig wlan0 | grep "Ralink STA" | awk '{print $4}' | sed 's/ESSID://'
	;;
	*)

	if [ "$1"  ]; then
		echo "usage: $0 {start|stop|list|restart}"; 
	else 
		echo "Restarting";
		$0 restart;
	fi

esac

exit 0

Вот такой вот скрипт :)
Идею взял с http://wiki.archlinux.org/index.php/Asus_Eee_PC_901с

 

Запись звука в Linux

[announce]Запись звука в Linux из консоли.[/announce]
На моём субноуте есть микрофон, вот подумал, что неплохобы понять как записывать снимать звук с него, вот что нашёл:

Запись в wav:
$ arecord test.wav Переконвертировать wav в mp3 можно вот так:
$ cat test.wav | lame — > test.mp3
или сразу создать mp3
$ arecord | lame — > test.mp3

Вот так можно записать ядро системы linux в mp3 :)
$ cat /boot/mykernel.img > /dev/dsp & arecord | lame — > test.mp3

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

Вот очередной велосипед на тему показа статуса аккумулятора для нэтбука на ARCH Linux :)

Вот такой получается скрипт на sh (думаю все ясно из комментов):

#!/bin/zsh

# Определяем уровень заряда аккумулятора на текущий момент
remaining_bat=`cat /proc/acpi/battery/BAT0/state | grep remaining | awk {'print $3'}`;

# Определяем 100% заряда для аккумулятора
full_bat=`cat /proc/acpi/battery/BAT0/info | grep full | awk {'print $4'}`;

# Определяем подключён сетевой провод или нет
stat=`cat /proc/acpi/battery/BAT0/state | grep charging | awk {'print $3'}`;

if [ $stat = 'charging' ]; then
stat='+'; # Провод подключён ( ноут зяряжеается )
else if [ $stat = 'charged' ]; then
stat=''; # ( Аккумулятор зяряжен)
else
stat='-'; # Провод не подключён ( ноут разряжается )
fi
fi

# получаем заряд батареи в % ( Школьная математика - Рулит! :) )
bat=$(($remaining_bat*100/$full_bat));

# основные цвета ( ESC - последовательности, подробнее - $ man console_codes )
RED="\033[31m"; # Красный
YELLOW="\033[33m"; # Жёлтый
WHITE="\033[38m"; # Белый

# Цвет по-умолчанию
DEFAULT="\033[0m";

if [ $bat -lt 10 ]; then # Если заряд аккамулятора меньше 10% (краасные цвет)
result="$RED$stat$bat";
else if [ $bat -lt 30 ]; then # Если заряд аккамулятора меньше 30% (жёлтый цвет)
result="$YELLOW$stat$bat";
else
result="$WHTE$stat$bat"; # Заряд аккамулятора больше 30% ( белый цвет )
fi
fi

# Выводим результат
echo -e $result%%$DEFAULT;

exit 0;

Далее говорим zsh о том, что нужно выводить в PROMPT результат этого скрипта.
В файле ~/.zshrc в функции precmd() прописываем где-нибудь в начале:

precmd() {
   BAT=`binf.sh`;
   PROMPT="battery:(`echo $BAT`)::%{$reset_color%}%{$fg_bold[green]%}%m {$reset_color%}::%{$fg_bold[crey]%}[ %~ ]%{$rese    +t_color%}> "
.....

Как-то вот так, где binf.sh — скрипт выше.
Обязательно нужно, чтобы binf.sh лежал по пути в переменной PATH, я для этой цели создал папку bin в домашней директории и сделал ссылку на файл в папке /bin

В precmd() — можно запихнуть любые команды, которые будут выполнятся при обновлении командной строки.

Получить снимок с web камеры через консоль Linux

[announce]Вот способ получисть снимок с web камеры из шел.[/announce]
Искал способ как получить снимок (фото) с web камеры
Наткнулся только на статью про видеозахват через — ffmpeg. Вот ссылка — http://www.newmoldova.com/?q=node/85

Почитав немного ман по ffmpeg попробовал вот такую конструкцию:

$ ffmpeg -f video4linux2 -s 1024×768 -i /dev/video0 -f image2 snapshot.jpg 2>/dev/null

Вроде работает :)
-f video2linux — формат видео для захвата
-s 1024×768 — размер кадра захвата
-i /dev/video0 — файла web камеры
-f image2 snapshot.jpg — выходной тим и имя файла